非常教程

Erlang 20参考手册

syntax_tools

erl_syntax_lib

模块

erl_syntax_lib

模块摘要

支持抽象Erlang语法树的库。

描述

支持抽象Erlang语法树的库。

该模块包含用于处理模块中定义的抽象数据类型的实用程序函数erl_syntax

数据类型

info_pair()= { key(),term()} key()= attributes | 错误| 出口| 函数| 进口| 模块| 记录| warningsordset(T)= ordsets:ordset(T)** set(T)= ** sets:set(T)** syntaxTree()= [erl_syntax:syntaxTree() **](erl_syntax#type-syntaxTree)

抽象语法树。见erl_syntax模块获取详细信息。

输出

analyze_application(Node::syntaxTree()) -> FunctionName | Arity

类型

返回被调用函数的名称。结果是表示应用函数的名称F/A,如果Node表示函数应用程序“ <em>F</em>(<em>X_1</em>, ..., <em>X_A</em>)”。如果该函数没有明确命名(即F由某个表达式给出),则只A返回该元数据。

评价投syntax_error如果Node不表示格式良好的应用程序表达式。

另见: analyze_function_name/1

analyze_attribute(Node::syntaxTree()) -> preprocessor | {atom(), atom()}

分析属性节点。如果Node表示预处理指令,即原子。preprocessor会被归还。否则,如果Node表示模块属性“-<em>Name</em>...“,元组{Name, Info}返回,其中Info依赖于Name,如下:

{module, Info}

哪里Info = analyze_module_attribute(Node)

{export, Info}

Info = analyze_export_attribute(Node)

{import, Info}

Info = analyze_import_attribute(Node)

{file, Info}

Info = analyze_file_attribute(Node)

{record, Info}

Info = analyze_record_attribute(Node)

{Name, Info}

{Name, Info} = analyze_wild_attribute(Node)

评价投syntax_error如果Node不表示格式良好的模块属性。

另请参阅: analyze_export_attribute/1analyze_file_attribute/1analyze_import_attribute/1analyze_module_attribute/1analyze_record_attribute/1analyze_wild_attribute/1

analyze_export_attribute(Node::syntaxTree()) -> [FunctionName]

类型

返回由导出属性声明的函数名列表。我们并不保证每个名称最多出现在列表中一次。没有确定上市顺序。

评价投syntax_error如果Node不表示格式良好的导出属性。

另见: analyze_attribute/1

analyze_file_attribute(Node::syntaxTree()) -> {string(), integer()}

的文件名和行号。file属性。结果是一对{File, Line}如果Node代表“-file(File, Line).

评价投syntax_error如果Node不代表格式良好的file属性。

另见: analyze_attribute/1

analyze_form(Node::syntaxTree()) -> {atom(), term()} | atom()

分析“源代码表单”节点。如果Node是“表单”类型(cf. erl_syntax:is_form/1),则返回的值是一个元组{Type, Info},其中Type是节点类型并Info依赖于Type,如下所示:

{attribute, Info}

Info = analyze_attribute(Node)

{error_marker, Info}

Info = erl_syntax:error_marker_info(Node)

{function, Info}

Info = analyze_function(Node)

{warning_marker, Info}

哪里Info = erl_syntax:warning_marker_info(Node)

对于其他类型的窗体,只返回节点类型。

评价投syntax_error如果Node不是很完美。

另请参阅: analyze_attribute/1analyze_function/1erl_syntax:error_marker_info/1erl_syntax:is_form/1erl_syntax:warning_marker_info/1

analyze_forms(Forms) -> [{Key, term()}]

类型

分析一系列“程序形式”。给出Forms可能是一个类型的单一语法树。form_list,或“程序表单”语法树的列表。返回的值是对的列表。{Key, Info}的每一个值Key最多在列表中发生一次;缺少特定的键表示该键没有定义好的值。

结果列表中的每个条目包含有关程序表单的下列相应信息:

{attributes, Attributes}

  • Attributes = [{atom(), term()}] Attributes是表示-compile(...)Forms(参考analyze_wild_attribute/1)中出现的所有“野”属性(例如“ ”)的名称和对应值的对列表。我们不保证每个名字在列表中至多出现一次。列表的顺序没有定义。 {errors, Errors}
  • Errors = [term()]

Errors是所有错误描述符的列表。error_marker中发生的节点。Forms没有确定上市顺序。

{exports, Exports}

  • Exports = [FunctionName]
  • FunctionName = atom() | {atom(), integer()} | {ModuleName, FunctionName}
  • ModuleName = atom()

Exports是由Forms(cf. analyze_export_attribute/1)中的导出声明属性列出的那些函数名称的表示的列表。我们不保证每个名字在列表中至多出现一次。列表的顺序没有定义。

{functions, Functions}

  • Functions = [{atom(), integer()}] FunctionsForms(cf. analyze_function/1)中定义的函数的名称列表。我们不保证每个名字在列表中至多出现一次。列表的顺序没有定义。 {imports, Imports}
  • Imports = [{Module, Names}]
  • Module = atom()
  • Names = [FunctionName]
  • FunctionName = atom() | {atom(), integer()} | {ModuleName, FunctionName}
  • ModuleName = atom()

Imports是表示那些模块名称和相应的函数名称的对的列表,这些名称由Forms(cf. analyze_import_attribute/1)中的导入声明属性列出,其中每个Module最多出现一次Imports。我们不保证每个名称在函数名称列表中最多只出现一次。列表的顺序没有定义。

{module, ModuleName}

  • ModuleName = atom()ModuleName中的模块属性声明的名称。Forms中未定义模块名称的Forms,则结果将不包含module钥匙。如果应该发生多个模块名声明,那么除第一个模块声明之外,所有其他都将被忽略。{records, Records}
  • Records = [{atom(), Fields}]
  • Fields = [{atom(), {Default, Type}}]
  • Default = none | syntaxTree()
  • Type = none | syntaxTree()

Records是表示所有记录声明属性中出现的名称和相应字段声明的对的列表Forms。对于声明没有默认值的字段,对应的值Default是原子none。同样,对于没有类型声明的字段,对应的值Type是原子none(cf. analyze_record_attribute/1)。我们不保证每个记录名称最多一次出现在列表中。列表的顺序没有定义。

{warnings, Warnings}

  • Warnings = [term()]

警告是表单中发生的所有warning_marker节点 的错误描述符列表 。列表的顺序没有定义。

如果遇到不合格的Erlang构造,则评估会抛出syntax_error。

另请参阅: analyze_export_attribute/1, analyze_function/1, analyze_import_attribute/1, analyze_record_attribute/1, analyze_wild_attribute/1, erl_syntax:error_marker_info/1, erl_syntax:warning_marker_info/1.

analyze_function(Node::syntaxTree()) -> {atom(), integer()}

返回函数定义的名称和形式。如果Node表示一个函数定义“ Name(<em> P_1 </ em>,...,<em> P_A </ em>) - > ... ” ,结果是一对{Name,A}。

如果Node不能表示格式正确的函数定义,则 评估将引发syntax_error。

analyze_function_name(Node :: syntaxTree()) - > FunctionName

类型

FunctionName = atom()| {atom(),integer()} | {ModuleName,FunctionName}

ModuleName = atom()

返回由语法树表示的函数名称。如果 Node表示一个函数名称,例如“ foo / 1”或“ bloggs:fred / 2 ”,则返回该名称的统一表示形式。语法树中arity和模块名称限定符的不同嵌套不会影响结果。

如果Node没有表示格式正确的函数名称,那么 评估会抛出syntax_error。

analyze_implicit_fun(Node :: syntaxTree()) - > FunctionName

类型

FunctionName = atom()| {atom(),integer()} | {ModuleName,FunctionName}

ModuleName = atom()

返回隐式有趣表达式“ fun <em> F </ em> ”的名称。结果是函数名称F的表示。(参见analyze_function_name / 1。)

如果Node不能表示格式良好的隐式乐趣,那么 评估会抛出syntax_error。

另请参阅: analyze_function_name / 1

analyze_import_attribute(Node :: syntaxTree()) - > {atom(),[FunctionName]} | 原子()

类型

FunctionName = atom()| {atom(),integer()} | {ModuleName,FunctionName}

ModuleName = atom()

返回模块名称和(如果存在)由导入属性声明的函数名称列表。返回的值是一个原子 模块或一对{Module,Names},其中 Names是从Module命名的模块中声明为已导入的函数名称的列表。我们不保证每个名称在名称中至多出现一次。列表的顺序没有定义。

如果节点不能表示格式良好的导入属性,则评估将引发syntax_error。

另请参阅: analyze_attribute / 1

analyze_module_attribute(Node :: syntaxTree()) - > Name :: atom()| {Name :: atom(),Variables :: [atom()]}

返回由模块属性声明的模块名称和可能的参数。如果属性是普通模块声明(例如-module(name)),则结果是模块名称。如果属性是参数化模块声明,则结果是包含模块名称和参数变量名称列表的元组。

如果Node不能表示格式正确的模块属性,那么评估会抛出syntax_error。

另请参阅: analyze_attribute / 1

analyze_record_attribute(Node :: syntaxTree()) - > {atom(),Fields}

类型

Fields = [{atom(),{Default,Type}}]

默认=无| syntaxTree()

Type = none | syntaxTree()

返回记录声明属性的名称和字段列表。如果 Node表示“ -record(Name,{...})。 ”,其中Fields是每个字段的标签{Label,{Default,Type}}的列表“ 标签,结果是一对{Name,Fields} “,” Label = <em> Default </ em> “,” Label :: <em> Type </ em> “或” Label = <em> Default </ em> :: <em> Type </ em > “在声明中按照从左到右的顺序列出。如果该字段没有默认值声明,则默认值为 原子无。类型将是原子无。我们不保证每个标签在列表中至多出现一次。

如果节点没有表示格式良好的记录声明属性,则 评估将引发syntax_error。

另请参阅: analyze_attribute / 1analyze_record_field / 1

analyze_record_expr(Node :: syntaxTree()) - > {atom(),Info} | 原子()

类型

Info = {atom(),[{atom(),Value}]} {atom(),atom()} | 原子()

值= syntaxTree()

返回记录表达式的记录名称和字段名称/名称。如果Node有record_expr,record_index_expr或record_access 类型,则返回一个{Type,Info}对,否则返回一个原子 类型。Type是Node的节点类型 ,Info取决于 Type,如下所示:

record_expr:

{atom(),[{atom(),Value}]}

record_access:

{atom(),atom()}

record_index_expr:

{atom(),atom()}

对于record_expr节点,Info表示所涉及字段的记录名称和描述符列表,按它们出现的顺序列出。如果节点表示“ 标签= <em>值</ em> ” ,则字段描述符是一对 {标签,值}。对于record_access节点, Info表示记录名称和字段名称。对于 record_index_expr节点,Info表示记录名称和名称字段名称。

如果 节点表示格式不正确的记录表达式,则评估将引发syntax_error。

另请参阅: analyze_record_attribute / 1analyze_record_field / 1

analyze_record_field(Node :: syntaxTree()) - > {atom(),{Default,Type}}

类型

默认=无| syntaxTree()

Type = none | syntaxTree()

返回记录字段说明符的标签,值表达式和类型。如果 Node代表“ Label ”,“ Label = <em> Default </ em> ”,“ Label :: <em> Type </ em>”,或者结果是一对{Label,{Default,Type}} “ Label = <em> Default </ em> :: <em> Type </ em> ”。如果该字段没有值表达式,则默认值为 原子无。如果该字段没有类型,则Type的值将是原子无。

如果节点不表示格式良好的记录字段说明符,则 评估将引发syntax_error。

另请参阅: analyze_record_attribute / 1analyze_record_expr / 1

analyze_type_application(Node :: syntaxTree()) - > TypeName

类型

TypeName = {atom(),integer()} | {ModuleName,{atom(),integer()}}

ModuleName = atom()

返回使用的类型的名称。如果节点代表本地(用户)类型的应用程序“ <em> N </ em>”(<em> T_1 </ em>),则结果是使用的预定义或本地类型N / A的名称的表示形式。 ...,<em> T_A </ em>) “,或者使用远程类型名称的表示M: 如果Node表示远程用户类型应用程序,则为N / A ” <em> M </ em>:< em> N </ em>(<em> T_1 </ em>,...,<em> T_A </ em>) “。

