2010-10-24 18 views
15

Sto cercando un valutatore per semplici condizione espressioni. Le espressioni dovrebbero includere variabili (sola lettura), stringhe, numeri e alcuni operatori di base.Alla ricerca di un analizzatore di espressioni

E.g. espressioni qualcosa di simile:

${a} == "Peter" && (${b} == null || ${c} > 10) 

Finora ho implementato un parser piuttosto "magico" che restituisce un AST che posso valutare, ma non riesco a credere che io sono il primo a risolvere il problema.

Cosa codice esistente potrei usare invece?

+0

Che lingua/grammatica stai cercando di valutare? È qualcosa che hai inventato? Cosa c'entra Java con questo? –

+2

Immagino che l'OP voglia qualcosa che gira su JVM. –

+0

Abbiamo usato JEP su un progetto (http://www.singularsys.com/jep/) ma mi piacerebbe davvero un piccolo equivalente adattabile che potesse effettivamente produrre bytecode per una funzione per motivi di prestazioni. Abbiamo abbandonato JEP per questo motivo e abbiamo terminato la codifica manuale di un numero enorme di classi Java. Forse un'anima intraprendente con ANTLR e BCEL potrebbe farlo? – andersoj

risposta

3

Perché non si utilizza Rhino? È un motore JavaScript già presente all'interno del JDK.

E 'in grado di valutare ciò che ti piace scrivere in JS .. dare un'occhiata here

+0

Infatti stiamo usando Rhino per script personalizzati più grandi già. Ma non voglio dare a queste piccole espressioni tutta la potenza di un linguaggio di scripting. – Stroboskop

3

Questo semplice recursive descent parser valuta le costanti come funzioni denominate hanno alcun parametro.

+3

Quando sostituirò la magia con la scienza, andrò da quella parte. Ma ora sto cercando una soluzione esistente. – Stroboskop

11

Hai guardato MVEL? Forniscono un getting started guide e performance analysis.

Ecco uno dei loro semplici esempi:

// The compiled expression is serializable and can be cached for re-use. 
CompiledExpression compiled = MVEL.compileExpression("x * y"); 

Map vars = new HashMap(); 
vars.put("x", new Integer(5)); 
vars.put("y", new Integer(10)); 

// Executes the compiled expression 
Integer result = (Integer) MVEL.executeExpression(compiled, vars); 
assert result.intValue() == 50; 

anche (rispondendo alla mia domanda) MVEL sembra fornire qualche supporto per bytecode generation.

Altre alternative, abbattimento delle risposte di cui sopra e la mia:

2

Un semplice alternative un sacco con built-in funzioni di Excel per la stringa, la data e la formattazione del numero.

La libreria permette anche un facile aggiunta di funzioni personalizzate. Un sacco di esempi disponibili sulla pagina git. Un semplice esempio utilizzando le variabili

ExpressionsEvaluator evalExpr = ExpressionsFactory.create("LEFT(City, 3)"); 
    Map<String, Object> variables = new HashMap<String, Object>(); 
    variables.put("City", "New York"); 
    assertEquals("New", evalExpr.eval(variables)); 
+0

Sembra davvero promettente per una soluzione pronta per l'uso. Ma alla fine sono andato per Antlr e ho costruito il mio linguaggio di espressione. – Stroboskop

Problemi correlati