access to String ATL [message #1746992] |
Tue, 08 November 2016 12:01 |
salha salha Messages: 97 Registered: February 2016 |
Member |
|
|
when i generate getRule1() :
lazy rule Rule2Rule{
from f:GrammAcme!Rule
to t:MMAcme!Rule(
ruletext<-thisModule.getRule1()
)}
helper def: getRule1(f:GrammAcme!Rule):String=
if not f.designRuleExpression.qt.formalParam.oclIsUndefined() then
if not f.designRuleExpression.qt.designRuleExpression.qb.oclIsUndefined() then
if not f.designRuleExpression.qt.designRuleExpression.qb.orExpression.impliesExpression.iffExpression.equalityExpression.relationalExpression.additiveExpression
.multiplicativeExpression.unaryExpression.primitiveExpression.ruleExpression.oclIsUndefined() then
if not f.designRuleExpression.qt.designRuleExpression.qb.orExpression.impliesExpression.iffExpression.equalityExpression.relationalExpression.additiveExpression
.multiplicativeExpression.unaryExpression.primitiveExpression.ruleExpression.qb.orExpression.impliesExpression.iffExpression.equalityExpression.relationalExpression
.additiveExpression.multiplicativeExpression.unaryExpression.primitiveExpression.id.oclIsUndefined() then
f.nameRule +' '+ '='+' ' + f.typeRule +' '+ f.designRuleExpression.qt.typeExp + ' '+ f.designRuleExpression.qt.nameComponent
+ ' '+':'+' ' +f.designRuleExpression.qt.formalParam.type
+ ' '+'in'+ ' '+ f.designRuleExpression.qt.setExpression.nameSetReference
+'.' + f.designRuleExpression.qt.setExpression.set.toString().regexReplaceAll('Sequence',' ').replaceAll('{',' ').replaceAll('}',' ').replaceAll('\'',' ').trim()
+' '+'|' +' '+'('+
f.designRuleExpression.qt.designRuleExpression.qb.orExpression.impliesExpression.iffExpression.equalityExpression.relationalExpression.additiveExpression
.multiplicativeExpression.unaryExpression.primitiveExpression.ruleExpression.qb.orExpression.impliesExpression.iffExpression.equalityExpression.relationalExpression
.additiveExpression.multiplicativeExpression.unaryExpression.primitiveExpression.id.idName+'.'+f.designRuleExpression.qt.designRuleExpression.qb.orExpression.impliesExpression.iffExpression.equalityExpression.relationalExpression.additiveExpression
.multiplicativeExpression.unaryExpression.primitiveExpression.ruleExpression.qb.orExpression.impliesExpression.iffExpression.equalityExpression.relationalExpression
.additiveExpression.multiplicativeExpression.unaryExpression.primitiveExpression.id.iddNames.toString().regexReplaceAll('Sequence',' ').replaceAll('{',' ').replaceAll('}',' ').replaceAll('\'',' ').trim()
+')'+' '+'=='
else OclUndefined endif
else OclUndefined endif
else OclUndefined endif
else OclUndefined endif
;
here i don't have a problem and i have this result :
Quote:
<rules ruletext="rule10 = invariant forall ps : PortTWSService in self.PORTS | (ps.Prec) =="/>
when i generate getRule3() i don't have a problem
lazy rule Rule2Rule{
from f:GrammAcme!Rule
to t:MMAcme!Rule(
ruletext<-thisModule.getRule3()
)}
helper def: getRule3(f:GrammAcme!Rule):String=
if not f.oclIsUndefined() then
if not f.designRuleExpression.qt.designRuleExpression.oclIsUndefined() then
if not f.designRuleExpression.qt.designRuleExpression.qb.oclIsUndefined() then
if not f.designRuleExpression.qt.designRuleExpression.qb.orExpression.impliesExpression.iffExpression.equalityExpression.relationalExpression.additiveExpression
.multiplicativeExpression.unaryExpression.primitiveExpression.ruleExpression.oclIsUndefined() then
if not f.designRuleExpression.qt.designRuleExpression.qb.orExpression.impliesExpression.iffExpression.equalityExpression.relationalExpression.additiveExpression
.multiplicativeExpression.unaryExpression.primitiveExpression.ruleExpression.qb.orExpression.impliesExpression.iffExpression.equalityExpression.relationalExpressions->first().
oclIsUndefined() then
f.designRuleExpression.qt.designRuleExpression.qb.orExpression.impliesExpression.iffExpression.equalityExpression.relationalExpression.additiveExpression
.multiplicativeExpression.unaryExpression.primitiveExpression.ruleExpression.qb.orExpression.impliesExpression.iffExpression.equalityExpression.relationalExpressions->first().
additiveExpression.multiplicativeExpression.unaryExpression.primitiveExpression.id.idName
else OclUndefined endif
else OclUndefined endif
else OclUndefined endif
else OclUndefined endif
else OclUndefined endif ; ;
i have this result :
Quote:
<rules ruletext="activer"/>
but when i concat getRule3() + getRule1() like this :
lazy rule Rule2Rule{
from f:GrammAcme!Rule
to t:MMAcme!Rule(
ruletext<-thisModule.getRule1()+thisModule.getRule3()
)}
i have this problem :
Quote:
org.eclipse.m2m.atl.engine.emfvm.VMException: Operation not found: OclUndefined.+(org.eclipse.m2m.atl.engine.emfvm.lib.OclUndefined)
at Rule2Rule#296(Acme2Acme.atl[116:2-116:47])
local variables: self=Acme2Acme : ASMModule, f=IN!<unnamed>, t=OUT!<unnamed>
at Family2Family#113(Acme2Acme.atl[28:32-28:55])
local variables: self=Acme2Acme : ASMModule, f=IN!<unnamed>, q=IN!<unnamed>, j=OUT!WSM, e=IN!<unnamed>
at __applyFamily2AcmeFile#24(Acme2Acme.atl[12:17-12:46])
local variables: self=Acme2Acme : ASMModule, link=TransientLink {rule = Family2AcmeFile, sourceElements = {q = org.eclipse.emf.ecore.impl.DynamicEObjectImpl@9a6d8c (eClass: org.eclipse.emf.ecore.impl.EClassImpl@1a36881 (name: FamilyBody) (instanceClassName: null) (abstract: false, interface: false)), f = org.eclipse.emf.ecore.impl.DynamicEObjectImpl@11642c7 (eClass: org.eclipse.emf.ecore.impl.EClassImpl@8201b4 (name: Family) (instanceClassName: null) (abstract: false, interface: false))}, targetElements = {j = org.eclipse.emf.ecore.impl.DynamicEObjectImpl@d60adf (eClass: org.eclipse.emf.ecore.impl.EClassImpl@14f5028 (name: AcmeFile) (instanceClassName: null) (abstract: false, interface: false))}, variables = {}}, f=IN!<unnamed>, q=IN!<unnamed>, j=OUT!WSM
at __exec__#8(Acme2Acme.atl)
local variables: self=Acme2Acme : ASMModule, e=TransientLink {rule = Family2AcmeFile, sourceElements = {q = org.eclipse.emf.ecore.impl.DynamicEObjectImpl@9a6d8c (eClass: org.eclipse.emf.ecore.impl.EClassImpl@1a36881 (name: FamilyBody) (instanceClassName: null) (abstract: false, interface: false)), f = org.eclipse.emf.ecore.impl.DynamicEObjectImpl@11642c7 (eClass: org.eclipse.emf.ecore.impl.EClassImpl@8201b4 (name: Family) (instanceClassName: null) (abstract: false, interface: false))}, targetElements = {j = org.eclipse.emf.ecore.impl.DynamicEObjectImpl@d60adf (eClass: org.eclipse.emf.ecore.impl.EClassImpl@14f5028 (name: AcmeFile) (instanceClassName: null) (abstract: false, interface: false))}, variables = {}}
at main#27(Acme2Acme.atl)
local variables: self=Acme2Acme : ASMModule
i don'tt unrestand wahat is the problem ??????
[Updated on: Thu, 10 November 2016 01:08] Report message to a moderator
|
|
|
|
|
Re: problem string concat operation OclUndefined ? [message #1747144 is a reply to message #1747041] |
Thu, 10 November 2016 08:21 |
|
ATL dynamically looks up the '+' method, based on its arguments (unlike Java, which looks up methods statically). If your first String argument is OclUndefined at runtime, ATL tries to find '+' on OclUndefined, which does not exist.
The easiest solution is to return empty strings instead of OclUndefined in thisModule.getRule1() and thisModule.getRule3(). Alternatively, you have to perform oclIsUndefined() checks on both values before calling '+'.
Cheers,
Dennis
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.03681 seconds