List xtext逗号分隔变量声明

List xtext逗号分隔变量声明,list,variables,definition,xtext,List,Variables,Definition,Xtext,我尝试根据以下语法定义一些XText来指定变量 variables MyVar1 : Bool at 0x020 value=true; MyVar2, MyVar3 : Int at 0x030 value 200; end-variables 所以每个定义都是语法上的 VarName ["," VarName]* ":" Type ["at" HEX]? ["value" VALUE]? ";" 所有变量应可通过其参考进行访问,大纲中的结果应如下: variables +-MyV

我尝试根据以下语法定义一些XText来指定变量

variables
  MyVar1 : Bool at 0x020 value=true;
  MyVar2, MyVar3 : Int at 0x030 value 200;
end-variables
所以每个定义都是语法上的

VarName ["," VarName]* ":" Type ["at" HEX]? ["value" VALUE]? ";"
所有变量应可通过其参考进行访问,大纲中的结果应如下:

variables
+-MyVar1 : Bool
+-MyVar2 : Int
+-MyVar3 : Int
<unnamed>
+-- 0x20
|   +-- Test1
|   +-- Test2
|   +-- Test3
public class ExtendedGenerator extends Generator {
  public ExtendedGenerator() {
    new XtextStandaloneSetup() {
      @Override
      public Injector createInjector() {
        return Guice.createInjector(new XtextRuntimeModule() {
          @Override
          public Class<? extends IXtext2EcorePostProcessor>
                                 bindIXtext2EcorePostProcessor() {
            return MyXtext2EcorePostProcessor.class;
          }
        });
      }
    }.createInjectorAndDoEMFRegistration();
  }
}
编辑: 按照这里的要求,我的实际语法相当于上面几行的语法定义

Variable:
  name=ID
;
Declaration_Var:
  'variables'
  vars+=Declaration_Var_Body+
  'end-variables' ';'
;
Declaration_Var_Body:
  varDecl+=Variable(',' varDecl +=Variable)*
  ':' type=[TR_Any]
  ('at' address=HEX)?
;
TR_Any:
  ...
;
terminal HEX:
  ...
;
有了这个,下面的字符序列

variables
  Test1, Test2, Test3 : DWORD at 0x20;
end_var;
其结果如下所示:

variables
+-MyVar1 : Bool
+-MyVar2 : Int
+-MyVar3 : Int
<unnamed>
+-- 0x20
|   +-- Test1
|   +-- Test2
|   +-- Test3
public class ExtendedGenerator extends Generator {
  public ExtendedGenerator() {
    new XtextStandaloneSetup() {
      @Override
      public Injector createInjector() {
        return Guice.createInjector(new XtextRuntimeModule() {
          @Override
          public Class<? extends IXtext2EcorePostProcessor>
                                 bindIXtext2EcorePostProcessor() {
            return MyXtext2EcorePostProcessor.class;
          }
        });
      }
    }.createInjectorAndDoEMFRegistration();
  }
}

请参见此处介绍您案例的屏幕广播:

您需要修改模型和元模型。要修改元模型,需要定义后处理器。后面的后处理器将
类型
属性目录添加到
变量
类中

有关更多详细信息,请参阅:

然后您必须像这样绑定它扩展
生成器

variables
+-MyVar1 : Bool
+-MyVar2 : Int
+-MyVar3 : Int
<unnamed>
+-- 0x20
|   +-- Test1
|   +-- Test2
|   +-- Test3
public class ExtendedGenerator extends Generator {
  public ExtendedGenerator() {
    new XtextStandaloneSetup() {
      @Override
      public Injector createInjector() {
        return Guice.createInjector(new XtextRuntimeModule() {
          @Override
          public Class<? extends IXtext2EcorePostProcessor>
                                 bindIXtext2EcorePostProcessor() {
            return MyXtext2EcorePostProcessor.class;
          }
        });
      }
    }.createInjectorAndDoEMFRegistration();
  }
}
然后必须用数据填充新的
类型
属性。您可以通过实现
IDerivedStateComputer
接口来实现

class MyDerivedStateComputer implements IDerivedStateComputer {

  override discardDerivedState(DerivedStateAwareResource resource) {
    resource.allContents.filter(typeof(VariableDefinition)).forEach [
      type = null
    ]
  }

  override installDerivedState(DerivedStateAwareResource resource,
                               boolean preLinkingPhase) {
    resource.allContents.filter(typeof(VariableDefinition)).forEach [
      type = (eContainer as DefinitionBlock).type
    ]
  }
}
然后必须像这样绑定它(第二个和第三个绑定方法仅对非Xbase项目是必需的)

公共类MyDslRuntimeModule扩展了AbstractMyDslRuntimeModule{

公共课你能发布你当前的语法并提出具体的问题吗?我在这里添加了一些更详细的描述好吧,现在我明白你的问题了。你真的只对好看的大纲感兴趣,还是对按照你描述的方式修改内部结构感兴趣?我还希望内部结构与此结构匹配re,因为我认为这将使进一步的开发更加容易。这与我想要的不完全一样。在您的语法中,可以指定一个变量列表,如
MyVar1:MyType,MyVar2:MyType,…
我需要这样指定它们:
MyVar1,MyVar2,…:MyType
(请参阅问题中的语法定义)