2011-12-04 121 views
0

我想做一個編譯器,如果編譯器被賦予令牌INTEGER,REAL或CHARACTER,我希望它生成的代碼,以使int,浮動或字符代替。 我寫的語言是C,我使用的是flex和bison。從INTEGER代碼生成int

我的詞法分析的方法有:

SYMTABNODEPTR newSymTabNode() 
{ 
    return ((SYMTABNODEPTR)malloc(sizeof(SYMTABNODE))); 
} 

int installId(char *id) 
{ 
    extern SYMTABNODEPTR symTab[SYMTABSIZE]; 
    extern int currentSymTabSize; 
    int index; 

    index = lookup(id); 
    if (index >= 0) 
    { 
     return (index); 
    } 
    else 
    { 
     symTab[currentSymTabSize] = newSymTabNode(); 
     strcpy(symTab[currentSymTabSize]->identifier,id); 
     //symTab[currentSymTabSize]->type=0; 
     return(currentSymTabSize++); 
    } 
} 

int lookup(char *s) 
{ 
    extern SYMTABNODEPTR symTab[SYMTABSIZE]; 
    extern int currentSymTabSize; 
    int i; 

    for(i=0; i<currentSymTabSize; i++) 
    { 
     if(strcmp(s,symTab[i]->identifier) == 0) 
     { 
      return (i); 
     } 
    } 
    return (-1);  
} 

,並在我的解析器我:

struct symTabNode { 
    char identifier [IDLENGTH]; 
}; 

typedef struct symTabNode SYMTABNODE; 
typedef SYMTABNODE *SYMTABNODEPTR; 

SYMTABNODEPTR symTab[SYMTABSIZE]; 

%token<iVal> IDENTIFIER NUMBER CHARACTER_CONSTANT EQUAL GTLT LT GT LTEQ GTEQ PLUS MINUS TIMES DIVIDE ASSIGN CHARACTER INTEGER REALCONST 

type     : CHARACTER 
          { 
           $$ = create_node($1, TYPE_NODE, NULL, NULL, NULL); 
          } 
         | INTEGER 
          { 
           $$ = create_node($1, TYPE_NODE, NULL, NULL, NULL); 
          } 
         | REALCONST 
          { 
           $$ = create_node($1, TYPE_NODE, NULL, NULL, NULL); 
          } 

void GenerateCode(TERNARY_TREE t) 
    { 

     if (t == NULL) return; 
      switch(t->nodeIdentifier) 
      { 
       case(TYPE_NODE): 
         printf("%s ",symTab[t->item]); 

        break; 
       default: 
        GenerateCode(t->first); 
        GenerateCode(t->second); 
        GenerateCode(t->third); 
} 

我的編譯器是目前輸出:

INTEGER a, b, c; 
REAL d, e; 
CHARACTER f; 

這將是巨大的,有

int a, b, c; 
float d, e; 
char f; 

代替 我希望這就是足夠的信息(還有很多更對課程的編譯器) 預先感謝您

+1

我刪除了Flex標籤;因爲我非常確定這無關緊要,因此我添加了與詞法分析器相關的gnu-flex標籤。 – JeffryHouser

回答

1

我建議創建一個非常簡單的測試案例(就像你把你的問題),以及然後在調試器中運行你的編譯器。當你一行一行的時候,問題應該變得明顯。至少它通常對我來說。你也可以修改你的程序在執行過程中的關鍵點上打印出額外的信息,這樣你就可以看到它在做什麼。