我使用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; }

.                     ;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top