背景介绍
众所周知,MoonBit 目前是一个编译语言,需要运行代码必须有完整的代码结构。而我一直希望 MoonBit 能有像 Python, JavaScript 拥有为快速测试和交互式编程设计 REPL(Read-Eval-Print Loop)的解释器,也是为了学习,便尝试实现一个解释器。
准备工作
为了实现这样一个解释器,我先搜索了JavaScript 生态系统中可以定制自己的 DSL(领域特定语言)的工具链
可以搜索到如下热门的工具链项目
- Lexer和Parser工具:将自定义语法转换为可执行代码或AST。
- ANTLR:强大的解析器生成器,能定义语法生成解析器和词法分析器,可生成JavaScript解析器处理DSL。
- PEG.js:基于解析表达式文法的JavaScript解析器生成器,定义文法即可生成轻量解析器。
- Chevrotain:这是一个快速且功能多样的 JavaScript 解析器构建库。它能提供更精细的控制权,方便构建复杂的语法规则。与 PEG.js 相比,Chevrotain 更加灵活,并且支持自定义报错信息和优化操作。
- AST处理:构建DSL并编译或执行代码时,AST处理很关键。
- Acorn:快速轻量的JavaScript解析器,可解析JavaScript源代码生成AST,适用于类似JavaScript语法的DSL。
- ESTree:JavaScript AST标准格式,很多解析器生成的AST遵循此标准,可按需生成。
- 代码生成工具: - 解析DSL并生成AST后可生成目标代码或执行DSL。
- Babel:流行的JavaScript编译器,用插件机制转换AST为不同版本JavaScript或其他目标代码。
- ESCodegen:将AST转回源代码的JavaScript库,可生成DSL的JavaScript或其他代码。
- 模板引擎:
- DSL生成模板化代码或配置文件时有用。
- EJS/Handlebars/Mustache:能将DSL语义映射到模板生成输出代码。
- 自定义解释器:实现解释器直接执行DSL语义。
- Esprima:JavaScript解析库,可解析运行自定义JavaScript代码,适用于DSL嵌入JavaScript逻辑。
- Nearley.js:基于PEG的解析器生成器,可生成解析器并创建解释器。
经过一些尝试,最终我选择了Chevrotain这款构建基于 JavaScript 和 TypeScript 的语法分析器(parser)的库。它提供了创建自定义语法解析器的工具,支持从简单的语法解析到复杂的上下文敏感解析。Chevrotain 的设计理念是性能优先,它通过基于 LL(k) 解析器的模型来实现高效的解析流程。
前端界面的准备
之前见到一个项目叫做WebContainer,官网首页的 jsh 深深地吸引了我
于是翻阅此官网的源码发现,它使用的是 xterm.js
甚至是 VSCode 都在用,于是我简单配置了一下,就做成了一个漂亮的前端 Terminal
本篇文章重点描述的是项目启动的准备,下一篇开始正式构建解释器的核心
项目地址: https://github.com/oboard/moonrepl