【问题标题】:Xtext to AcceleoXtext 到 Acceleo
【发布时间】:2020-07-20 15:44:56
【问题描述】:

我有一个这样的表达式的 xtext 代码:

expr    : RelExp                            ( {LogicExp.args+=current}  op=LO args+=RelExp)* ;
RelExp      returns expr : ArithExp ( {RelExp.args+=current}    op=RO args+=ArithExp)* ;
ArithExp        returns expr : Term         ( {ArithExp.args+=current}  op=AO1 args+=Term)* ;
Term            returns expr : Factor       ( {Term.args+=current}      op=AO2 args+=Factor)* ;
Factor      returns expr : Atom         ({PostfixOp.arg=current} uo=UO)? 
            | {PrefixOp} uo=UO arg=Atom ;
            
Atom            returns expr : Literal
            | {Parenteses} '(' exp=expr ')' 
            | lValue ;
            
lValue      returns expr : {Var} valor=ID (
                   ({FuncCall.def=current} '(' arg=Argument? ')') | 
                   ({FieldAccess.obj=current} '.' field=ID) |
                   ({ArrayAccess.arr=current} '[' index=expr ']')
                   )*
            | PointerExp ;          

PointerExp  : {PointerExp} '**' '(' exp=expr ')' ;

//Case          : 'case' val=Atom ':' (commands+=Command)* ;

//Type          : tipo=TYPELIT ('[' exp=expr? ']')?;
Literal     : {IntLit} val=NUMBER | {TrueLit} val='TRUE' | {FalseLit} val='FALSE' | {StrLit} val=STRING;

我正在尝试编写加速代码来打印表达式。但是每次我在 acceleo 中写入 (stat.exp/) 时,它都会打印 org.xtext.example.scldsl.sclDsl.impl.TrueLitImpl@67af833b(val: 0)。

但我只需要 (val: 0)

谁能帮忙!!

【问题讨论】:

    标签: xtext acceleo


    【解决方案1】:

    当您在 Acceleo 中调用 [stat.exp/] 时,它会添加一个隐式 toString() 以从您的 AST 元素中获取字符串表示形式。

    如果您想使用您的 Xtext 语法来获得一个字符串表示,您将需要找到一种方法来使用为您的 DSL 生成的 Xtext 序列化程序。 作为第一步,你应该在你的 Acceleo 中添加一个 Java 服务,并以这样的方式实现你的 Java 服务,它需要一个 AST 元素(可能是 EObject 或你的元模型中的一些常见的超类型,如果你有一个),可以访问到 Xtext 序列化程序,并返回 AST 元素的序列化版本。

    【讨论】:

      猜你喜欢
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 2013-03-05
      • 2017-11-07
      • 2015-08-14
      • 2018-11-08
      相关资源
      最近更新 更多