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;
代替 我希望這就是足夠的信息(還有很多更對課程的編譯器) 預先感謝您
我刪除了Flex標籤;因爲我非常確定這無關緊要,因此我添加了與詞法分析器相關的gnu-flex標籤。 – JeffryHouser