Como posso escrever uma gramática que expresse um conjunto de itens que podem aparecer zero ou uma vez cada, em qualquer ordem?
por exemplo A B C
, A C
é válido, C B A
é válido, A A B
é inválido, A B A
é inválido.
Esta regra impõe zero ou um de cada elemento, mas também impõe uma ordem definida:
rule_1: A? B? C?
Isso permite qualquer ordem, mas também permite mais de uma de cada:
rule_2: (A | B | C)*
Isto está usando o analisador Lark para Python - Não tenho certeza se esta pergunta deve ser marcada como [lark-parser]
?
(E)BNF lida com linguagens livres de contexto e uma linguagem livre de contexto não pode expressar diretamente essa restrição. Você tem que fazer isso explicitamente como esta forma fatorada à esquerda (outras são possíveis, mas não significativamente melhores)
que rapidamente se torna incontrolável à medida que o número de coisas aumenta.