查看源代码 cerl_trees (编译器 v8.5.4)

关于 Core Erlang 抽象语法树的基本函数。

注意

Erlang 编译器的公共接口可以在模块 compile 中找到。

此模块是编译器的内部组成部分。其 API 不保证在版本之间保持兼容。

语法树在模块 cerl 中定义。

概述

函数

返回树中最长路径的长度。

对树的节点执行折叠操作。

类似于 variables/1,但仅包含树中自由的变量。

检索 Tree 的标签。

等效于 label(Tree, 0)

标记树中的每个表达式。

将一个函数映射到树的节点上。

对树的节点执行组合的映射/折叠操作。

对树的节点执行组合的映射/折叠操作。

返回一个比语法树中任何其他整数变量名都高的整数变量名。

返回 Tree 中的节点数。

返回语法树中所有变量的名称(包括函数名称变量)的有序集列表。

类型

-type cerl() :: cerl:cerl().

函数

-spec depth(Tree :: cerl()) -> non_neg_integer().

返回树中最长路径的长度。

叶子节点的深度为零,表示 “{foo, bar}” 的树的深度为 1,依此类推。

链接到此函数

fold(Function, Unit, Term)

查看源代码
-spec fold(Function :: fun((cerl(), term()) -> term()), Unit :: term(), Term :: cerl()) -> term().

对树的节点执行折叠操作。

结果是 Function(X1, Function(X2, ... Function(Xn, Unit) ... )) 的值,其中 X1, ..., XnTree 的节点,按照后序遍历的顺序排列。

另请参阅:mapfold/3

-spec free_variables(Tree :: cerl()) -> [cerl:var_name()].

类似于 variables/1,但仅包含树中自由的变量。

另请参阅:next_free_variable_name/1, variables/1

-spec get_label(Tree :: cerl()) -> top | integer().

检索 Tree 的标签。

如果 Tree 没有标签,或者 Tree 不代表格式良好的 Core Erlang 语法树,则会抛出异常。

-spec label(cerl()) -> {cerl(), integer()}.

等效于 label(Tree, 0)

-spec label(Tree :: cerl(), N :: integer()) -> {cerl(), integer()}.

标记树中的每个表达式。

术语 {label, L} 会被添加到每个表达式节点的注释列表的前面,其中 L 是每个节点的唯一编号,变量(和函数名称变量)除外,如果它们表示相同的变量,则获得相同的标签。常量文字节点不被标记。

返回的值是一个元组 {NewTree, Max},其中 NewTree 是标记后的树,Max 是 1 加上所使用的最大标签值。所有先前形式为 {label, X} 的注释术语都将被删除。

树中使用的 L 值是 NMax - 1 的密集范围,其中 N =< Max =< N + size(Tree)。请注意,可能根本没有使用标签,即 N = Max

注意:自由变量的所有实例都将被赋予不同的标签。

另请参阅:label/1, size/1

-spec map(Function :: fun((cerl()) -> cerl()), Tree :: cerl()) -> cerl().

将一个函数映射到树的节点上。

这会将树中的每个节点替换为将给定函数应用于原始节点(自下而上)的结果。

另请参阅:mapfold/3

链接到此函数

mapfold(Function, Initial, Tree)

查看源代码
-spec mapfold(Function :: fun((cerl(), term()) -> {cerl(), term()}), Initial :: term(), Tree :: cerl()) ->
                 {cerl(), term()}.

对树的节点执行组合的映射/折叠操作。

这类似于 map/2,但也从 Function 的每个应用程序向下一个应用程序传播一个值,从给定的值 Initial 开始,同时对树进行后序遍历,很像 fold/3

这等效于以一个恒等函数作为前置操作的 mapfold/4

另请参阅: fold/3, map/2, mapfold/4

链接到此函数

mapfold(Pre, Post, Initial, Tree)

查看源代码
-spec mapfold(Pre :: fun((cerl(), term()) -> {cerl(), term()} | skip),
              Post :: fun((cerl(), term()) -> {cerl(), term()}),
              Initial :: term(),
              Tree :: cerl()) ->
                 {cerl(), term()}.

对树的节点执行组合的映射/折叠操作。

它首先使用 Initial 值在树上调用 PrePre 必须返回一个带有更新的累加器的树,或者原子 skip

如果返回一个树,则此函数会解构返回的树的顶部节点,并使用返回的值作为新的初始值,递归处理子节点,并将返回的值从一个调用传递到下一个调用。最后,它从子节点重新组装顶部节点,在其上调用 Post 并返回结果。

如果返回 skip,则它将按原样返回树和累加器。

链接到此函数

next_free_variable_name(Tree)

查看源代码
-spec next_free_variable_name(Tree :: cerl()) -> integer().

返回一个比语法树中任何其他整数变量名都高的整数变量名。

如果 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 语法树,则会抛出异常。

另请参阅: free_variables/1, next_free_variable_name/1