2011-09-11 4 views
4

私のUbuntu OSでBison(GNU bison 2.4.1)とflex(2.5.35)でパーサを作成しようとしています。私はこのような何かを持っている:

SQL.H:

typedef struct word 
{ 
    char *val; 
    int length; 
} WORD; 

struct yword 
{ 
    struct word v; 
    int   o; 
... 
}; 

sql1.y

%{ 
.. 
#include "sql.h" 
.. 
%} 

%union yystype 
{ 
    struct tree *t; 
    struct yword b; 
... 
} 

%token <b> NAME 

%% 

... 

table: 
     NAME   { add_table(root, $1.v); } 
    ; 

... 

トラブル私はそれに与えるものは何でも、文字列、それが来るとき、Vは常にこの問題を解決することです入力文字列にテーブル名が必要な場合でも、値(NULL、0)があります。 (私は不要な他の詳細/スニペットをスキップすることを選択しましたが、これを解決するのに役立つともっと多くを提供できます)

完全で正確な文法を書いていますが、この問題。

すべての入力は非常に感謝します。

+0

のような値を設定する必要がgnu-フレックス。 – JeffryHouser

+0

フレックス定義はどうですか?彼らは適切に目的のトークンにマップされていますか? –

+0

スキャナのyylvalの値を適切な値に設定していますか? – templatetypedef

答えて

5

問題は、字句アナライザのいくつかの不足しているか迷惑なコードに関連しているようです。

最初にレキシカルアナライザを確認してください。

トークンが返されない場合、パーサ部分は正しく値を処理できません。 トークン値を出力する基本テストを作成します。 はすべての上に、「C」スタイルを気にしない原則である:あなたには、いくつかの入力を実行し、問題が解決しない場合は

main() { 
    int token; 
    while(token = yylex()) { 
     switch(token) { 
     case NAME: 
      printf("name '%s'\n", yylval.b.v.val); 
      break; 
     ... 
     } 
    } 
} 

NAMEを返すときに字句解析プログラムがyylvalを設定しないと、valが空であるのが普通です。以下のようなあなたのフレックスにあなたはパターンを持っている場合は

:それは間違っている

[a-z]+ { return NAME; } 

あなたは、私がタグとしてはAdobeのFlexを削除して、コメントを追加し、この

[a-z]+ { 
    yylval.val = strdup(yytext); 
    yylval.length = yylen; 
    return NAME; }