2016-03-24 12 views
0

私は宿題をしています。私はbisonファイルにいくつかのエラーがあります。 'blabla'に宣言された型がないようなエラーが出ました。私のコードとエラーは以下の通りです。私は型チェッカーをしようとしている、私はヘッダー、フレックスとバイソンファイルがあります。私が必要とするトークンを返すFlex。私は属性を作成する関数を書いた後、2つの属性の型が同じかどうかを調べます。同じでない場合はエラー出力を行いますが、コンパイルするとこれらのエラーが発生します。私はそれを理解しませんでした。私は何を間違えたのですか?エラーが発生しました。bisonに宣言された型はありません

AttrNode * makeATTR(char * v, AttrType t); 

%union 
{ 
    ValType val; 
    char *text; 
    AttrNode *attrPtr; 
} 
%token <text> tOPEN tCLOSE tSELF tLEND tCOURSE tCLASS ....continue 
     day_type:  tMON { $$ = makeATTR ($1,DAY);} 
         | tTUE { $$ = makeATTR ($1,DAY);} 
         | tWED { $$ = makeATTR ($1,DAY);} 
         | tTHU { $$ = makeATTR ($1,DAY);} 
         | tFRI { $$ = makeATTR ($1,DAY);} 
         ; 
     attr_val:  tSTRING {$$= makeATTR($1,STRING);} 
         | tNUM {$$= makeATTR($2,NUMBER);} 
         | tTIME {$$ = makeATTR($3,TIME);} 
         | day_type { $$ = makeATTR ($1,DAY);} 
         ; 
     attr_name:  tNAME {$$= makeATTR($1,STRING);} 
         | tCODE {$$= makeATTR($1,STRING);} 
         | tTYPE {$$= makeATTR($1,STRING);} 
         | tCRN {$$= makeATTR($2,NUMBER);} 
         | tSECTION {$$= makeATTR($1,STRING);} 
         | tCAPACITY {$$= makeATTR($2,NUMBER);} 
         | tSTART {$$ = makeATTR($3,TIME);} 
         | tEND {$$ = makeATTR($3,TIME);} 
         | tDAY { $$ = makeATTR ($1,DAY);} 
         ; 
     attribute:  attr_name attr_val {if($1.type!=$2.type) 
               printf("Mismatch error");} 
    .... 

AttrNode * makeATTR(char * v, AttrType t) 
{ 
    AttrNode * ret = (AttrNode*) malloc(sizeof(AttrNode)); 
    result->thisNodeType = Attr; 
    result->attrNodePtr = (AttrNode*)malloc(sizeof(AttrNode)); 
    result->attrNodePtr->AttrNode.value=v; 
    result->attrNodePtr->AttrNode.type=t; 
    return (result); 
} 

typedef enum {Attr,Tree } NodeType; 
typedef enum {STRING,NUMBER,TIME,DAY} AttrType; 
//For String 
typedef struct AttrNode 
{ 
    char * value; 
    AttrType * type; 
}AttrNode; 

typedef struct TreeNode 
{ 
NodeType thisNodeType; 
AttrNode *attrNodePtr; 
}TreeNode; 

AttrNode * makeATTR(char * v, AttrType t); 

.hファイル内のエラー

hw4.y:25.24から25:バイソンファイルで

`DAY_TYPE」の$$を宣言したノータイプ
hw4.y:26.27-28: `day_type 'の$$には宣言された型がありません
hw4.y: 27.27-28: `day_type 'の$$には宣言型がありません
hw4.y:28.27-28:` day_type'の$$には宣言型がありません
hw4.y:29.27-28: `day_type 'の$$ 31.26から27:: `attr_valの$$は、 ':32.26から27:何も宣言された型
hw4.yを持っていない` attr_valの$$' には宣言された型
hw4.yを持っています。no宣言された型
hw4.yを持っていません32.39-40:整数が範囲外です: `$ 2 '
hw4.y:33.26-27:` attr_val'の$$は宣言された型がありません
hw4.y:33.40-41:整数が範囲外です: '$ 3'
hw4.y:34.30-31: `attr_val 'の$$には宣言された型がありません
hw4.y:34.45-46: `attr_val 'の$ 1に宣言型がありません
hw4.y:36.24-25:` attr_name'の$$には宣言型がありません
hw4.y:37.26-27:$$ `ATTR_NAMEの ':38.32から33:何も宣言された型
hw4.yを持っていない` ATTR_NAMEの$$は、':39.26から27:何も宣言された型
hw4.yを持っていない `ATTR_NAME」の$$には宣言された型
を持っていませんhw4.y:40.25-26: `attr_name 'の$$に宣言型がありません
hw4.y:40.38-39:整数が範囲外です:` $ 2'
hw4.y:41.29-30:$$の ` attr_name 'には宣言された型がありません
hw4.y:42.30-31: `attr_name'の$$には宣言された型がありません'$ 2'
hw4.y:43.27-28: `attr_name 'の$$には宣言された型がありません
hw4.y:43.41-42:整数out `$ 3'
hw4.y:44.25から26:` ATTR_NAMEの$$は、」:44.39から40:範囲外の整数: `$ 3'
hw4.y:なし宣言された型
hw4.yを持っていない範囲の45.26-27: `attr_name 'の$$には宣言型がありません
hw4.y:47.41-42:` attribute'の$ 1に宣言型がありません
hw4.y:47.50-51: `attribute 'の$ 2にはno宣言型

答えて

2

bison/yaccに複数のセマンティック・タイプ(宣言がある%union)がある場合は、宣言されたタイプの端末と非終端端末には$n$$しか使用できません。この場合、bisonは、宣言された型のない非終端記号に対して$$を設定しようとしていることを伝えています。バイソンは、どの組合員に割り当てるべきかを知らずに適切な代入文を生成することができないので、これは不可能です。

つまり、あなた以外の端末の種類を宣言する必要があります:

%type <something> day_type attr_val ... 

はまた、あなたが範囲外です$n参照を持っています。例えば、製造中:

attr_val: ... 
     | tNUM {$$= makeATTR($2,NUMBER);} 

右側は、1つのシンボル(tNUM)からなるので、全く$2は存在しません。したがって、エラーメッセージ(「整数が範囲外です: `$ 2 '」)。私はあなたが$1を意味すると推定します。

+0

ありがとうございます!私は、%タイプが必要であることを知らなかった。今それは働いている! –

関連する問題