在Go中解析s表达式

时间:2015-07-08 20:14:34

标签: go lisp interpreter s-expression

如果您不熟悉,请点击此链接指向lis.py:http://norvig.com/lispy.html

我试图在Go中实现一个小的lisp解释器。我被Peter Norvig在Python中的Lis.py lisp实现所启发。

我的问题是我无法想出一种解析s表达式的单一有效方法。我曾经想过一个计数器,当它看到"("并且当它看到&#34时会减少)"会增加1。这样当计数器为0时,你就知道你已经有了完整的表达。

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

任何其他想法都会很棒,因为我无法想到更好的方法。

2 个答案:

答案 0 :(得分:1)

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

S-expression parser in Go

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

答案 1 :(得分:1)

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

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

如果它不是“(”,你正在阅读一个符号,那么在你碰到一个非符号构成的角色之前一直阅读,不要消耗它并返回符号。