Racket和Xtext都被视为语言工作台,但它们基于不同的概念和工作流程。
作为一名经验丰富的 Xtext 用户,我发现很难将我的思维过程适应 Racket。
在 Xtext 中,语言的语法被转换为或映射到一组类(也称为元模型)。Xtext 还生成一个解析器,将源文件转换为这些类的一组实例。作用域 API 允许解析命名引用,因此结果是对象图(也称为模型而不是抽象语法树 (AST)。这样的模型可以被查询、转换或输入到模板引擎中以生成代码。
在 Racket 中,阅读器以语法对象的形式生成 AST。然而,我发现的大多数示例似乎都临时使用了这个语法对象。它们要么是不需要完整对象图的玩具语言,要么过于复杂,很难推断出通用的方法。
对于我当前的语言项目,在与语法对象进行斗争之后,我使用 Racket 结构创建了元模型的等效项。然后,将语法对象转换为对象图就相当容易了,我可以像操作 EMF 中的模型一样操作它。但是,我觉得我没有按照预期的方式使用语法对象。
这是我的问题:
编辑:
根据元编程助手的文档,语法类可用于指定和组合语法模式,并将属性附加到其元素。它们可以实现与元模型的类类似的目的。但是,据我所知,语法类不是类,语法对象也没有以类实例关系链接到语法类。这会产生以下后果:
~or*子类的属性声明来达到类似的效果。syntax-parse语法类不附带其属性的访问器:每次想要读取属性时都必须调用。目前,我发现的文档中仍然存在两个缺失的功能: