Block

The Block is a symbol node that represents a scoped list of statements (block).

Declaración

Sintaxis

Block(symbol_table symtab, identifier name, stmt* body)

Argumentos

Argument Name

Denotes

parent_symtab

the parent symbol table that contains the block

name

the name of the block in the parent symbol table

body

the list of statements in the block

Valores devueltos

None.

Descripción

The Block node represents a scoped list of statements. In C one uses {} to represent a block, in Fortran one uses block / end block. The Block contains its own symbol table and can contain variable declarations that are local to the block.

The Block itself is part of a symbol table and one uses the BlockCall stmt node to call (enter) the block from a list of statements.

A BlockCall is different from a FunctionCall in the sense that it does not expect/accept any arguments. Also, the statements inside a Block can access the variables in the parent/caller scope, unlike Function where statements cannot access variables of the caller scope.

Tipos

Ejemplos

An example in C is:

{
    int i = 5;
    print("%d\n", i);
}

An example in Fortran is:

program test_block
integer :: i
i = 5
block
    integer :: j
    j = i + 1
    print *, i, j
end block
end program

ASR:

(TranslationUnit
    (SymbolTable
        1
        {
            test_block:
                (Program
                    (SymbolTable
                        2
                        {
                            block:
                                (Block
                                    (SymbolTable
                                        3
                                        {
                                            j:
                                                (Variable
                                                    3
                                                    j
                                                    []
                                                    Local
                                                    ()
                                                    ()
                                                    Default
                                                    (Integer 4 [])
                                                    Source
                                                    Public
                                                    Required
                                                    .false.
                                                )
                                        })
                                    block
                                    [(=
                                        (Var 3 j)
                                        (IntegerBinOp
                                            (Var 2 i)
                                            Add
                                            (IntegerConstant 1 (Integer 4 []))
                                            (Integer 4 [])
                                            ()
                                        )
                                        ()
                                    )
                                    (Print
                                        ()
                                        [(Var 2 i)
                                        (Var 3 j)]
                                        ()
                                        ()
                                    )]
                                ),
                            i:
                                (Variable
                                    2
                                    i
                                    []
                                    Local
                                    ()
                                    ()
                                    Default
                                    (Integer 4 [])
                                    Source
                                    Public
                                    Required
                                    .false.
                                )
                        })
                    test_block
                    []
                    [(=
                        (Var 2 i)
                        (IntegerConstant 5 (Integer 4 []))
                        ()
                    )
                    (BlockCall
                        -1
                        2 block
                    )]
                )
        })
    []
)

Ver también

symbol.