【问题标题】:Text File Parsing - Java Bean Instantiation with mwe2 (Xtext)文本文件解析 - 使用 mwe2 (Xtext) 进行 Java Bean 实例化
【发布时间】:2017-07-18 18:26:27
【问题描述】:

我有要解析的文本文件(即转换为 Java Bean 实例),

形成了所需的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 '!' ;

能够生成 Greeting 和 Model Java Bean 类,通过运行 " 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 !

我需要Model Instance,它包含4个No. of Greeting Instances,名称如下。

  1. 问候instance1 -> 姓名(“Ramasamy”)
  2. 问候instance1 -> 姓名(“Govinda Govinda”)
  3. 问候instance1 -> 名字(“Kuppusamy”)
  4. 问候instance1 -> 姓名(“Karuppusamy”)

我的主程序必须使用上述文本输入文件生成 Greeting 实例,有人可以帮我解决这个问题

或者有其他方法可以实现吗?

【问题讨论】:

    标签: java parsing xtext mwe


    【解决方案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());
            }
        }
    
    }
    

    【讨论】:

    • 嗨,感谢您的回答,在线程“main”java.lang.ClassCastException 中获取模型实例异常时出现以下异常:org.eclipse.emf.codegen.ecore.genmodel.impl.GenModelImpl 不能在 org.eclipse.xtext.example.MainStack001.main(MainStack001.java:75) 处转换​​为 org.eclipse.xtext.example.domainmodel.Model
    • 你能帮忙吗
    • 不,我需要更多的上下文/一个可重现的例子
    • 你能否在我的问题中引用 Main 方法,从那里我创建了资源实例并使用您的以下语句 r.load(null);模型 m = (模型) r.getContents().get(0); for (问候 g : m.getGreetings()) { System.out.println(g.getName()); }
    • 在此同时从 r 获取模型实例得到异常
    猜你喜欢
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    相关资源
    最近更新 更多