如何编写一个语法来表达一组可以以任意顺序出现零次或一次的项目?
例如
A B C
有效,A C
有效,C B A
有效,A A B
无效,A B A
无效。
此规则强制每个元素为零或一个,但也强制执行一组顺序:
rule_1: A? B? C?
这允许任何订单,但也允许每个订单多个:
rule_2: (A | B | C)*
这是使用Python的Lark解析器 - 我不确定这个问题是否应该被标记为
[lark-parser]
?
(E)BNF 处理上下文无关语言,而上下文无关语言无法直接表达该约束。你必须像这种左因子形式一样明确地做到这一点(其他形式也是可能的,但并没有明显更好)
opts = (A nonA | B nonB | C nonC)?
nonA = (B nonAB | C nonAC)?
nonB = (A nonAB | C nonBC)?
nonC = (A nonAC | B nonBC)?
nonAB = C?
nonAC = B?
nonBC = A?
随着事物数量的增加,这很快就会变得难以管理。