Skip to main content



      Home
Home » Modeling » TMF (Xtext) » Creating grammar mixin
Creating grammar mixin [message #653381] Wed, 09 February 2011 10:25 Go to next message
Eclipse UserFriend
I try to mix some grammars. So I use a grammar for the Data description:

Data.xtext
grammar de.foo.common.Data with org.eclipse.xtext.common.Terminals

generate data "[url]http://www.foo.de/common/Data[/url]"

Datamodel:
  (types+=Type)*;            

Type:
  DataType | Entity;         

DataType:
  "datatype" name=ID;        

Entity:
  "entity" name=ID "{"
    (features+=Feature)*     
  "}";

Feature:
  type=[Type|ID] name=ID;



And another for the User:
User.xtext
grammar de.foo.common.User with org.eclipse.xtext.common.Terminals

generate user "[url]http://www.bizware.de/common/User[/url]"

Usermodel:
	(users+=User)*; 
  
User:  
  "User" name=ID "!";



Finally I want to reuse the definition in a new grammar Base:

Base.xtext
grammar de.foo.common.Base with de.foo.common.Data,de.foo.common.User

generate base "[url]http://www.foo.de/common/Base[/url]"

Model:
  (Datamodel|Usermodel)*;            




But Eclipse always told me that it "Couldn't resolve reference to Grammar 'de.foo.common.Data'

Here's my generator (GenerateCommon.mwe2)
module de.foo.common

import org.eclipse.emf.mwe.utils.*
import org.eclipse.xtext.generator.*
import org.eclipse.xtext.ui.generator.*

var grammarURI = "classpath:/de/foo/Base.xtext"
var file.extensions = "base.model"
var projectName = "de.foo.common"
var runtimeProject = "../${projectName}"

Workflow {
    bean = StandaloneSetup {
		platformUri = "${runtimeProject}/.."
	}

	component = DirectoryCleaner {
		directory = "${runtimeProject}/src-gen"
	}

	component = DirectoryCleaner {
		directory = "${runtimeProject}.ui/src-gen"
	}

	component = Generator {
		pathRtProject = runtimeProject
		pathUiProject = "${runtimeProject}.ui"
		projectNameRt = projectName
		projectNameUi = "${projectName}.ui"
		language = {
			uri = grammarURI
			fileExtensions = file.extensions

			// Java API to access grammar elements (required by several other fragments)
			fragment = grammarAccess.GrammarAccessFragment {}

			// generates Java API for the generated EPackages 
			fragment = ecore.EcoreGeneratorFragment {
			// referencedGenModels = "uri to genmodel, uri to next genmodel"
			}

			// the serialization component
			fragment = parseTreeConstructor.ParseTreeConstructorFragment {}

			// a custom ResourceFactory for use with EMF 
			fragment = resourceFactory.ResourceFactoryFragment {
				fileExtensions = file.extensions
			}

			// The antlr parser generator fragment.
			fragment = parser.antlr.XtextAntlrGeneratorFragment {
			//  options = {
			//		backtrack = true
			//	}
			}

			// java-based API for validation 
			fragment = validation.JavaValidatorFragment {
				composedCheck = "org.eclipse.xtext.validation.ImportUriValidator"
				composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
				// registerForImportedPackages = true
			}

			// scoping and exporting API
			// fragment = scoping.ImportURIScopingFragment {}
			// fragment = exporting.SimpleNamesFragment {}

			// scoping and exporting API 
			fragment = scoping.ImportNamespacesScopingFragment {}
			fragment = exporting.QualifiedNamesFragment {}
			fragment = builder.BuilderIntegrationFragment {}

			// formatter API 
			fragment = formatting.FormatterFragment {}

			// labeling API 
			fragment = labeling.LabelProviderFragment {}

			// outline API 
			fragment = outline.OutlineTreeProviderFragment {}
			fragment = outline.QuickOutlineFragment {}

			// quickfix API 
			fragment = quickfix.QuickfixProviderFragment {}

			// content assist API  
			fragment = contentAssist.JavaBasedContentAssistFragment {}

			// generates a more lightweight Antlr parser and lexer tailored for content assist  
			fragment = parser.antlr.XtextAntlrUiGeneratorFragment {}

			// project wizard (optional) 
			// fragment = projectWizard.SimpleProjectWizardFragment {
			// 		generatorProjectName = "${projectName}.generator" 
			//		modelFileExtension = file.extensions
			// }
		}
	}
}



Any ideas why it doesn' recognize it?

[Updated on: Wed, 09 February 2011 10:26] by Moderator

Re: Creating grammar mixin [message #653397 is a reply to message #653381] Wed, 09 February 2011 11:03 Go to previous messageGo to next message
Eclipse UserFriend
Hi Martin,

first of all: It is not possible to mixin two languages at the same time
(you should see an error marker in the editor).

You'll have to make sure that your projects are properly set up in order
to mixin another language, e.g. the project with Base has to declare a
dependency to the project that contains Data. Does that help?

Regards,
Sebastian
--
Need professional support for Eclipse Modeling?
Go visit: http://xtext.itemis.com

Am 09.02.11 16:25, schrieb Martin:
> I try to mix some grammars. So I use a grammar for the Data description:
>
> Data.xtext
> [code]
> grammar de.foo.common.Data with org.eclipse.xtext.common.Terminals
>
> generate data "http://www.foo.de/common/Data"
>
> Datamodel:
> (types+=Type)*;
> Type:
> DataType | Entity;
> DataType:
> "datatype" name=ID;
> Entity:
> "entity" name=ID "{"
> (features+=Feature)* "}";
>
> Feature:
> type=[Type|ID] name=ID;
>
> [code]
>
> And another for the User: User.xtext
> [code]
> grammar de.foo.common.User with org.eclipse.xtext.common.Terminals
>
> generate user "http://www.bizware.de/common/User"
>
> Usermodel:
> (users+=User)*;
> User: "User" name=ID "!";
>
> [code]
>
> Finally I want to reuse the definition in a new grammar Base:
>
> Base.xtext
> [code]
> grammar de.foo.common.Base with de.foo.common.Data,de.foo.common.User
>
> generate base "http://www.foo.de/common/Base"
>
> Model:
> (Datamodel|Usermodel)*;
>
> [code]
>
> But Eclipse always told me that it "Couldn't resolve reference to
> Grammar 'de.foo.common.Data'
>
> Here's my generator (GenerateCommon.mwe2)
> [code]
> module de.foo.common
>
> import org.eclipse.emf.mwe.utils.*
> import org.eclipse.xtext.generator.*
> import org.eclipse.xtext.ui.generator.*
>
> var grammarURI = "classpath:/de/foo/Base.xtext"
> var file.extensions = "base.model"
> var projectName = "de.foo.common"
> var runtimeProject = "../${projectName}"
>
> Workflow {
> bean = StandaloneSetup {
> platformUri = "${runtimeProject}/.."
> }
>
> component = DirectoryCleaner {
> directory = "${runtimeProject}/src-gen"
> }
>
> component = DirectoryCleaner {
> directory = "${runtimeProject}.ui/src-gen"
> }
>
> component = Generator {
> pathRtProject = runtimeProject
> pathUiProject = "${runtimeProject}.ui"
> projectNameRt = projectName
> projectNameUi = "${projectName}.ui"
> language = {
> uri = grammarURI
> fileExtensions = file.extensions
>
> // Java API to access grammar elements (required by several other
> fragments)
> fragment = grammarAccess.GrammarAccessFragment {}
>
> // generates Java API for the generated EPackages fragment =
> ecore.EcoreGeneratorFragment {
> // referencedGenModels = "uri to genmodel, uri to next genmodel"
> }
>
> // the serialization component
> fragment = parseTreeConstructor.ParseTreeConstructorFragment {}
>
> // a custom ResourceFactory for use with EMF fragment =
> resourceFactory.ResourceFactoryFragment {
> fileExtensions = file.extensions
> }
>
> // The antlr parser generator fragment.
> fragment = parser.antlr.XtextAntlrGeneratorFragment {
> // options = {
> // backtrack = true
> // }
> }
>
> // java-based API for validation fragment =
> validation.JavaValidatorFragment {
> composedCheck = "org.eclipse.xtext.validation.ImportUriValidator"
> composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
> // registerForImportedPackages = true
> }
>
> // scoping and exporting API
> // fragment = scoping.ImportURIScopingFragment {}
> // fragment = exporting.SimpleNamesFragment {}
>
> // scoping and exporting API fragment =
> scoping.ImportNamespacesScopingFragment {}
> fragment = exporting.QualifiedNamesFragment {}
> fragment = builder.BuilderIntegrationFragment {}
>
> // formatter API fragment = formatting.FormatterFragment {}
>
> // labeling API fragment = labeling.LabelProviderFragment {}
>
> // outline API fragment = outline.OutlineTreeProviderFragment {}
> fragment = outline.QuickOutlineFragment {}
>
> // quickfix API fragment = quickfix.QuickfixProviderFragment {}
>
> // content assist API fragment =
> contentAssist.JavaBasedContentAssistFragment {}
>
> // generates a more lightweight Antlr parser and lexer tailored for
> content assist fragment = parser.antlr.XtextAntlrUiGeneratorFragment {}
>
> // project wizard (optional) // fragment =
> projectWizard.SimpleProjectWizardFragment {
> // generatorProjectName = "${projectName}.generator" //
> modelFileExtension = file.extensions
> // }
> }
> }
> }
>
> [code]
>
> Any ideas why it doesn' recognize it?
Re: Creating grammar mixin [message #653398 is a reply to message #653397] Wed, 09 February 2011 11:21 Go to previous messageGo to next message
Eclipse UserFriend
ah okay, I get it. If I want to declare a common subset I define a own "Common" Xtext Project and then another Xtext Project where I refer via dependencies to the common grammar.
Right?

[Updated on: Thu, 10 February 2011 06:24] by Moderator

Re: Creating grammar mixin [message #653472 is a reply to message #653398] Wed, 09 February 2011 15:48 Go to previous messageGo to next message
Eclipse UserFriend
Am 09.02.11 17:21, schrieb Martin:
> ah okay, I get it. If I want to declare a common subset I define a own
> "Common" Xtext Project and then another Xtext Project where I refer via
> dependencies to the common grammar.
> Right?

That's at least the way that I prefer.
You could even use the very same Xtext project for more than one
language. It's more or less a matter of taste.

Regards,
Sebastian
--
Need professional support for Eclipse Modeling?
Go visit: http://xtext.itemis.com
Re: Creating grammar mixin [message #653598 is a reply to message #653472] Thu, 10 February 2011 06:24 Go to previous messageGo to next message
Eclipse UserFriend
what kind of dependency did I need? plugin-dependency, like this manifest.mf:
Require-Bundle: org.eclipse.xtext,
 org.eclipse.xtext.generator;resolution:=optional,
 org.eclipse.emf.codegen.ecore;resolution:=optional,
 org.eclipse.emf.mwe.utils;resolution:=optional,
 org.eclipse.emf.mwe2.launch;resolution:=optional,
 com.ibm.icu;resolution:=optional,
 de.foo.common;bundle-version="1.0.0"

[Updated on: Thu, 10 February 2011 06:24] by Moderator

Re: Creating grammar mixin [message #654127 is a reply to message #653598] Mon, 14 February 2011 04:43 Go to previous messageGo to next message
Eclipse UserFriend
Am 10.02.11 12:24, schrieb Martin:
> what kind of dependency did I need? plugin-dependency, like this
> manifest.mf:
>
> Require-Bundle: org.eclipse.xtext,
> org.eclipse.xtext.generator;resolution:=optional,
> org.eclipse.emf.codegen.ecore;resolution:=optional,
> org.eclipse.emf.mwe.utils;resolution:=optional,
> org.eclipse.emf.mwe2.launch;resolution:=optional,
> com.ibm.icu;resolution:=optional,
> de.foo.common;bundle-version="1.0.0"
> [/quote]

It always depends on the features that you use but it looks good to me
at a first glance for a normal Xtext project.

Regards,
Sebastian
--
Need professional support for Eclipse Modeling?
Go visit: http://xtext.itemis.com
Re: Creating grammar mixin [message #705416 is a reply to message #653472] Fri, 29 July 2011 17:06 Go to previous message
Eclipse UserFriend
> You could even use the very same Xtext project for more than one language.

Hi Sebastian,
Where can I find detailed instructions on this?
Previous Topic:Hierarchic (java-like) scoping
Next Topic:Local Scope and Shadowing
Goto Forum:
  


Current Time: Thu Jul 03 03:26:05 EDT 2025

Powered by FUDForum. Page generated in 0.28800 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top