Грамматика, допускающая произвольный порядок правил - PullRequest
0 голосов
/ 14 января 2020

Я (пытаюсь) разработать домен-специфический c язык (я назвал его "Фаренгейтом") для разработки стилей цитирования.

Программа, написанная на Фаренгейте:

  • ДОЛЖЕН иметь ровно один citation блок
  • МОЖЕТ иметь ноль или более macro блоков.

Вот упрощенный, но действительный пример:

macro m1
  "Hello World!"
end

macro m2
  "Hello World!"
end

citation
  "Hello World!"
end

Эта грамматика распознает приведенный выше код как синтаксически правильный:

style = macro* citation

(*  example of macro definition

    macro hw
        "Hello World!"
    end

    *)

macro = <'macro'> #'[a-z0-9]+' statement+ end

citation = <'citation'> statement+ end

statement = #'".*?"'

<end> = <'end'>

Однако порядок «блоков» (например, macro или citation) не должен иметь значения.

Вопрос: Как мне изменить мою грамматику, чтобы она распознала следующую программу как синтаксически правильную?

macro m1
  "Hello World!"
end

citation
  "Hello World!"
end

macro m2
  "Hello World!"
end

PS: Я собираюсь добавить другие дополнительные блоки в следующем порядке также не имеет значения.

1 Ответ

2 голосов
/ 14 января 2020

Для правил 0..n вы можете поместить их до или после citation. Например,

style = tools* citation tools*
tools = macro | foo | bar
...
...