F(Lex)警告,规则无法匹配

时间:2016-11-21 22:25:27

标签: flex-lexer

    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行不会阻止它们匹配。

1 个答案:

答案 0 :(得分:0)

您将启动条件声明为包含%s):正如manual所示,&#34;如果启动条件包含在内,则规则无法启动条件也将是活跃的。&#34;

因此第43行的.将处于有效状态,阻止;匹配。

将后备规则移动到规则的末尾将解决问题,即使您有启动条件,它通常也是最好的样式。