xtext:AST,Metamodel和解析树之间的关系

时间:2013-01-19 21:50:01

标签: abstract-syntax-tree xtext metamodel

有人可以解释一下解析树,AST和元模型之间的关系。 到目前为止,我知道xtext从语法中派生出一个EMF Ecore元模型,并使用antlr生成一个解析器。 但是它将如何被解析:输入首先通过词法分析器,然后解析器从解析器规则中创建一个解析树,对吧?在解析树之外,Xtext还创建了一个AST?为了什么?在这种情况下,元模型有什么用途? 我对所有定义都有点困惑。

1 个答案:

答案 0 :(得分:4)

你是正确的三步解析过程:首先lexer从输入流开始,然后创建一个基于Antlr的解析树,最后Xtext从解析树生成一个基于EMF的AST。前两个步骤对于每个解析器(生成器)都是自然的,第三步需要一些解释。我将以一些动机开始有点冗长的解释,然后我将很快谈论元模型和EMF。

首先,生成的解析器不支持标识符解析(处理变量或函数调用所需),需要手动添加这些函数,因此几乎所有语言都需要手动编码的后处理步骤,已存在的解析树的扩展。

其次,EMF为其模型提供了一个不错的,类型安全的API,以及强大的反射API,允许创建非常通用但有用的组件,以简化模型的处理(例如代码生成器,如{ {3}}或Acceleo的一个方面,模型转换工具,例如XtendATLETL)。我无法确切地说出Antlr和EMF的解析树API之间的区别,但我使用了LPG解析器生成器的API,在我看来,EMF更容易使用。

更好的是,EMF的使用允许重复使用丰富的Xtext功能以及其他基于EMF的编辑器,例如基于GMF的图形编辑器。请参阅早期的EclipseCon演示文稿,了解基本概念:VIATRA2

通常,如果我们需要使用分辨率信息扩展我们的解析树,那么通过重新使用已经使用过的范例可以简化我们的语言与其他工具的集成。

EMF依赖于元模型的概念:我们必须定义模型中可用的元素集,以及其他约束,例如有关连接的信息。这个概念类似于XML的模式定义(例如DTD或SML Schema) - 我们有一种统一的方式来描述模型。 Xtext以多种方式与EMF协同工作:

  • 首先,根据语法,它生成并注册一个EMF元模型,可以在每个基于EMF的工具中使用。
  • 然后解析过程的最终结果是EMF模型,可以使用EMF API读取和修改 - 更改被序列化回文本形式。

我希望,答案很明确。如果需要,请随时提出更多说明。