我应该如何在 xtext 中创建引用的 or



我正在尝试制作语法:

语法梅斯特拉。DmxLightShow with org.eclipse.xtext.common.Terminals

生成 dmxLightShow "http://www.DmxLightShow.mestra">

Mestra:
    songs += Song+;
Song:
    'Song' name=ID 'tcs' tcs+=TriggersAndCommands* 'sequences' sequences+=[Sequence]+';';
TriggersAndCommands:
    trigger=[Trigger] | command=[Command] ;
Sequences:      
    sequences += Sequence+;
Sequence:
    'Sequence' name=ID ';';
Trigger:
    'Trigger' name=ID ';';
Command:
    'Command' name=ID ';';

尽管语法编辑器中没有错误图标,但当生成 Xtext 工件时会生成错误(全文在末尾(:

warning(200): ../mestra.dmxlightshow/src-gen/mestra/parser/antlr/internal/InternalDmxLightShow.g:199:2: Decision can match input such as "RULE_ID" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
error(201): ../mestra.dmxlightshow/src-gen/mestra/parser/antlr/internal/InternalDmxLightShow.g:199:2: The following alternatives can never be matched: 2

我想问题出在以下片段中:

TriggersAndCommands:
    trigger=[Trigger] | command=[Command] ;

我希望它做的是接受这样的一行:

Song NameOfSong tcs Trigger1 Command2 Trigger3 sequences SequenceName;

要稍后添加:

Command Command1;
Command Command2;
Trigger Trigger1;

我应该如何创建行来实现此目的?

(完整错误输出(:

0    [main] INFO  text.xtext.generator.XtextGenerator  - Initializing Xtext generator
6    [main] INFO  lipse.emf.mwe.utils.StandaloneSetup  - Adding generated EPackage 'org.eclipse.xtext.common.types.TypesPackage'
186  [main] INFO  lipse.emf.mwe.utils.StandaloneSetup  - Registering project mestra.dmxlightshow at 'file:/C:/Users/Michel/Mestra/DmxLightShow/mestra.dmxlightshow/'
186  [main] INFO  lipse.emf.mwe.utils.StandaloneSetup  - Registering project mestra.dmxlightshow.tests at 'file:/C:/Users/Michel/Mestra/DmxLightShow/mestra.dmxlightshow.tests/'
187  [main] INFO  lipse.emf.mwe.utils.StandaloneSetup  - Registering project mestra.dmxlightshow.ide at 'file:/C:/Users/Michel/Mestra/DmxLightShow/mestra.dmxlightshow.ide/'
187  [main] INFO  lipse.emf.mwe.utils.StandaloneSetup  - Registering project mestra.dmxlightshow.ui at 'file:/C:/Users/Michel/Mestra/DmxLightShow/mestra.dmxlightshow.ui/'
188  [main] INFO  lipse.emf.mwe.utils.StandaloneSetup  - Registering project mestra.dmxlightshow.ui.tests at 'file:/C:/Users/Michel/Mestra/DmxLightShow/mestra.dmxlightshow.ui.tests/'
193  [main] INFO  lipse.emf.mwe.utils.StandaloneSetup  - Using resourceSet registry. The registered Packages will not be registered in the global EPackage.Registry.INSTANCE!
379  [main] INFO  clipse.emf.mwe.utils.GenModelHelper  - Registered GenModel 'http://www.eclipse.org/Xtext/Xbase/XAnnotations' from 'platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel'
382  [main] INFO  clipse.emf.mwe.utils.GenModelHelper  - Registered GenModel 'http://www.eclipse.org/xtext/xbase/Xtype' from 'platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel'
394  [main] INFO  clipse.emf.mwe.utils.GenModelHelper  - Registered GenModel 'http://www.eclipse.org/xtext/xbase/Xbase' from 'platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel'
394  [main] INFO  clipse.emf.mwe.utils.GenModelHelper  - Registered GenModel 'http://www.eclipse.org/xtext/common/JavaVMTypes' from 'platform:/resource/org.eclipse.xtext.common.types/model/JavaVMTypes.genmodel'
916  [main] INFO  text.xtext.generator.XtextGenerator  - Generating mestra.DmxLightShow
2024 [main] INFO  nerator.ecore.EMFGeneratorFragment2  - Generating EMF model code
2050 [main] INFO  clipse.emf.mwe.utils.GenModelHelper  - Registered GenModel 'http://www.DmxLightShow.mestra' from 'platform:/resource/mestra.dmxlightshow/model/generated/DmxLightShow.genmodel'
warning(200): ../mestra.dmxlightshow/src-gen/mestra/parser/antlr/internal/InternalDmxLightShow.g:199:2: Decision can match input such as "RULE_ID" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
error(201): ../mestra.dmxlightshow/src-gen/mestra/parser/antlr/internal/InternalDmxLightShow.g:199:2: The following alternatives can never be matched: 2
3636 [main] INFO  text.xtext.generator.XtextGenerator  - Generating common infrastructure
3676 [main] ERROR mf.mwe2.launch.runtime.Mwe2Launcher  - Problems running workflow mestra.GenerateDmxLightShow: 
[ERROR]: GeneratorException: (Element: -UNKNOWN-; Reported by: XtextGenerator)
     org.eclipse.xtext.util.RuntimeIOException: java.io.FileNotFoundException: C:UsersMichelMestraDmxLightShowmestra.dmxlightshow..mestra.dmxlightshowsrc-genmestraparserantlrinternalInternalDmxLightShowLexer.java (The system cannot find the file specified)
    at org.eclipse.xtext.generator.JavaIoFileSystemAccess.readTextFile(JavaIoFileSystemAccess.java:263)
    at org.eclipse.xtext.generator.AbstractFileSystemAccess2.readTextFile(AbstractFileSystemAccess2.java:45)
    at org.eclipse.xtext.xtext.generator.parser.antlr.AbstractAntlrGeneratorFragment2.improveCodeQuality(AbstractAntlrGeneratorFragment2.java:222)
    at org.eclipse.xtext.xtext.generator.parser.antlr.AbstractAntlrGeneratorFragment2.splitParserAndLexerIfEnabled(AbstractAntlrGeneratorFragment2.java:213)
    at org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2.generateProductionGrammar(XtextAntlrGeneratorFragment2.java:194)
    at org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2.doGenerate(XtextAntlrGeneratorFragment2.java:156)
    at org.eclipse.xtext.xtext.generator.parser.antlr.AbstractAntlrGeneratorFragment2.generate(AbstractAntlrGeneratorFragment2.java:109)
    at org.eclipse.xtext.xtext.generator.CompositeGeneratorFragment2.generate(CompositeGeneratorFragment2.java:50)
    at org.eclipse.xtext.xtext.generator.XtextGenerator.invokeInternal(XtextGenerator.java:230)
    at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:132)
    at org.eclipse.emf.mwe.core.lib.Mwe2Bridge.invoke(Mwe2Bridge.java:34)
    at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:212)
    at org.eclipse.emf.mwe2.runtime.workflow.AbstractCompositeWorkflowComponent.invoke(AbstractCompositeWorkflowComponent.java:37)
    at org.eclipse.emf.mwe2.runtime.workflow.Workflow.run(Workflow.java:20)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:102)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:62)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:52)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.run(Mwe2Launcher.java:78)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.main(Mwe2Launcher.java:36)
