go实现脚本解释器gscript
作者:crossoverJie 时间:2023-10-12 00:49:39
前言
最近又在重新学习编译原理了,其实两年前也复习过,当初是为了能实现通过 MySQL
的 DDL
生成 Python
中 sqlalchemy
的 model
。
相关文章在这里:手写一个词法分析器
虽然完成了相关功能,但现在看来其实实现的比较糙的,而且也只运用到了词法分析;所以这次我的目的是可以通过词法分析->语法分析->语义分析 最终能实现一个功能完善的脚本”语言”。
效果
现在也有了一些阶段性的成果,如下图所示:
目前具备以下基本功能:
变量声明与赋值(只支持 int)
二次运算(优先级支持)
语法检查
debug 模式,可以打印 AST
感兴趣的朋友可以在这里查看源码:https://github.com/crossoverJie/gscript
本地有 go 环境的话也可以安装运行。
go get github.com/crossoverJie/gscript
gscript -h
或者直接下载二进制文件运行:
https://github.com/crossoverJie/gscript/releases
实现
当前版本是使用 go 编写的,确实也如标题所说,核心代码还不到 1k 行代码,当然这也和目前功能简陋有关。
不过麻雀虽小五脏俱全,从当前版本还是运用到了编译原理中的部分知识:词法、语法分析。
基本实现流程如上图:
通过词法分析器将源码中解析出 token
再通过对 token 推导生成出抽象语法树(AST)
如果语法语法出现错误,这一步骤便会抛出编译失败,比如 2*(1+
少了一个括号。
因为没有使用类似于 ANTLR
这样工具来辅助生成代码(不然功能也不会只有这么点),所以其中的词法、语法分析都是手写的,代码量并不大,对于想要调试的朋友可以直接查看源码。
词法分析器:token/token.go:39
语法分析器:syntax/syntax.go
其中会涉及到一些概念,比如有限状态机、递归下降算法等知识点就没在本文讨论了,后续这个项目功能更加完善后也会重头整理。
规划
最后是画饼阶段了,不出意外后续会继续新增如下功能:
更多的基础类型,string/long 之类的。
变量作用域、函数。
甚至是闭包。
OOP 肯定也少不了。
这些特性都实现后那也算是一个”现代”的脚本语言了,后续我也会继续更新学习和实现过程中的有趣内容。
源码地址:https://github.com/crossoverJie/gscript
来源:https://crossoverjie.top/2022/05/30/gscript/gscript01/
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Django框架登录加上验证码校验实现验证功能示例
浅谈pymysql查询语句中带有in时传递参数的问题
![](https://img.aspxhome.com/file/2023/0/79750_0s.jpg)
Pytorch 实现自定义参数层的例子
MySQL慢查日志的开启方式与存储格式详析
![](https://img.aspxhome.com/file/2023/8/75638_0s.png)
史上最好用的远程桌面工具(附源码)
![](https://img.aspxhome.com/file/2023/0/114710_0s.jpg)
PHP中Static(静态)关键字功能与用法实例分析
Python 私有属性和私有方法应用场景分析
在Python中使用元类的教程
.NET Core2.1如何获取自定义配置文件信息详解
![](https://img.aspxhome.com/file/2023/5/79005_0s.png)
python实现每天自动签到领积分的示例代码
![](https://img.aspxhome.com/file/2023/2/90872_0s.png)
Vue iframe更改src后页面未刷新问题解决方法
python实现图像识别的示例代码
![](https://img.aspxhome.com/file/2023/6/109446_0s.png)
如何防止Application对象在多线程访问中出现错误?
javascript实现文字无缝滚动效果
网站鼠标变变变!
python复制文件的方法实例详解
python和C语言混合编程实例
这些CSS Selector,你都熟悉吗?
Javascript防止图片拉伸的自适应处理方法
![](https://img.aspxhome.com/file/2023/1/132561_0s.jpg)