0

パーサー ジェネレーターを使用して、電子メール メッセージの "From ヘッダー" 用のパーサーを作成したいと考えています。From ヘッダーの例を次に示します。

From: "John Doe" <john@doe.org>

そのためのパーサーを実装するのは簡単だと思います。

ただし、「From ヘッダー」構文には複雑な点があります。コメントはほぼどこにでも挿入できます。たとえば、「john」内にコメントを挿入できます。

From: "John Doe" <jo(this is a comment)hn@doe.org>

また、コメントは他の多くの場所に挿入できます。

この合併症をどのように処理しますか? 「2 パス」パーサーが必要ですか? 1 つのパスですべてのコメントを削除し、2 番目のパスで From ヘッダーの解析ツリーを作成しますか? 最新のパーサー ジェネレーターは、入力の複数のパスをサポートしていますか? シングルパスで解析できますか? はいの場合、アプローチをスケッチしてください。

4

1 に答える 1

2

あなたの電子メール アドレスの解釈が正しいとは思えません。私が RFC-822 を読んだ結果、コメントは「単語」の前または後にしか付けることができず、addr-spec のローカル部分の「単語」はドット (".") で区切る必要があると信じるようになりました。 )。セクション 3.1.4 は、構文解析の方法についてかなり良いヒントを与えてくれます。構文記号をパーサーに供給する語彙アナライザーが必要です。字句アナライザーは、ヘッダーを展開し、空白を無視し、コメント、引用符で囲まれた文字列、アトム、および特殊文字を識別することが期待されています。

もちろん、RFC-822 は廃止されて久しいので、コメントが埋め込まれた電子メール ヘッダーは時代錯誤だと思います。

とはいえ、flex と bison を使用すると、目的の分析を簡単に実現できたようです。示されているように、flex はコメントを識別します。厳密に言えば、コメントは入れ子になるため、正規表現でコメントを識別することはできません。しかし、開始条件スタックを使用するか、カウンターを維持することでさらに経済的に単純な入れ子構造を認識することができます (最も外側の括弧が見つかるまで flex は返されないため、カウンターはグローバルである必要はありません)。

于 2013-06-07T21:25:29.037 に答える