为了教育目的,我正在为IMAP协议编写一个词法分析器,而且我很难理解我应该在词法分析器和解析器之间划清界限。采取本实施例中的IMAP服务器响应的:我应该在词法分析器和分析器之间划清界限?
* FLAGS (\Answered \Deleted)
此响应在正式的语法定义如下:
mailbox-data = "FLAGS" SP flag-list
flag-list = "(" [flag *(SP flag)] ")"
flag = "\Answered"/"\Deleted"
由于它们被指定为字符串(又名“终端”标记)将它更正确的词法分析器发出的每一个唯一令牌,如:
(TknAnsweredFlag)
(TknSpace)
(TknDeletedFlag)
或者它会同样正确发出someth荷兰国际集团这样的:
(TknBackSlash)
(TknString "Answered")
(TknSpace)
(TknBackSlash)
(TknString "Deleted")
我的困惑是,前一种方法可能过于复杂的词法分析器 - 如果\Answered
有两种不同的情况下两层含义词法分析器不会发出正确的令牌。作为一个人为的例子(这种情况不会发生,因为电子邮件地址用引号引起来),词法分析器如何处理像\ [email protected]这样的电子邮件地址?还是正式的语法旨在永远不会出现这种模糊性?