基本上,我为一种只使用基本算术运算符(+, - ,* /)等的语言编写了一个解析器,但对于减号和加号,生成的抽象语法树将它们解析为右关联什么时候他们需要保持联想。谷歌搜索了一个解决方案,我找到了一个建议重写规则的教程:
Expression ::= Expression <operator> Term | Term`
到
Expression ::= Term <operator> Expression*
然而,在我的脑海中,这似乎以错误的方式生成树。有关解决此问题的方法的任何指示?
答案 0 :(得分:2)
首先,我认为你的意思是
Expression ::= Term (<operator> Expression)*
回到你的问题:你不需要“解决问题”,因为ANTLR处理尾递归没有问题。我几乎可以肯定它会在它生成的代码中用循环替换尾递归。 This tutorial(在页面上搜索名为“表达式”的章节)解释了如何到达e1 = e2(op e2)*结构。但是,通常,您可以根据更高优先级的表达式定义表达式,因此实际的递归调用仅在您处理括号和函数参数时发生:
expression : relationalExpression (('and'|'or') relationalExpression)*;
relationalExpression : addingExpression ((EQUALS|NOT_EQUALS|GT|GTE|LT|LTE) addingExpression)*;
addingExpression : multiplyingExpression ((PLUS|MINUS) multiplyingExpression)*;
multiplyingExpression : signExpression ((TIMES|DIV|'mod') signExpression)*;
signExpression : (PLUS|MINUS)* primeExpression;
primeExpression : literal | variable | LPAREN expression /* recursion!!! */ RPAREN;