为什么yylval为null?

时间:2011-06-21 22:01:13

标签: bison yacc lex flex-lexer

我正在尝试使用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

%%
...

1 个答案:

答案 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 - 如果你在一个而不是另一个中执行它,事情会中断。