【问题标题】:How to simulate a symbol table in Common Lisp如何在 Common Lisp 中模拟符号表
【发布时间】:2016-07-21 18:42:17
【问题描述】:

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

【问题讨论】:

  • "如何在 Common LISP 中模拟符号表" 1) 是“Common Lisp”,不是“Common LISP”(不用喊)。 2)正如 Rainer 指出的那样,该代码是从其他地方获取的。您应该为您发布的代码提供归属,并且当然不应该声称它是您自己的。 3) 为什么要“模拟”符号表?你不想实现一个吗?这个措辞表明无法在 Common Lisp 中实现符号表,这很愚蠢。
  • 是的,这确实是我的任务,如果不清楚,我很抱歉。好的,所以我想实现一个符号表(任务是解析一个简单的帕斯卡程序)。你能给我一些指示或指出我正确的方向吗?正如您从链接中看到的那样,您发送了未完成的代码。完成它是我的任务。除了符号表,一切都完成了。

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


【解决方案1】:

有多种实现符号表的方法,根据您的具体需求,“适合用途”的级别各不相同。归根结底,符号表实际上只是从“符号名称”到某物的映射。

因此,任何允许您向其中添加内容以及查找内容的数据结构都应该可以工作。相当常见的实现是“使用哈希表”或“使用 alist”(后者本质上是 (<symbol> . <data>) 形式的对列表)。

【讨论】:

  • 好的,那么哈希表是要走的路吗?那是食物的原因,我在哈希表和夹子上发现了很多。感谢您的回答!
【解决方案2】:

首先你必须创建符号表,比如:

(setq my-symbol-table nil)

为简单起见,我们将忽略包;您可以稍后了解。

接下来,您必须决定如何在表格中存储符号。同样,为了简单起见,您可以将它们存储为关联列表,其中包含一对符号名称和符号值。例如,如果您将符号 a 和 b 存储为值 3 和 5,您将拥有以下符号表:

> my-symbol-table

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

要使用这个关联列表,可以使用函数 assoc、push、rplacd。

例子:

  • 添加一个新符号

    (push '(c . 0) my-symbol-table)

  • 查找符号:

    (assoc 'c my-symbol-table)

  • 更改现有符号的值:

    (rplacd (assoc 'c my-symbol-table) 18)

我希望这足以让你继续前进。

【讨论】:

  • setq 用于更改现有绑定。你在哪里定义my-symbol-table*earmuffs* 在哪里?
  • 我在 OP 的问题中看不到任何看起来需要与特定值相关联的符号。它看起来更像是只需要一个“范围内名称”列表(这对于词法分析器/解析器来说更有意义,尽管它仍然比纯粹的词法分析和解析需要更多一些;语义分析应该负责检查变量范围等)。
猜你喜欢
  • 1970-01-01
  • 2011-05-12
  • 2015-05-10
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 2017-05-19
  • 2015-04-30
  • 2018-01-29
相关资源
最近更新 更多