Parsing 如何在不使用过程宏的情况下解析Rust代码?

Parsing 如何在不使用过程宏的情况下解析Rust代码?,parsing,rust,Parsing,Rust,我正在编写一个分析器,它需要一个抽象语法树(AST)或控制流图(CFG)的锈迹代码。如果不自己实现解析器,我似乎不可能做到这一点 我注意到一些板条箱,如syn和quote,但如果不使用过程宏并创建完全不必要的项目结构,它们就无法工作。我发现有一个名为syntex\u syntax的板条箱可以满足我的要求,但是当给出一些语法更新的代码时,它不再被维护,并且会感到恐慌 有没有直接解析Rust代码的方法:从任意外部*.rs文件中读取并使用syn或quote对其进行解析,就像syntex\u synta

我正在编写一个分析器,它需要一个抽象语法树(AST)或控制流图(CFG)的锈迹代码。如果不自己实现解析器,我似乎不可能做到这一点

我注意到一些板条箱,如
syn
quote
,但如果不使用过程宏并创建完全不必要的项目结构,它们就无法工作。我发现有一个名为
syntex\u syntax
的板条箱可以满足我的要求,但是当给出一些语法更新的代码时,它不再被维护,并且会感到恐慌


有没有直接解析Rust代码的方法:从任意外部*.rs文件中读取并使用
syn
quote
对其进行解析,就像
syntex\u syntax
所做的那样?

syn
是一个Rust解析器,它不仅适用于过程宏。看一看。您将在那里找到这些函数(自syn 0.15起):

  • fn parse(tokens:proc_macro::TokenStream)->Result
    :这是您将在过程宏中使用的内容
  • fn parse2(令牌:proc_macro2::TokenStream)->结果
    :相同,但使用
    proc_macro2
    板条箱中的
    TokenStream
  • fn parse_str(s:&str)->结果
    :从简单字符串解析。不需要
    TokenStream
    s
  • fn parse_文件(内容:&str)->结果
    :与
    parse_str
    非常相似,但有一些方便的区别。看
您可以使用
parse_str
parse_file
从过程宏外部解析锈迹代码。

还有几点需要注意:

  • 在您的案例中不需要使用
    报价。此板条箱仅用于轻松创建
    TokenStream
    s;解析时不需要它
  • 如果您只是对解析令牌感兴趣,那么也可以在过程宏之外使用
    proc_macro2
  • syntex\u语法
    确实已被弃用,不应再使用。一想到它是如何使用的,我就不寒而栗:P