19

Bison との共用体の一部として構造体を含めようとしていますが、%union の「構造体ノード引数」でエラーが発生します。

parser.y:17: error: field ‘args’ has incomplete type

コード:

struct node {
    char * val;
    struct node * next;
};

%}

%union {
    char * string;
    struct node args;
}

%token <string> CD WORD PWD EXIT

%type <args> arg_list

私が間違っていることを知っている人はいますか?

4

3 に答える 3

30

さらに良いのは、%code ディレクティブを "requires" オプションと共に使用することです。

%code requires {
    struct node {
        char * val;
        struct node * next;
    };
}

%union {
    char * string;
    struct node args;
}

これにより、tab.h ファイルとパーサー ソース ファイルの "requires" ブロックにコードが含まれます。

ドキュメントから: http://www.gnu.org/software/bison/manual/html_node/Decl-Summary.html#Decl-Summary

  • 必要
    • 目的: これは、YYSTYPE および YYLTYPE に必要な依存コードを記述するのに最適な場所です。つまり、%union ディレクティブで参照される型を定義するのに最適な場所であり、Bison のデフォルトの YYSTYPE および YYLTYPE 定義をオーバーライドするのに最適な場所です。
于 2011-02-09T04:54:05.640 に答える
16

それは、得られる不自由な y.tab.h 出力に帰着します。

y.tab.h をどこかに含める前に、「構造体ノード」が定義されていることを確認して、これを修正する必要があります。

これを行うには、構造体定義を含むファイル node.h を作成します。

次に、parser.l ファイル、parser.y ファイル、および y.tab.h を含むすべての c ファイルで、y.tab.h の前に node.h を含めます。これは少し面倒です。

あるいは、どこかで使用するまで完全なタイプを知る必要がないため、「struct node args」を「struct node* args」に変更することもできます。これがあなたのコードに適合するかどうかはわかりません。

どちらかが機能するはずです。

于 2009-09-16T01:49:12.100 に答える
2

たぶんもっと簡単です(私は思います)-これを自分で使用しました:

%union {
  char   c; 
  struct {
     char name[30];
     int  type;
  } s;
}

次に、flex では "yylval.s.name" や "yylval.s.type" などを使用できます。bison では ... の代わりに$$=0, $1=bla... と書くことができます。$<s.type>$=0 , $<s.type>1=bla...

于 2016-01-23T18:45:06.453 に答える