2011-12-26 9 views
3

私は私の.lexファイルにこのトークンを持っている:私はコンパイルしようとすると、私はこのエラーを取得するフレックスとバイソンのトークンの文字列値を取得するには?

Sentence: "Sphere(" ALPHANUM ")." 
{ 
FILE* file = fopen("C:/test.txt", "a+"); 
char st1[] = "polySphere -name "; 
strcat(st1, $2); 
strcat(st1, ";"); 
fprintf(file,"%s", st1); 
fclose(file); 
} 

警告私.Yファイル内

[a-zA-Z0-9]+ { yylval = yytext; return ALPHANUM; } 

と、このコード: 'strcat'の引数2を渡すと、キャストなしの整数からポインタが作成されます

$ 2はintなので、どうやって文字列にしますか?

例:「Sphere(worldGlobe)」。私は$ 2に文字列値worldGlobeをここに置いて欲しい。 %union宣言が存在しない場合には、任意のヘルプ

+0

Flexタグを削除しました。 Adobe Flexのためのもので、gnu-flexタグを追加しました。このタグは、字句解析ツールとあなたが探していたものを参照しています。 – JeffryHouser

+0

.yファイルからユニオン宣言を、また.yファイルからALPHANUMのトークン宣言を表示できますか? – MtnViewJohn

+1

複数のyylvalタイプがあるとします。あなたが返すものがchar *ならば、.yファイルのプロローグ部分に '#define YYSTYPE char *'を持たなければなりません。 – MtnViewJohn

答えて

6

ため

おかげで、バイソンがので、すべて シンボル値の整数であり、YYSTYPEがintであることを規定しています。 実際には、あなたがこの問題のために、いくつかの解決策があります。

1)yylval |組合溶液(推奨):
あなたはyylvalはyytext変数(yylval = yytext;を保存するためにレクサーで使用されるグローバル変数である知っているかもしれませんが)あなたは、あなたがstore.youは、単にあなたのYACC文法のヘッダに次の行を追加できるでしょうタイプのあなたのレクサーを教えてください:

#define YYSTYPE char * 

あなたがここでの唯一の文字列値を格納します。

%union { 
    char *a; 
    double d; 
    int fn; 
} 

、あなたのLEXであなたが

[a-zA-Z0-9]+ { **yylval.a** = yytext; return ALPHANUM; } 

2を持つことになります)yytext使用する:あなたがあなたのyaccファイルで指定する必要があり、異なるタイプを保存したい場合はところで


アドバイス:yacc iのルールの後のコールバックでは、関数を使うことを個人的に好みます。コード全体ではありません:)

このソリューションは本当に簡単です。それは次のトークンだから
Sentence: "Sphere("{callback_your_function(yytext);} ALPHANUM ")."

ここyytextは、あなたのALPHANUMトークンの値を持つことになります。

+10

生のyytextポインタをyylvalに貼り付けることには注意が必要です。次に何かをレッックスすると、バッファが上書きされます。ルールにいくつかのそのようなトークンを集めるパーサーがあり、同時にそれらを$ 1、$ 2で参照する場合は、適切なアプローチではありません。ループ内でyylex()を呼び出し、トークンを1つずつ処理しているのであれば大丈夫かもしれません。 – Kaz

関連する問題