Xtext用のパーサーのメモ。
Xtextのソースをビルドすると、自分のDSLを解釈するためのパーサークラスが生成される。
このパーサークラスを自分で呼び出して文字列を解釈させたり、一部分のルールだけを解釈させたりすることが出来る。
DMDLの文字列をパースする例。
import java.io.StringReader; import com.google.inject.Injector; import org.eclipse.xtext.nodemodel.INode; import org.eclipse.xtext.parser.IParseResult; import jp.hishidama.xtext.dmdl_editor.parser.antlr.DMDLParser; import jp.hishidama.xtext.dmdl_editor.ui.internal.DMDLActivator;
Injector injector = DMDLActivator.getInstance().getInjector(DMDLActivator.JP_HISHIDAMA_XTEXT_DMDL_EDITOR_DMDL); DMDLParser parser = injector.getInstance(DMDLParser.class); // IParseResult result = parser.doParse("dummy={ d:INT; };"); IParseResult result = parser.parse(new StringReader("dummy={ d:INT; };")); if (result.hasSyntaxErrors())) { for (INode error : result.getSyntaxErrors()) { 〜 } } else { EObject obj = result.getRootASTElement(); 〜 }
DMDLの属性一覧をパースする例。
import java.io.StringReader; import com.google.inject.Injector; import org.eclipse.xtext.ParserRule; import org.eclipse.xtext.nodemodel.INode; import org.eclipse.xtext.parser.IParseResult; import jp.hishidama.xtext.dmdl_editor.parser.antlr.DMDLParser; import jp.hishidama.xtext.dmdl_editor.services.DMDLGrammarAccess; import jp.hishidama.xtext.dmdl_editor.ui.internal.DMDLActivator;
Injector injector = DMDLActivator.getInstance().getInjector(DMDLActivator.JP_HISHIDAMA_XTEXT_DMDL_EDITOR_DMDL);
DMDLParser parser = injector.getInstance(DMDLParser.class);
DMDLGrammarAccess grammar = parser.getGrammarAccess();
ParserRule rule = grammar.getAttributeListRule(); //DMDLの属性一覧のルール
IParseResult result = parser.parse(rule, new StringReader("@test1 @test2(aaa=123)"));
if (result.hasSyntaxErrors())) {
for (INode error : result.getSyntaxErrors()) {
〜
}
} else {
EObject obj = result.getRootASTElement();
〜
}