2016-03-24 31 views
0

Ev ödevi görevimi yapıyorum ve bison dosyasında bazı hatalar yaşıyorum. 'Blabla' türü bildirilmemiş gibi bir hata var. Kodum ve hatalarım aşağıda. Ben bir tip denetleyicisi yapmaya çalışıyorum, bir başlık, esnek ve bir bison dosyası var. İhtiyacım olan jetonları geri getiren Flex. Bir özellik oluşturmak için bir işlev yazdım, sonra iki öznitelik türünün aynı olup olmadığını kontrol ediyorum. Aynı değilse, bir hata çıkışı vereceğim, ancak derlediğimde bu hataları aldım. Ben anlamadım. Neyi yanlış yaptım? Hata alma bizde bildirilen tür yok

hw4.y

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); 
} 

yılında .h dosyası

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); 

Hatalar: 25,24-25: `day_type' arasında $$ hiçbir ilan etti bizon dosyasında


hw4.y: 26.27-28: $$ 'day_type', bildirilen bir tür yok
hw4.y: 27.27-28: $$ 'day_type' türü bildirilmemiş tip
10 hw4.y: 28.27-28: $$ 'day_type' bildirilen bir tür yok
hw4.y: 29.27-28: $$ 'day_type' 31.26-27: tip
hw4.y ilan hayır etti arasında $$ `attr_val ': 32.26-27: hayır beyan tip
hw4.y sahiptir attr_val` arasında $$' hayır bildirilmiş bir tür
hw4.y etti: 32.39-40: aralık dışı tamsayı: $ 2 '
hw4.y: 33.26-27: "attr_val"' nin $$, bildirilen bir tür yok.
hw4.y: 33.40-41: tam aralık dışında: `$ 3 '
hw4.y: 34.30-31: $$ 'attr_val', bildirilen tür yok
hw4.y: 34.45-46: 'attr_val' 1 $ hw4.y'de yok: 36.24-25: 'attr_name' $$ 'nin bildirilen bir türü yok
hw4.y: 37.26-27: $$ 39.26-27: hayır bildirilmiş bir tür
hw4.y sahiptir `attr_name ait ': 38.32-33` attr_name ait $$ hiçbir beyan tip
hw4.y bulunur `attr_name' arasında $$ hiçbir beyan türü vardır
hw4.y: 40.25-26: $$ 'attr_name' bildirilen bir tür yok
hw4.y: 40.38-39: tam aralık dışı tamsayı: `$ 2 '
hw4.y: 41.29-30: $$ attr_name 'bildirilen bir tür yok
hw4.y: 42.30-31: $$' attr_name 'bildirilen bir tür yok
hw4.y: 42,43-44: `$ 2' : aralık dışında tamsayı
hw4.y: 43,27-28:` attr_name ait $$': 43.41-42: tamsayı çıkış yok beyan tip
hw4.y vardır aralığın: `3' $
hw4.y: 44,25-26: attr_name` ait $$' `3' $
hw4.y: 44,39-40: aralık dışında tamsayı hiçbir beyan tip
hw4.y vardır: 45.26-27: $$ 'attr_name', bildirilen bir tür yok
hw4.y: 47.41-42: $ özniteliği '1' bildirilen bir tür yok bildirilen türü yok
hw4.y: 47.50-51: $ 2 'özniteliği' yok bildirilen tür

cevap

2

Bison/yacc 'a birden fazla semantik tip olduğunu bildirirseniz (%union bildirimi ile), yalnızca bildirilen türlere sahip terminaller ve terminaller için $n ve $$ kullanabilirsiniz.Bu durumda, biz bildirilmemiş tipte bir terminal için $$ ayarlamaya çalıştığınızı bizzat söylüyorum. Bu mümkün değildir çünkü bizon hangi sendika üyesinin atayacağını bilmeden uygun bir atama cümlesi oluşturamaz.

Yani olmayan terminaller türlerini bildirmek gerekir:

%type <something> day_type attr_val ... 

Ayrıca, sınırların dışında olan $n referanslara sahip. Örneğin, üretim:

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

sağ taraftaki tam olarak bir simge (tNUM) oluşur, bu yüzden herhangi bir $2 yoktur. Bu nedenle hata mesajı ("aralık dışında tam sayı: $ 2" "). $1'u kastettiğinizi tahmin ediyorum.

+0

Teşekkürler! % Türünün gerekli olduğunu bilmiyordum. Şimdi çalışıyor! –

İlgili konular