查看源代码 erl_scan (stdlib v6.2)
Erlang 词法分析器。
此模块包含将字符标记(扫描)为 Erlang 令牌的函数。
错误信息
ErrorInfo
是所有 I/O 模块返回的标准 ErrorInfo
结构。格式如下:
{ErrorLocation, Module, ErrorDescriptor}
使用以下调用获取描述错误的字符串:
Module:format_error(ErrorDescriptor)
注意
对可重入输入函数的第一次调用的延续必须是 []
。有关可重入输入方案如何工作的完整描述,请参阅 Armstrong、Virding 和 Williams 的“Erlang 并发编程”第 13 章。
另请参阅
摘要
函数
返回 Token
的类别。
返回 Token
注释集合的列。
返回 Token
注释集合的文本的结束位置。如果没有文本,则返回 undefined
。
使用 ErrorDescriptor
并返回描述错误或警告的字符串。当处理 ErrorInfo
结构时,通常会隐式调用此函数(请参阅 错误信息 部分)。
返回 Token
注释集合的行。
返回 Token
注释集合的位置。
如果 Atom
是 Erlang 保留字,则返回 true
,否则返回 false
。
接收字符列表 String
并尝试扫描(标记化)它们。
返回 Token
的符号。
返回 Token
注释集合的文本。如果没有文本,则返回 undefined
。
这是可重入扫描器,它扫描字符,直到到达点('.' 后跟一个空格)或 eof
。
类型
-type category() :: atom().
-type char_spec() :: string() | eof.
-type error_description() :: term().
-type error_info() :: {erl_anno:location(), module(), error_description()}.
-type option() :: return | return_white_spaces | return_comments | text | {reserved_word_fun, resword_fun()} | {text_fun, text_fun()} | {compiler_internal, [term()]}.
-opaque return_cont()
-type token() :: {category(), Anno :: erl_anno:anno(), symbol()} | {category(), Anno :: erl_anno:anno()}.
-type tokens() :: [token()].
-type tokens_result() :: {ok, Tokens :: tokens(), EndLocation :: erl_anno:location()} | {eof, EndLocation :: erl_anno:location()} | {error, ErrorInfo :: error_info(), EndLocation :: erl_anno:location()}.
函数
返回 Token
的类别。
-spec column(Token) -> erl_anno:column() | undefined when Token :: token().
返回 Token
注释集合的列。
-spec end_location(Token) -> erl_anno:location() | undefined when Token :: token().
返回 Token
注释集合的文本的结束位置。如果没有文本,则返回 undefined
。
-spec format_error(ErrorDescriptor) -> string() when ErrorDescriptor :: error_description().
使用 ErrorDescriptor
并返回描述错误或警告的字符串。当处理 ErrorInfo
结构时,通常会隐式调用此函数(请参阅 错误信息 部分)。
-spec line(Token) -> erl_anno:line() when Token :: token().
返回 Token
注释集合的行。
-spec location(Token) -> erl_anno:location() when Token :: token().
返回 Token
注释集合的位置。
如果 Atom
是 Erlang 保留字,则返回 true
,否则返回 false
。
-spec string(String) -> Return when String :: string(), Return :: {ok, Tokens :: tokens(), EndLocation} | {error, ErrorInfo :: error_info(), ErrorLocation}, EndLocation :: erl_anno:location(), ErrorLocation :: erl_anno:location().
等效于 string(String, 1)
。
-spec string(String, StartLocation) -> Return when String :: string(), Return :: {ok, Tokens :: tokens(), EndLocation} | {error, ErrorInfo :: error_info(), ErrorLocation}, StartLocation :: erl_anno:location(), EndLocation :: erl_anno:location(), ErrorLocation :: erl_anno:location().
-spec string(String, StartLocation, Options) -> Return when String :: string(), Options :: options(), Return :: {ok, Tokens :: tokens(), EndLocation} | {error, ErrorInfo :: error_info(), ErrorLocation}, StartLocation :: erl_anno:location(), EndLocation :: erl_anno:location(), ErrorLocation :: erl_anno:location().
接收字符列表 String
并尝试扫描(标记化)它们。
返回以下内容之一:
{ok, Tokens, EndLocation}
-Tokens
是来自String
的 Erlang 令牌。EndLocation
是最后一个令牌之后的第一个位置。{error, ErrorInfo, ErrorLocation}
- 发生错误。ErrorLocation
是错误令牌之后的第一个位置。
StartLocation
指示扫描开始时的初始位置。如果 StartLocation
是一行,则 Anno
、EndLocation
和 ErrorLocation
都是行。如果 StartLocation
是一行和一列的组合,则 Anno
采用不透明复合数据类型的形式,并且 EndLocation
和 ErrorLocation
都是行和列的组合。令牌注释包含有关令牌开始的列和行的信息,以及令牌的文本(如果指定了选项 text
),所有这些都可以通过调用 column/1
、line/1
、location/1
和 text/1
来访问。
令牌是一个元组,其中包含有关语法类别、令牌注释和终端符号的信息。对于标点符号字符(例如 ;
和 |
)和保留字,类别和符号一致,并且令牌由二元组表示。三元组具有以下形式之一:
{atom, Anno, atom()}
{char, Anno, char()}
{comment, Anno, string()}
{float, Anno, float()}
{integer, Anno, integer()}
{var, Anno, atom()}
{white_space, Anno, string()}
有效选项
{reserved_word_fun, reserved_word_fun()}
- 当扫描器找到未加引号的原子时调用的回调函数。如果该函数返回true
,则未加引号的原子本身将成为令牌的类别。如果该函数返回false
,则atom
将成为未加引号的原子的类别。return_comments
- 返回注释令牌。return_white_spaces
- 返回空白令牌。按照惯例,如果存在换行符,则它始终是文本的第一个字符(空白令牌中不能有多个换行符)。return
-[return_comments, return_white_spaces]
的简写形式。text
- 在令牌注释中包含令牌文本。文本是与令牌对应的输入部分。另请参阅text_fun
。{text_fun, text_fun()}
- 用于确定是否应将令牌的完整文本包含在令牌注释中的回调函数。该函数的参数是令牌的类别和完整令牌字符串。这仅在没有text
时使用。如果两者都不存在,则文本将不会保存在令牌注释中。{compiler_internal, term()}
- 将编译器内部选项传递给扫描器。扫描器理解的内部选项集应视为实验性的,因此可以随时更改,恕不另行通知。当前理解以下选项:
ssa_checks
- 标记用于对编译器生成的 BEAM SSA 代码进行编码测试的源代码注释。
返回 Token
的符号。
-spec text(Token) -> erl_anno:text() | undefined when Token :: token().
返回 Token
注释集合的文本。如果没有文本,则返回 undefined
。
-spec tokens(Continuation, CharSpec, StartLocation) -> Return when Continuation :: return_cont() | [], CharSpec :: char_spec(), StartLocation :: erl_anno:location(), Return :: {done, Result :: tokens_result(), LeftOverChars :: char_spec()} | {more, Continuation1 :: return_cont()}.
-spec tokens(Continuation, CharSpec, StartLocation, Options) -> Return when Continuation :: return_cont() | [], CharSpec :: char_spec(), StartLocation :: erl_anno:location(), Options :: options(), Return :: {done, Result :: tokens_result(), LeftOverChars :: char_spec()} | {more, Continuation1 :: return_cont()}.
这是可重入扫描器,它扫描字符,直到到达点('.' 后跟一个空格)或 eof
。
它返回:
{done, Result, LeftOverChars}
- 表示有足够的输入数据来获得结果。Result
是:{ok, Tokens, EndLocation}
- 扫描成功。Tokens
是包括点的令牌列表。{eof, EndLocation}
- 在任何更多令牌之前遇到文件结尾。{error, ErrorInfo, EndLocation}
- 发生错误。LeftOverChars
是输入数据的剩余字符,从EndLocation
开始。
{more, Continuation1}
- 需要更多数据来构建一个项。当有更多数据可用时,必须在对tokens/3,4
的新调用中传递Continuation1
。
CharSpec
eof
信号表示文件结束。LeftOverChars
随后也将取值 eof
。
有关选项的描述,请参阅 string/3
。