【发布时间】:2012-01-12 14:29:15
【问题描述】:
我正在尝试制作一个编译器,如果编译器被赋予了标记 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;
改为 我希望这是足够的信息(当然编译器还有很多) 提前谢谢你
【问题讨论】:
-
我删除了 Flex 标签;因为我很确定这与 Adobe Flex 无关,我添加了与词法分析器相关的 gnu-flex 标签。
标签: c compilation code-generation bison flex-lexer