質問

Bisonとの結合の一部として構造体を含めようとしていますが、%unionの 'struct node args'でエラーが発生します:

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

誰が私が間違っているのか知っていますか?

役に立ちましたか?

解決

さらに良いのは、<!> quot; requires <!> quot;とともに%codeディレクティブを使用することです。オプション、すなわち:

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

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

これには、<!> quot; requires <!> quot;のコードが含まれます。 tab.hファイルとパーサーソースファイルをブロックします。

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

  
      
  • が必要   
        
    • 目的:これは、依存関係コードを記述するのに最適な場所です。   YYSTYPEおよびYYLTYPE。言い換えると、   型を定義するのに最適な場所です   %unionディレクティブで参照されている   上書きするのに最適な場所です   BisonのデフォルトのYYSTYPEおよびYYLTYPE   定義。
    •   
  •   

他のヒント

結果は、不完全なy.tab.hの出力になります。

<!> quot; struct node <!> quot;を確認して、これを修正する必要があります。 y.tab.hをインクルードする前に定義されます。

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

次に、parser.lファイル、parser.yファイル、およびy.tab.hをインクルードするcファイルで、y.tab.hの前にnode.hをインクルードします。これは少し面倒です。

別の方法として、<!> quot; struct node args <!> quot;を変更できます。 to <!> quot; struct node * args <!> quot;どこかで使用するまで完全な型を知る必要はないからです。これがコードに適合するかどうかはわかりません。

どちらでも動作するはずです。

たぶんもっとシンプル(私は思う)-自分でこれを使った:

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

次に、フレックスでは<!> quot; yylval.s.name <!> quot;を使用できます。 、または<!> quot; yylval.s.type <!> quot;など。バイソンでは、$$=0, $1=bla ...の代わりに... $<s.type>$=0 , $<s.type>1=bla...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top