DoLoop¶
A counted do loop.
Declaration¶
Syntax¶
DoLoop(identifier? name, do_loop_head head, stmt* body, stmt* orelse)
Arguments¶
Argument |
Description |
|---|---|
|
|
|
the do_loop_head with the index variable, the start and end values and the step. |
|
the statements of the loop. |
|
statements to run when the loop finishes without an |
Return values¶
None.
Description¶
The trip count is computed from head before the first iteration, so changing
the bounds inside the body does not change the number of iterations. The head
is always in the normalized form:
start, end and increment are present and have the type of the index
variable.
A do loop with no head at all is an infinite loop, do ... end do, and is
represented by a head whose members are all nil.
Examples¶
An ASR text document that uses it:
(TranslationUnit
:symtab (SymbolTable
:id 0
:symbols {
"main" (Program
:symtab (SymbolTable
:id 1
:symbols {
"i" (Variable
:parent_symtab 1
:name "i"
:dependencies []
:intent :Local
:symbolic_value nil
:value nil
:storage :Default
:type (Integer
:kind 4
)
:type_declaration nil
:abi :Source
:access :Public
:presence :Required
:value_attr false
:target_attr false
:contiguous_attr false
:bindc_name nil
:is_volatile false
:is_asynchronous false
:is_protected false
:pass_attr :NotMethod
:self_argument nil
:codims []
:common_block nil
)
"j" (Variable
:parent_symtab 1
:name "j"
:dependencies []
:intent :Local
:symbolic_value nil
:value nil
:storage :Default
:type (Integer
:kind 4
)
:type_declaration nil
:abi :Source
:access :Public
:presence :Required
:value_attr false
:target_attr false
:contiguous_attr false
:bindc_name nil
:is_volatile false
:is_asynchronous false
:is_protected false
:pass_attr :NotMethod
:self_argument nil
:codims []
:common_block nil
)
"p" (Variable
:parent_symtab 1
:name "p"
:dependencies []
:intent :Local
:symbolic_value nil
:value nil
:storage :Default
:type (Logical
:kind 4
)
:type_declaration nil
:abi :Source
:access :Public
:presence :Required
:value_attr false
:target_attr false
:contiguous_attr false
:bindc_name nil
:is_volatile false
:is_asynchronous false
:is_protected false
:pass_attr :NotMethod
:self_argument nil
:codims []
:common_block nil
)
}
)
:name "main"
:dependencies []
:body [
(DoLoop
:name "loop"
:head (do_loop_head
:v (Var
:v (SymbolRef 1 "i")
)
:start (IntegerConstant
:n 1
:type (Integer
:kind 4
)
:intboz_type :Decimal
)
:end (IntegerConstant
:n 10
:type (Integer
:kind 4
)
:intboz_type :Decimal
)
:increment (IntegerConstant
:n 1
:type (Integer
:kind 4
)
:intboz_type :Decimal
)
)
:body [
(If
:name nil
:test (IntegerCompare
:left (Var
:v (SymbolRef 1 "i")
)
:op :Eq
:right (IntegerConstant
:n 5
:type (Integer
:kind 4
)
:intboz_type :Decimal
)
:type (Logical
:kind 4
)
:value nil
)
:body [
(Cycle
:stmt_name "loop"
)
]
:orelse []
)
(If
:name nil
:test (Var
:v (SymbolRef 1 "p")
)
:body [
(Exit
:stmt_name "loop"
)
]
:orelse [
(Assignment
:target (Var
:v (SymbolRef 1 "j")
)
:value (Var
:v (SymbolRef 1 "i")
)
:overloaded nil
:realloc_lhs false
:move_allocation false
:new_target false
:new_allocation false
)
]
)
]
:orelse []
)
(WhileLoop
:name nil
:test (IntegerCompare
:left (Var
:v (SymbolRef 1 "j")
)
:op :Lt
:right (IntegerConstant
:n 100
:type (Integer
:kind 4
)
:intboz_type :Decimal
)
:type (Logical
:kind 4
)
:value nil
)
:body [
(Assignment
:target (Var
:v (SymbolRef 1 "j")
)
:value (IntegerBinOp
:left (Var
:v (SymbolRef 1 "j")
)
:op :Add
:right (IntegerConstant
:n 1
:type (Integer
:kind 4
)
:intboz_type :Decimal
)
:type (Integer
:kind 4
)
:value nil
)
:overloaded nil
:realloc_lhs false
:move_allocation false
:new_target false
:new_allocation false
)
]
:orelse []
)
(Assert
:test (IntegerCompare
:left (Var
:v (SymbolRef 1 "j")
)
:op :GtE
:right (IntegerConstant
:n 0
:type (Integer
:kind 4
)
:intboz_type :Decimal
)
:type (Logical
:kind 4
)
:value nil
)
:msg (StringConstant
:s "j is not negative"
:type (String
:kind 1
:len (IntegerConstant
:n 17
:type (Integer
:kind 4
)
:intboz_type :Decimal
)
:len_kind :ExpressionLength
:physical_type :DescriptorString
)
)
)
]
:global_init nil
)
}
)
:items []
:global_init nil
)