在莱克斯/ Flex的启动状态
-
16-09-2019 - |
题
我使用Flex和野牛的解析器生成,但有我在扫描仪开始状态的问题。
我使用独家规则来处理评论,不过此语法似乎并不匹配引用标记:
%x COMMENT
// { BEGIN(COMMENT); }
<COMMENT>[^\n] ;
<COMMENT>\n { BEGIN(INITIAL); }
"==" { return EQUALEQUAL; }
. ;
在这个简单的例子的行:
// a == b
不完全匹配作为注释,除非我包括这样的规则:
<COMMENT>"==" ;
我如何得到这一轮,而不必所有这些标记添加到我的专属规则?
解决方案
匹配在莱克斯/ Flex的C语言风格的评论或任何是有据可查的:
在文档 ,以及在互联网的各种变化。
下面是Flex文档中找到上的变化:
<INITIAL>{
"//" BEGIN(IN_COMMENT);
}
<IN_COMMENT>{
\n BEGIN(INITIAL);
[^\n]+ // eat comment
"/" // eat the lone /
}
其他提示
尝试添加 “+” 之后的[^ n]的规则。我不知道为什么独占状态仍然即使在独占状态捡“==”,但显然它。 Flex的通常会匹配最文本相匹配的规则,并增加了“+”,将至少使两个规则配合长度。把COMMENT规则首先将使其在领带的情况下使用。
在线索是:
问题是这样的“吃评论” 规则似乎并不匹配令牌 多于一个字符
所以添加*匹配零个或多个非换行。你想零否则空注释将不匹配。
%x COMMENT
// { BEGIN(COMMENT); }
<COMMENT>[^\n]* ;
<COMMENT>\n { BEGIN(INITIAL); }
"==" { return EQUALEQUAL; }
. ;
不隶属于 StackOverflow