Caused by: java.io.FileNotFoundException: C:UsersMichelMestraDmxLightShowmestra.dmxlightshow..mestra.dmxlightshowsrc-genmestraparserantlrinternalInternalDmxLightShowLexer.java (The system cannot find the file specified)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at com.google.common.io.Files$FileByteSource.openStream(Files.java:120)
    at com.google.common.io.Files$FileByteSource.read(Files.java:144)
    at com.google.common.io.Files.toByteArray(Files.java:248)
    at org.eclipse.xtext.generator.JavaIoFileSystemAccess.readTextFile(JavaIoFileSystemAccess.java:259)
    ... 18 more
java.lang.RuntimeException: Problems running workflow mestra.GenerateDmxLightShow: 
[ERROR]: GeneratorException: (Element: -UNKNOWN-; Reported by: XtextGenerator)
     org.eclipse.xtext.util.RuntimeIOException: java.io.FileNotFoundException: C:UsersMichelMestraDmxLightShowmestra.dmxlightshow..mestra.dmxlightshowsrc-genmestraparserantlrinternalInternalDmxLightShowLexer.java (The system cannot find the file specified)
    at org.eclipse.xtext.generator.JavaIoFileSystemAccess.readTextFile(JavaIoFileSystemAccess.java:263)
    at org.eclipse.xtext.generator.AbstractFileSystemAccess2.readTextFile(AbstractFileSystemAccess2.java:45)
    at org.eclipse.xtext.xtext.generator.parser.antlr.AbstractAntlrGeneratorFragment2.improveCodeQuality(AbstractAntlrGeneratorFragment2.java:222)
    at org.eclipse.xtext.xtext.generator.parser.antlr.AbstractAntlrGeneratorFragment2.splitParserAndLexerIfEnabled(AbstractAntlrGeneratorFragment2.java:213)
    at org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2.generateProductionGrammar(XtextAntlrGeneratorFragment2.java:194)
    at org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2.doGenerate(XtextAntlrGeneratorFragment2.java:156)
    at org.eclipse.xtext.xtext.generator.parser.antlr.AbstractAntlrGeneratorFragment2.generate(AbstractAntlrGeneratorFragment2.java:109)
    at org.eclipse.xtext.xtext.generator.CompositeGeneratorFragment2.generate(CompositeGeneratorFragment2.java:50)
    at org.eclipse.xtext.xtext.generator.XtextGenerator.invokeInternal(XtextGenerator.java:230)
    at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:132)
    at org.eclipse.emf.mwe.core.lib.Mwe2Bridge.invoke(Mwe2Bridge.java:34)
    at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:212)
    at org.eclipse.emf.mwe2.runtime.workflow.AbstractCompositeWorkflowComponent.invoke(AbstractCompositeWorkflowComponent.java:37)
    at org.eclipse.emf.mwe2.runtime.workflow.Workflow.run(Workflow.java:20)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:102)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:62)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:52)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.run(Mwe2Launcher.java:78)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.main(Mwe2Launcher.java:36)
