5

単純な式を処理および評価できる JavaScript パーサーを見つけたいと思います。パーサーは、正規の数式を評価し、パラメーターを使用してカスタム関数をサポートできる必要があります。また、文字列の処理もサポートする必要があります。|| による文字列連結 演算子のサポートが優先されますが、 + でうまくいく場合は問題ありません。

パーサーで処理する必要がある式の例:

3 * (2 + 1) - 1

2 * 関数 (2, 2)

func('ハローワールド', 0, 5) || ' あなた'

誰かがそのようなことを実装しましたか、どこで似たようなものを見つけることができますか?

4

6 に答える 6

9

文字列ではなくカスタム関数をサポートする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エスケープシーケンスを使用できます)。また、コンマを使用してすべての関数の引数を区切り、加算のみを行う||の代わりに文字列連結演算子として使用します。+

于 2009-06-27T20:15:29.647 に答える
3

使用していませんが、簡単なグーグルでhttp://jsfromhell.com/classes/math-parserを明らかにします

編集

あなたがやりたいことは、最初のリンクでは手の届かないところにあるかもしれません。 Douglas Crockford の"parser for Simplified JavaScript" を参照することもできます。

これは単なるパーサーなので、すべての評価を自分で行う必要があります。ただし、多少簡単になり、eval は使用しません。

于 2009-06-27T10:12:55.443 に答える
2

javascript の javascript パーサーを意味すると仮定するとおそらく eval() が必要です

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

eval を不適切に使用すると、セキュリティ上のリスクが生じる可能性があることに注意してください。

于 2009-06-27T09:48:23.090 に答える
0

Narcissusは、JSに適切なJSパーサーを実装します:http://mxr.mozilla.org/mozilla/source/js/narcissus/jsparse.js。ブレンダンアイク(JSクリエーター)によっても書かれました!

于 2009-10-29T20:49:43.627 に答える