【问题标题】:Parsing Xtext grammar with Xtext用 Xtext 解析 Xtext 语法
【发布时间】:2015-08-14 00:51:12
【问题描述】:

我想用 Xtext 解析 Xtext 语法。因此,我从GitHub 中获取了语法并对其进行了一些调整。除了导入语法和用“with”定义重用语法外,一切都很好。

所以当我创建一个应该被解析的 Xtext 文件时,例如:

grammar org.xtext.example.mydsl.Expression with org.eclipse.xtext.common.Terminals

import "http://www.xtext.org/example/mydsl/MyDsl" as mydsl
generate expression "http://www.xtext.org/example/mydsl/Expression"

我收到以下错误:

第 1 行:无法解析对语法“org.eclipse.xtext.common.Terminals”的引用。 (即使我将功能名称更改为根规则的 importURI 或 importNamespace 并使用同一工作区中定义的语法!)

第 3/4 行:无法解析对 EPackage 'http://www.xtext.org/example/mydsl/...' 的引用。

但是,我需要完整的语法来进行进一步的工作,这尤其包括重用的语法(例如终端、Xbase 或工作区中的任何其他语法),因为语法可能包含引用重用规则的规则。

有没有办法解决语法问题?我已经考虑过范围界定,但未能理解如何在我的案例中使用它。

顺便说一句,有没有办法解析文件扩展名 .xtext?我收到警告,两个内容解析器正在实现相同的文件扩展名,并且我的模型以正常的 Xtext 方式解析。有没有办法切换到我的内容解析器?

【问题讨论】:

    标签: parsing grammar xtext cross-reference


    【解决方案1】:

    您可以关注https://www.eclipse.org/forums/index.php/t/1067192/上的对话,讨论是关于使用片段来改变工作流程。

    为了以编程方式解析(仅解析!!)xtext 文件,我写了几行代码:

    public static void ParseGrammar()
    {
        String t = "grammar org.xtext.example.Entity with org.eclipse.xtext.common.Terminals\n" +
    
        "generate entity \"http://www.xtext.org/example/Entity\"\n" +
    
        "Model:\n" +
        "  (types+=Type)*;\n" +
    
        "Type:\n" +
        "  TypeDef | Entity;\n" +
    
        "TypeDef:\n" +
        "  \"typedef\" name=ID (\"mapsto\" mappedType=JAVAID)?;\n" +
    
        "JAVAID:\n" +
         " name=ID(\".\" ID)*;\n" +
    
        "Entity:\n" +
        "  \"entity\" name=ID (\"extends\" superEntity=[Entity])?\n" +
        "  \"{\"\n" +
        "    (attributes+=Attribute)*\n" +
        "  \"}\";\n" +
    
        "Attribute:\n" +
        "  type=[Type] (many?=\"*\")? name=ID;";
    
        new org.eclipse.emf.mwe.utils.StandaloneSetup().setPlatformUri("../");
        Injector injector = Guice.createInjector(new XtextRuntimeModule());
    
        Reader reader = new InputStreamReader(new StringInputStream(t));
    
        IParser parser = injector.getInstance(IParser.class);
        IParseResult result = parser.parse(reader);
        boolean err = result.hasSyntaxErrors();
        EObject eRoot = result.getRootASTElement();
    }
    

    就像您看到的那样,它使用“... with org.eclipse.xtext.common.Terminals ...”。它确实运行了 没有任何错误并生成了 AST。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 2017-07-12
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      相关资源
      最近更新 更多