为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中解析 s 表达式

在 Go 中解析 s 表达式

Go
慕容3067478 2021-10-18 17:19:54
如果您不熟悉,这里是 lis.py 的链接:http ://norvig.com/lispy.html我正在尝试在 Go 中实现一个小的 lisp 解释器。我受到 Peter Norvig 在 Python 中的 Lis.py lisp 实现的启发。我的问题是我想不出一种稍微有效的方法来解析 s 表达式。我曾想过一个计数器,当它看到“(”时会增加 1,当它看到“)”时会减少。这样,当计数器为 0 时,您就知道您有一个完整的表达式。但问题在于,这意味着您必须为每个单独的表达式循环,这会使解释器对于任何大型程序都非常慢。任何替代想法都会很棒,因为我想不出任何更好的方法。
查看完整描述

2 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

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

Go 中的 S 表达式解析器

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


查看完整回答
反对 回复 2021-10-18
?
墨色风雨

TA贡献1853条经验 获得超6个赞

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

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

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


查看完整回答
反对 回复 2021-10-18
  • 2 回答
  • 0 关注
  • 244 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信