檢視原始碼 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
。