2017-11-04 9 views
0

は、私は、テキストは大文字で始まっていない場合は(Eclipseの行の下に赤)の誤差を与える検証が定義されてhttp://www.davehofmann.de/?p=101のXtextスタンドアロンと検証ファイルを解析するスタンドアロンのプログラムを構築

の最初のオプションを使用しました。

スタンドアロンパーサは、検証に合格しなかった入力ファイルのエラーを出力しません。スタンドアロンの実装にも検証を検証するにはどうすればよいですか?

アップデート1

​​が含まれて文法を解析するために使用される分類:

class XtextParser { 
    @Inject 
    private IParser parser; 
    new() { 
     var injector = new MyDslStandaloneSetup(). 
          createInjectorAndDoEMFRegistration(); 
     injector.injectMembers(this) 
    } 
    def EObject parse(Reader reader) throws IOException { 
     var result = parser.parse(reader) 
     if (result.hasSyntaxErrors()) { 
      throw new ParseException("Provided input contains syntax errors.") 
     } 
     var resource = result.getRootASTElement().eResource() 
     //resource is null 
     //checkResource(resource) 
     return result.getRootASTElement(); 
    } 
    @Inject IResourceValidator resourceValidator 

    def void checkResource(Resource resource) { 
     val issues = resourceValidator.validate(resource, 
           CheckMode.ALL, CancelIndicator.NullImpl) 
     for (issue : issues) { 
      switch issue.severity { 
       case ERROR: 
        println("ERROR: " + issue.message) 
       case WARNING: 
        println("WARNING: " + issue.message) 
      } 
     } 
    } 
} 

答えて

2

は、あなたはそれが習慣検証バリデータを呼び出すいけない場合。あなたが投稿ブログは、私はタイプIParserResultsのオブジェクトがリソースを型に変換するにはどうすればよい

import java.io.IOException; 
import java.util.List; 

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.util.CancelIndicator; 
import org.eclipse.xtext.validation.CheckMode; 
import org.eclipse.xtext.validation.IResourceValidator; 
import org.eclipse.xtext.validation.Issue; 

import com.google.inject.Injector; 

public class Main { 

    public static void main(String[] args) throws IOException { 
     Injector injector = new MyDslStandaloneSetup().createInjectorAndDoEMFRegistration(); 
     ResourceSet rs = injector.getInstance(ResourceSet.class); 
     Resource resource = rs.getResource(URI.createURI("test.mydsl"), true); 
     resource.load(null); 
     IResourceValidator validator = injector.getInstance(IResourceValidator.class); 
     List<Issue> issues = validator.validate(resource, 
       CheckMode.ALL, CancelIndicator.NullImpl); 
     for (Issue issue: issues) { 
      switch (issue.getSeverity()) { 
       case ERROR: 
        System.out.println("ERROR: " + issue.getMessage()); 
       case WARNING: 
         System.out.println("WARNING: " + issue.getMessage()); 
      } 
     } 
    } 

} 
+0

を呼び出す方法については非常にあいまいであるため、(擬似コード)

@Inject IResourceValidator resourceValidator def void checkResource(Resource resource) { val issues = resourceValidator.validate(resource, CheckMode.ALL, CancelIndicator.NullImpl) for (issue: issues) { switch issue.severity { case ERROR: println("ERROR: " + issue.message) case WARNING: println("WARNING: " + issue.message) } } } 

それを呼び出しますか? – Johan

+0

解析結果はルート要素にeResourceを与えます –

+0

'result.getRootASTElement()。eResource()'によって返されるオブジェクトはnull – Johan

関連する問題