3

私はOCamlで単純な再帰下降パーサーを書いています。通常(オンラインおよび書籍のチュートリアルからわかる限り)、例外は解析の失敗を示すために使用されます。次に例を示します。

match tok with
   TokPlus -> ...
 | _ -> raise SyntaxError

ただし、代わりにオプションタイプを使用することを考えています。

match tok with
   TokPlus -> Some(...)
 | _ -> None

これを実行したい主な理由は、オプションタイプを使用すると、一部のコンビネータを末尾再帰に最適化できるためです。

例外の代わりにオプションを使用することの欠点はありますか?より複雑な構造の解析を開始するときに、この決定は私を苦しめますか?

4

3 に答える 3

3

いいえ。ただし、エラーを文法のルート生成に伝播するために、(多くの)ダミールールを追加する必要がある可能性があります。

例外のポイントは、各ルーチンに例外ハンドラーを追加する必要がないことです。暗黙の伝播が発生します。

最適化された末尾再帰が必要な特定の理由はありますか?ほとんどのパーサーは、実際には非常に深いコールスタックを生成しません(非常に複雑なものの場合は数百レベル)。そして、非パーサー部分によって行われている他のすべての作業と比較して、時間の節約が重要であるとは思えません。

于 2011-10-20T08:47:59.520 に答える
2

例外は一般的なケースを最適化すると思います-解析を成功させるためのコードパスはより単純です。通常、解析するときは、すべてまたはまったくありません-すべてが正常に解析され、最終結果が返されるか、何かが壊れます-とにかくそれを処理するつもりはないので、意味のあるメッセージを出力することを除いて、どこで壊れてもかまいませんが、1つそのステップもスキップできます:)したがって、例外に完全に一致するように見えます。

于 2011-10-20T08:49:33.937 に答える
1

再帰下降構文解析の優れている点は、(理由の範囲内で)好きな方法でコードを記述できることです。すべての中間関数で例外をキャッチすることを想像しない限り、例外の有無にかかわらず末尾を再帰的に書き込むことに問題はありません。文法の先頭近くに1つ(またはいくつか)の例外ハンドラーがある可能性があります。その場合、以下のすべてのコードは簡単に末尾再帰になる可能性があります。

したがって、例外スタイルは構文解析にとって非常に自然であり、例外を使用することが必ずしも末尾再帰スタイルを排除するとは思わないというygrekに同意します。

于 2011-10-20T15:52:06.367 に答える