解析意外字符时,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
时,应报告错误,因为#
是意外字符。但是没有报道错误。我应该如何修改代码,以便报告错误?
答案 0 :(得分:0)
(Comments converted to a SO style Q&A format)
@JonathanLeffler写道:
这就是为什么在词法分析器(通常是LHS是。)中需要一个默认规则来安排报告错误的原因。没有它,默认操作只是回显不匹配的角色,然后继续下一个角色。
至少,您希望在错误消息中包含导致问题的特定字符。您可能希望将其作为单字符标记返回,这通常会在语法中触发错误。所以:
<*>. { cout << "Error: unexpected character " << yytext << endl; return *yytext; }
可能合适。