我正在尝试用Flex&Bison编写我的第一个解析器。解析数字时,我试图将其值保存到yylval结构中。问题是,当词法分析器达到数字时,yylval为空,这会导致分段错误。

(相关的困惑点:为什么在大多数Flex示例(例如here)中,yylval是结构,而不是指向结构的指针?我无法在测试中识别yylval。 l没有%option bison-bridge,并且该选项使yylval成为指针。此外,我尝试在test.y的yylval中初始化main,但是yylval = malloc(...)给出了类型不匹配的情况,就像yylval不是指针...?)

测试

%{
    #include <stdio.h>
    #include <stdlib.h>
    #include "svg.tab.h"
%}

%option bison-bridge
%option noyywrap

%%

[0-9]+  { yylval->real = atof(yytext); return REAL; }

. { return *yytext; }

%%


测试:

%{
    #include <stdio.h>
    void yyerror(char *);
%}

%union {
    double real;
}

%token <real> REAL

%%
...


生成命令:

bison -d test.y && flex test.l && gcc lex.yy.c test.tab.c

最佳答案

通常,yylval是全局结构而不是指针,并且,如果从test.l文件中删除%option bison-bridge,这就是您得到的(您还需要将yylval->real更改为yylval.real让它起作用)。

flex中的%option bison-bridge旨在与野牛中的%define api.pure匹配,后者使用不同的API在yyparse和yylex之间进行通信(yylval成为yylex的指针参数,而不是全局变量)。

因此,您的基本问题是flex和bison之间的API不兼容-您需要在BOTH或NEITHER中同时指定纯api / bison-bridge-如果在其中一个而不是另一个中进行操作,则会导致问题。

09-08 00:07