编程语言符号表的管理

首先为表中的符号, 设置一个初始annote值的, 其中size是长度,

static void symtable_add_global(struct symtable *st)
{
    struct sym *sym;

    sym = &st->table[st->len++];
    sym->annot.type = FS_INT;
    sym->annot.size = 8;
    sym->name = "@$";
    sym->size = sym->annot.size;
    sym->keys = fs_str_new(strdup("0123456789abcdef"));
}

创建一个符号表:

struct symtable *symtable_new(void)
{
    struct symtable *st;
    int i;

    st = calloc(1, sizeof(*st));
    assert(st);

    st->cap = 16;
    st->table = calloc(st->cap, sizeof(*st->table));
    assert(st->table);

    symtable_add_global(st);

    for (i = BPF_REG_0; i < __MAX_BPF_REG; i++)
        *(int *)(&st->reg[i].reg) = i;
    return st;
}

首先获取符号的信息, 并将对应的信息传递给node

int symtable_transfer(symtable_t* st, node_t* n) {
    sym_t* sym;
    if ( n->type != TYPE_VAR ) {
        return 0;
    }

    sym = symtable_get(st, n->name); //首先获取变量
    n->annot = sym->annot; //将符号的信息转化成为node的信息
    return 0;
}

其次在符号表中添加对应的符号:

int symtable_add(struct symtable *st, struct fs_node *n)
{
    struct sym *sym;
    sym = symtable_get(st, n->string);
    
    if (sym) { //首先查找变量, 变量存在直接返回
        if (n->type == FS_VAR)
            return 0;
    }

    //如果不存在, 在table的尾部进行添加
    sym = &st->table[st->len++];
    sym->name  = n->string;
    sym->annot = n->annot;  
    sym->size  = n->annot.size;
    sym->addr = symtable_reserve(st, sym->size);
    return 0;
}

然后就是symtable_get的逻辑:

struct sym* symtable_get(struct symtable *st, const char *name)
{
    size_t i;

    for (i = 0; i < st->len; i++) {
        if (!strcmp(st->table[i].name, name))
            return &st->table[i];
    }

    return NULL;
}

然后加入变量检查模式

你可能感兴趣的:(编译原理)