Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bison Flex 2.5.35 yy_扫描_缓冲区未初始化行号和列号_Bison_Flex Lexer - Fatal编程技术网

Bison Flex 2.5.35 yy_扫描_缓冲区未初始化行号和列号

Bison Flex 2.5.35 yy_扫描_缓冲区未初始化行号和列号,bison,flex-lexer,Bison,Flex Lexer,我正在使用Flex2.5.35和bison 2.7(虽然我认为这是flex的问题,所以我省略了parser.y) 我的Flex语法非常简单: 莱克瑟 %{ #define YY_NO_INPUT #include "parser.h" #define YY_USER_ACTION yylloc->first_line = yylloc->last_line = yylineno; \ yylloc->first_column = yycolumn; yylloc-&g

我正在使用Flex2.5.35和bison 2.7(虽然我认为这是flex的问题,所以我省略了parser.y)

我的Flex语法非常简单:

莱克瑟

%{
#define YY_NO_INPUT
#include "parser.h"

#define YY_USER_ACTION yylloc->first_line = yylloc->last_line = yylineno; \
    yylloc->first_column = yycolumn; yylloc->last_column = yycolumn + (int)yyleng - 1; \
    yycolumn += (int)yyleng;

%}

%option yylineno
%option outfile="lexer.c" header-file="lexer.h"
%option warn
%option reentrant noyywrap never-interactive nounistd
%option nounput
%option bison-bridge
%option bison-locations

%%

[ \n\r\t]*               { /* Skip blanks. */ }
[A-Za-z0-9_\-@]+       { yylval->value = strdup(yytext); return TOKEN_VAR; }
"&&"                   { return TOKEN_AND; }
"||"                   { return TOKEN_OR; }
"!"                    { return TOKEN_NOT; }
"("                    { return TOKEN_LPAREN; }
")"                    { return TOKEN_RPAREN; }

%%
扫描字符串时,行号和列号的值未初始化。我对代码进行了跟踪,并在生成的lexer.c中的yy_scan_缓冲区中添加了以下行:

b->yy_bs_lineno = 1;
b->yy_bs_column = 1;
现在,值与预期值相同

这是虫子吗
yy_create_buffer
正确初始化这些字段,但
yy_scan_buffer
不正确

解析字符串时不能使用
%option yylineno


是否有解决办法,或者我真的需要修改生成的lexer.c?

您可能是从


我相信您忘记添加
intyycolumn=1在定义YY_用户_操作之前,正如链接中的代码示例中所做的那样。

是的,我可以确认,这是bison的问题。这发生在我身上,我通过在“编译器函数”中初始化它们来修复它

void myParseFunction(const char*code,…){
yyscan_t myscanner;
yylex_init(&myscanner);
结构yyguts_t*yyg=(结构yyguts_t*)myscanner;
yy_删除_缓冲区(yy_当前_缓冲区,myscanner);
yy_扫描_字符串(代码,myscanner);
//[HACK]对于非文件解析器,这些未正确初始化
//正因为如此,我们在错误中得到了垃圾。。。
yylineno=1;
yy列=0;
bool-nasi=yyparse(myscanner,);
yylex_destroy(myscanner);
鼻返流;
}

请注意,yylineno和yycolumn在可重入解析器中工作得很好,因为它们被定义为引用“yyg”的marcos。

因此,我在示例中看到了这一点,并将其最初放在了示例中。然而,可能由于配置选项的原因,这将无法编译
yycolumn
不是一个整数,而是一个宏,在这一点上它是不可赋值的。当它在另一个文件中时(未定义
yylineno
时),这不能正常工作,我的工作对象是
yyset_lineno(1,扫描仪);yyset_列(0,扫描仪)在调用
yy\u扫描字节后立即执行。
void myParseFunction(const char* code, ...){
    yyscan_t myscanner;
    yylex_init(&myscanner);
    struct yyguts_t * yyg = (struct yyguts_t*)myscanner;

    yy_delete_buffer(YY_CURRENT_BUFFER,myscanner);
    yy_scan_string(code, myscanner);

    // [HACK] Those are not properly initialized for non file parsers
    // and becuase of that we get garbage in yyerror...
    yylineno = 1;
    yycolumn = 0;

    bool nasi = yyparse(myscanner, <your_args>);
        yylex_destroy(myscanner);
        return nasi;
}