typescript - 为 DSL 扩展 TypeScript 编译器

标签 typescript tsc

在我开始之前:我确实需要(/想要)一个 DSL(即使它只是为了体验),没有其他格式可以以一种不太详细、类型安全的方式表达我想要做的事情。

一些背景信息,底部的实际问题

我想为我的项目(TypeScript)创建一个 DSL 编译器,并且由于该语言与 TypeScript 本身共享许多语法和概念(我是这样设计的),我想重新使用 TypeScript 编译器的部分来避免重新- 发明轮子。我最感兴趣的是 scanner , parserbinder .我的 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 设置没有帮助)。

实际问题

我有三个问题:

  • 尝试扩展 TypeScript 编译器中有用的部分是个好主意,还是应该从头开始编写? (我主要说的是 scannerparserbinder 组件。)
  • 如果我应该从头开始编写,是否有任何用于 TypeScript/JavaScript 的工具可以帮助我解决这个问题(例如 ANTLRjavacc 用于 Java)?
  • 除了 TypeScript 编译器本身之外,是否有任何关于如何在 TypeScript/JavaScript 中实现编译器的资源?
  • 最佳答案

    在摆弄了一段时间后,我放弃了扩展 Typescript 编译器的尝试。我最终使用了 chevrotain作为编译器-'生成器',到目前为止它一直工作正常。

    这个库的主要缺点是它(根据我的经验)不能很好地与 Typescript 集成,因为有很多“神奇”的东西显然是为了在 JavaScript 的高度动态环境中使用而设计的(尽管库本身是用TS写的)。

    总的来说,我有一个非常愉快的经历。文档非常好,有很多可能性。我可以向任何想要在 Typescript 中构建 DSL 的人强烈推荐它。

    关于typescript - 为 DSL 扩展 TypeScript 编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55077609/

    相关文章:

    javascript - typescript 类装饰器 : typing properties defined in decorator function

    typescript - 错误 MSB4064 : The "ComputeInputAndOutputOnly" parameter is not supported by the "VsTsc" task

    typescript - 如何将多个源文件传递给 TypeScript 编译器?

    node.js - 无法通过 npm 全局卸载 typescript

    javascript - 将 Sinon 与 Typescript 和接口(interface)结合使用

    angular - 从 API 响应动态创建 md-card

    typescript - this vs 类名用于在 typescript 中访问静态

    ios - 来自 Firebase 的通知停止出现在 iOS 上

    typescript - AWS CodeBuild tsc 错误 TS2307 : Cannot find module

    c - 使用时间戳计数器测量内存延迟