1

如何在 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)*;
4

1 回答 1

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))
    
于 2012-07-03T20:14:45.660 回答