我正在尝试从我的语法生成代码。我想知道如何获得最终值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
(所有字符串都很好)
任何想法?
谢谢
答案 0 :(得分: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»'''
}