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



我们知道逻辑运算的优先级由强到低:不和或
我想在我的语法中添加逻辑运算,以尊重逻辑运算的优先级. ...我的语法是:

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

对于ANTLR3和antlr4,您可以这样做:

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 ')'
 ;

最新更新