加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读