我正在使用flex和bison编写自己的脚本语言。我有一个语法,我能够生成一个解析器,使用正确的脚本工作正常。我希望能够为特殊错误情况添加一些有意义的错误消息。例如,我希望能够识别一个语句块或一个缺少分号的不匹配的括号,依此类推。 假设我有这些语句(这里的语法不完整):
...
statements: statement SEMICOLON statements
| statement SEMICOLON;
statement: ifStatement
| whileStatement
;
ifStatement: IF expression THEN statements END
| IF expression THEN statements ELSE statements END
;
whileStatement: DO statements WHILE expression END
;
...
我希望能够打印诸如“Missing semicolon”或“Missing then then keyword”等消息。我应该修改我的语法以启用错误处理吗?或者是否有一些Bison功能可以做到这一点?
答案 0 :(得分:3)
Bison不是生成自定义错误消息的正确工具,但如果您启用%error-verbose
,其标准错误消息也不会太糟糕。请查看文档:{{3}}。
如果您确实想提供自定义错误消息,请阅读有关YYERROR的文档,并为要捕获的模式生成规则,并自行引发错误。例如,此处除以0被视为语法错误(这是可疑的,但提供了自定义语法错误消息的示例)。
exp:
NUM { $$ = $1; }
| exp '+' exp { $$ = $1 + $3; }
| exp '-' exp { $$ = $1 - $3; }
| exp '*' exp { $$ = $1 * $3; }
| exp '/' exp
{
if ($3)
$$ = $1 / $3;
else
{
$$ = 1;
fprintf (stderr, "%d.%d-%d.%d: division by zero",
@3.first_line, @3.first_column,
@3.last_line, @3.last_column);
}
}
另请注意,为令牌提供字符串会产生更好的错误消息:
%token NUM
会生成unexpected NUM
,而
%token NUM "number"
会生成unexpected number
。