Frage

Ich mag einen JavaScript-Parser finden, umgehen kann und einfache Ausdrücke auswerten. Der Parser sollte die regelmäßige mathematische Ausdrücke auswerten können, und benutzerdefinierte Funktionen mit Parametern unterstützen. Es hat auch Strings unterstützen Handhabung. String-Verkettung mit || Bedienerunterstützung wird bevorzugt, aber es ist in Ordnung, wenn + wird es tun.

Beispiele für einen Ausdruck, der vom Parser behandelt werden soll:

3 * (2 + 1) - 1

2 * func (2, 2)

func ( 'Hallo Welt', 0, 5) || 'Sie'

Hat jemand implementiert, um eine solche Sache oder wo finde ich etwas ähnliches?

War es hilfreich?

Lösung

Ich habe eine modifizierte Version eines Actionscript-Parser (in AS geschrieben, nicht Parsen AS), die benutzerdefinierten Funktionen unterstützt, aber keine Strings. Es wäre wahrscheinlich einfach sein, obwohl String Unterstützung hinzuzufügen. Ich werde es irgendwo hochladen, damit Sie es bei bekommen http://silentmatt.com/parser2.js http://silentmatt.com/parser3.js .

Edit: Ich grundlegende Unterstützung für Strings ziemlich leicht hinzugefügt werden. Es unterstützt keine Escape-Sequenzen und toJSFunction nicht funktioniert, aber es dauerte nur ein paar Minuten, um es zu arbeiten. Ändern der Verknüpfungsoperator auf „||“ sollte auch recht einfach sein.

Hier ist, wie Sie Ihr Beispiel Ausdrücke auswerten würde:

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

Ich erinnere mich nicht, warum ich Semikolons als Argument Separatoren verwendet; Ich denke, es hat etwas mit der Unterscheidung zwischen Funktionen und integrierten „Operator“ Funktionen zu tun.

Ein weiterer edit:

Ich habe mit diesem einem wenig gespielt, und jetzt gibt es eine Version mit besserer String Unterstützung bei http: // silentmatt.com/parser3.js (toJSFunction funktioniert, und Sie können Standard-Escape-Sequenzen JavaScript verwenden). Es verwendet auch Kommas Argumente für alle Funktionen und || als String-Verkettung Operator zu trennen, anstatt +, die nur zusätzlich der Fall ist.

Andere Tipps

Angenommen, Sie eine JavaScript-Parser bedeuten in JavaScript aktivieren, werden Sie wahrscheinlich wollen eval ()

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

Just dass eval beachten, wenn sie nicht richtig verwendet wird, kann ein Sicherheitsrisiko darstellen.

haben sie nicht genutzt, aber eine schnelle Google enthüllt http://jsfromhell.com/classes/ Mathe-Parser

Bearbeiten :

Was Sie außerhalb der Reichweite der ersten Verbindung wollen sein kann, können Sie auch einen Blick auf Douglas Crockford haben "Parser für Simplified JavaScript"

Es ist nur ein Parser, so würden Sie sich selbst die ganze Auswertung zu tun haben. Es wäre jedoch macht es etwas leichter und es nicht eval.

Versuchen math.js:

http://mathjs.org

kommt mit einer umfangreichen und einfachen Parser zu verwenden, die auch Zuweisung und Nutzung von Variablen und Funktionen wie in Ihrem Beispiel Ausdruck unterstützt. nahtlos mit „native“ JavaScript integriert. Sie können von dem Parser Umfang Variablen und Funktionen erhalten und setzen

Ihr Beispielcode ausgewertet werden würde, wie:

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"');

Die Funktionen können auch im Parser selbst (derzeit nur einzeilige Funktionen) definiert werden:

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

Sehen Sie diese Anleitung dafür, wie willkürlich Parser / Compiler zu bauen. (Im Grunde automatisiert es den Bau von Rekursiver Abstieg von Grammatiken, dh Sie können Ihre Ausdruckssyntax) leicht ändern kann. Das ganze Tutorial ist in JavaScript getan, so gilt es direkt an Sie.

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

Narcissus implementiert einen richtigen JS-Parser in JS: http://mxr.mozilla.org/mozilla/source/js/narcissus/jsparse. js . Geschrieben von Brendan Eich (JS Konzept) auch!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top