xChar
·2 months ago

背景介绍

众所周知,MoonBit 目前是一个编译语言,需要运行代码必须有完整的代码结构。而我一直希望 MoonBit 能有像 Python, JavaScript 拥有为快速测试和交互式编程设计 REPL(Read-Eval-Print Loop)的解释器,也是为了学习,便尝试实现一个解释器。

准备工作

为了实现这样一个解释器,我先搜索了JavaScript 生态系统中可以定制自己的 DSL(领域特定语言)的工具链

可以搜索到如下热门的工具链项目

  1. Lexer和Parser工具:将自定义语法转换为可执行代码或AST。
    • ANTLR:强大的解析器生成器,能定义语法生成解析器和词法分析器,可生成JavaScript解析器处理DSL。
    • PEG.js:基于解析表达式文法的JavaScript解析器生成器,定义文法即可生成轻量解析器。
    • Chevrotain:这是一个快速且功能多样的 JavaScript 解析器构建库。它能提供更精细的控制权,方便构建复杂的语法规则。与 PEG.js 相比,Chevrotain 更加灵活,并且支持自定义报错信息和优化操作。
  2. AST处理:构建DSL并编译或执行代码时,AST处理很关键。
    • Acorn:快速轻量的JavaScript解析器,可解析JavaScript源代码生成AST,适用于类似JavaScript语法的DSL。
    • ESTree:JavaScript AST标准格式,很多解析器生成的AST遵循此标准,可按需生成。
  3. 代码生成工具: - 解析DSL并生成AST后可生成目标代码或执行DSL。
    • Babel:流行的JavaScript编译器,用插件机制转换AST为不同版本JavaScript或其他目标代码。
    • ESCodegen:将AST转回源代码的JavaScript库,可生成DSL的JavaScript或其他代码。
  4. 模板引擎:
    • DSL生成模板化代码或配置文件时有用。
    • EJS/Handlebars/Mustache:能将DSL语义映射到模板生成输出代码。
  5. 自定义解释器:实现解释器直接执行DSL语义。
    • Esprima:JavaScript解析库,可解析运行自定义JavaScript代码,适用于DSL嵌入JavaScript逻辑。
    • Nearley.js:基于PEG的解析器生成器,可生成解析器并创建解释器。

经过一些尝试,最终我选择了Chevrotain这款构建基于 JavaScript 和 TypeScript 的语法分析器(parser)的库。它提供了创建自定义语法解析器的工具,支持从简单的语法解析到复杂的上下文敏感解析。Chevrotain 的设计理念是性能优先,它通过基于 LL(k) 解析器的模型来实现高效的解析流程。

image

前端界面的准备

之前见到一个项目叫做WebContainer,官网首页的 jsh 深深地吸引了我

于是翻阅此官网的源码发现,它使用的是 xterm.js

frame_chrome_mac_dark (2)

frame_chrome_mac_dark (1)

甚至是 VSCode 都在用,于是我简单配置了一下,就做成了一个漂亮的前端 Terminal

frame_chrome_mac_dark (3)

本篇文章重点描述的是项目启动的准备,下一篇开始正式构建解释器的核心

项目地址: https://github.com/oboard/moonrepl

Loading comments...