我正在使用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我试着改变规则,把化名改成简单的alias,甚至是All都没用,这让我发疯了.有人有什么想法吗?谢谢!
发布于 2014-03-10 04:15:24
这一定义无效:
comment [["//"[.]*\n] | ["/\*"[.]*"\*/"]][和(是不同的。[...]是一个字符类;也就是说,一个可能与单个字符匹配的字符列表。(...)用于对正则表达式进行分组。
而且,我不相信您可以在Flex++正则表达式中插入任意空格字符。
所以我觉得你的意思是:
comment ("//".*\n|"/*".*"*/")在这里,我删除了不正确的方括号,更改了用于将其分组为括号的方括号,并删除了替代方案周围不必要的分组,因为|的优先级低于级联。我还删除了不必要的反斜杠转义,因为引用足以使*变成字符。
但是,这将与C++注释不正确地匹配:
首先,.*是贪婪的(也就是说,它将匹配最长的可能字符串)
/* A comment */ a = 3; /* Another comment */将被错误地识别为单个注释。
其次,.不匹配换行符。因此,多行/* ... */注释将不匹配,因为.*不会到达注释的末尾,只会到达行的末尾。
https://stackoverflow.com/questions/22286292
复制相似问题