如果您不熟悉,这里是 lis.py 的链接:http ://norvig.com/lispy.html我正在尝试在 Go 中实现一个小的 lisp 解释器。我受到 Peter Norvig 在 Python 中的 Lis.py lisp 实现的启发。我的问题是我想不出一种稍微有效的方法来解析 s 表达式。我曾想过一个计数器,当它看到“(”时会增加 1,当它看到“)”时会减少。这样,当计数器为 0 时,您就知道您有一个完整的表达式。但问题在于,这意味着您必须为每个单独的表达式循环,这会使解释器对于任何大型程序都非常慢。任何替代想法都会很棒,因为我想不出任何更好的方法。
2 回答
墨色风雨
TA贡献1853条经验 获得超6个赞
您可能需要有一个接口“Sexpr”并确保您的符号和列表数据结构与接口匹配。然后,您可以使用 S 表达式只是“单个符号”或“S 表达式列表”这一事实。
也就是说,如果第一个字符是“(”,它不是一个符号,而是一个列表,所以开始累积一个 []Sexpr,一次读取每个包含的 Sexpr,直到在输入流中遇到“)”。任何包含的列表都已经消耗了其终端“)”。
如果它不是“(”,则您正在阅读一个符号,因此请阅读直到遇到非符号组成的字符,然后取消使用它并返回该符号。
- 2 回答
- 0 关注
- 244 浏览
添加回答
举报
0/150
提交
取消