Bison 为什么yylval是空的?

Bison 为什么yylval是空的?,bison,yacc,lex,flex-lexer,Bison,Yacc,Lex,Flex Lexer,我正试图用Flex和Bison编写我的第一个解析器。解析数字时,我试图将它们的值保存到yylval结构中。问题是,当lexer达到某个数字时,yylval为空,这会导致分段错误 (相关的困惑点:为什么在大多数Flex示例中(例如),yylval是一个结构,而不是指向结构的指针?我无法在test.y的main中识别yylval。l没有%选项bison bridge,该选项使yylval成为指针。此外,我尝试在test.y的main中初始化yylval,但yylval=malloc(…)给出了一个类

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

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

测试1

%{
    #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; }

%%

通常,
yylval
是一个全局结构,而不是一个指针,如果从test.l文件中删除
%选项bison bridge
,这就是您得到的结果(您还需要将
yylval->real
更改为
yylval.real

flex中的
%选项bison bridge
旨在匹配bison中的
%define api.pure
,它使用不同的api在yyparse和yylex之间进行通信(yylval成为yylex的指针参数,而不是全局变量)

因此,您的基本问题是flex和bison之间的API不兼容——您需要在两者中都指定纯API/bison桥,或者两者都不指定——如果您在其中一个中指定,而不是在另一个中指定,则会出现问题

%{
    #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