Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » TMF (Xtext) » XText grammar - pass EObject type as method parameter
XText grammar - pass EObject type as method parameter [message #1716181] Wed, 02 December 2015 01:07 Go to next message
sam narayan is currently offline sam narayanFriend
Messages: 11
Registered: June 2015
Junior Member
Hi readers,

Am beginning to explore XText 2.8.4 with XBase for my language.

I would like to have user defined functions in XText that takes in a parameter as an EObject type.
Model:
	greetings+=Greeting*;
Greeting:
	'greeting' name=ID '{'
	definitions += Definition*
'}';
Definition:
	'def' name = ValidID '(' (params+=([Greeting]))')'
(':' type=[Greeting])?
body = XBlockExpression	
;

In the corresponding "MyDslJvmModelInferrer.xtend", I have the following code. I get an error ("The method parameterType is undefined in MyDslJvmModelInferrer") in the p.parameterType - I do not know how to access an EObject - Greeting as a parameter of this user defined method. Any help is greatly appreciated.

   	 	def dispatch void infer(Greeting greeting, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
   		
   		acceptor.accept(greeting.toClass(greeting.name))[
   			for (d:greeting.definitions){
   				members += greeting.toMethod(d.name, d.type)[
   					for (p : d.params){
   						parameters += p.toParameter(p.name, p.parameterType)
   					}
   					body = d.body
   				]
   			}
   		]

Re: XText grammar - pass EObject type as method parameter [message #1716192 is a reply to message #1716181] Wed, 02 December 2015 05:48 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
Am not sure if i get you but maybe you mean

P.name.typeRef instead


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: XText grammar - pass EObject type as method parameter [message #1716256 is a reply to message #1716192] Wed, 02 December 2015 14:07 Go to previous messageGo to next message
sam narayan is currently offline sam narayanFriend
Messages: 11
Registered: June 2015
Junior Member
Hi Christian,

Thank you so much Smile the following works now.

The dsl grammar now has:

BuiltInFunction:
	'op' name = ValidID '('(params+=[Greeting] (',' params+=[Greeting])*)? ')'
	(':' type=Greeting)?
	body=XBlockExpression
;


and my inferrer has:

members += greeting.toMethod(....)
parameters += p.toParameter(greeting.name, greeting.name.typeRef())


and the dsl has the following were "Welcom" is the Greeting:
op displayGreeting (Welcom) {
return false;	
}


Christian, now that I have a user defined function, could you please point me to how I can call this function executeTest(Greeting) from the same script within my DSL?

Thanks in advance for your time.
Re: XText grammar - pass EObject type as method parameter [message #1716261 is a reply to message #1716256] Wed, 02 December 2015 14:35 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
body = '''
//impl here
'''


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: XText grammar - pass EObject type as method parameter [message #1716265 is a reply to message #1716261] Wed, 02 December 2015 15:04 Go to previous messageGo to next message
sam narayan is currently offline sam narayanFriend
Messages: 11
Registered: June 2015
Junior Member
Hi Christian,

Sorry for the typo. (it is not executeTest(Greeting), but displayGreeting(Greeting)).

Please see below an example. This function call is what I would like to implement in the XText grammar and the inferrer, which I tried without success...

In my dsl (test.myDsl),

Greeting welcome {

boolean isDisplayed = displayGreeting(Welcom);
...
...
...
op displayGreeting (Welcom) {
return false;	
}
}
Re: XText grammar - pass EObject type as method parameter [message #1716266 is a reply to message #1716265] Wed, 02 December 2015 15:10 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
then i do not get your question. pleases share all needed to reproduce (grammar inferrer etc)

Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: XText grammar - pass EObject type as method parameter [message #1716865 is a reply to message #1716266] Tue, 08 December 2015 16:51 Go to previous messageGo to next message
sam narayan is currently offline sam narayanFriend
Messages: 11
Registered: June 2015
Junior Member
Hi Christian,

Thanks much. I have unfortunately not succeeded in making the function call to my user defined function from within my DSL script. Please find attached the grammar, inferrer code:

MyDsl.xtext:

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.xbase.Xbase
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"

Greeting:
	'greeting' name = ID '{'
		methods += Method* 
		body=XExpressionInClosure
'}'
;
Method:
	 UserDefinedFunction | BuiltInFunction 
;
BuiltInFunction:
	'op' name = ValidID '('(params+=[Greeting] (',' params+=[Greeting])*)? ')'
	(':' type=Greeting)?
	body=XBlockExpression
;
UserDefinedFunction:
	'def' name = ID '('(params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')'
	(':' type=JvmTypeReference)?
	body=XBlockExpression
	;


MyDslJvmModelInferrer.xtend:
def dispatch void infer(Greeting greeting, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
			acceptor.accept(greeting.toClass(greeting.name)) [
				members += greeting.toConstructor()[]
					for (m : greeting.methods) {	  		 		
   		 		switch m {
   		 			UserDefinedFunction : {
   		 				members += greeting.toMethod(m.name, m.type ?: inferredType) [
   						for (p : m.params) {
   							parameters += p.toParameter(p.name, p.parameterType)
   						}
   						body = m.body
   						]
   	   				}
   	   				BuiltInFunction	: {
   	   					members += greeting.toMethod(m.name, boolean.typeRef() ?: inferredType) [
   	   					for (p: m.params) {
   	   					parameters += p.toParameter(greeting.name, greeting.name.typeRef())
   	   					}
   	   					body = m.body
   	   					]
   	   				}			
   	   			}
   		 	}
	    			members += greeting.toMethod("display", boolean.typeRef()) [
  					body = '''
  					'''
  					]
			]
   			}


Goal - To call the user defined function and return a value, which can be evaluated within my dsl script, eg below: call displayGreeting(welcomeGreeting) method and return a result back to evaluate.

greeting welcomeGreeting {

var isGreetingDisplayed = false;

isGreetingDisplayed = displayGreeting(welcomeGreeting)  
....
....
...

[b]<----ERROR - no viable alternative at input 'op'[/b]
op displayGreeting(welcomeGreeting) {
	
	if (welcomeGreeting.isDisplayed) { 
		//do something
	} else {
		//do something
	}
	return result;
}	
}


Many thanks in advance again for your time and continued support.
Re: XText grammar - pass EObject type as method parameter [message #1716867 is a reply to message #1716865] Tue, 08 December 2015 17:04 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
You have to alliw assignments or variabledecls in your grammar. I do not even seee a tr to do so

Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: XText grammar - pass EObject type as method parameter [message #1716870 is a reply to message #1716867] Tue, 08 December 2015 17:17 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
maybe you want to have

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.xbase.Xbase

generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
import "http://www.eclipse.org/xtext/xbase/Xbase" as xbase

Greeting:
	'greeting' name = ID '{'
		body=XBlockExpressionWithoutBraces
		methods += Method* 
'}'
;

XBlockExpressionWithoutBraces returns xbase::XExpression: 
	{xbase::XBlockExpression}
		(expressions+=XExpressionOrVarDeclaration ';'?)*
	;

Method:
	 UserDefinedFunction | BuiltInFunction 
;
BuiltInFunction:
	'op' name = ValidID '('(params+=[Greeting] (',' params+=[Greeting])*)? ')'
	(':' type=Greeting)?
	body=XBlockExpression
;
UserDefinedFunction:
	'def' name = ID '('(params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')'
	(':' type=JvmTypeReference)?
	body=XBlockExpression
	;



/*
 * generated by Xtext 2.9.0
 */
package org.xtext.example.mydsl.jvmmodel

import com.google.inject.Inject
import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer
import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor
import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder
import org.xtext.example.mydsl.myDsl.BuiltInFunction
import org.xtext.example.mydsl.myDsl.Greeting
import org.xtext.example.mydsl.myDsl.UserDefinedFunction

/**
 * <p>Infers a JVM model from the source model.</p> 
 *
 * <p>The JVM model should contain all elements that would appear in the Java code 
 * which is generated from the source model. Other models link against the JVM model rather than the source model.</p>     
 */
class MyDslJvmModelInferrer extends AbstractModelInferrer {

    /**
     * convenience API to build and initialize JVM types and their members.
     */
	@Inject extension JvmTypesBuilder

	def dispatch void infer(Greeting greeting, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
			acceptor.accept(greeting.toClass(greeting.name)) [
				members += greeting.toConstructor()[]
					for (m : greeting.methods) {	  		 		
   		 		switch m {
   		 			UserDefinedFunction : {
   		 				members += greeting.toMethod(m.name, m.type ?: inferredType) [
   						for (p : m.params) {
   							parameters += p.toParameter(p.name, p.parameterType)
   						}
   						body = m.body
   						]
   	   				}
   	   				BuiltInFunction	: {
   	   					members += greeting.toMethod(m.name, boolean.typeRef() ?: inferredType) [
   	   					for (p: m.params) {
   	   					parameters += p.toParameter(greeting.name, greeting.name.typeRef())
   	   					}
   	   					body = m.body
   	   					]
   	   				}			
   	   			}
   		 	}
	    			members += greeting.toMethod("display", boolean.typeRef()) [
  					body =  greeting.body
  					]
			]
   			}
}



(you cannot wildly mix ops and variables


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: XText grammar - pass EObject type as method parameter [message #1716986 is a reply to message #1716870] Wed, 09 December 2015 13:20 Go to previous message
sam narayan is currently offline sam narayanFriend
Messages: 11
Registered: June 2015
Junior Member
Hi Christian,

Thank you very much! This is what exactly I was looking for!

We just want the user to be able to define custom functions in the script and being able to call them and evaluate the result.

If with this approach, you think that we are mixing the ops and variables and is not a best practice kindly let me know.

Once again, thanks a lot, we can close this issue as resolved Smile

Previous Topic:Please check if using xtext is suitable in my case
Next Topic:Survey about new tool for modelling and DSL design
Goto Forum:
  


Current Time: Tue Apr 23 08:38:16 GMT 2024

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

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

Back to the top