2011-06-21 8 views
3

私は最初のパーサーをFlexで書こうとしています& Bison。数字を解析するときに、値をyylval構造体に保存しようとしています。問題は、レクサーが数値に達したときにyylvalがヌルであり、セグメンテーション・フォルトが発生することです。混乱のなぜyylvalはnullですか?

(関連ポイント:?なぜそれが最もFlexの例(例えばhere)で、yylvalは構造ではなく、構造体へのポインタであるということです私はyylvalはなしtest.lで認識されるように得ることができませんでした%option bison-bridge、およびそのオプションはyylvalポインタをした。また、私はtest.yのmainyylvalを初期化しようとしたが、yylvalないポインタ...?)

テストであるかのようにyylval = malloc(...)がタイプmismatch--を与えます.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に変更する必要があります)。

フレックスの%option bison-bridgeは、バイソンの%define api.pureにマッチします.yyparseとyylex(yylvalはグローバル変数ではなくyylexのポインタ引数になります)との通信に異なるAPIを使用します。

あなたの基本的な問題は、flexとbisonの間に互換性のないAPIがあるためです。純粋なapi/bisonブリッジをBOTHまたはNEITHERに指定する必要があります。

関連する問題