解析意外字符时,Lex和Yacc不报告错误。

时间:2013-08-18 22:11:57

标签: yacc lex

解析意外字符时,Lex和Yacc未报告错误。在下面的代码中,解析#set label sample时没有错误,但#无效。

Lex部分代码

identifier [\._a-zA-Z0-9\/]+ 

<INITIAL>{s}{e}{t} {
    return SET;
}

<INITIAL>{l}{a}{b}{e}{l} {
    return LABEL;
}

<INITIAL>{i}{d}{e}{n}{t}{i}{f}{i}{e}{r} {
    strncpy(yylval.str, yytext,1023);
    yylval.str[1023] = '\0';
    return IDENTIFIER;


}

Yacc部分代码。

definition : SET LABEL IDENTIFIER
{
    cout<<"set label "<<$3<<endl;
};

解析#set sample label时,应报告错误,因为#是意外字符。但是没有报道错误。我应该如何修改代码,以便报告错误?

1 个答案:

答案 0 :(得分:0)

Comments converted to a SO style Q&A format

@JonathanLeffler写道:

  

这就是为什么在词法分析器(通常是LHS是。)中需要一个默认规则来安排报告错误的原因。没有它,默认操作只是回显不匹配的角色,然后继续下一个角色。

     

至少,您希望在错误消息中包含导致问题的特定字符。您可能希望将其作为单字符标记返回,这通常会在语法中触发错误。所以:

<*>. { cout << "Error: unexpected character " << yytext << endl; return *yytext; } 
     

可能合适。