Todavía estoy en my quest for a really simple language y ahora sé que no hay ninguna. Así que estoy escribiendo uno usando ANTLR3.Ampliando la gramática ANTLR simple para admitir variables de entrada
me encontré con un muy buen ejemplo de 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;}
;
Código 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();
}
El uso de este gramática antlr puedo evaluar expresiones como
(12+14)/2
y obtenga 13 como resultado.
Ahora, lo único que falta para mi caso de uso es una forma de insertar variables dobles simples en esto, de modo que pueda evaluar lo siguiente al suministrar {"A": 12.0, "B": 14.0} como entrada mapa:
(A+B)/2
¿Alguna idea?
gracias otra vez !!! – arturh
¡No hay problema, otra vez! :) –