Antlr4 删除间接左递归(我不理解形式符号)
我试着寻找我的解决方案的答案,但我似乎无法将我的头脑集中在广义的解决方案上。我无法找出哪些元素对应于大写字母,哪些元素应该用小写字母表示,这对我没有帮助 这是我的Antlr语法的一部分:Antlr4 删除间接左递归(我不理解形式符号),antlr4,context-free-grammar,left-recursion,Antlr4,Context Free Grammar,Left Recursion,我试着寻找我的解决方案的答案,但我似乎无法将我的头脑集中在广义的解决方案上。我无法找出哪些元素对应于大写字母,哪些元素应该用小写字母表示,这对我没有帮助 这是我的Antlr语法的一部分: expression : literal | unaryExpression | binaryExpression | priorityExpression | invocation ; binaryExpression: expression binaryOp
expression
: literal
| unaryExpression
| binaryExpression
| priorityExpression
| invocation
;
binaryExpression: expression binaryOperator expression;
binaryOperator
: ADD
| SUBTRACT
| DIVIDE
| CONCAT
| EQUALS
| NOT_EQUALS
| LESS_THAN
| GREATER_THAN
| MULTIPLY
;
如何删除
binaryExpression
中的递归 只需删除二进制表达式
并直接在表达式
中使用表达式二进制运算符表达式
:
expression
: literal
| unaryExpression
| expression binaryOperator expression
| priorityExpression
| invocation
;
binaryOperator
: ADD
| SUBTRACT
| DIVIDE
| CONCAT
| EQUALS
| NOT_EQUALS
| LESS_THAN
| GREATER_THAN
| MULTIPLY
;
编辑
但是现在我在AST中丢失了二进制表达式节点,我必须在以后的代码中检测它
然后使用:
此外,我还想更好地理解如何删除此递归,而不是将其卸载到Antlr
你不能。ANTLR根本不允许这种间接的左递归规则。只有直接左递归。是的,但是现在我在AST中丢失了二进制表达式节点,我必须在以后的代码中检测它,有效地延迟了这部分解析。此外,我还想更好地理解如何删除此递归,而不是将其卸载到Antlr@MackThax检查我的编辑除了Bart的解决方案之外,这里还有一个我的anwser,我在其中描述了一个。
expression
: literal #literalExpr
| unaryExpression #unaryExpr
| expression binaryOperator expression #binaryExpr
| priorityExpression #priorityExpr
| invocation #invocationExpr
;
binaryOperator
: ADD
| SUBTRACT
| DIVIDE
| CONCAT
| EQUALS
| NOT_EQUALS
| LESS_THAN
| GREATER_THAN
| MULTIPLY
;