我的语法包含括号之间的表达式' {}'表示该表达式的0或更多倍,以及方括号之间的表达式,表示该表达式的1或无,我认为这种语法称为Extended Backus-Naur Form Grammars。 我想将语法转换为正常形式(没有括号或方括号)。
是否有现有算法可以做到这一点?
我知道我可以替代A - >之类的东西。 B [CD] E至A - > BE,A - > BCDE,但我想知道是否存在我可以实现的算法以转换这些表达式。
答案 0 :(得分:4)
最直接的方法是用新规则替换每个EBNF构造。以下是您可以使用的等价物:
方法强>
A ::= B [C D] E ;
A ::= B X E ;
X ::= C D | ɛ ;
其中ɛ代表空字符串。
<强>重复强>
A ::= B {C D} E ;
零次或多次:
A ::= B X E ;
X ::= C D X | ɛ ;
一次或多次:
A ::= B X E ;
X ::= C D | C D X ;
<强>组合强>
A ::= B (C D) E ;
A ::= B X E ;
X ::= C D ;
递归地应用这些转换,你最终会得到vanilla BNF。