如何捕获表达式的求值顺序



我有以下语法

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 : [ tn]+ -> 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都会生成一个新的上下文对象。上下文的顺序会提供你想要的信息。每个包含非空TerminalNode for ID的上下文都表示计算成功。因此,在最简单的情况下,遍历解析树并在'enterEveryRule'中监视ID。在'enterEveryRule'和'exitEveryRule'中,观察成功之间的最高拐点(升序切换到降序,反之亦然),以区分有效和未使用的连接符号。

顺带一讲,你的前三个规则选项是模棱两可的,第四个不太可能达到你的预期,而5-7可以结合起来简化你的分析。

相关内容

  • 没有找到相关文章

最新更新