查看源代码 epp (stdlib v6.2)
一个 Erlang 代码预处理器。
Erlang 代码预处理器包含 compile
模块使用的函数,用于在解析发生之前预处理宏和包含文件。
Erlang 源文件 编码 由源文件的前两行中的注释选择。第一个匹配正则表达式 coding\s*[:=]\s*([-a-zA-Z0-9])+
的字符串选择编码。如果匹配的字符串不是有效的编码,则将其忽略。有效的编码为 Latin-1
和 UTF-8
,其中字符的大小写可以自由选择。
示例
%% coding: utf-8
%% For this file we have chosen encoding = Latin-1
%% -*- coding: latin-1 -*-
错误信息
ErrorInfo
是所有 I/O 模块返回的标准 ErrorInfo
结构。格式如下
{ErrorLine, Module, ErrorDescriptor}
使用以下调用获取描述错误的字符串
Module:format_error(ErrorDescriptor)
另请参阅
摘要
函数
关闭文件的预处理。
返回 Erlang 源文件的默认编码。
返回编码的字符串表示形式。该字符串可被 read_encoding/1,2
、read_encoding_from_binary/1,2
和 set_encoding/1,2
识别为有效编码。
接受一个 ErrorDescriptor
并返回描述错误或警告的字符串。在处理 ErrorInfo
结构时(请参阅错误信息部分),通常会隐式调用此函数。
打开一个文件进行预处理。
等效于 epp:open([{name, FileName}, {includes, IncludePath}])
。
等效于 epp:open([{name, FileName}, {includes, IncludePath}, {macros, PredefMacros}])
。
从打开的 Erlang 源文件返回下一个 Erlang 形式。在文件末尾返回元组 {eof, Location}
。第一个形式对应于隐式属性 -file(File,1).
,其中 File
是文件名。
预处理并解析 Erlang 源文件。请注意,在文件末尾返回的元组 {eof, Location}
作为“形式”包含在内。
等效于 epp:parse_file(FileName, [{includes, IncludePath}, {macros, PredefMacros}])
。
从文件中读取 编码。返回读取的编码,如果没有找到有效的编码,则返回 none
。
从二进制文件中读取 编码。返回读取的编码,如果没有找到有效的编码,则返回 none
。
从打开的 Erlang 源文件返回下一个 Erlang 形式的原始标记。在文件末尾返回元组 {eof, Line}
。第一个形式对应于隐式属性 -file(File,1).
,其中 File
是文件名。
预处理 Erlang 源文件,返回每个形式的原始标记列表的列表。请注意,在文件末尾返回的元组 {eof, Line}
作为“形式”包含在内,并且任何扫描形式失败都作为元组 {error, ErrorInfo}
包含在列表中。
从 I/O 设备读取 编码,并相应地设置设备的编码。由 File
引用的 I/O 设备的位置不受影响。如果无法从 I/O 设备读取有效编码,则将 I/O 设备的编码设置为默认编码。
类型
-type epp_handle() :: pid().
指向 epp
服务器的句柄。
-type source_encoding() :: latin1 | utf8.
-type warning_info() :: {erl_anno:location(), module(), term()}.
函数
-spec close(Epp) -> ok when Epp :: epp_handle().
关闭文件的预处理。
-spec default_encoding() -> source_encoding().
返回 Erlang 源文件的默认编码。
-spec encoding_to_string(Encoding) -> string() when Encoding :: source_encoding().
返回编码的字符串表示形式。该字符串可被 read_encoding/1,2
、read_encoding_from_binary/1,2
和 set_encoding/1,2
识别为有效编码。
-spec format_error(ErrorDescriptor) -> io_lib:chars() when ErrorDescriptor :: term().
接受一个 ErrorDescriptor
并返回描述错误或警告的字符串。在处理 ErrorInfo
结构时(请参阅错误信息部分),通常会隐式调用此函数。
-spec open(Options) -> {ok, Epp} | {ok, Epp, Extra} | {error, ErrorDescriptor} when Options :: [{default_encoding, DefEncoding :: source_encoding()} | {includes, IncludePath :: [DirectoryName :: file:name()]} | {source_name, SourceName :: file:name()} | {deterministic, Enabled :: boolean()} | {macros, PredefMacros :: macros()} | {name, FileName :: file:name()} | {location, StartLocation :: erl_anno:location()} | {fd, FileDescriptor :: file:io_device()} | extra | {compiler_internal, [term()]}], Epp :: epp_handle(), Extra :: [{encoding, source_encoding() | none}], ErrorDescriptor :: term().
打开一个文件进行预处理。
如果要更改预处理期间插入的隐式 -file() 属性的文件名,可以使用 {source_name, SourceName}
。如果未设置,则默认为打开的文件名。
设置 {deterministic, Enabled}
将额外地将预处理期间插入的隐式 -file() 属性的文件名缩减为仅路径的基本名称。
如果在 Options
中指定了 extra
,则返回值是 {ok, Epp, Extra}
而不是 {ok, Epp}
。
选项 location
将转发到 Erlang 标记扫描器,请参阅 erl_scan:tokens/3,4
。
{compiler_internal,term()}
选项将转发到 Erlang 标记扫描器,请参阅 {compiler_internal,term()}
。
-spec open(FileName, IncludePath) -> {ok, Epp} | {error, ErrorDescriptor} when FileName :: file:name(), IncludePath :: [DirectoryName :: file:name()], Epp :: epp_handle(), ErrorDescriptor :: term().
等效于 epp:open([{name, FileName}, {includes, IncludePath}])
。
-spec open(FileName, IncludePath, PredefMacros) -> {ok, Epp} | {error, ErrorDescriptor} when FileName :: file:name(), IncludePath :: [DirectoryName :: file:name()], PredefMacros :: macros(), Epp :: epp_handle(), ErrorDescriptor :: term().
等效于 epp:open([{name, FileName}, {includes, IncludePath}, {macros, PredefMacros}])
。
-spec parse_erl_form(Epp) -> {ok, AbsForm} | {error, ErrorInfo} | {warning, WarningInfo} | {eof, Location} when Epp :: epp_handle(), AbsForm :: erl_parse:abstract_form(), Location :: erl_anno:location(), ErrorInfo :: erl_scan:error_info() | erl_parse:error_info(), WarningInfo :: warning_info().
从打开的 Erlang 源文件返回下一个 Erlang 形式。在文件末尾返回元组 {eof, Location}
。第一个形式对应于隐式属性 -file(File,1).
,其中 File
是文件名。
-spec parse_file(FileName, Options) -> {ok, [Form]} | {ok, [Form], Extra} | {error, OpenError} when FileName :: file:name(), Options :: [{includes, IncludePath :: [DirectoryName :: file:name()]} | {source_name, SourceName :: file:name()} | {macros, PredefMacros :: macros()} | {default_encoding, DefEncoding :: source_encoding()} | {location, StartLocation :: erl_anno:location()} | {reserved_word_fun, Fun :: fun((atom()) -> boolean())} | {features, [Feature :: atom()]} | extra | {compiler_internal, [term()]}], Form :: erl_parse:abstract_form() | {error, ErrorInfo} | {eof, Location}, Location :: erl_anno:location(), ErrorInfo :: erl_scan:error_info() | erl_parse:error_info(), Extra :: [{encoding, source_encoding() | none}], OpenError :: file:posix() | badarg | system_limit.
预处理并解析 Erlang 源文件。请注意,在文件末尾返回的元组 {eof, Location}
作为“形式”包含在内。
如果要更改预处理期间插入的隐式 -file() 属性的文件名,可以使用 {source_name, SourceName}
。如果未设置,则默认为打开的文件名。
如果在 Options
中指定了 extra
,则返回值是 {ok, [Form], Extra}
而不是 {ok, [Form]}
。
选项 location
将转发到 Erlang 标记扫描器,请参阅 erl_scan:tokens/3,4
。
{compiler_internal,term()}
选项将转发到 Erlang 标记扫描器,请参阅 {compiler_internal,term()}
。
-spec parse_file(FileName, IncludePath, PredefMacros) -> {ok, [Form]} | {error, OpenError} when FileName :: file:name(), IncludePath :: [DirectoryName :: file:name()], Form :: erl_parse:abstract_form() | {error, ErrorInfo} | {eof, Location}, PredefMacros :: macros(), Location :: erl_anno:location(), ErrorInfo :: erl_scan:error_info() | erl_parse:error_info(), OpenError :: file:posix() | badarg | system_limit.
等效于 epp:parse_file(FileName, [{includes, IncludePath}, {macros, PredefMacros}])
。
-spec read_encoding(FileName) -> source_encoding() | none when FileName :: file:name().
等效于 read_encoding/2
。
-spec read_encoding(FileName, Options) -> source_encoding() | none when FileName :: file:name(), Options :: [Option], Option :: {in_comment_only, boolean()}.
从文件中读取 编码。返回读取的编码,如果没有找到有效的编码,则返回 none
。
默认情况下,选项 in_comment_only
为 true
,这对于 Erlang 源文件是正确的。如果设置为 false
,则编码字符串不一定必须出现在注释中。
-spec read_encoding_from_binary(Binary) -> source_encoding() | none when Binary :: binary().
-spec read_encoding_from_binary(Binary, Options) -> source_encoding() | none when Binary :: binary(), Options :: [Option], Option :: {in_comment_only, boolean()}.
从二进制文件中读取 编码。返回读取的编码,如果没有找到有效的编码,则返回 none
。
默认情况下,选项 in_comment_only
为 true
,这对于 Erlang 源文件是正确的。如果设置为 false
,则编码字符串不一定必须出现在注释中。
-spec scan_erl_form(Epp) -> {ok, Tokens} | {error, ErrorInfo} | {warning, WarningInfo} | {eof, Line} when Epp :: epp_handle(), Tokens :: erl_scan:tokens(), Line :: erl_anno:line(), ErrorInfo :: erl_scan:error_info() | erl_parse:error_info(), WarningInfo :: warning_info().
从打开的 Erlang 源文件返回下一个 Erlang 形式的原始标记。在文件末尾返回元组 {eof, Line}
。第一个形式对应于隐式属性 -file(File,1).
,其中 File
是文件名。
-spec scan_file(FileName, Options) -> {ok, [Form], Extra} | {error, OpenError} when FileName :: file:name(), Options :: [{includes, IncludePath :: [DirectoryName :: file:name()]} | {source_name, SourceName :: file:name()} | {macros, PredefMacros :: macros()} | {default_encoding, DefEncoding :: source_encoding()}], Form :: erl_scan:tokens() | {error, ErrorInfo} | {eof, Loc}, Loc :: erl_anno:location(), ErrorInfo :: erl_scan:error_info(), Extra :: [{encoding, source_encoding() | none}], OpenError :: file:posix() | badarg | system_limit.
预处理 Erlang 源文件,返回每个形式的原始标记列表的列表。请注意,在文件末尾返回的元组 {eof, Line}
作为“形式”包含在内,并且任何扫描形式失败都作为元组 {error, ErrorInfo}
包含在列表中。
-spec set_encoding(File) -> source_encoding() | none when File :: io:device().
从 I/O 设备读取 编码,并相应地设置设备的编码。由 File
引用的 I/O 设备的位置不受影响。如果无法从 I/O 设备读取有效编码,则将 I/O 设备的编码设置为默认编码。
返回读取的编码,如果没有找到有效的编码,则返回 none
。
-spec set_encoding(File, Default) -> source_encoding() | none when Default :: source_encoding(), File :: io:device().
从 I/O 设备读取 编码,并相应地设置设备的编码。由 File
引用的 I/O 设备的位置不受影响。如果无法从 I/O 设备读取有效编码,则将 I/O 设备的编码设置为由 Default
指定的 编码。
返回读取的编码,如果没有找到有效的编码,则返回 none
。