如果节点不表示格式良好的(用户)类型应用程序表达式,则评估将引发syntax_error。

另请参阅: analyze_type_name / 1

analyze_type_name(Node :: syntaxTree()) - > TypeName

类型

TypeName = atom()| {atom(),integer()} | {ModuleName,{atom(),integer()}}

ModuleName = atom()

返回由语法树表示的类型名称。如果 Node表示类型名称,例如“ foo / 1”或“ bloggs:fred / 2 ”,则返回该名称的统一表示。

如果Node不能表示格式良好的类型名称,那么 评估会抛出syntax_error。

analyze_wild_attribute(Node :: syntaxTree()) - > {atom(),term()}

返回“wild”属性的名称和值。如果Node表示“ -Name(Value) ” ,那么结果是{Name,Value}对。

请注意,不会检查Name是否为保留的属性名称,如模块或 导出:假定该属性为“wild”。

如果Node不表示格式良好的通配属性,则评估会引发syntax_error。

另请参阅: analyze_attribute / 1

annotate_bindings(Tree :: syntaxTree()) - > syntaxTree()

在语法树中添加或更新节点上的注释。相当于annotate_bindings(Tree,Bindings),其中顶级环境Bindings取自树的根节点上的 注释{env,Bindings}。如果不存在这样的注释,则抛出异常。

