[Xtext 2.1.1] interface segregation [message #761143] |
Mon, 05 December 2011 19:50  |
Eclipse User |
|
|
|
Hey,
I'm facing some problems with interface segregation. If one defines interfaces as unused grammar rules syntactic predicates / backtracking also has to be used. This enlarges the generated code of ...ui.contentassist.antlr.internal.InternalSomeViewLanguageParser until that error comes up: "The code for the static initializer is exceeding the 65535 bytes limit".
The following sample grammar works but the error occures after adding a few more interfaces.
grammar org.someViewLanguage.SomeViewLanguage with org.eclipse.xtext.xbase.Xbase
generate someViewLanguage "http://www.someViewLanguage.org/SomeViewLanguage"
import "http://www.eclipse.org/xtext/xbase/Xbase" as xbase
import "http://www.eclipse.org/xtext/common/JavaVMTypes" as types
View:
'view' name=ValidID '(' (args+=FullJvmFormalParameter (',' args+=FullJvmFormalParameter)*)? ')' '{'
elements+=OuterViewElement*
'}';
OuterViewElement:
CtrlBlock | CtrlLoop | Text | Button | Table;
CtrlLoop:
(name=ValidID ':')? 'for' declaredParam=JvmFormalParameter ':' iterable=XExpression
eachElement=OuterViewElement;
CtrlBlock:
{CtrlBlock}
(name=ValidID ':')? '{'
elements+=OuterViewElement*
'}';
Table:
(name=ValidID ':')? 'table' declaredParam=JvmFormalParameter ':' iterable=XExpression
(('label' '=' label=XExpression)? &
('visible' '=' visible=XExpression)?)
'{'
columns+=Column*
'}';
Column:
{Column}
(name=ValidID ':')? 'col'
('visible' '=' visible=XExpression)?
'{'
('title' title=OuterViewElement)?
contents+=OuterViewElement*
'}';
Text:
(name=ValidID ':')? 'text'
(label=XExpression &
('visible' '=' visible=XExpression)?);
Button:
(name=ValidID ':')? 'button'
label=XExpression
('action' '=' action=XExpression &
('visible' '=' visible=XExpression)? &
('disabled' '=' disabled=XExpression)?);
/*
* begin cross-cutting interfaces
*/
ViewElement:
name=ValidID | OuterViewElement | =>(HideableViewElement | =>(=>DeactivatableViewElement | LoopViewElement));
LabeledViewElement:
ViewElement | label=XExpression | Button | Table;
HideableViewElement:
visible=XExpression | Button | Table | Column;
DeactivatableViewElement:
disabled=XExpression | Button;
LoopViewElement:
iterable=XExpression declaredParam=JvmFormalParameter | =>(CtrlLoop | Table);
/*
* end cross-cutting interfaces
*/
Is there a better way to add such rule independent interfaces without generating unused code that produces fatal errors?
I've already split my grammar in a model language and an extending view language but it doesn't make the parser code shorter. I've also tried to set classSplitting = true option in the XtextAntlrGeneratorFragment but I do not see any change. How to minimize the initializer code?
Please help!!!
regards,
Max
[Updated on: Thu, 08 December 2011 14:54] by Moderator
|
|
|
|
|
|
|
Re: [Xtext 2.1.1] interface segregation with unused grammar rules [message #762104 is a reply to message #762065] |
Wed, 07 December 2011 09:55   |
Eclipse User |
|
|
|
Hey Sebastian,
Everything in this thread is a minimal example but 1st post contained errors and I minimalized it once again with the same result:
grammar org.someViewLanguage.SomeViewLanguage with org.eclipse.xtext.xbase.Xbase
//generate someViewLanguage "http://www.someViewLanguage.org/SomeViewLanguage"
import "http://www.someViewLanguage.org/SomeViewLanguage"
import "http://www.eclipse.org/xtext/xbase/Xbase" as xbase
import "http://www.eclipse.org/xtext/common/JavaVMTypes" as types
View:
'view' name=ValidID '(' (args+=FullJvmFormalParameter (',' args+=FullJvmFormalParameter)*)? ')' '{'
elements+=OuterViewElement*
'}';
OuterViewElement:
Table;
Table:
(name=ValidID ':')? 'table' declaredParam=JvmFormalParameter ':' iterable=XExpression
('label' '=' label=XExpression)?
'{'
columns+=Column*
'}';
Column:
{Column}
(name=ValidID ':')? 'col' '{'
('title' title=OuterViewElement)?
contents+=OuterViewElement*
'}';
// begin cross-cutting interfaces
/*ViewElement:
name=ValidID | OuterViewElement | LabeledViewElement | LoopViewElement | Column;
LabeledViewElement:
label=XExpression | Table;
LoopViewElement:
iterable=XExpression declaredParam=JvmFormalParameter | Table;*/
* I have used the outcommented parts of the grammar to generate the ecore model in a first step
Simply, I created a new Xtext project org.someViewLanguage.SomeViewLanguage with that grammar. Afterwards I perform the steps given in the 3rd post to use a generated epackage in the grammar instead of generating it by
- moving the generated ecore + genmodel from src-gen to src, changing relative references to jvmtypes and xbase to platform:/plugin/...,
- setting some of the classes to interfaces + abstract,
- changing path of the Model Directory in the genmodel from src-gen/... to src/...,
- refreshing and generating the genmodel,
- removing all unused grammar rules used to define the interfaces
- replace generate ... with import .... in the grammar
- add the following to standalone setup of workflow:
registerGeneratedEPackage = "org.someViewLanguage.someViewLanguage.SomeViewLanguagePackage"
registerGenModelFile = "platform:/resource/org.someViewLanguage/model/SomeViewLanguage.genmodel"
But generating Xtext artifacts leads me to the NullPointerException listed in the 3rd post and creating a new Xtext Project from (the just generated and changed) Ecore Model results with the message dialog "Nullevaluation!" in the Wizard and the following exception:
71934 [main] ERROR org.eclipse.xtext.ui.wizard.XtextNewProjectWizard -
java.lang.reflect.InvocationTargetException
at org.eclipse.xtext.ui.wizard.XtextNewProjectWizard$1.run(XtextNewProjectWizard.java:57)
at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
Caused by: EvaluationException : Nullevaluation!
org::eclipse::xtext::xtext::ui::wizard::ecore2xtext::Ecore2Xtext.xpt[2530,21] on line 73 'needsDispatcherRule()'
org::eclipse::xtext::xtext::ui::wizard::ecore2xtext::Ecore2Xtext.xpt[997,89] on line 22 'EXPAND subClassDispatcherRule FOREACH allDispatcherRuleClasses().remove(rootElementClass)'
org::eclipse::xtext::xtext::ui::wizard::ecore2xtext::Ecore2XtextDslProject.xpt[748,27] on line 18 'EXPAND Ecore2Xtext::grammar'
at org.eclipse.internal.xpand2.ast.IfStatement.evaluateInternal(IfStatement.java:88)
at org.eclipse.internal.xpand2.ast.Statement.evaluate(Statement.java:41)
at org.eclipse.internal.xpand2.ast.AbstractDefinition.evaluate(AbstractDefinition.java:180)
at org.eclipse.internal.xpand2.ast.ExpandStatement.invokeDefinition(ExpandStatement.java:246)
at org.eclipse.internal.xpand2.ast.ExpandStatement.evaluateInternal(ExpandStatement.java:191)
at org.eclipse.internal.xpand2.ast.Statement.evaluate(Statement.java:41)
at org.eclipse.internal.xpand2.ast.FileStatement.evaluateInternal(FileStatement.java:86)
at org.eclipse.internal.xpand2.ast.Statement.evaluate(Statement.java:41)
at org.eclipse.internal.xpand2.ast.AbstractDefinition.evaluate(AbstractDefinition.java:180)
at org.eclipse.internal.xpand2.ast.ExpandStatement.invokeDefinition(ExpandStatement.java:246)
at org.eclipse.internal.xpand2.ast.ExpandStatement.evaluateInternal(ExpandStatement.java:226)
at org.eclipse.internal.xpand2.ast.Statement.evaluate(Statement.java:41)
at org.eclipse.internal.xpand2.ast.AbstractDefinition.evaluate(AbstractDefinition.java:180)
at org.eclipse.xpand2.XpandFacade.evaluate2(XpandFacade.java:62)
at org.eclipse.xpand2.XpandFacade.evaluate(XpandFacade.java:43)
at org.eclipse.xtext.xtext.ui.wizard.project.XtextProjectCreator.createProject(XtextProjectCreator.java:259)
at org.eclipse.xtext.xtext.ui.wizard.project.XtextProjectCreator.createDslProject(XtextProjectCreator.java:155)
at org.eclipse.xtext.xtext.ui.wizard.project.XtextProjectCreator.execute(XtextProjectCreator.java:94)
at org.eclipse.ui.actions.WorkspaceModifyOperation$1.run(WorkspaceModifyOperation.java:106)
at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2344)
at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:118)
at org.eclipse.xtext.ui.wizard.XtextNewProjectWizard.doFinish(XtextNewProjectWizard.java:82)
at org.eclipse.xtext.ui.wizard.XtextNewProjectWizard$1.run(XtextNewProjectWizard.java:54)
... 1 more
...so that a new xtext project from my existing Ecore Model cannot be created.
My generated and changed Ecore model from the example grammar looks as follows:
<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="someViewLanguage"
nsURI="http://www.someViewLanguage.org/SomeViewLanguage" nsPrefix="someViewLanguage">
<eClassifiers xsi:type="ecore:EClass" name="View">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="args" upperBound="-1" eType="ecore:EClass platform:/plugin/org.eclipse.xtext.common.types/model/JavaVMTypes.ecore#//JvmFormalParameter"
containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="elements" upperBound="-1"
eType="#//OuterViewElement" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="OuterViewElement" abstract="true" interface="true"
eSuperTypes="#//ViewElement"/>
<eClassifiers xsi:type="ecore:EClass" name="Table" eSuperTypes="#//OuterViewElement #//LabeledViewElement #//LoopViewElement">
<eStructuralFeatures xsi:type="ecore:EReference" name="columns" upperBound="-1"
eType="#//Column" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Column" eSuperTypes="#//ViewElement">
<eStructuralFeatures xsi:type="ecore:EReference" name="title" eType="#//OuterViewElement"
containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="contents" upperBound="-1"
eType="#//OuterViewElement" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ViewElement" abstract="true" interface="true">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="LabeledViewElement" abstract="true"
interface="true" eSuperTypes="#//ViewElement">
<eStructuralFeatures xsi:type="ecore:EReference" name="label" eType="ecore:EClass platform:/plugin/org.eclipse.xtext.xbase/model/Xbase.ecore#//XExpression"
containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="LoopViewElement" abstract="true" interface="true"
eSuperTypes="#//ViewElement">
<eStructuralFeatures xsi:type="ecore:EReference" name="iterable" eType="ecore:EClass platform:/plugin/org.eclipse.xtext.xbase/model/Xbase.ecore#//XExpression"
containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="declaredParam" eType="ecore:EClass platform:/plugin/org.eclipse.xtext.common.types/model/JavaVMTypes.ecore#//JvmFormalParameter"
containment="true"/>
</eClassifiers>
</ecore:EPackage>
Help please! That cannot be that difficult. I would like to understand my mistake.
regards,
Max
[Updated on: Wed, 07 December 2011 10:00] by Moderator
|
|
|
Re: [Xtext 2.1.1] interface segregation with unused grammar rules [message #762207 is a reply to message #762104] |
Wed, 07 December 2011 12:41   |
Eclipse User |
|
|
|
Max,
the workflow would be helpful. Do you use scanClasspath=true in the
standalone setup?
Regards,
Sebastian
--
Need professional support for Eclipse Modeling?
Go visit: http://xtext.itemis.com
Am 07.12.11 15:55, schrieb Max:
> Hey Sebastian,
>
> Everything in this thread is a minimal example but 1st post contained
> errors and I minimalized it once again with the same result:
> grammar org.someViewLanguage.SomeViewLanguage with
> org.eclipse.xtext.xbase.Xbase
>
> //generate someViewLanguage
> "http://www.someViewLanguage.org/SomeViewLanguage"
>
> import "http://www.someViewLanguage.org/SomeViewLanguage"
> import "http://www.eclipse.org/xtext/xbase/Xbase" as xbase
> import "http://www.eclipse.org/xtext/common/JavaVMTypes" as types
>
> View:
> 'view' name=ValidID '(' (args+=FullJvmFormalParameter (','
> args+=FullJvmFormalParameter)*)? ')' '{'
> elements+=OuterViewElement*
> '}';
>
> OuterViewElement:
> Table;
>
> Table:
> (name=ValidID ':')? 'table' declaredParam=JvmFormalParameter ':'
> iterable=XExpression
> ('label' '=' label=XExpression)?
> '{'
> columns+=Column*
> '}';
>
> Column:
> {Column}
> (name=ValidID ':')? 'col' '{'
> ('title' title=OuterViewElement)?
> contents+=OuterViewElement*
> '}';
>
> // begin cross-cutting interfaces
> /*ViewElement:
> name=ValidID | OuterViewElement | LabeledViewElement | LoopViewElement |
> Column;
>
> LabeledViewElement:
> label=XExpression | Table;
>
> LoopViewElement:
> iterable=XExpression declaredParam=JvmFormalParameter | Table;*/
> * I have used the outcommented parts of the grammar to generate the
> ecore model in a first step
>
> Simply, I created a new Xtext project
> org.someViewLanguage.SomeViewLanguage with that grammar. Afterwards I
> perform the steps given in the 3rd post to use a generated epackage in
> the grammar instead of generating it by
> - moving the generated ecore + genmodel from src-gen to src, changing
> relative references to jvmtypes and xbase to platform:/plugin/...,
> - setting some of the classes to interfaces + abstract,
> - changing path of the Model Directory in the genmodel from src-gen/...
> to src/...,
> - refreshing and generating the genmodel,
> - removing all unused grammar rules used to define the interfaces
> - replace generate ... with import ....
> But generating Xtext artifacts leads me to the NullPointerException
> listed in the 3rd post and creating a new Xtext Project from (the just
> generated and changed) Ecore Model results with the message dialog
> "Nullevaluation!" in the Wizard and the following exception:
> 71934 [main] ERROR org.eclipse.xtext.ui.wizard.XtextNewProjectWizard -
> java.lang.reflect.InvocationTargetException
> at
> org.eclipse.xtext.ui.wizard.XtextNewProjectWizard$1.run(XtextNewProjectWizard.java:57)
>
> at
> org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
>
> Caused by: EvaluationException : Nullevaluation!
> org::eclipse::xtext::xtext::ui::wizard::ecore2xtext::Ecore2Xtext.xpt[2530,21]
> on line 73 'needsDispatcherRule()'
> org::eclipse::xtext::xtext::ui::wizard::ecore2xtext::Ecore2Xtext.xpt[997,89]
> on line 22 'EXPAND subClassDispatcherRule FOREACH
> allDispatcherRuleClasses().remove(rootElementClass)'
> org::eclipse::xtext::xtext::ui::wizard::ecore2xtext::Ecore2XtextDslProject.xpt[748,27]
> on line 18 'EXPAND Ecore2Xtext::grammar'
>
> at
> org.eclipse.internal.xpand2.ast.IfStatement.evaluateInternal(IfStatement.java:88)
>
> at org.eclipse.internal.xpand2.ast.Statement.evaluate(Statement.java:41)
> at
> org.eclipse.internal.xpand2.ast.AbstractDefinition.evaluate(AbstractDefinition.java:180)
>
> at
> org.eclipse.internal.xpand2.ast.ExpandStatement.invokeDefinition(ExpandStatement.java:246)
>
> at
> org.eclipse.internal.xpand2.ast.ExpandStatement.evaluateInternal(ExpandStatement.java:191)
>
> at org.eclipse.internal.xpand2.ast.Statement.evaluate(Statement.java:41)
> at
> org.eclipse.internal.xpand2.ast.FileStatement.evaluateInternal(FileStatement.java:86)
>
> at org.eclipse.internal.xpand2.ast.Statement.evaluate(Statement.java:41)
> at
> org.eclipse.internal.xpand2.ast.AbstractDefinition.evaluate(AbstractDefinition.java:180)
>
> at
> org.eclipse.internal.xpand2.ast.ExpandStatement.invokeDefinition(ExpandStatement.java:246)
>
> at
> org.eclipse.internal.xpand2.ast.ExpandStatement.evaluateInternal(ExpandStatement.java:226)
>
> at org.eclipse.internal.xpand2.ast.Statement.evaluate(Statement.java:41)
> at
> org.eclipse.internal.xpand2.ast.AbstractDefinition.evaluate(AbstractDefinition.java:180)
>
> at org.eclipse.xpand2.XpandFacade.evaluate2(XpandFacade.java:62)
> at org.eclipse.xpand2.XpandFacade.evaluate(XpandFacade.java:43)
> at
> org.eclipse.xtext.xtext.ui.wizard.project.XtextProjectCreator.createProject(XtextProjectCreator.java:259)
>
> at
> org.eclipse.xtext.xtext.ui.wizard.project.XtextProjectCreator.createDslProject(XtextProjectCreator.java:155)
>
> at
> org.eclipse.xtext.xtext.ui.wizard.project.XtextProjectCreator.execute(XtextProjectCreator.java:94)
>
> at
> org.eclipse.ui.actions.WorkspaceModifyOperation$1.run(WorkspaceModifyOperation.java:106)
>
> at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2344)
> at
> org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:118)
>
> at
> org.eclipse.xtext.ui.wizard.XtextNewProjectWizard.doFinish(XtextNewProjectWizard.java:82)
>
> at
> org.eclipse.xtext.ui.wizard.XtextNewProjectWizard$1.run(XtextNewProjectWizard.java:54)
>
> ... 1 more
>
> ...so that a new xtext project from my existing Ecore Model cannot be
> created.
>
> My generated and changed Ecore model from the example grammar looks as
> follows:
> <?xml version="1.0" encoding="UTF-8"?>
> <ecore:EPackage xmi:version="2.0"
> xmlns:xmi="http://www.omg.org/XMI"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="someViewLanguage"
> nsURI="http://www.someViewLanguage.org/SomeViewLanguage"
> nsPrefix="someViewLanguage">
> <eClassifiers xsi:type="ecore:EClass" name="View">
> <eStructuralFeatures xsi:type="ecore:EAttribute" name="name"
> eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
> <eStructuralFeatures xsi:type="ecore:EReference" name="args"
> upperBound="-1" eType="ecore:EClass
> platform:/plugin/org.eclipse.xtext.common.types/model/JavaVMTypes.ecore#//JvmFormalParameter"
>
> containment="true"/>
> <eStructuralFeatures xsi:type="ecore:EReference" name="elements"
> upperBound="-1"
> eType="#//OuterViewElement" containment="true"/>
> </eClassifiers>
> <eClassifiers xsi:type="ecore:EClass" name="OuterViewElement"
> abstract="true" interface="true"
> eSuperTypes="#//ViewElement"/>
> <eClassifiers xsi:type="ecore:EClass" name="Table"
> eSuperTypes="#//OuterViewElement #//LabeledViewElement #//LoopViewElement">
> <eStructuralFeatures xsi:type="ecore:EReference" name="columns"
> upperBound="-1"
> eType="#//Column" containment="true"/>
> </eClassifiers>
> <eClassifiers xsi:type="ecore:EClass" name="Column"
> eSuperTypes="#//ViewElement">
> <eStructuralFeatures xsi:type="ecore:EReference" name="title"
> eType="#//OuterViewElement"
> containment="true"/>
> <eStructuralFeatures xsi:type="ecore:EReference" name="contents"
> upperBound="-1"
> eType="#//OuterViewElement" containment="true"/>
> </eClassifiers>
> <eClassifiers xsi:type="ecore:EClass" name="ViewElement" abstract="true"
> interface="true">
> <eStructuralFeatures xsi:type="ecore:EAttribute" name="name"
> eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
> </eClassifiers>
> <eClassifiers xsi:type="ecore:EClass" name="LabeledViewElement"
> abstract="true"
> interface="true" eSuperTypes="#//ViewElement">
> <eStructuralFeatures xsi:type="ecore:EReference" name="label"
> eType="ecore:EClass
> platform:/plugin/org.eclipse.xtext.xbase/model/Xbase.ecore#//XExpression"
> containment="true"/>
> </eClassifiers>
> <eClassifiers xsi:type="ecore:EClass" name="LoopViewElement"
> abstract="true" interface="true"
> eSuperTypes="#//ViewElement">
> <eStructuralFeatures xsi:type="ecore:EReference" name="iterable"
> eType="ecore:EClass
> platform:/plugin/org.eclipse.xtext.xbase/model/Xbase.ecore#//XExpression"
> containment="true"/>
> <eStructuralFeatures xsi:type="ecore:EReference" name="declaredParam"
> eType="ecore:EClass
> platform:/plugin/org.eclipse.xtext.common.types/model/JavaVMTypes.ecore#//JvmFormalParameter"
>
> containment="true"/>
> </eClassifiers>
> </ecore:EPackage>
>
> Help please! That cannot be that difficult. I would like to understand
> my mistake.
>
> regards,
> Max
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.05067 seconds