开发者教程

这是任何想要开发 LFortran 或构建工具的人的教程。

入门

LFortran 围绕两个独立的模块 AST 和 ASR 构建,这两个模块都是独立的(完全独立于 LFortran 的其余部分),鼓励用户将它们独立用于其他应用程序并在其上构建工具:

  • 抽象语法树 (AST):表示任何 Fortran 源代码,严格基于语法,不包含语义。 AST 模块可以将自身转换为 Fortran 源代码。

  • 抽象语义表示 (ASR):表示有效的 Fortran 源代码,包括所有语义。不允许使用无效的 Fortran 代码(将给出错误)。 ASR 模块可以将自身转换为 AST。

抽象语法树 (AST)

Fortran 源代码可以使用 src_to_ast() 函数解析为 AST:

[1]:
integer function f(a, b) result(r)
integer, intent(in) :: a, b
r = a + b
end function

我们可以使用 %%showast 魔法漂亮地打印它:

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

我们可以使用 %%showfmt 将 AST 转换为 Fortran 源代码:

[3]:
%%showfmt
integer function f(a, b) result(r)
integer, intent(in) :: a, b
r = a + b
end function
integer function f(a, b) result(r)
integer, intent(in) :: a, b
r = a + b
end function f

所有 AST 节点及其参数都在 AST.asdl 中描述。

抽象语义表示 (ASR)

我们可以使用 %%showasr 魔法进行漂亮的打印:

[4]:
%%showasr
integer function f(a, b) result(r)
integer, intent(in) :: a, b
r = a + b
end function
(TranslationUnit
    (SymbolTable
        1
        {
            f:
                (Function
                    (SymbolTable
                        3
                        {
                            a:
                                (Variable
                                    3
                                    a
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (Integer 4)
                                    ()
                                    Source
                                    Public
                                    Required
                                    .false.
                                ),
                            b:
                                (Variable
                                    3
                                    b
                                    []
                                    In
                                    ()
                                    ()
                                    Default
                                    (Integer 4)
                                    ()
                                    Source
                                    Public
                                    Required
                                    .false.
                                ),
                            r:
                                (Variable
                                    3
                                    r
                                    []
                                    ReturnVar
                                    ()
                                    ()
                                    Default
                                    (Integer 4)
                                    ()
                                    Source
                                    Public
                                    Required
                                    .false.
                                )
                        })
                    f
                    (FunctionType
                        [(Integer 4)
                        (Integer 4)]
                        (Integer 4)
                        Source
                        Implementation
                        ()
                        .false.
                        .false.
                        .false.
                        .false.
                        .false.
                        []
                        .false.
                    )
                    []
                    [(Var 3 a)
                    (Var 3 b)]
                    [(Assignment
                        (Var 3 r)
                        (IntegerBinOp
                            (Var 3 a)
                            Add
                            (Var 3 b)
                            (Integer 4)
                            ()
                        )
                        ()
                    )]
                    (Var 3 r)
                    Public
                    .false.
                    .false.
                    ()
                )
        })
    []
)

所有 ASR 节点及其参数都在 ASR.asdl 中描述。