另请参阅: annotate_bindings / 2

annotate_bindings(Tree :: syntaxTree(),Bindings :: ordset(atom())) - > syntaxTree()

在语法树中添加或更新节点上的注释。 绑定指定顶层节点环境中的一组绑定变量。以下注释受到影响:

  • {env, Vars}表示子树的输入环境。
  • {bound, Vars}表示在子树中绑定的变量。
  • {free, Vars},表示子树中的空闲变量。

BindingsVars已排序-设置列表%28 cf。模块ordsets表示可变名称的原子的%29。

另见: ordsets(3)annotate_bindings/1

fold(F::Function, Start::term(), Tree::syntaxTree()) -> term()

类型

在语法树的所有节点上折叠一个函数。其结果是的值Function(X1, Function(X2, ... Function(Xn, Start) ... )),其中[X1, X2, ..., Xn]是的节点Tree在一个后序遍历。

另见: fold_subtrees/3foldl_listlist/3

fold_subtrees(F::Function, Start::term(), Tree::syntaxTree()) -> term()

类型

将函数折叠到语法树的直接子树上。这与从左到右的顺序类似fold/3,但仅在直接子树上Tree; 它不包含根节点Tree

另见: fold/3

foldl_listlist(F::Function, Start::term(), Ls::[[term()]]) -> term()

