如何在 antlr4 中编写操作优先级方面的上下文无关语法

How to write context free grammar aspect the priority of operations in antlr4

我们知道了逻辑运算的优先级从强到低: 不是 和 或者
我想以尊重逻辑操作优先级的方式向我的语法添加逻辑操作。 ... 我的语法是:

   expression : factor ( PLUS factor | MINUS factor )* ;
 factor : term ( MULT term | DIV term )* ;
 term : NUMBER | ID | PAR_OPEN expression PAR_CLOSE ;

使用 ANTLR3 和 ANTLR 4,你可以这样做:

expression
 : or_expression
 ;

// lowest precedence
or_expression
 : and_expression ( '||' and_expression )*
 ;

and_expression
 : rel_expression ( '&&' rel_expression )*
 ;

rel_expression
 : add_expression ( ( '<' | '<=' | '>' | '>=' ) add_expression )*
 ;

add_expression
 : mult_expression ( ( '+' | '-' ) mult_expression )*
 ;

mult_expression
 : unary_expression ( ( '*' | '/' ) unary_expression )*
 ;

unary_expression
 : '-' atom
 | atom
 ;

// highest precedence
atom
 : NUMBER
 | ID
 | '(' expression ')'
 ;

而且用ANTLR4,也可以这样写(相当于上面的语法!):

expression
 : '!' expression
 | expression ( '*' | '/' ) expression               // higher than '+' | '-'
 | expression ( '+' | '-' ) expression               // higher than '<' | '<=' | '>' | '>=' 
 | expression ( '<' | '<=' | '>' | '>=' ) expression // higher than '&&'
 | expression '&&' expression                        // higher than '||'
 | expression '||' expression
 | NUMBER
 | ID
 | '(' expression ')'
 ;