2009-07-15 69 views
5

我对分析器生成器使用了Flex和Bison,但在扫描器中遇到启动状态问题。Lex/Flex中的启动状态

我使用独家规则来处理评论,不过此语法似乎并不匹配引用标记:行

%x COMMENT 

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

"=="     { return EQUALEQUAL; } 

.      ; 

在这个简单的例子:

// a == b 

ISN” t完全匹配作为评论,除非我包括这条规则:

<COMMENT>"=="    ; 

我该如何绕过这条路不得不将所有这些标记添加到我的专有规则中?在莱克斯/ Flex或者任何

回答

9

匹配C风格的注释是有据可查的:

in the documentation,以及在互联网的各种变化。

这里是Flex文档中发现上的变化:

<INITIAL>{ 
    "//"    BEGIN(IN_COMMENT); 
    } 
    <IN_COMMENT>{ 
    \n  BEGIN(INITIAL); 
    [^\n]+ // eat comment 
    "/"  // eat the lone/
    } 
+0

我宁愿不必使用包容性状态,如果可以避免的话,因为我有很多规则。问题是这个'吃评论'规则似乎不符合具有多个字符(例如==)的令牌。 – Dan 2009-07-15 11:16:55

+0

然后我想你可能会做错事。您需要为注释创建一个“子语法分析器”,这与您的正常标记不匹配。 – 2009-07-15 11:26:57

2

尝试增加一个 “+” 的[^ n]的规则之后。我不知道为什么排他性国家即使在独占状态下仍然在'==',但显然是这样。 Flex通常会匹配大多数文本匹配的规则,添加“+”至少会使两条规则长度相等。将评论规则放在第一位会导致它在平局的情况下使用。

0

的线索是:

问题是这样的“吃评论” 规则似乎并不匹配令牌与 多个字符

所以加一个*匹配零或更多的非换行符。你想零,否则一个空的评论将不匹配。

%x COMMENT 

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

"=="     { return EQUALEQUAL; } 

.      ;