2011-12-04 29 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

我建议创建一个非常简单的测试案例(就像你把你的问题),以及然后在调试器中运行你的编译器。当你一行一行的时候,问题应该变得明显。至少它通常对我来说。你也可以修改你的程序在执行过程中的关键点上打印出额外的信息,这样你就可以看到它在做什么。