我想实现一个doGenerate方法。我不明白我该如何开发所有这些方法。也许有人可以给我一个例子,为我的问题的前2-3个方法。
这是我的Xtext文件:
Model:
usestory += UseStory*;
UseStory:
title=Title role=Role target=Target use=Use;
Title:
titlen= NOUN titlev=Verbwrapper ':';
Role:
'Als' role=NOUN;
Target:
'möchte' 'ich' targetn=NOUN targetv=Verbwrapper ',';
Use:
'um' usen=NOUN 'zu' usev=Verbwrapper '.';
Verbwrapper: value=VERB;
terminal NOUN: ('Ä'|'Ö'|'Ü'|('A'..'Z'))(('a'..'z')|'ä'|'ö'|'ü'|'ß')*;
terminal VERB: ('ä'|'ö'|'ü'|'ß'|('a'..'z'))+('en')|('eln')|('n');这就是我读到的关于Xtend的内容,不能理解单个方法的实现。
/*
* generated by Xtext 2.19.0
*/
class HellodslGenerator extends AbstractGenerator{
String code
override void doGenerate
(Resource resource, IFileSystemAccess2 fsa,IGeneratorContext context)
{
code=""
for (e: resource.allContents.filter(Model).toIterable)
{
e.funktion
}
fsa.generateFile("test.txt",code)
}
def conc(String str) {
code = code + str;
}
def funktion(Model m)
m.UseStory.funktion
}我想简单地打印编辑器中的所有句子。
发布于 2020-06-20 02:33:09
您通常不会基于编辑器中的内容进行生成,而是基于AST中的内容进行生成。如果用Xtend编写生成器,通常也会使用Xtend中的富字符串特性。这可能看起来非常简单,就像
class MyDslGenerator extends AbstractGenerator {
override void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorContext context) {
fsa.generateFile("test.txt", '''
«FOR model : resource.allContents.filter(Model).toIterable»
«FOR userStory : model.usestory»
userstory
- title: «userStory.title.titlen» «userStory.title.titlev.value»
- role: «userStory.role»
- target: «userStory.target.targetn» «userStory.target.targetv.value»
- use: «userStory.use.usen» «userStory.use.usev.value»
«ENDFOR»
«ENDFOR»
''')
}
}当然,您也可以通过nodemodel访问文本。这看起来像这样
class MyDslGenerator extends AbstractGenerator {
override void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorContext context) {
fsa.generateFile("test.txt", '''
«FOR model : resource.allContents.filter(Model).toIterable»
«FOR userStory : model.usestory»
«NodeModelUtils.findActualNodeFor(userStory)»
«ENDFOR»
«ENDFOR»
''')
}
}https://stackoverflow.com/questions/62473581
复制相似问题