我已经尝试寻找我的解决方案的答案,但我似乎无法围绕广义的解决方案。我无法弄清楚哪些元素映射为大写字母,哪些元素应该用小写字母表示,这无济于事。
这是我在Antlr语法中的一部分:
expression
: literal
| unaryExpression
| binaryExpression
| priorityExpression
| invocation
;
binaryExpression: expression binaryOperator expression;
binaryOperator
: ADD
| SUBTRACT
| DIVIDE
| CONCAT
| EQUALS
| NOT_EQUALS
| LESS_THAN
| GREATER_THAN
| MULTIPLY
;
我如何去除binaryExpression
中的递归?
答案 0 :(得分:1)
只需在binaryExpression
中直接删除expression binaryOperator expression
并使用expression
:
expression
: literal
| unaryExpression
| expression binaryOperator expression
| priorityExpression
| invocation
;
binaryOperator
: ADD
| SUBTRACT
| DIVIDE
| CONCAT
| EQUALS
| NOT_EQUALS
| LESS_THAN
| GREATER_THAN
| MULTIPLY
;
但现在我丢失了AST中的二进制表达式节点,我必须稍后在代码中检测它
然后使用labels:
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
;
此外,我希望更好地了解如何删除此递归而不是将其卸载到Antlr
你不能。 ANTLR根本不允许这种间接的左递归规则。只是直接左递归。