为什么yylval为null?

jls*_*ker 3 yacc lex bison flex-lexer

我正在尝试使用Flex&Bison编写我的第一个解析器.在解析数字时,我正在尝试将它们的值保存到yylval结构中.问题是,yylval当词法分析器达到一个数字时为null,这会导致分段错误.

(相关混乱的观点:那为什么在大多数Flex的例子(如这里), yylval?是一个结构,而不是指向结构的指针我无法yylval在test.l承认没有%option bison-bridge,而选择做yylval一个指针.另外,我试图初始化yylvalmaintest.y的,但yylval = malloc(...)给人一种类型mismatch--仿佛yylval不是一个指针......?)

test.l

%{
    #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; }

%%
Run Code Online (Sandbox Code Playgroud)

test.y:

%{
    #include <stdio.h>
    void yyerror(char *);   
%}

%union {
    double real;
}

%token <real> REAL

%%
...
Run Code Online (Sandbox Code Playgroud)

构建命令:

bison -d test.y && flex test.l && gcc lex.yy.c test.tab.c
Run Code Online (Sandbox Code Playgroud)

Chr*_*odd 7

通常情况下,yylval是一个全球性的结构,而不是一个指针,如果去掉%option bison-bridge从test.l文件,这就是你会得到什么(你需要改变yylval->real,以yylval.real和,使其工作).

%option bison-bridge挠曲是指匹配到%define api.pure在野牛,它使用不同的API为yyparse和函数yylex之间进行通信(的yylval变成指针参数函数yylex而不是全局变量).

所以你的基本问题是flex和bison之间不兼容的API - 你需要在BOTH或NEITHER中指定纯api/bison-bridge - 如果你在一个而不是另一个中执行它,事情会中断.