Var¶
Var is an expression node that represents a reference to a declared variable, function, enum, etc.
Declaration¶
Syntax¶
Var(symbol v)
Arguments¶
Argument Name  | 
Argument Description  | 
|---|---|
  | 
symbol name  | 
Return values¶
The return value is the expression that the Var represents.
Описание¶
Var represents a declaration when used within an expression. Every
declaration is represented in the symbol table, for example:
integer :: x: herexis represented byVariable, which hastypeas an «Integer» type,type_declarationis emptyprocedure(fn) :: x: herexis represented byVariable, which hastypeas a «FunctionType» type, andtype_declarationas a «Function» symbol representing the interface declaration «fn»function my_fn(...) ... end function: represented byFunction
When these are to be used in an expression, one uses Var which points to one
of these.
For example, if we have a declaration integer :: x, then the assignment x = 5 is represented as (Assignment (Var 2 x) (IntegerConstant 5 (Integer 4 [])) ()). Here Var points to the Variable symbol in the symbol table. See below
for a full example.
Another example: if procedure(fn), pointer :: f, then f => myf is
represented by (Associate (Var 2 f) (Var 2 myf)), where myf is a
Function.
Most often Var points to a Variable. For referencing functions it points to
Function. For enums it points to Enum. These can be hidden behind
ExternalSymbol. It cannot point to any other symbol.
Types¶
Var’s argument v can point to the following symbols (and nothing else):
Variable(for expressions like2*x+5wherexis a variable)Function(for expressions likemyf, wheremyfis a user defined function, such as passing it as a callback argument to a function callcall f(myf), or assigning to a pointer procedure variablef => myf)EnumExternalSymbol(the above symbols can be behind anExternalSymbolif they are declared in another module)
Examples¶
program test_var
integer :: x
x = 5
print *, 3*x+5
end program
ASR:
(TranslationUnit
    (SymbolTable
        1
        {
            test_var:
                (Program
                    (SymbolTable
                        2
                        {
                            x:
                                (Variable
                                    2
                                    x
                                    []
                                    Local
                                    ()
                                    ()
                                    Default
                                    (Integer 4 [])
                                    Source
                                    Public
                                    Required
                                    .false.
                                )
                        })
                    test_var
                    []
                    [(=
                        (Var 2 x)
                        (IntegerConstant 5 (Integer 4 []))
                        ()
                    )
                    (Print
                        ()
                        [(IntegerBinOp
                            (IntegerBinOp
                                (IntegerConstant 3 (Integer 4 []))
                                Mul
                                (Var 2 x)
                                (Integer 4 [])
                                ()
                            )
                            Add
                            (IntegerConstant 5 (Integer 4 []))
                            (Integer 4 [])
                            ()
                        )]
                        ()
                        ()
                    )]
                )
        })
    []
)