查看源代码 erl_syntax (syntax_tools v3.2.1)

抽象 Erlang 语法树。

此模块定义了一个抽象数据类型,用于将 Erlang 源代码表示为语法树,该方式与 Erlang 标准库解析器模块 erl_parse(通常被称为“解析树”,这有点用词不当)创建的数据结构向后兼容。这意味着所有 erl_parse 树都是有效的抽象语法树,但反之则不然:抽象语法树通常不能用作期望 erl_parse 树的函数的输入。但是,只要抽象语法树表示正确的 Erlang 程序,函数 revert/1 就应该能够将其转换为相应的 erl_parse 表示形式。

对于首次使用的用户,建议的起点是 syntaxTree() 数据类型的文档以及函数 type/1

注意

此模块处理句法实体(而非语义实体)的组成和分解;其目的是隐藏对用于表示这些实体的数据结构的所有直接引用。除了少数例外,此模块中的函数不对其输入执行任何语义解释,并且通常假定用户传递类型正确的参数——如果不是这样,则效果未定义。

除了 erl_parse() 数据结构外,抽象语法树的内部表示形式可能会在不通知的情况下发生更改,并且不应在此模块之外进行记录。此外,我们不保证抽象语法树如何表示,但以下情况例外:没有语法树由单个原子(例如 none)、列表构造函数 [X | Y] 或空列表 [] 表示。在编写对语法树进行操作的函数时,可以依赖这一点。

概要

函数

创建一个抽象空列表。

返回与 Erlang 术语对应的语法树。

将术语 Annotation 追加到 Node 的用户注释列表中。

Comments 追加到 Node 的后置注释中。

Comments 追加到 Node 的前置注释中。

创建一个抽象的带注释的类型表达式。

返回 annotated_type 节点的类型子树。

返回 annotated_type 节点的名称子树。

创建一个抽象的函数应用表达式。

创建一个抽象的函数应用表达式。

返回 application 节点的参数子树列表。

返回 application 节点的操作符子树。

创建一个抽象的元数限定符。

返回 arity_qualifier 节点的参数(元数)子树。

返回 arity_qualifier 节点的正文子树。

创建一个抽象的原子字面量。

返回 atom 节点表示的字面量字符串。

返回 atom 节点表示的字面量字符串。

返回 atom 节点的打印名称。

返回 atom 节点表示的值。

创建一个抽象的程序属性。

返回 attribute 节点的参数子树列表(如果有)。

返回 attribute 节点的名称子树。

创建一个抽象的二进制对象模板。

创建一个抽象的二进制推导式。

返回 binary_comp 节点的主体子树列表。

返回 binary_comp 节点的模板子树。

创建一个抽象的二进制模板字段。

创建一个抽象的二进制模板字段。

返回 binary_field 的主体子树。

返回 binary_field 节点的大小说明符子树(如果有)。

返回 binary_field 节点的类型说明符子树列表。

返回 binary 节点的字段子树列表。

创建一个抽象的 binary_generator。

返回 generator 节点的主体子树。

返回 generator 节点的模式子树。

创建一个抽象的位串类型。

返回 bitstring_type 节点的起始位数 M

返回 bitstring_type 节点的段大小 N

创建一个抽象的块表达式。

返回 block_expr 节点的主体子树列表。

创建一个抽象的 case 表达式。

返回 case_expr 节点的参数子树。

返回 case_expr 节点的子句子树列表。

创建一个抽象的 catch 表达式。

返回 catch_expr 节点的主体子树。

创建一个抽象的字符字面量。

返回 char 节点表示的字面量字符串。

返回 char 节点表示的字面量字符串。

返回 char 节点表示的值。

创建一个抽象的类限定符。

创建一个抽象的类限定符。

返回 class_qualifier 节点的参数(类)子树。

返回 class_qualifier 节点的主体子树。

返回 class_qualifier 节点的堆栈跟踪子树。

创建一个抽象的子句。

返回 clause 节点的主体子树列表。

返回 clause 节点的保护子树(如果有)。

返回 clause 节点的模式子树列表。

创建一个带有给定填充和文本的抽象注释。

返回注释之前的填充量,或 none

返回抽象注释的文本行。

为抽象列表骨架生成最紧凑的形式。

返回语法树表示的 Erlang 术语。

创建一个抽象的合取。

返回 conjunction 节点的主体子树列表。

“优化”列表骨架 cons 操作。

创建一个抽象的约束函数类型。

返回 constrained_function_type 节点的函数约束子树。

返回 constrained_function_type 节点的函数类型子树。

创建一个抽象的(子类型)约束。

返回 constraint 节点的名称子树。

返回 constraint 节点的类型子树。

将用户注释列表从 Source 复制到 Target

将属性从 Source 复制到 Target

将前置和后置注释从 Source 复制到 Target

将注释从 Source 复制到 Target

仅用于特殊目的。返回语法树节点的关联数据。

创建一个抽象的析取。

返回 disjunction 节点的主体子树列表。

创建一个抽象的 else 表达式。

返回 else_expr 节点的子句子树列表。

创建一个抽象的文件结束标记。

创建一个抽象的错误标记。

返回 error_marker 节点的 ErrorInfo 结构。

扁平化 form_list 节点的子列表。

创建一个抽象的浮点字面量。

返回由 float 节点表示的数字字符串。

返回由 float 节点表示的值。

创建一个“源代码形式”的抽象序列。

返回 form_list 节点的子节点列表。

创建一个抽象的 fun 表达式。

返回 fun_expr 节点的元数。

返回 fun_expr 节点的子句子树列表。

创建一个任何类型的抽象 fun。

创建一个抽象的函数定义。

返回 function 节点的元数。

返回 function 节点的子句子树列表。

返回 function 节点的名称子树。

创建一个抽象的函数类型。

返回 function_type 节点的参数类型子树。

返回 function_type 节点的返回类型子树。

创建一个抽象的列表生成器。

返回 generator 节点的主体子树。

返回 generator 节点的模式子树。

返回与语法树关联的用户注释列表。

返回与语法树节点关联的属性的表示。

返回与 Node 关联的注释(参见 //stdlib/erl_anno)。

返回节点的关联后置注释。

返回节点的关联前置注释。

如果节点没有关联的注释,则返回 false,否则返回 true

创建一个抽象的 if 表达式。

返回 if_expr 节点的子句子树列表。

创建一个抽象的“隐式 fun”表达式。

创建一个抽象的“隐式 fun”表达式。

创建一个抽象的模块限定的“隐式 fun”表达式。

返回 implicit_fun 节点的名称子树。

创建一个抽象的中缀运算符表达式。

返回 infix_expr 节点的左侧参数子树。

返回 infix_expr 节点的运算符子树。

返回 infix_expr 节点的右侧参数子树。

创建一个抽象的整数文字。

返回由 integer 节点表示的数字字符串。

创建一个抽象的范围类型。

返回 integer_range_type 节点的上限。

返回 integer_range_type 节点的下限。

返回由 integer 节点表示的值。

如果 Node 的类型为 atom 且表示 Value,则返回 true,否则返回 false

如果 Node 的类型为 char 且表示 Value,则返回 true,否则返回 false

如果 Node 是表示所谓的“源代码形式”的语法树,则返回 true,否则返回 false

如果 Node 的类型为 integer 且表示 Value,则返回 true,否则返回 false

如果 Node 是叶节点,则返回 true,否则返回 false

如果 Node 的类型为 listnil,则返回 true,否则返回 false

如果 Node 表示文字项,则返回 true,否则返回 false

如果 Node 表示一个正规列表,则返回 true,否则返回 false

如果 Node 的类型为 string 且表示 Value,则返回 true,否则返回 false

仅用于特殊目的。如果 Tree 是抽象语法树,则返回 true,否则返回 false

Source 的注释附加到 Target 的当前注释中。

构造一个抽象的列表框架。

创建一个抽象的列表推导式。

返回 list_comp 节点的 body 子树列表。

返回 list_comp 节点的模板子树。

返回列表框架的元素子树列表。

返回 list 节点的头部元素子树。

返回列表框架的元素子树的数量。

返回 list 节点的前缀元素子树。

返回 list 节点的后缀子树(如果存在)。

返回 list 节点的尾部。

创建一个抽象的宏应用程序。

返回 macro 节点的参数子树列表(如果存在)。

返回 macro 节点的名称子树。

创建一个具有给定类型和子树的语法树。

创建一个抽象的映射推导式。

返回 map_comp 节点的 body 子树列表。

返回 map_comp 节点的模板子树。

创建一个抽象的映射表达式。

返回 map_expr 节点的参数子树(如果存在)。

返回 map_expr 节点的字段子树列表。

创建一个抽象的映射关联字段。

返回 map_field_assoc 节点的名称子树。

返回 map_field_assoc 节点的值子树。

创建一个抽象的映射精确字段。

返回 map_field_exact 节点的名称子树。

返回 map_field_exact 节点的值子树。

创建一个抽象的 map_generator。

返回 map_generator 节点的 body 子树。

返回 map_generator 节点的模式子树。

创建一个抽象的类型映射。

创建一个抽象的映射类型关联字段。

返回 map_type_assoc 节点的名称子树。

返回 map_type_assoc 节点的值子树。

创建一个抽象的映射类型精确字段。

返回 map_type_exact 节点的名称子树。

返回 map_type_exact 节点的值子树。

返回 map_type 节点的字段子树列表。

创建一个抽象的匹配表达式。

返回 match_expr 节点的 body 子树。

返回 match_expr 节点的模式子树。

创建一个抽象的 maybe 表达式。

返回 maybe_expr 节点的 body 子树列表。

返回 maybe_expr 节点的 else 子树。

创建一个抽象的 maybe 表达式,用于 maybe 块中。

返回 maybe_expr 节点的 body 子树。

返回 maybe_expr 节点的模式子树。

创建语法树的元表示。

创建一个抽象的模块限定符。

返回 module_qualifier 节点的参数(模块)子树。

返回 module_qualifier 节点的 body 子树。

创建一个抽象的命名 fun 表达式。

返回 named_fun_expr 节点的元数。

返回 named_fun_expr 节点的子句子树列表。

返回 named_fun_expr 节点的名称子树。

将抽象列表骨架展开为其最明确的形式。

创建一个抽象运算符。

返回 operator 节点表示的字面字符串。

返回 operator 节点的名称。

创建一个抽象的带括号的表达式。

返回 parentheses 节点的正文子树。

创建一个抽象的前缀运算符表达式。

返回 prefix_expr 节点的参数子树。

返回 prefix_expr 节点的运算符子树。

创建一个抽象的接收表达式。

返回 receive_expr 节点的动作正文子树列表。

返回 receive_expr 节点的子句子树列表。

返回 receive_expr 节点的超时子树(如果有)。

创建一个抽象的记录字段访问表达式。

返回 record_access 节点的参数子树。

返回 record_access 节点的字段子树。

返回 record_access 节点的类型子树。

创建一个抽象的记录表达式。

返回 record_expr 节点的参数子树(如果有)。

返回 record_expr 节点的字段子树列表。

返回 record_expr 节点的类型子树。

创建一个抽象的记录字段规范。

返回 record_field 节点的名称子树。

返回 record_field 节点的值子树(如果有)。

创建一个抽象的记录字段索引表达式。结果表示 "#Type.Field"。

返回 record_index_expr 节点的字段子树。

返回 record_index_expr 节点的类型子树。

创建一个抽象的记录类型。

创建一个抽象的记录类型字段。

返回 record_type_field 节点的名称子树。

返回 record_type_field 节点的类型子树。

返回 record_type 节点的字段子树。

返回 record_type 节点的名称子树。

清除与 节点 关联的注释。

如果可能,返回语法树的 erl_parse 兼容表示形式。

恢复 Erlang 源代码形式的序列。

节点 的用户注释列表设置为 注释

节点 的属性设置为 属性

节点 的位置信息设置为 位置

节点 的后置注释设置为 注释

节点 的前置注释设置为 注释

创建一个抽象的大小限定符。

返回 size_qualifier 节点的参数子树(大小)。

返回 size_qualifier 节点的主体子树。

创建一个抽象的字符串字面量。

返回 string 节点表示的字面字符串。

返回 string 节点表示的字面字符串。

返回 string 节点表示的值。

返回语法树的所有子树的分组列表。

创建一个抽象的源代码文本片段。

返回 text 节点表示的字符序列。

仅用于特殊目的。创建一个具有类型标签 类型 和关联数据 数据 的抽象语法树节点。

创建一个抽象的 try 表达式。

返回 try_expr 节点的 "after" 子树列表。

返回 try_expr 节点的主体子树列表。

返回 try_expr 节点的 case 子句子树列表。如果 节点 表示 "try Body catch H1; ...; Hn end",则结果为空列表。

返回 try_expr 节点的处理程序子句子树列表。

创建一个抽象的元组。

返回 tuple 节点的元素子树列表。

返回 tuple 节点的元素数量。

创建一个抽象的类型元组。

返回 tuple_type 节点的类型元素子树列表。

返回 节点 的类型标记。

创建一个抽象的类型应用表达式。

创建一个抽象的类型应用表达式。

返回 type_application 节点的参数子树。

返回 type_application 节点的类型名称子树。

创建一个抽象的类型联合。

返回 type_union 节点的类型子树列表。

创建一个抽象的带类型的记录字段规范。

返回 typed_record_field 节点的字段子树。

返回 typed_record_field 节点的类型子树。

创建一个抽象的通用模式("_")。

创建一个具有与给定树相同类型和属性的语法树。

创建一个抽象的用户类型。

返回 user_type_application 节点的参数子树。

返回 user_type_application 节点的类型名称子树。

创建一个具有给定名称的抽象变量。

返回 variable 节点的名称作为字符串。

返回 variable 节点的名称作为原子。

创建一个抽象的警告标记。

返回 warning_marker 节点的 ErrorInfo 结构。

类型

此类型的链接

annotation_or_location()

查看源代码
-type annotation_or_location() :: erl_anno:anno() | erl_anno:location().
此类型的链接

encoding()

查看源代码 (未导出)
-type encoding() :: utf8 | unicode | latin1.
此类型的链接

erl_parse()

查看源代码 (未导出)
-type forms() :: syntaxTree() | [syntaxTree()].
-type guard() :: none | syntaxTree() | [syntaxTree()] | [[syntaxTree()]].
-type padding() :: none | integer().
-type syntaxTree() :: tree() | wrapper() | erl_parse().
此类型的链接

syntaxTreeAttributes()

查看源代码
-type syntaxTreeAttributes() ::
          #attr{pos :: term(),
                ann :: [term()],
                com :: none | #com{pre :: [syntaxTree()], post :: [syntaxTree()]}}.
-type tree() ::
          #tree{type :: atom(),
                attr ::
                    #attr{pos :: term(),
                          ann :: [term()],
                          com :: none | #com{pre :: [syntaxTree()], post :: [syntaxTree()]}},
                data :: term()}.
