Michel Keijzers
Michel Keijzers

Reputation: 15357

How should I create an or of references in xtext?

I'm trying to make a grammar:

grammar mestra.DmxLightShow with org.eclipse.xtext.common.Terminals

generate 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 ';';

Although there is no error icon in the grammar editor, when Generate Xtext Artifacts an error is generated (the full text is at the end):

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

I guess the problem is inside the following fragment:

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

What I want it to do, is accepting a line like:

Song NameOfSong tcs Trigger1 Command2 Trigger3 sequences SequenceName;

to add later:

Command Command1;
Command Command2;
Trigger Trigger1;

How should I create the line to accomplish this?

(Full error output):

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:\Users\Michel\Mestra\DmxLightShow\mestra.dmxlightshow\..\mestra.dmxlightshow\src-gen\mestra\parser\antlr\internal\InternalDmxLightShowLexer.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:\Users\Michel\Mestra\DmxLightShow\mestra.dmxlightshow\..\mestra.dmxlightshow\src-gen\mestra\parser\antlr\internal\InternalDmxLightShowLexer.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:\Users\Michel\Mestra\DmxLightShow\mestra.dmxlightshow\..\mestra.dmxlightshow\src-gen\mestra\parser\antlr\internal\InternalDmxLightShowLexer.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:\Users\Michel\Mestra\DmxLightShow\mestra.dmxlightshow\..\mestra.dmxlightshow\src-gen\mestra\parser\antlr\internal\InternalDmxLightShowLexer.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:\Users\Michel\Mestra\DmxLightShow\mestra.dmxlightshow\..\mestra.dmxlightshow\src-gen\mestra\parser\antlr\internal\InternalDmxLightShowLexer.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:\Users\Michel\Mestra\DmxLightShow\mestra.dmxlightshow\..\mestra.dmxlightshow\src-gen\mestra\parser\antlr\internal\InternalDmxLightShowLexer.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

Upvotes: 1

Views: 115

Answers (2)

Christian Dietrich
Christian Dietrich

Reputation: 11868

you can change the metamodel as well

TriggersAndCommands:
triggerOrCommand=[TriggerOrCommand];

TriggerOrCommand:
    Trigger | Command;

Upvotes: 2

Michel Keijzers
Michel Keijzers

Reputation: 15357

If I name the two possibilities, than the exception does not show:

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

However, the 'disadvantage' is the extra 'trigger' and 'command' keywords are needed.

So I consider this as a workaround. I hope others have a better solution. (although in my case it doesn't look that bad to have the extra keywords).

Upvotes: 0

Related Questions