gpt4 book ai didi

parsing - 我如何自己使用 Rust 解析器 (libsyntax)?

转载 作者:行者123 更新时间:2023-11-29 07:46:24 24 4
gpt4 key购买 nike

我想使用 Rust 解析器 (libsyntax) 来解析 Rust 文件并从中提取函数名称等信息。我开始研究文档和代码,所以我的第一个目标是一个程序,它在 .rs 文件中打印独立函数的所有函数名称。

程序应该在打印函数名称之前展开所有宏,因此不会遗漏通过宏声明的函数。这就是为什么我不能自己编写一些蹩脚的小解析器来完成这项工作。

我不得不承认我还不是很擅长 Rust 编程,所以我提前为这个问题中的任何愚蠢陈述道歉。

我是如何理解的,我需要执行以下步骤:

  1. 通过 Parser struct 解析文件
  2. 使用 MacroExpander 扩展宏
  3. ???
  4. 使用 Visitor遍历 AST 并提取我需要的信息(例如通过 visit_fn )

所以这是我的问题:

  1. 如何使用 MacroExpander
  2. 如何使用自定义访问者遍历扩展的 AST?

我想到了使用 custom lint check而不是完全成熟的解析器。我正在研究这个选项。

如果重要的话,我正在使用 rustc 0.13.0-nightly (f168c12c5 2014-10-25 20:57:10 +0000)

最佳答案

您可以使用 syntex解析 Rust,因此您不需要使用不稳定的 Rust。

这是一个简单的例子:

// Tested against syntex_syntax v0.33
extern crate syntex_syntax as syntax;

use std::rc::Rc;
use syntax::codemap::{CodeMap};
use syntax::errors::{Handler};
use syntax::errors::emitter::{ColorConfig};
use syntax::parse::{self, ParseSess};

fn main() {
let codemap = Rc::new(CodeMap::new());
let tty_handler =
Handler::with_tty_emitter(ColorConfig::Auto, None, true, false, codemap.clone());
let parse_session = ParseSess::with_span_handler(tty_handler, codemap.clone());

let src = "fn foo(x: i64) { let y = x + 1; return y; }".to_owned();

let result = parse::parse_crate_from_source_str(String::new(), src, Vec::new(), &parse_session);
println!("parse result: {:?}", result);
}

这会打印整个 AST:

parse result: Ok(Crate { module: Mod { inner: Span { lo: BytePos(0), hi: BytePos(43), expn_id: ExpnId(4294967295) },
items: [Item { ident: foo#0, attrs: [], id: 4294967295, node: Fn(FnDecl { inputs: [Arg { ty: type(i64), pat:
pat(4294967295: x), id: 4294967295 }], output: Default(Span { lo: BytePos(15), hi: BytePos(15), expn_id: ExpnId(4294967295) }),
variadic: false }, Normal, NotConst, Rust, Generics { lifetimes: [], ty_params: [], where_clause: WhereClause { id:
4294967295, predicates: [] } }, Block { stmts: [stmt(4294967295: let y = x + 1;), stmt(4294967295: return y;)], expr:
None, id: 4294967295, rules: Default, span: Span { lo: BytePos(15), hi: BytePos(43), expn_id: ExpnId(4294967295) } }),
vis: Inherited, span: Span { lo: BytePos(0), hi: BytePos(43), expn_id: ExpnId(4294967295) } }] }, attrs: [], config: [],
span: Span { lo: BytePos(0), hi: BytePos(42), expn_id: ExpnId(4294967295) }, exported_macros: [] })

关于parsing - 我如何自己使用 Rust 解析器 (libsyntax)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26575443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com