Bison / Yaccで%union defに構造体を含める
質問
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...