最近又在重新学习编译原理了,百行本解其实两年前也复习过,代码当初是实现释器为了能实现通过 MySQL 的 DDL 生成 Python 中 sqlalchemy 的 model。 虽然完成了相关功能,个脚但现在看来其实实现的百行本解比较糙的,而且也只运用到了词法分析;所以这次我的代码目的是可以通过词法分析->语法分析->语义分析 最终能实现一个功能完善的脚本"语言"。 现在也有了一些阶段性的实现释器成果,如下图所示: 目前具备以下基本功能: 感兴趣的百行本解朋友可以在这里查看源码: https://github.com/crossoverJie/gscript。 本地有 go 环境的服务器租用代码话也可以安装运行。 go get github.com/crossoverJie/gscript 或者直接下载二进制文件运行:https://github.com/crossoverJie/gscript/releases。实现释器 当前版本是使用 go 编写的,确实也如标题所说,核心代码还不到 1k 行代码,当然这也和目前功能简陋有关。 不过麻雀虽小五脏俱全,从当前版本还是运用到了编译原理中的部分知识:词法、语法分析。 基本实现流程如上图: 因为没有使用类似于 ANTLR 这样工具来辅助生成代码(不然功能也不会只有这么点),所以其中的词法、语法分析都是手写的,代码量并不大,源码库对于想要调试的朋友可以直接查看源码。 词法分析器:token/token.go:39 语法分析器:syntax/syntax.go。 其中会涉及到一些概念,比如有限状态机、递归下降算法等知识点就没在本文讨论了,后续这个项目功能更加完善后也会重头整理。 最后是画饼阶段了,不出意外后续会继续新增如下功能: 这些特性都实现后那也算是一个"现代"的脚本语言了,后续我也会继续更新学习和实现过程中的有趣内容。 源码地址: https://github.com/crossoverJie/gscript。亿华云前言
效果
实现
规划