erl_syntax_lib

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()]

  • {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