2011-06-21 105 views
3

我想寫我的第一個解析器與Flex &野牛。在解析數字時,我試圖將它們的值保存到yylval結構中。問題是,當詞法分析器達到一個數字時,yylval爲空,這會導致分段錯誤。爲什麼yylval null?

(混亂的相關問題:那爲什麼在大多數Flex的例子(如here),yylval是一個結構,而不是指向結構的指針我不能讓yylval在test.l確認無%option bison-bridge,而選擇做yylval的指針。另外,我試着在test.y的main初始化yylval,但yylval = malloc(...)給人一種類型mismatch--彷彿yylval指針......?)

測試.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; } 

%% 

test.y:

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

回答

7

通常情況下,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 - 如果你在一個而不是另一箇中執行,事情就會中斷。