xtext生成器正向输入到输出

时间:2012-07-02 15:50:34

标签: java eclipse-emf xtext xtend emf

如何在xtend生成器中将解析树的一部分从输入转发到输出?

例如,在某些输出代码生成的情况下,我不需要解析某些构造函数/函数的参数。我只需要将这些常量,变量名称,经历等直接放到输出代码中(转发所有内部大括号):

输入DSL代码:

CREATE_OBJECT_O(3, a, 5+6 )

输出(可能是某些Java或C ++代码):

Object o = new Object_Impl(3, a, 5+6 )

xtext语法的某些部分:

ParameterList:
    (parameter+=Parameter ( "," parameter+=Parameter)* )?
    ;
Parameter:
    variableExpression=VariableExpression |(texts+=TextInParameter | macroSubstitutions+=MacroSubstitution)*;

1 个答案:

答案 0 :(得分:3)

在Xtext中有两种不同的服务:

  1. 您可以注入org.eclipse.xtext.serializer.ISerializer服务,然后调用serializer.serialize(EObject)以文本格式输出对象。但是,如果它在编辑期间不起作用(例如在JVMModelInferrer中使用时),则使用序列化规则。
  2. 包含静态方法的org.eclipse.xtext.nodemodel.util.NodeModelUtils类,此处有用。这些方法使用原始文本格式,保留原始格式,因此在编辑时可以使用。

    val eObjectNode = NodeModelUtils::getNode(eObject)
    eObjectNode.text //this is the output
    
    // Or alternatively getTokenText returns the string without hidden tokens
    NodeModelUtils::getTokenText(NodeModelUtils::getNode(eObject))