Antlr4 如何在我的语法中实现操作的优先级(+;*-/)?
我使用antlr 4定义自己的语法,我想根据操作的优先级(+*-/)构建tree true 我发现关于操作优先级(*+)的示例工作正常 我尝试对其进行编辑以添加操作优先级(-/),但失败:( 操作优先级(+*)的语法为:Antlr4 如何在我的语法中实现操作的优先级(+;*-/)?,antlr4,context-free-grammar,Antlr4,Context Free Grammar,我使用antlr 4定义自己的语法,我想根据操作的优先级(+*-/)构建tree true 我发现关于操作优先级(*+)的示例工作正常 我尝试对其进行编辑以添加操作优先级(-/),但失败:( 操作优先级(+*)的语法为: 如何向它们添加操作优先级(-/)?您通常通过定义表达式、术语和因子产生式规则来解决这个问题。下面是一个语法(在EBNF中指定),它实现了一元+和一元-,以及4个二元算术运算符和括号: start ::= expression expression ::= term (('+'
如何向它们添加操作优先级(-/)?您通常通过定义表达式、术语和因子产生式规则来解决这个问题。下面是一个语法(在EBNF中指定),它实现了一元+和一元-,以及4个二元算术运算符和括号:
start ::= expression
expression ::= term (('+' term) | ('-' term))*
term ::= factor (('*' factor) | ('/' factor))*
factor :: = (number | group | '-' factor | '+' factor)
group ::= '(' expression ')'
其中,数字
是一个数字文字。在ANTLR3(和ANTLR4)*
和/
中可以被赋予比+
和-
更高的优先级,如下所示:
println
: PRINTLN expression SEMICOLON
;
expression
: factor ( PLUS factor
| MINUS factor
)*
;
factor
: term ( MULT term
| DIV term
)*
;
term
: NUMBER
| ID
| PAR_OPEN expression PAR_CLOSE
;
但在ANTLR4中,这也将起作用:
println
: PRINTLN expression SEMICOLON
;
expression
: NUMBER
| ID
| PAR_OPEN expression PAR_CLOSE
| expression ( MULT | DIV ) expression // higher precedence
| expression ( PLUS | MINUS ) expression // lower precedence
;
正如你所说的那样,非常感谢Bart Kiers
println
: PRINTLN expression SEMICOLON
;
expression
: NUMBER
| ID
| PAR_OPEN expression PAR_CLOSE
| expression ( MULT | DIV ) expression // higher precedence
| expression ( PLUS | MINUS ) expression // lower precedence
;