如何在Common Lisp中模拟符号表

时间:2016-07-21 18:42:18

标签: parsing common-lisp lexer clisp symbol-table

我正在学习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

2 个答案:

答案 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)

我希望这足以让你前进。