Tôi vẫn đang ở trên my quest for a really simple language và bây giờ tôi biết rằng không có biến nào. Vì vậy, tôi đang viết một bản thân mình bằng cách sử dụng ANTLR3.Mở rộng ngữ pháp ANTLR đơn giản để hỗ trợ các biến đầu vào
Tôi tìm thấy một ví dụ thực sự tuyệt vời trong 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 Code:
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();
}
Sử dụng ngữ pháp ANTLR này tôi có thể đánh giá biểu thức như
(12+14)/2
và nhận kết quả là 13. Bây giờ điều duy nhất còn thiếu trong trường hợp sử dụng của tôi là một cách để tiêm biến kép đơn giản vào điều này, để tôi có thể đánh giá những điều sau bằng cách cung cấp {"A": 12.0, "B": 14.0} làm đầu vào bản đồ:
(A+B)/2
Bất kỳ ý tưởng nào?
cảm ơn một lần nữa !!! – arturh
Không sao, một lần nữa! :) –