1

私はYacc/Flexを使用してプログラムを作成しており、次のコードを使用しています(他のファイルのコードを混合しているため、まったく同じではありません)。

DataType datat;
%union {  
    int integer;  
    char *string;  
    DataType type;  
}

Integer { yylval.type = INTEGER; return INT; }
%type <type> INT
data : INTNUM { yylval.type = INTEGER; }

次に、このようなものを書くと:

foo : data { bar(yylval.type); }

barはデータ型INTEGERを正しく取得しますが、これがある場合:

foo : data data { ??? }

1番目と2番目のメンバーのyylval.typeを個別に取得するにはどうすればよいですか?

どうもありがとう!

4

2 に答える 2

1

あなたの質問を完全には理解していませんが、lex/yacc (または flex/bison) では、次の規則を使用する必要があります。

  • $1 を使用して、最初のアイテムの yylval を参照します
  • $2 を使用して、2 番目のアイテムの yylval を参照します
  • $$ を使用して、結果の (ターゲット) アイテムの yylval を参照します

たとえば、単純な整数計算機を作成する場合、合計を定義するルールは次のように記述されます。

Sum : Term '+' Term
   {
   $$.Value = $1.Value + $3.Value
   }

お役に立てれば。

于 2010-02-14T15:56:35.830 に答える
0

yylval.type は、スキャンされた最後のトークンからタイプを返します。これは、データに縮小された整数である可能性がありますが、その後のトークンである可能性があります。信頼できないため、yacc/bison ファイルで yylval に直接アクセスしないでください。

代わりに、、などを使用$1$2て、Patrick が指摘したようにアイテムの YYSTYPE 情報にアクセスする必要があります。非端末でこれを機能させる%typeには、yacc/bison ファイルでそれらの宣言を使用する必要があり、これらの非端末のルールを設定する必要があります$$。たとえば、次のようになります。

%type <type> data

%%

data : INTNUM { $$ = INTEGER; }

foo : data { bar($1); }

foo : data data { bar($1, $2); }
于 2010-02-19T01:35:58.243 に答える