Rustコンパイラの処理の流れ(2)

input

pub fn parse(
sess: &ParseSess,
tts: TokenStream,
ms: &[TokenTree],
directory: Option<Directory>,
recurse_into_modules: bool,
) -> NamedParseResult {
  • sess はパースに必要ないくつかのメタデータを保持している。発生したエラー情報をユーザに返すのが主な用途である。
  • tts はパース対象の入力である。マクロ用のパーサはトークンのストリーム(※1)から msとマッチしたメタ変数(※2)の束縛を得る。
  • ms は Tokenと区切り文字から構成されており、tss とマッチさせるためのパターンとして使用されている。
  • directory はファイルの位置に関する情報である。
  • recurse_into_modules は再帰呼び出しするかどうかを示す。

output

  • Sucess: tssms とマッチしたことを示す。つまり、トークンと一致したメタ変数の束縛を生成できたということである。
  • Failure: tssms とマッチしないことを示す。 "No rule expected token blah"のようなエラーが発生する。
  • Error: パーサ内でなんらかの致命的なエラーが発生したことを示す。マクロの定義が曖昧で、マッチしたものが複数ある場合などに発生する。
Start parsing a a a a b against [· a $( a )* a b].Remaining input: a a a a b
next: [· a $( a )* a b]
- - - Advance over an a. - - -Remaining input: a a a b
cur: [a · $( a )* a b]
Descend/Skip (first item).
next: [a $( · a )* a b] [a $( a )* · a b].
- - - Advance over an a. - - -Remaining input: a a b
cur: [a $( a · )* a b] [a $( a )* a · b]
Follow epsilon transition: Finish/Repeat (first item)
next: [a $( a )* · a b] [a $( · a )* a b] [a $( a )* a · b]
- - - Advance over an a. - - - (this looks exactly like the last step)Remaining input: a b
cur: [a $( a · )* a b] [a $( a )* a · b]
Follow epsilon transition: Finish/Repeat (first item)
next: [a $( a )* · a b] [a $( · a )* a b] [a $( a )* a · b]
- - - Advance over an a. - - - (this looks exactly like the last step)Remaining input: b
cur: [a $( a · )* a b] [a $( a )* a · b]
Follow epsilon transition: Finish/Repeat (first item)
next: [a $( a )* · a b] [a $( · a )* a b] [a $( a )* a · b]
- - - Advance over a b. - - -Remaining input: ''
eof: [a $( a )* a b ·]

注釈

macro_rules! vec {
( $( $x:expr ),* ) => {
{
let mut temp_vec = Vec::new();
$(
temp_vec.push($x);
)*
temp_vec
}
};
}

参考

--

--

--

Software engineer

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Takanori Ishibashi

Takanori Ishibashi

Software engineer

More from Medium

Custom Allocators in Rust

disassembly

The ultimate guide to ENARX

Rust 002 — Variables, Functions, Conditionals, Loops

Testing in Rust