我必须构建一个将Java语言转换为pyhton的编译器。我正在使用Flex和Bison工具。我创建了flex文件,并在Bison中为我必须实现的一些限制(例如,循环的管理,类的管理,逻辑算术运算符的管理等)定义了语法语法。 至于语义分析,我对符号表有疑问。我正在使用uthash.h库来处理哈希表。目前,我已经创建了一个仅由键和符号名称组成的简单符号表。我想了解的是如何使用符号表管理作用域(应用标识符声明的程序的一部分),然后如何识别一个能够将其插入符号表的作用域。 我希望你能帮助我。 非常感谢。
这是包含符号表的基本结构和一些功能的模块:
#include "uthash.h" //http://troydhanson.github.io/uthash/userguide.html
struct symtable
{
int id; // Key
char name[20];
UT_hash_handle hh; /* makes this structure hashable */
};
struct symtable *symbols = NULL;
void add_symbol(int symbol_id, char *name) {
struct symtable *s;
HASH_FIND_INT(symbols, &symbol_id, s);
if (s==NULL) {
s = (struct symtable *)malloc(sizeof *s);
s->id = symbol_id;
HASH_ADD_INT( symbols, id, s );
}
strcpy(s->name, name);
}
struct symtable *find_symbol(int symbol_id) {
struct symtable *s;
HASH_FIND_INT( symbols, &symbol_id, s );
return s;
}
void delete_symbol(struct symtable *symbol) {
HASH_DEL(symbols, symbol);
free(symbol);
}
void delete_all() {
struct symtable *current_symbol, *tmp;
HASH_ITER(hh, symbols, current_symbol, tmp) {
HASH_DEL(symbols,current_symbol);
free(current_symbol);
}
}
void print_symbol() {
struct symtable *s;
for(s=symbols; s != NULL; s=(struct symtable*)(s->hh.next)) {
printf(" Symbol id %d: name %s\n", s->id, s->name);
}
}