5

これが私が達成しようとしていることです。ユーザーがクエリを入力できるGoogleのようなテキストボックスを1つ提供したいと思います。そして、私は彼らに次のような半自然言語を表現できるようにしたいと思います

"view all between 1/1/2008 and 1/2/2008"

構文を適切に構造化し、この特定のドメインに限定する必要がある場合は問題ありません...これらはこれを使用するエキスパートユーザーです。

最終的には、解析結果をある種の式ツリーとして利用できるようにしたいと思います。ただし、どのデータ構造が優れているかについて他のアイデアがある場合。

これはC#です:-)

4

8 に答える 8

4

あなたはプログラミング言語を説明しています。確かに、それは小さな言語 (小さな言語、またはドメイン固有言語 (DSL) と呼ばれることが多い) です。再帰降下パーサーという用語を聞いたことがない場合は、Paul のアドバイスに従い、何らかの説明のドロップダウン ボックスを使用することをお勧めします。

しかし、繰り返しになりますが、やりたいのであれば、Antlr が最適であるという彼の意見に同意する必要があります。このサイトには、開始するのに役立つチュートリアルがあります。基本的にはBackus-Naur Form記法で構文を記述する必要があります。

次に、グラマーに対して Antlr を実行すると、パーサーが生成されます。次に、教科書からの入力を抽象構文ツリーにフィードできます。その後、そのツリーを使用してクエリを生成できます。思ったほど難しくはありませんが、少しコツがあります。

これに本当に興味がある場合、および/またはプログラミングの腕を少し伸ばしたい場合は、Dragon Book、AKA Compilers: Principles、Techniques and Tools でトピックの詳細を読むことができます。

幸運であれ友よ。

于 2008-12-09T06:07:35.983 に答える
3

非常に単純な言語の場合、正規表現を使用します。主な利点は、コード生成を処理する必要がないことです。ただし、パターン マッチングのデバッグは基本的にゼロです。

言語がやや複雑な場合 (単一の文法ファイルですべてを指定してもかまわない)、高速で使いやすく、非常にデバッグしやすいコードを作成するCoco/Rを使用します。

より複雑な言語については、現在のお気に入りはAntlr v3です。('import' ステートメントを介して) 複数ファイルの文法をサポートします。これは非常に優れています。生成されたコードはデバッグ可能ですが、デバッグが「簡単」であると見なされるまでには少し慣れる必要があります。

于 2008-12-09T05:38:17.417 に答える
2

私は以前にこの状況にありました。多くの議論の後、状況依存のドロップダウンが単なるテキスト ボックスよりも優れたソリューションであると判断しました。

たとえば、4 つのドロップダウンがありますが、最後の 3 つは無効になっています。次に、ユーザーが最初のオプションからオプションを選択すると、他のオプションが読み込まれて有効になります。そのため、「すべて表示」を選択してから「間」を選択し、最後の 2 つのテキスト ボックスまたはカレンダーをポップします。

これは、私が話していることのようなものです

于 2008-12-09T05:20:21.633 に答える
1

このために特別に設計されたOsloを使用してください...

于 2009-01-12T20:12:45.397 に答える
1

式ツリーは良いアイデアです。正しいクエリ文字列を式ツリーに変換できる、オープンソースや商用の優れた一般的なパーサーやパーサー ジェネレーターが数多くあります。

于 2008-12-09T05:10:10.623 に答える
0

GOLD パーサー ジェネレーターには、文法の設計とテストに役立つ UI、適度に優れたチュートリアルとドキュメントがあり、C# から簡単に使用できます。

于 2009-01-12T20:19:10.267 に答える
0

これが役立つかどうかはわかりませんが、私たちがしたことは次のとおりです: 日付選択などの事前定義された基準をユーザーに提供し、2 つのカレンダーポップアップを提供して、日付範囲から選択できるようにしました...必須にしないでください..日付フィルターを使用して、ユーザーが日付を指定した場合にのみ適用します...同様に、ユーザーに事前定義された基準の選択を与えることもできます...それ以外の場合、式ツリーはそのための優れた回避策のようです.

于 2008-12-09T06:47:02.720 に答える
-1

そのようなものを解析しようとすると大惨事になり、究極的にはユーザーを非常に制限するため、ユーザーを助けるよりもイライラさせます. ドロップダウン形式で利用可能なすべてのオプションを持つ何らかの種類のクエリビルダーツールを使用して、事前定義されたクエリクラスを使用することをお勧めします。さまざまなデータ型 (数値よりも大きい、数値よりも小さい、文字列は好きではないなど) に対してさまざまなブール演算子を使用できますが、ユーザーが入力した内容を実際に解析しようとするよりもはるかに理にかなっていると思います。

于 2008-12-09T05:05:11.163 に答える