Racket 中的特定领域语言与 Xtext 等模型驱动框架的比较

Gui*_*ton 11 dsl racket

RacketXtext都被视为语言工作台,但它们基于不同的概念和工作流程。

作为一名经验丰富的 Xtext 用户,我发现很难将我的思维过程适应 Racket。

在 Xtext 中,语言的语法被转换为或映射到一组类(也称为元模型)。Xtext 还生成一个解析器,将源文件转换为这些类的一组实例。作用域 API 允许解析命名引用,因此结果是对象图(也称为模型而不是抽象语法树 (AST)。这样的模型可以被查询、转换或输入到模板引擎中以生成代码。

在 Racket 中,阅读器以语法对象的形式生成 AST。然而,我发现的大多数示例似乎都临时使用了这个语法对象。它们要么是不需要完整对象图的玩具语言,要么过于复杂,很难推断出通用的方法。

对于我当前的语言项目,在与语法对象进行斗争之后,我使用 Racket 结构创建了元模型的等效项。然后,将语法对象转换为对象图就相当容易了,我可以像操作 EMF 中的模型一样操作它。但是,我觉得我没有按照预期的方式使用语法对象。

这是我的问题:

  • 有哪些工具或 API 可用于处理语法对象并实现与模型驱动框架类似的易用性?
  • 是否有描述 Racket 中通用语言开发方法的文档,可以应用于非平凡的语言?
  • 是否有文档解释 Racket 方式与 Xtext 或任何其他模型驱动语言框架的比较?

编辑:

根据元编程助手的文档,语法类可用于指定和组合语法模式,并将属性附加到其元素。它们可以实现与元模型的类类似的目的。但是,据我所知,语法类不是类,语法对象也没有以类实例关系链接到语法类。这会产生以下后果:

  • 语法类不直接支持继承,但是我们可以通过~or*子类的属性声明来达到类似的效果。
  • syntax-parse语法类不附带其属性的访问器:每次想要读取属性时都必须调用。

目前,我发现的文档中仍然存在两个缺失的功能:

  • 从子级到父级遍历语法树:如何获取对包含给定语法对象的语法对象的引用?
  • 范围:如何为我的语言定义特定的范围规则?