2016-03-24 10 views
0

Ich mache meine Hausaufgabe und ich habe einige Fehler in der Bison-Datei. Ich habe Fehler wie "Blabla" hat keinen Typ deklariert. Mein Code und Fehler sind unten. Ich versuche eine Art Checker zu machen, ich habe einen Header, Flex und eine Bison-Datei. Flex gibt die Tokens zurück, die ich brauche. Ich habe eine Funktion geschrieben, um ein Attribut zu erstellen, und dann überprüfe ich, ob die beiden Attributtypen gleich sind oder nicht. Wenn nicht gleich, gebe ich eine Fehlerausgabe, aber wenn ich es kompiliere, habe ich diese Fehler bekommen. Ich habe es nicht herausgefunden. Was habe ich falsch gemacht?Fehler erhalten keine Angabe in bison

In Bison-Datei:

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

In .h-Datei

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

Fehler

hw4.y: 25,24-25: $$ von `day_type‘ nicht erklärt hat, type
hw4.y: 26.27-28: $$ von `day_type 'hat keinen deklarierten Typ
hw4.y: 27.27-28: $$ von `day_type 'hat keinen deklarierten Typ
hw4.y: 28.27-28: $$ von` day_type' hat keinen deklarierten Typ
hw4.y: 29.27-28: $$ von `day_type ' hat kein Typ
hw4.y erklärt: 31,26-27: $$ von `attr_val 'hat keinen deklarierten Typ
hw4.y: 32,26-27: $$ von` attr_val' hat keinen deklarierten Typ
hw4.y: 32.39-40: Ganzzahl außerhalb des Bereichs: `$ 2 '
hw4.y: 33.26-27: $$ von' attr_val 'hat keinen deklarierten Typ
hw4.y: 33.40-41: Ganzzahl außerhalb des zulässigen Bereichs:` $ 3'
hw4.y: 34.30-31: $$ von `attr_val 'hat keinen deklarierten Typ
hw4.y: 34,45-46: $ 1 von `attr_val 'hat keinen deklarierten Typ
hw4.y: 36,24-25: $$ von` attr_name' hat keinen deklarierten Typ
hw4.y: 37,26-27: $$ von `attr_name 'hat keinen deklarierten Typ
hw4.y: 38,32-33: $$ von` attr_name' hat keinen deklarierten Typ
hw4.y: 39,26-27: $$ von `attr_name‘ hat keinen deklarierten Typ
hw4.y: 40.25-26: $$ von `attr_name 'hat keinen deklarierten Typ
hw4.y: 40.38-39: Ganzzahl außerhalb des gültigen Bereichs:` $ 2'
hw4.y: 41.29-30: $$ of ` attr_name 'hat keinen deklarierten Typ
hw4.y: 42.30-31: $$ von `attr_name' hat keinen deklarierten Typ
hw4.y: 42,43-44: integer außerhalb des Bereichs: `$ 2'
hw4.y: 43,27-28: $$ von` attr_name‘hat keinen deklarierten Typ
hw4.y: 43,41-42: integer out Reichweite: `$ 3'
hw4.y: 44,25-26: $$ von` attr_name‘hat keinen deklarierten Typ
hw4.y: 44,39-40: integer außerhalb des Bereichs:` $ 3'
hw4.y: 45.26-27: $$ von `attr_name 'hat keinen deklarierten Typ
hw4.y: 47.41-42: $ 1 von' Attribut 'hat keinen deklarierten Typ
hw4.y: 47.50-51: $ 2 von' Attribut 'hat keine Typ

Antwort

2

Wenn Sie bison/yacc mitteilen, dass es mehrere semantische Typen gibt (mit einer %union Deklaration), können Sie nur $n und $$ für Terminals und Nicht-Terminals mit deklarierten Typen verwenden.In diesem Fall teilt Ihnen Bison mit, dass Sie versuchen, $$ für ein Nicht-Terminal ohne deklarierten Typ festzulegen. Das ist nicht möglich, weil Bison keine passende Zuweisungsanweisung generieren kann, ohne zu wissen, welchem ​​Unionsmitglied er zugeordnet werden soll.

So müssen Sie die Typen Ihrer Nicht-Terminals erklären:

%type <something> day_type attr_val ... 

Auch Sie haben $n Referenzen, die außerhalb der Grenzen sind. Zum Beispiel bei der Produktion:

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

die rechte Seite besteht aus genau einem Symbol (tNUM), so gibt es keine $2. Daher die Fehlermeldung ("integer out of range:` $ 2 '"). Ich nehme an, du meinst $1.

+0

Danke! Ich wusste nicht, dass der% -Typ notwendig ist. Jetzt geht es! –