gab*_*aca 7 yacc lex bison flex-lexer
我正在构建一个词法和语法分析器.当我尝试将flex与我的.l文件一起使用时,我收到以下警告.
littleDuck.l:26: warning, rule cannot be matched
Run Code Online (Sandbox Code Playgroud)
规则26是以{cteI}开头的规则,我的规则部分如下:
[ \t\n] ;
{RW} {return RESERVED;}
{id} {return ID;}
{ops} {return OPERATOR;}
{seps} {return SEPARATOR;}
{cteI} {yylval.ival = atoi(yytext); return INT;}
{cteF} {yylval.fval = atof(yytext); return FLOAT;}
{ctestring} {yylval.sval = strdup(yytext); return STRING;}
. ;
Run Code Online (Sandbox Code Playgroud)
另外,我的定义部分是这样的:
RW program|var|int|float|print|else|if
id ([a-z]|[A-Z)([a-z]|[A-Z]|[0-9])*
ops "="|"<"|">"|"<>"|"+"|"-"|"/"|"*"
seps ":"|","|";"|"{"|"}"|"("|")"
cteI [0-9]+
cteF {cteI}(\.{cteI}((e|E)("+"|"-")?{cteI})?)?
ctestring (\".*\")
Run Code Online (Sandbox Code Playgroud)
为什么会出现此警告,如何修改我的文件以使其不显示?
Chr*_*odd 10
警告告诉您,任何可能匹配的内容{cteI}将始终与某些早期规则匹配.在您的情况下,它表示规则与您的预期不符,可能是由于拼写错误.在您的情况下,它的{id}规则,您定义为:
([a-z]|[A-Z)([a-z]|[A-Z]|[0-9])*
Run Code Online (Sandbox Code Playgroud)
注意括号和方括号的嵌套.为了清晰起见,增加空间,这是
( [a-z] | [A-Z)([a-z] | [A-Z] | [0-9] )*
Run Code Online (Sandbox Code Playgroud)
这将匹配任何字母,数字或字符( )或序列[.你可能意味着:
([a-z]|[A-Z])([a-z]|[A-Z]|[0-9])*
Run Code Online (Sandbox Code Playgroud)
可以更清楚地写成
[a-zA-Z][a-zA-Z0-9]*
Run Code Online (Sandbox Code Playgroud)