diff --git a/src/FAST-Fortran-Entities/FASTFortranAssignmentExpression.class.st b/src/FAST-Fortran-Entities/FASTFortranAssignmentExpression.class.st new file mode 100644 index 00000000..0338d2f8 --- /dev/null +++ b/src/FAST-Fortran-Entities/FASTFortranAssignmentExpression.class.st @@ -0,0 +1,95 @@ +" +I represent an assignment expression as a part of assignment statement +" +Class { + #name : #FASTFortranAssignmentExpression, + #superclass : #FASTFortranEntity, + #traits : 'FASTFortranTExpression', + #classTraits : 'FASTFortranTExpression classTrait', + #instVars : [ + '#leftPart => FMOne type: #FASTFortranVariable opposite: #parentAssignmentExpression', + '#rightPart => FMOne type: #FASTFortranVariable opposite: #parentAssignmentExpression', + '#parentLoopControlExpresison => FMOne type: #FASTFortranLoopControlExpression opposite: #init' + ], + #category : #'FAST-Fortran-Entities-Entities' +} + +{ #category : #meta } +FASTFortranAssignmentExpression class >> annotation [ + + + + + ^ self +] + +{ #category : #accessing } +FASTFortranAssignmentExpression >> leftPart [ + "Relation named: #leftPart type: #FASTFortranVariable opposite: #parentAssignmentExpression" + + + + ^ leftPart +] + +{ #category : #accessing } +FASTFortranAssignmentExpression >> leftPart: anObject [ + + + leftPart := anObject +] + +{ #category : #navigation } +FASTFortranAssignmentExpression >> leftPartGroup [ + + + ^ MooseSpecializedGroup with: self leftPart +] + +{ #category : #accessing } +FASTFortranAssignmentExpression >> parentLoopControlExpresison [ + "Relation named: #parentLoopControlExpresison type: #FASTFortranLoopControlExpression opposite: #init" + + + + + + ^ parentLoopControlExpresison +] + +{ #category : #accessing } +FASTFortranAssignmentExpression >> parentLoopControlExpresison: anObject [ + + + parentLoopControlExpresison := anObject +] + +{ #category : #navigation } +FASTFortranAssignmentExpression >> parentLoopControlExpresisonGroup [ + + + ^ MooseSpecializedGroup with: self parentLoopControlExpresison +] + +{ #category : #accessing } +FASTFortranAssignmentExpression >> rightPart [ + "Relation named: #rightPart type: #FASTFortranVariable opposite: #parentAssignmentExpression" + + + + ^ rightPart +] + +{ #category : #accessing } +FASTFortranAssignmentExpression >> rightPart: anObject [ + + + rightPart := anObject +] + +{ #category : #navigation } +FASTFortranAssignmentExpression >> rightPartGroup [ + + + ^ MooseSpecializedGroup with: self rightPart +] diff --git a/src/FAST-Fortran-Entities/FASTFortranLoopControlExpression.class.st b/src/FAST-Fortran-Entities/FASTFortranLoopControlExpression.class.st index e3d2de53..d2646a36 100644 --- a/src/FAST-Fortran-Entities/FASTFortranLoopControlExpression.class.st +++ b/src/FAST-Fortran-Entities/FASTFortranLoopControlExpression.class.st @@ -7,8 +7,8 @@ Class { #traits : 'FASTFortranTExpression', #classTraits : 'FASTFortranTExpression classTrait', #instVars : [ - '#init => FMProperty', '#increment => FMProperty', + '#init => FMOne type: #FASTFortranAssignmentExpression opposite: #parentLoopControlExpresison', '#limit => FMProperty', '#parentLoop => FMOne type: #FASTFortranDoStatement opposite: #loopControl' ], @@ -41,19 +41,27 @@ FASTFortranLoopControlExpression >> increment: anObject [ { #category : #accessing } FASTFortranLoopControlExpression >> init [ + "Relation named: #init type: #FASTFortranAssignmentExpression opposite: #parentLoopControlExpresison" - - + ^ init ] { #category : #accessing } FASTFortranLoopControlExpression >> init: anObject [ + init := anObject ] +{ #category : #navigation } +FASTFortranLoopControlExpression >> initGroup [ + + + ^ MooseSpecializedGroup with: self init +] + { #category : #accessing } FASTFortranLoopControlExpression >> limit [ diff --git a/src/FAST-Fortran-Entities/FASTFortranTEntityCreator.trait.st b/src/FAST-Fortran-Entities/FASTFortranTEntityCreator.trait.st index 41262870..434c51f4 100644 --- a/src/FAST-Fortran-Entities/FASTFortranTEntityCreator.trait.st +++ b/src/FAST-Fortran-Entities/FASTFortranTEntityCreator.trait.st @@ -44,6 +44,13 @@ FASTFortranTEntityCreator >> newArrayVariable [ ^ self add: FASTFortranArrayVariable new ] +{ #category : #'entity creation' } +FASTFortranTEntityCreator >> newAssignmentExpression [ + + + ^ self add: FASTFortranAssignmentExpression new +] + { #category : #'entity creation' } FASTFortranTEntityCreator >> newAssignmentStatement [ diff --git a/src/FAST-Fortran-Entities/FASTFortranVariable.class.st b/src/FAST-Fortran-Entities/FASTFortranVariable.class.st index 550064b4..ba7e43d1 100644 --- a/src/FAST-Fortran-Entities/FASTFortranVariable.class.st +++ b/src/FAST-Fortran-Entities/FASTFortranVariable.class.st @@ -8,6 +8,7 @@ Class { #classTraits : 'FASTFortranTExpression classTrait + FASTFortranTVariableEntity classTrait', #instVars : [ '#name => FMProperty', + '#parentAssignmentExpression => FMOne type: #FASTFortranAssignmentExpression opposite: #leftPart', '#parentDeclaration => FMOne type: #FASTFortranDeclarationStatement opposite: #declarators' ], #category : #'FAST-Fortran-Entities-Entities' @@ -37,6 +38,31 @@ FASTFortranVariable >> name: anObject [ name := anObject ] +{ #category : #accessing } +FASTFortranVariable >> parentAssignmentExpression [ + "Relation named: #parentAssignmentExpression type: #FASTFortranAssignmentExpression opposite: #leftPart" + + + + + + ^ parentAssignmentExpression +] + +{ #category : #accessing } +FASTFortranVariable >> parentAssignmentExpression: anObject [ + + + parentAssignmentExpression := anObject +] + +{ #category : #navigation } +FASTFortranVariable >> parentAssignmentExpressionGroup [ + + + ^ MooseSpecializedGroup with: self parentAssignmentExpression +] + { #category : #accessing } FASTFortranVariable >> parentDeclaration [ "Relation named: #parentDeclaration type: #FASTFortranDeclarationStatement opposite: #declarators" diff --git a/src/FAST-Fortran-Generator/FASTFortranGenerator.class.st b/src/FAST-Fortran-Generator/FASTFortranGenerator.class.st index 8a3b0071..be6cd100 100644 --- a/src/FAST-Fortran-Generator/FASTFortranGenerator.class.st +++ b/src/FAST-Fortran-Generator/FASTFortranGenerator.class.st @@ -98,7 +98,8 @@ Class { 'tFortranUnaryExpression', 'booleanConstant', 'characterConstant', - 'statementBlock' + 'statementBlock', + 'assignmentExpression' ], #category : #'FAST-Fortran-Generator' } @@ -154,6 +155,11 @@ FASTFortranGenerator >> defineData [ 'I represent a declaration statement for one or many variables'. "EXPRESSIONS" + + assignmentExpression := builder + newClassNamed: #AssignmentExpression + comment: + 'I represent an assignment expression as a part of assignment statement'. variable := builder newClassNamed: #Variable @@ -444,13 +450,13 @@ FASTFortranGenerator >> defineHierarchy [ "DATA" + assignmentExpression --|> tExpression. functionCall --|> tExpression. variable --|> tExpression. variable --|> tVariableEntity. variableScalar --|> variable. variableArray --|> variable. loopControlExpression --|> tExpression. - substring --|> tExpression. binaryExpression --|> tBinaryExpression. @@ -517,9 +523,6 @@ FASTFortranGenerator >> defineProperties [ (arrayDimensionDeclarator property: #ub type: #Number) comment: 'Upper bound'. - (loopControlExpression property: #init type: #String) comment: - 'Loop control initial value'. - (loopControlExpression property: #increment type: #String) comment: 'Loop control increment value'. @@ -589,6 +592,21 @@ FASTFortranGenerator >> defineRelations [ ((unaryExpression property: #expression) comment: 'expression') <>- ((tExpression property: #parentExpression) comment: 'Parent expression (if possible)'). + + ((assignmentExpression property: #leftPart) comment: 'assignee') + <>- + ((variable property: #parentAssignmentExpression) comment: + 'Parent assignment expression'). + + ((assignmentExpression property: #rightPart) comment: 'assigned') + <>- + ((variable property: #parentAssignmentExpression) comment: + 'Parent assignment expression'). + + ((loopControlExpression property: #init) comment: 'initial assignment') + <>- + ((assignmentExpression property: #parentLoopControlExpresison) comment: + 'Parent loop control expresison'). ((doStatement property: #loopControl) comment: 'loop control') <>-