[英]Problems With Lex
我正在 C 中編寫軟件。 為此,我使用 lex。 我在C中寫了一段代碼來創建符號表並進行管理。 因此,每當 lex 找到一個新符號時,它都會將其放入符號表中。 問題是,當我嘗試打印符號表中的所有結果時,我得到了我沒想到的 output。 例如,如果輸入文件是:
int main(){}
output 應該是:
int
main
(
)
{
}
但 output 是:
int main(){}
main(){}
(){}
...
等等。 用於打印的 function 是這樣的
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;
}
請注意,這仍然忽略了兩個 memory 分配的錯誤檢查,這不是一個好習慣。 我已將其修改為使用sym
而不是new
因為后者是 C++ 關鍵字,我避免使用它們作為標識符,即使在 C 代碼中也是如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.