Lex / Flex 中的启动状态
我使用 Flex 和 Bison 作为解析器生成器,但扫描仪中的启动状态出现问题。
我正在使用独占规则来处理注释,但此语法似乎与引用的标记不匹配:
%x COMMENT
// { BEGIN(COMMENT); }
<COMMENT>[^\n] ;
<COMMENT>\n { BEGIN(INITIAL); }
"==" { return EQUALEQUAL; }
. ;
在这个简单的示例中,该行:
// a == b
作为注释并不完全匹配,除非我包含此规则:
<COMMENT>"==" ;
How do I get round无需将所有这些令牌添加到我的专有规则中?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在 Lex/Flex 或任何有据可查的内容中匹配 C 风格注释:
,以及互联网上的各种变体。
以下是 Flex 文档中的变体:
Matching C-style comments in Lex/Flex or whatever is well documented:
in the documentation, as well as various variations around the Internet.
Here is a variation on that found in the Flex documentation:
尝试在 [^n] 规则后添加“+”。 我不知道为什么即使在独占状态下,独占状态仍然会出现“==”,但显然确实如此。 Flex 通常会匹配与最多文本匹配的规则,并且添加“+”至少会使两个规则的长度相等。 将 COMMENT 规则放在前面将导致在出现平局时使用它。
Try adding a "+" after the [^n] rule. I don't know why the exclusive state is still picking up '==' even in an exclusive state, but apparently it is. Flex will normally match the rule that matches the most text, and adding the "+" will at least make the two rules tie in length. Putting the COMMENT rule first will cause it to be used in case of a tie.
线索是:
,因此添加一个 * 来匹配零个或多个非换行符。 您需要零,否则空注释将不匹配。
The clue is:
so add a * to match zero or more non-newlines. You want Zero otherwise a empty comment will not match.