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

  • 本文关键字:函数 是什么 原型 flex-lexer
  • 更新时间 :
  • 英文 :


我正在将工作flex/bison解析器转换为可重入运行。解析器有能力接受include command-file.txt指令,这是在以下方面实现的:

^include            {   BEGIN INCL;             }
<INCL>{ws}+         {   /* Ignore */            }
<INCL>[^ tnrf]+ {   /* 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'

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

可重入接口在flex手册中有文档记录(简要)。

所有接口都有一个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

的参数

最新更新