我有一个针对简单算术表达式的EBNF语法,左结合运算符如下所示:
维基百科上说:
几种解决方案包括:
1. 重写语法以使其左递归。 2. 使用更多的非终结符来强制正确的优先级/结合性。 3. 如果使用 YACC 或 Bison,则有操作符声明:%left、%right 和 %nonassoc,告诉解析器生成器要强制哪种结合性。
但它并没有说明如何重写语法,我不使用任何像 YACC 或 Bison 这样的解析工具,只使用简单的递归下降。我所询问的是否可能?
。
expression:
term {+ term}
term:
factor {* factor}
factor:
number
( expression )
如何将这个转化为BNF语法而不改变运算符的结合性?下面的BNF语法对我来说并不实用,因为现在运算符已经变成了右结合:
expression:
term
term + expression
term:
factor
factor * term
factor:
number
( expression )
维基百科上说:
几种解决方案包括:
1. 重写语法以使其左递归。 2. 使用更多的非终结符来强制正确的优先级/结合性。 3. 如果使用 YACC 或 Bison,则有操作符声明:%left、%right 和 %nonassoc,告诉解析器生成器要强制哪种结合性。
但它并没有说明如何重写语法,我不使用任何像 YACC 或 Bison 这样的解析工具,只使用简单的递归下降。我所询问的是否可能?