在文件之间重置flex扫描仪的正确方法

时间:2013-03-13 19:32:49

标签: c lex flex-lexer

我正在使用flex扫描仪扫描一堆文件。我目前循环遍历文件并调用yylex()但似乎flex中的状态没有重置。是否应该设置一个函数来调用<EOF>来重置任何变量,BEGIN INITIAL在下次调用yylex()之前是否正确?

在测试时,似乎这会让我进入一个无限循环,因为我最终回到INITIAL,文件中没有更多的匹配,所以它永远不会退出。

1 个答案:

答案 0 :(得分:1)

有一个使用<EOF>匹配来切换flex manual中的缓冲区的示例;它使用以下代码:

<<EOF>> {
             if ( --include_stack_ptr  0 )
                 {
                 yyterminate();
                 }

             else
                 {
                 yy_delete_buffer( YY_CURRENT_BUFFER );
                 yy_switch_to_buffer(
                      include_stack[include_stack_ptr] );
                 }
         }

您可能希望将BEGIN(INITIAL)添加到else分支,因为yy_switch_to_buffer不会重置启动条件。​​