1

解析意外字符时,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应该会报错,因为#是意外字符。但是没有报错。我应该如何修改代码以便报告错误?

4

1 回答 1

1

评论转换为 SO 风格的问答格式

@JonathanLeffler 写道:

这就是为什么您需要在词法分析器中使用默认规则(通常 LHS 是 .)来安排报告错误。没有它,默认操作只是回显不匹配的字符并继续下一个字符。

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

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

可能是合适的。

于 2015-02-12T20:24:00.083 回答