查看源代码 erl_scan (stdlib v6.2)

Erlang 词法分析器。

此模块包含将字符标记(扫描)为 Erlang 令牌的函数。

错误信息

ErrorInfo 是所有 I/O 模块返回的标准 ErrorInfo 结构。格式如下:

{ErrorLocation, Module, ErrorDescriptor}

使用以下调用获取描述错误的字符串:

Module:format_error(ErrorDescriptor)

注意

对可重入输入函数的第一次调用的延续必须是 []。有关可重入输入方案如何工作的完整描述,请参阅 Armstrong、Virding 和 Williams 的“Erlang 并发编程”第 13 章。

另请参阅

erl_anno, erl_parse, io

摘要

函数

返回 Token 的类别。

返回 Token 注释集合的列。

返回 Token 注释集合的文本的结束位置。如果没有文本,则返回 undefined

使用 ErrorDescriptor 并返回描述错误或警告的字符串。当处理 ErrorInfo 结构时,通常会隐式调用此函数(请参阅 错误信息 部分)。

返回 Token 注释集合的行。

返回 Token 注释集合的位置。

如果 Atom 是 Erlang 保留字,则返回 true,否则返回 false

接收字符列表 String 并尝试扫描(标记化)它们。

返回 Token 的符号。

返回 Token 注释集合的文本。如果没有文本,则返回 undefined

这是可重入扫描器,它扫描字符,直到到达('.' 后跟一个空格)或 eof

类型

链接到此类型

category()

查看源代码 (未导出)
-type category() :: atom().
链接到此类型

char_spec()

查看源代码 (未导出)
-type char_spec() :: string() | eof.
链接到此类型

error_description()

查看源代码 (未导出)
-type error_description() :: term().
-type error_info() :: {erl_anno:location(), module(), error_description()}.
链接到此类型

option()

查看源代码 (未导出)
-type option() ::
          return | return_white_spaces | return_comments | text |
          {reserved_word_fun, resword_fun()} |
          {text_fun, text_fun()} |
          {compiler_internal, [term()]}.
-type options() :: option() | [option()].
链接到此类型

resword_fun()

查看源代码 (未导出)
-type resword_fun() :: fun((atom()) -> boolean()).
-opaque return_cont()
链接到此类型

symbol()

查看源代码 (未导出)
-type symbol() :: atom() | float() | integer() | string().
链接到此类型

text_fun()

查看源代码 (未导出)
-type text_fun() :: fun((atom(), string()) -> boolean()).
-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()}.

函数

链接到此函数

category(Token)

查看源代码 (自 OTP 18.0 起)
-spec category(Token) -> category() when Token :: token().

返回 Token 的类别。

链接到此函数

column(Token)

查看源代码 (自 OTP 18.0 起)
-spec column(Token) -> erl_anno:column() | undefined when Token :: token().

返回 Token 注释集合的列。

链接到此函数

end_location(Token)

查看源代码 (自 OTP 18.0 起)
-spec end_location(Token) -> erl_anno:location() | undefined when Token :: token().

返回 Token 注释集合的文本的结束位置。如果没有文本,则返回 undefined

链接到此函数

format_error(ErrorDescriptor)

查看源代码
-spec format_error(ErrorDescriptor) -> string() when ErrorDescriptor :: error_description().

使用 ErrorDescriptor 并返回描述错误或警告的字符串。当处理 ErrorInfo 结构时,通常会隐式调用此函数(请参阅 错误信息 部分)。

链接到此函数

line(Token)

查看源代码 (自 OTP 18.0 起)
-spec line(Token) -> erl_anno:line() when Token :: token().

返回 Token 注释集合的行。

链接到此函数

location(Token)

查看源代码 (自 OTP 18.0 起)
-spec location(Token) -> erl_anno:location() when Token :: token().

返回 Token 注释集合的位置。

-spec reserved_word(Atom :: atom()) -> boolean().

如果 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)

链接到此函数

string(String, StartLocation)

查看源代码
-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().

等效于 string(String, StartLocation, [])

链接到此函数

string(String, StartLocation, Options)

查看源代码
-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 是一行,则 AnnoEndLocationErrorLocation 都是行。如果 StartLocation 是一行和一列的组合,则 Anno 采用不透明复合数据类型的形式,并且 EndLocationErrorLocation 都是行和列的组合。令牌注释包含有关令牌开始的列和行的信息,以及令牌的文本(如果指定了选项 text),所有这些都可以通过调用 column/1line/1location/1text/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 代码进行编码测试的源代码注释。
链接到此函数

symbol(Token)

查看源代码 (自 OTP 18.0 起)
-spec symbol(Token) -> symbol() when Token :: token().

返回 Token 的符号。

链接到此函数

text(Token)

查看源代码 (自 OTP 18.0 起)
-spec text(Token) -> erl_anno:text() | undefined when Token :: token().

返回 Token 注释集合的文本。如果没有文本,则返回 undefined

链接到此函数

tokens(Continuation, CharSpec, StartLocation)

查看源代码
-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()}.

等效于 tokens(Continuation, CharSpec, StartLocation, [])

链接到此函数

tokens(Continuation, CharSpec, StartLocation, Options)

查看源代码
-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