用Xtext解析Xtext语法

Parsing Xtext grammar with Xtext

我想用 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"

我收到以下错误:

Line 1: Couldn't resolve reference to Grammar 'org.eclipse.xtext.common.Terminals'. (Even if I change the feature name to importURI or importedNamespace of the root rule and use a grammar defined in the same workspace!)

Line 3/4: Couldn't resolve reference to EPackage 'http://www.xtext.org/example/mydsl/...'.

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

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

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

您可以关注 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。