7

一部のコードを解析するには、flex と bison を使用する必要があります。

YYSTYPE のデフォルトの型は ですがint、そのように宣言したことはありません。それはバイソンのデフォルトですか?

文字列を返すと、とても助かります。私はこれを読みました:Bison の警告を解決する方法 "... 宣言された型がありません" これは良いアプローチのようです。(ユニオンの全機能はまだ必要ありません。char* の部分だけですが、後で役立つ可能性があるため、ユニオンを使用することもできます。)

それは私のために働いていません。次のエラーが表示されます。

y:111.37-38: $1 of `ConstExpression' has no declared type
y:113.34-35: $1 of `ConstFactor' has no declared type
y:114.35-36: $1 of `ConstFactor' has no declared type
y:119.34-35: $1 of `Type' has no declared type
y:109.23-48: warning: type clash on default action: <str> != <>
y:115.23-27: warning: type clash on default action: <str> != <>
[...more of the same snipped...]

私のy文法ファイルからの宣言は次のとおりです。

%union {
     char *str;
 }

%type<str> ConstExpression ConstFactor Type

ここに私の.lファイルからの1行があります:

[a-zA-Z]+[a-zA-Z0-9]*   { yylval.str = strdup(yytext); return yident;}

エラーを解決するには、他に何をする必要がありますか?

4

2 に答える 2

6

実際、私は文法を見なくても何が悪いのかを知っていると確信しています.

終端記号の型も同様に宣言する必要があります。それらはセマンティック値を返す可能性があり、しばしばそうするからです。IDNUMBERのようなデータを持つものについて考えてみましょうyyval。しかし、yacc にはそれが単なる'x'ものかそれ以上のものかを知る方法がなく、ルールのデフォルトのアクションは次のとおりです。$$ = $1

たとえば、次の文法は yacc を問題なく通過しますが、%type以下の記号をもう 1 つ削除してみてください。

%union {
  char *s;
}

%type <s> r1 r2 'x'

%%

r1: r2;

r2: 'x'   { printf("%s\n", $1); };
于 2009-11-25T02:41:16.530 に答える
3

おそらく、yacc ファイルでトークンのタイプを定義する必要があるだけです。

%token<str> yident
于 2009-12-03T23:52:04.587 に答える