oboard

oboard

https://oboard.eu.org/
github
email
tg_channel
medium
twitter
bilibili
steam_profiles
follow

从零开始实现一个 MoonBit 解释器(一)

背景介绍#

众所周知,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

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。