我正在编写一个需要Rust代码的抽象语法树(AST)或控制流图(CFG)的分析器。如果没有我自己实现解析器,我似乎无法做到这一点。
我注意到一些 crate ,例如syn
和quote
,但是如果不使用过程宏并创建完全不必要的项目结构,它们将无法工作。我发现有一个名为syntex_syntax
的 crate 可以满足我的要求,但是当提供某些具有较新语法的代码时,它不再维护,并且会出现困惑。
是否有任何直接解析Rust代码的方法:从任意外部* .rs文件读取并像syn
一样使用quote
或syntex_syntax
对其进行解析?
最佳答案
syn
是Rust解析器,不仅适用于程序宏。看一看the "functions" section of the documentation。在那里,您将找到以下功能(从syn 0.15开始):
fn parse<T: Parse>(tokens: proc_macro::TokenStream) -> Result<T>
:这是您将在过程宏中使用的代码。 fn parse2<T: Parse>(tokens: proc_macro2::TokenStream) -> Result<T>
:相同,但与TokenStream
crate 中的proc_macro2
相同。 fn parse_str<T: Parse>(s: &str) -> Result<T>
:从一个简单的字符串进行解析。无需TokenStream
。 fn parse_file(content: &str) -> Result<File>
:与parse_str
非常相似,但有一些方便的区别。参见docs for more information。 您可以使用
parse_str
或parse_file
从程序宏外部解析Rust代码。 一些其他注意事项:
您的情况不需要
quote
。此 crate 仅用于轻松创建TokenStream
;它不是解析所必需的。 proc_macro2
! syntex_syntax
确实已被弃用,不应再使用。只是想想它是如何使用的,让我不寒而栗:P