gpt4 book ai didi

bison - Flex 2.5.35 yy_scan_buffer 未初始化行号和列号

转载 作者:行者123 更新时间:2023-12-04 21:57:33 26 4
gpt4 key购买 nike

我正在使用 flex 2.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_buffer 中:
b->yy_bs_lineno = 1;
b->yy_bs_column = 1;

现在这些值符合预期。

这是一个错误吗? yy_create_buffer正确初始化这些字段,但 yy_scan_buffer没有。

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

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

最佳答案

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

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;
}

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

关于bison - Flex 2.5.35 yy_scan_buffer 未初始化行号和列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14747410/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com