使用解析器生成器,我想为电子邮件消息中的"From headers"创建一个解析器。下面是一个From头的例子:
From: "John Doe" <john@doe.org>
我认为为它实现一个解析器是很简单的。
然而,在"From header"语法中有一个复杂的问题:注释可以插入到几乎任何地方。例如,注释可以插入到"john"中:
From: "John Doe" <jo(this is a comment)hn@doe.org>
注释可以在其他地方插入。
如何处理这种并发症?它是否需要一个"2-pass"解析器:一次传递删除所有注释,第二次传递为From头创建解析树?现代解析器生成器支持对输入进行多次传递吗?它能在一次传递中被解析吗?如果是,请描述一下方法。
我不相信你对电子邮件地址的解释是正确的;我对RFC-822的阅读使我相信注释只能出现在"word"之前或之后,并且在addr-spec的local部分中的"word"需要用点("。")分隔。第3.1.4节给出了一个关于如何解析的很好的提示:你需要一个词法分析器,它将语法符号输入解析器;词法分析器应该展开头,忽略空白,并识别注释、引号字符串、原子和特殊字符。
当然,RFC-822早就过时了,我认为带有嵌入式注释的邮件头是不合时宜的。
尽管如此,使用flex和bison似乎可以轻松实现您想要的分析。如前所述,flex将识别注释。严格地说,不能用正则表达式识别注释,因为注释嵌套。但是您可以使用开始条件堆栈来识别简单的嵌套结构,或者通过维护计数器(因为flex在找到最外层的括号之前不会返回,计数器不需要是全局的)来更经济地识别。