Lex的问题

时间:2011-05-30 03:13:06

标签: c linux lex

我正在用C编写软件。为此,我使用lex。我在C中编写了一段代码来创建symbol table并对其进行管理。因此,每当lex找到一个新符号时,它就会将它放在一个符号表中。问题是,当我尝试从符号表打印所有结果时,我得到的输出我没想到。 例如,如果输入文件是:

int main(){}

输出应为:

int
main
(
)
{
}

但输出是:

int main(){}
main(){}
(){}
...

等等。 用于打印的功能是这样的

void print_entries(struct symtab *start) {
   struct symtab *s = start;
   while(s != NULL) {
      printf("%s\n", s->name);
      s = s->next;
   }
}

以下是添加新符号的代码:

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您需要将符号名称复制到符号表条目中。如果由于某些特殊原因,您的系统已经没有strdup(),请使用:

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

char *strdup(const char *str)
{
   size_t len = strlen(str) + 1;
   char *dup = malloc(len);
   if (dup != 0)
       memmove(dup, str, len);
   return dup;
}

(在这种情况下,我可以安全地使用memcpy();我使用memmove()因为它始终有效且memcpy()没有。我使用memmove()因为我确切地知道字符串的长度,因此副本不需要测试每个字符的null值。)

手头有strdup()

void add_entry(char* name, int type, struct symtab *start)
{
   struct symtab *sym;
   sym = malloc(sizeof(struct symtab));
   last_entry(start)->next = sym;
   sym->name = strdup(name);
   sym->type = type;
   sym->next = NULL;
}

请注意,这仍然会忽略两次内存分配的错误检查,这不是一个好习惯。我已将其修改为使用sym而不是new,因为后者是C ++关键字,我避免将它们用作标识符,即使在C代码中也是如此。