2010-11-26 8 views
3

こんにちは、特定のトークンを読むときにchar *を取得する方法について混乱しています... 私はさまざまなサイトを見ていますが、提案はしていますが完全ではありません。 yytext宣言がないか、型の変換方法などバイソンのyylvalを使用して文字列を復元する

.lファイルには何が必要ですか? .yファイルには何が必要ですか?

%union{ 
    char *str; 
} 

%token<str> T_ValidWord 

%% 

element: 
T_OpenTag T_ValidWord ele1 {printf("%s", $2);} 
; 

エラー:

xml.lex: In function ‘yylex’: 
xml.lex:34: error: incompatible types when assigning to type ‘YYSTYPE’ from type ‘char *’ 

他のものより.Yファイル内

{WORD}  { yylval = strdup(yytext);return T_ValidWord;} 

:私は.Lファイルに

を持って何

私を混乱させた:私はそのyylvalを教えバイソンのマニュアルでは

yylval->something = yytext 
yylval.something = yytext 
yylval = yytext 

を参照してくださいいくつかの場所でマクロですが、私はマクロが他のテキストのためのテキストに置換されていることを理解しますが、このような状況で、私は実際にそれを得ることはありません。

答えて

9

yylvalは、ユニオンタイプのYYSTYPEです。スキャナの割り当てをyylval.str = strdup(yytext)に変更します。

yylvalは宣言することも、bisonが自動的に宣言することもできます。 Bisonのデフォルトのyylvalは本質的に役に立たない。パーサに他の値を返す必要があるかもしれないので、%union { ... }を使ってyylvalを宣言します。たとえば、スキャナ内の数字と一致する場合は、T_NUMのようなトークンを返すことをお勧めします。しかし、あなたはおそらく、その数の価値を望んでいるでしょう。これは、yylvalが便利な場所です。整数フィールドがある場合は、yylvalを使用してスキャナ内でyylval.num = atoi(yytext)を実行し、パーサのnumフィールドを使用します。

yytextは、現在解析されている入力のバッファとして機能する文字の配列です。あなたはyytextを宣言することはできません。

bisonを使用してパーサーを.tab.cファイルにコンパイルするときは、デバッグシンボルとヘッダーファイルにフラグbison -d -tを使用します。ヘッダファイルは* .tab.hと呼ばれます。あなたのスキャナにそれを含めて、トークン名を一度だけ宣言し、yylvalを適切に使用するだけです。

+0

オウエア、ありがとう、何が良い答え:) – mjsr