Flex / Flex ++语法错误 - “无法识别的规则”

时间:2014-03-09 18:31:42

标签: bison lex flex-lexer bisonc++

我正在使用Flex ++编写语法来生成解析器,这段代码总是返回“无法识别的规则”错误。

%{
#include "Parserbase.h"
%}

%option noyywrap

num         [0-9]+
float       [0-9]+"."[0-9]+
comment     [["//"[.]*\n] | ["/\*"[.]*"\*/"]]
varname     [a-zA-Z][a-zA-Z0-9_]*

%%


";"             {return ParserBase::SEMICOLON;}
"\n"            {return ParserBase::ENDLINE;}

"int"           {return ParserBase::INT;}
"="             {return ParserBase::EQUALS;}
{num}           {return ParserBase::NUM;}
{comment}       {return ParserBase::COMMENT;}
{varname}       {return ParserBase::VARNAME;}

这总是返回以下内容:

bisonc++ Compiler.y
[Warning] Terminal symbol(s) not used in productions:
257: NUM
261: ENDLINE
g++ -c parse.cc
flex++ Compiler.l
Compiler.l:21: unrecognised rule
make: *** [lex.yy.cc] Error 1

我尝试过移动规则,将别名更改为简单     [A-ZA-Z] 甚至只是     [A-Z] 一切都无济于事,这让我发疯了...任何想法? 谢谢!

1 个答案:

答案 0 :(得分:3)

此定义无效:

comment     [["//"[.]*\n] | ["/\*"[.]*"\*/"]]

[(不同。 [...]是一个角色类;也就是说,一个匹配单个字符的可能字符列表。 (...)用于对正则表达式进行分组。

另外,我不相信你可以在Flex ++正则表达式中插入任意空格字符。

所以我认为你的意图是:

comment     ("//".*\n|"/*".*"*/")

这里我删除了不正确的方括号,将用于分组的方括号更改为括号,并删除了替代方案之间不必要的分组,因为|的优先级低于连接。我还删除了不必要的反斜杠转义符,因为引用足以使*成为一个字符。

但是,这将无法正确匹配C ++注释:

首先,.*是贪婪的(即,它会匹配最长的字符串)所以

/* A comment */ a = 3; /* Another comment */

将被错误地识别为单个评论。

其次,.与换行符不匹配。因此,多行/* ... */条评论不会匹配,因为.*不会到达评论的末尾,只会到达该行的末尾。