查看 Rust 抽象语法树(Abstract Syntax Tree, AST)是理解 Rust 代码结构和编译过程的重要步骤。
首先,安装 Nightly 工具链:
bash
rustup install nightly
然后可以查看rust文件抽象语法树
powershell
rustc +nightly -Zunpretty=ast-tree file.rs
示例1
rust
fn main() {
println!("Hello, world!");
}
rust
Crate {
attrs: [],
items: [
Item {
attrs: [],
id: NodeId(4294967040),
span: ./src/main.rs:1:1: 3:2 (#0),
vis: Visibility {
kind: Inherited,
span: no-location (#0),
tokens: None,
},
ident: main#0,
kind: Fn(
Fn {
defaultness: Final,
generics: Generics {
params: [],
where_clause: WhereClause {
has_where_token: false,
predicates: [],
span: ./src/main.rs:1:10: 1:10 (#0),
},
span: ./src/main.rs:1:8: 1:8 (#0),
},
sig: FnSig {
header: FnHeader {
safety: Default,
coroutine_kind: None,
constness: No,
ext: None,
},
decl: FnDecl {
inputs: [],
output: Default(
./src/main.rs:1:10: 1:10 (#0),
),
},
span: ./src/main.rs:1:1: 1:10 (#0),
},
contract: None,
body: Some(
Block {
stmts: [
Stmt {
id: NodeId(4294967040),
kind: MacCall(
MacCallStmt {
mac: MacCall {
path: Path {
span: ./src/main.rs:2:5: 2:12 (#0),
segments: [
PathSegment {
ident: println#0,
id: NodeId(4294967040),
args: None,
},
],
tokens: None,
},
args: DelimArgs {
dspan: DelimSpan {
open: ./src/main.rs:2:13: 2:14 (#0),
close: ./src/main.rs:2:29: 2:30 (#0),
},
delim: Parenthesis,
tokens: TokenStream(
[
Token(
Token {
kind: Literal(
Lit {
kind: Str,
symbol: "Hello, world!",
suffix: None,
},
),
span: ./src/main.rs:2:14: 2:29 (#0),
},
JointHidden,
),
],
),
},
},
style: Semicolon,
attrs: [],
tokens: None,
},
),
span: ./src/main.rs:2:5: 2:31 (#0),
},
],
id: NodeId(4294967040),
rules: Default,
span: ./src/main.rs:1:11: 3:2 (#0),
tokens: None,
could_be_bare_literal: false,
},
),
},
),
tokens: None,
},
],
spans: ModSpans {
inner_span: ./src/main.rs:1:1: 3:2 (#0),
inject_use_span: no-location (#0),
},
id: NodeId(4294967040),
is_placeholder: false,
}
示例2
rust
fn main() {
println!("test1");
println!("test2");
}
rust
Crate {
attrs: [],
items: [
Item {
attrs: [],
id: NodeId(4294967040),
span: ./src/main.rs:1:1: 4:2 (#0),
vis: Visibility {
kind: Inherited,
span: no-location (#0),
tokens: None,
},
ident: main#0,
kind: Fn(
Fn {
defaultness: Final,
generics: Generics {
params: [],
where_clause: WhereClause {
has_where_token: false,
predicates: [],
span: ./src/main.rs:1:10: 1:10 (#0),
},
span: ./src/main.rs:1:8: 1:8 (#0),
},
sig: FnSig {
header: FnHeader {
safety: Default,
coroutine_kind: None,
constness: No,
ext: None,
},
decl: FnDecl {
inputs: [],
output: Default(
./src/main.rs:1:10: 1:10 (#0),
),
},
span: ./src/main.rs:1:1: 1:10 (#0),
},
contract: None,
body: Some(
Block {
stmts: [
Stmt {
id: NodeId(4294967040),
kind: MacCall(
MacCallStmt {
mac: MacCall {
path: Path {
span: ./src/main.rs:2:5: 2:12 (#0),
segments: [
PathSegment {
ident: println#0,
id: NodeId(4294967040),
args: None,
},
],
tokens: None,
},
args: DelimArgs {
dspan: DelimSpan {
open: ./src/main.rs:2:13: 2:14 (#0),
close: ./src/main.rs:2:21: 2:22 (#0),
},
delim: Parenthesis,
tokens: TokenStream(
[
Token(
Token {
kind: Literal(
Lit {
kind: Str,
symbol: "test1",
suffix: None,
},
),
span: ./src/main.rs:2:14: 2:21 (#0),
},
JointHidden,
),
],
),
},
},
style: Semicolon,
attrs: [],
tokens: None,
},
),
span: ./src/main.rs:2:5: 2:23 (#0),
},
Stmt {
id: NodeId(4294967040),
kind: MacCall(
MacCallStmt {
mac: MacCall {
path: Path {
span: ./src/main.rs:3:5: 3:12 (#0),
segments: [
PathSegment {
ident: println#0,
id: NodeId(4294967040),
args: None,
},
],
tokens: None,
},
args: DelimArgs {
dspan: DelimSpan {
open: ./src/main.rs:3:13: 3:14 (#0),
close: ./src/main.rs:3:21: 3:22 (#0),
},
delim: Parenthesis,
tokens: TokenStream(
[
Token(
Token {
kind: Literal(
Lit {
kind: Str,
symbol: "test2",
suffix: None,
},
),
span: ./src/main.rs:3:14: 3:21 (#0),
},
JointHidden,
),
],
),
},
},
style: Semicolon,
attrs: [],
tokens: None,
},
),
span: ./src/main.rs:3:5: 3:23 (#0),
},
],
id: NodeId(4294967040),
rules: Default,
span: ./src/main.rs:1:11: 4:2 (#0),
tokens: None,
could_be_bare_literal: false,
},
),
},
),
tokens: None,
},
],
spans: ModSpans {
inner_span: ./src/main.rs:1:1: 4:2 (#0),
inject_use_span: no-location (#0),
},
id: NodeId(4294967040),
is_placeholder: false,
}