Antlr4如何捕获表达式的求值顺序
我有以下语法Antlr4如何捕获表达式的求值顺序,antlr4,Antlr4,我有以下语法 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 : '(';
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)
主要的兴趣是计算表达式的求值顺序
你是怎么做的。我尝试编写访问者实现,但不知道如何提取顺序。每次通过“expr”规则递归时,Antlr都会生成一个新的上下文对象。上下文的顺序将提供您想要的信息。包含ID的非空TerminalNode的每个上下文将表示评估成功。因此,在最简单的情况下,遍历解析树并在“enterEveryRule”中查看ID。在“enterEveryRule”和“exitEveryRule”中查看成功之间的最高拐点(升序切换为降序,反之亦然),以区分有效和未使用的连接符号 FWIW,你的前三个规则ALT是模糊的,第四个不太可能达到你期望的效果,5-7可以组合起来简化你的分析