我仍然在my quest for a really simple language,我現在知道沒有。所以我正在使用ANTLR3自己編寫一個。擴展簡單的ANTLR語法來支持輸入變量
我發現this answer一個真正偉大的例子:
Exp.g:
grammar Exp;
eval returns [double value]
: exp=additionExp {$value = $exp.value;}
;
additionExp returns [double value]
: m1=multiplyExp {$value = $m1.value;}
('+' m2=multiplyExp {$value += $m2.value;}
| '-' m2=multiplyExp {$value -= $m2.value;}
)*
;
multiplyExp returns [double value]
: a1=atomExp {$value = $a1.value;}
('*' a2=atomExp {$value *= $a2.value;}
| '/' a2=atomExp {$value /= $a2.value;}
)*
;
atomExp returns [double value]
: n=Number {$value = Double.parseDouble($n.text);}
| '(' exp=additionExp ')' {$value = $exp.value;}
;
Number
: ('0'..'9')+ ('.' ('0'..'9')+)?
;
WS
: (' ' | '\t' | '\r'| '\n') {$channel=HIDDEN;}
;
Java代碼:
public Double evaluate(String string, Map<String, Double> input) throws RecognitionException {
ANTLRStringStream in = new ANTLRStringStream(string);
ExpLexer lexer = new ExpLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
return new ExpParser(tokens).eval();
}
使用這個ANTLR語法,我可以計算表達式像
(12+14)/2
並得到13結果。
現在唯一缺少的用例是一種向此注入簡單雙變量的方法,以便通過提供{「A」:12.0,「B」:14.0}作爲輸入來評估以下內容地圖:
(A+B)/2
任何想法?
再次感謝!!! – arturh 2010-01-11 14:49:32
沒問題,再次! :) – 2010-01-11 14:50:17