ANTLR4中的互左递归规则
我不明白ANTLR4如何能够使用直接let递归来帮助我们。 好的,你可以写一个语法来识别一种语言,好的。但你很少停在这里。通常,您希望对解析的树执行某些操作。为了得到一个直接的左递归,必须将多个规则折叠成一个规则,这在这里没有帮助 举个例子。假设我要定义+和-运算符,并希望它们具有相同的优先级。我会用黄金写下这样的话:ANTLR4中的互左递归规则,antlr4,Antlr4,我不明白ANTLR4如何能够使用直接let递归来帮助我们。 好的,你可以写一个语法来识别一种语言,好的。但你很少停在这里。通常,您希望对解析的树执行某些操作。为了得到一个直接的左递归,必须将多个规则折叠成一个规则,这在这里没有帮助 举个例子。假设我要定义+和-运算符,并希望它们具有相同的优先级。我会用黄金写下这样的话: expression : binaryExpression | unaryExpression ; binaryExpression : pl
expression
: binaryExpression
| unaryExpression
;
binaryExpression
: plusExpression
| minusExpression
;
plusExpression
: expression '+' unaryExpression
minusExpression
: expression '-' unaryExpression
expression
: expression '+' unaryExpression # plusExpr
| expression '-' unaryExpression # minusExpr
| unaryExpression # unaryExpr
;
在ANTLR4中,我当然能做到
expression
: expression '+' unaryExpression
| expression '-' unaryExpression
| unaryExpression
;
但是,在生成的visitor中,我只有expression
和unaryExpression
的方法。当我访问ExpressionContext
时,我怎么知道该做什么?这是加法还是子结构?我找到了答案
可以这样“标记”备选方案:
expression
: binaryExpression
| unaryExpression
;
binaryExpression
: plusExpression
| minusExpression
;
plusExpression
: expression '+' unaryExpression
minusExpression
: expression '-' unaryExpression
expression
: expression '+' unaryExpression # plusExpr
| expression '-' unaryExpression # minusExpr
| unaryExpression # unaryExpr
;
完成此操作后,您将发现在基本访问者中生成的相应方法