2009-06-27 9 views
5

Vorrei trovare un parser javascript in grado di gestire e valutare espressioni semplici. Il parser dovrebbe essere in grado di valutare le espressioni matematiche regolari e supportare le funzioni personalizzate con i parametri. Deve anche supportare la gestione delle stringhe. Concatenazione di stringhe con || il supporto dell'operatore è preferito, ma va bene se + farà il trucco.parser Javascript per un'espressione semplice

Esempi di un'espressione che dovrebbe essere gestita dal parser:

3 * (2 + 1) - 1

2 * func (2, 2)

func ('ciao mondo ', 0, 5) || 'tu'

Qualcuno ha implementato una cosa del genere o dove posso trovare qualcosa di simile?

+0

Sei alla ricerca di un parser javascript eseguire in una lingua diversa? come un'implementazione C++ di un parser javascript? O qualcosa in javascript per javascript? –

+0

Scusate se non sono stato chiaro a riguardo. No, intendo un parser scritto in javascript che analizza e valuta l'espressione semplice come descritto sopra. –

+0

è noto l'insieme delle funzioni "personalizzate"? –

risposta

8

Ho una versione modificata di un ActionScript parser (scritto in AS, non analizza AS) che supporta le funzioni personalizzate, ma non le stringhe. Tuttavia, sarebbe probabilmente facile aggiungere il supporto per le stringhe. Lo caricherò da qualche parte in modo da poterlo ottenere a http://silentmatt.com/parser2.jshttp://silentmatt.com/parser3.js.

Modifica: Ho aggiunto il supporto di base per le stringhe piuttosto facilmente. Non supporta le sequenze di escape e toJSFunction non funziona, ma ci sono voluti solo pochi minuti per farlo funzionare. Modifica dell'operatore di concatenazione su "||" dovrebbe essere abbastanza facile anche

Ecco come si dovrebbe valutare le espressioni di esempio:

js> var parser = new Parser(); 
js> parser.parse("3 * (2 + 1) - 1").evaluate(); 
8 
js> parser.parse("2 * func(2; 2)").evaluate({ func:Math.pow }); 
8 
js> function substr(s, start, end) { return s.substring(start, end); } 
js> parser.parse("func('hello world'; 0; 5) + ' you'").evaluate({ func:substr }); 
hello you 

non mi ricordo perché ho usato il punto e virgola come separatori di argomenti; Penso che abbia qualcosa a che fare con la differenziazione tra funzioni e funzioni "operatore" integrate.

Un'altra modifica:

Ho giocato con questo un po ', e ora c'è una versione con supporto migliore stringa in http://silentmatt.com/parser3.js (toJSFunction funziona, ed è possibile utilizzare JavaScript standard sequenze di escape). Utilizza inoltre le virgole per separare gli argomenti per tutte le funzioni e || come operatore di concatenazione di stringhe invece di +, che aggiunge solo.

+0

Grazie amico. Apprezzo molto il vostro aiuto. Questo corrisponde a quello che ho descritto ed è anche facile da modificare ed estendere. Questo è quello che stavo cercando. Sono davvero grato per questo. –

+0

Un altro commento ... Matthew, ho dimenticato di dire che sei grande! Apprezzo molto la modifica nella terza versione man. Mantenere il buon lavoro. Ti auguro il meglio. –

+0

Nessun problema. Avevo intenzione di giocare con questo per un po '(non l'ho toccato per diversi mesi). Gran parte del merito va a Raphael Graf, che ha comunque scritto la versione originale. –

3

Supponendo si intende un parser javascript in javascript, probabilmente si desidera eval()

vedi: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Functions/Eval

Basta notare che eval, se utilizzato in modo improprio, può rappresentare un rischio per la sicurezza.

+0

No, eval non è una scelta per me. Come hai detto, introdurrà rischi per la sicurezza, e nel mio caso il rischio è molto alto. Voglio un parser personalizzato e limitato per fare ciò che è descritto sopra. Ma grazie –

3

non lo hanno usato, ma un rapido Google rivela http://jsfromhell.com/classes/math-parser

modificare:

Che cosa si vuole fare può essere fuori dalla portata del primo collegamento, si potrebbe anche dare un'occhiata a Douglas Crockford's "parser for Simplified JavaScript"

È solo un parser, quindi dovresti fare tutta la valutazione da solo. Tuttavia, lo renderebbe un po 'più semplice e non utilizzerà eval.

+0

Grazie. Questo suona promettente e la corrispondenza più vicina alla mia richiesta, tuttavia, manca il supporto delle stringhe. Anche modificarlo per supportare le stringhe è difficile, dal momento che non si ricollega all'approccio ricorsivo piuttosto che a un ottimizzato (ma piacevole) modo di analizzare. Qualcuno può aiutarti a modificarlo per supportare le stringhe? –

0

Vedere questo tutorial su come compilare parser/compilatori arbitrari. (Fondamentalmente automatizza la costruzione di parser di discendenza ricorsivi da grammatiche, il che significa che è possibile modificare facilmente la sintassi delle espressioni). L'intero tutorial è fatto in JavaScript, quindi si applica direttamente a te.

http://www.bayfronttechnologies.com/mc_tutorial.html

2

math.js provare:

http://mathjs.org

è dotato di un ampio e facile da usare parser, che supporta anche l'assegnazione e l'utilizzo delle variabili e funzioni, come nel tuo esempio di espressione. Si integra perfettamente con JavaScript "nativo": puoi ottenere e impostare variabili e funzioni dall'ambito di Parser.

Il codice esempio potrebbe essere valutato come:

var parser = math.parser(); 
parser.set('func', function() { 
    // ... do something ... 
}); 
parser.eval('3 * (2 + 1) - 1'); 
parser.eval('2 * func(2, 2)'); 
parser.eval('func("hello world", 0, 5) + " you"'); 

Le funzioni possono anche essere definiti nel parser per sé (attualmente solo funzioni a linea singola):

parser.eval('function f(x, y) = x^y'); 
parser.eval('f(2, 3)'); // 8