此类型的链接

wrapper()

查看源代码 (未导出)
-type wrapper() ::
          #wrapper{type :: atom(),
                   attr ::
                       #attr{pos :: term(),
                             ann :: [term()],
                             com :: none | #com{pre :: [syntaxTree()], post :: [syntaxTree()]}},
                   tree :: erl_parse()}.

函数

-spec nil() -> syntaxTree().

创建一个抽象空列表。

结果表示 "[]"。空列表传统上称为“nil”。

另请参阅: is_list_skeleton/1list/2

-spec abstract(term()) -> syntaxTree().

返回与 Erlang 术语对应的语法树。

Term 必须是字面量,这意味着它可以表示为源代码字面量。因此,它不能包含进程标识符、端口、引用或函数值作为子项。该函数识别可打印的字符串,以便获得紧凑且可读的表示形式。如果 Term 不是字面量,则求值将失败并出现原因 badarg

另请参阅: concrete/1is_literal/1

此函数的链接

add_ann(Annotation, Node)

查看源代码
-spec add_ann(term(), syntaxTree()) -> syntaxTree().

将术语 Annotation 追加到 Node 的用户注释列表中。

注意:这等效于 set_ann(Node, [Annotation | get_ann(Node)]),但可能更有效率。

另请参阅: get_ann/1set_ann/2

此函数的链接

add_postcomments(Comments, Node)

查看源代码
-spec add_postcomments([syntaxTree()], syntaxTree()) -> syntaxTree().

Comments 追加到 Node 的后置注释中。

注意:这等效于 set_postcomments(Node, get_postcomments(Node) ++ Comments),但可能更有效率。

另请参阅: add_precomments/2comment/2get_postcomments/1join_comments/2set_postcomments/2

此函数的链接

add_precomments(Comments, Node)

查看源代码
-spec add_precomments([syntaxTree()], syntaxTree()) -> syntaxTree().

Comments 追加到 Node 的前置注释中。

注意:这等效于 set_precomments(Node, get_precomments(Node) ++ Comments),但可能更有效率。

另请参阅:add_postcomments/2comment/2get_precomments/1join_comments/2set_precomments/2

此函数的链接

annotated_type(Name, Type)

