0

我正在使用 flex & bison 来解析自定义语言,我处于此处描述的情况:http ://www.gnu.org/software/bison/manual/html_node/How-Can-I-Reset-the-解析器.html。更准确地说

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

我的解析器和扫描器在一个单独的线程中运行,但只有一个线程在处理输入文件。据我了解,我不需要编写可重入扫描器,因为只有一个线程在处理输入文件。在那一页中,问题得到了清楚的解释,但我并不清楚解决方案。它说:

因此,无论何时更改 yyin,都必须告诉 Lex 生成的扫描器丢弃其当前缓冲区并切换到新的缓冲区。这取决于您对 Lex 的实施;有关更多信息,请参阅其文档。对于 Flex,每次更改 yyin 后调用 'YY_FLUSH_BUFFER' 就足够了。如果您的 Flex 生成的扫描器需要从多个输入流中读取以处理包含文件等功能,您可以考虑使用诸如 'yy_switch_to_buffer' 之类的 Flex 函数来操作多个输入缓冲区

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

4

1 回答 1

2

我通过以下方式解决了这个问题:

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

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

于 2013-07-12T15:00:41.207 回答