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

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。