Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » TMF (Xtext) » Creating grammar mixin
Creating grammar mixin [message #653381] Wed, 09 February 2011 15:25 Go to next message
Martin Mising name is currently offline Martin Mising nameFriend
Messages: 8
Registered: February 2011
Location: Hamburg
Junior Member

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 15:26]

Report message to a moderator

Re: Creating grammar mixin [message #653397 is a reply to message #653381] Wed, 09 February 2011 16:03 Go to previous messageGo to next message
Sebastian Zarnekow is currently offline Sebastian ZarnekowFriend
Messages: 3118
Registered: July 2009
Senior Member
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 16:21 Go to previous messageGo to next message
Martin Mising name is currently offline Martin Mising nameFriend
Messages: 8
Registered: February 2011
Location: Hamburg
Junior Member

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 11:24]

Report message to a moderator

Re: Creating grammar mixin [message #653472 is a reply to message #653398] Wed, 09 February 2011 20:48 Go to previous messageGo to next message
Sebastian Zarnekow is currently offline Sebastian ZarnekowFriend
Messages: 3118
Registered: July 2009
Senior Member
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 11:24 Go to previous messageGo to next message
Martin Mising name is currently offline Martin Mising nameFriend
Messages: 8
Registered: February 2011
Location: Hamburg
Junior Member

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 11:24]

Report message to a moderator

Re: Creating grammar mixin [message #654127 is a reply to message #653598] Mon, 14 February 2011 09:43 Go to previous messageGo to next message
Sebastian Zarnekow is currently offline Sebastian ZarnekowFriend
Messages: 3118
Registered: July 2009
Senior Member
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 21:06 Go to previous message
Damian Gonzalez is currently offline Damian GonzalezFriend
Messages: 4
Registered: July 2011
Junior Member
> 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: Tue Apr 23 07:32:15 GMT 2024

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

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

Back to the top