我正在尝试将现有的 Xtext 2.21.0 项目从 Eclipse 2020-03 移植到 Maven。
我使用 Eclipse 生成了一个示例 Xtext Maven 项目,然后用我的 DSL 填充它。问题是我的语法找不到对其他语法的引用。
529 ERROR XtextGeneratorLanguage - [XtextLinkingDiagnostic: null:1 Couldn't resolve reference to Grammar 'abc.generator.ServiceGenerator'., XtextLinkingDiagnostic: null:4 Couldn't resolve reference to EPackage 'http://www.generator.abc/ServiceGenerator'., XtextLinkingDiagnostic: null:117 STRING cannot be resolved to a rule, XtextLinkingDiagnostic: null:249 INT cannot be resolved to a rule, TransformationDiagnostic: null:248 Datatype rules may only use other datatype rules, lexer rules and keywords. (ErrorCode: InvalidDatatypeRule)]
531 ERROR Mwe2Launcher - Problems running workflow abc.generator.GenerateRawNotificationGenerator: Problem parsing 'file:/C:/Users/xxx/Desktop/eclipse_plugin_pom/abc.generator/../abc.generator/src/abc/generator/VarDefinitionGenerator.xtext':
XtextLinkingDiagnostic: null:1 Couldn't resolve reference to Grammar 'abc.generator.ServiceGenerator'.
XtextLinkingDiagnostic: null:4 Couldn't resolve reference to EPackage 'http://www.generator.abc/ServiceGenerator'.
XtextLinkingDiagnostic: null:117 STRING cannot be resolved to a rule
XtextLinkingDiagnostic: null:249 INT cannot be resolved to a rule
TransformationDiagnostic: null:248 Datatype rules may only use other datatype rules, lexer rules and keywords. (ErrorCode: InvalidDatatypeRule)
POM 文件只是 Eclipse Xtext 2.21.0 默认生成的 POM,唯一的修改是我的项目名称和 URI。
Mwe2 文件:
module abc.generator.GenerateRawNotificationGenerator
import org.eclipse.xtext.xtext.generator.*
import org.eclipse.emf.mwe.utils.StandaloneSetup
import org.eclipse.xtext.xtext.generator.model.project.*
var rootPath = ".."
Workflow {
component = XtextGenerator
{
configuration =
{
project = StandardProjectConfig
{
baseName = "abc.generator"
rootPath = rootPath
runtimeTest =
{
enabled = true
}
eclipsePlugin =
{
enabled = true
}
eclipsePluginTest =
{
enabled = true
}
createEclipseMetaData = true
}
code =
{
encoding = "windows-1252"
lineDelimiter = "\r\n"
fileHeader = "/*\n * generated by Xtext \${version}\n */"
}
}
language = StandardLanguage
{
name = "abc.generator.ServiceGenerator"
fileExtensions = "services"
serializer =
{
generateStub = false
}
validator =
{
composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
}
}
language = StandardLanguage
{
name = "abc.generator.VarDefinitionGenerator"
fileExtensions = "vardefinition"
serializer =
{
generateStub = false
}
validator =
{
composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
}
}
}
}
ServiceGenerator 标头:
grammar abc.generator.ServiceGenerator with org.eclipse.xtext.common.Terminals
generate serviceGenerator "http://www.generator.abc/ServiceGenerator"
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
VarDefinitionGenerator 标头:
grammar abc.generator.VarDefinitionGenerator with abc.generator.ServiceGenerator
generate varDefinitionGenerator "http://www.generator.abc/VarDefinitionGenerator"
import "http://www.generator.abc/ServiceGenerator"
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
我必须提到我对 Xtext 一点也不熟悉,但我对 Maven 很熟悉。 该项目在 Eclipse 2020-03 中运行良好,但由于 Eclipse 存在错误,我们需要摆脱它。我尝试升级到 Eclipse 2023-09、Java 17 和 Xtext 2.32.0,但项目无法正常工作(一些注入的变量返回为 null)。
我不明白的是Eclipse的plugin.xml文件是否应该添加到mwe2文件中的某个位置。
<?xml version="1.0" encoding="windows-1252"?>
<?eclipse version="3.0"?>
<plugin>
<extension point="org.eclipse.emf.ecore.generated_package">
<package
uri = "http://www.generator.abc/ServiceGenerator"
class = "abc.generator.serviceGenerator.ServiceGeneratorPackage"
genModel = "model/generated/ServiceGenerator.genmodel" />
</extension>
<extension point="org.eclipse.emf.ecore.generated_package">
<package
uri = "http://www.generator.abc/VarDefinitionGenerator"
class = "abc.generator.varDefinitionGenerator.VarDefinitionGeneratorPackage"
genModel = "model/generated/VarDefinitionGenerator.genmodel" />
</extension>
</plugin>
你可以用第二种语言讲述第一种语言
language = StandardLanguage {
referencedResource="platform:/resource/<project>/src/<PathTo>/<ParentDsl>.xtext"
我找到了解决办法。看来xtext Maven有一个bug,通过将src目录添加到
additionalClasspathElements
来解决。
通过这样做,您不再需要在
referencedResource
文件中定义多个 .mwe2
。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.0.0</version>
...
<configuration>
<mainClass>org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher</mainClass>
...
<additionalClasspathElements>
<additionalClasspathElement>${project.basedir}/src</additionalClasspathElement>
</additionalClasspathElements>
</configuration>
非常感谢这里解决方案的贡献者:https://github.com/eclipse/xtext/issues/2394#issuecomment-1511031257
我通过首先在
referencedResource
文件中为每种语言定义多个 .mwe2
意外地发现了它,但这导致了另一个 PDA 错误,从而使我找到了这两个问题的正确解决方案。