【问题标题】:Xtext standalone and validationXtext 独立和验证
【发布时间】:2017-11-04 11:36:31
【问题描述】:

构建一个解析文件的独立程序,我使用了http://www.davehofmann.de/?p=101的第一个选项

如果文本不以大写字母开头,则会定义一个验证,该验证会给出错误(在 Eclipse 中为红色下划线)。

独立解析器不会给出未通过验证的输入文件的错误。我怎样才能要求独立实现也验证验证?

更新 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)
            }
        }
    }
}

【问题讨论】:

    标签: xtext


    【解决方案1】:

    如果你不调用验证器,它不会验证。所以叫它(伪代码)

    @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)
            }
        }
    }
    

    由于您发布的博客对如何调用非常模糊

    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());
                }
            }
        }
    
    }
    

    【讨论】:

    • 如何将 IParserResults 类型的对象转换为 Resource 类型?
    • 解析结果给你根 ast 元素给你电子资源
    • 用“默认”方式更新了我的答案,如何不调用 IParser。没有人想直接调用 IParser。你为什么要?
    • 只需向注入器询问 IGenerator2 javaiofilesystemaccess 并调用生成器
    • 向注入器请求 javaiofilesystemaccess
    猜你喜欢
    • 2018-10-13
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 2011-03-06
    相关资源
    最近更新 更多