単純な式のための Javascript パーサー
-
20-08-2019 - |
質問
単純な式を処理および評価できる JavaScript パーサーを見つけたいと考えています。パーサーは正規の数式を評価でき、パラメーターを含むカスタム関数をサポートできる必要があります。また、文字列処理もサポートする必要があります。||との文字列連結オペレーターのサポートが推奨されますが、 +がトリックを行う場合は問題ありません。
パーサーによって処理される必要がある式の例:
3 * (2 + 1) - 1
2 * 関数(2, 2)
func( 'hello world'、0、5)|| ' あなた'
誰かがそのようなことを実装したことがありますか、それとも同様のものをどこで見つけられますか?
解決
の修正バージョンを持っています ActionScript パーサー (AS で記述され、AS を解析しない) カスタム関数をサポートしますが、文字列はサポートしません。ただし、文字列のサポートを追加するのはおそらく簡単でしょう。どこかにアップロードしますので、以下から入手してください http://silentmatt.com/parser2.js http://silentmatt.com/parser3.js.
編集: 文字列の基本サポートを非常に簡単に追加しました。エスケープ シーケンスはサポートされておらず、toJSFunction は機能しませんが、機能するまでに数分しかかかりませんでした。連結演算子を「||」に変更するとても簡単なはずです。
式の例を評価する方法は次のとおりです。
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
なぜ引数の区切り文字としてセミコロンを使用したのか思い出せません。これは関数と組み込みの「演算子」関数の区別に関係があると思います。
別の編集:
私はこれで少し遊んでいますが、今ではより良い文字列サポートを備えたバージョンがあります。 http://silentmatt.com/parser3.js (toJSFunction は機能し、標準の JavaScript エスケープ シーケンスを使用できます)。また、カンマを使用してすべての関数の引数を区切ります。 ||
代わりに文字列連結演算子として +
, 、加算のみを行います。
他のヒント
あなたはjavascriptのパーサを意味すると仮定すると、の中にのjavascriptの、あなたはおそらくしたいのeval()
を参照してください。 https://developer.mozilla.org/En/Core_JavaScript_1 .5_Reference / Global_Functions /評価する
ただ、不適切に使用した場合、セキュリティ上のリスクを表すことができ、その評価に注意します。
は、それを使用していないが、簡単にGoogleは http://jsfromhell.com/classes/明らかに数学・パーサの
編集
あなたが最初のリンクの手の届かないかもしれ何をしたいのか、あなたはまた、「http://javascript.crockford.com/tdop/index.html」のrel = =ダグラス・クロックフォードの
それはちょうどパーサですので、あなたはすべての評価を自分で行う必要があります。それは、しかし、それはいくらか容易になるだろうと、それはevalを使用していません。
math.jsを試してみてください。
は、広範かつまた、あなたの例の式のような変数や関数の割り当てと使用をサポートしているパーサを、使いやすいが付属しています。 「ネイティブ」のJavaScriptとシームレスに統合:あなたが得るとパーサスコープからの変数と関数を設定することができます。
。あなたのコード例では、として評価されるだろう
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"');
の関数は、(現在、単一行関数)パーサ自体に定義することができます。
parser.eval('function f(x, y) = x ^ y');
parser.eval('f(2, 3)'); // 8
任意のパーサ/コンパイラを構築する方法については、このチュートリアルを参照してください。 (基本的には再帰下降構文解析の構築を自動化 文法から、あなたは)簡単に表現の構文を変更することができますを意味します。 全体のチュートリアルは、JavaScriptで行われ、それはあなたに直接適用されます。
水仙 適切な JS パーサーを JS に実装します。 http://mxr.mozilla.org/mozilla/source/js/narcissus/jsparse.js. 。Brendan Eich (JS 作成者) によって書かれたものもあります。