在lex和yacc中切换输入流

时间:2012-01-30 15:10:34

标签: yacc lex

我坚持使用lex而不是flex。

正在开发lex中的API,就像flex util中存在的那样(yy_switch_buffer,yy_create_buffer ...),可以在多个缓冲区之间切换。

直到现在,这是我的主要困难:

  • 例如,当我遇到#include令牌时,我应该将缓冲区切换到包含的文件。所以首先我应该中断当前的解析操作(我试过fclose(yyin) FAILED)解析器完成整个当前的yyin。不好,因为我应该解析包含的文件来存储主文件中使用的结构(例如)。

问题是:如何立即中断解析器?我是否足以使用yyin = fopen(somefile, "r"); ??

定义新的缓冲区

4 个答案:

答案 0 :(得分:1)

如果可行的话,处理它会很困难。 AFAIK,Lex只允许您在调用yywrap()时在EOF(真实或模拟)上切换输入流。

也许你可以伪造东西,这样当你找到'include'指令时,你在当前流上伪造一个EOF然后让yywrap()修复一些东西,以便新输入来自包含的文件,然后当您在包含的文件上达到EOF时,您在原始位置从原始输入流恢复输入yywrap()。显然,这适用于嵌套包含(如果它可以工作),除非你任意限制包含的级别数。

答案 1 :(得分:1)

使用POSIX lex没有可移植的方法 - 不同的实现有不同的内部安排,它们如何处理和缓冲输入,并且在lexing期间,可能已经读取了当前处理令牌并缓冲了一堆输入。所以你需要得到它来保存它当前缓冲的内容并切换到不同的输入,然后在你完成#include或其他之后恢复缓冲的东西(这将在下面读取)。这正是flex的缓冲区管理调用的目的,但是如果你坚持使用lex,你需要(有效地)移植这些例程来理解你需要支持的任何lex版本的内部。

答案 2 :(得分:1)

“包含的输入文件”的解决方案是flex文档的一部分,它提供了如何在flex输入ftp://ftp.gnu.org/old-gnu/Manuals/flex-2.5.4/html_mono/flex.html#SEC12(“多输入缓冲区”)之间切换的示例

答案 3 :(得分:0)

您可以在http://sourceforge.net/projects/winflexbison/

找到移植到Windows系统的灵活工具