1

バックグラウンド

現在、コマンドを文字列として受け入れる必要がある関数を作成しています。関数がそれらの部分を使用できるように、文字列をより細かい部分に分割する必要があります。文字列の例を次に示します。

People.filter(Hometown.eq("Pittsburgh"))

この単純化された例では、次のように解決する必要があります。

var objectToTraverse = "People";
var actionToTake = "filter";
var comparer = "Hometown";
var targetValue = "Pittsburgh";

上記の例では、分割操作は非常に簡単です。

var _command = "People.filter(Hometown.eq("Pittsburgh"))";
var command = _command.split(".");

var objectToTraverse = command[0];
var actionToTake = command[1].split("(")[0];
var comparer = command[1].split("(")[1];
var targetValue = command[2].split("(")[1].split(")")[0];

しかし、次のようなより複雑なコマンドがある場合はどうでしょう。 People.filter(Hometown.eq("Pittsburgh") && Gender.eq("male") || Age.eq(>= 35)).orderBy(Age,Gender).limitResultSet(10)

柄は毎回異なる場合がございます。

質問

JavaScript を使用して、次のようなさまざまな混合区切り文字と条件に基づいて文字列コマンドを効率的に解析するにはどうすればよいですか。

People.filter(Hometown.eq("Pittsburgh") && Gender.eq("male") || Age.eq(>= 35)).orderBy(Age,Gender).limitResultSet(10)

ご注意ください

私は、JavaScript でデータをクエリするために既に利用可能なすべてのフレームワークを認識しており、すべてのヒントやアドバイスに感謝していますが、他に何が利用可能であるかに関係なく、この質問に対する回答を求めています。

4

2 に答える 2

1

これを賢明に解析する唯一の方法は、(それを待って...)パーサーを使用することです!

Douglas Crockford の Javascript でパーサーを作成する方法については、http://javascript.crockford.com/tdop/tdop.htmlを参照してください。

于 2012-04-17T18:07:22.553 に答える
1

正規表現、特に再帰とバランスの取れたグループに欠ける JavaScript の正規表現のフレーバーは、このようなコードを解析するタスクに対応していません。整形式のネストされた括弧を備えたあなたのサンプルコードは、文脈自由文法の古典的な例であり、私よりもはるかに賢い人が正規表現で元に戻すことができると宣言しています。

必要なのは実際のパーサーです。JavaScriptで実装された完全な JavaScript パーサーが利用可能です ( JSLintには 1 つ含まれています)。または、特定のタイプの式のみを許可する場合は、選択した文法に適合するパーサーを生成できます

注意すべき 1 つのこと:これは、パーサーを使用して確実に実行できます (ただし、正規表現のみでは実行できません)。しかし、それが簡単または単純である可能性は低いです。これが実際のプロジェクトの場合は、独自のマークアップ/プログラミング言語を作成する理由がない限り、既存のソリューションの使用を検討することをお勧めします。命令型コードではなく式を記述している場合(LINQ と従来の C# など)、XML または JSON が適切な方法である可能性があります。

于 2012-04-17T18:21:42.003 に答える