5

我目前正在开发一种执行模式匹配的静态分析工具。我正在使用Flex生成词法分析器,并编写代码来管理符号表。我对C不是很有经验,所以我决定将符号表实现为线性链表。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct symtab {
   int id;
   char *name;
   int type;
   struct symtab *next;
};

enum types {
   KEYWORD = 1,
   CONSTANT,
   IDENTIFIER,
   OPERATOR,
   DELIMITER,
   WHITESPACE
};

struct symtab *last_entry(struct symtab *start)
{
   struct symtab *p;
   p = start;
   while(p -> next != NULL) {
      p = p -> next;
   }
   return p;
}

void add_entry(char* name, int type, struct symtab *start)
{
   struct symtab *new;
   new = last_entry(start);
   int id;
   if(new == start) {
      new = start;
      id = 0;
   }
   else {
      new = malloc(sizeof(struct symtab));
      id = last_entry(start) -> id;
      last_entry(start) -> next = new;
   }
   new -> id = id + 1;
   new -> name = name;
       new -> type = type;
   new -> next = NULL;
}

struct symtab *find_entry(char* name, struct symtab *start)
{
   struct symtab *p;
   p = start;
   while(p -> next != NULL) {
      if(strcmp(p -> name, name) == 0) {
         return p;
      }
   }
}

但是,当我使用add_entry()添加符号,然后尝试使用 查找它们时find_entry()find_entry()返回 null。有人可以帮忙吗?

4

1 回答 1

5

看起来您正试图将列表表示为标题对象(开始),然后是列表的实际元素。这是一个好主意,因为它简化了空列表的情况,但是您没有正确地实现。

添加时,您需要删除启动 last_entry 的特殊情况代码。起始节点永远不会包含符号数据。

查找时,您必须确保跳过头部(开始),因为它不包含符号数据。查找代码中的第二个错误是当 p->next 为 NULL 时停止搜索(这意味着您永远无法返回列表中的最后一个元素。)您应该在 p 为 NULL 时停止搜索。

当然,您根本不应该使用链表:哈希表是更好的选择,因为它具有更好的性能和内存效率。

于 2011-05-28T14:26:26.770 回答