前言最近重新学习了一下编译原理。其实我两年前就看过了。最初的目的是通过MySQLDDL在Python中生成sqlalchemy的模型。虽然已经完成了相关功能,但是现在看来实现起来比较粗糙,只用到了词法分析;所以这次我的目的是通过词法分析->语法分析->语义分析最终实现一个功能完善的脚本“语言”。该效果现在有一些阶段性的效果,如下图所示:目前有以下基本功能:变量声明和赋值(只支持int)。二次运算(优先支持)。语法检查。在调试模式下,可以打印AST。感兴趣的朋友可以在这里查看源码:https://github.com/crossoverJie/gscript。如果你本地有go环境,也可以安装运行。去获取github.com/crossoverJie/gscriptgscript-h或直接下载二进制文件并运行:https://github.com/crossoverJie/gscript/releases。当前版本的实现是用go写的。确实如标题所说,核心代码不到1k行代码。当然,这也与目前功能不完善有关。不过,麻雀虽然小而全,但从目前的版本来看,还是用到了编译原理中的部分知识:词法和语法分析。基本实现流程如上图所示:通过词法分析器从源码中解析出token。然后通过推导令牌生成抽象语法树(AST)。如果语法有错误,这一步会抛出编译失败,比如2*(1+少了一个括号。因为没有像ANTLR这样的工具来辅助生成代码(不然函数不仅会这么小),所以词法和语法分析都是手写的,代码量也不大,想调试的朋友可以直接查看源码,词法分析器:token/token.go:39语法分析器:syntax/syntax.go.会涉及一些概念,比如有限状态机,递归下降算法等本文没有涉及的知识点,待本项目功能更加完善后会重新整理,规划的最后阶段是做蛋糕阶段。不出意外的话,以后还会继续增加以下功能:更多的基本类型,string/long之类的。变量作用域,函数,甚至闭包。OOP肯定是少不了的。这些功能之后就是了实现了,可以算是一门“现代”的脚本语言,我会在学习和实现的过程中不断更新有趣的内容。源码地址:https://github.com/crossoverJie/gscript。
