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

开发 前端
当前版本是使用 go 编写的,确实也如标题所说,核心代码还不到 1k 行代码,当然这也和目前功能简陋有关。

前言

最近又在重新学习编译原理了,其实两年前也复习过,当初是为了能实现通过 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。

责任编辑:姜华 来源: 今日头条
相关推荐

2022-06-28 08:17:10

JSON性能反射

2017-03-28 21:03:35

代码React.js

2022-01-26 16:30:47

代码虚拟机Linux

2013-03-04 10:22:30

Python

2014-01-09 09:42:56

Python语言检测器

2014-05-15 09:45:58

Python解析器

2023-12-25 15:28:57

Python工具pywebio

2022-08-10 19:28:40

Hadoop数据库

2021-08-16 10:40:36

数据库耦合

2020-10-20 07:49:12

百度搜索引擎

2020-06-11 08:48:49

JavaScript开发技术

2022-01-05 08:58:08

Python解释器编程语言

2024-01-31 08:16:38

IPythonPython解释器

2012-08-14 10:44:52

解释器编程

2022-11-03 08:13:52

echo 命令Linux

2020-09-21 14:37:09

Python代码微信

2011-08-23 17:42:42

Lua脚本

2018-08-26 05:38:44

路由器调制解调器网络设备

2024-03-20 09:31:00

图片懒加载性能优化React

2022-12-13 07:40:33

LinuxWeb服务器
点赞
收藏

51CTO技术栈公众号