2

如果您不熟悉,这里是 lis.py 的链接:http: //norvig.com/lispy.html

我正在尝试在 Go 中实现一个小型 lisp 解释器。我受到了 Peter Norvig 在 Python 中的 Lis.py lisp 实现的启发。

我的问题是我想不出一种有效的方法来解析 s 表达式。我曾想过一个计数器,当它看到“(”时会增加 1,当看到“)”时会减少。这样,当计数器为 0 时,你就知道你有一个完整的表达式。

但问题在于,这意味着您必须对每个表达式进行循环,这会使解释器对于任何大型程序都非常慢。

任何替代想法都会很棒,因为我想不出更好的方法。

4

2 回答 2

1

在 Rosetta 代码中用 Go 实现了一个 S 表达式解析器:

Go 中的 S 表达式解析器

它可能会让您了解如何解决问题。

于 2015-07-09T22:33:44.607 回答
1

您可能需要一个接口“Sexpr”并确保您的符号和列表数据结构与该接口匹配。然后,您可以使用 S 表达式只是“单个符号”或“S 表达式列表”这一事实。

也就是说,如果第一个字符是“(”,它不是一个符号,而是一个列表,所以开始累积一个 []Sexpr,一次读取每个包含的 Sexpr,直到在输入流中点击一个“)”。任何包含的列表都已经消耗了它的终端“)”。

如果它不是“(”,那么您正在阅读一个符号,因此请阅读直到您遇到一个非符号组成字符,取消使用它并返回该符号。

于 2015-07-10T12:30:13.897 回答