几百行代码实现一个脚本解释器
2023-02-25 18:02:12 时间
前言
最近又在重新学习编译原理了,其实两年前也复习过,当初是为了能实现通过 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。
相关文章
- CAD插件-迷你建筑工具箱免费下载及安装教程 pdf编辑器全版本下载
- 深圳电子行业的mes系统的需求分析方法
- Java8新特性,Stream入门详解,丰富案例等你细品
- 年底了我裁完兄弟自己也离职了,复习了Java锁的底层准备面试...
- [MAC]AutoCAD 2021软件免费下载及安装教程 PDF编辑器全版本下载
- [MAC]AutoCAD 2021软件免费下载及安装教程 PDF编辑器全版本下载
- [MAC]CorelCAD 2020软件免费下载及安装教程
- 程序员真的很难碰到一个好的技术领导
- IDM下载神器idm多个版本(电脑、手机、浏览器插件都有)
- 学历对于程序员来说真的很重要,你敢信吗?
- 为什么一个开发人员做不好一个领导,是真的能力不行吗?
- IDM 下载器简体中文绿色版idm多个版本(电脑、手机、浏览器插件都有)
- 破局新增长!腾讯发布《2022全域经营增长指南》
- 各开发语言DNS缓存配置建议
- 腾讯企点助力建发纸业:浆纸产业数字化战略,传统行业在低增长时代的新路径
- 提出AI消除性别偏见新方法,适用于任何模型
- Netty学习之I/O 模型和Java NIO 编程
- 今年老板要淘汰多少程序员才能止损呢?
- SpringBoot3.0都正式发布了,尝鲜之前先搞明白AQS底层再说
- 为什么要推荐大家使用Spring Cloud Alibaba