gpt4 book ai didi

list - xtext 逗号分隔变量声明

转载 作者:行者123 更新时间:2023-12-01 03:58:23 27 4
gpt4 key购买 nike

我尝试根据以下语法定义一些 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

编辑:
按照这里的要求,我的实际语法,相当于上面几行的句法定义。
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;

结果是这样的大纲:
<unnamed>
+-- 0x20
| +-- Test1
| +-- Test2
| +-- Test3

这几乎与我的预期相反。我所期望的和我想在大纲中生成的内容与此类似(数据类型和地址不得显示在那里,但至少它们必须可以作为变量声明的生成类的属性进行访问)
Test1
+-- DWORD
+-- 0x20
Test2
+-- DWORD
+-- 0x20
Test3
+-- DWORD
+-- 0x20

最佳答案

在此处查看有关您案例的截屏视频:http://xtextcasts.org/episodes/18-model-optimization

您需要修改模型和元模型。要修改元模型,您需要定义一个后处理器。以下后处理器添加 type Variable 的属性目录类(class)。

更多详情见:http://christiandietrich.wordpress.com/tag/postprocessor/

class MyXtext2EcorePostProcessor implements IXtext2EcorePostProcessor {
override process(GeneratedMetamodel metamodel) {
metamodel.EPackage.process
}

def process(EPackage p) {
for (clazz : p.EClassifiers.filter(typeof(EClass))) {
if (clazz.name == typeof(Variable).simpleName) {
val typeAttribute = EcoreFactory::eINSTANCE.createEAttribute
typeAttribute.name = "type"
typeAttribute.EType = EcorePackage::eINSTANCE.EString
clazz.EStructuralFeatures += typeAttribute
}
}
}
}

然后你必须绑定(bind)它扩展 Generator像这样:
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();
}
}

最后使用新的 ExtendedGenerator在您的 mwe2 工作流程中:
... 
Workflow {
...
bean = StandaloneSetup {
...
component = postprocessor.ExtendedGenerator { // Set ExtendedGenerator!
...
}
...
}
...
}
...

然后你必须填写你的新 type属性与数据。您可以实现 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
]
}
}

然后你必须像这样绑定(bind)它(第二个和第三个绑定(bind)方法只对非 Xbase 项目是必需的)
public class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {
public Class<? extends IDerivedStateComputer> bindIDerivedStateComputer() {
return MyDerivedStateComputer.class;
}

// Not needed for Xbase-projects
@Override
public Class<? extends XtextResource> bindXtextResource() {
return DerivedStateAwareResource.class;
}

// Not needed for Xbase-projects
public Class<? extends IResourceDescription.Manager>
bindIResourceDescriptionManager() {
return DerivedStateAwareResourceDescriptionManager.class;
}
}

您可以走得更远,动态重组模型以满足您的需求。请在此处发布您的解决方案作为单独的答案,以防您走得太远。

关于list - xtext 逗号分隔变量声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15419099/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com