我发现我可以在语法规则中使用“错误”作为错误恢复的机制。因此,如果出现错误,解析器必须丢弃当前行并从下一行恢复解析。野牛手册中实现此目的的示例可能是这样的:
stmts:
exp
|stmts exp
| error '\n'
但我不能使用它;因为我必须让 flex 在我的扫描仪中忽略 '\n',因此表达式不限于在一行中表达。鉴于没有特殊字符(即分号)来指示表达式结束并且没有“换行符”标记,我如何使解析器在遇到错误时继续解析到下一行?
谢谢..
我发现我可以在语法规则中使用“错误”作为错误恢复的机制。因此,如果出现错误,解析器必须丢弃当前行并从下一行恢复解析。野牛手册中实现此目的的示例可能是这样的:
stmts:
exp
|stmts exp
| error '\n'
但我不能使用它;因为我必须让 flex 在我的扫描仪中忽略 '\n',因此表达式不限于在一行中表达。鉴于没有特殊字符(即分号)来指示表达式结束并且没有“换行符”标记,我如何使解析器在遇到错误时继续解析到下一行?
谢谢..
由于您已经消除了示例中使用的标记,因此您将不得不使用特技来获得相同的效果。
我认为你可以使用这个:
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')
;
}
它可能需要比这更复杂一点,但不会比这更复杂。您可能需要在yyerrok;
调用.yyclearin;
eat_to_newline()