Parsing 这是否需要在令牌中嵌入两次解析:注释?

Parsing 这是否需要在令牌中嵌入两次解析:注释?,parsing,antlr,context-free-grammar,parser-generator,parse-tree,Parsing,Antlr,Context Free Grammar,Parser Generator,Parse Tree,使用解析器生成器,我想为电子邮件消息中的“From headers”创建一个解析器。以下是From标头的示例: From: "John Doe" <john@doe.org> 来自:“约翰·多伊” 我认为实现一个解析器是很简单的 然而,“fromheader”语法有一个复杂之处:注释可以插入任何地方。例如,可以在“john”中插入注释: 来自:“约翰·多伊” 评论可能会插入许多其他地方 如何处理这种并发症?它是否需要一个“2-pass”解析器:一个pass用于删除所有注释,另一

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

From: "John Doe" <john@doe.org>
来自:“约翰·多伊” 我认为实现一个解析器是很简单的

然而,“fromheader”语法有一个复杂之处:注释可以插入任何地方。例如,可以在“john”中插入注释:

来自:“约翰·多伊” 评论可能会插入许多其他地方


如何处理这种并发症?它是否需要一个“2-pass”解析器:一个pass用于删除所有注释,另一个pass用于为From头创建解析树?现代解析器生成器是否支持对输入进行多次传递?它能在一次传递中被解析吗?如果是的话,请你描述一下方法好吗?

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

当然,RFC-822早就被淘汰了,我认为带有嵌入注释的电子邮件标题是不合时宜的

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

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