从 Ruby 块中提取 AST

发布于 2024-11-27 15:09:48 字数 133 浏览 0 评论 0原文

是否有可能从 Ruby 本身获取一个块的 AST?

我已经研究过 ParseTree 和 ruby​​_parser,但它们似乎都对 Ruby 1.9.2 提供了粗略的支持(根据我读到的内容)。我需要一些与 1.9.2 配合良好的东西。

Is it possible to grab the AST of a block from Ruby itself?

I've had a look at both ParseTree and ruby_parser, but they both seem to have sketchy support (from what I've read) for Ruby 1.9.2. I need something that works well with 1.9.2.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

沉默的熊 2024-12-04 15:09:48

Ripper 开箱即包含在 MRI 1.9 中。

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 is included in MRI 1.9 out of the box.

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]]]] 

In 1.8, Ruby executes the code by traversing the AST, so it is possible to get the AST for a given method/block. In 1.9 it is not so; the code is first parsed, then converted to YARV bytecode, and then executed. Not the source, nor AST is kept after the translating step, and the latter is not reversible; hence you cannot get the AST for a block in 1.9.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文