我需要編寫布爾表達式解析器/評估器。 表達會的形式,並會在括號括起來: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給出了一些評估表達的想法,但我無法適用於我的案例
謝謝巴特。當我在antlrworks 2上運行它時,我可以獲得我的樹結構。我尚未開發評估部分。 – ssdimmanuel
語法像魅力一樣工作。我做了簡單的修改以適應我的需求。對我來說,我的應用程序中的表達式一旦定義就相當靜態。我正在考慮將分析樹寫入磁盤,但發現它不可能,因爲這些類不是可序列化的。有沒有其他經過驗證的方法可以做到這一點? – ssdimmanuel
我還沒有看到序列化/持續的ANTLR 4類。 –