错误后Flex输入缓冲区复位

时间:2013-07-12 14:18:06

标签: buffer bison flex-lexer

我正在使用flex&野牛解析自定义语言,我遇到了这里描述的情况:http://www.gnu.org/software/bison/manual/html_node/How-Can-I-Reset-the-Parser.html。 更准确地说

  

我多次调用yyparse,并且在正确输入时它可以工作   正确;但是当找到解析错误时,所有其他调用都会失败   太。如何重置yyparse的错误标志?

我的解析器和扫描程序在一个单独的线程内运行,但只有一个线程使用输入文件。根据我的理解,我不需要编写可重入的扫描程序,因为只有一个线程使用输入文件。在该页面中,问题已得到明确解释,但解决方案对我来说并不清楚。 它说:

  

因此,每当你改变yyin时,你必须告诉Lex生成的   扫描仪丢弃其当前缓冲区并切换到新缓冲区。这个   取决于你对Lex的实施;请参阅其文档   更多。对于Flex,只需在每个之后调用'YY_FLUSH_BUFFER'即可   换到yyin。如果您的Flex生成的扫描仪需要读取   您可以使用几个输入流来处理包含文件等功能   考虑使用像'yy_switch_to_buffer'这样的Flex函数   操纵多个输入缓冲区

我的解析器线程调用yyparse以构建我的AST。我不清楚的是,我必须在何时何地调用yy_flush_buffer来解决问题。据我所知,扫描程序代码(由Flex生成)由解析器代码调用(由Bison生成)。 Bison生成的代码由语法生成。因此,解析器代码不在我的直接控制之下。这意味着我不能将对yy_flush_buffer的调用包含在解析器代码中,因为每次我通过语法生成解析器代码时它都会被覆盖。这意味着我应该将yy_flush_buffer放在某个地方的grammr文件中。但在哪里?

1 个答案:

答案 0 :(得分:0)

我通过这样做来解决问题:

...
FILE *f = fopen(_filename, "r");
yyrestart(f);
yyparse();
...

我留下这个问题,因为它可能对其他人有用。