【问题标题】:Extract the AST from a Ruby block从 Ruby 块中提取 AST
【发布时间】:2011-10-17 05:01:39
【问题描述】:

是否可以从 Ruby 本身获取块的 AST?

我已经查看了 ParseTree 和 ruby​​_parser,但它们似乎都对 Ruby 1.9.2 有粗略的支持(根据我的阅读)。我需要一些适用于 1.9.2 的东西。

【问题讨论】:

    标签: ruby reflection abstract-syntax-tree ruby-1.9.2


    【解决方案1】:

    开箱即用的 MRI 1.9 中包含 Ripper。

    ruby-1.9.2-p180 :004 > require 'ripper'
     => true
    ruby-1.9.2-p180 :005 > Ripper.sexp("def a; end")
     => [:program, [[:def, [:@ident, "a", [1, 4]], [:params, nil, nil, nil, nil, nil], [:bodystmt, [[:void_stmt]], nil, nil, nil]]]] 
    

    在 1.8 中,Ruby 通过遍历 AST 来执行代码,因此可以获取给定方法/块的 AST。在 1.9 中并非如此;代码首先被解析,然后转换为 YARV 字节码,然后执行。不是源,也不是 AST 在翻译步骤之后保留,后者是不可逆的;因此您无法在 1.9 中获取块的 AST。

    【讨论】:

    • 如何使用 Ripper 从块中获取 AST?我假设我必须以某种方式获取该块的源代码。
    • 感谢您的信息!看来您需要执行 require 'ripper' 才能使其正常工作。
    • 哦。对不起,我应该更仔细地阅读你的帖子。我已经更新了答案。
    • @charlie 你可以使用 sourcify gem 从块中获取源代码
    • 在 Ruby 1.9+ 中您无法获取块的来源是不正确的,您无法使用 ruby​​ 但例如sourcify 效果很好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 2012-04-10
    • 2017-04-22
    • 2010-09-06
    • 2023-03-21
    • 1970-01-01
    • 2017-06-19
    相关资源
    最近更新 更多