我有以下语法
grammar Expr;
prog: expr;
expr: LP expr RP
| expr LP expr RP
| LP expr RP expr
| expr '*' '{' ',' expr
| expr op=NOT expr
| expr op=AND expr
| expr op=OR expr
| ID
;
NEWLINE:'\r'? '\n' ;
NOT: '~';
AND: '&';
OR: '|';
LP : '(';
RP : ')';
// lexer/terminal rules start with an upper case letter
ID
:
(
'a'..'z'
| 'A'..'Z'
| '0'..'9' | ' '
| ('+'|'-'|'*'|'/'|'_')
| '='
| '~'
| '{'
| '}'
| ','
)+
;
WS : [ \t\n]+ -> skip ;
我想提取正在评估的表达式的节点,并按照评估的顺序需要它。因此对于诸如 1*{A42,A53,A16,A3}&(A26|A41)&(A51=P&A2=F|A7=C) 之类的表达式,它将按以下顺序进行评估
A26 | A41
A51 & A2=F
A51 & A2F | AF=C
1*{A42,A53,A16,A3}&(A26|A41)
1*{A42,A53,A16,A3}&(A26|A41)&(A51=P&A2=F|A7=C)
主要兴趣是弄清楚表达式的计算顺序。
你怎么处理这件事。我尝试编写访问者实现,但不知道如何提取订单。