在我开始之前:是 我确实需要(/想要)一个 DSL(即使它只是为了体验),没有其他格式可以以一种不太详细、类型安全的方式表达我想要做的事情。
一些背景信息,底部的实际问题
我想为我的项目(TypeScript)创建一个 DSL 编译器,并且由于该语言与 TypeScript 本身共享许多语法和概念(我是这样设计的),我想重新使用 TypeScript 编译器的部分来避免重新- 发明轮子。我最感兴趣的是 scanner
, parser
和 binder
.我的 DLS 的其他语义和发射部分与 TypeScript 有很大不同,我很确定从头开始编写它会更有效率。
我找到了 this解释编译器实际工作原理的站点(尽管我很确定它有点过时),到目前为止我可以很好地理解所有内容。据我所知,如果我可以扩展 TypeScript 编译器,我没有理由重新发明轮子。
第一部分当然是scanner
.
我试过 scan用我的语言创建一个文件来查看会发生什么,结果 tsc 不知道的所有内容都被归类( SyntaxKind
)为 Identifier
(这是有道理的)。为了实现我的 DLS,我必须向这个扫描器添加关键字和语法类型以发送到 parser
用于构建 AST。我必须延长 parser
当然也一样,但这不是我现在关心的问题。
我的第一 react 是克隆 TypeScript respository并添加所需的逻辑。这样我就可以使用与上述站点相同的 API,但添加了关键字/语法/AST 节点。然后我会编写语义检查并从头开始实际发出生成的输出,一切都会好起来的。
不幸的是,这并没有真正起作用(因此有这个问题)。第一个障碍只是被存储库的大小和结构所淹没,我只是没有找到我应该看的地方。
我试图创建一个使用本地源而不是内置源的小程序,但这也不起作用(可能是由于 tsc 在它处于任何可用状态之前经过了一些复杂的管道)。
我确实找到了 compiler.ts
, parser.ts
等文件,但没有办法使用我的自定义版本,它们没有多大用处。
我试图只将我认为需要的文件复制到我自己的项目中,但这导致了各种键入错误和功能缺失,我不知道应该如何(以及是否)修复它们。更糟糕的是:当我尝试在自己的环境中编译某些文件时,某些文件存在实际的编译错误(放宽 tsconfig.json
设置没有帮助)。
实际问题
我有三个问题:
scanner
、 parser
和 binder
组件。) 最佳答案
在摆弄了一段时间后,我放弃了扩展 Typescript 编译器的尝试。我最终使用了 chevrotain作为编译器-'生成器',到目前为止它一直工作正常。
这个库的主要缺点是它(根据我的经验)不能很好地与 Typescript 集成,因为有很多“神奇”的东西显然是为了在 JavaScript 的高度动态环境中使用而设计的(尽管库本身是用TS写的)。
总的来说,我有一个非常愉快的经历。文档非常好,有很多可能性。我可以向任何想要在 Typescript 中构建 DSL 的人强烈推荐它。
关于typescript - 为 DSL 扩展 TypeScript 编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55077609/