如何使用 ParseHelper 从 DSL 解析为对象

问题描述

我想用 ParseHelper 解析一个写到 JsonObject 的 DSL 程序

public static JsonModel toJsonModel(CharSequence c) {
    ParseHelper<JsonModel> parseHelper = new ParseHelper<JsonModel>();
    try {
        return parseHelper.parse(c);
    } catch (Exception e) {
        e.printstacktrace();
    }
    return null;
}

public static void main(String args[]) {
    
    String chaine = "jsonValue { \"Nom\" : \"Toto\",\r\n"
            + "          \"Adresse\" : { \r\n"
            + "                      \"Adresse 1\" : \"x avenue de xx\",\r\n"
            + "                      \"Adresse 2\" : \" x rue de xx\"\r\n"
            + "                      },\r\n"
            + "         }\r\n"
            + "         filename = \"jsonFiletoRead.json\"\r\n"
            + "         SearchForKey(\"xx\") in jsonValue\r\n";
    CharSequence c = "'''"+chaine+"'''";
    
    JsonModel model = toJsonModel(c);


}

但我似乎无法解析,出现以下错误

java.lang.NullPointerException: Cannot invoke "org.eclipse.xtext.testing.util.ResourceHelper.createResourceSet()" because "this.resourceHelper" is null
at org.eclipse.xtext.testing.util.ParseHelper.parse(ParseHelper.java:65)
at org.istic.idm.tests.TempsMemoire.toJsonModel(TempsMemoire.java:14)
at org.istic.idm.tests.TempsMemoire.main(TempsMemoire.java:49)

解决方法

您需要使用注入来获取 parsehelper 例如

import org.eclipse.xtext.testing.util.ParseHelper;
import org.xtext.example.mydsl5.MyDslStandaloneSetup;
import org.xtext.example.mydsl5.myDsl.Model;

import com.google.inject.Inject;
import com.google.inject.Injector;

public class Main {

    public static void main(String[] args) throws Exception {
        Injector injector = new MyDslStandaloneSetup().createInjectorAndDoEMFRegistration();
        Main main = injector.getInstance(Main.class);
        System.out.println(main.doGetModel("Hello World!"));

    }
    @Inject ParseHelper<Model> parserHelper;
    
    public Model doGetModel(String content) throws Exception {
        return parserHelper.parse(content);
    }

}

import org.eclipse.xtext.testing.util.ParseHelper;
import org.xtext.example.mydsl5.MyDslStandaloneSetup;
import org.xtext.example.mydsl5.myDsl.Model;

import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.TypeLiteral;
    
public class Main {

    public static void main(String[] args) throws Exception {
        System.out.println(doGetModel("Hello World!"));

    }
    public static Model doGetModel(String content) throws Exception {
        Injector injector = new MyDslStandaloneSetup().createInjectorAndDoEMFRegistration();
        ParseHelper<Model> parserHelper = injector.getInstance(Key.get(new TypeLiteral<ParseHelper<Model>>() {}));
        return parserHelper.parse(content);
    }

}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...