类型

就像lists:foldl/3但在一张清单上。

另见: lists:foldl/3fold/3

function_name_expansions(Names::[Name]) -> [{ShortName, Name}]

类型

创建从相应短名称到全功能名称的映射。名称由原子和整数的嵌套元组表示(参见analyze_function_name/1)。结果是一个包含给定列表中{ShortName, Name}每个元素的Name对的列表,其中相应的ShortName是最右边的内部部分Name。该列表因此表示从非限定名称到相应限定名称的有限映射。

注意:结果列表可以包含多个元组。{ShortName, Name}为了同样的ShortName,可能具有不同的值Name,取决于给定的列表。

另见: analyze_function_name/1

is_fail_expr(Tree::syntaxTree()) -> boolean()

返回trueif Tree表示永不终止正常的表达式。请注意,反向不适用。目前,检测到的情况是调用exit/1throw/1erlang:error/1erlang:error/2

另请参阅: erlang:error/1erlang:error/2erlang:exit/1erlang:throw/1

limit(Tree, Depth) ->syntaxTree()

相当于limit(Tree, Depth, Text)使用文本"..."作为默认替换。

另见: limit/3erl_syntax:text/1

limit(Tree::syntaxTree(), Depth::integer(), Node::syntaxTree()) ->syntaxTree()

将语法树限制在指定的深度。中的所有非叶子树。Tree在给定的Depth通过Node.如果Depth是负的,结果总是Node即使Tree没有子树。

当一组子树(例如,application节点的参数列表)处于指定深度,并且组中有两个或更多子树时,Node即使它们是叶节点,这些子树也将被集体替换。超过指定深度的子树的大小将受到限制,就好像组中的每个后续树都比先前的树深一级。例如,如果Tree代表一个整数列表“ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]”,结果limit(Tree, 5)将代表[1, 2, 3, 4, ...]

