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()]
警告是表单中发生的所有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 / 1,analyze_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 / 1,analyze_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 / 1,analyze_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}
,表示子树中的空闲变量。
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
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com