开发者教程¶
这是任何想要开发 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 ())] ())] [(= 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)] [(= (Var 3 r) (IntegerBinOp (Var 3 a) Add (Var 3 b) (Integer 4 []) ()) ())] (Var 3 r) Public .false. .false.)}) [])
所有 ASR 节点及其参数都在 ASR.asdl 中描述。