Bison 为什么yylval是空的?
我正试图用Flex和Bison编写我的第一个解析器。解析数字时,我试图将它们的值保存到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(…)给出了一个类
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