ユーザー定義のドメイン固有の言語を解析したい。これらの言語は通常、数学表記に近いものです(自然言語を解析していません)。ユーザーは次のようにBNF表記でDSLを定義します。
expr ::= LiteralInteger
| ( expr )
| expr + expr
| expr * expr
入力のようなもの1 + ( 2 * 3 )
は受け入れられなければならず、入力のようなもの1 +
は不正確であるとして拒否され、入力のようなもの1 + 2 * 3
は曖昧なものとして拒否されなければなりません。
ここでの中心的な困難は、あいまいな文法をユーザーフレンドリーな方法で対処することです。文法を曖昧でないように制限することは選択肢ではありません。それが言語のやり方です。つまり、曖昧さを避けるために必要でない場合は、括弧を省略するほうが好ましいという考え方です。式が曖昧でない限り、解析する必要があり、そうでない場合は拒否する必要があります。
私のパーサーは、文脈に依存しない文法、あいまいなものでも動作し、すべての明確な入力を受け入れなければなりません。受け入れられたすべての入力に解析ツリーが必要です。無効またはあいまいな入力の場合、理想的には適切なエラーメッセージが必要ですが、最初に取得できるものを取り上げます。
私は通常、比較的短い入力でパーサーを呼び出しますが、入力は時々長くなります。したがって、漸近的に高速なアルゴリズムは最良の選択ではないかもしれません。入力が20シンボル未満の約80%、20〜50シンボルの19%、まれに1%のより長い入力の分布に最適化したいと思います。無効な入力の速度は大きな問題ではありません。さらに、DSLが1000〜100000入力ごとに変更されることを期待しています。数分ではなく、文法の前処理に数秒費やすことができます。
典型的な入力サイズを考慮して、どの解析アルゴリズムを調査する必要がありますか?エラー報告は私の選択の要因である必要がありますか、それとも明確な入力の解析に集中し、エラーフィードバックを提供するために完全に別個の低速なパーサーを実行する必要がありますか?
(それが必要なプロジェクト(しばらく前)では、CYKを使用しました。これは実装するのにそれほど難しくなく、入力サイズに適切に機能しましたが、非常に良いエラーを生成しませんでした。)
x+y+z
。
+
、x+y+z
実際には曖昧であるため、誤りです。