查看源码 erl_parse (stdlib v6.2)
此模块是基本的 Erlang 解析器,它将标记转换为形式(即,顶层结构)、表达式或项的抽象形式。
抽象格式在 ERTS 用户指南中描述。 请注意,标记列表必须以点标记结尾才能被解析函数接受(请参阅 erl_scan
)模块。
错误信息
ErrorInfo 是所有 I/O 模块返回的标准 ErrorInfo 结构。格式如下:
{ErrorLine, Module, ErrorDescriptor}
使用以下调用获取描述错误的字符串
Module:format_error(ErrorDescriptor)
另请参阅
摘要
类型
Erlang 子句的抽象形式。
Erlang 表达式的抽象形式。
Erlang 形式的抽象形式。
Erlang 类型的抽象形式。
位串元素的抽象表示。
记录字段的抽象表示。
生成器或位串生成器的抽象表示。
远程函数调用的抽象表示。
元组 {error, error_info()}
和 {warning, error_info()}
,表示语法不正确的形式和警告,以及 {eof, line()}
,表示在解析完完整形式之前遇到流末尾。
函数
将 Erlang 数据结构 Data
转换为类型为 AbsTerm
的抽象形式。 此函数是 normalise/1
的逆函数。
将 Erlang 数据结构 Data
转换为类型为 AbsTerm
的抽象形式。
假设 Term
是一个与 erl_parse
树具有相同结构的项,但是当 erl_parse
树具有注释集合时,该项具有术语(例如 T
)。
返回一个项,其中 erl_parse
树 Abstr
的节点的每个注释集合 Anno
都被 erl_anno:to_term(Anno)
返回的项替换。 erl_parse
树以深度优先、从左到右的方式遍历。
通过对 erl_parse
树 Abstr
的每个注释集合应用 Fun
来更新累加器。
使用 ErrorDescriptor 并返回描述错误的字符串。
通过对 erl_parse
树的节点的每个注释集合应用 Fun
来修改 erl_parse
树 Abstr
。erl_parse
树以深度优先、从左到右的方式遍历。
通过对 erl_parse
树的节点的每个注释集合应用 Fun
来修改 erl_parse
树 Abstr
,同时更新累加器。
假设 Term
是一个与 erl_parse
树具有相同结构的项,但是当 erl_parse
树具有注释集合时,该项具有 位置。
将项的抽象形式 AbsTerm
转换为传统的 Erlang 数据结构(即,该项本身)。 此函数是 abstract/1
的逆函数。
将 Tokens
解析为好像它是一个表达式列表。
将 Tokens
解析为好像它是一个形式。
将 Tokens
解析为好像它是一个项。
生成表示表达式抽象形式 AbsTerm
的标记列表。 (可选)附加 MoreTokens
。
类型
-type abstract_clause() :: af_clause().
Erlang 子句的抽象形式。
-type abstract_expr() :: af_literal() | af_match(abstract_expr()) | af_maybe_match() | af_variable() | af_tuple(abstract_expr()) | af_nil() | af_cons(abstract_expr()) | af_bin(abstract_expr()) | af_binary_op(abstract_expr()) | af_unary_op(abstract_expr()) | af_record_creation(abstract_expr()) | af_record_update(abstract_expr()) | af_record_index() | af_record_field_access(abstract_expr()) | af_map_creation(abstract_expr()) | af_map_update(abstract_expr()) | af_catch() | af_local_call() | af_remote_call() | af_list_comprehension() | af_map_comprehension() | af_binary_comprehension() | af_block() | af_if() | af_case() | af_try() | af_receive() | af_local_fun() | af_remote_fun() | af_fun() | af_named_fun() | af_maybe() | af_maybe_else().
Erlang 表达式的抽象形式。
-type abstract_form() :: af_module() | af_behavior() | af_behaviour() | af_export() | af_import() | af_export_type() | af_compile() | af_file() | af_record_decl() | af_type_decl() | af_function_spec() | af_wild_attribute() | af_function_decl().
Erlang 形式的抽象形式。
-type abstract_type() :: af_annotated_type() | af_atom() | af_bitstring_type() | af_empty_list_type() | af_fun_type() | af_integer_range_type() | af_map_type() | af_predefined_type() | af_record_type() | af_remote_type() | af_singleton_integer_type() | af_tuple_type() | af_type_union() | af_type_variable() | af_user_defined_type().
Erlang 类型的抽象形式。
-type af_anno() :: af_variable().
-type af_annotated_type() :: {ann_type, anno(), [af_anno() | abstract_type()]}.
-type af_args() :: [abstract_expr()].
-type af_assoc(T) :: {map_field_assoc, anno(), T, T} | af_assoc_exact(T).
-type af_assoc_exact(T) :: {map_field_exact, anno(), T, T}.
-type af_assoc_type() :: {type, anno(), map_field_assoc, [abstract_type()]} | {type, anno(), map_field_exact, [abstract_type()]}.
-type af_atom() :: af_lit_atom(atom()).
-type af_bin(T) :: {bin, anno(), [af_binelement(T)]}.
-type af_binary_comprehension() :: {bc, anno(), af_template(), af_qualifier_seq()}.
-type af_binelement(T) :: {bin_element, anno(), T, af_binelement_size(), type_specifier_list()}.
位串元素的抽象表示。
-type af_binelement_size() :: default | abstract_expr().
-type af_bitstring_type() :: {type, anno(), binary, [af_singleton_integer_type()]}.
-type af_body() :: [abstract_expr(), ...].
-type af_case() :: {'case', anno(), abstract_expr(), af_clause_seq()}.
-type af_catch() :: {'catch', anno(), abstract_expr()}.
-type af_clause() :: {clause, anno(), [af_pattern()], af_guard_seq(), af_body()}.
-type af_clause_seq() :: [af_clause(), ...].
-type af_cons(T) :: {cons, anno(), T, T}.
-type af_constrained_function_type() :: {type, anno(), bounded_fun, [af_function_type() | af_function_constraint()]}.
-type af_constraint() :: {type, anno(), constraint, [af_lit_atom(is_subtype) | [af_type_variable() | abstract_type()]]}.
-type af_empty_list_type() :: {type, anno(), nil, []}.
-type af_export() :: {attribute, anno(), export, af_fa_list()}.
-type af_export_type() :: {attribute, anno(), export_type, af_ta_list()}.
-type af_fa_list() :: [{function_name(), arity()}].
-type af_field() :: {record_field, anno(), af_field_name()} | {record_field, anno(), af_field_name(), abstract_expr()}.
-type af_field_decl() :: af_typed_field() | af_field().
记录字段的抽象表示。
-type af_field_name() :: af_atom().
-type af_filter() :: abstract_expr().
-type af_fun() :: {'fun', anno(), {clauses, af_clause_seq()}}.
-type af_fun_type() :: {type, anno(), 'fun', []} | {type, anno(), 'fun', [{type, anno(), any} | abstract_type()]} | af_function_type().
-type af_function_constraint() :: [af_constraint(), ...].
-type af_function_decl() :: {function, anno(), function_name(), arity(), af_clause_seq()}.
-type af_function_spec() :: {attribute, anno(), spec_attr(), {{function_name(), arity()}, af_function_type_list()}} | {attribute, anno(), spec, {{module(), function_name(), arity()}, af_function_type_list()}}.
-type af_function_type() :: {type, anno(), 'fun', [{type, anno(), product, [abstract_type()]} | abstract_type()]}.
-type af_function_type_list() :: [af_constrained_function_type() | af_function_type(), ...].
-type af_generator() :: {generate, anno(), af_pattern(), abstract_expr()} | {m_generate, anno(), af_assoc_exact(af_pattern()), abstract_expr()} | {b_generate, anno(), af_pattern(), abstract_expr()}.
生成器或位串生成器的抽象表示。
-type af_guard() :: [af_guard_test(), ...].
-type af_guard_call() :: {call, anno(), af_atom(), [af_guard_test()]}.
-type af_guard_seq() :: [af_guard()].
-type af_guard_test() :: af_literal() | af_variable() | af_tuple(af_guard_test()) | af_nil() | af_cons(af_guard_test()) | af_bin(af_guard_test()) | af_binary_op(af_guard_test()) | af_unary_op(af_guard_test()) | af_record_creation(af_guard_test()) | af_record_index() | af_record_field_access(af_guard_test()) | af_map_creation(af_guard_test()) | af_map_update(af_guard_test()) | af_guard_call() | af_remote_guard_call().
-type af_if() :: {'if', anno(), af_clause_seq()}.
-type af_import() :: {attribute, anno(), import, {module(), af_fa_list()}}.
-type af_integer() :: {integer, anno(), non_neg_integer()}.
-type af_integer_range_type() :: {type, anno(), range, [af_singleton_integer_type()]}.
-type af_list_comprehension() :: {lc, anno(), af_template(), af_qualifier_seq()}.
-type af_lit_atom(A) :: {atom, anno(), A}.
-type af_literal() :: af_atom() | af_character() | af_float() | af_integer() | af_string().
-type af_local_call() :: {call, anno(), af_local_function(), af_args()}.
-type af_local_fun() :: {'fun', anno(), {function, function_name(), arity()}}.
-type af_local_function() :: abstract_expr().
-type af_map_comprehension() :: {mc, anno(), af_assoc(abstract_expr()), af_qualifier_seq()}.
-type af_map_pattern() :: {map, anno(), [af_assoc_exact(af_pattern())]}.
-type af_map_type() :: {type, anno(), map, any} | {type, anno(), map, [af_assoc_type()]}.
-type af_match(T) :: {match, anno(), af_pattern(), T}.
-type af_maybe_else() :: {'maybe', anno(), af_body(), {'else', anno(), af_clause_seq()}}.
-type af_maybe_match() :: {maybe_match, anno(), af_pattern(), abstract_expr()}.
-type af_named_fun() :: {named_fun, anno(), fun_name(), af_clause_seq()}.
-type af_nil() :: {nil, anno()}.
-type af_pattern() :: af_literal() | af_match(af_pattern()) | af_variable() | af_tuple(af_pattern()) | af_nil() | af_cons(af_pattern()) | af_bin(af_pattern()) | af_binary_op(af_pattern()) | af_unary_op(af_pattern()) | af_record_creation(af_pattern()) | af_record_index() | af_map_pattern().
-type af_predefined_type() :: {type, anno(), type_name(), [abstract_type()]}.
-type af_qualifier() :: af_generator() | af_filter().
-type af_qualifier_seq() :: [af_qualifier(), ...].
-type af_receive() :: {'receive', anno(), af_clause_seq()} | {'receive', anno(), af_clause_seq(), abstract_expr(), af_body()}.
-type af_record_creation(T) :: {record, anno(), record_name(), [af_record_field(T)]}.
-type af_record_decl() :: {attribute, anno(), record, {record_name(), [af_field_decl()]}}.
-type af_record_field(T) :: {record_field, anno(), af_field_name(), T}.
-type af_record_field_access(T) :: {record_field, anno(), T, record_name(), af_field_name()}.
-type af_record_field_type() :: {type, anno(), field_type, [(Name :: af_atom()) | abstract_type()]}.
-type af_record_index() :: {record_index, anno(), record_name(), af_field_name()}.
-type af_record_type() :: {type, anno(), record, [(Name :: af_atom()) | af_record_field_type()]}.
-type af_record_update(T) :: {record, anno(), abstract_expr(), record_name(), [af_record_field(T)]}.
-type af_remote_call() :: {call, anno(), af_remote_function(), af_args()}.
-type af_remote_fun() :: {'fun', anno(), {function, module(), function_name(), arity()}} | {'fun', anno(), {function, af_atom() | af_variable(), af_atom() | af_variable(), af_integer() | af_variable()}}.
-type af_remote_function() :: {remote, anno(), abstract_expr(), abstract_expr()}.
远程函数调用的抽象表示。
-type af_remote_guard_call() :: {call, anno(), {remote, anno(), af_lit_atom(erlang), af_atom()}, [af_guard_test()]}.
-type af_remote_type() :: {remote_type, anno(), [(Module :: af_atom()) | (TypeName :: af_atom()) | [abstract_type()]]}.
-type af_singleton_integer_type() :: af_integer() | af_character() | af_unary_op(af_singleton_integer_type()) | af_binary_op(af_singleton_integer_type()).
-type af_template() :: abstract_expr().
-type af_try() :: {'try', anno(), af_body(), af_clause_seq() | [], af_clause_seq() | [], af_body() | []}.
-type af_tuple(T) :: {tuple, anno(), [T]}.
-type af_tuple_type() :: {type, anno(), tuple, any} | {type, anno(), tuple, [abstract_type()]}.
-type af_type_decl() :: {attribute, anno(), type_attr(), {type_name(), abstract_type(), [af_variable()]}}.
-type af_type_union() :: {type, anno(), union, [abstract_type(), ...]}.
-type af_typed_field() :: {typed_record_field, af_field(), abstract_type()}.
-type af_user_defined_type() :: {user_type, anno(), type_name(), [abstract_type()]}.
-type anno() :: erl_anno:anno().
-type behaviour() :: atom().
-type binary_op() ::
'/' | '*' | 'div' | 'rem' | 'band' | 'and' | '+' | '-' | 'bor' | 'bxor' | 'bsl' | 'bsr' |
'or' | 'xor' | '++' | '--' | '==' | '/=' | '=<' | '<' | '>=' | '>' | '=:=' | '=/=' | '!'.
-type encoding_func() :: fun((non_neg_integer()) -> boolean()).
-type endianness() :: big | little | native.
-type erl_parse_tree() :: abstract_clause() | abstract_expr() | abstract_form() | abstract_type().
-type error_description() :: term().
-type error_info() :: {erl_anno:location(), module(), error_description()}.
-type form_info() :: {eof, erl_anno:location()} | {error, erl_scan:error_info() | error_info()} | {warning, erl_scan:error_info() | error_info()}.
元组 {error, error_info()}
和 {warning, error_info()}
,表示语法不正确的形式和警告,以及 {eof, line()}
,表示在解析完完整形式之前遇到流末尾。
-type fun_name() :: atom().
-type function_name() :: atom().
-type record_name() :: atom().
-type signedness() :: signed | unsigned.
-type spec_attr() :: callback | spec.
-type token() :: erl_scan:token().
-type type() :: integer | float | binary | bytes | bitstring | bits | utf8 | utf16 | utf32.
-type type_attr() :: opaque | type.
-type type_name() :: atom().
-type type_specifier() :: type() | signedness() | endianness() | unit().
-type type_specifier_list() :: default | [type_specifier(), ...].
-type unary_op() :: '+' | '-' | 'bnot' | 'not'.
-type unit() :: {unit, 1..256}.
函数
-spec abstract(Data) -> AbsTerm when Data :: term(), AbsTerm :: abstract_expr().
将 Erlang 数据结构 Data
转换为类型为 AbsTerm
的抽象形式。 此函数是 normalise/1
的逆函数。
erl_parse:abstract(T)
等同于 erl_parse:abstract(T, 0)
。
-spec abstract(Data, Options) -> AbsTerm when Data :: term(), Options :: Location | [Option], Option :: {encoding, Encoding} | {line, Line} | {location, Location}, Encoding :: latin1 | unicode | utf8 | none | encoding_func(), Line :: erl_anno:line(), Location :: erl_anno:location(), AbsTerm :: abstract_expr().
将 Erlang 数据结构 Data
转换为类型为 AbsTerm
的抽象形式。
AbsTerm
的每个节点都分配有一个注解,请参阅 erl_anno
。该注解包含由选项 location
或选项 line
给出的位置。选项 location
覆盖选项 line
。如果既未给定选项 location
也未给定选项 line
,则使用 0
作为位置。
选项 Encoding
用于选择将哪些整数列表视为字符串。默认值是使用函数 epp:default_encoding/0
返回的编码。值 none
表示不将任何整数列表视为字符串。encoding_func()
每次使用列表中的一个整数调用;如果它为每个整数返回 true
,则该列表被视为字符串。
-spec anno_from_term(Term) -> erl_parse_tree() | form_info() when Term :: term().
假设 Term
是一个与 erl_parse
树具有相同结构的项,但是当 erl_parse
树具有注释集合时,该项具有术语(例如 T
)。
返回一个 erl_parse
树,其中每个项 T
都被 erl_anno:from_term(T)
返回的值替换。项 Term
以深度优先、从左到右的方式遍历。
-spec anno_to_term(Abstr) -> term() when Abstr :: erl_parse_tree() | form_info().
返回一个项,其中 erl_parse
树 Abstr
的节点的每个注释集合 Anno
都被 erl_anno:to_term(Anno)
返回的项替换。 erl_parse
树以深度优先、从左到右的方式遍历。
-spec fold_anno(Fun, Acc0, Abstr) -> Acc1 when Fun :: fun((Anno, AccIn) -> AccOut), Anno :: erl_anno:anno(), Acc0 :: term(), Acc1 :: term(), AccIn :: term(), AccOut :: term(), Abstr :: erl_parse_tree() | form_info().
通过对 erl_parse
树 Abstr
的每个注释集合应用 Fun
来更新累加器。
对 Fun
的第一次调用以 AccIn
作为参数,返回的累加器 AccOut
被传递给下一次调用,依此类推。最后累加器的值被返回。erl_parse
树以深度优先、从左到右的方式遍历。
使用 ErrorDescriptor 并返回描述错误的字符串。
当处理 ErrorInfo 结构时(见错误信息部分),通常会隐式调用此函数。
-spec map_anno(Fun, Abstr) -> NewAbstr when Fun :: fun((Anno) -> NewAnno), Anno :: erl_anno:anno(), NewAnno :: erl_anno:anno(), Abstr :: erl_parse_tree() | form_info(), NewAbstr :: erl_parse_tree() | form_info().
通过对 erl_parse
树的节点的每个注释集合应用 Fun
来修改 erl_parse
树 Abstr
。erl_parse
树以深度优先、从左到右的方式遍历。
-spec mapfold_anno(Fun, Acc0, Abstr) -> {NewAbstr, Acc1} when Fun :: fun((Anno, AccIn) -> {NewAnno, AccOut}), Anno :: erl_anno:anno(), NewAnno :: erl_anno:anno(), Acc0 :: term(), Acc1 :: term(), AccIn :: term(), AccOut :: term(), Abstr :: erl_parse_tree() | form_info(), NewAbstr :: erl_parse_tree() | form_info().
通过对 erl_parse
树的节点的每个注释集合应用 Fun
来修改 erl_parse
树 Abstr
,同时更新累加器。
对 Fun
的第一次调用以 AccIn
作为第二个参数,返回的累加器 AccOut
被传递给下一次调用,依此类推。返回修改后的 erl_parse
树和累加器的最终值。erl_parse
树以深度优先、从左到右的方式遍历。
-spec new_anno(Term) -> Abstr when Term :: term(), Abstr :: erl_parse_tree() | form_info().
假设 Term
是一个与 erl_parse
树具有相同结构的项,但是当 erl_parse
树具有注释集合时,该项具有 位置。
返回一个 erl_parse
树,其中每个位置 L
被 erl_anno:new(L)
返回的值替换。术语 Term
以深度优先、从左到右的方式遍历。
-spec normalise(AbsTerm) -> Data when AbsTerm :: abstract_expr(), Data :: term().
将项的抽象形式 AbsTerm
转换为传统的 Erlang 数据结构(即,该项本身)。 此函数是 abstract/1
的逆函数。
-spec parse_exprs(Tokens) -> {ok, ExprList} | {error, ErrorInfo} when Tokens :: [token()], ExprList :: [abstract_expr()], ErrorInfo :: error_info().
将 Tokens
解析为好像它是一个表达式列表。
返回以下其中一项
{ok, ExprList}
- 解析成功。ExprList
是已解析表达式的抽象形式列表。{error, ErrorInfo}
- 发生错误。
-spec parse_form(Tokens) -> {ok, AbsForm} | {error, ErrorInfo} when Tokens :: [token()], AbsForm :: abstract_form(), ErrorInfo :: error_info().
将 Tokens
解析为好像它是一个形式。
返回以下其中一项
{ok, AbsForm}
- 解析成功。AbsForm
是已解析形式的抽象形式。{error, ErrorInfo}
- 发生错误。
-spec parse_term(Tokens) -> {ok, Term} | {error, ErrorInfo} when Tokens :: [token()], Term :: term(), ErrorInfo :: error_info().
将 Tokens
解析为好像它是一个项。
返回以下其中一项
{ok, Term}
- 解析成功。Term
是对应于标记列表的 Erlang 术语。{error, ErrorInfo}
- 发生错误。
-spec tokens(AbsTerm) -> Tokens when AbsTerm :: abstract_expr(), Tokens :: [token()].
等效于 tokens(AbsTerm, [])
。
-spec tokens(AbsTerm, MoreTokens) -> Tokens when AbsTerm :: abstract_expr(), MoreTokens :: [token()], Tokens :: [token()].
生成表示表达式抽象形式 AbsTerm
的标记列表。 (可选)附加 MoreTokens
。