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

4ab561562e95443a9ecc9b0796ac0b3d.png

前言

最近又在重新学习编译原理了,其实两年前也复习过,当初是为了能实现通过 MySQLDDL 生成 Pythonsqlalchemymodel

4200aa350646c237810cb39f6592a908.gif

相关文章在这里:手写一个词法分析器

虽然完成了相关功能,但现在看来其实实现的比较糙的,而且也只运用到了词法分析;所以这次我的目的是可以通过词法分析->语法分析->语义分析 最终能实现一个功能完善的脚本"语言"。

效果

现在也有了一些阶段性的成果,如下图所示:6902334bc9885a381a292023d68949f5.pnge58d2e3612bd8a210271c43c95065852.png

目前具备以下基本功能:

  • 变量声明与赋值(只支持 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 行代码,当然这也和目前功能简陋有关。

不过麻雀虽小五脏俱全,从当前版本还是运用到了编译原理中的部分知识:词法、语法分析。

e7d8744f57a4d7c5b4ef1bb8452c2eb3.png

基本实现流程如上图:

  • 通过词法分析器将源码中解析出 token

  • 再通过对 token  推导生成出抽象语法树(AST)

    • 如果语法语法出现错误,这一步骤便会抛出编译失败,比如 2*(1+ 少了一个括号。

因为没有使用类似于 ANTLR 这样工具来辅助生成代码(不然功能也不会只有这么点),所以其中的词法、语法分析都是手写的,代码量并不大,对于想要调试的朋友可以直接查看源码。

词法分析器:token/token.go:39语法分析器:syntax/syntax.go

其中会涉及到一些概念,比如有限状态机、递归下降算法等知识点就没在本文讨论了,后续这个项目功能更加完善后也会重头整理。

规划

最后是画饼阶段了,不出意外后续会继续新增如下功能:

  • 更多的基础类型,string/long 之类的。

  • 变量作用域、函数。

  • 甚至是闭包。

  • OOP 肯定也少不了。

这些特性都实现后那也算是一个"现代"的脚本语言了,后续我也会继续更新学习和实现过程中的有趣内容。

源码地址:https://github.com/crossoverJie/gscript

分享一个 SpringCloud Feign 中所埋藏的坑

撸了一个 Feign 增强包 V2.0 升级版

Pulsar 也会重复消费?

5分钟学会 gRPC

9001a7051fdb852ffb774a93a26f41a1.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值