3

我发现我可以在语法规则中使用“错误”作为错误恢复的机制。因此,如果出现错误,解析器必须丢弃当前行并从下一行恢复解析。野牛手册中实现此目的的示例可能是这样的:

stmts:
      exp
      |stmts exp
      | error '\n'

但我不能使用它;因为我必须让 flex 在我的扫描仪中忽略 '\n',因此表达式不限于在一行中表达。鉴于没有特殊字符(即分号)来指示表达式结束并且没有“换行符”标记,我如何使解析器在遇到错误时继续解析到下一行?

谢谢..

4

1 回答 1

7

由于您已经消除了示例中使用的标记,因此您将不得不使用特技来获得相同的效果。

我认为你可以使用这个:

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()

于 2012-10-27T04:07:41.803 回答