Грамматика, допускающая произвольный порядок правил
Я (пытаюсь) разработать предметно-ориентированный язык (я назвал его "Фаренгейт") для разработки стилей цитирования.
Программа, написанная по Фаренгейту:
- ДОЛЖЕН иметь ровно один
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
...