2013-04-05 53 views
0

的評價令我有語法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 : '('; 
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) 

主要興趣是找出評估表達式的順序。

你如何去做這件事。我嘗試編寫訪問者實現,但不知道如何提取訂單。

回答

0

每次通過'expr'規則遞歸時,Antlr都會生成一個新的上下文對象。上下文的順序將提供您想要的信息。包含用於ID的非空TerminalNode的每個上下文將表示評估成功。因此,在最簡單的情況下,請走分析樹,並在'enterEveryRule'表中輸入ID。在'enterEveryRule'和'exitEveryRule'中注意成功之間的最高拐點(上升切換到下降,反之亦然),以區分有效和未使用的連接符號。

FWIW,你的前三個規則是不明確的,第四個規則不太可能達到你的期望,5-7可以合併來簡化你的分析。

+0

如果答案有幫助,請將其標記爲已接受。 – GRosenberg 2013-04-14 04:30:36

相關問題