List xtext逗号分隔变量声明
我尝试根据以下语法定义一些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
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
(请参阅问题中的语法定义)