|
|
|
|
|
|
Re: XText grammar - pass EObject type as method parameter [message #1716865 is a reply to message #1716266] |
Tue, 08 December 2015 16:51 |
sam narayan 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 #1716870 is a reply to message #1716867] |
Tue, 08 December 2015 17:17 |
|
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
|
|
|
|
Powered by
FUDForum. Page generated in 0.03537 seconds