【发布时间】:2010-04-13 23:30:48
【问题描述】:
词法分析器如何解决这种歧义?
/*/*/
为什么它不只是说,哦,是的,那是多行注释的开头,然后是另一个多行注释。
贪婪的词法分析器不会只返回以下标记吗?
- /*
- /*
- /
我正在为 CSS 编写一个 shift-reduce 解析器,但是这个简单的注释事情妨碍了我。如果您不想了解更多背景信息,可以阅读this question。
更新
很抱歉一开始就忽略了这一点。我计划以/* @ func ( args, ... ) */ 的形式向 CSS 语言添加扩展,但我不想混淆理解 CSS 但不理解我的扩展注释的编辑器。这就是为什么词法分析器不能忽略 cmets。
【问题讨论】:
-
正如您在“this question”回复中所指出的,词法分析器应进入“评论中”状态并丢弃输入,直到它看到将其移出该状态的词素。解析器永远不会看到 cmets,词法分析器不应该看到 cmets 的内容,除非确定它们何时结束。
-
@msw:当然,让解析器永远不会看到 cmets 并不是一个硬性规定。您可以通过将 cmets 视为标记并将它们提供给解析器来做一些非常酷的事情 - 只需查看 Python 文档字符串。
-
确实,我专门指的是 C 风格的 cmets 及其与语法的词汇关系。我本可以更清楚地指出 OP 的评论,即他不应该混淆词汇和句法解释。还同意 Python 文档字符串很有用(和 javadoc 等)。我没有看过 Python 语法,但我打赌有一个
的产生式。 -
问题是我真的想将 cmets 提供给解析器。
标签: lexer