开发者教程¶
这是任何想要开发 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 中描述。