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