我正在尝试使用Flex& amp编写我的第一个解析器野牛。在解析数字时,我试图将它们的值保存到yylval
结构中。问题是,当词法分析器到达一个数字时,yylval
为空,这会导致分段错误。
(相关的混淆点:为什么在大多数Flex示例中(例如here),yylval
是一个结构,而不是指向结构的指针?我无法得到{{ 1}}在test.l中被识别而没有yylval
,并且该选项使%option bison-bridge
成为指针。此外,我尝试在test.y的yylval
中初始化yylval
,但是main
会出现类型不匹配的情况 - 好像yylval = malloc(...)
不是一个指针......?)
test.l
yylval
test.y:
%{
#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
%%
...
答案 0 :(得分:7)
通常,yylval
是一个全局结构而不是指针,如果从test.l文件中删除%option bison-bridge
,那就是你得到的(你需要更改{{1} }} yylval->real
以及它的工作原理。)
flex中的yylval.real
意味着匹配bison中的%option bison-bridge
,它使用不同的API在yyparse和yylex之间进行通信(yylval成为yylex的指针参数而不是全局变量)
所以你的基本问题是flex和bison之间不兼容的API - 你需要在两个中指定纯api / bison-bridge - 如果你在一个而不是另一个中执行它,事情会中断。