如何在符号表中管理范围

时间:2018-08-14 10:24:45

标签: c bison symbol-table

我必须构建一个将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);
  }

}

0 个答案:

没有答案