jls*_*ker 3 yacc lex bison flex-lexer
我正在尝试使用Flex&Bison编写我的第一个解析器.在解析数字时,我正在尝试将它们的值保存到yylval结构中.问题是,yylval当词法分析器达到一个数字时为null,这会导致分段错误.
(相关混乱的观点:那为什么在大多数Flex的例子(如这里), yylval?是一个结构,而不是指向结构的指针我无法yylval在test.l承认没有%option bison-bridge,而选择做yylval一个指针.另外,我试图初始化yylval在maintest.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)
    通常情况下,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 - 如果你在一个而不是另一个中执行它,事情会中断.