在重入解析器中,这些flex函数的原型是什么?

时间:2014-06-03 18:44:10

标签: flex-lexer

我正在转换一个正在运行的flex / bison解析器来重新运行。解析器能够接受include command-file.txt指令,这是在flex这样的东西上实现的:

^include            {   BEGIN INCL;             }
<INCL>{ws}+         {   /* Ignore */            }
<INCL>[^ \t\n\r\f]+ {   /* Swallow everything up to whitespace or an EOL character.
                         * When state returns to initial, the whitepsace
                         * and/or EOL will be taken care of. */
                        yyin = fopen ( yytext, "r" );
                        if (! yyin) {
                            char filename[1024];
                            sprintf(filename,"/home/scripts/%s",yytext);
                            yyin = fopen( filename, "r");
                            if ( ! yyin) {
                                char buf[256];
                                sprintf(buf,"Couldn't open ""%s"".",yytext);
                                yyerror(buf);
                            }
                        }
                        yypush_buffer_state(yy_create_buffer(yyin, YY_BUF_SIZE));
                        BEGIN 0;
                    }
<<EOF>>             {
                        yypop_buffer_state();
                        if (!YY_CURRENT_BUFFER) {
                                yyterminate();
                        }
                    }

这很好用。现在我添加了%option reentrant%option bison-bridge,我收到了以下错误:

lexer.l:119: error: too few arguments to function `yy_create_buffer'
lexer.l:119: error: too few arguments to function `yypush_buffer_state'
lexer.l:123: error: too few arguments to function `yypop_buffer_state'

在重入解析器中调用这些函数/宏的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

flex manual

中(简要)记录了可重入接口

所有接口都有一个类型为yyscan_t的额外参数,该参数位于参数列表的末尾。示例(从flex生成的文件中提取):

YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner );
void yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
void yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
void yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
void yypop_buffer_state (yyscan_t yyscanner );

yylex遵循相同的模式,因此您可以在操作中使用yyscanner来引用提供给yylex的参数