生成的语法树通常只对漂亮的打印或类似的视觉格式有用。

另见: limit/2

map(F::Function, Tree::syntaxTree()) ->syntaxTree()

类型

将函数应用于语法树的每个节点。每个应用程序的结果替换相应的原始节点。遍历的顺序是自下而上的.

另见: map_subtrees/2

map_subtrees(F::Function, Tree::syntaxTree()) ->syntaxTree()

类型

将函数应用于语法树的每个直接子树。每个应用程序的结果替换相应的原始节点。

另见: map/2

mapfold(F::Function, Start::term(), Tree::syntaxTree()) -> {syntaxTree(), term()}

类型

将地图和折叠合并在一个操作中。这类似于map/2的每个应用程序都会传播一个额外的值。Function在执行树的后续遍历时,如下所示fold/3.价值Start传递给第一个函数应用程序,最后的结果是最后一个应用程序的结果。

另见: fold/3map/2

mapfold_subtrees(F::Function, Start::term(), Tree::syntaxTree()) -> {syntaxTree(), term()}

类型

对语法树的直接子树执行mapfold操作。这与从左到右的顺序类似mapfold/3,但仅在直接子树上Tree; 它不包含根节点Tree

另见: mapfold/3

mapfoldl_listlist(F::Function, S::State, Ls::[[term()]]) -> {[[term()]], term()}

类型

就像lists:mapfoldl/3但在一张清单上。结果中的列表与给定的列表具有相同的结构。

new_variable_name(Used::set(atom())) -> atom()

Returns an atom which is not already in the set Used. This is equivalent to new_variable_name(Function, Used), where Function maps a given integer N to the atom whose name consists of "V" followed by the numeral for N.

另见: new_variable_name/2

new_variable_name(F::Function, Used::set(atom())) -> atom()

类型

返回未在集合中的名为ATOM的用户。Used原子是通过应用给定的Function生成的整数。整数是使用一种算法生成的,该算法试图将名称随机分布在相对于集合中元素数的合理小范围内。

此函数使用以下模块rand生成新的密钥。它使用的种子可以通过调用rand:seed/1rand:seed/2在首次调用此函数之前。

另请参阅: random(3)sets(3)new_variable_name/1

new_variable_names(N::integer(), Used::set(atom())) -> [atom()]

就像new_variable_name/1,但是生成一个N新名字。

另见: new_variable_name/1

new_variable_names(N::integer(), F::Function, Used::set(atom())) -> [atom()]

类型

就像new_variable_name/2,但是生成一个N新名字。

另见: new_variable_name/2

strip_comments(Tree::syntaxTree()) ->syntaxTree()

删除语法树中所有节点的所有注释。所有其他属性(如位置信息)保持不变。表单列表中的独立评论被删除; 其他任何独立评论都会更改为空评论(无文本,无缩进)。

to_comment(Tree) ->syntaxTree()

相当于to_comment(Tree, "% ")

to_comment(Tree::syntaxTree(), Prefix::string()) ->syntaxTree()

相当于to_comment(Tree, Prefix, F)默认的格式化功能F。默认F只是调用erl_prettypr:format/1

另见: to_comment/3erl_prettypr:format/1

to_comment(Tree::syntaxTree(), Prefix::string(), F::Printer) ->syntaxTree()

类型

将语法树转换为抽象注释。注释的行包含Node由给定Printer函数生成的文本。注释的每一行都以字符串为前缀Prefix(这不包括%注释行的初始“ ”字符)。

例如,to_comment(erl_syntax:abstract([a,b,c]))代表

%% [a,b,c]

(比较to_comment/1)。

注意:格式化函数返回的文本将在每一行中断时自动拆分为单独的注释行。不需要额外的工作。

另见: to_comment/1to_comment/2

variables(Tree::syntaxTree()) ->set(atom())

返回语法树中出现的变量名,结果是一组由原子表示的变量名。宏名称不包括在内。

另见: sets(3)

richard@gmail.com

Erlang 20

Erlang 是一种通用的面向并发的编程语言,可应付大规模开发活动的程序设计语言和运行环境。

主页 https://www.erlang.org/
源码 https://github.com/erlang/otp
版本 20
发布版本 20.1