扩展DSL的TypeScript编译器

问题描述 投票:0回答:1

在我开始之前:是的我确实需要(/想要)一个DSL(即使它仅仅是为了体验),没有其他格式能够以非常冗长,类型安全的方式表达我想要做的事情。


Some background information, actual question at the bottom


我想为我的项目(TypeScript)创建一个DSL编译器,并且由于该语言与TypeScript本身共享了很多语法和概念(我是这样设计的)我想重新使用TypeScript编译器的部分来避免重新编写 - 发明轮子。我最感兴趣的是scannerparserbinder。我的DLS的其他语义和发射部分与TypeScript有很大不同,我很确定从头开始编写它会更有效率。

我找到了this网站,它解释了编译器的实际工作方式(尽管我很确定它有点过时),到目前为止我可以很好地理解所有内容。据我所知,如果我可以扩展TypeScript编译器,我没有理由重新发明轮子。

第一部分当然是scanner。我尝试用我的语言scan文件,看看会发生什么,事实证明,tsc不知道的所有东西都被归类为SyntaxKind(这是有意义的)Identifierparser)。为了实现我的DLS,我必须将关键字和语法类型添加到此扫描程序,以发送到parser以构建AST。当然,我也必须扩展TypeScript respository,但这不是我现在关注的问题。

我的第一直觉就是克隆compiler.ts并添加所需的逻辑。这样我可以使用与上述网站相同的API,但使用我添加的关键字/语法/ AST节点。然后我会编写语义检查并从头开始实际发出生成的输出,一切都会好的。

不幸的是,这并没有真正起作用(因此这个问题)。第一个障碍只是被存储库的大小和结构所淹没,我只是没有看到的地方。我试图创建一个使用本地源而不是构建源的小程序,但这也不起作用(可能是由于某些复杂的管道tsc在它处于任何可用状态之前经过)。我确实找到了parser.tstsconfig.json等文件,但没有办法使用我的自定义版本,它们没有多大用处。我试图只将我认为需要的文件复制到我自己的项目中,但这会导致各种类型的输入错误和缺少的功能,我不知道如何(以及如果)我应该修复它们。更糟糕的是:当我尝试在我自己的环境中编译它们时,某些文件有实际的编译错误(放松scanner设置没有帮助)。


Actual question

我有三个问题:

  • 尝试扩展有用的TypeScript编译器部分是一个好主意,还是应该从头开始编写? (我主要谈论的是parserbinderANTLR组件。)
  • 如果我应该从头开始编写,是否有任何可以帮助我的TypeScript / JavaScript工具(如javaccchevrotain for Java)?
  • 有没有关于如何在TypeScript / JavaScript中实现编译器的资源,除了TypeScript编译器本身?
typescript tsc
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.