为什么yylval为null?

| 我正在尝试用Flex&Bison编写我的第一个解析器。解析数字时,我正在尝试将其值保存到
yylval
结构中。问题是,当词法分析器到达数字时,
yylval
为空,这会导致分段错误。 (相关的困惑点:为什么在大多数Flex示例(例如此处)中,“ 0”是一个结构,而不是指向结构的指针?如果没有“ 4”,我无法在test.l中识别出“ 0”,并且该选项使
yylval
成为指针。此外,我尝试在test.y的
main
中初始化
yylval
,但是
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
    
已邀请:
        通常,ѭ0是全局结构,而不是指针,如果从test.l文件中删除ѭ4,,这就是您得到的(您还需要将
yylval->real
更改为
yylval.real
才能正常工作) 。 flex中的
%option bison-bridge
与野牛中的
%define api.pure
匹配,后者使用不同的API在yyparse和yylex之间进行通信(yylval成为yylex的指针参数,而不是全局var)。 因此,您的基本问题是flex和bison之间的API不兼容-您需要在BOTH或NEITHER中同时指定纯api / bison-bridge-如果您以一种方式而不是另一种方式进行操作,则会出现问题。     

要回复问题请先登录注册