背景介紹#
众所周知,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
本篇文章重點描述的是項目啟動的準備,下一篇開始正式構建解釋器的核心