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

我注意到一些 crate ,例如synquote,但是如果不使用过程宏并创建完全不必要的项目结构,它们将无法工作。我发现有一个名为syntex_syntax的 crate 可以满足我的要求,但是当提供某些具有较新语法的代码时,它不再维护,并且会出现困惑。

是否有任何直接解析Rust代码的方法:从任意外部* .rs文件读取并像syn一样使用quotesyntex_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_strparse_file从程序宏外部解析Rust代码。

    一些其他注意事项:

    您的情况不需要
  • quote。此 crate 仅用于轻松创建TokenStream;它不是解析所必需的。
  • 如果您只想解析标记,则也可以在过程宏之外使用proc_macro2!
  • syntex_syntax确实已被弃用,不应再使用。只是想想它是如何使用的,让我不寒而栗:P
  • 10-02 03:13
    查看更多