0

使用解析器生成器我想为电子邮件消息中的“发件人”创建一个解析器。以下是 From 标头的示例:

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

我认为为此实现解析器将很简单。

然而,“From header”语法有一个复杂的地方:注释可以插入到几乎任何地方。例如,可以在 "john" 中插入注释:

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

并且可以在许多其他地方插入评论。

如何处理这种并发症?它是否需要“2-pass”解析器:第一次删除所有注释,第二次为 From 标头创建解析树?现代解析器生成器是否支持输入的多次传递?可以一次性解析吗?如果是的话,你会画出这个方法吗?

4

1 回答 1

2

我不相信您对电子邮件地址的解释是正确的;我对 RFC-822 的阅读使我相信注释只能出现在“单词”之前或之后,并且 addr-spec 的本地部分中的“单词”需要用点分隔(“。” )。3.1.4 节给出了一个很好的关于如何解析的提示:你需要一个词法分析器,它将句法符号输入解析器;词法分析器应该展开标题、忽略空格并识别注释、引用的字符串、原子和特殊字符。

当然,RFC-822 早就过时了,我认为带有嵌入评论的电子邮件标题是不合时宜的。

尽管如此,您似乎可以使用 flex 和 bison 轻松实现您希望的分析。如前所述,flex 将识别评论。严格来说,你不能用正则表达式来识别评论,因为评论是嵌套的。但是您可以使用开始条件堆栈来识别简单的嵌套结构,或者通过维护一个计数器更经济(因为 flex 在找到最外层括号之前不会返回,因此计数器不需要是全局的。)

于 2013-06-07T21:25:29.037 回答