Синтаксический анализ текстовых файлов - реализация Java Bean с помощью mwe2 (Xtext)

У меня есть текстовые файлы для анализа (например, преобразовать в Java Bean Instances),

Формируется необходимая грамматика XText.

Моя XText грамматика:

grammar org.eclipse.xtext.example.Domainmodel with org.eclipse.xtext.common.Terminals

generate domainmodel "http://www.eclipse.org/xtext/example/Domainmodel"

Model:
    greetings+=Greeting*;

Greeting:
    'Hello' name =ID '!' ;

Возможность генерировать классы Java- бинов Greeting и Model. При запуске " Generate XText Artifacts " сгенерированные классы Bean-компонентов приведены ниже.

Greeting.java

package org.eclipse.xtext.example.domainmodel;

import org.eclipse.emf.ecore.EObject;

public interface Greeting extends EObject
{
  String getName();
  void setName(String value);

}

Model.java

package org.eclipse.xtext.example.domainmodel;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;

public interface Model extends EObject
{
  EList<Greeting> getGreetings();
}

GenerateDomainmodel.mwe2 создан.

Способен генерировать Ресурс, используя .genmodel, как указано в следующем классе Main (Partial)

package org.eclipse.xtext.example;

import java.io.File;
import java.util.List;
import java.util.Map;

import javax.tools.Diagnostic;

import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage;
import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
import org.eclipse.emf.codegen.ecore.genmodel.impl.GenModelImpl;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.Diagnostician;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl;
import org.eclipse.emf.mwe2.language.mwe2.Mwe2Package;
import org.eclipse.emf.mwe2.runtime.workflow.IWorkflow;
import org.eclipse.xtext.AbstractElement;
import org.eclipse.xtext.example.domainmodel.DomainmodelFactory;
import org.eclipse.xtext.example.domainmodel.Greeting;
import org.eclipse.xtext.example.domainmodel.Model;
import org.eclipse.xtext.example.domainmodel.impl.DomainmodelFactoryImpl;
import org.eclipse.xtext.example.domainmodel.impl.DomainmodelPackageImpl;
import org.eclipse.xtext.example.domainmodel.impl.GreetingImpl;

public class Main {

    public static void main(String args[]){

        new DomainmodelStandaloneSetup().createInjectorAndDoEMFRegistration();
        ResourceSet rs = new ResourceSetImpl();
        rs.getResourceFactoryRegistry().getExtensionToFactoryMap().put("genmodel", new XMIResourceFactoryImpl());

        EPackage.Registry.INSTANCE.put(GenModelPackage.eNS_URI, GenModelPackage.eINSTANCE);

        File f = new File("/data/TASKS/4. 2016-2017_PS1/XTEXT/ECLIPSE WORKSPACE 1/org.eclipse.xtext.example.domainmodel/model/generated/Domainmodel.genmodel");
        System.out.println(f.canRead());
        Resource resource = rs.getResource(URI.createURI(f.toURI().toString()), true);
    }
}

Сделав все это, Как сгенерировать экземпляры класса Greeting с помощью файла ввода текста ниже.

Hello Ramasamy !
Hello Govinda Govinda !
Hello Kuppusamy !
Hello Karuppusamy !

Мне нужен модельный экземпляр, который содержит 4 номера приветствующих экземпляров со следующими значениями в качестве имени.

  1. Приветствие instance1 -> name ( "Рамасами")
  2. Приветствие instance1 -> name ( "Говинда Говинда")
  3. Приветствие instance1 -> name ( "Куппусамы")
  4. Приветствие instance1 -> name ( "Каруппусами")

Моя основная программа должна сгенерировать экземпляры приветствия, используя приведенный выше текстовый файл ввода. Может ли кто-нибудь помочь мне в этом?

Или есть какой-то другой способ добиться?

1 ответ

Решение

Вот образец для такого основного

import java.io.IOException;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.xtext.example.mydsl.myDsl.Greeting;
import org.xtext.example.mydsl.myDsl.Model;

import com.google.inject.Injector;

public class Main {

    public static void main(String[] args) throws IOException {
        Injector i = new MyDslStandaloneSetup().createInjectorAndDoEMFRegistration();
        ResourceSet rs = i.getInstance(ResourceSet.class);
        Resource r = rs.getResource(URI.createFileURI("./test.mydsl"), true);
        r.load(null);
        Model m = (Model) r.getContents().get(0);
        for (Greeting g : m.getGreetings()) {
            System.out.println(g.getName());
        }
    }

}

обновляется в вашем коде это будет выглядеть

import java.io.IOException;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.xtext.example.DomainmodelStandaloneSetup;
import org.eclipse.xtext.example.domainmodel.Greeting;
import org.eclipse.xtext.example.domainmodel.Model;

import com.google.inject.Injector;

public class Main {

    public static void main(String[] args) throws IOException {
        Injector i = new DomainmodelStandaloneSetup().createInjectorAndDoEMFRegistration();
        ResourceSet rs = i.getInstance(ResourceSet.class);
        Resource r = rs.getResource(URI.createFileURI("./src/mydsl.dmodel"), true);
        r.load(null);
        Model m = (Model) r.getContents().get(0);
        for (Greeting g : m.getGreetings()) {
            System.out.println(g.getNamee());
        }
    }

}
Другие вопросы по тегам