6

我正在使用 Flex 和 Bison 作为解析器生成器,但是我的扫描仪中的启动状态存在问题。

我正在使用排他规则来处理评论,但这个语法似乎与引用的标记不匹配:

%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

.                     ;

在这个简单的例子中,这一行:

// a == b

不完全匹配作为评论,除非我包含此规则:

<COMMENT>"=="             ;

我如何绕过这个而不必将所有这些令牌添加到我的独家规则中?

4

3 回答 3

9

在 Lex/Flex 或任何有据可查的内容中​​匹配 C 风格的注释:

在文档中,以及 Internet 上的各种变体。

这是 Flex 文档中的一个变体:

   <INITIAL>{
     "//"              BEGIN(IN_COMMENT);
     }
     <IN_COMMENT>{
     \n      BEGIN(INITIAL);
     [^\n]+    // eat comment
     "/"       // eat the lone /
     }
于 2009-07-15T10:31:47.487 回答
2

尝试在 [^n] 规则后添加“+”。我不知道为什么即使在独占状态下独占状态仍会出现“==”,但显然是这样。Flex 通常会匹配匹配最多文本的规则,添加“+”至少会使两个规则的长度相同。将 COMMENT 规则放在首位将导致它在出现平局时使用。

于 2009-07-19T06:46:27.087 回答
0

线索是:

问题是这个“吃评论”规则似乎不匹配具有多个字符的标记

所以添加一个 * 来匹配零个或多个非换行符。您想要零,否则空注释将不匹配。

%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]*        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

.                     ;
于 2009-07-20T01:25:39.930 回答