几百行代码实现一个脚本解释器

crossoverJie · · 1248 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

![](https://tva1.sinaimg.cn/large/e6c9d24ely1h2pp039p8mj20rs0rsmy0.jpg) # 前言 最近又在重新学习编译原理了,其实两年前也复习过,当初是为了能实现通过 `MySQL` 的 `DDL` 生成 `Python` 中 `sqlalchemy` 的 `model`。 ![](https://i.loli.net/2020/03/23/dLpAoxf4BwEj81S.gif) 相关文章在这里:[手写一个词法分析器](https://crossoverjie.top/2020/03/23/compilation/Lexer/) <!--more--> 虽然完成了相关功能,但现在看来其实实现的比较糙的,而且也只运用到了词法分析;所以这次我的目的是可以通过词法分析->语法分析->语义分析 最终能实现一个功能完善的脚本"语言"。 # 效果 现在也有了一些阶段性的成果,如下图所示: ![](https://tva1.sinaimg.cn/large/e6c9d24ely1h2pp97cs39j20hi0cwgmo.jpg) ![](https://tva1.sinaimg.cn/large/e6c9d24ely1h2pp9ez7ibj20im0hcgnd.jpg) 目前具备以下基本功能: - 变量声明与赋值(只支持 int) - 二次运算(优先级支持) - 语法检查 - debug 模式,可以打印 AST 感兴趣的朋友可以在这里查看源码: [https://github.com/crossoverJie/gscript](https://github.com/crossoverJie/gscript) 本地有 go 环境的话也可以安装运行。 ```shell go get github.com/crossoverJie/gscript gscript -h ``` 或者直接下载二进制文件运行:[https://github.com/crossoverJie/gscript/releases](https://github.com/crossoverJie/gscript/releases) # 实现 当前版本是使用 go 编写的,确实也如标题所说,核心代码还不到 1k 行代码,当然这也和目前功能简陋有关。 不过麻雀虽小五脏俱全,从当前版本还是运用到了编译原理中的部分知识:词法、语法分析。 ![](https://tva1.sinaimg.cn/large/e6c9d24ely1h2pq6r1ilkj210k0ngq4l.jpg) 基本实现流程如上图: - 通过词法分析器将源码中解析出 token - 再通过对 token 推导生成出抽象语法树(AST) - 如果语法语法出现错误,这一步骤便会抛出编译失败,比如 `2*(1+` 少了一个括号。 因为没有使用类似于 `ANTLR` 这样工具来辅助生成代码(不然功能也不会只有这么点),所以其中的词法、语法分析都是手写的,代码量并不大,对于想要调试的朋友可以直接查看源码。 词法分析器:`token/token.go:39` 语法分析器:`syntax/syntax.go` 其中会涉及到一些概念,比如有限状态机、递归下降算法等知识点就没在本文讨论了,后续这个项目功能更加完善后也会重头整理。 # 规划 最后是画饼阶段了,不出意外后续会继续新增如下功能: - 更多的基础类型,string/long 之类的。 - 变量作用域、函数。 - 甚至是闭包。 - OOP 肯定也少不了。 这些特性都实现后那也算是一个"现代"的脚本语言了,后续我也会继续更新学习和实现过程中的有趣内容。 源码地址: [https://github.com/crossoverJie/gscript](https://github.com/crossoverJie/gscript)

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1248 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传