0

我正在尝试从我的语法生成代码。我想知道如何获得最终值 e 而不是对象。例如,我有:

Interval:
        '[' lower_bound=Expr ',' upper_bound=Expr ']' 
      | '[' lower_bound=Expr ',' upper_bound=Expr'[' 
      | ']' lower_bound=Expr ',' upper_bound=Expr ']' 
      | ']' lower_bound=Expr ',' upper_bound=Expr '['
;

Expr:
        literal=INT 
      | integer=INT '.' decimal=INT 
      | no_constraint?='infty' 
      | group=GroupName 
      | metric=NM 
      | right_side=Atomic Operator left_side=Atomic
;

在代码生成器模板中,我有:

'''
Term Value = «interval.lower_bound», «interval.upper_bound»
'''

我在语言文件中输入:

[10, 30]

当它生成代码时,它会放置对象:

Term Value = org.xtext.sla.dyslacc.impl.ExprImpl@2a421168 (literal: 10, integer: 0, decimal: 0, no_constraint: false, metric: null), org.xtext.sla.dyslacc.impl.ExprImpl@5784d884 (literal: 30, integer: 0, decimal: 0, no_constraint: false, metric: null)

我想要的是简单的在模板中输入的值,无论它是文字还是约束:

10,30

(作为字符串的一切都很好)

任何想法??

谢谢你

4

1 回答 1

0

您必须解释表达式而不是通过 toString 打印它。因此,我建议使用 expr 的子类型,而不是冗长的替代方案。这将允许使用来自 Xtend 的调度来决定如何可视化表达式。

Expr:
  IntLiteral | DoubleLiteal | ...
;
IntLiteral:
  literal=INT
;
DoubleLiteral:
  integer=INT '.' decimal=INT 
;

调度可能如下所示(某些情况省略):

'''
Term Value = «interval.lower_bound.asString», «interval.upper_bound.asString»
'''

def dispatch asString(IntLiteral intLiteral) {
  return String.valueOf(intLiteral.literal)
}
def dispatch asString(DoubleLiteral it) {
  return '''«it.integer».«it.decimal»'''
}
于 2014-02-27T10:52:42.583 回答