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 に答える