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/1
,analyze_file_attribute/1
,analyze_import_attribute/1
,analyze_module_attribute/1
,analyze_record_attribute/1
,analyze_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/1
,analyze_function/1
,erl_syntax:error_marker_info/1
,erl_syntax:is_form/1
,erl_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()}]
Functions
是Forms
(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}
,表示子树中的空闲变量。
Bindings
和Vars
已排序-设置列表%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/3
,foldl_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/3
,fold/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()
返回true
if Tree
表示永不终止正常的表达式。请注意,反向不适用。目前,检测到的情况是调用exit/1
,throw/1
,erlang:error/1
和erlang:error/2
。
另请参阅:
erlang:error/1
,erlang:error/2
,erlang:exit/1
,erlang:throw/1
。
limit(Tree, Depth) ->syntaxTree()
相当于limit(Tree, Depth, Text)
使用文本"..."
作为默认替换。
另见:
limit/3
,erl_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/3
,map/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/1
或rand: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/3
,erl_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/1
,to_comment/2
。
variables(Tree::syntaxTree()) ->set(atom())
返回语法树中出现的变量名,结果是一组由原子表示的变量名。宏名称不包括在内。
另见:
sets(3)
。
richard@gmail.com