我正在学习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
答案 0 :(得分:1)
有多种方法可以实现符号表,具有不同级别的“适合目的”,具体取决于您的确切需求。在一天结束时,符号表实际上只是从“符号名称”到某个东西的映射。
因此,任何允许您向其添加内容以及查找内容的数据结构都应该有效。相当常见的实现是“使用哈希表”或“使用列表”(后者本质上是(<symbol> . <data>)
形式的对列表。)
答案 1 :(得分:-3)
首先,您必须创建符号表,例如:
(setq my-symbol-table nil)
为了简单起见,我们将忽略包;你可以稍后了解它。
接下来,您必须决定如何将符号存储在表格中。再次,保持简单,您可以将它们存储为关联列表,具有符号名称和符号值对。例如,如果使用值3和5存储符号a和b,则可以使用以下符号表:
> my-symbol-table
> ((a . 3) (b . 5))
要使用此关联列表,您可以使用函数assoc,push,rplacd。
示例:
添加新符号
(推送&#39;(c.0)my-symbol-table)
查找符号:
(assoc&#39; c my-symbol-table)
更改现有符号的值:
(rplacd(assoc&#39; c my-symbol-table)18)
我希望这足以让你前进。