我正在为 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
在两种不同的上下文中有两种含义,词法分析器就不会发出正确的标记。作为一个人为的例子(这种情况不会发生,因为电子邮件地址用引号括起来),词法分析器将如何处理像 \Answered@googlemail.com 这样的电子邮件地址?或者,形式语法是否旨在永远不允许出现这种歧义?