【问题标题】:How to parse Rust code without using procedural macros?如何在不使用过程宏的情况下解析 Rust 代码?
【发布时间】:2019-08-08 09:01:48
【问题描述】:

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

我注意到一些 crate,例如 synquote,但如果不使用过程宏并创建完全不必要的项目结构,它们就无法工作。我发现有一个名为 syntex_syntax 的 crate 符合我的要求,但它不再维护,并且在给出一些具有较新语法的代码时会出现恐慌。

有没有办法直接解析 Rust 代码:从任意外部 *.rs 文件中读取并使用 synquote 解析它,就像 syntex_syntax 所做的那样?

【问题讨论】:

    标签: parsing rust


    【解决方案1】:

    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>:相同,但使用来自 proc_macro2 crate 的 TokenStream
    • fn parse_str<T: Parse>(s: &str) -> Result<T>:从一个简单的字符串解析。不需要TokenStreams。
    • fn parse_file(content: &str) -> Result<File>:与parse_str 非常相似,但有一些方便的区别。见docs for more information

    您可以使用parse_strparse_file 从过程宏之外解析Rust 代码。

    一些补充说明:

    • quote 在您的情况下不需要。这个 crate 只是用来轻松创建TokenStreams;它不是解析所必需的。
    • 如果您只是对解析标记感兴趣,也可以在过程宏之外使用 proc_macro2
    • syntex_syntax 确实已被弃用,不应再使用。光是想想它是如何使用的就让我不寒而栗:P

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多