|
|
@@ -0,0 +1,162 @@
|
|
|
+package org.yakindu.sct.generator.sccd
|
|
|
+
|
|
|
+import org.yakindu.sct.model.stext.stext.EventValueReferenceExpression
|
|
|
+import org.yakindu.base.expressions.expressions.ParenthesizedExpression
|
|
|
+import org.yakindu.base.expressions.expressions.AssignmentExpression
|
|
|
+import org.yakindu.base.expressions.expressions.AssignmentOperator
|
|
|
+import org.yakindu.sct.model.stext.stext.EventDefinition
|
|
|
+import org.yakindu.sct.model.stext.stext.ActiveStateReferenceExpression
|
|
|
+import org.yakindu.base.expressions.expressions.ConditionalExpression
|
|
|
+import org.yakindu.base.expressions.expressions.Expression
|
|
|
+import org.yakindu.base.expressions.expressions.PrimitiveValueExpression
|
|
|
+
|
|
|
+import org.yakindu.base.expressions.expressions.UnaryExpression
|
|
|
+import org.yakindu.base.expressions.expressions.BinaryExpression
|
|
|
+import org.yakindu.base.expressions.expressions.ArgumentExpression
|
|
|
+import org.yakindu.sct.model.stext.stext.EventRaisingExpression
|
|
|
+import org.yakindu.base.expressions.expressions.FeatureCall
|
|
|
+import org.yakindu.base.expressions.expressions.ElementReferenceExpression
|
|
|
+import org.yakindu.base.types.Direction
|
|
|
+import org.yakindu.base.base.NamedElement
|
|
|
+import org.eclipse.emf.ecore.EObject
|
|
|
+import org.yakindu.sct.model.stext.stext.VariableDefinition
|
|
|
+import org.yakindu.sct.model.stext.stext.OperationDefinition
|
|
|
+import org.yakindu.base.types.Declaration
|
|
|
+
|
|
|
+class Expressions {
|
|
|
+
|
|
|
+ def static dispatch CharSequence generate(PrimitiveValueExpression it){
|
|
|
+ '''«Literals.generate(value)»'''
|
|
|
+ }
|
|
|
+
|
|
|
+ def static dispatch CharSequence generate(BinaryExpression it){
|
|
|
+ '''«Binary.generate(it)»'''
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ def static dispatch CharSequence generate(UnaryExpression it){
|
|
|
+ '''«Unary.generate(it)»'''
|
|
|
+ }
|
|
|
+
|
|
|
+ def static dispatch CharSequence generate(ArgumentExpression it){
|
|
|
+ '''«Argument.generate(it)»'''
|
|
|
+ }
|
|
|
+
|
|
|
+ def static dispatch CharSequence generate(Declaration it){
|
|
|
+ '''«Definitions.generate(it)»'''
|
|
|
+ }
|
|
|
+
|
|
|
+ def static dispatch CharSequence generate(EventRaisingExpression it){
|
|
|
+ val CharSequence nameEvent = event.generateEventForRaising
|
|
|
+ '''
|
|
|
+ «IF value === null»
|
|
|
+ <raise event="«nameEvent»" «generateScopeForRaising(it.event, nameEvent)»/>
|
|
|
+ «ELSE»
|
|
|
+ <raise event="«nameEvent»" «generateScopeForRaising(it.event, nameEvent)»>
|
|
|
+ <parameter expr="«GenerateForRaising.generateForRaising(value)»"/>
|
|
|
+ </raise>
|
|
|
+ «ENDIF»'''
|
|
|
+
|
|
|
+ }
|
|
|
+ // ########################
|
|
|
+ def static dispatch CharSequence generateEventForRaising(Expression it){
|
|
|
+ '''«it.generate»'''
|
|
|
+ }
|
|
|
+
|
|
|
+ def static dispatch CharSequence generateEventForRaising(ElementReferenceExpression it){
|
|
|
+ var nameRef = "noName"
|
|
|
+ if(it.reference instanceof NamedElement){
|
|
|
+ nameRef = (it.reference as NamedElement).name
|
|
|
+ }
|
|
|
+ '''«nameRef»'''
|
|
|
+ }
|
|
|
+
|
|
|
+ def static dispatch CharSequence generateEventForRaising(FeatureCall it){
|
|
|
+ '''«Expressions.generate(it.feature)»'''
|
|
|
+ /*val feat = it.feature
|
|
|
+ '''«IF feat instanceof EventDefinition || feat instanceof VariableDefinition || feat instanceof OperationDefinition»«Definitions.generate(feat)»
|
|
|
+ «ELSEIF feat instanceof Expression»«Expressions.generate(feat)»
|
|
|
+ «ENDIF»'''*/
|
|
|
+ }
|
|
|
+ // ########################
|
|
|
+
|
|
|
+ def static dispatch CharSequence generateScopeForRaising(Object it, CharSequence name){
|
|
|
+ '''Scope raising not handled : «it»'''
|
|
|
+ }
|
|
|
+
|
|
|
+ def static dispatch CharSequence generateScopeForRaising(Expression it, CharSequence name){
|
|
|
+ '''PB : «it»'''
|
|
|
+ }
|
|
|
+
|
|
|
+ def static dispatch CharSequence generateScopeForRaising(EventRaisingExpression it, CharSequence nameEvent){
|
|
|
+ '''«generateScopeForRaising(it.event, nameEvent)»'''
|
|
|
+ }
|
|
|
+
|
|
|
+ def static dispatch CharSequence generateScopeForRaising(FeatureCall it, CharSequence name){
|
|
|
+ '''«generateScopeForRaising(it.feature, name)»'''
|
|
|
+ }
|
|
|
+ def static dispatch CharSequence generateScopeForRaising(ElementReferenceExpression it, CharSequence name){
|
|
|
+ '''«generateScopeForRaising(it.reference, name)»'''
|
|
|
+ }
|
|
|
+
|
|
|
+ def static dispatch CharSequence generateScopeForRaising(EventDefinition it, CharSequence name){
|
|
|
+ '''«IF it.direction == Direction.LOCAL»scope="local"«ELSE»scope="output" port="«Functions.findPort(name.toString())»"«ENDIF»'''
|
|
|
+ }
|
|
|
+
|
|
|
+ // #########################
|
|
|
+
|
|
|
+ def static dispatch CharSequence generate(EventValueReferenceExpression it){
|
|
|
+ // built in fct : valueof
|
|
|
+ val expr = it.value.generate
|
|
|
+ '''«expr»«IF !(expr.toString().contains("_value"))»_value«ENDIF»'''
|
|
|
+ }
|
|
|
+
|
|
|
+ def static dispatch CharSequence generate(ParenthesizedExpression it){
|
|
|
+ '''(«it.expression.generate»)'''
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ def static dispatch CharSequence generate(AssignmentExpression it){
|
|
|
+ var String operator;
|
|
|
+ switch it.operator {
|
|
|
+ // Assignment Operator
|
|
|
+ case AssignmentOperator.ADD_ASSIGN: operator = "+="
|
|
|
+ case AssignmentOperator.AND_ASSIGN: operator = "&="
|
|
|
+ case AssignmentOperator.ASSIGN: operator = "="
|
|
|
+ case AssignmentOperator.DIV_ASSIGN: operator = "/="
|
|
|
+ case AssignmentOperator.LEFT_SHIFT_ASSIGN: operator = "<<="
|
|
|
+ case AssignmentOperator.RIGHT_SHIFT_ASSIGN: operator = ">>="
|
|
|
+ case AssignmentOperator.MOD_ASSIGN: operator = "%="
|
|
|
+ case AssignmentOperator.MULT_ASSIGN: operator = "*="
|
|
|
+ case AssignmentOperator.OR_ASSIGN: operator = "|="
|
|
|
+ case AssignmentOperator.SUB_ASSIGN: operator = "-="
|
|
|
+ case AssignmentOperator.XOR_ASSIGN: operator = "^="
|
|
|
+
|
|
|
+ // Default
|
|
|
+ default: operator = "##"
|
|
|
+ }
|
|
|
+ '''«it.varRef.generate» «operator» «it.expression.generate»'''
|
|
|
+ }
|
|
|
+
|
|
|
+ def static dispatch CharSequence generate(ActiveStateReferenceExpression it){
|
|
|
+ '''INSTATE(«value.name»)'''
|
|
|
+ }
|
|
|
+
|
|
|
+ def static dispatch CharSequence generate(ConditionalExpression it){
|
|
|
+ // exp1 ? exp2 : exp3
|
|
|
+ // In Python exp2 if exp1 else exp3
|
|
|
+ '''«trueCase.generate» if «condition.generate» else «falseCase.generate»'''
|
|
|
+ }
|
|
|
+
|
|
|
+ def static dispatch CharSequence generate(Expression it){
|
|
|
+ '''unhandled Expression : «it.class.toString()»'''
|
|
|
+ }
|
|
|
+
|
|
|
+ /*def static dispatch generate(EObject it){
|
|
|
+ '''«it.generate»'''
|
|
|
+ }*/
|
|
|
+
|
|
|
+ def static dispatch generate(EObject it){
|
|
|
+ '''NOT HANDLED : «it.class.toString()»'''
|
|
|
+ }
|
|
|
+}
|