Я пытаюсь создать компилятор, и если компилятору дан токен INTEGER, REAL или CHARACTER, я бы хотел, чтобы он генерировал код для создания int, float или char вместо этого.Язык, на котором я пишу, - это C, и я использую flex и bison.
Мои методы лексера:
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;
вместо этого, я надеюсь, что этого достаточно информации (конечно, компилятору еще много) СпасибоВы заранее