使用相同的输入文件多次调用 yyparse()

标签 c bison yacc lex flex-lexer

我使用同一个输入文件多次调用yyparse()。我必须从文件开头开始解析到某个点,然后跳转到同一文件中的其他位置(解析那里的一些行),然后返回到原始位置并从那里再次开始解析。这我已经做过很多次了。每次在调用 yyparse() 之前,我都会重新打开同一个输入文件,然后指向我必须开始解析的位置。

我无法返回到原来的位置。我可以跳到其他位置,但从那里返回到原始位置是有问题的。我的解析器在返回时将前往其他位置,从那里解析几行,然后到达原始位置。我怎样才能避免这些额外的行解析?我在新调用 yyparse();

之前使用 yyrestart();

最佳答案

您可以在词法分析器中完成这一切,而不是每次需要更改位置时重新启动解析。

当您需要解析文件中的另一个位置时,将当前词法分析器状态插入堆栈,并将新的词法分析器统计设置到您想要的位置。完成后,只需将状态从堆栈中弹出以使其成为当前状态,然后继续解析,就好像什么也没发生一样。

一个可能更好的解决方案可能是直接解析源文件,构建 AST,然后您可以轻松地进行语义处理和/或评估您喜欢的部分。它将使词法分析器和解析器变得更加简单。

关于使用相同的输入文件多次调用 yyparse(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13283462/

相关文章:

c - 使用 Flex(lex) 和 Bison(yacc) 进行错误处理

c++ - 使用 Flex/Bison 进行语法分析第 2 部分

c - 当乘以 13 位数字时,表达式中的整数溢出

python - 在 C 中嵌入 Python : Error in linking - undefined reference to PyString_AsString

c - Bison 优先级没用?它不起作用

bison - if elsif else 语句解析

c - double 和整数的求和和乘法不起作用

c - 从函数返回指向结构的指针

visual-studio - Visual Studio 中的 yacc 和 Bison

grammar - 通过产生式规则向 LALR(1) 语法添加错误检查以处理所有输入