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