2016-11-21 4 views
-1
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);} 

を一致させることができない。これは私のコードであり、私はこの警告得続ける:F(レックス)WARNING、ルールが

hello.lex:45:警告を、ルールが
hello.lexを一致させることができません:48:警告、ルールは一致しません

なぜ誰が知っていますか?これらは州にあり、43行目では一致することができないためです。

答えて

0

あなたは包括%s)として、あなたの開始条件を宣言する:manualは、示すとおり「開始条件が包括的である場合には、全く開始条件とルールもアクティブになります。」

したがって、43行目の.がアクティブになり、;が一致しないようになります。

ルールの末尾にフォールバックルールを移動すると問題が解決され、開始条件があっても一般的には最適なスタイルになります。