我正在尝试用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-如果在其中一个而不是另一个中进行操作,则会导致问题。