簡體   English   中英

Lex 的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM