AST 和 ASR 之间的区别

让我们看一个简单的 Fortran 代码:

integer function f(a, b) result(r)
integer, intent(in) :: a, b
integer :: c, d
c = a + b - d
r = c * a
end function

and look at what the AST and ASR look like.

AST

[1]:
%%showast
integer function f(a, b) result(r)
integer, intent(in) :: a, b
integer :: c, d
c = a + b - d
r = c * a
end function
(TranslationUnit
    [(Function
        f
        [(a)
        (b)]
        [(AttrType
            TypeInteger
            []
            ()
            ()
            None
        )]
        r
        ()
        ()
        [(Declaration
            (AttrType
                TypeInteger
                []
                ()
                ()
                None
            )
            [(AttrIntent
                In
            )]
            [(a
            []
            []
            ()
            ()
            None
            ())
            (b
            []
            []
            ()
            ()
            None
            ())]
            ()
        )
        (Declaration
            (AttrType
                TypeInteger
                []
                ()
                ()
                None
            )
            []
            [(c
            []
            []
            ()
            ()
            None
            ())
            (d
            []
            []
            ()
            ()
            None
            ())]
            ()
        )
        (Assignment
            0
            c
            (- (+ a b) d)
            ()
        )
        (Assignment
            0
            r
            (* c a)
            ()
        )]
        []
        []
    )]
)

AST 没有任何语义信息,但具有表示声明的节点,例如 integer, intent(in) :: a。诸如 a 之类的变量由 Name 节点表示,并且尚未连接到它们的声明。

The AST can also be exported in JSON, including source file name, line and column information: lfortran example.f90 --show-ast --json

ASR

