Таблица символов в C - PullRequest
4 голосов
/ 28 мая 2011

В настоящее время я разрабатываю инструмент статического анализа, который выполняет сопоставление с образцом.Я использую 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() возвращает ноль.Может кто-нибудь помочь, пожалуйста?

1 Ответ

5 голосов
/ 28 мая 2011

Похоже, вы пытаетесь представить список как объект заголовка (начало), за которым следуют фактические элементы списка.Это хорошая идея, поскольку она упрощает случай с пустым списком, но у вас нет правильной реализации.

Когда вы добавляете, вам нужно удалить код специального случая, который вы получили для запуска last_entry.,Начальный узел никогда не будет содержать символьные данные.

Когда вы ищете, вы должны убедиться, что пропускаете заголовок (начало), поскольку он не содержит символьных данных.Вторая ошибка в вашем коде поиска состоит в том, что вы прекращаете поиск, когда p-> next равно NULL (что означает, что вы никогда не сможете вернуть последний элемент в вашем списке.) Вы должны остановиться, когда p равно NULL.

Конечновам вообще не следует использовать связанный список: хеш-таблица была бы лучшим выбором, поскольку у нее лучшая производительность и эффективность использования памяти.

...