查看源代码
-spec annotated_type(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的带注释的类型表达式。

结果表示“名称 :: 类型”。

另请参阅:annotated_type_body/1annotated_type_name/1

此函数的链接

annotated_type_body(Node)

查看源代码
-spec annotated_type_body(syntaxTree()) -> syntaxTree().

返回 annotated_type 节点的类型子树。

另请参阅:annotated_type/2

此函数的链接

annotated_type_name(Node)

查看源代码
-spec annotated_type_name(syntaxTree()) -> syntaxTree().

返回 annotated_type 节点的名称子树。

另请参阅:annotated_type/2

此函数的链接

application(Operator, Arguments)

查看源代码
-spec application(syntaxTree(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的函数应用表达式。

如果 Arguments[A1, ..., An],则结果表示 “Operator(A1, ..., An)”。

另请参阅:application/3application_arguments/1application_operator/1

此函数的链接

application(Module, Name, Arguments)

查看源代码
-spec application(none | syntaxTree(), syntaxTree(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的函数应用表达式。

如果 Modulenone,则此调用等效于 application(Function, Arguments);否则,等效于 application(module_qualifier(Module, Function), Arguments)

(这是一个实用函数。)

另请参阅:application/2module_qualifier/2

此函数的链接

application_arguments(Node)

查看源代码
-spec application_arguments(syntaxTree()) -> [syntaxTree()].

返回 application 节点的参数子树列表。

另请参阅:application/2

此函数的链接

application_operator(Node)

查看源代码
-spec application_operator(syntaxTree()) -> syntaxTree().

返回 application 节点的操作符子树。

如果 Node 表示 “M:F(...)”,则结果是表示 “M:F” 的子树。

另请参阅:application/2module_qualifier/2

此函数的链接

arity_qualifier(Body, Arity)

查看源代码
-spec arity_qualifier(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的元数限定符。

结果表示 “Body/Arity”。

另请参阅:arity_qualifier_argument/1arity_qualifier_body/1

此函数的链接

arity_qualifier_argument(Node)

查看源代码
-spec arity_qualifier_argument(syntaxTree()) -> syntaxTree().

返回 arity_qualifier 节点的参数(元数)子树。

另请参阅:arity_qualifier/2

此函数的链接

arity_qualifier_body(Node)

查看源代码
-spec arity_qualifier_body(syntaxTree()) -> syntaxTree().

返回 arity_qualifier 节点的正文子树。

另请参阅:arity_qualifier/2

-spec atom(atom() | string()) -> syntaxTree().

创建一个抽象的原子字面量。

原子 (atom) 的打印名称是由 Name 表示的字符序列。

另请参阅:atom_literal/1atom_literal/2atom_name/1atom_value/1is_atom/2

-spec atom_literal(syntaxTree()) -> string().

返回 atom 节点表示的字面量字符串。

这包括必要的周围单引号字符。超出 255 的字符将被转义。

请注意,例如,atom("x\ny") 的结果表示 'x\ny''x\12y''x\012y''x\^Jy' 中的任何一个和所有值;请参阅 string/1

另请参阅:atom/1string/1

此函数的链接

atom_literal(Node, Encoding)

查看源代码
-spec atom_literal(syntaxTree(), utf8 | unicode | latin1) -> string().

返回 atom 节点表示的字面量字符串。

这包括必要的周围单引号字符。根据编码,超出 255 的字符将被转义 (latin1) 或按原样复制 (utf8)。

另请参阅:atom/1atom_literal/1string/1

-spec atom_name(syntaxTree()) -> string().

返回 atom 节点的打印名称。

另请参阅:atom/1

-spec atom_value(syntaxTree()) -> atom().

返回 atom 节点表示的值。

另请参阅:atom/1

-spec attribute(syntaxTree()) -> syntaxTree().

等效于 attribute(Name, none)

-spec attribute(syntaxTree(), none | [syntaxTree()]) -> syntaxTree().

创建一个抽象的程序属性。

如果 Arguments[A1, ..., An],则结果表示 “-Name(A1, ..., An).”。否则,如果 Argumentsnone,则结果表示 “-Name.”。后一种形式使得表示预处理器指令(如“-endif.”)成为可能。属性是源代码形式。

注意

预处理器宏定义指令 “-define(Name, Body).” 对 Body 的语法形式(视为标记序列)的要求相对较少。 text 节点类型可用于不是普通 Erlang 结构的 Body

另请参阅:attribute/1attribute_arguments/1attribute_name/1is_form/1text/1

此函数的链接

attribute_arguments(Node)

查看源代码
-spec attribute_arguments(syntaxTree()) -> none | [syntaxTree()].

返回 attribute 节点的参数子树列表(如果有)。

如果 Node 表示 “-Name.”,则结果为 none。否则,如果 Node 表示 “-Name(E1, ..., En).”,则返回 [E1, ..., E1]

另请参阅:attribute/1

-spec attribute_name(syntaxTree()) -> syntaxTree().

返回 attribute 节点的名称子树。

另请参阅:attribute/1

-spec binary([syntaxTree()]) -> syntaxTree().

创建一个抽象的二进制对象模板。

如果 Fields[F1, ..., Fn],则结果表示 “<<F1, ..., Fn>>”。

另请参阅:binary_field/2binary_fields/1

此函数的链接

binary_comp(Template, Body)

查看源代码
-spec binary_comp(syntaxTree(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的二进制推导式。

如果 Body[E1, ..., En],则结果表示 “<<Template || E1, ..., En>>”。

另请参阅:binary_comp_body/1binary_comp_template/1generator/2

此函数的链接

binary_comp_body(Node)

查看源代码
-spec binary_comp_body(syntaxTree()) -> [syntaxTree()].

返回 binary_comp 节点的主体子树列表。

另请参阅:binary_comp/2

此函数的链接

binary_comp_template(Node)

查看源代码
-spec binary_comp_template(syntaxTree()) -> syntaxTree().

返回 binary_comp 节点的模板子树。

另请参阅:binary_comp/2

-spec binary_field(syntaxTree()) -> syntaxTree().

等效于 binary_field(Body, [])

此函数的链接

binary_field(Body, Types)

查看源代码
-spec binary_field(syntaxTree(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的二进制模板字段。

如果 Types 是空列表,则结果仅表示 “Body”,否则,如果 Types[T1, ..., Tn],则结果表示 “Body/T1-...-Tn”。

另请参阅:binary/1binary_field/1binary_field/3binary_field_body/1binary_field_size/1binary_field_types/1

此函数的链接

binary_field(Body, Size, Types)

查看源代码
-spec binary_field(syntaxTree(), none | syntaxTree(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的二进制模板字段。

如果 Sizenone,则等效于 “binary_field(Body, Types)”,否则等效于 “binary_field(size_qualifier(Body, Size), Types)”。

(这是一个实用函数。)

另请参阅:binary/1binary_field/2size_qualifier/2

此函数的链接

binary_field_body(Node)

查看源代码
-spec binary_field_body(syntaxTree()) -> syntaxTree().

返回 binary_field 的主体子树。

另请参阅:binary_field/2

此函数的链接

binary_field_size(Node)

查看源代码
-spec binary_field_size(syntaxTree()) -> none | syntaxTree().

返回 binary_field 节点的大小说明符子树(如果有)。

如果 Node 表示 “Body:Size” 或 “Body:Size/T1, ..., Tn”,则结果为 Size,否则返回 none

(这是一个实用函数。)

另请参阅:binary_field/2binary_field/3

此函数的链接

binary_field_types(Node)

查看源代码
-spec binary_field_types(syntaxTree()) -> [syntaxTree()].

返回 binary_field 节点的类型说明符子树列表。

如果 Node 表示 “.../T1, ..., Tn”,则结果为 [T1, ..., Tn],否则结果为空列表。

另请参阅:binary_field/2

-spec binary_fields(syntaxTree()) -> [syntaxTree()].

返回 binary 节点的字段子树列表。

另请参阅:binary/1binary_field/2

此函数的链接

binary_generator(Pattern, Body)

查看源代码
-spec binary_generator(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的 binary_generator。

结果表示 “Pattern <= Body”。

另请参阅:binary_comp/2binary_generator_body/1binary_generator_pattern/1list_comp/2map_comp/2

此函数的链接

binary_generator_body(Node)

查看源代码
-spec binary_generator_body(syntaxTree()) -> syntaxTree().

返回 generator 节点的主体子树。

另请参阅:binary_generator/2

此函数的链接

binary_generator_pattern(Node)

查看源代码
-spec binary_generator_pattern(syntaxTree()) -> syntaxTree().

返回 generator 节点的模式子树。

另请参阅:binary_generator/2

-spec bitstring_type(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的位串类型。

结果表示 “<<_:M, _:_N>>”。

另请参阅:bitstring_type_m/1bitstring_type_n/1

此函数的链接

bitstring_type_m(Node)

查看源代码
-spec bitstring_type_m(syntaxTree()) -> syntaxTree().

返回 bitstring_type 节点的起始位数 M

另请参阅:bitstring_type/2

此函数的链接

bitstring_type_n(Node)

查看源代码
-spec bitstring_type_n(syntaxTree()) -> syntaxTree().

返回 bitstring_type 节点的段大小 N

另请参阅:bitstring_type/2

-spec block_expr([syntaxTree()]) -> syntaxTree().

创建一个抽象的块表达式。

如果 Body[B1, ..., Bn],则结果表示 “begin B1, ..., Bn end”。

另请参阅:block_expr_body/1

-spec block_expr_body(syntaxTree()) -> [syntaxTree()].

返回 block_expr 节点的主体子树列表。

另请参阅:block_expr/1

此函数的链接

case_expr(Argument, Clauses)

查看源代码
-spec case_expr(syntaxTree(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的 case 表达式。

如果 Clauses[C1, ..., Cn],则结果表示 “case Argument of C1; ...; Cn end”。更准确地说,如果每个 Ci 表示 “(Pi) Gi -> Bi”,则结果表示 “case Argument of P1G1 -> B1; ...; PnGn -> Bn end”。

另请参阅:case_expr_argument/1case_expr_clauses/1clause/3if_expr/1

此函数的链接

case_expr_argument(Node)

查看源代码
-spec case_expr_argument(syntaxTree()) -> syntaxTree().

返回 case_expr 节点的参数子树。

另请参阅:case_expr/2

此函数的链接

case_expr_clauses(Node)

查看源代码
-spec case_expr_clauses(syntaxTree()) -> [syntaxTree()].

返回 case_expr 节点的子句子树列表。

另请参阅:case_expr/2

-spec catch_expr(syntaxTree()) -> syntaxTree().

创建一个抽象的 catch 表达式。

结果表示 “catch Expr”。

另请参阅:catch_expr_body/1

-spec catch_expr_body(syntaxTree()) -> syntaxTree().

返回 catch_expr 节点的主体子树。

另请参阅:catch_expr/1

-spec char(char()) -> syntaxTree().

创建一个抽象的字符字面量。

结果表示 “$Name”,其中 Name 对应于 Value

注意

对应于特定字符值的文字不是唯一确定的。例如,字符 “a” 可以写成 “$a” 和 “$\141”,而 Tab 字符可以写成 “$\11”、“$\011” 或 “$\t”。

另请参阅:char_literal/1char_literal/2char_value/1is_char/2

-spec char_literal(syntaxTree()) -> nonempty_string().

返回 char 节点表示的字面量字符串。

这包括前导 “$” 字符。超出 255 的字符将被转义。

另请参阅:char/1

此函数的链接

char_literal(Node, Encoding)

查看源代码
-spec char_literal(syntaxTree(), encoding()) -> nonempty_string().

返回 char 节点表示的字面量字符串。

这包括前导 “$” 字符。根据编码,超出 255 的字符将被转义 (latin1) 或按原样复制 (utf8)。

另请参阅:char/1

-spec char_value(syntaxTree()) -> char().

返回 char 节点表示的值。

另请参阅:char/1

此函数的链接

class_qualifier(Class, Body)

查看源代码
-spec class_qualifier(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的类限定符。

结果表示 “Class:Body”。

另请参阅:class_qualifier_argument/1class_qualifier_body/1class_qualifier_stacktrace/1try_expr/4

此函数的链接

class_qualifier(Class, Body, Stacktrace)

查看源代码
-spec class_qualifier(syntaxTree(), syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的类限定符。

结果表示 “Class:Body:Stacktrace”。

另请参阅:class_qualifier_argument/1class_qualifier_body/1try_expr/4

此函数的链接

class_qualifier_argument(Node)

查看源代码
-spec class_qualifier_argument(syntaxTree()) -> syntaxTree().

返回 class_qualifier 节点的参数(类)子树。

另请参阅:class_qualifier/2

此函数的链接

class_qualifier_body(Node)

查看源代码
-spec class_qualifier_body(syntaxTree()) -> syntaxTree().

返回 class_qualifier 节点的主体子树。

另请参阅:class_qualifier/2

此函数的链接

class_qualifier_stacktrace(Node)

查看源代码
-spec class_qualifier_stacktrace(syntaxTree()) -> syntaxTree().

返回 class_qualifier 节点的堆栈跟踪子树。

另请参阅:class_qualifier/2

-spec clause(guard(), [syntaxTree()]) -> syntaxTree().

等效于 clause([], Guard, Body)

此函数的链接

clause(Patterns, Guard, Body)

查看源代码
-spec clause([syntaxTree()], guard(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的子句。

如果 Patterns[P1, ..., Pn]Body[B1, ..., Bm],则如果 Guardnone,则结果表示 “(P1, ..., Pn) -> B1, ..., Bm”;否则,除非 Guard 是列表,否则结果表示 “(P1, ..., Pn) when Guard -> B1, ..., Bm”。

为简单起见,Guard 参数也可以是以下任意一种:

  • 空列表 []。这等效于传递 none
  • 非空语法树列表 [E1, ..., Ej]。这等效于传递 conjunction([E1, ..., Ej])
  • 非空语法树列表的列表 [[E1_1, ..., E1_k1], ..., [Ej_1, ..., Ej_kj]],这等效于传递 disjunction([conjunction([E1_1, ..., E1_k1]), ..., conjunction([Ej_1, ..., Ej_kj])])

另请参阅:clause/2clause_body/1clause_guard/1clause_patterns/1

-spec clause_body(syntaxTree()) -> [syntaxTree()].

返回 clause 节点的主体子树列表。

另请参阅:clause/3

-spec clause_guard(syntaxTree()) -> none | syntaxTree().

返回 clause 节点的保护子树(如果有)。

如果 Node 表示 “(P1, ..., Pn) when Guard -> B1, ..., Bm”,则返回 Guard。否则,结果为 none

另请参阅:clause/3

-spec clause_patterns(syntaxTree()) -> [syntaxTree()].

返回 clause 节点的模式子树列表。

另请参阅:clause/3

-spec comment([string()]) -> syntaxTree().

等效于 comment(none, Strings)

-spec comment(padding(), [string()]) -> syntaxTree().

创建一个带有给定填充和文本的抽象注释。

如果 Strings 是(可能为空)列表 ["Txt1", ..., "TxtN"],则结果表示源代码文本

     Txt1
     ...
     TxtN

Padding 表示在水平方向上,注释与同一行上的源代码(如果有)之间分隔的空字符位置的数量。如果 Paddingnone,则使用默认的正数。如果 Padding 是小于 1 的整数,则不应有分隔空格。注释本身被视为源代码形式。

另请参阅:comment/1is_form/1

-spec comment_padding(syntaxTree()) -> padding().

返回注释之前的填充量,或 none

none 表示可以使用默认填充。

另请参阅:comment/2

-spec comment_text(syntaxTree()) -> [string()].

返回抽象注释的文本行。

另请参阅:comment/2

-spec compact_list(syntaxTree()) -> syntaxTree().

为抽象列表骨架生成最紧凑的形式。

结果要么表示为 “[E1, ..., En | Tail]”,其中 Tail 不是列表骨架,要么简单地表示为 “[E1, ..., En]”。表示列表骨架的 Node 子树上的注解可能会丢失,但注释会传播到结果。如果 Node 不表示列表骨架,则返回 Node 本身。

另请参阅:list/2, normalize_list/1

-spec concrete(syntaxTree()) -> term().

返回语法树表示的 Erlang 术语。

如果 Node 不表示字面量,则求值失败,原因是 badarg

注意

具有具体表示的语法树集合大于可以使用函数 abstract/1 构建的树集合。抽象字符将被具体化为整数,而 abstract/1 目前不会为任何输入生成抽象字符。(使用 char/1 函数显式创建抽象字符。)

注意

识别 arity_qualifier 节点。这是为了遵循 Erlang 解析器处理通配属性的方式:{F, A}F/A 都被识别,这使得可以将通配属性转换为已识别的属性,同时又不会使使用旧版本 Erlang 编译器编译带有新语法的文件的操作变得不可能。

另请参阅:abstract/1, char/1, is_literal/1

-spec conjunction([syntaxTree()]) -> syntaxTree().

创建一个抽象的合取。

如果 List[E1, ..., En],则结果表示为 “E1, ..., En”。

另请参阅:conjunction_body/1, disjunction/1

此函数的链接

conjunction_body(Node)

查看源代码
-spec conjunction_body(syntaxTree()) -> [syntaxTree()].

返回 conjunction 节点的主体子树列表。

另请参阅:conjunction/1

-spec cons(syntaxTree(), syntaxTree()) -> syntaxTree().

“优化”列表骨架 cons 操作。

创建一个抽象列表骨架,其第一个元素是 Head,尾部对应于 Tail。这类似于 list([Head], Tail),区别在于 Tail 不能是 none,并且结果不一定准确表示为 “[Head | Tail]”,而是可能取决于 Tail 子树。

例如,如果 Tail 表示 [X, Y],则结果可能表示为 “[Head, X, Y]”,而不是 “[Head | [X, Y]]”。如果 Tail 表示列表骨架,则 Tail 本身的注解可能会丢失,但 Tail 上的注释会传播到结果。

另请参阅:list/2, list_head/1, list_tail/1

此函数的链接

constrained_function_type(FunctionType, FunctionConstraint)

查看源代码
-spec constrained_function_type(syntaxTree(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的约束函数类型。

如果 FunctionConstraint[C1, ..., Cn],则结果表示为 “FunctionType when C1, ...Cn”。

另请参阅:constrained_function_type_argument/1, constrained_function_type_body/1

此函数的链接

constrained_function_type_argument(Node)

查看源代码
-spec constrained_function_type_argument(syntaxTree()) -> syntaxTree().

返回 constrained_function_type 节点的函数约束子树。

另请参阅:constrained_function_type/2

此函数的链接

constrained_function_type_body(Node)

查看源代码
-spec constrained_function_type_body(syntaxTree()) -> syntaxTree().

返回 constrained_function_type 节点的函数类型子树。

另请参阅:constrained_function_type/2

此函数的链接

constraint(Name, Types)

查看源代码
-spec constraint(syntaxTree(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的(子类型)约束。

结果表示“名称 :: 类型”。

另请参阅:constraint_argument/1, constraint_body/1

此函数的链接

constraint_argument(Node)

查看源代码
-spec constraint_argument(syntaxTree()) -> syntaxTree().

返回 constraint 节点的名称子树。

另请参阅:constraint/2

-spec constraint_body(syntaxTree()) -> [syntaxTree()].

返回 constraint 节点的类型子树。

另请参阅:constraint/2

此函数的链接

copy_ann(Source, Target)

查看源代码
-spec copy_ann(syntaxTree(), syntaxTree()) -> syntaxTree().

将用户注释列表从 Source 复制到 Target

注意:这等效于 set_ann(Target, get_ann(Source)),但可能更有效率。

另请参阅: get_ann/1set_ann/2

此函数的链接

copy_attrs(Source, Target)

查看源代码
-spec copy_attrs(syntaxTree(), syntaxTree()) -> syntaxTree().

将属性从 Source 复制到 Target

注意:这等效于 set_attrs(Target, get_attrs(Source)),但可能更有效率。

另请参阅:get_attrs/1, set_attrs/2

此函数的链接

copy_comments(Source, Target)

查看源代码
-spec copy_comments(syntaxTree(), syntaxTree()) -> syntaxTree().

将前置和后置注释从 Source 复制到 Target

注意:这等效于 set_postcomments(set_precomments(Target, get_precomments(Source)), get_postcomments(Source)),但可能更有效率。

另请参阅:comment/2, get_postcomments/1, get_precomments/1, set_postcomments/2, set_precomments/2

此函数的链接

copy_pos(Source, Target)

查看源代码
-spec copy_pos(syntaxTree(), syntaxTree()) -> syntaxTree().

将注释从 Source 复制到 Target

这等效于 set_pos(Target, get_pos(Source)),但可能更有效率。

另请参阅:get_pos/1, set_pos/2

-spec data(syntaxTree()) -> term().

仅用于特殊目的。返回语法树节点的关联数据。

如果 is_tree(Node) 不返回 true,则求值失败,原因是 badarg

另请参阅:tree/2

-spec disjunction([syntaxTree()]) -> syntaxTree().

创建一个抽象的析取。

如果 List[E1, ..., En],则结果表示为 “E1; ...; En”。

另请参阅:conjunction/1, disjunction_body/1

此函数的链接

disjunction_body(Node)

查看源代码
-spec disjunction_body(syntaxTree()) -> [syntaxTree()].

返回 disjunction 节点的主体子树列表。

另请参阅:disjunction/1

-spec else_expr([syntaxTree()]) -> syntaxTree().

创建一个抽象的 else 表达式。

如果 Clauses[C1, ..., Cn],则结果表示为 “else C1; ...; Cn end”。更准确地说,如果每个 Ci 表示为 “(Pi) Gi -> Bi”,则结果表示为 “else (P1) G1 -> B1; ...; (Pn) Gn -> Bn end”。

另请参阅:clause/3, else_expr_clauses/1, maybe_expr/2

此函数的链接

else_expr_clauses(Node)

查看源代码
-spec else_expr_clauses(syntaxTree()) -> [syntaxTree()].

返回 else_expr 节点的子句子树列表。

另请参阅:else_expr/1

-spec eof_marker() -> syntaxTree().

创建一个抽象的文件结束标记。

这表示读取一系列源代码形式时的输入结束。文件结束标记本身被视为源代码形式(即,在其出现的任何序列中的最后一个)。它没有定义的词法形式。

注意

保留此项仅是为了向后兼容现有解析器和工具。

另请参阅:error_marker/1, is_form/1, warning_marker/1

-spec error_marker(term()) -> syntaxTree().

创建一个抽象的错误标记。

结果表示源代码中出现错误,并带有由 Error 给出的关联 Erlang I/O ErrorInfo 结构(有关详细信息,请参阅模块 //stdlib/io)。错误标记被视为源代码形式,但没有定义的词法形式。

注意

仅为了向后兼容现有解析器和工具而支持此项。

另请参阅:eof_marker/0, error_marker_info/1, is_form/1, warning_marker/1

此函数的链接

error_marker_info(Node)

查看源代码
-spec error_marker_info(syntaxTree()) -> term().

返回 error_marker 节点的 ErrorInfo 结构。

另请参阅:error_marker/1

此函数的链接

flatten_form_list(Node)

查看源代码
-spec flatten_form_list(syntaxTree()) -> syntaxTree().

扁平化 form_list 节点的子列表。

返回 Node,其中所有 form_list 类型的子树都递归展开,从而生成单个“扁平”的抽象形式序列。

另请参阅:form_list/1

-spec float(float()) -> syntaxTree().

创建一个抽象的浮点字面量。

词法表示形式是 Value 的十进制浮点数。

另请参阅:float_literal/1, float_value/1

-spec float_literal(syntaxTree()) -> string().

返回由 float 节点表示的数字字符串。

另请参阅:float/1

-spec float_value(syntaxTree()) -> float().

返回由 float 节点表示的值。

请注意,通常不应比较浮点值的相等性。

另请参阅:float/1

-spec form_list([syntaxTree()]) -> syntaxTree().

创建一个“源代码形式”的抽象序列。

如果 Forms[F1, ..., Fn],其中每个 Fi 都是一种形式(请参阅 is_form/1),则结果表示为

F1
...
Fn

其中 Fi 由一个或多个换行符分隔。form_list 类型的节点本身被视为源代码形式;请参阅 flatten_form_list/1

注意

这只是一种将源代码形式分组到单个语法树中的方法,通常用于形成 Erlang 模块定义。

另请参阅:flatten_form_list/1, form_list_elements/1, is_form/1

此函数的链接

form_list_elements(Node)

查看源代码
-spec form_list_elements(syntaxTree()) -> [syntaxTree()].

返回 form_list 节点的子节点列表。

另请参阅:form_list/1

-spec fun_expr([syntaxTree()]) -> syntaxTree().

创建一个抽象的 fun 表达式。

如果 Clauses[C1, ..., Cn],则结果表示为 “fun C1; ...; Cn end”。更准确地说,如果每个 Ci 表示为 “(Pi1, ..., Pim) Gi -> Bi”,则结果表示为 “fun (P11, ..., P1m) G1 -> B1; ...; (Pn1, ..., Pnm) Gn -> Bn end”。

另请参阅:fun_expr_arity/1, fun_expr_clauses/1

-spec fun_expr_arity(syntaxTree()) -> arity().

返回 fun_expr 节点的元数。

结果是 fun 表达式的第一个子句中参数模式的数量;后续子句将被忽略。

如果 fun_expr_clauses(Node) 返回一个空列表,或者如果该列表的第一个元素不是 clause 类型的语法树 C,并且使得 clause_patterns(C) 是一个非空列表,则会引发异常。

另请参阅:clause/3, clause_patterns/1, fun_expr/1, fun_expr_clauses/1

此函数的链接

fun_expr_clauses(Node)

查看源代码
-spec fun_expr_clauses(syntaxTree()) -> [syntaxTree()].

返回 fun_expr 节点的子句子树列表。

另请参阅:fun_expr/1

-spec fun_type() -> syntaxTree().

创建一个任何类型的抽象 fun。

结果表示为 “fun()”。

此函数的链接

function(Name, Clauses)

查看源代码
-spec function(syntaxTree(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的函数定义。

如果 Clauses[C1, ..., Cn],则结果表示为 “Name C1; ...; Name Cn.”。更准确地说,如果每个 Ci 表示为 “(Pi1, ..., Pim) Gi -> Bi”,则结果表示为 “Name(P11, ..., P1m) G1 -> B1; ...; Name(Pn1, ..., Pnm) Gn -> Bn.”。函数定义是源代码形式。

另请参阅:function_arity/1, function_clauses/1, function_name/1, is_form/1

-spec function_arity(syntaxTree()) -> arity().

返回 function 节点的元数。

结果是函数的第一个子句中参数模式的数量;后续子句将被忽略。

如果 function_clauses(Node) 返回一个空列表,或者如果该列表的第一个元素不是 clause 类型的语法树 C,并且使得 clause_patterns(C) 是一个非空列表,则会引发异常。

另请参阅:clause/3, clause_patterns/1, function/2, function_clauses/1

此函数的链接

function_clauses(Node)

查看源代码
-spec function_clauses(syntaxTree()) -> [syntaxTree()].

返回 function 节点的子句子树列表。

另请参阅:function/2

-spec function_name(syntaxTree()) -> syntaxTree().

返回 function 节点的名称子树。

另请参阅:function/2

-spec function_type(syntaxTree()) -> syntaxTree().

等同于 function_type(any_arity, Type)

此函数的链接

function_type(Arguments, Return)

查看源代码
-spec function_type(any_arity | [syntaxTree()], syntaxTree()) -> syntaxTree().

创建一个抽象的函数类型。

如果 Arguments[T1, ..., Tn] 并且 它出现在函数规范中,则结果表示 "(T1, ...Tn) -> Return";否则,它表示 "fun((T1, ...Tn) -> Return)"。如果 Argumentsany_arity,则它表示 "fun((...) -> Return)"。

注意,对于 "FunctionType" 和 "fun(FunctionType)",erl_parse 表示形式是相同的。

另请参阅: function_type_arguments/1function_type_return/1

此函数的链接

function_type_arguments(Node)

查看源代码
-spec function_type_arguments(syntaxTree()) -> any_arity | [syntaxTree()].

返回 function_type 节点的参数类型子树。

如果 Node 表示 "fun((...) -> Return)",则返回 any_arity;否则,如果 Node 表示 "(T1, ...Tn) -> Return" 或 "fun((T1, ...Tn) -> Return)",则返回 [T1, ..., Tn]

另请参阅: function_type/1function_type/2

此函数的链接

function_type_return(Node)

查看源代码
-spec function_type_return(syntaxTree()) -> syntaxTree().

返回 function_type 节点的返回类型子树。

另请参阅: function_type/1function_type/2

此函数的链接

generator(Pattern, Body)

查看源代码
-spec generator(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的列表生成器。

结果表示 "Pattern <- Body"。

另请参阅: binary_comp/2generator_body/1generator_pattern/1map_comp/2list_comp/2

-spec generator_body(syntaxTree()) -> syntaxTree().

返回 generator 节点的主体子树。

另请参阅: generator/2

此函数的链接

generator_pattern(Node)

查看源代码
-spec generator_pattern(syntaxTree()) -> syntaxTree().

返回 generator 节点的模式子树。

另请参阅: generator/2

-spec get_ann(syntaxTree()) -> [term()].

返回与语法树关联的用户注释列表。

对于新创建的节点,这是一个空列表。 注释可以是任何项。

另请参阅: get_attrs/1set_ann/2

-spec get_attrs(syntaxTree()) -> syntaxTreeAttributes().

返回与语法树节点关联的属性的表示。

属性是可以附加到节点的所有额外信息。 目前,这包括位置信息、源代码注释和用户注释。 此函数的结果不能直接检查;只能附加到另一个节点(请参阅 set_attrs/2)。

要访问单个属性,请参阅 get_pos/1get_ann/1get_precomments/1get_postcomments/1

另请参阅: get_ann/1get_pos/1get_postcomments/1get_precomments/1set_attrs/2

-spec get_pos(syntaxTree()) -> annotation_or_location().

返回与 Node 关联的注释(参见 //stdlib/erl_anno)。

默认情况下,所有新树节点的相关位置信息都设置为整数零。 使用 //stdlib/erl_anno:location/1//stdlib/erl_anno:line/1 获取位置信息。

另请参阅: get_attrs/1set_pos/2

此函数的链接

get_postcomments(Node)

查看源代码
-spec get_postcomments(syntaxTree()) -> [syntaxTree()].

返回节点的关联后置注释。

这是一个可能为空的抽象注释列表,按从上到下的文本顺序排列。 格式化代码时,后置注释通常显示在节点的右侧和/或下方。 例如

{foo, X, Y}     % Post-comment of tuple

如果可能,注释应该移动到同一行上任何后续分隔符字符之后,而不是将分隔符放在下一行。 例如

foo([X | Xs], Y) ->
    foo(Xs, bar(X));     % Post-comment of 'bar(X)' node
 ...

(其中注释移动到最右边的 ")" 和 ";" 之后)。

另请参阅: comment/2get_attrs/1get_precomments/1set_postcomments/2

-spec get_precomments(syntaxTree()) -> [syntaxTree()].

返回节点的关联前置注释。

这是一个可能为空的抽象注释列表,按从上到下的文本顺序排列。 格式化代码时,前置注释通常直接显示在节点的上方。 例如

% Pre-comment of function
foo(X) -> {bar, X}.

如果可能,注释应该移动到同一行上任何前面的分隔符字符之前。 例如

foo([X | Xs]) ->
    % Pre-comment of 'bar(X)' node
    [bar(X) | foo(Xs)];
...

(其中注释移动到 "[" 之前)。

另请参阅: comment/2get_attrs/1get_postcomments/1set_precomments/2

-spec has_comments(syntaxTree()) -> boolean().

如果节点没有关联的注释,则返回 false,否则返回 true

注意:这等效于 (get_precomments(Node) == []) and (get_postcomments(Node) == []),但可能更高效。

另请参阅: get_postcomments/1get_precomments/1remove_comments/1

-spec if_expr([syntaxTree()]) -> syntaxTree().

创建一个抽象的 if 表达式。

如果 Clauses[C1, ..., Cn],则结果表示 "if C1; ...; Cn end"。 更确切地说,如果每个 Ci 表示 "() Gi -> Bi",则结果表示 "if G1 -> B1; ...; Gn -> Bn end"。

另请参阅: case_expr/2clause/3if_expr_clauses/1

-spec if_expr_clauses(syntaxTree()) -> [syntaxTree()].

返回 if_expr 节点的子句子树列表。

另请参阅: if_expr/1

-spec implicit_fun(syntaxTree()) -> syntaxTree().

创建一个抽象的“隐式 fun”表达式。

结果表示 "fun Name"。 Name 应该表示 F/AM:F/A

另请参阅: arity_qualifier/2implicit_fun/2implicit_fun/3implicit_fun_name/1module_qualifier/2

此函数的链接

implicit_fun(Name, Arity)

查看源代码
-spec implicit_fun(syntaxTree(), none | syntaxTree()) -> syntaxTree().

创建一个抽象的“隐式 fun”表达式。

如果 Aritynone,则这等效于 implicit_fun(Name),否则等效于 implicit_fun(arity_qualifier(Name, Arity))

(这是一个实用函数。)

另请参阅: implicit_fun/1implicit_fun/3

此函数的链接

implicit_fun(Module, Name, Arity)

查看源代码
-spec implicit_fun(none | syntaxTree(), syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的模块限定的“隐式 fun”表达式。

如果 Modulenone,则这等效于 implicit_fun(Name, Arity),否则等效于 implicit_fun(module_qualifier(Module, arity_qualifier(Name, Arity))

(这是一个实用函数。)

另请参阅: implicit_fun/1implicit_fun/2

此函数的链接

implicit_fun_name(Node)

查看源代码
-spec implicit_fun_name(syntaxTree()) -> syntaxTree().

返回 implicit_fun 节点的名称子树。

如果 Node 表示 "fun N/A" 或 "fun M:N/A",则结果是分别表示 "N/A" 或 "M:N/A" 的子树。

另请参阅: arity_qualifier/2implicit_fun/1module_qualifier/2

此函数的链接

infix_expr(Left, Operator, Right)

查看源代码
-spec infix_expr(syntaxTree(), syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的中缀运算符表达式。

结果表示 "Left Operator Right"。

另请参阅: infix_expr_left/1infix_expr_operator/1infix_expr_right/1prefix_expr/2

-spec infix_expr_left(syntaxTree()) -> syntaxTree().

返回 infix_expr 节点的左侧参数子树。

另请参阅: infix_expr/3

此函数的链接

infix_expr_operator(Node)

查看源代码
-spec infix_expr_operator(syntaxTree()) -> syntaxTree().

返回 infix_expr 节点的运算符子树。

另请参阅: infix_expr/3

此函数的链接

infix_expr_right(Node)

查看源代码
-spec infix_expr_right(syntaxTree()) -> syntaxTree().

返回 infix_expr 节点的右侧参数子树。

另请参阅: infix_expr/3

-spec integer(integer()) -> syntaxTree().

创建一个抽象的整数文字。

词法表示形式是 Value 的规范十进制数。

另请参阅: integer_literal/1integer_value/1is_integer/2

-spec integer_literal(syntaxTree()) -> string().

返回由 integer 节点表示的数字字符串。

另请参阅: integer/1

此函数的链接

integer_range_type(Low, High)

查看源代码
-spec integer_range_type(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的范围类型。

结果表示 "Low .. High"。

另请参阅: integer_range_type_high/1integer_range_type_low/1

此函数的链接

integer_range_type_high(Node)

查看源代码
-spec integer_range_type_high(syntaxTree()) -> syntaxTree().

返回 integer_range_type 节点的上限。

另请参阅: integer_range_type/2

此函数的链接

integer_range_type_low(Node)

查看源代码
-spec integer_range_type_low(syntaxTree()) -> syntaxTree().

返回 integer_range_type 节点的下限。

另请参阅: integer_range_type/2

-spec integer_value(syntaxTree()) -> integer().

返回由 integer 节点表示的值。

另请参阅: integer/1

-spec is_atom(syntaxTree(), atom()) -> boolean().

如果 Node 的类型为 atom 且表示 Value,则返回 true,否则返回 false

另请参阅:atom/1

-spec is_char(syntaxTree(), char()) -> boolean().

如果 Node 的类型为 char 且表示 Value,则返回 true,否则返回 false

另请参阅:char/1

-spec is_form(syntaxTree()) -> boolean().

如果 Node 是表示所谓的“源代码形式”的语法树,则返回 true,否则返回 false

形式是 Erlang 源代码单元,按顺序放置构成一个 Erlang 程序。 当前形式类型为

  • attribute
  • comment
  • error_marker
  • eof_marker
  • form_list
  • function
  • warning_marker
  • text

另请参阅: attribute/2comment/2eof_marker/0error_marker/1form_list/1function/2type/1warning_marker/1

此函数的链接

is_integer(Node, Value)

查看源代码
-spec is_integer(syntaxTree(), integer()) -> boolean().

如果 Node 的类型为 integer 且表示 Value,则返回 true,否则返回 false

另请参阅: integer/1

-spec is_leaf(syntaxTree()) -> boolean().

如果 Node 是叶节点,则返回 true,否则返回 false

当前识别的叶节点类型为

  • atom
  • char
  • comment
  • eof_marker
  • error_marker
  • float
  • fun_type
  • integer
  • nil
  • operator
  • string
  • text
  • underscore
  • variable
  • warning_marker

只有当 map_expr 类型的节点没有参数且没有字段时,它才是叶节点。 只有当 map_type 类型的节点没有字段 (any_size) 时,它才是叶节点。 只有当 tuple 类型的节点的 arity 为零时,它才是叶节点。 只有当 tuple_type 类型的节点没有元素 (any_size) 时,它才是叶节点。

注意:并非所有字面量都是叶节点,反之亦然。 例如,arity 不为零的元组和非空列表可能是字面量,但不是叶节点。 另一方面,变量是叶节点,但不是字面量。

另请参阅: is_literal/1type/1

此函数的链接

is_list_skeleton(Node)

查看源代码
-spec is_list_skeleton(syntaxTree()) -> boolean().

如果 Node 的类型为 listnil,则返回 true,否则返回 false

另请参阅: list/2nil/0

-spec is_literal(syntaxTree()) -> boolean().

如果 Node 表示文字项,则返回 true,否则返回 false

当且仅当 concrete(Node) 的值已定义时,此函数返回 true

另请参阅: abstract/1concrete/1

-spec is_proper_list(syntaxTree()) -> boolean().

如果 Node 表示一个正规列表,则返回 true,否则返回 false

合适的列表是一个列表骨架,其形式为 "[]" 或 "[E1, ..., En]" 或 "[... | Tail]",其中递归地,Tail 也表示合适的列表。

注意

由于 Node 是一个语法树,因此与其子树对应的实际运行时值通常可能是部分或完全未知的。 例如,如果 Node 表示 "[... | Ns]"(其中 Ns 是一个变量),则该函数将返回 false,因为不知道 Ns 在运行时是否会绑定到列表。 反之,如果 Node 表示,例如,"[1, 2, 3]" 或 "[A | []]",则该函数将返回 true

另请参阅: list/2

此函数的链接

is_string(Node, Value)

查看源代码
-spec is_string(syntaxTree(), string()) -> boolean().

如果 Node 的类型为 string 且表示 Value,则返回 true,否则返回 false

另请参阅: string/1

-spec is_tree(syntaxTree()) -> boolean().

仅用于特殊目的。如果 Tree 是抽象语法树,则返回 true,否则返回 false

注意

此函数对所有 "旧式" 兼容 erl_parse 的 "解析树" 产生 false

另请参阅:tree/2

此函数的链接

join_comments(Source, Target)

查看源代码
-spec join_comments(syntaxTree(), syntaxTree()) -> syntaxTree().

Source 的注释附加到 Target 的当前注释中。

注意:这等效于 add_postcomments(get_postcomments(Source), add_precomments(get_precomments(Source), Target)),但可能更高效。

另请参阅: add_postcomments/2add_precomments/2comment/2get_postcomments/1get_precomments/1

-spec list([syntaxTree()]) -> syntaxTree().

等同于 list(List, none)

-spec list([syntaxTree()], none | syntaxTree()) -> syntaxTree().

构造一个抽象的列表框架。

结果的类型为 listnil。 如果 List 是一个非空列表 [E1, ..., En],则结果的类型为 list,并且如果 Tailnone,则表示 "[E1, ..., En]",否则表示 "[E1, ..., En | Tail]"。 如果 List 是空列表,则 Tail必须none,在这种情况下,结果的类型为 nil,并且表示 "[]"(请参阅 nil/0)。

列表作为语义对象(由单独的 "cons" 和 "nil" 项构成)与表示列表的各种语法形式之间的差异起初可能会令人困惑。此模块提供的函数既可以精确控制语法表示,也可以通过 cons 和 head/tail 操作进行简单的组合和解构。

注意

list(Elements, none) 中,“nil” 列表终止符是隐式的,并且没有关联的信息(请参阅 get_attrs/1)。但是,在看似等效的 list(Elements, Tail) 中,其中 Tail 的类型为 nil,列表终止符子树 Tail 可能附加了诸如位置、注释和注解之类的属性,这些属性将保留在结果中。

另请参阅:compact_list/1cons/2get_attrs/1is_list_skeleton/1is_proper_list/1list/1list_elements/1list_head/1list_length/1list_prefix/1list_suffix/1list_tail/1nil/0normalize_list/1

此函数的链接

list_comp(Template, Body)

查看源代码
-spec list_comp(syntaxTree(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的列表推导式。

如果 Body[E1, ..., En],则结果表示 "[Template || E1, ..., En]"。

另请参阅:generator/2list_comp_body/1list_comp_template/1

-spec list_comp_body(syntaxTree()) -> [syntaxTree()].

返回 list_comp 节点的 body 子树列表。

另请参阅:list_comp/2

此函数的链接

list_comp_template(Node)

查看源代码
-spec list_comp_template(syntaxTree()) -> syntaxTree().

返回 list_comp 节点的模板子树。

另请参阅:list_comp/2

-spec list_elements(syntaxTree()) -> [syntaxTree()].

返回列表框架的元素子树列表。

Node 必须表示一个规范列表。例如,如果 Node 表示 "[X1, X2 | [X3, X4 | []]",则 list_elements(Node) 会生成列表 [X1, X2, X3, X4]

另请参阅:is_proper_list/1list/2

-spec list_head(syntaxTree()) -> syntaxTree().

返回 list 节点的头部元素子树。

如果 Node 表示 "[Head ...]",则结果将表示 "Head"。

另请参阅:cons/2list/2list_tail/1

-spec list_length(syntaxTree()) -> non_neg_integer().

返回列表框架的元素子树的数量。

Node 必须表示一个规范列表。例如,如果 Node 表示 "[X1 | [X2, X3 | [X4, X5, X6]]]",则 list_length(Node) 返回整数 6。

注意

这等效于 length(list_elements(Node)),但可能效率更高。

另请参阅:is_proper_list/1list/2list_elements/1

-spec list_prefix(syntaxTree()) -> [syntaxTree()].

返回 list 节点的前缀元素子树。

如果 Node 表示 "[E1, ..., En]" 或 "[E1, ..., En | Tail]",则返回的值是 [E1, ..., En]

另请参阅: list/2

-spec list_suffix(syntaxTree()) -> none | syntaxTree().

返回 list 节点的后缀子树(如果存在)。

如果 Node 表示 "[E1, ..., En | Tail]",则返回的值是 Tail。否则,如果 Node 表示 "[E1, ..., En]",则返回 none

注意

即使此函数返回的 Tail 不是 none,如果尾部已显式给出且列表骨架未压缩(请参阅 compact_list/1),则 Tail 的类型也可以是 nil

另请参阅:compact_list/1list/2nil/0

-spec list_tail(syntaxTree()) -> syntaxTree().

返回 list 节点的尾部。

如果 Node 表示单元素列表 "[E]",则结果的类型为 nil,表示 "[]"。如果 Node 表示 "[E1, E2 ...]",则结果将表示 "[E2 ...]",如果 Node 表示 "[Head | Tail]",则结果将表示 "Tail"。

另请参阅:cons/2list/2list_head/1

-spec macro(syntaxTree()) -> syntaxTree().

等同于 macro(Name, none)

此函数的链接

macro(Name, Arguments)

查看源代码
-spec macro(syntaxTree(), none | [syntaxTree()]) -> syntaxTree().

创建一个抽象的宏应用程序。

如果 Argumentsnone,则结果表示 "?Name";否则,如果 Arguments[A1, ..., An],则结果表示 "?Name(A1, ..., An)"。

注意:如果 Arguments 是空列表,则结果将因此表示 "?Name()",包括一对匹配的括号。

预处理器对宏应用程序的参数(视为标记序列)施加的唯一语法限制是它们必须在括号、方括号、begin ... endcase ... end 等方面保持平衡。text 节点类型可用于表示不是常规 Erlang 结构的参数。

另请参阅:macro/1macro_arguments/1macro_name/1text/1

-spec macro_arguments(syntaxTree()) -> none | [syntaxTree()].

返回 macro 节点的参数子树列表(如果存在)。

如果 Node 表示 "?Name",则返回 none。否则,如果 Node 表示 "?Name(A1, ..., An)",则返回 [A1, ..., An]

另请参阅:macro/2

-spec macro_name(syntaxTree()) -> syntaxTree().

返回 macro 节点的名称子树。

另请参阅:macro/2

此函数的链接

make_tree(Type, Groups)

查看源代码
-spec make_tree(atom(), [[syntaxTree()]]) -> syntaxTree().

创建一个具有给定类型和子树的语法树。

Type 必须是节点类型名称(请参阅 type/1),该名称不表示叶节点类型(请参阅 is_leaf/1)。Groups 必须是一个非空的语法树组列表,表示给定类型的节点的子树,按照它们在打印的程序文本中出现的从左到右的顺序,按类别分组,如 subtrees/1 所做的那样。

copy_attrs(Node, make_tree(type(Node), subtrees(Node))) 的结果(请参阅 update_tree/2)表示与原始 Node 相同的源代码文本,假设 subtrees(Node) 生成非空列表。但是,它不一定具有与 Node 相同的数据表示形式。

另请参阅:copy_attrs/2is_leaf/1subtrees/1type/1update_tree/2

此函数的链接

map_comp(Template, Body)

查看源代码
-spec map_comp(syntaxTree(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的映射推导式。

如果 Body[E1, ..., En],则结果表示 "#{Template || E1, ..., En}"。

另请参阅:generator/2map_comp_body/1map_comp_template/1

-spec map_comp_body(syntaxTree()) -> [syntaxTree()].

返回 map_comp 节点的 body 子树列表。

另请参阅:map_comp/2

此函数的链接

map_comp_template(Node)

查看源代码
-spec map_comp_template(syntaxTree()) -> syntaxTree().

返回 map_comp 节点的模板子树。

另请参阅:map_comp/2

-spec map_expr([syntaxTree()]) -> syntaxTree().

等同于 map_expr(none, Fields)

此函数的链接

map_expr(Argument, Fields)

查看源代码
-spec map_expr(none | syntaxTree(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的映射表达式。

如果 Fields[F1, ..., Fn],那么如果 Argumentnone,则结果表示 "#{F1, ..., Fn}";否则,它表示 "Argument#{F1, ..., Fn}"。

另请参阅:map_expr/1map_expr_argument/1map_expr_fields/1map_field_assoc/2map_field_exact/2

此函数的链接

map_expr_argument(Node)

查看源代码
-spec map_expr_argument(syntaxTree()) -> none | syntaxTree().

返回 map_expr 节点的参数子树(如果存在)。

如果 Node 表示 "#{...}",则返回 none。否则,如果 Node 表示 "Argument#{...}",则返回 Argument

另请参阅:map_expr/2

-spec map_expr_fields(syntaxTree()) -> [syntaxTree()].

返回 map_expr 节点的字段子树列表。

另请参阅:map_expr/2

此函数的链接

map_field_assoc(Name, Value)

查看源代码
-spec map_field_assoc(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的映射关联字段。

结果表示 "Name => Value"。

另请参阅:map_expr/2map_field_assoc_name/1map_field_assoc_value/1

此函数的链接

map_field_assoc_name(Node)

查看源代码
-spec map_field_assoc_name(syntaxTree()) -> syntaxTree().

返回 map_field_assoc 节点的名称子树。

另请参阅:map_field_assoc/2

此函数的链接

map_field_assoc_value(Node)

查看源代码
-spec map_field_assoc_value(syntaxTree()) -> syntaxTree().

返回 map_field_assoc 节点的值子树。

另请参阅:map_field_assoc/2

此函数的链接

map_field_exact(Name, Value)

查看源代码
-spec map_field_exact(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的映射精确字段。

结果表示 "Name := Value"。

另请参阅:map_expr/2map_field_exact_name/1map_field_exact_value/1

此函数的链接

map_field_exact_name(Node)

查看源代码
-spec map_field_exact_name(syntaxTree()) -> syntaxTree().

返回 map_field_exact 节点的名称子树。

另请参阅:map_field_exact/2

此函数的链接

map_field_exact_value(Node)

查看源代码
-spec map_field_exact_value(syntaxTree()) -> syntaxTree().

返回 map_field_exact 节点的值子树。

另请参阅:map_field_exact/2

此函数的链接

map_generator(Pattern, Body)

查看源代码
-spec map_generator(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的 map_generator。

结果表示 "Pattern <- Body"。

另请参阅:binary_comp/2list_comp/2map_comp/2map_generator_body/1map_generator_pattern/1

此函数的链接

map_generator_body(Node)

查看源代码
-spec map_generator_body(syntaxTree()) -> syntaxTree().

返回 map_generator 节点的 body 子树。

另请参阅:map_generator/2

此函数的链接

map_generator_pattern(Node)

查看源代码
-spec map_generator_pattern(syntaxTree()) -> syntaxTree().

返回 map_generator 节点的模式子树。

另请参阅:map_generator/2

-spec map_type() -> syntaxTree().

等同于 map_type(any_size)

-spec map_type(any_size | [syntaxTree()]) -> syntaxTree().

创建一个抽象的类型映射。

如果 Fields[F1, ..., Fn],则结果表示 "#{F1, ..., Fn}";否则,如果 Fieldsany_size,则表示 "map/0"。

另请参阅:map_type_fields/1

此函数的链接

map_type_assoc(Name, Value)

查看源代码
-spec map_type_assoc(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的映射类型关联字段。

结果表示 "Name => Value"。

另请参阅:map_type/1map_type_assoc_name/1map_type_assoc_value/1

此函数的链接

map_type_assoc_name(Node)

查看源代码
-spec map_type_assoc_name(syntaxTree()) -> syntaxTree().

返回 map_type_assoc 节点的名称子树。

另请参阅:map_type_assoc/2

此函数的链接

map_type_assoc_value(Node)

查看源代码
-spec map_type_assoc_value(syntaxTree()) -> syntaxTree().

返回 map_type_assoc 节点的值子树。

另请参阅:map_type_assoc/2

此函数的链接

map_type_exact(Name, Value)

查看源代码
-spec map_type_exact(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的映射类型精确字段。

结果表示 "Name := Value"。

另请参阅:map_type/1map_type_exact_name/1map_type_exact_value/1

此函数的链接

map_type_exact_name(Node)

查看源代码
-spec map_type_exact_name(syntaxTree()) -> syntaxTree().

返回 map_type_exact 节点的名称子树。

另请参阅:map_type_exact/2

此函数的链接

map_type_exact_value(Node)

查看源代码
-spec map_type_exact_value(syntaxTree()) -> syntaxTree().

返回 map_type_exact 节点的值子树。

另请参阅:map_type_exact/2

-spec map_type_fields(syntaxTree()) -> any_size | [syntaxTree()].

返回 map_type 节点的字段子树列表。

如果 Node 表示 "map/0",则返回 any_size;否则,如果 Node 表示 "#{F1, ..., Fn}",则返回 [F1, ..., Fn]

另请参阅:map_type/0map_type/1

此函数的链接

match_expr(Pattern, Body)

查看源代码
-spec match_expr(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的匹配表达式。

结果表示 "Pattern = Body"。

另请参阅:match_expr_body/1match_expr_pattern/1

-spec match_expr_body(syntaxTree()) -> syntaxTree().

返回 match_expr 节点的 body 子树。

另请参阅:match_expr/2

此函数的链接

match_expr_pattern(Node)

查看源代码
-spec match_expr_pattern(syntaxTree()) -> syntaxTree().

返回 match_expr 节点的模式子树。

另请参阅:match_expr/2

-spec maybe_expr([syntaxTree()]) -> syntaxTree().

等同于 maybe_expr(Body, none)

此函数的链接

maybe_expr(Body, OptionalElse)

查看源代码
-spec maybe_expr([syntaxTree()], none | syntaxTree()) -> syntaxTree().

创建一个抽象的 maybe 表达式。

如果 Body[B1, ..., Bn],且 OptionalElsenone,则结果表示 “maybe B1, ..., Bn end”。 如果 Body[B1, ..., Bn],且 OptionalElse 表示一个带有子句 [C1, ..., Cn]else_expr 节点,则结果表示 “maybe B1, ..., Bn else C1; ..., Cn end”。

有关 erl_parse 子句的文档,请参阅 clause

另请参阅:maybe_expr_body/1maybe_expr_else/1

-spec maybe_expr_body(syntaxTree()) -> [syntaxTree()].

返回 maybe_expr 节点的 body 子树列表。

另请参阅:maybe_expr/2

-spec maybe_expr_else(syntaxTree()) -> none | syntaxTree().

返回 maybe_expr 节点的 else 子树。

另请参阅:maybe_expr/2

此函数的链接

maybe_match_expr(Pattern, Body)

查看源代码
-spec maybe_match_expr(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的 maybe 表达式,用于 maybe 块中。

结果表示 “Pattern ?= Body”。

另请参阅:maybe_expr/2maybe_match_expr_body/1maybe_match_expr_pattern/1

此函数的链接

maybe_match_expr_body(Node)

查看源代码
-spec maybe_match_expr_body(syntaxTree()) -> syntaxTree().

返回 maybe_expr 节点的 body 子树。

另请参阅:maybe_match_expr/2

此函数的链接

maybe_match_expr_pattern(Node)

查看源代码
-spec maybe_match_expr_pattern(syntaxTree()) -> syntaxTree().

返回 maybe_expr 节点的模式子树。

另请参阅:maybe_match_expr/2

-spec meta(syntaxTree()) -> syntaxTree().

创建语法树的元表示。

结果表示一个 Erlang 表达式 “MetaTree”,如果求值,它将生成一个新的语法树,该语法树表示与 Tree 相同的源代码文本(尽管实际的数据表示可能不同)。 MetaTree 所表示的表达式在抽象语法树实现所使用的数据结构方面是与实现无关的。附加到 Tree 节点的注释将被保留,但其他属性将丢失。

Tree 中,任何节点类型为 variable(请参阅 type/1),且其注释列表(请参阅 get_ann/1)包含原子 meta_var 的节点,在结果树中将保持不变,只是从其注释列表中删除一个 meta_var 实例。

函数 meta/1 的主要用途是将表示一段程序代码的数据结构 Tree 转换为一种在打印时与表示无关的形式。例如,假设 Tree 表示一个名为 “V” 的变量。然后(假设有一个用于打印语法树的函数 print/1),求值 print(abstract(Tree)) — 简单地使用 abstract/1 将实际的数据结构映射到语法树表示 — 将输出一个字符串,该字符串可能看起来像 “{tree, variable, ..., "V", ...}”,这显然取决于抽象语法树的实现。例如,这对于在文件中缓存语法树可能很有用。但是,在某些情况下,如在程序生成器生成器(带有两个“生成器”)中,这可能是不可接受的。改为使用 print(meta(Tree)) 将输出一个与表示无关的语法树生成表达式;在上述情况下,类似于 “erl_syntax:variable("V")”。

另请参阅:abstract/1get_ann/1type/1

此函数的链接

module_qualifier(Module, Body)

查看源代码
-spec module_qualifier(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的模块限定符。

结果表示 “Module:Body”。

另请参阅:module_qualifier_argument/1module_qualifier_body/1

此函数的链接

module_qualifier_argument(Node)

查看源代码
-spec module_qualifier_argument(syntaxTree()) -> syntaxTree().

返回 module_qualifier 节点的参数(模块)子树。

另请参阅:module_qualifier/2

此函数的链接

module_qualifier_body(Node)

查看源代码
-spec module_qualifier_body(syntaxTree()) -> syntaxTree().

返回 module_qualifier 节点的 body 子树。

另请参阅:module_qualifier/2

此函数的链接

named_fun_expr(Name, Clauses)

查看源代码
-spec named_fun_expr(syntaxTree(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的命名 fun 表达式。

如果 Clauses[C1, ..., Cn],则结果表示 “fun Name C1; ...; Name Cn end”。更确切地说,如果每个 Ci 表示 “(Pi1, ..., Pim) Gi -> Bi”,则结果表示 “fun Name(P11, ..., P1m) G1 -> B1; ...; Name(Pn1, ..., Pnm) Gn -> Bn end”。

另请参阅:named_fun_expr_arity/1named_fun_expr_clauses/1named_fun_expr_name/1

此函数的链接

named_fun_expr_arity(Node)

查看源代码
-spec named_fun_expr_arity(syntaxTree()) -> arity().

返回 named_fun_expr 节点的元数。

结果是命名函数表达式的第一个子句中的参数模式数量;忽略后续子句。

如果 named_fun_expr_clauses(Node) 返回一个空列表,或者如果该列表的第一个元素不是类型为 clause 的语法树 C,且 clause_patterns(C) 是一个非空列表,则会抛出异常。

另请参阅:clause/3clause_patterns/1named_fun_expr/2named_fun_expr_clauses/1

此函数的链接

named_fun_expr_clauses(Node)

查看源代码
-spec named_fun_expr_clauses(syntaxTree()) -> [syntaxTree()].

返回 named_fun_expr 节点的子句子树列表。

另请参阅:named_fun_expr/2

此函数的链接

named_fun_expr_name(节点)

查看源代码
-spec named_fun_expr_name(syntaxTree()) -> syntaxTree().

返回 named_fun_expr 节点的名称子树。

另请参阅:named_fun_expr/2

此函数的链接

normalize_list(节点)

查看源代码
-spec normalize_list(syntaxTree()) -> syntaxTree().

将抽象列表骨架展开为其最明确的形式。

如果 Node 表示 “[E1, ..., En | Tail]”,则结果表示 “[E1 | ... [En | Tail1] ... ]”,其中 Tail1normalize_list(Tail) 的结果。如果 Node 表示 “[E1, ..., En]”,则结果简单地表示 “[E1 | ... [En | []] ... ]”。如果 Node 不表示列表骨架,则返回 Node 本身。

另请参阅:compact_list/1list/2

-spec operator(atom() | string()) -> syntaxTree().

创建一个抽象运算符。

运算符的名称是由 Name 表示的字符序列。这类似于原子的打印名称,但运算符从不用单引号括起来;例如,operator('++') 的结果表示 “++” 而不是 “'++'”。

另请参阅:atom/1operator_literal/1operator_name/1

此函数的链接

operator_literal(节点)

查看源代码
-spec operator_literal(syntaxTree()) -> string().

返回 operator 节点表示的字面字符串。

这只是作为字符串的运算符名称。

另请参阅:operator/1

-spec operator_name(syntaxTree()) -> atom().

返回 operator 节点的名称。

请注意,名称以原子形式返回。

另请参阅:operator/1

此函数的链接

parentheses(表达式)

查看源代码
-spec parentheses(syntaxTree()) -> syntaxTree().

创建一个抽象的带括号的表达式。

结果表示 “(Body)”,与上下文无关。

另请参阅:parentheses_body/1

此函数的链接

parentheses_body(节点)

查看源代码
-spec parentheses_body(syntaxTree()) -> syntaxTree().

返回 parentheses 节点的正文子树。

另请参阅:parentheses/1

此函数的链接

prefix_expr(运算符, 参数)

查看源代码
-spec prefix_expr(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的前缀运算符表达式。

结果表示 “Operator Argument”。

另请参阅:infix_expr/3prefix_expr_argument/1prefix_expr_operator/1

此函数的链接

prefix_expr_argument(节点)

查看源代码
-spec prefix_expr_argument(syntaxTree()) -> syntaxTree().

返回 prefix_expr 节点的参数子树。

另请参阅:prefix_expr/2

此函数的链接

prefix_expr_operator(节点)

查看源代码
-spec prefix_expr_operator(syntaxTree()) -> syntaxTree().

返回 prefix_expr 节点的运算符子树。

另请参阅:prefix_expr/2

-spec receive_expr([syntaxTree()]) -> syntaxTree().

等效于 receive_expr(子句, none, [])

此函数的链接

receive_expr(子句, 超时, 动作)

查看源代码
-spec receive_expr([syntaxTree()], none | syntaxTree(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的接收表达式。

如果 Timeoutnone,则结果表示 “receive C1; ...; Cn end”(忽略 Action 参数)。否则,如果 Clauses[C1, ..., Cn]Action[A1, ..., Am],则结果表示 “receive C1; ...; Cn after Timeout -> A1, ..., Am end”。更确切地说,如果每个 Ci 表示 “(Pi) Gi -> Bi”,则结果表示 “receive P1 G1 -> B1; ...; Pn Gn -> Bn ... end”。

请注意,在 Erlang 中,如果没有指定超时部分,receive 表达式必须至少有一个子句。

另请参阅:case_expr/2clause/3receive_expr/1receive_expr_action/1receive_expr_clauses/1receive_expr_timeout/1

此函数的链接

receive_expr_action(节点)

查看源代码
-spec receive_expr_action(syntaxTree()) -> [syntaxTree()].

返回 receive_expr 节点的动作正文子树列表。

如果 Node 表示 “receive C1; ...; Cn end”,则这是空列表。

另请参阅:receive_expr/3

此函数的链接

receive_expr_clauses(节点)

查看源代码
-spec receive_expr_clauses(syntaxTree()) -> [syntaxTree()].

返回 receive_expr 节点的子句子树列表。

另请参阅:receive_expr/3

此函数的链接

receive_expr_timeout(节点)

查看源代码
-spec receive_expr_timeout(syntaxTree()) -> none | syntaxTree().

返回 receive_expr 节点的超时子树(如果有)。

如果 Node 表示 “receive C1; ...; Cn end”,则返回 none。否则,如果 Node 表示 “receive C1; ...; Cn after Timeout -> ... end”,则返回 Timeout

另请参阅:receive_expr/3

此函数的链接

record_access(参数, 类型, 字段)

查看源代码
-spec record_access(syntaxTree(), syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的记录字段访问表达式。

结果表示 “Argument#Type.Field”。

另请参阅:record_access_argument/1record_access_field/1record_access_type/1record_expr/3

此函数的链接

record_access_argument(节点)

查看源代码
-spec record_access_argument(syntaxTree()) -> syntaxTree().

返回 record_access 节点的参数子树。

另请参阅:record_access/3

此函数的链接

record_access_field(节点)

查看源代码
-spec record_access_field(syntaxTree()) -> syntaxTree().

返回 record_access 节点的字段子树。

另请参阅:record_access/3

此函数的链接

record_access_type(节点)

查看源代码
-spec record_access_type(syntaxTree()) -> syntaxTree().

返回 record_access 节点的类型子树。

另请参阅:record_access/3

此函数的链接

record_expr(类型, 字段)

查看源代码
-spec record_expr(syntaxTree(), [syntaxTree()]) -> syntaxTree().

等效于 record_expr(none, 类型, 字段)

此函数的链接

record_expr(参数, 类型, 字段)

查看源代码
-spec record_expr(none | syntaxTree(), syntaxTree(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的记录表达式。

如果 Fields[F1, ..., Fn],则如果 Argumentnone,则结果表示 “#Type{F1, ..., Fn}”,否则它表示 “Argument#Type{F1, ..., Fn}”。

另请参阅:record_access/3record_expr/2record_expr_argument/1record_expr_fields/1record_expr_type/1record_field/2record_index_expr/2

此函数的链接

record_expr_argument(节点)

查看源代码
-spec record_expr_argument(syntaxTree()) -> none | syntaxTree().

返回 record_expr 节点的参数子树(如果有)。

如果 Node 表示 “#Type{...}”,则返回 none。否则,如果 Node 表示 “Argument#Type{...}”,则返回 Argument

另请参阅:record_expr/3

此函数的链接

record_expr_fields(节点)

查看源代码
-spec record_expr_fields(syntaxTree()) -> [syntaxTree()].

返回 record_expr 节点的字段子树列表。

另请参阅:record_expr/3

此函数的链接

record_expr_type(节点)

查看源代码
-spec record_expr_type(syntaxTree()) -> syntaxTree().

返回 record_expr 节点的类型子树。

另请参阅:record_expr/3

-spec record_field(syntaxTree()) -> syntaxTree().

等效于 record_field(名称, none)

此函数的链接

record_field(名称, 值)

查看源代码
-spec record_field(syntaxTree(), none | syntaxTree()) -> syntaxTree().

创建一个抽象的记录字段规范。

如果 Valuenone,则结果简单地表示 “Name”,否则它表示 “Name = Value”。

另请参阅:record_expr/3record_field_name/1record_field_value/1

此函数的链接

record_field_name(节点)

查看源代码
-spec record_field_name(syntaxTree()) -> syntaxTree().

返回 record_field 节点的名称子树。

另请参阅:record_field/2

此函数的链接

record_field_value(节点)

查看源代码
-spec record_field_value(syntaxTree()) -> none | syntaxTree().

返回 record_field 节点的值子树(如果有)。

如果 Node 表示 “Name”,则返回 none。否则,如果 Node 表示 “Name = Value”,则返回 Value

另请参阅:record_field/2

此函数的链接

record_index_expr(类型, 字段)

查看源代码
-spec record_index_expr(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的记录字段索引表达式。结果表示 "#Type.Field"。

注意

函数名 record_index/2 由 Erlang 编译器保留,这就是为什么该名称不能用于此构造函数的原因。

另请参阅:record_expr/3record_index_expr_field/1record_index_expr_type/1

此函数的链接

record_index_expr_field(节点)

查看源代码
-spec record_index_expr_field(syntaxTree()) -> syntaxTree().

返回 record_index_expr 节点的字段子树。

另请参阅:record_index_expr/2

此函数的链接

record_index_expr_type(节点)

查看源代码
-spec record_index_expr_type(syntaxTree()) -> syntaxTree().

返回 record_index_expr 节点的类型子树。

另请参阅:record_index_expr/2

此函数的链接

record_type(名称, 字段)

查看源代码
-spec record_type(syntaxTree(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的记录类型。

如果 Fields[F1, ..., Fn],则结果表示 “#Name{F1, ..., Fn}”。

另请参阅:record_type_fields/1record_type_name/1

此函数的链接

record_type_field(名称, 类型)

查看源代码
-spec record_type_field(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的记录类型字段。

结果表示“名称 :: 类型”。

另请参阅:record_type_field_name/1record_type_field_type/1

此函数的链接

record_type_field_name(节点)

查看源代码
-spec record_type_field_name(syntaxTree()) -> syntaxTree().

返回 record_type_field 节点的名称子树。

另请参阅:record_type_field/2

此函数的链接

record_type_field_type(节点)

查看源代码
-spec record_type_field_type(syntaxTree()) -> syntaxTree().

返回 record_type_field 节点的类型子树。

另请参阅:record_type_field/2

此函数的链接

record_type_fields(节点)

查看源代码
-spec record_type_fields(syntaxTree()) -> [syntaxTree()].

返回 record_type 节点的字段子树。

另请参阅:record_type/2

此函数的链接

record_type_name(节点)

查看源代码
-spec record_type_name(syntaxTree()) -> syntaxTree().

返回 record_type 节点的名称子树。

另请参阅:record_type/2

此函数的链接

remove_comments(节点)

查看源代码
-spec remove_comments(syntaxTree()) -> syntaxTree().

清除与 节点 关联的注释。

注意:这等效于 set_precomments(set_postcomments(Node, []), []),但可能更有效率。

另请参阅:set_postcomments/2set_precomments/2

-spec revert(syntaxTree()) -> syntaxTree().

如果可能,返回语法树的 erl_parse 兼容表示形式。

如果 Tree 表示格式良好的 Erlang 程序或表达式,则转换应该可以顺利进行。通常,如果转换失败(即,结果仍然是抽象语法树),则 is_tree/1 会产生 true,否则产生 false

is_tree/1 测试并非完全万无一失。对于一些特殊的节点类型(例如 arity_qualifier),如果此类节点出现在不期望的上下文中,它将保持不变,作为结果中未还原的子树。只有当 Tree 实际上不代表合法的 Erlang 代码时,才会发生这种情况。

另请参阅: //stdlib/erl_parserevert_forms/1

-spec revert_forms(forms()) -> [erl_parse()].

恢复 Erlang 源代码形式的序列。

序列可以作为 form_list 语法树(可能是嵌套的)或作为“程序形式”语法树的列表给出。如果成功,则返回相应的 erl_parse 兼容语法树的扁平列表(参见 revert/1)。如果某些程序形式无法还原,则会抛出 {error, Form}。表单序列中的独立注释将被丢弃。

另请参阅: form_list/1is_form/1revert/1

此函数的链接

set_ann(节点, 注释)

查看源代码
-spec set_ann(syntaxTree(), [term()]) -> syntaxTree().

节点 的用户注释列表设置为 注释

另请参阅: add_ann/2copy_ann/2get_ann/1

此函数的链接

set_attrs(节点, 属性)

查看源代码
-spec set_attrs(syntaxTree(), syntaxTreeAttributes()) -> syntaxTree().

节点 的属性设置为 属性

另请参阅: copy_attrs/2get_attrs/1

此函数的链接

set_pos(节点, 位置)

查看源代码
-spec set_pos(syntaxTree(), annotation_or_location()) -> syntaxTree().

节点 的位置信息设置为 位置

另请参阅: copy_pos/2get_pos/1

此函数的链接

set_postcomments(节点, 注释)

查看源代码
-spec set_postcomments(syntaxTree(), [syntaxTree()]) -> syntaxTree().

节点 的后置注释设置为 注释

Comments 应该是抽象注释的列表(可能为空),按自上而下的文本顺序排列。

另请参阅: add_postcomments/2comment/2copy_comments/2get_postcomments/1join_comments/2remove_comments/1set_precomments/2

此函数的链接

set_precomments(节点, 注释)

查看源代码
-spec set_precomments(syntaxTree(), [syntaxTree()]) -> syntaxTree().

节点 的前置注释设置为 注释

Comments 应该是抽象注释的列表(可能为空),按自上而下的文本顺序排列。

另请参阅: add_precomments/2comment/2copy_comments/2get_precomments/1join_comments/2remove_comments/1set_postcomments/2

此函数的链接

size_qualifier(主体, 大小)

查看源代码
-spec size_qualifier(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的大小限定符。

结果表示 "Body:Size"。

另请参阅: size_qualifier_argument/1size_qualifier_body/1

此函数的链接

size_qualifier_argument(节点)

查看源代码
-spec size_qualifier_argument(syntaxTree()) -> syntaxTree().

返回 size_qualifier 节点的参数子树(大小)。

另请参阅: size_qualifier/2

此函数的链接

size_qualifier_body(节点)

查看源代码
-spec size_qualifier_body(syntaxTree()) -> syntaxTree().

返回 size_qualifier 节点的主体子树。

另请参阅: size_qualifier/2

-spec string(string()) -> syntaxTree().

创建一个抽象的字符串字面量。

结果表示 "Text"(包括周围的双引号),其中 Text 对应于 Value 中的字符序列,但不表示特定的字符串文字。

例如,string("x\ny") 的结果表示 "x\ny""x\12y""x\012y""x\^Jy" 中的任何和所有;请参阅 char/1

另请参阅: char/1is_string/2string_literal/1string_literal/2string_value/1

此函数的链接

string_literal(节点)

查看源代码
-spec string_literal(syntaxTree()) -> nonempty_string().

返回 string 节点表示的字面字符串。

这包括周围的双引号字符。超过 255 的字符将被转义。

另请参阅: string/1

此函数的链接

string_literal(节点, 编码)

查看源代码
-spec string_literal(syntaxTree(), encoding()) -> nonempty_string().

返回 string 节点表示的字面字符串。

这包括周围的双引号字符。根据编码,超过 255 的字符将被转义 (latin1) 或按原样复制 (utf8)。

另请参阅: string/1

-spec string_value(syntaxTree()) -> string().

返回 string 节点表示的值。

另请参阅: string/1

-spec subtrees(syntaxTree()) -> [[syntaxTree()]].

返回语法树的所有子树的分组列表。

如果 Node 是一个叶节点(参见 is_leaf/1),则这是一个空列表,否则结果始终是一个非空列表,其中包含 Node 的子树列表,按照它们在打印的程序文本中出现的从左到右的顺序排列,并按类别分组。通常,每个组只包含一个子树。

根据 Node 的类型,某些组的大小可能是可变的(例如,由元组的所有元素组成的组),而其他组始终包含相同数量的元素 - 通常正好一个(例如,包含 case 表达式的参数表达式的组)。但是,请注意,返回列表的确切结构(对于给定的节点类型)通常不应依赖,因为它可能会在不另行通知的情况下更改。

如果想要遍历语法树,访问其所有子树,但在大多数或所有情况下以统一的方式处理树的节点,则函数 subtrees/1 和构造函数 make_tree/2update_tree/2 会有很大帮助。使用这些函数可以简化此操作,并确保您的代码不会对语法树数据类型的扩展过于敏感,因为您的代码未显式处理的任何节点类型都可以留给默认情况。

例如

     postorder(F, Tree) ->
        F(case subtrees(Tree) of
            [] -> Tree;
            List -> update_tree(Tree,
                                [[postorder(F, Subtree)
                                  || Subtree &lt;- Group]
                                 || Group &lt;- List])
          end).

将函数 F 映射到 Tree 及其所有子树上,对语法树执行后序遍历。(请注意使用 update_tree/2 来保留节点属性。)对于一个简单的函数,例如

     f(Node) ->
        case type(Node) of
            atom -> atom("a_" ++ atom_name(Node));
            _ -> Node
        end.

调用 postorder(fun f/1, Tree) 将产生 Tree 的新表示形式,其中所有原子名称都已使用前缀 "a_" 扩展,但其他任何内容(包括注释、注释和行号)都未更改。

另请参阅: copy_attrs/2is_leaf/1make_tree/2type/1

-spec text(string()) -> syntaxTree().

创建一个抽象的源代码文本片段。

结果完全表示 String 中的字符序列。这在需要完全控制结果输出(例如浮点数或宏定义的外观)的情况下很有用。

另请参阅: text_string/1

-spec text_string(syntaxTree()) -> string().

返回 text 节点表示的字符序列。

另请参阅: text/1

-spec tree(atom()) -> tree().

等效于 tree(类型, [])

-spec tree(atom(), term()) -> tree().

仅用于特殊目的。创建一个具有类型标签 类型 和关联数据 数据 的抽象语法树节点。

此函数以及相关的 is_tree/1data/1 提供了一种统一的方式来扩展 erl_parse 节点类型的集合。关联的数据是任何项,其格式可能取决于类型标记。

注意

  • 在此模块之外创建的任何节点都必须具有与此模块当前定义的节点类型不同的类型标记;有关完整列表,请参阅 type/1

  • 语法树节点的类型标记也可以用作 erl_parse 表示的主要标记;在这种情况下,该节点类型的选择器函数必须同时处理抽象语法树和 erl_parse 形式。函数 type(T) 应该返回正确的类型标记,而与 T 的表示形式无关,以便用户看不到 erl_syntaxerl_parse 节点之间的差异。

另请参阅: data/1is_tree/1type/1

此函数的链接

try_after_expr(主体, 之后)

查看源代码
-spec try_after_expr([syntaxTree()], [syntaxTree()]) -> syntaxTree().

等效于 try_expr(主体, [], [], 之后)

此函数的链接

try_expr(主体, 处理程序)

查看源代码
-spec try_expr([syntaxTree()], [syntaxTree()]) -> syntaxTree().

等效于 try_expr(主体, [], 处理程序)

此函数的链接

try_expr(主体, 子句, 处理程序)

查看源代码
-spec try_expr([syntaxTree()], [syntaxTree()], [syntaxTree()]) -> syntaxTree().

等效于 try_expr(主体, 子句, 处理程序, [])

此函数的链接

try_expr(主体, 子句, 处理程序, 之后)

查看源代码
-spec try_expr([syntaxTree()], [syntaxTree()], [syntaxTree()], [syntaxTree()]) -> syntaxTree().

创建一个抽象的 try 表达式。

如果 Body[B1, ..., Bn]Clauses[C1, ..., Cj]Handlers[H1, ..., Hk],且 After[A1, ..., Am],则结果表示 "try B1, ..., Bn of C1; ...; Cj catch H1; ...; Hk after A1, ..., Am end"。更准确地说,如果每个 Ci 表示 "(CPi) CGi -> CBi",且每个 Hi 表示 "(HPi) HGi -> HBi",则结果表示 "try B1, ..., Bn of CP1 CG1 -> CB1; ...; CPj CGj -> CBj catch HP1 HG1 -> HB1; ...; HPk HGk -> HBk after A1, ..., Am end";请参阅 case_expr/2。如果 Clauses 为空列表,则会省略 of ... 部分。如果 After 为空列表,则会省略 after ... 部分。如果 Handlers 为空列表,且 After 为非空列表,则会省略 catch ... 部分。

另请参阅: case_expr/2class_qualifier/2clause/3try_after_expr/2try_expr/2try_expr/3try_expr_after/1try_expr_body/1try_expr_clauses/1try_expr_handlers/1

此函数的链接

try_expr_after(节点)

查看源代码
-spec try_expr_after(syntaxTree()) -> [syntaxTree()].

返回 try_expr 节点的 "after" 子树列表。

另请参阅: try_expr/4

-spec try_expr_body(syntaxTree()) -> [syntaxTree()].

返回 try_expr 节点的主体子树列表。

另请参阅: try_expr/4

此函数的链接

try_expr_clauses(节点)

查看源代码
-spec try_expr_clauses(syntaxTree()) -> [syntaxTree()].

返回 try_expr 节点的 case 子句子树列表。如果 节点 表示 "try Body catch H1; ...; Hn end",则结果为空列表。

另请参阅: try_expr/4

此函数的链接

try_expr_handlers(节点)

查看源代码
-spec try_expr_handlers(syntaxTree()) -> [syntaxTree()].

返回 try_expr 节点的处理程序子句子树列表。

另请参阅: try_expr/4

-spec tuple([syntaxTree()]) -> syntaxTree().

创建一个抽象的元组。

如果 Elements[X1, ..., Xn],则结果表示 "{X1, ..., Xn}"。

注意

Erlang 语言具有不同的 1 元组,这意味着 {X} 始终与 X 本身不同。

另请参阅: tuple_elements/1tuple_size/1

此函数的链接

tuple_elements(节点)

查看源代码
-spec tuple_elements(syntaxTree()) -> [syntaxTree()].

返回 tuple 节点的元素子树列表。

另请参阅: tuple/1

-spec tuple_size(syntaxTree()) -> non_neg_integer().

返回 tuple 节点的元素数量。

注意

这等效于 length(tuple_elements(Node)),但可能更高效。

另请参阅: tuple/1tuple_elements/1

-spec tuple_type() -> syntaxTree().

等效于 tuple_type(any_size)

-spec tuple_type(any_size | [syntaxTree()]) -> syntaxTree().

创建一个抽象的类型元组。

如果 Elements[T1, ..., Tn],则结果表示 "{T1, ..., Tn}";否则,如果 Elementsany_size,则表示 "tuple/0"。

另请参阅: tuple_type_elements/1

此函数的链接

tuple_type_elements(节点)

查看源代码
-spec tuple_type_elements(syntaxTree()) -> any_size | [syntaxTree()].

返回 tuple_type 节点的类型元素子树列表。

如果 Node 表示 "tuple/0",则返回 any_size;否则,如果 Node 表示 "{T1, ..., Tn}",则返回 [T1, ..., Tn]

另请参阅: tuple_type/0tuple_type/1

-spec type(syntaxTree()) -> atom().

返回 节点 的类型标记。

如果 Node 不表示语法树,则评估会因原因 badarg 而失败。此模块当前定义的节点类型为

  • application
  • annotated_type
  • arity_qualifier
  • atom
  • attribute
  • binary
  • binary_field
  • bitstring_type
  • block_expr
  • case_expr
  • catch_expr
  • char
  • class_qualifier
  • clause
  • comment
  • conjunction
  • constrained_function_type
  • constraint
  • disjunction
  • else_expr
  • eof_marker
  • error_marker
  • float
  • form_list
  • fun_expr
  • fun_type
  • function
  • function_type
  • generator
  • if_expr
  • implicit_fun
  • infix_expr
  • integer
  • integer_range_type
  • list
  • list_comp
  • macro
  • map_expr
  • map_field_assoc
  • map_field_exact
  • map_type
  • map_type_assoc
  • map_type_exact
  • match_expr
  • maybe_expr
  • maybe_match_expr
  • module_qualifier
  • named_fun_expr
  • nil
  • operator
  • parentheses
  • prefix_expr
  • receive_expr
  • record_access
  • record_expr
  • record_field
  • record_index_expr
  • record_type
  • record_type_field
  • size_qualifier
  • string
  • text
  • try_expr
  • tuple
  • tuple_type
  • typed_record_field
  • type_application
  • type_union
  • underscore
  • user_type_application
  • variable
  • warning_marker

用户可以(出于特殊目的)使用 tree/2 函数创建具有其他类型标签的额外节点。

注意:节点类型的主要构造函数应始终与节点类型本身具有相同的名称。

另请参阅:annotated_type/2application/3arity_qualifier/2atom/1attribute/2binary/1binary_field/2bitstring_type/2block_expr/1case_expr/2catch_expr/1char/1class_qualifier/2clause/3comment/2conjunction/1constrained_function_type/2constraint/2disjunction/1else_expr/1eof_marker/0error_marker/1float/1form_list/1fun_expr/1fun_type/0function/2function_type/1function_type/2generator/2if_expr/1implicit_fun/2infix_expr/3integer/1integer_range_type/2list/2list_comp/2macro/2map_expr/2map_field_assoc/2map_field_exact/2map_type/0map_type/1map_type_assoc/2map_type_exact/2match_expr/2maybe_expr/1maybe_expr/2maybe_match_expr/2module_qualifier/2named_fun_expr/2nil/0operator/1parentheses/1prefix_expr/2receive_expr/3record_access/3record_expr/2record_field/2record_index_expr/2record_type/2record_type_field/2size_qualifier/2string/1text/1tree/2try_expr/3tuple/1tuple_type/0tuple_type/1type_application/2type_union/1typed_record_field/2underscore/0user_type_application/2variable/1warning_marker/1

此函数的链接

type_application(类型名称, 参数)

查看源代码
-spec type_application(syntaxTree(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的类型应用表达式。

如果 Arguments[T1, ..., Tn],则结果表示 "TypeName(T1, ...Tn)"。

另请参阅: type_application/3type_application_arguments/1type_application_name/1user_type_application/2

此函数的链接

type_application(模块, 类型名称, 参数)

查看源代码
-spec type_application(none | syntaxTree(), syntaxTree(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的类型应用表达式。

如果 Modulenone,则此调用等效于 type_application(TypeName, Arguments),否则等效于 type_application(module_qualifier(Module, TypeName), Arguments)

(这是一个实用函数。)

另请参阅: module_qualifier/2type_application/2

此函数的链接

type_application_arguments(节点)

查看源代码
-spec type_application_arguments(syntaxTree()) -> [syntaxTree()].

返回 type_application 节点的参数子树。

另请参阅: type_application/2

此函数的链接

type_application_name(节点)

查看源代码
-spec type_application_name(syntaxTree()) -> syntaxTree().

返回 type_application 节点的类型名称子树。

另请参阅: type_application/2

-spec type_union([syntaxTree()]) -> syntaxTree().

创建一个抽象的类型联合。

如果 Types[T1, ..., Tn],则结果表示 "T1 | ... | Tn"。

另请参阅: type_union_types/1

此函数的链接

type_union_types(节点)

查看源代码
-spec type_union_types(syntaxTree()) -> [syntaxTree()].

返回 type_union 节点的类型子树列表。

另请参阅: type_union/1

此函数的链接

typed_record_field(字段, 类型)

查看源代码
-spec typed_record_field(syntaxTree(), syntaxTree()) -> syntaxTree().

创建一个抽象的带类型的记录字段规范。

结果表示 "Field :: Type"。

另请参阅: typed_record_field_body/1typed_record_field_type/1

此函数的链接

typed_record_field_body(节点)

查看源代码
-spec typed_record_field_body(syntaxTree()) -> syntaxTree().

返回 typed_record_field 节点的字段子树。

另请参阅: typed_record_field/2

此函数的链接

typed_record_field_type(节点)

查看源代码
-spec typed_record_field_type(syntaxTree()) -> syntaxTree().

返回 typed_record_field 节点的类型子树。

另请参阅: typed_record_field/2

-spec underscore() -> syntaxTree().

创建一个抽象的通用模式("_")。

词法表示为单个下划线字符。请注意,从词法上讲,这不是一个变量。

另请参阅: variable/1

此函数的链接

update_tree(节点, 组)

查看源代码
-spec update_tree(syntaxTree(), [[syntaxTree()]]) -> syntaxTree().

创建一个具有与给定树相同类型和属性的语法树。

这等效于 copy_attrs(Node, make_tree(type(Node), Groups))

另请参阅: copy_attrs/2make_tree/2type/1

此函数的链接

user_type_application(类型名称, 参数)

查看源代码
-spec user_type_application(syntaxTree(), [syntaxTree()]) -> syntaxTree().

创建一个抽象的用户类型。

如果 Arguments[T1, ..., Tn],则结果表示 "TypeName(T1, ...Tn)"。

另请参阅: type_application/2user_type_application_arguments/1user_type_application_name/1

此函数的链接

user_type_application_arguments(节点)

查看源代码
-spec user_type_application_arguments(syntaxTree()) -> [syntaxTree()].

返回 user_type_application 节点的参数子树。

另请参阅: user_type_application/2

此函数的链接

user_type_application_name(节点)

查看源代码
-spec user_type_application_name(syntaxTree()) -> syntaxTree().

返回 user_type_application 节点的类型名称子树。

另请参阅: user_type_application/2

-spec variable(atom() | string()) -> syntaxTree().

创建一个具有给定名称的抽象变量。

Name 可以是任何表示词法有效变量名称的原子或字符串,但不能是单个下划线字符;请参阅 underscore/0

注意

不会执行检查来验证字符序列是否表示正确的变量名称,即其第一个字符是否是大写的 Erlang 字符,或者是否包含非法字符(例如控制字符或空格)。

另请参阅: underscore/0variable_literal/1variable_name/1

此函数的链接

variable_literal(节点)

查看源代码
-spec variable_literal(syntaxTree()) -> string().

返回 variable 节点的名称作为字符串。

另请参阅: variable/1

-spec variable_name(syntaxTree()) -> atom().

返回 variable 节点的名称作为原子。

另请参阅: variable/1

此函数的链接

warning_marker(警告)

查看源代码
-spec warning_marker(term()) -> syntaxTree().

创建一个抽象的警告标记。

结果表示源代码中可能出现的问题,以及由 Error 给出的关联 Erlang I/O ErrorInfo 结构(有关详细信息,请参见模块 //stdlib/io)。警告标记被视为源代码形式,但没有定义的词法形式。

注意

仅为了向后兼容现有解析器和工具而支持此项。

另请参阅: eof_marker/0error_marker/1is_form/1warning_marker_info/1

此函数的链接

warning_marker_info(节点)

查看源代码
-spec warning_marker_info(syntaxTree()) -> term().

返回 warning_marker 节点的 ErrorInfo 结构。

另请参阅: warning_marker/1