我发现我可以在语法规则中使用' error‘作为一种错误恢复机制。因此,如果出现错误,解析器必须丢弃当前行,并从下一行继续解析。野牛手册中实现这一点的示例可能是这样的:
stmts:
exp
|stmts exp
| error '\n'但是我不能使用它;因为我必须让flex在我的scannar中忽略'\n‘,这样一个表达式就不会被限制在一行中表达。如何才能使解析器-when遇到错误-继续解析到下一行,假设没有特殊字符(即分号)来指示表达式结束,也没有“换行符”标记?
谢谢..
发布于 2012-10-27 12:07:42
由于您已经删除了示例中使用的标记,因此您必须使用特技才能获得相同的效果。
我认为你可以使用这个:
stmts:
exp
| stmts exp
| error { eat_to_newline(); }其中,eat_to_newline()是扫描器(源文件)中的一个函数,它安排丢弃所有保存的标记并读取到下一个换行符。
extern void eat_to_newline(void);
void eat_to_newline(void)
{
int c;
while ((c = getchar()) != EOF && c != '\n')
;
}它可能需要比这更复杂一点,但不会比这复杂得多。在调用eat_to_newline()之后,您可能需要使用yyerrok; (注释提醒我,还需要使用yyclearin; )。
https://stackoverflow.com/questions/13096879
复制相似问题