gpt4 book ai didi

c - Lex 的问题

转载 作者:行者123 更新时间:2023-11-30 18:05:41 25 4
gpt4 key购买 nike

我正在用 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;
}

有什么想法吗?

最佳答案

您需要将符号名称复制到符号表条目中。如果由于某种特殊原因您的系统还没有 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() 因为我确切地知道字符串有多长,因此副本不需要测试每个字符是否为空。)

手边有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 代码中也是如此。

关于c - Lex 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6171973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com