Parsing 用Xtext解析Xtext语法

Parsing 用Xtext解析Xtext语法,parsing,grammar,xtext,cross-reference,Parsing,Grammar,Xtext,Cross Reference,我想用Xtext解析Xtext语法。因此,我从中提取了语法,并对其进行了一点修改。除了语法的导入和用“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

我想用Xtext解析Xtext语法。因此,我从中提取了语法,并对其进行了一点修改。除了语法的导入和用“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或importedNamespace,并使用在同一工作区中定义的语法!)

第3/4行:无法解析对EPackage“…”的引用

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

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


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

您可以按照讨论中的对话框进行操作,讨论的内容是使用片段更改工作流

为了以编程方式解析(仅解析!!)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