查看源代码 cerl_trees (编译器 v8.5.4)
关于 Core Erlang 抽象语法树的基本函数。
注意
Erlang 编译器的公共接口可以在模块
compile
中找到。此模块是编译器的内部组成部分。其 API 不保证在版本之间保持兼容。
语法树在模块 cerl
中定义。
概述
函数
返回树中最长路径的长度。
对树的节点执行折叠操作。
类似于 variables/1
,但仅包含树中自由的变量。
检索 Tree
的标签。
等效于 label(Tree, 0)。
标记树中的每个表达式。
将一个函数映射到树的节点上。
对树的节点执行组合的映射/折叠操作。
对树的节点执行组合的映射/折叠操作。
返回一个比语法树中任何其他整数变量名都高的整数变量名。
返回 Tree
中的节点数。
返回语法树中所有变量的名称(包括函数名称变量)的有序集列表。
类型
函数
-spec depth(Tree :: cerl()) -> non_neg_integer().
返回树中最长路径的长度。
叶子节点的深度为零,表示 “{foo, bar}
” 的树的深度为 1,依此类推。
对树的节点执行折叠操作。
结果是 Function(X1, Function(X2, ... Function(Xn, Unit) ... ))
的值,其中 X1, ..., Xn
是 Tree
的节点,按照后序遍历的顺序排列。
另请参阅:mapfold/3
。
-spec free_variables(Tree :: cerl()) -> [cerl:var_name()].
类似于 variables/1
,但仅包含树中自由的变量。
检索 Tree
的标签。
如果 Tree
没有标签,或者 Tree
不代表格式良好的 Core Erlang 语法树,则会抛出异常。
等效于 label(Tree, 0)。
标记树中的每个表达式。
术语 {label, L}
会被添加到每个表达式节点的注释列表的前面,其中 L 是每个节点的唯一编号,变量(和函数名称变量)除外,如果它们表示相同的变量,则获得相同的标签。常量文字节点不被标记。
返回的值是一个元组 {NewTree, Max}
,其中 NewTree
是标记后的树,Max
是 1 加上所使用的最大标签值。所有先前形式为 {label, X}
的注释术语都将被删除。
树中使用的 L 值是 N
到 Max - 1
的密集范围,其中 N =< Max =< N + size(Tree)
。请注意,可能根本没有使用标签,即 N = Max
。
注意:自由变量的所有实例都将被赋予不同的标签。
将一个函数映射到树的节点上。
这会将树中的每个节点替换为将给定函数应用于原始节点(自下而上)的结果。
另请参阅:mapfold/3
。
-spec mapfold(Function :: fun((cerl(), term()) -> {cerl(), term()}), Initial :: term(), Tree :: cerl()) -> {cerl(), term()}.
对树的节点执行组合的映射/折叠操作。
这类似于 map/2
,但也从 Function
的每个应用程序向下一个应用程序传播一个值,从给定的值 Initial
开始,同时对树进行后序遍历,很像 fold/3
。
这等效于以一个恒等函数作为前置操作的 mapfold/4
。
-spec mapfold(Pre :: fun((cerl(), term()) -> {cerl(), term()} | skip), Post :: fun((cerl(), term()) -> {cerl(), term()}), Initial :: term(), Tree :: cerl()) -> {cerl(), term()}.
对树的节点执行组合的映射/折叠操作。
它首先使用 Initial
值在树上调用 Pre
。Pre
必须返回一个带有更新的累加器的树,或者原子 skip
。
如果返回一个树,则此函数会解构返回的树的顶部节点,并使用返回的值作为新的初始值,递归处理子节点,并将返回的值从一个调用传递到下一个调用。最后,它从子节点重新组装顶部节点,在其上调用 Post
并返回结果。
如果返回 skip
,则它将按原样返回树和累加器。
返回一个比语法树中任何其他整数变量名都高的整数变量名。
如果 Tree
不代表格式良好的 Core Erlang 语法树,则会抛出异常。
另请参阅: free_variables/1
, variables/1
。
-spec size(Tree :: cerl()) -> non_neg_integer().
返回 Tree
中的节点数。
-spec variables(Tree :: cerl()) -> [cerl:var_name()].
返回语法树中所有变量的名称(包括函数名称变量)的有序集列表。
如果 Tree
不代表格式良好的 Core Erlang 语法树,则会抛出异常。