Antlr4 如何在我的语法中实现操作的优先级(+;*-/)?

Antlr4 如何在我的语法中实现操作的优先级(+;*-/)?,antlr4,context-free-grammar,Antlr4,Context Free Grammar,我使用antlr 4定义自己的语法,我想根据操作的优先级(+*-/)构建tree true 我发现关于操作优先级(*+)的示例工作正常 我尝试对其进行编辑以添加操作优先级(-/),但失败:( 操作优先级(+*)的语法为: 如何向它们添加操作优先级(-/)?您通常通过定义表达式、术语和因子产生式规则来解决这个问题。下面是一个语法(在EBNF中指定),它实现了一元+和一元-,以及4个二元算术运算符和括号: start ::= expression expression ::= term (('+'

我使用antlr 4定义自己的语法,我想根据操作的优先级(+*-/)构建tree true

我发现关于操作优先级(*+)的示例工作正常

我尝试对其进行编辑以添加操作优先级(-/),但失败:(

操作优先级(+*)的语法为:


如何向它们添加操作优先级(-/)?

您通常通过定义表达式、术语和因子产生式规则来解决这个问题。下面是一个语法(在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
 ;