私は教育目的で IMAP プロトコル用のレクサーを作成していますが、レクサーとパーサーの境界線をどこに引くべきか悩んでいます。IMAP サーバーの応答の例を次に示します。
* FLAGS (\Answered \Deleted)
この応答は、次のような正式な構文で定義されます。
mailbox-data = "FLAGS" SP flag-list
flag-list = "(" [flag *(SP flag)] ")"
flag = "\Answered" / "\Deleted"
これらは文字列リテラル (別名「端末」トークン) として指定されているため、次のように、レクサーがそれぞれに対して一意のトークンを発行する方が正しいでしょう。
(TknAnsweredFlag)
(TknSpace)
(TknDeletedFlag)
または、次のようなものを発行するのも同じくらい正しいでしょうか:
(TknBackSlash)
(TknString "Answered")
(TknSpace)
(TknBackSlash)
(TknString "Deleted")
私の混乱は、前者の方法がレクサーを過度に複雑にする可能性があること\Answered
です.2つの異なるコンテキストで2つの意味がある場合、レクサーは正しいトークンを発行しません。不自然な例として (電子メール アドレスが引用符で囲まれているため、このような状況は発生しません)、レクサーは \Answered@googlemail.com のような電子メール アドレスをどのように処理しますか? それとも、そのようなあいまいさが生じないように設計された正式な構文ですか?