对于带有左关联运算符的简单算术表达式,我有以下EBNF语法:
expression:
term {+ term}
term:
factor {* factor}
factor:
number
( expression )
如何在不更改运算符关联性的情况下将其转换为BNF语法?以下 BNF 语法对我不起作用,因为现在运算符已变为右关联:
expression:
term
term + expression
term:
factor
factor * term
factor:
number
( expression )
维基百科说:
几种解决方案是:
- 将语法重写为左递归,或
- 用更多的非终结符重写语法以强制正确的优先级/关联性,或
- 如果使用 YACC 或 Bison,则有运算符声明,%left、%right 和 %nonassoc,它们告诉解析器生成器强制执行哪种关联。
但它并没有说如何重写语法,我也没有使用任何解析工具,如 YACC 或 Bison,只是简单的递归下降。我所要求的甚至可能吗?