[2]:
%%showasr
integer function f(a, b) result(r)
integer, intent(in) :: a, b
integer :: c, d
c = a + b - d
r = c * a
end function
(TranslationUnit
    (SymbolTable
        1
        {
            _lcompilers_len_trim_str:
                (Function
                    (SymbolTable
                        18
                        {
                            result:
                                (Variable
                                    18
                                    result
                                    []
                                    ReturnVar
                                    ()
                                    ()
                                    Default
                                    (Integer 4)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            str:
                                (Variable
                                    18
                                    str
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (String 1 () AssumedLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                )
                        })
                    _lcompilers_len_trim_str
                    (FunctionType
                        [(String 1 () AssumedLength DescriptorString)]
                        (Integer 4)
                        ExternalUndefined
                        Implementation
                        ()
                        .false.
                        .false.
                        .false.
                        .false.
                        .false.
                        []
                        .false.
                    )
                    []
                    [(Var 18 str)]
                    [(Assignment
                        (Var 18 result)
                        (Cast
                            (StringLen
                                (Var 18 str)
                                (Integer 4)
                                ()
                            )
                            IntegerToInteger
                            (Integer 4)
                            ()
                            ()
                        )
                        ()
                        .false.
                        .false.
                    )
                    (If
                        ()
                        (IntegerCompare
                            (Var 18 result)
                            NotEq
                            (IntegerConstant 0 (Integer 4) Decimal)
                            (Logical 4)
                            ()
                        )
                        [(WhileLoop
                            ()
                            (StringCompare
                                (StringItem
                                    (Var 18 str)
                                    (Var 18 result)
                                    (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                    ()
                                )
                                Eq
                                (StringConstant
                                    " "
                                    (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                )
                                (Logical 4)
                                ()
                            )
                            [(Assignment
                                (Var 18 result)
                                (IntegerBinOp
                                    (Var 18 result)
                                    Sub
                                    (IntegerConstant 1 (Integer 4) Decimal)
                                    (Integer 4)
                                    ()
                                )
                                ()
                                .false.
                                .false.
                            )
                            (If
                                ()
                                (IntegerCompare
                                    (Var 18 result)
                                    Eq
                                    (IntegerConstant 0 (Integer 4) Decimal)
                                    (Logical 4)
                                    ()
                                )
                                [(Exit
                                    ()
                                )]
                                []
                            )]
                            []
                        )]
                        []
                    )]
                    (Var 18 result)
                    Public
                    .false.
                    .false.
                    ()
                ),
            _lcompilers_len_trim_str1:
                (Function
                    (SymbolTable
                        20
                        {
                            result:
                                (Variable
                                    20
                                    result
                                    []
                                    ReturnVar
                                    ()
                                    ()
                                    Default
                                    (Integer 4)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            str:
                                (Variable
                                    20
                                    str
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (String 1 () AssumedLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                )
                        })
                    _lcompilers_len_trim_str1
                    (FunctionType
                        [(String 1 () AssumedLength DescriptorString)]
                        (Integer 4)
                        ExternalUndefined
                        Implementation
                        ()
                        .false.
                        .false.
                        .false.
                        .false.
                        .false.
                        []
                        .false.
                    )
                    []
                    [(Var 20 str)]
                    [(Assignment
                        (Var 20 result)
                        (Cast
                            (StringLen
                                (Var 20 str)
                                (Integer 4)
                                ()
                            )
                            IntegerToInteger
                            (Integer 4)
                            ()
                            ()
                        )
                        ()
                        .false.
                        .false.
                    )
                    (If
                        ()
                        (IntegerCompare
                            (Var 20 result)
                            NotEq
                            (IntegerConstant 0 (Integer 4) Decimal)
                            (Logical 4)
                            ()
                        )
                        [(WhileLoop
                            ()
                            (StringCompare
                                (StringItem
                                    (Var 20 str)
                                    (Var 20 result)
                                    (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                    ()
                                )
                                Eq
                                (StringConstant
                                    " "
                                    (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                )
                                (Logical 4)
                                ()
                            )
                            [(Assignment
                                (Var 20 result)
                                (IntegerBinOp
                                    (Var 20 result)
                                    Sub
                                    (IntegerConstant 1 (Integer 4) Decimal)
                                    (Integer 4)
                                    ()
                                )
                                ()
                                .false.
                                .false.
                            )
                            (If
                                ()
                                (IntegerCompare
                                    (Var 20 result)
                                    Eq
                                    (IntegerConstant 0 (Integer 4) Decimal)
                                    (Logical 4)
                                    ()
                                )
                                [(Exit
                                    ()
                                )]
                                []
                            )]
                            []
                        )]
                        []
                    )]
                    (Var 20 result)
                    Public
                    .false.
                    .false.
                    ()
                ),
            _lcompilers_len_trim_str2:
                (Function
                    (SymbolTable
                        22
                        {
                            result:
                                (Variable
                                    22
                                    result
                                    []
                                    ReturnVar
                                    ()
                                    ()
                                    Default
                                    (Integer 4)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            str:
                                (Variable
                                    22
                                    str
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (String 1 () AssumedLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                )
                        })
                    _lcompilers_len_trim_str2
                    (FunctionType
                        [(String 1 () AssumedLength DescriptorString)]
                        (Integer 4)
                        ExternalUndefined
                        Implementation
                        ()
                        .false.
                        .false.
                        .false.
                        .false.
                        .false.
                        []
                        .false.
                    )
                    []
                    [(Var 22 str)]
                    [(Assignment
                        (Var 22 result)
                        (Cast
                            (StringLen
                                (Var 22 str)
                                (Integer 4)
                                ()
                            )
                            IntegerToInteger
                            (Integer 4)
                            ()
                            ()
                        )
                        ()
                        .false.
                        .false.
                    )
                    (If
                        ()
                        (IntegerCompare
                            (Var 22 result)
                            NotEq
                            (IntegerConstant 0 (Integer 4) Decimal)
                            (Logical 4)
                            ()
                        )
                        [(WhileLoop
                            ()
                            (StringCompare
                                (StringItem
                                    (Var 22 str)
                                    (Var 22 result)
                                    (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                    ()
                                )
                                Eq
                                (StringConstant
                                    " "
                                    (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                )
                                (Logical 4)
                                ()
                            )
                            [(Assignment
                                (Var 22 result)
                                (IntegerBinOp
                                    (Var 22 result)
                                    Sub
                                    (IntegerConstant 1 (Integer 4) Decimal)
                                    (Integer 4)
                                    ()
                                )
                                ()
                                .false.
                                .false.
                            )
                            (If
                                ()
                                (IntegerCompare
                                    (Var 22 result)
                                    Eq
                                    (IntegerConstant 0 (Integer 4) Decimal)
                                    (Logical 4)
                                    ()
                                )
                                [(Exit
                                    ()
                                )]
                                []
                            )]
                            []
                        )]
                        []
                    )]
                    (Var 22 result)
                    Public
                    .false.
                    .false.
                    ()
                ),
            _lcompilers_len_trim_str3:
                (Function
                    (SymbolTable
                        24
                        {
                            result:
                                (Variable
                                    24
                                    result
                                    []
                                    ReturnVar
                                    ()
                                    ()
                                    Default
                                    (Integer 4)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            str:
                                (Variable
                                    24
                                    str
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (String 1 () AssumedLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                )
                        })
                    _lcompilers_len_trim_str3
                    (FunctionType
                        [(String 1 () AssumedLength DescriptorString)]
                        (Integer 4)
                        ExternalUndefined
                        Implementation
                        ()
                        .false.
                        .false.
                        .false.
                        .false.
                        .false.
                        []
                        .false.
                    )
                    []
                    [(Var 24 str)]
                    [(Assignment
                        (Var 24 result)
                        (Cast
                            (StringLen
                                (Var 24 str)
                                (Integer 4)
                                ()
                            )
                            IntegerToInteger
                            (Integer 4)
                            ()
                            ()
                        )
                        ()
                        .false.
                        .false.
                    )
                    (If
                        ()
                        (IntegerCompare
                            (Var 24 result)
                            NotEq
                            (IntegerConstant 0 (Integer 4) Decimal)
                            (Logical 4)
                            ()
                        )
                        [(WhileLoop
                            ()
                            (StringCompare
                                (StringItem
                                    (Var 24 str)
                                    (Var 24 result)
                                    (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                    ()
                                )
                                Eq
                                (StringConstant
                                    " "
                                    (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                )
                                (Logical 4)
                                ()
                            )
                            [(Assignment
                                (Var 24 result)
                                (IntegerBinOp
                                    (Var 24 result)
                                    Sub
                                    (IntegerConstant 1 (Integer 4) Decimal)
                                    (Integer 4)
                                    ()
                                )
                                ()
                                .false.
                                .false.
                            )
                            (If
                                ()
                                (IntegerCompare
                                    (Var 24 result)
                                    Eq
                                    (IntegerConstant 0 (Integer 4) Decimal)
                                    (Logical 4)
                                    ()
                                )
                                [(Exit
                                    ()
                                )]
                                []
                            )]
                            []
                        )]
                        []
                    )]
                    (Var 24 result)
                    Public
                    .false.
                    .false.
                    ()
                ),
            _lcompilers_len_trim_str4:
                (Function
                    (SymbolTable
                        28
                        {
                            result:
                                (Variable
                                    28
                                    result
                                    []
                                    ReturnVar
                                    ()
                                    ()
                                    Default
                                    (Integer 4)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            str:
                                (Variable
                                    28
                                    str
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (String 1 () AssumedLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                )
                        })
                    _lcompilers_len_trim_str4
                    (FunctionType
                        [(String 1 () AssumedLength DescriptorString)]
                        (Integer 4)
                        ExternalUndefined
                        Implementation
                        ()
                        .false.
                        .false.
                        .false.
                        .false.
                        .false.
                        []
                        .false.
                    )
                    []
                    [(Var 28 str)]
                    [(Assignment
                        (Var 28 result)
                        (Cast
                            (StringLen
                                (Var 28 str)
                                (Integer 4)
                                ()
                            )
                            IntegerToInteger
                            (Integer 4)
                            ()
                            ()
                        )
                        ()
                        .false.
                        .false.
                    )
                    (If
                        ()
                        (IntegerCompare
                            (Var 28 result)
                            NotEq
                            (IntegerConstant 0 (Integer 4) Decimal)
                            (Logical 4)
                            ()
                        )
                        [(WhileLoop
                            ()
                            (StringCompare
                                (StringItem
                                    (Var 28 str)
                                    (Var 28 result)
                                    (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                    ()
                                )
                                Eq
                                (StringConstant
                                    " "
                                    (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                )
                                (Logical 4)
                                ()
                            )
                            [(Assignment
                                (Var 28 result)
                                (IntegerBinOp
                                    (Var 28 result)
                                    Sub
                                    (IntegerConstant 1 (Integer 4) Decimal)
                                    (Integer 4)
                                    ()
                                )
                                ()
                                .false.
                                .false.
                            )
                            (If
                                ()
                                (IntegerCompare
                                    (Var 28 result)
                                    Eq
                                    (IntegerConstant 0 (Integer 4) Decimal)
                                    (Logical 4)
                                    ()
                                )
                                [(Exit
                                    ()
                                )]
                                []
                            )]
                            []
                        )]
                        []
                    )]
                    (Var 28 result)
                    Public
                    .false.
                    .false.
                    ()
                ),
            _lcompilers_len_trim_str5:
                (Function
                    (SymbolTable
                        30
                        {
                            result:
                                (Variable
                                    30
                                    result
                                    []
                                    ReturnVar
                                    ()
                                    ()
                                    Default
                                    (Integer 4)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            str:
                                (Variable
                                    30
                                    str
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (String 1 () AssumedLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                )
                        })
                    _lcompilers_len_trim_str5
                    (FunctionType
                        [(String 1 () AssumedLength DescriptorString)]
                        (Integer 4)
                        ExternalUndefined
                        Implementation
                        ()
                        .false.
                        .false.
                        .false.
                        .false.
                        .false.
                        []
                        .false.
                    )
                    []
                    [(Var 30 str)]
                    [(Assignment
                        (Var 30 result)
                        (Cast
                            (StringLen
                                (Var 30 str)
                                (Integer 4)
                                ()
                            )
                            IntegerToInteger
                            (Integer 4)
                            ()
                            ()
                        )
                        ()
                        .false.
                        .false.
                    )
                    (If
                        ()
                        (IntegerCompare
                            (Var 30 result)
                            NotEq
                            (IntegerConstant 0 (Integer 4) Decimal)
                            (Logical 4)
                            ()
                        )
                        [(WhileLoop
                            ()
                            (StringCompare
                                (StringItem
                                    (Var 30 str)
                                    (Var 30 result)
                                    (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                    ()
                                )
                                Eq
                                (StringConstant
                                    " "
                                    (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                )
                                (Logical 4)
                                ()
                            )
                            [(Assignment
                                (Var 30 result)
                                (IntegerBinOp
                                    (Var 30 result)
                                    Sub
                                    (IntegerConstant 1 (Integer 4) Decimal)
                                    (Integer 4)
                                    ()
                                )
                                ()
                                .false.
                                .false.
                            )
                            (If
                                ()
                                (IntegerCompare
                                    (Var 30 result)
                                    Eq
                                    (IntegerConstant 0 (Integer 4) Decimal)
                                    (Logical 4)
                                    ()
                                )
                                [(Exit
                                    ()
                                )]
                                []
                            )]
                            []
                        )]
                        []
                    )]
                    (Var 30 result)
                    Public
                    .false.
                    .false.
                    ()
                ),
            _lcompilers_len_trim_str6:
                (Function
                    (SymbolTable
                        32
                        {
                            result:
                                (Variable
                                    32
                                    result
                                    []
                                    ReturnVar
                                    ()
                                    ()
                                    Default
                                    (Integer 4)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            str:
                                (Variable
                                    32
                                    str
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (String 1 () AssumedLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                )
                        })
                    _lcompilers_len_trim_str6
                    (FunctionType
                        [(String 1 () AssumedLength DescriptorString)]
                        (Integer 4)
                        ExternalUndefined
                        Implementation
                        ()
                        .false.
                        .false.
                        .false.
                        .false.
                        .false.
                        []
                        .false.
                    )
                    []
                    [(Var 32 str)]
                    [(Assignment
                        (Var 32 result)
                        (Cast
                            (StringLen
                                (Var 32 str)
                                (Integer 4)
                                ()
                            )
                            IntegerToInteger
                            (Integer 4)
                            ()
                            ()
                        )
                        ()
                        .false.
                        .false.
                    )
                    (If
                        ()
                        (IntegerCompare
                            (Var 32 result)
                            NotEq
                            (IntegerConstant 0 (Integer 4) Decimal)
                            (Logical 4)
                            ()
                        )
                        [(WhileLoop
                            ()
                            (StringCompare
                                (StringItem
                                    (Var 32 str)
                                    (Var 32 result)
                                    (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                    ()
                                )
                                Eq
                                (StringConstant
                                    " "
                                    (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                )
                                (Logical 4)
                                ()
                            )
                            [(Assignment
                                (Var 32 result)
                                (IntegerBinOp
                                    (Var 32 result)
                                    Sub
                                    (IntegerConstant 1 (Integer 4) Decimal)
                                    (Integer 4)
                                    ()
                                )
                                ()
                                .false.
                                .false.
                            )
                            (If
                                ()
                                (IntegerCompare
                                    (Var 32 result)
                                    Eq
                                    (IntegerConstant 0 (Integer 4) Decimal)
                                    (Logical 4)
                                    ()
                                )
                                [(Exit
                                    ()
                                )]
                                []
                            )]
                            []
                        )]
                        []
                    )]
                    (Var 32 result)
                    Public
                    .false.
                    .false.
                    ()
                ),
            _lcompilers_len_trim_str7:
                (Function
                    (SymbolTable
                        34
                        {
                            result:
                                (Variable
                                    34
                                    result
                                    []
                                    ReturnVar
                                    ()
                                    ()
                                    Default
                                    (Integer 4)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            str:
                                (Variable
                                    34
                                    str
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (String 1 () AssumedLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                )
                        })
                    _lcompilers_len_trim_str7
                    (FunctionType
                        [(String 1 () AssumedLength DescriptorString)]
                        (Integer 4)
                        ExternalUndefined
                        Implementation
                        ()
                        .false.
                        .false.
                        .false.
                        .false.
                        .false.
                        []
                        .false.
                    )
                    []
                    [(Var 34 str)]
                    [(Assignment
                        (Var 34 result)
                        (Cast
                            (StringLen
                                (Var 34 str)
                                (Integer 4)
                                ()
                            )
                            IntegerToInteger
                            (Integer 4)
                            ()
                            ()
                        )
                        ()
                        .false.
                        .false.
                    )
                    (If
                        ()
                        (IntegerCompare
                            (Var 34 result)
                            NotEq
                            (IntegerConstant 0 (Integer 4) Decimal)
                            (Logical 4)
                            ()
                        )
                        [(WhileLoop
                            ()
                            (StringCompare
                                (StringItem
                                    (Var 34 str)
                                    (Var 34 result)
                                    (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                    ()
                                )
                                Eq
                                (StringConstant
                                    " "
                                    (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                )
                                (Logical 4)
                                ()
                            )
                            [(Assignment
                                (Var 34 result)
                                (IntegerBinOp
                                    (Var 34 result)
                                    Sub
                                    (IntegerConstant 1 (Integer 4) Decimal)
                                    (Integer 4)
                                    ()
                                )
                                ()
                                .false.
                                .false.
                            )
                            (If
                                ()
                                (IntegerCompare
                                    (Var 34 result)
                                    Eq
                                    (IntegerConstant 0 (Integer 4) Decimal)
                                    (Logical 4)
                                    ()
                                )
                                [(Exit
                                    ()
                                )]
                                []
                            )]
                            []
                        )]
                        []
                    )]
                    (Var 34 result)
                    Public
                    .false.
                    .false.
                    ()
                ),
            _lcompilers_stringconcat:
                (Function
                    (SymbolTable
                        15
                        {
                            concat_result:
                                (Variable
                                    15
                                    concat_result
                                    []
                                    Out
                                    ()
                                    ()
                                    Default
                                    (Allocatable
                                        (String 1 () DeferredLength DescriptorString)
                                    )
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            s1:
                                (Variable
                                    15
                                    s1
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (String 1 () AssumedLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            s1_len:
                                (Variable
                                    15
                                    s1_len
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (Integer 4)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            s2:
                                (Variable
                                    15
                                    s2
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (String 1 () AssumedLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            s2_len:
                                (Variable
                                    15
                                    s2_len
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (Integer 4)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                )
                        })
                    _lcompilers_stringconcat
                    (FunctionType
                        [(String 1 () AssumedLength DescriptorString)
                        (String 1 () AssumedLength DescriptorString)
                        (Integer 4)
                        (Integer 4)
                        (Allocatable
                            (String 1 () DeferredLength DescriptorString)
                        )]
                        ()
                        ExternalUndefined
                        Implementation
                        ()
                        .false.
                        .false.
                        .false.
                        .false.
                        .false.
                        []
                        .false.
                    )
                    []
                    [(Var 15 s1)
                    (Var 15 s2)
                    (Var 15 s1_len)
                    (Var 15 s2_len)
                    (Var 15 concat_result)]
                    [(Allocate
                        [((Var 15 concat_result)
                        []
                        (IntegerBinOp
                            (Var 15 s1_len)
                            Add
                            (Var 15 s2_len)
                            (Integer 4)
                            ()
                        )
                        ()
                        ())]
                        ()
                        ()
                        ()
                    )
                    (Assignment
                        (StringSection
                            (Var 15 concat_result)
                            (IntegerConstant 1 (Integer 4) Decimal)
                            (Var 15 s1_len)
                            (IntegerConstant 1 (Integer 4) Decimal)
                            (String 1 (IntegerBinOp
                                (IntegerBinOp
                                    (Var 15 s1_len)
                                    Sub
                                    (IntegerConstant 1 (Integer 4) Decimal)
                                    (Integer 4)
                                    ()
                                )
                                Add
                                (IntegerConstant 1 (Integer 4) Decimal)
                                (Integer 4)
                                ()
                            ) ExpressionLength DescriptorString)
                            ()
                        )
                        (Var 15 s1)
                        ()
                        .false.
                        .false.
                    )
                    (Assignment
                        (StringSection
                            (Var 15 concat_result)
                            (IntegerBinOp
                                (Var 15 s1_len)
                                Add
                                (IntegerConstant 1 (Integer 4) Decimal)
                                (Integer 4)
                                ()
                            )
                            (StringLen
                                (Var 15 concat_result)
                                (Integer 4)
                                ()
                            )
                            (IntegerConstant 1 (Integer 4) Decimal)
                            (String 1 (IntegerBinOp
                                (IntegerBinOp
                                    (StringLen
                                        (Var 15 concat_result)
                                        (Integer 4)
                                        ()
                                    )
                                    Sub
                                    (IntegerBinOp
                                        (Var 15 s1_len)
                                        Add
                                        (IntegerConstant 1 (Integer 4) Decimal)
                                        (Integer 4)
                                        ()
                                    )
                                    (Integer 4)
                                    ()
                                )
                                Add
                                (IntegerConstant 1 (Integer 4) Decimal)
                                (Integer 4)
                                ()
                            ) ExpressionLength DescriptorString)
                            ()
                        )
                        (Var 15 s2)
                        ()
                        .false.
                        .false.
                    )]
                    ()
                    Public
                    .false.
                    .false.
                    ()
                ),
            _lcompilers_trim_str:
                (Function
                    (SymbolTable
                        17
                        {
                            result:
                                (Variable
                                    17
                                    result
                                    [_lcompilers_len_trim_str
                                    str]
                                    Out
                                    ()
                                    ()
                                    Default
                                    (String 1 (FunctionCall
                                        1 _lcompilers_len_trim_str
                                        1 _lcompilers_len_trim_str
                                        [((Var 17 str))]
                                        (Integer 4)
                                        ()
                                        ()
                                    ) ExpressionLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            str:
                                (Variable
                                    17
                                    str
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (String 1 () AssumedLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                )
                        })
                    _lcompilers_trim_str
                    (FunctionType
                        [(String 1 () AssumedLength DescriptorString)
                        (String 1 (FunctionCall
                            1 _lcompilers_len_trim_str
                            1 _lcompilers_len_trim_str
                            [((FunctionParam
                                0
                                (String 1 () AssumedLength DescriptorString)
                                ()
                            ))]
                            (Integer 4)
                            ()
                            ()
                        ) ExpressionLength DescriptorString)]
                        ()
                        ExternalUndefined
                        Implementation
                        ()
                        .false.
                        .false.
                        .false.
                        .false.
                        .false.
                        []
                        .false.
                    )
                    [_lcompilers_len_trim_str]
                    [(Var 17 str)
                    (Var 17 result)]
                    [(Assignment
                        (Var 17 result)
                        (StringSection
                            (Var 17 str)
                            (IntegerConstant 1 (Integer 4) Decimal)
                            (FunctionCall
                                1 _lcompilers_len_trim_str
                                1 _lcompilers_len_trim_str
                                [((Var 17 str))]
                                (Integer 4)
                                ()
                                ()
                            )
                            (IntegerConstant 1 (Integer 4) Decimal)
                            (String 1 (IntegerBinOp
                                (IntegerBinOp
                                    (FunctionCall
                                        1 _lcompilers_len_trim_str
                                        1 _lcompilers_len_trim_str
                                        [((Var 17 str))]
                                        (Integer 4)
                                        ()
                                        ()
                                    )
                                    Sub
                                    (IntegerConstant 1 (Integer 4) Decimal)
                                    (Integer 4)
                                    ()
                                )
                                Add
                                (IntegerConstant 1 (Integer 4) Decimal)
                                (Integer 4)
                                ()
                            ) ExpressionLength DescriptorString)
                            ()
                        )
                        ()
                        .false.
                        .false.
                    )]
                    ()
                    Public
                    .false.
                    .false.
                    ()
                ),
            _lcompilers_trim_str1:
                (Function
                    (SymbolTable
                        19
                        {
                            result:
                                (Variable
                                    19
                                    result
                                    [_lcompilers_len_trim_str1
                                    str]
                                    Out
                                    ()
                                    ()
                                    Default
                                    (String 1 (FunctionCall
                                        1 _lcompilers_len_trim_str1
                                        1 _lcompilers_len_trim_str1
                                        [((Var 19 str))]
                                        (Integer 4)
                                        ()
                                        ()
                                    ) ExpressionLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            str:
                                (Variable
                                    19
                                    str
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (String 1 () AssumedLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                )
                        })
                    _lcompilers_trim_str1
                    (FunctionType
                        [(String 1 () AssumedLength DescriptorString)
                        (String 1 (FunctionCall
                            1 _lcompilers_len_trim_str1
                            1 _lcompilers_len_trim_str1
                            [((FunctionParam
                                0
                                (String 1 () AssumedLength DescriptorString)
                                ()
                            ))]
                            (Integer 4)
                            ()
                            ()
                        ) ExpressionLength DescriptorString)]
                        ()
                        ExternalUndefined
                        Implementation
                        ()
                        .false.
                        .false.
                        .false.
                        .false.
                        .false.
                        []
                        .false.
                    )
                    [_lcompilers_len_trim_str1]
                    [(Var 19 str)
                    (Var 19 result)]
                    [(Assignment
                        (Var 19 result)
                        (StringSection
                            (Var 19 str)
                            (IntegerConstant 1 (Integer 4) Decimal)
                            (FunctionCall
                                1 _lcompilers_len_trim_str1
                                1 _lcompilers_len_trim_str1
                                [((Var 19 str))]
                                (Integer 4)
                                ()
                                ()
                            )
                            (IntegerConstant 1 (Integer 4) Decimal)
                            (String 1 (IntegerBinOp
                                (IntegerBinOp
                                    (FunctionCall
                                        1 _lcompilers_len_trim_str1
                                        1 _lcompilers_len_trim_str1
                                        [((Var 19 str))]
                                        (Integer 4)
                                        ()
                                        ()
                                    )
                                    Sub
                                    (IntegerConstant 1 (Integer 4) Decimal)
                                    (Integer 4)
                                    ()
                                )
                                Add
                                (IntegerConstant 1 (Integer 4) Decimal)
                                (Integer 4)
                                ()
                            ) ExpressionLength DescriptorString)
                            ()
                        )
                        ()
                        .false.
                        .false.
                    )]
                    ()
                    Public
                    .false.
                    .false.
                    ()
                ),
            _lcompilers_trim_str2:
                (Function
                    (SymbolTable
                        21
                        {
                            result:
                                (Variable
                                    21
                                    result
                                    [_lcompilers_len_trim_str2
                                    str]
                                    Out
                                    ()
                                    ()
                                    Default
                                    (String 1 (FunctionCall
                                        1 _lcompilers_len_trim_str2
                                        1 _lcompilers_len_trim_str2
                                        [((Var 21 str))]
                                        (Integer 4)
                                        ()
                                        ()
                                    ) ExpressionLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            str:
                                (Variable
                                    21
                                    str
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (String 1 () AssumedLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                )
                        })
                    _lcompilers_trim_str2
                    (FunctionType
                        [(String 1 () AssumedLength DescriptorString)
                        (String 1 (FunctionCall
                            1 _lcompilers_len_trim_str2
                            1 _lcompilers_len_trim_str2
                            [((FunctionParam
                                0
                                (String 1 () AssumedLength DescriptorString)
                                ()
                            ))]
                            (Integer 4)
                            ()
                            ()
                        ) ExpressionLength DescriptorString)]
                        ()
                        ExternalUndefined
                        Implementation
                        ()
                        .false.
                        .false.
                        .false.
                        .false.
                        .false.
                        []
                        .false.
                    )
                    [_lcompilers_len_trim_str2]
                    [(Var 21 str)
                    (Var 21 result)]
                    [(Assignment
                        (Var 21 result)
                        (StringSection
                            (Var 21 str)
                            (IntegerConstant 1 (Integer 4) Decimal)
                            (FunctionCall
                                1 _lcompilers_len_trim_str2
                                1 _lcompilers_len_trim_str2
                                [((Var 21 str))]
                                (Integer 4)
                                ()
                                ()
                            )
                            (IntegerConstant 1 (Integer 4) Decimal)
                            (String 1 (IntegerBinOp
                                (IntegerBinOp
                                    (FunctionCall
                                        1 _lcompilers_len_trim_str2
                                        1 _lcompilers_len_trim_str2
                                        [((Var 21 str))]
                                        (Integer 4)
                                        ()
                                        ()
                                    )
                                    Sub
                                    (IntegerConstant 1 (Integer 4) Decimal)
                                    (Integer 4)
                                    ()
                                )
                                Add
                                (IntegerConstant 1 (Integer 4) Decimal)
                                (Integer 4)
                                ()
                            ) ExpressionLength DescriptorString)
                            ()
                        )
                        ()
                        .false.
                        .false.
                    )]
                    ()
                    Public
                    .false.
                    .false.
                    ()
                ),
            _lcompilers_trim_str3:
                (Function
                    (SymbolTable
                        23
                        {
                            result:
                                (Variable
                                    23
                                    result
                                    [_lcompilers_len_trim_str3
                                    str]
                                    Out
                                    ()
                                    ()
                                    Default
                                    (String 1 (FunctionCall
                                        1 _lcompilers_len_trim_str3
                                        1 _lcompilers_len_trim_str3
                                        [((Var 23 str))]
                                        (Integer 4)
                                        ()
                                        ()
                                    ) ExpressionLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            str:
                                (Variable
                                    23
                                    str
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (String 1 () AssumedLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                )
                        })
                    _lcompilers_trim_str3
                    (FunctionType
                        [(String 1 () AssumedLength DescriptorString)
                        (String 1 (FunctionCall
                            1 _lcompilers_len_trim_str3
                            1 _lcompilers_len_trim_str3
                            [((FunctionParam
                                0
                                (String 1 () AssumedLength DescriptorString)
                                ()
                            ))]
                            (Integer 4)
                            ()
                            ()
                        ) ExpressionLength DescriptorString)]
                        ()
                        ExternalUndefined
                        Implementation
                        ()
                        .false.
                        .false.
                        .false.
                        .false.
                        .false.
                        []
                        .false.
                    )
                    [_lcompilers_len_trim_str3]
                    [(Var 23 str)
                    (Var 23 result)]
                    [(Assignment
                        (Var 23 result)
                        (StringSection
                            (Var 23 str)
                            (IntegerConstant 1 (Integer 4) Decimal)
                            (FunctionCall
                                1 _lcompilers_len_trim_str3
                                1 _lcompilers_len_trim_str3
                                [((Var 23 str))]
                                (Integer 4)
                                ()
                                ()
                            )
                            (IntegerConstant 1 (Integer 4) Decimal)
                            (String 1 (IntegerBinOp
                                (IntegerBinOp
                                    (FunctionCall
                                        1 _lcompilers_len_trim_str3
                                        1 _lcompilers_len_trim_str3
                                        [((Var 23 str))]
                                        (Integer 4)
                                        ()
                                        ()
                                    )
                                    Sub
                                    (IntegerConstant 1 (Integer 4) Decimal)
                                    (Integer 4)
                                    ()
                                )
                                Add
                                (IntegerConstant 1 (Integer 4) Decimal)
                                (Integer 4)
                                ()
                            ) ExpressionLength DescriptorString)
                            ()
                        )
                        ()
                        .false.
                        .false.
                    )]
                    ()
                    Public
                    .false.
                    .false.
                    ()
                ),
            _lcompilers_trim_str4:
                (Function
                    (SymbolTable
                        27
                        {
                            result:
                                (Variable
                                    27
                                    result
                                    [_lcompilers_len_trim_str4
                                    str]
                                    Out
                                    ()
                                    ()
                                    Default
                                    (String 1 (FunctionCall
                                        1 _lcompilers_len_trim_str4
                                        1 _lcompilers_len_trim_str4
                                        [((Var 27 str))]
                                        (Integer 4)
                                        ()
                                        ()
                                    ) ExpressionLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            str:
                                (Variable
                                    27
                                    str
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (String 1 () AssumedLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                )
                        })
                    _lcompilers_trim_str4
                    (FunctionType
                        [(String 1 () AssumedLength DescriptorString)
                        (String 1 (FunctionCall
                            1 _lcompilers_len_trim_str4
                            1 _lcompilers_len_trim_str4
                            [((FunctionParam
                                0
                                (String 1 () AssumedLength DescriptorString)
                                ()
                            ))]
                            (Integer 4)
                            ()
                            ()
                        ) ExpressionLength DescriptorString)]
                        ()
                        ExternalUndefined
                        Implementation
                        ()
                        .false.
                        .false.
                        .false.
                        .false.
                        .false.
                        []
                        .false.
                    )
                    [_lcompilers_len_trim_str4]
                    [(Var 27 str)
                    (Var 27 result)]
                    [(Assignment
                        (Var 27 result)
                        (StringSection
                            (Var 27 str)
                            (IntegerConstant 1 (Integer 4) Decimal)
                            (FunctionCall
                                1 _lcompilers_len_trim_str4
                                1 _lcompilers_len_trim_str4
                                [((Var 27 str))]
                                (Integer 4)
                                ()
                                ()
                            )
                            (IntegerConstant 1 (Integer 4) Decimal)
                            (String 1 (IntegerBinOp
                                (IntegerBinOp
                                    (FunctionCall
                                        1 _lcompilers_len_trim_str4
                                        1 _lcompilers_len_trim_str4
                                        [((Var 27 str))]
                                        (Integer 4)
                                        ()
                                        ()
                                    )
                                    Sub
                                    (IntegerConstant 1 (Integer 4) Decimal)
                                    (Integer 4)
                                    ()
                                )
                                Add
                                (IntegerConstant 1 (Integer 4) Decimal)
                                (Integer 4)
                                ()
                            ) ExpressionLength DescriptorString)
                            ()
                        )
                        ()
                        .false.
                        .false.
                    )]
                    ()
                    Public
                    .false.
                    .false.
                    ()
                ),
            _lcompilers_trim_str5:
                (Function
                    (SymbolTable
                        29
                        {
                            result:
                                (Variable
                                    29
                                    result
                                    [_lcompilers_len_trim_str5
                                    str]
                                    Out
                                    ()
                                    ()
                                    Default
                                    (String 1 (FunctionCall
                                        1 _lcompilers_len_trim_str5
                                        1 _lcompilers_len_trim_str5
                                        [((Var 29 str))]
                                        (Integer 4)
                                        ()
                                        ()
                                    ) ExpressionLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            str:
                                (Variable
                                    29
                                    str
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (String 1 () AssumedLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                )
                        })
                    _lcompilers_trim_str5
                    (FunctionType
                        [(String 1 () AssumedLength DescriptorString)
                        (String 1 (FunctionCall
                            1 _lcompilers_len_trim_str5
                            1 _lcompilers_len_trim_str5
                            [((FunctionParam
                                0
                                (String 1 () AssumedLength DescriptorString)
                                ()
                            ))]
                            (Integer 4)
                            ()
                            ()
                        ) ExpressionLength DescriptorString)]
                        ()
                        ExternalUndefined
                        Implementation
                        ()
                        .false.
                        .false.
                        .false.
                        .false.
                        .false.
                        []
                        .false.
                    )
                    [_lcompilers_len_trim_str5]
                    [(Var 29 str)
                    (Var 29 result)]
                    [(Assignment
                        (Var 29 result)
                        (StringSection
                            (Var 29 str)
                            (IntegerConstant 1 (Integer 4) Decimal)
                            (FunctionCall
                                1 _lcompilers_len_trim_str5
                                1 _lcompilers_len_trim_str5
                                [((Var 29 str))]
                                (Integer 4)
                                ()
                                ()
                            )
                            (IntegerConstant 1 (Integer 4) Decimal)
                            (String 1 (IntegerBinOp
                                (IntegerBinOp
                                    (FunctionCall
                                        1 _lcompilers_len_trim_str5
                                        1 _lcompilers_len_trim_str5
                                        [((Var 29 str))]
                                        (Integer 4)
                                        ()
                                        ()
                                    )
                                    Sub
                                    (IntegerConstant 1 (Integer 4) Decimal)
                                    (Integer 4)
                                    ()
                                )
                                Add
                                (IntegerConstant 1 (Integer 4) Decimal)
                                (Integer 4)
                                ()
                            ) ExpressionLength DescriptorString)
                            ()
                        )
                        ()
                        .false.
                        .false.
                    )]
                    ()
                    Public
                    .false.
                    .false.
                    ()
                ),
            _lcompilers_trim_str6:
                (Function
                    (SymbolTable
                        31
                        {
                            result:
                                (Variable
                                    31
                                    result
                                    [_lcompilers_len_trim_str6
                                    str]
                                    Out
                                    ()
                                    ()
                                    Default
                                    (String 1 (FunctionCall
                                        1 _lcompilers_len_trim_str6
                                        1 _lcompilers_len_trim_str6
                                        [((Var 31 str))]
                                        (Integer 4)
                                        ()
                                        ()
                                    ) ExpressionLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            str:
                                (Variable
                                    31
                                    str
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (String 1 () AssumedLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                )
                        })
                    _lcompilers_trim_str6
                    (FunctionType
                        [(String 1 () AssumedLength DescriptorString)
                        (String 1 (FunctionCall
                            1 _lcompilers_len_trim_str6
                            1 _lcompilers_len_trim_str6
                            [((FunctionParam
                                0
                                (String 1 () AssumedLength DescriptorString)
                                ()
                            ))]
                            (Integer 4)
                            ()
                            ()
                        ) ExpressionLength DescriptorString)]
                        ()
                        ExternalUndefined
                        Implementation
                        ()
                        .false.
                        .false.
                        .false.
                        .false.
                        .false.
                        []
                        .false.
                    )
                    [_lcompilers_len_trim_str6]
                    [(Var 31 str)
                    (Var 31 result)]
                    [(Assignment
                        (Var 31 result)
                        (StringSection
                            (Var 31 str)
                            (IntegerConstant 1 (Integer 4) Decimal)
                            (FunctionCall
                                1 _lcompilers_len_trim_str6
                                1 _lcompilers_len_trim_str6
                                [((Var 31 str))]
                                (Integer 4)
                                ()
                                ()
                            )
                            (IntegerConstant 1 (Integer 4) Decimal)
                            (String 1 (IntegerBinOp
                                (IntegerBinOp
                                    (FunctionCall
                                        1 _lcompilers_len_trim_str6
                                        1 _lcompilers_len_trim_str6
                                        [((Var 31 str))]
                                        (Integer 4)
                                        ()
                                        ()
                                    )
                                    Sub
                                    (IntegerConstant 1 (Integer 4) Decimal)
                                    (Integer 4)
                                    ()
                                )
                                Add
                                (IntegerConstant 1 (Integer 4) Decimal)
                                (Integer 4)
                                ()
                            ) ExpressionLength DescriptorString)
                            ()
                        )
                        ()
                        .false.
                        .false.
                    )]
                    ()
                    Public
                    .false.
                    .false.
                    ()
                ),
            _lcompilers_trim_str7:
                (Function
                    (SymbolTable
                        33
                        {
                            result:
                                (Variable
                                    33
                                    result
                                    [_lcompilers_len_trim_str7
                                    str]
                                    Out
                                    ()
                                    ()
                                    Default
                                    (String 1 (FunctionCall
                                        1 _lcompilers_len_trim_str7
                                        1 _lcompilers_len_trim_str7
                                        [((Var 33 str))]
                                        (Integer 4)
                                        ()
                                        ()
                                    ) ExpressionLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            str:
                                (Variable
                                    33
                                    str
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (String 1 () AssumedLength DescriptorString)
                                    ()
                                    ExternalUndefined
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                )
                        })
                    _lcompilers_trim_str7
                    (FunctionType
                        [(String 1 () AssumedLength DescriptorString)
                        (String 1 (FunctionCall
                            1 _lcompilers_len_trim_str7
                            1 _lcompilers_len_trim_str7
                            [((FunctionParam
                                0
                                (String 1 () AssumedLength DescriptorString)
                                ()
                            ))]
                            (Integer 4)
                            ()
                            ()
                        ) ExpressionLength DescriptorString)]
                        ()
                        ExternalUndefined
                        Implementation
                        ()
                        .false.
                        .false.
                        .false.
                        .false.
                        .false.
                        []
                        .false.
                    )
                    [_lcompilers_len_trim_str7]
                    [(Var 33 str)
                    (Var 33 result)]
                    [(Assignment
                        (Var 33 result)
                        (StringSection
                            (Var 33 str)
                            (IntegerConstant 1 (Integer 4) Decimal)
                            (FunctionCall
                                1 _lcompilers_len_trim_str7
                                1 _lcompilers_len_trim_str7
                                [((Var 33 str))]
                                (Integer 4)
                                ()
                                ()
                            )
                            (IntegerConstant 1 (Integer 4) Decimal)
                            (String 1 (IntegerBinOp
                                (IntegerBinOp
                                    (FunctionCall
                                        1 _lcompilers_len_trim_str7
                                        1 _lcompilers_len_trim_str7
                                        [((Var 33 str))]
                                        (Integer 4)
                                        ()
                                        ()
                                    )
                                    Sub
                                    (IntegerConstant 1 (Integer 4) Decimal)
                                    (Integer 4)
                                    ()
                                )
                                Add
                                (IntegerConstant 1 (Integer 4) Decimal)
                                (Integer 4)
                                ()
                            ) ExpressionLength DescriptorString)
                            ()
                        )
                        ()
                        .false.
                        .false.
                    )]
                    ()
                    Public
                    .false.
                    .false.
                    ()
                ),
            f:
                (Function
                    (SymbolTable
                        35
                        {
                            a:
                                (Variable
                                    35
                                    a
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (Integer 4)
                                    ()
                                    Source
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            b:
                                (Variable
                                    35
                                    b
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (Integer 4)
                                    ()
                                    Source
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            c:
                                (Variable
                                    35
                                    c
                                    []
                                    Local
                                    ()
                                    ()
                                    Default
                                    (Integer 4)
                                    ()
                                    Source
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            d:
                                (Variable
                                    35
                                    d
                                    []
                                    Local
                                    ()
                                    ()
                                    Default
                                    (Integer 4)
                                    ()
                                    Source
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                ),
                            r:
                                (Variable
                                    35
                                    r
                                    []
                                    ReturnVar
                                    ()
                                    ()
                                    Default
                                    (Integer 4)
                                    ()
                                    Source
                                    Public
                                    Required
                                    .false.
                                    .false.
                                    .false.
                                    ()
                                    .false.
                                    .false.
                                    NotMethod
                                    ()
                                    []
                                )
                        })
                    f
                    (FunctionType
                        [(Integer 4)
                        (Integer 4)]
                        (Integer 4)
                        Source
                        Implementation
                        ()
                        .false.
                        .false.
                        .false.
                        .false.
                        .false.
                        []
                        .false.
                    )
                    []
                    [(Var 35 a)
                    (Var 35 b)]
                    [(Assignment
                        (Var 35 c)
                        (IntegerBinOp
                            (IntegerBinOp
                                (Var 35 a)
                                Add
                                (Var 35 b)
                                (Integer 4)
                                ()
                            )
                            Sub
                            (Var 35 d)
                            (Integer 4)
                            ()
                        )
                        ()
                        .false.
                        .false.
                    )
                    (Assignment
                        (Var 35 r)
                        (IntegerBinOp
                            (Var 35 c)
                            Mul
                            (Var 35 a)
                            (Integer 4)
                            ()
                        )
                        ()
                        .false.
                        .false.
                    )]
                    (Var 35 r)
                    Public
                    .true.
                    .true.
                    ()
                ),
            iso_c_binding:
                (IntrinsicModule lfortran_intrinsic_iso_c_binding),
            lfortran_display:
                (Module
                    (SymbolTable
                        2
                        {
                            c_char:
                                (ExternalSymbol
                                    2
                                    c_char
                                    4 c_char
                                    lfortran_intrinsic_iso_c_binding
                                    []
                                    c_char
                                    Public
                                ),
                            c_null_char:
                                (ExternalSymbol
                                    2
                                    c_null_char
                                    4 c_null_char
                                    lfortran_intrinsic_iso_c_binding
                                    []
                                    c_null_char
                                    Public
                                ),
                            display_data:
                                (Function
                                    (SymbolTable
                                        14
                                        {
                                            __libasr__created__var__0_return_slot:
                                                (Variable
                                                    14
                                                    __libasr__created__var__0_return_slot
                                                    []
                                                    Local
                                                    ()
                                                    ()
                                                    Default
                                                    (Allocatable
                                                        (String 1 () DeferredLength DescriptorString)
                                                    )
                                                    ()
                                                    ExternalUndefined
                                                    Public
                                                    Required
                                                    .false.
                                                    .false.
                                                    .false.
                                                    ()
                                                    .false.
                                                    .false.
                                                    NotMethod
                                                    ()
                                                    []
                                                ),
                                            __libasr__created__var__10_return_slot:
                                                (Variable
                                                    14
                                                    __libasr__created__var__10_return_slot
                                                    []
                                                    Local
                                                    ()
                                                    ()
                                                    Default
                                                    (Allocatable
                                                        (String 1 () DeferredLength DescriptorString)
                                                    )
                                                    ()
                                                    ExternalUndefined
                                                    Public
                                                    Required
                                                    .false.
                                                    .false.
                                                    .false.
                                                    ()
                                                    .false.
                                                    .false.
                                                    NotMethod
                                                    ()
                                                    []
                                                ),
                                            __libasr__created__var__11_return_slot:
                                                (Variable
                                                    14
                                                    __libasr__created__var__11_return_slot
                                                    []
                                                    Local
                                                    ()
                                                    ()
                                                    Default
                                                    (Allocatable
                                                        (String 1 () DeferredLength DescriptorString)
                                                    )
                                                    ()
                                                    ExternalUndefined
                                                    Public
                                                    Required
                                                    .false.
                                                    .false.
                                                    .false.
                                                    ()
                                                    .false.
                                                    .false.
                                                    NotMethod
                                                    ()
                                                    []
                                                ),
                                            __libasr__created__var__1_return_slot:
                                                (Variable
                                                    14
                                                    __libasr__created__var__1_return_slot
                                                    []
                                                    Local
                                                    ()
                                                    ()
                                                    Default
                                                    (Allocatable
                                                        (String 1 () DeferredLength DescriptorString)
                                                    )
                                                    ()
                                                    ExternalUndefined
                                                    Public
                                                    Required
                                                    .false.
                                                    .false.
                                                    .false.
                                                    ()
                                                    .false.
                                                    .false.
                                                    NotMethod
                                                    ()
                                                    []
                                                ),
                                            __libasr__created__var__2_return_slot:
                                                (Variable
                                                    14
                                                    __libasr__created__var__2_return_slot
                                                    []
                                                    Local
                                                    ()
                                                    ()
                                                    Default
                                                    (Allocatable
                                                        (String 1 () DeferredLength DescriptorString)
                                                    )
                                                    ()
                                                    ExternalUndefined
                                                    Public
                                                    Required
                                                    .false.
                                                    .false.
                                                    .false.
                                                    ()
                                                    .false.
                                                    .false.
                                                    NotMethod
                                                    ()
                                                    []
                                                ),
                                            __libasr__created__var__3_return_slot:
                                                (Variable
                                                    14
                                                    __libasr__created__var__3_return_slot
                                                    []
                                                    Local
                                                    ()
                                                    ()
                                                    Default
                                                    (Allocatable
                                                        (String 1 () DeferredLength DescriptorString)
                                                    )
                                                    ()
                                                    ExternalUndefined
                                                    Public
                                                    Required
                                                    .false.
                                                    .false.
                                                    .false.
                                                    ()
                                                    .false.
                                                    .false.
                                                    NotMethod
                                                    ()
                                                    []
                                                ),
                                            __libasr__created__var__4_return_slot:
                                                (Variable
                                                    14
                                                    __libasr__created__var__4_return_slot
                                                    []
                                                    Local
                                                    ()
                                                    ()
                                                    Default
                                                    (Allocatable
                                                        (String 1 () DeferredLength DescriptorString)
                                                    )
                                                    ()
                                                    ExternalUndefined
                                                    Public
                                                    Required
                                                    .false.
                                                    .false.
                                                    .false.
                                                    ()
                                                    .false.
                                                    .false.
                                                    NotMethod
                                                    ()
                                                    []
                                                ),
                                            __libasr__created__var__5_return_slot:
                                                (Variable
                                                    14
                                                    __libasr__created__var__5_return_slot
                                                    []
                                                    Local
                                                    ()
                                                    ()
                                                    Default
                                                    (Allocatable
                                                        (String 1 () DeferredLength DescriptorString)
                                                    )
                                                    ()
                                                    ExternalUndefined
                                                    Public
                                                    Required
                                                    .false.
                                                    .false.
                                                    .false.
                                                    ()
                                                    .false.
                                                    .false.
                                                    NotMethod
                                                    ()
                                                    []
                                                ),
                                            __libasr__created__var__6_return_slot:
                                                (Variable
                                                    14
                                                    __libasr__created__var__6_return_slot
                                                    []
                                                    Local
                                                    ()
                                                    ()
                                                    Default
                                                    (Allocatable
                                                        (String 1 () DeferredLength DescriptorString)
                                                    )
                                                    ()
                                                    ExternalUndefined
                                                    Public
                                                    Required
                                                    .false.
                                                    .false.
                                                    .false.
                                                    ()
                                                    .false.
                                                    .false.
                                                    NotMethod
                                                    ()
                                                    []
                                                ),
                                            __libasr__created__var__7_return_slot:
                                                (Variable
                                                    14
                                                    __libasr__created__var__7_return_slot
                                                    []
                                                    Local
                                                    ()
                                                    ()
                                                    Default
                                                    (Allocatable
                                                        (String 1 () DeferredLength DescriptorString)
                                                    )
                                                    ()
                                                    ExternalUndefined
                                                    Public
                                                    Required
                                                    .false.
                                                    .false.
                                                    .false.
                                                    ()
                                                    .false.
                                                    .false.
                                                    NotMethod
                                                    ()
                                                    []
                                                ),
                                            __libasr__created__var__8_return_slot:
                                                (Variable
                                                    14
                                                    __libasr__created__var__8_return_slot
                                                    []
                                                    Local
                                                    ()
                                                    ()
                                                    Default
                                                    (Allocatable
                                                        (String 1 () DeferredLength DescriptorString)
                                                    )
                                                    ()
                                                    ExternalUndefined
                                                    Public
                                                    Required
                                                    .false.
                                                    .false.
                                                    .false.
                                                    ()
                                                    .false.
                                                    .false.
                                                    NotMethod
                                                    ()
                                                    []
                                                ),
                                            __libasr__created__var__9_return_slot:
                                                (Variable
                                                    14
                                                    __libasr__created__var__9_return_slot
                                                    []
                                                    Local
                                                    ()
                                                    ()
                                                    Default
                                                    (Allocatable
                                                        (String 1 () DeferredLength DescriptorString)
                                                    )
                                                    ()
                                                    ExternalUndefined
                                                    Public
                                                    Required
                                                    .false.
                                                    .false.
                                                    .false.
                                                    ()
                                                    .false.
                                                    .false.
                                                    NotMethod
                                                    ()
                                                    []
                                                ),
                                            data:
                                                (Variable
                                                    14
                                                    data
                                                    []
                                                    In
                                                    ()
                                                    ()
                                                    Default
                                                    (String 1 () AssumedLength DescriptorString)
                                                    ()
                                                    ExternalUndefined
                                                    Public
                                                    Required
                                                    .false.
                                                    .false.
                                                    .false.
                                                    ()
                                                    .false.
                                                    .false.
                                                    NotMethod
                                                    ()
                                                    []
                                                ),
                                            mime_type:
                                                (Variable
                                                    14
                                                    mime_type
                                                    []
                                                    In
                                                    ()
                                                    ()
                                                    Default
                                                    (String 1 () AssumedLength DescriptorString)
                                                    ()
                                                    ExternalUndefined
                                                    Public
                                                    Required
                                                    .false.
                                                    .false.
                                                    .false.
                                                    ()
                                                    .false.
                                                    .false.
                                                    NotMethod
                                                    ()
                                                    []
                                                )
                                        })
                                    display_data
                                    (FunctionType
                                        [(String 1 () AssumedLength DescriptorString)
                                        (String 1 () AssumedLength DescriptorString)]
                                        ()
                                        ExternalUndefined
                                        Implementation
                                        ()
                                        .false.
                                        .false.
                                        .false.
                                        .false.
                                        .false.
                                        []
                                        .false.
                                    )
                                    [_lcompilers_len_trim_str
                                    _lcompilers_trim_str
                                    _lcompilers_len_trim_str1
                                    _lcompilers_trim_str1
                                    _lcompilers_stringconcat
                                    _lcompilers_len_trim_str2
                                    _lcompilers_trim_str2
                                    _lcompilers_len_trim_str3
                                    _lcompilers_trim_str3
                                    _lcompilers_len_trim_str4
                                    _lcompilers_trim_str4
                                    _lcompilers_len_trim_str5
                                    _lcompilers_trim_str5
                                    _lcompilers_len_trim_str6
                                    _lcompilers_trim_str6
                                    _lcompilers_len_trim_str7
                                    _lcompilers_trim_str7
                                    lf_display_data]
                                    [(Var 14 mime_type)
                                    (Var 14 data)]
                                    [(ExplicitDeallocate
                                        [(Var 14 __libasr__created__var__0_return_slot)]
                                    )
                                    (Allocate
                                        [((Var 14 __libasr__created__var__0_return_slot)
                                        []
                                        (FunctionCall
                                            1 _lcompilers_len_trim_str
                                            1 _lcompilers_len_trim_str
                                            [((Var 14 mime_type))]
                                            (Integer 4)
                                            ()
                                            ()
                                        )
                                        ()
                                        ())]
                                        ()
                                        ()
                                        ()
                                    )
                                    (SubroutineCall
                                        1 _lcompilers_trim_str
                                        ()
                                        [((Var 14 mime_type))
                                        ((Var 14 __libasr__created__var__0_return_slot))]
                                        ()
                                        .true.
                                    )
                                    (ExplicitDeallocate
                                        [(Var 14 __libasr__created__var__1_return_slot)]
                                    )
                                    (Allocate
                                        [((Var 14 __libasr__created__var__1_return_slot)
                                        []
                                        (FunctionCall
                                            1 _lcompilers_len_trim_str1
                                            1 _lcompilers_len_trim_str1
                                            [((Var 14 mime_type))]
                                            (Integer 4)
                                            ()
                                            ()
                                        )
                                        ()
                                        ())]
                                        ()
                                        ()
                                        ()
                                    )
                                    (SubroutineCall
                                        1 _lcompilers_trim_str1
                                        ()
                                        [((Var 14 mime_type))
                                        ((Var 14 __libasr__created__var__1_return_slot))]
                                        ()
                                        .true.
                                    )
                                    (ExplicitDeallocate
                                        [(Var 14 __libasr__created__var__2_return_slot)]
                                    )
                                    (SubroutineCall
                                        1 _lcompilers_stringconcat
                                        ()
                                        [((Var 14 __libasr__created__var__0_return_slot))
                                        ((StringConstant
                                            ""
                                            (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                        ))
                                        ((StringLen
                                            (Var 14 __libasr__created__var__1_return_slot)
                                            (Integer 4)
                                            ()
                                        ))
                                        ((Cast
                                            (IntegerConstant 1 (Integer 4) Decimal)
                                            IntegerToInteger
                                            (Integer 4)
                                            (IntegerConstant 1 (Integer 4) Decimal)
                                            ()
                                        ))
                                        ((Var 14 __libasr__created__var__2_return_slot))]
                                        ()
                                        .true.
                                    )
                                    (ExplicitDeallocate
                                        [(Var 14 __libasr__created__var__3_return_slot)]
                                    )
                                    (Allocate
                                        [((Var 14 __libasr__created__var__3_return_slot)
                                        []
                                        (FunctionCall
                                            1 _lcompilers_len_trim_str2
                                            1 _lcompilers_len_trim_str2
                                            [((Var 14 mime_type))]
                                            (Integer 4)
                                            ()
                                            ()
                                        )
                                        ()
                                        ())]
                                        ()
                                        ()
                                        ()
                                    )
                                    (SubroutineCall
                                        1 _lcompilers_trim_str2
                                        ()
                                        [((Var 14 mime_type))
                                        ((Var 14 __libasr__created__var__3_return_slot))]
                                        ()
                                        .true.
                                    )
                                    (ExplicitDeallocate
                                        [(Var 14 __libasr__created__var__4_return_slot)]
                                    )
                                    (Allocate
                                        [((Var 14 __libasr__created__var__4_return_slot)
                                        []
                                        (FunctionCall
                                            1 _lcompilers_len_trim_str3
                                            1 _lcompilers_len_trim_str3
                                            [((Var 14 mime_type))]
                                            (Integer 4)
                                            ()
                                            ()
                                        )
                                        ()
                                        ())]
                                        ()
                                        ()
                                        ()
                                    )
                                    (SubroutineCall
                                        1 _lcompilers_trim_str3
                                        ()
                                        [((Var 14 mime_type))
                                        ((Var 14 __libasr__created__var__4_return_slot))]
                                        ()
                                        .true.
                                    )
                                    (ExplicitDeallocate
                                        [(Var 14 __libasr__created__var__5_return_slot)]
                                    )
                                    (SubroutineCall
                                        1 _lcompilers_stringconcat
                                        ()
                                        [((Var 14 __libasr__created__var__3_return_slot))
                                        ((StringConstant
                                            ""
                                            (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                        ))
                                        ((StringLen
                                            (Var 14 __libasr__created__var__4_return_slot)
                                            (Integer 4)
                                            ()
                                        ))
                                        ((Cast
                                            (IntegerConstant 1 (Integer 4) Decimal)
                                            IntegerToInteger
                                            (Integer 4)
                                            (IntegerConstant 1 (Integer 4) Decimal)
                                            ()
                                        ))
                                        ((Var 14 __libasr__created__var__5_return_slot))]
                                        ()
                                        .true.
                                    )
                                    (ExplicitDeallocate
                                        [(Var 14 __libasr__created__var__6_return_slot)]
                                    )
                                    (Allocate
                                        [((Var 14 __libasr__created__var__6_return_slot)
                                        []
                                        (FunctionCall
                                            1 _lcompilers_len_trim_str4
                                            1 _lcompilers_len_trim_str4
                                            [((Var 14 data))]
                                            (Integer 4)
                                            ()
                                            ()
                                        )
                                        ()
                                        ())]
                                        ()
                                        ()
                                        ()
                                    )
                                    (SubroutineCall
                                        1 _lcompilers_trim_str4
                                        ()
                                        [((Var 14 data))
                                        ((Var 14 __libasr__created__var__6_return_slot))]
                                        ()
                                        .true.
                                    )
                                    (ExplicitDeallocate
                                        [(Var 14 __libasr__created__var__7_return_slot)]
                                    )
                                    (Allocate
                                        [((Var 14 __libasr__created__var__7_return_slot)
                                        []
                                        (FunctionCall
                                            1 _lcompilers_len_trim_str5
                                            1 _lcompilers_len_trim_str5
                                            [((Var 14 data))]
                                            (Integer 4)
                                            ()
                                            ()
                                        )
                                        ()
                                        ())]
                                        ()
                                        ()
                                        ()
                                    )
                                    (SubroutineCall
                                        1 _lcompilers_trim_str5
                                        ()
                                        [((Var 14 data))
                                        ((Var 14 __libasr__created__var__7_return_slot))]
                                        ()
                                        .true.
                                    )
                                    (ExplicitDeallocate
                                        [(Var 14 __libasr__created__var__8_return_slot)]
                                    )
                                    (SubroutineCall
                                        1 _lcompilers_stringconcat
                                        ()
                                        [((Var 14 __libasr__created__var__6_return_slot))
                                        ((StringConstant
                                            ""
                                            (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                        ))
                                        ((StringLen
                                            (Var 14 __libasr__created__var__7_return_slot)
                                            (Integer 4)
                                            ()
                                        ))
                                        ((Cast
                                            (IntegerConstant 1 (Integer 4) Decimal)
                                            IntegerToInteger
                                            (Integer 4)
                                            (IntegerConstant 1 (Integer 4) Decimal)
                                            ()
                                        ))
                                        ((Var 14 __libasr__created__var__8_return_slot))]
                                        ()
                                        .true.
                                    )
                                    (ExplicitDeallocate
                                        [(Var 14 __libasr__created__var__9_return_slot)]
                                    )
                                    (Allocate
                                        [((Var 14 __libasr__created__var__9_return_slot)
                                        []
                                        (FunctionCall
                                            1 _lcompilers_len_trim_str6
                                            1 _lcompilers_len_trim_str6
                                            [((Var 14 data))]
                                            (Integer 4)
                                            ()
                                            ()
                                        )
                                        ()
                                        ())]
                                        ()
                                        ()
                                        ()
                                    )
                                    (SubroutineCall
                                        1 _lcompilers_trim_str6
                                        ()
                                        [((Var 14 data))
                                        ((Var 14 __libasr__created__var__9_return_slot))]
                                        ()
                                        .true.
                                    )
                                    (ExplicitDeallocate
                                        [(Var 14 __libasr__created__var__10_return_slot)]
                                    )
                                    (Allocate
                                        [((Var 14 __libasr__created__var__10_return_slot)
                                        []
                                        (FunctionCall
                                            1 _lcompilers_len_trim_str7
                                            1 _lcompilers_len_trim_str7
                                            [((Var 14 data))]
                                            (Integer 4)
                                            ()
                                            ()
                                        )
                                        ()
                                        ())]
                                        ()
                                        ()
                                        ()
                                    )
                                    (SubroutineCall
                                        1 _lcompilers_trim_str7
                                        ()
                                        [((Var 14 data))
                                        ((Var 14 __libasr__created__var__10_return_slot))]
                                        ()
                                        .true.
                                    )
                                    (ExplicitDeallocate
                                        [(Var 14 __libasr__created__var__11_return_slot)]
                                    )
                                    (SubroutineCall
                                        1 _lcompilers_stringconcat
                                        ()
                                        [((Var 14 __libasr__created__var__9_return_slot))
                                        ((StringConstant
                                            ""
                                            (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength DescriptorString)
                                        ))
                                        ((StringLen
                                            (Var 14 __libasr__created__var__10_return_slot)
                                            (Integer 4)
                                            ()
                                        ))
                                        ((Cast
                                            (IntegerConstant 1 (Integer 4) Decimal)
                                            IntegerToInteger
                                            (Integer 4)
                                            (IntegerConstant 1 (Integer 4) Decimal)
                                            ()
                                        ))
                                        ((Var 14 __libasr__created__var__11_return_slot))]
                                        ()
                                        .true.
                                    )
                                    (SubroutineCall
                                        2 lf_display_data
                                        ()
                                        [((Cast
                                            (Var 14 __libasr__created__var__2_return_slot)
                                            StringToArray
                                            (Array
                                                (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength CChar)
                                                [((IntegerConstant 1 (Integer 4) Decimal)
                                                (IntegerBinOp
                                                    (StringLen
                                                        (Var 14 __libasr__created__var__5_return_slot)
                                                        (Integer 4)
                                                        ()
                                                    )
                                                    Div
                                                    (IntegerConstant 1 (Integer 4) Decimal)
                                                    (Integer 4)
                                                    ()
                                                ))]
                                                StringArraySinglePointer
                                            )
                                            ()
                                            ()
                                        ))
                                        ((Cast
                                            (Var 14 __libasr__created__var__8_return_slot)
                                            StringToArray
                                            (Array
                                                (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength CChar)
                                                [((IntegerConstant 1 (Integer 4) Decimal)
                                                (IntegerBinOp
                                                    (StringLen
                                                        (Var 14 __libasr__created__var__11_return_slot)
                                                        (Integer 4)
                                                        ()
                                                    )
                                                    Div
                                                    (IntegerConstant 1 (Integer 4) Decimal)
                                                    (Integer 4)
                                                    ()
                                                ))]
                                                StringArraySinglePointer
                                            )
                                            ()
                                            ()
                                        ))]
                                        ()
                                        .false.
                                    )]
                                    ()
                                    Public
                                    .false.
                                    .false.
                                    ()
                                ),
                            lf_display_data:
                                (Function
                                    (SymbolTable
                                        13
                                        {
                                            mime:
                                                (Variable
                                                    13
                                                    mime
                                                    []
                                                    In
                                                    ()
                                                    ()
                                                    Default
                                                    (Array
                                                        (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength CChar)
                                                        [(()
                                                        ())]
                                                        StringArraySinglePointer
                                                    )
                                                    ()
                                                    BindC
                                                    Public
                                                    Required
                                                    .false.
                                                    .false.
                                                    .false.
                                                    ()
                                                    .false.
                                                    .false.
                                                    NotMethod
                                                    ()
                                                    []
                                                ),
                                            payload:
                                                (Variable
                                                    13
                                                    payload
                                                    []
                                                    In
                                                    ()
                                                    ()
                                                    Default
                                                    (Array
                                                        (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength CChar)
                                                        [(()
                                                        ())]
                                                        StringArraySinglePointer
                                                    )
                                                    ()
                                                    BindC
                                                    Public
                                                    Required
                                                    .false.
                                                    .false.
                                                    .false.
                                                    ()
                                                    .false.
                                                    .false.
                                                    NotMethod
                                                    ()
                                                    []
                                                )
                                        })
                                    lf_display_data
                                    (FunctionType
                                        [(Array
                                            (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength CChar)
                                            [(()
                                            ())]
                                            StringArraySinglePointer
                                        )
                                        (Array
                                            (String 1 (IntegerConstant 1 (Integer 4) Decimal) ExpressionLength CChar)
                                            [(()
                                            ())]
                                            StringArraySinglePointer
                                        )]
                                        ()
                                        BindC
                                        Interface
                                        "lfortran_display_data"
                                        .false.
                                        .false.
                                        .false.
                                        .false.
                                        .false.
                                        []
                                        .false.
                                    )
                                    []
                                    [(Var 13 mime)
                                    (Var 13 payload)]
                                    []
                                    ()
                                    Public
                                    .false.
                                    .false.
                                    ()
                                )
                        })
                    lfortran_display
                    ()
                    [iso_c_binding]
                    .false.
                    .false.
                    .false.
                )
        })
    []
)

ASR 有所有的语义信息(类型等),像 Function 这样的节点有一个符号表,没有任何声明节点。变量只是指向符号表的指针。

The ASR can also be exported in JSON, including source file name, line and column information: lfortran example.f90 --show-asr --json

讨论

上面是一个简单的例子。对于更复杂的示例,事情变得更加明显,例如:

integer function f2b(a) result(r)
use gfort_interop, only: c_desc1_int32
integer, intent(in) :: a(:)
interface
    integer function f2b_c_wrapper(a) bind(c, name="__mod1_MOD_f2b")
    use gfort_interop, only: c_desc1_t
    type(c_desc1_t), intent(in) :: a
    end function
end interface
r = f2b_c_wrapper(c_desc1_int32(a))
end function

AST 必须代表所有的 use 语句和 interface 块,并保持语义一致。

另一方面,ASR 跟踪符号表中的 c_desc1_int32c_desc1_tf2b_c_wrapper,并且知道它们是在 gfort_interop 模块中定义的,因此 ASR 没有任何这些声明节点。

从 ASR 转换为 AST 时,LFortran 将自动且正确地创建所有适当的 AST 声明节点。