EOL \n
WS(" "|\t|\n)
WSS {WS}*
NEWSS {WSS}+
NAME [a-zA-z_][a-zA-z0-9_-]*
WORD [^;]+
IMPORT {NEWSS}'{NAME}'{WSS};
VAL [a-zA-z0-9]+
CONTENT [^}]+
MIX {NEWSS}{NAME}{WSS}[(]
INCLUDE {WSS}{NAME}{WSS}[{]
%s DOTAIM
%s NAMESTATE
%s NAMER
%s CONTENT
%s VALUE
%s INC
%%
${NAME} {key=yytext;BEGIN(NAMESTATE);}
. {output+=yytext;}
\n {output+=yytext;}
45) <NAMESTATE>; {if(var.find(key)==var.end()){output="Unknown variable";return 1;};output+=(var[key]+yytext);BEGIN(INITIAL);}
<NAMESTATE>{WSS}:{WSS} {BEGIN(DOTAIM);}
<DOTAIM>{WORD}{WSS} {val=trim(yytext); var[key]=val;}
48) <DOTAIM>; {BEGIN(INITIAL);}
这是我的代码,我不断收到此警告:
hello.lex:45:警告,规则无法匹配
hello.lex:48:警告,规则无法匹配
有谁知道为什么?因为它们处于状态,而第43行不会阻止它们匹配。
答案 0 :(得分:0)
您将启动条件声明为包含(%s
):正如manual所示,&#34;如果启动条件包含在内,则规则无法启动条件也将是活跃的。&#34;
因此第43行的.
将处于有效状态,阻止;
匹配。
将后备规则移动到规则的末尾将解决问题,即使您有启动条件,它通常也是最好的样式。