Domanda

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 funzioni personalizzate con parametri. Deve inoltre supportare la gestione delle stringhe. Concatenazione di stringhe con || il supporto dell'operatore è preferito, ma va bene se + farà il trucco.

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

3 * (2 + 1) - 1

2 * func (2, 2)

func ('hello world', 0, 5) || "tu"

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

È stato utile?

Soluzione

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

Modifica: ho aggiunto abbastanza facilmente il supporto di base per le stringhe. 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 & Quot; || & Quot; dovrebbe essere anche abbastanza facile.

Ecco come valuteresti le tue 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 ricordo perché ho usato i punti e virgola come separatori di argomenti; Penso che abbia qualcosa a che fare con la differenziazione tra funzioni e & Quot; operatore & Quot; funzioni.

Un'altra modifica:

Ci ho giocato un po 'e ora c'è una versione con un miglior supporto delle stringhe a http: // silentmatt.com/parser3.js (toJSFunction funziona e puoi utilizzare sequenze di escape JavaScript standard). Utilizza anche le virgole per separare gli argomenti per tutte le funzioni e || come operatore di concatenazione di stringhe anziché +, che esegue solo l'aggiunta.

Altri suggerimenti

Supponendo che intendi un parser javascript in javascript, probabilmente vorrai eval ()

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

Nota che eval, se usato in modo improprio, può rappresentare un rischio per la sicurezza.

non l'ho usato, ma un veloce google rivela http://jsfromhell.com/classes/ math-parser

modifica :

Quello che vuoi fare potrebbe essere fuori dalla portata del primo link, puoi anche dare un'occhiata a " parser per JavaScript semplificato "

È solo un parser, quindi dovresti fare tu stesso tutta la valutazione. Tuttavia, lo renderebbe in qualche modo più semplice e non usa eval.

Prova math.js:

http://mathjs.org

Viene fornito con un parser esteso e facile da usare, che supporta anche l'assegnazione e l'utilizzo di variabili e funzioni come nell'espressione di esempio. Si integra perfettamente con & Quot; native & Quot; JavaScript: è possibile ottenere e impostare variabili e funzioni dall'ambito del parser.

Il tuo codice di esempio verrà 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 definite nel parser stesso (attualmente solo funzioni a riga singola):

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

Vedi questo tutorial per come costruire parser / compilatori arbitrari. (Fondamentalmente automatizza la costruzione di parser di discesa ricorsivi dalle grammatiche, il che significa che puoi cambiare facilmente la sintassi delle tue espressioni). L'intero tutorial è fatto in JavaScript, quindi si applica direttamente a te.

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

Narcissus implementa un parser JS corretto in JS: http://mxr.mozilla.org/mozilla/source/js/narcissus/jsparse. js . Scritto anche da Brendan Eich (il creatore di JS)!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top