2017-11-04 13 views
0

, 나는 텍스트를 대문자로 시작되지 않는 경우 (일식에 밑줄 빨간색) 오류를 줄 유효성 검증이 정의 http://www.davehofmann.de/?p=101Xtext 독립형 및 검증 파일을 구문 분석하는 독립 실행 형 프로그램을 구축

의 첫 번째 옵션을 사용 .

독립 실행 형 파서는 유효성 검사를 통과하지 못한 입력 파일의 오류를 제공하지 않습니다. 독립 실행 형 구현에 유효성 검증을 요청하려면 어떻게해야합니까?

업데이트 1

checkResource 포함와 문법을 구문 분석하는 데 사용 분류 :

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