rust的AST.md

1103098607@qq.com

Rust 输出 AST

切换为 nightly 版本

rustup override set nightly

rustc --version

输出 AST

1
2
3
4
5
6
7
8
rustc -Z help

# 简略
rustc +nightly src/main.rs -Z unpretty=ast-tree

# 详细
rustc +nightly src/main.rs -Z unpretty=ast-tree,expanded

Rust AST 分析

Rust AST to Rust code

构建 Rust 程序

syn::ItemFn

1
2
3
4
5
6
pub struct ItemFn {
pub attrs: Vec<Attribute>,
pub vis: Visibility,
pub sig: Signature,
pub block: Box<Block>,
}

ItemFnsyn 库中用于表示 Rust 函数的结构体。它包含了构成一个函数定义的所有主要部分。以下是对 ItemFn 结构体各字段的详细解释:

attrs: Vec<Attribute>

  • attrs 字段包含了函数上的属性(attributes)。在 Rust 中,属性用于给编译器传递额外的信息,比如 #[derive(Debug)] 或者 #[test]。这些属性可以应用于许多种类的项,包括函数、结构体、枚举等。
  • 类型为 Vec<Attribute>,意味着一个函数可以有零个或多个属性。

vis: Visibility

  • vis 字段表示函数的可见性(visibility)。Rust 中的可见性关键字有 pubpub(crate) 等,用于控制项(比如函数、结构体字段等)的访问范围。
  • Visibility 是一个枚举,包含了不同的可见性级别,例如公开(Public)、私有(Inherited)、受限(具体受限的范围,如在模块内可见)等。

sig: Signature

  • sig 字段包含了函数的签名。函数签名定义了函数的名称、参数、返回类型以及其他如是否 async、是否 unsafe 的信息。
  • Signature 是一个结构体,包含了函数名称(ident 字段为 Ident 类型)、输入参数列表(inputs 字段为 Punctuated<FnArg, Comma> 类型)、返回类型(output 字段为 ReturnType 类型)、泛型参数等。

block: Box<Block>

  • block 字段表示函数体,包含了函数的实际代码块。在 Rust 中,函数体由一系列的语句和可能的尾部表达式组成。
  • 类型为 Box<Block>,这里 Block 是一个结构体,表示由花括号 {} 包围的代码块。Box 是 Rust 的一个智能指针类型,用于在堆上分配内存。这里使用 Box 是因为代码块可能包含大量的数据,使用堆分配可以避免栈溢出,并且可以提高数据结构的整体性能。

Signature

Signature 结构体在 syn 库中代表了 Rust 函数的签名部分。以下是对 Signature 结构体各字段的详细解释:

constness: Option<Const>

  • constness 字段表示函数是否是一个 const 函数。在 Rust 中,const 函数可以在编译时被求值。
  • 类型为 Option<Const>,这意味着该字段可以是 None(表示函数不是 const)或 Some(Const)(表示函数是 const)。

asyncness: Option<Async>

  • asyncness 字段表示函数是否是异步的,即是否使用了 async 关键字。异步函数允许使用 .await 语法进行异步操作。
  • 类型为 Option<Async>,这意味着该字段可以是 None(表示函数不是异步的)或 Some(Async)(表示函数是异步的)。

unsafety: Option<Unsafe>

  • unsafety 字段表示函数是否是 unsafe 的。在 Rust 中,unsafe 函数允许执行一些正常情况下被 Rust 安全保证所禁止的操作,如直接操作裸指针。
  • 类型为 Option<Unsafe>,这意味着该字段可以是 None(表示函数不是 unsafe)或 Some(Unsafe)(表示函数是 unsafe 的)。

abi: Option<Abi>

  • abi 字段表示函数的应用二进制接口(Application Binary Interface,ABI)。ABI 定义了如何在不同的二进制模块或不同的编程语言之间调用函数。
  • 类型为 Option<Abi>,这意味着该字段可以是 None(使用 Rust 默认的 ABI)或 Some(Abi)(使用特定的 ABI,如 "C")。

fn_token: Fn

  • fn_token 字段是 Fn 类型的 token,表示了 fn 关键字的存在。

ident: Ident

  • ident 字段是 Ident 类型,代表函数的名称。

generics: Generics

  • generics 字段表示函数的泛型参数。这包括泛型类型参数、生命周期参数以及它们的约束。
  • 类型为 Generics,它包含了函数泛型参数的详细信息。

paren_token: Paren

  • paren_token 字段是 Paren 类型的 token,表示函数参数列表周围的圆括号。

inputs: Punctuated<FnArg, Comma>

  • inputs 字段表示函数的输入参数列表。
  • 类型为 Punctuated<FnArg, Comma>,这是一个使用逗号作为分隔符的列表,包含了一个或多个 FnArg(函数参数)。

variadic: Option<Variadic>

  • variadic 字段表示函数是否接受可变数量的参数(即 C 风格的可变参数函数)。
  • 类型为 Option<Variadic>,这意味着该字段可以是 None(表示函数不接受可变数量的参数)或 Some(Variadic)(表示函数接受可变数量的参数)。

output: ReturnType

  • output 字段表示函数的返回类型。
  • 类型为 ReturnType,它可以是 ReturnType::Default(对应于没有明确指定返回类型的情况,等同于返回 ())或 ReturnType::Type(包含具体的返回类型)。

Signature 结构体提供了对 Rust 函数签名的全面描述,包括函数的名称、参数、返回类型以及其他与函数行为相关的关键字(如 asyncconstunsafe)。通过操作这些字段,你可以解析、构造或修改函数签名的 AST。

C 转换为 Rust,使用 syn 库进行 Rust 代码构建,将下面 case C转换为Rust中涉及到的变量、函数声明、调用等操作的对应关系完整的解析,给我一个模板让我能按照模板来将 C 程序和 Rust 程序的对应关系呈现出来

prompt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
你是 C Rust 语言领域资深专家,回答我的问题。我在做关于 C 转换为 Rust 的规则整理,其中计划使用 syn 库进行 Rust 代码构建,将下面 case 中 C转换为Rust中涉及到的变量、函数声明、调用等操作的对应关系完整的解析,并给出详细解析

模板
## **函数定义**:
### 返回值类型
- **C**: 使用关键字 `void` 表示没有返回值的函数。
- **Rust**: Rust 中没有返回值的函数隐式返回 `()`,通常省略返回类型。

### ...
- ...
- ...

## **传入参数**:
### 传入参数格式
- **C**: 参数类型直接写在参数名前面。
- **Rust**: 参数类型由冒号隔开,格式为 `param_name: type`

### ...
- ...
- ...

## **循环控制**:
### for 循环写作格式
- **C**: 使用 `for` 循环,初始化变量,条件和增量在括号内定义。
- **Rust**: 使用 `for` 循环遍历一个范围,范围由 `start..end` 表示。

### ...
- ...
- ...

## **常用库**:
### 标准输入输出
- **C**: 使用 `printf` 函数。
- **Rust**: 使用 `println!` 宏。

### ...
- ...
- ...

## **主函数**:
### 主函数返回值规则
- **C**: 主函数 `main` 返回 `int` 类型,表示程序退出状态。
- **Rust**: 主函数 `main` 没有返回值,错误处理通常通过 `Result``panic!` 处理。

### ...
- ...
- ...

## ...


rust的AST.md
https://abrance.github.io/2024/03/07/mdstorage/project/cToRust/rust的AST/
Author
xiaoy
Posted on
March 7, 2024
Licensed under