我不明白ANTLR4如何能够使用直接let-recursion实际上对我们有所帮助。 好的,你可以写一个能识别语言的语法,好吧。但你很少停在这里。通常你想用解析树做一些事情。并且为了获得直接的左递归而不得不在一个中折叠几个规则在这里没有用。
一个例子。假设我想定义+和 - 运算符,并希望它们具有相同的优先级。在GOLD我会写这样的东西:
expression
: binaryExpression
| unaryExpression
;
binaryExpression
: plusExpression
| minusExpression
;
plusExpression
: expression '+' unaryExpression
minusExpression
: expression '-' unaryExpression
肯定在ANTLR4中我能做到
expression
: expression '+' unaryExpression
| expression '-' unaryExpression
| unaryExpression
;
但是在生成的访问者中,我只会使用expression
和unaryExpression
的方法。当我访问ExpressionContext
时,我该怎么知道该怎么做?它是一个加法还是一个子结构?
答案 0 :(得分:2)
我找到了答案here。
可以“标记”这样的替代品:
expression
: expression '+' unaryExpression # plusExpr
| expression '-' unaryExpression # minusExpr
| unaryExpression # unaryExpr
;
执行此操作后,您将找到在基本访问者中生成的相应方法。