bison – Flex 2.5.35 yy_scan_buffer没有初始化行号和列号
发布时间:2020-12-15 01:45:41 所属栏目:百科 来源:网络整理
导读:我正在使用flex 2.5.35和bison 2.7(虽然这是一个flex问题,我相信,所以我省略了parser.y) 我的Flex语法非常简单: lexer.l %{#define YY_NO_INPUT#include "parser.h"#define YY_USER_ACTION yylloc-first_line = yylloc-last_line = yylineno; yylloc-firs
我正在使用flex 2.5.35和bison 2.7(虽然这是一个flex问题,我相信,所以我省略了parser.y)
我的Flex语法非常简单: lexer.l %{ #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 %% [ nrt]* { /* 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没有. 在解析字符串时,我不能使用%选项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; } 请注意,yyl??ineno和yycolumn对于重入解析器工作得很好,因为它们被定义为引用“yyg”的marcos. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |