Как реализовать doGenerate-метод? - PullRequest
0 голосов
/ 19 июня 2020

Я хочу реализовать метод 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

}

Я хочу просто напечатать все предложения, которые стоят в редакторе.

1 Ответ

1 голос
/ 19 июня 2020

вы обычно не генерируете на основе того, что находится в редакторе, а скорее на основе того, что находится в 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»
        ''')
    }
}
...