2016-07-21 15 views
-3

Я изучаю Common LISP в данный момент, и я столкнулся с огромным препятствием. У меня было задание, чтобы мы научились создавать парсер в Common LISP. Мне удалось реализовать все, начиная с грамматических правил и заканчивая лексером, с помощью помощи из разных источников в Интернете. С другой стороны, я не могу понять, как реализовать таблицу символов.Как имитировать таблицу символов в Common Lisp

Это то, что я имею в отношении таблицы символов.

(defun symtab-add (state id) 
;; *** add symbols to symbol table *** 
) 

(defun symtab-member (state id) 
;; *** look up symbols in symbol table *** 
) 

(defun symtab-display (state) 
    (format t "------------------------------------------------------~%") 
    (format t "Symbol Table is: ~S ~%" (pstate-symtab state)) 
    (format t "------------------------------------------------------~%") 
) 

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

Весь исходный код для моего назначения: http://www.cs.kau.se/cs/education/courses/dvgc01/LISP/newstart.lsp

+1

Код отсюда: http://www.cs.kau.se/cs/education/courses/dvgc01/LISP/newstart.lsp –

+0

«Как имитировать таблицу символов в Common LISP» 1) Common Lisp ", а не" Common LISP "(не нужно кричать). 2) Как указывает Райнер, этот код взят из другого места.Вы должны указать атрибут для кода, который вы публикуете, и * обязательно * не должны утверждать, что он принадлежит вам. 3) Зачем «имитировать» таблицу символов? Разве вы не хотели бы его реализовать? Эта фразировка предполагает, что таблица символов не может быть реализована в Common Lisp, что является глупым. –

+0

Да, это действительно мое задание, извините, если это неясно. Хорошо, поэтому я хочу реализовать таблицу символов (назначение - проанализировать простую программу pascal). Можете ли вы дать мне несколько указателей или указать мне в правильном направлении? Как вы можете видеть по ссылке, вы отправили незавершенный код. Это мое задание закончить. Все делается за исключением таблицы символов. – Joo223

ответ

-3

Сначала вы должны создать таблицу символов, скажем:

(setq my-symbol-table nil) 

Для простоты, мы будем игнорировать пакеты; вы можете узнать об этом позже.

Далее вы должны решить, как вы собираетесь хранить символы в таблице. Опять же, сохраняя это просто, вы можете сохранить их как список ассоциаций с парами имени символа и символьного значения. Например, если вы храните символы а и Ь со значениями 3 и 5, то будет иметь следующий символ таблицы:

> my-symbol-table 

> ((a . 3) (b . 5)) 

Чтобы использовать этот ассоциативный список, вы можете использовать функции ассоциативный, задвинуть, rplacd.

Пример:

  • Добавить новый символ

    (нажать «(с 0) мой-символ стола.)

  • Посмотрите символ:

    (assoc 'c my-symbol-table)

  • Измените значение существующего sy mbol:

    (rplacd (ассоциативный «с моей-таблицы символов) 18)

Я надеюсь, что это достаточно, чтобы ты.

+2

'setq' предназначен для изменения существующих привязок. Где вы определяете 'my-symbol-table' и где находятся' * earmuffs * '? – Sylwester

+0

Я ничего не вижу в вопросе OP, который выглядел как символы, необходимые для привязки к определенным значениям. Он больше походил на то, что просто нужен был список «в именах областей» (что делает немного более понятным для lexer/parser, хотя это все еще немного больше, чем чистый лексинг, и нужен синтаксический анализ, семантический анализ должен отвечать за проверку области переменных и т. д.). –

1

Существует множество способов реализации таблицы символов с различными уровнями «подходящих по назначению» в зависимости от ваших конкретных потребностей. В конце дня таблица символов, фактически, представляет собой только сопоставление от «имени символа» к чему-то.

Так что любая структура данных, которая позволяет вам добавлять в нее вещи, а также искать вещи, должна работать. Довольно распространенными реализациями было бы «использовать хеш-таблицу» или «использовать алист» (последний по сути является списком пар в форме (<symbol> . <data>)).

+0

Хорошо, так хэш-стол - это путь? Thats еда причиняет ive найденное alot на столах хэша и clisp. Спасибо за ответ! – Joo223