Грамматика, допускающая произвольный порядок правил

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

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

  • ДОЛЖЕН иметь ровно один 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 ответ

Решение

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

style = tools* citation tools*
tools = macro | foo | bar
...
Другие вопросы по тегам