Caused by: java.io.FileNotFoundException: C:UsersMichelMestraDmxLightShowmestra.dmxlightshow..mestra.dmxlightshowsrc-genmestraparserantlrinternalInternalDmxLightShowLexer.java (The system cannot find the file specified)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at com.google.common.io.Files$FileByteSource.openStream(Files.java:120)
    at com.google.common.io.Files$FileByteSource.read(Files.java:144)
    at com.google.common.io.Files.toByteArray(Files.java:248)
    at org.eclipse.xtext.generator.JavaIoFileSystemAccess.readTextFile(JavaIoFileSystemAccess.java:259)
    ... 18 more
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:104)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:62)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:52)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.run(Mwe2Launcher.java:78)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.main(Mwe2Launcher.java:36)
Caused by: java.lang.RuntimeException: 
[ERROR]: GeneratorException: (Element: -UNKNOWN-; Reported by: XtextGenerator)
     org.eclipse.xtext.util.RuntimeIOException: java.io.FileNotFoundException: C:UsersMichelMestraDmxLightShowmestra.dmxlightshow..mestra.dmxlightshowsrc-genmestraparserantlrinternalInternalDmxLightShowLexer.java (The system cannot find the file specified)
    at org.eclipse.xtext.generator.JavaIoFileSystemAccess.readTextFile(JavaIoFileSystemAccess.java:263)
    at org.eclipse.xtext.generator.AbstractFileSystemAccess2.readTextFile(AbstractFileSystemAccess2.java:45)
    at org.eclipse.xtext.xtext.generator.parser.antlr.AbstractAntlrGeneratorFragment2.improveCodeQuality(AbstractAntlrGeneratorFragment2.java:222)
    at org.eclipse.xtext.xtext.generator.parser.antlr.AbstractAntlrGeneratorFragment2.splitParserAndLexerIfEnabled(AbstractAntlrGeneratorFragment2.java:213)
    at org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2.generateProductionGrammar(XtextAntlrGeneratorFragment2.java:194)
    at org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2.doGenerate(XtextAntlrGeneratorFragment2.java:156)
    at org.eclipse.xtext.xtext.generator.parser.antlr.AbstractAntlrGeneratorFragment2.generate(AbstractAntlrGeneratorFragment2.java:109)
    at org.eclipse.xtext.xtext.generator.CompositeGeneratorFragment2.generate(CompositeGeneratorFragment2.java:50)
    at org.eclipse.xtext.xtext.generator.XtextGenerator.invokeInternal(XtextGenerator.java:230)
    at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:132)
    at org.eclipse.emf.mwe.core.lib.Mwe2Bridge.invoke(Mwe2Bridge.java:34)
    at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:212)
    at org.eclipse.emf.mwe2.runtime.workflow.AbstractCompositeWorkflowComponent.invoke(AbstractCompositeWorkflowComponent.java:37)
    at org.eclipse.emf.mwe2.runtime.workflow.Workflow.run(Workflow.java:20)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:102)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:62)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:52)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.run(Mwe2Launcher.java:78)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.main(Mwe2Launcher.java:36)
Caused by: java.io.FileNotFoundException: C:UsersMichelMestraDmxLightShowmestra.dmxlightshow..mestra.dmxlightshowsrc-genmestraparserantlrinternalInternalDmxLightShowLexer.java (The system cannot find the file specified)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at com.google.common.io.Files$FileByteSource.openStream(Files.java:120)
    at com.google.common.io.Files$FileByteSource.read(Files.java:144)
    at com.google.common.io.Files.toByteArray(Files.java:248)
    at org.eclipse.xtext.generator.JavaIoFileSystemAccess.readTextFile(JavaIoFileSystemAccess.java:259)
    ... 18 more
    at org.eclipse.emf.mwe.core.lib.Mwe2Bridge.handleIssues(Mwe2Bridge.java:59)
    at org.eclipse.emf.mwe.core.lib.Mwe2Bridge.invoke(Mwe2Bridge.java:51)
    at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:212)
    at org.eclipse.emf.mwe2.runtime.workflow.AbstractCompositeWorkflowComponent.invoke(AbstractCompositeWorkflowComponent.java:37)
    at org.eclipse.emf.mwe2.runtime.workflow.Workflow.run(Workflow.java:20)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:102)
    ... 4 more
您也可以

更改元模型

TriggersAndCommands:
triggerOrCommand=[TriggerOrCommand];
TriggerOrCommand:
    Trigger | Command;

如果我说出这两种可能性,那么异常不会显示:

TriggersAndCommands:
  ('trigger' trigger=[Trigger]) | ('command' command=[Command]);

但是,"缺点"是需要额外的"触发器"和"命令"关键字。

因此,我认为这是一种解决方法。我希望其他人有更好的解决方案。(尽管就我而言,拥有额外的关键字看起来并不那么糟糕(。

最新更新