2016-09-23 31 views
1

我需要編寫布爾表達式解析器/評估器。 表達會的形式,並會在括號括起來:Antlr - 表達式解析器和評估器

exp1 : (A = B) 
exp2 : ((A = B) AND (C = D)) 
exp3 : ((A = B) AND ((C = D) OR (E = F))) 
exp4: (((A = B) AND (C = D)) OR (E = F)) 

,並繼續下去。該規則可能包含「n」個表達式,每個組中都有適當的分組2。我的語法文件如下所示:

/* 
Expression grammar 
*/ 

grammar Exparser; 

options 

{ 
    language = Java; 
} 
cond : 
tc EOF; 

tc: 
     exp 
    | binary_exp 
| leftparen* exp (binaryop leftparen* exp rightparen+)* 
| leftparen* exp (binaryop leftparen* exp rightparen*)* 

; 

binary_exp: 
'(' exp BINARYOP exp ')' 
; 

binaryop: 
      BINARYOP 
     ; 
leftparen: 
      LEFTPARN 
     ; 

rightparen: 
       RIGHTPARN 
      ; 

exp: 
LEFTPARN VARIABLE COMPOP VARIABLE RIGHTPARN 

; 

variable: 
      VARIABLE; 


BINARYOP: AND | OR; 
COMPOP: EQUAL | LT | GT | LTE | GTE | NE; 
VARIABLE: (CHAR)+; 
LEFTPARN: '('; 
RIGHTPARN: ')'; 
EQUAL: '=' | 'EQ'; 
LT: '<' | 'LT'; 

GT:'>' | 'GT'; 
LTE: '<='; 
GTE: '>='; 
NE : '!=' | 'NE'; 
AND: 'AND' | '&' | 'and'; 

OR: 'OR' | 'or'; 

CHAR : 'a'..'z'|'A'..'Z'|'_' |'0'..'9'|'-' | '.' 
    ; 

該語法運行正常,但我無法在AST中實現深度。例如exp3被解析爲三個exp而不是一個exp和一個binary_exp。 另外如何使用我的解析器評估布爾表達式? 我的語法如何強制平衡括號? 雖然Nested Boolean Expression Parser using ANTLR給出了一些評估表達的想法,但我無法適用於我的案例

回答

1

從以下語法生成的解析器解析所有例如輸入:

grammar Exparser; 

parse 
: expr EOF 
; 

expr 
: expr binop expr 
| VARIABLE 
| '(' expr ')' 
; 

binop 
: AND | OR | EQUAL | LT | GT | LTE | GTE | NE 
; 

EQUAL  : '=' | 'EQ'; 
LT  : '<' | 'LT'; 
GT  : '>' | 'GT'; 
LTE  : '<='; 
GTE  : '>='; 
NE  : '!=' | 'NE'; 
AND  : 'AND' | '&' | 'and'; 
OR  : 'OR' | 'or'; 
VARIABLE : [a-zA-Z0-9_.-]+; 
SPACE  : [ \t\r\n] -> skip; 

評估這些表達式應該是一樣the Q&A you linked to in your question

+0

謝謝巴特。當我在antlrworks 2上運行它時,我可以獲得我的樹結構。我尚未開發評估部分。 – ssdimmanuel

+0

語法像魅力一樣工作。我做了簡單的修改以適應我的需求。對我來說,我的應用程序中的表達式一旦定義就相當靜態。我正在考慮將分析樹寫入磁盤,但發現它不可能,因爲這些類不是可序列化的。有沒有其他經過驗證的方法可以做到這一點? – ssdimmanuel

+0

我還沒有看到序列化/持續的ANTLR 4類。 –

0

注意:我不知道antlr。不過,我認爲你需要讓你的語法更加明確。你超負荷exp太多。嘗試這樣的僞代碼:

tc <- binary_exp ; 
binary_exp <- comparison_exp 
      | LEFTPARN binary_exp RIGHTPARN 
      | LEFTPARN binary_exp BINARYOP binary_exp RIGHTPARN ; 
comparison_exp <- LEFTPARN VARIABLE COMPOP VARIABLE RIGHTPARN ; 
  • tc是一個二進制表達式binary_exp
  • 二進制表達爲下列之一:
    • 的比較表達式comparison_exp
    • 一個二進制表達式用括號(LEFTPARNRIGHTPARN)包圍,
    • 或左括號LEFTPARN的序列,一個binary_exp,二元運算符BINARYOPbinary_exp和右括號RIGHTPARN
  • 的比較表達式是左括號LEFTPARN的序列,可變VARIABLE,比較運算符COMPOP,一個VARIABLE,和右括號RIGHTPARN

該語法將允許二進制表達式嵌套在額外的括號內或嵌套在另一個括號內,但比較表達式不能在其中嵌套其他表達式。