Bison Flex 2.5.35 yy_扫描_缓冲区未初始化行号和列号
我正在使用Flex2.5.35和bison 2.7(虽然我认为这是flex的问题,所以我省略了parser.y) 我的Flex语法非常简单: 莱克瑟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
%{
#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;
}