速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

ruby_parser 1.0:Ruby 语言实现的 Ruby 语法分析器

  • 2008-01-02
  • 本文字数:1803 字

    阅读完需:约 6 分钟

07 年 12 月 22 日, Ryan Davis 宣布了 ruby_parser 的发布。ruby_parser 是一个纯 Ruby 实现的 Ruby 源代码语法分析器。这个语法分析器的编写过程中使用了 Ruby yACC (RACC) ,一个包含在 Ruby 标准库中的语法分析程序生成器。

ruby_parser(RP) 是一个纯 Ruby 实现的 Ruby 语法分析器(借助了 racc——它在缺省情况下使用 C 语言的扩展). RP 的输出与语法分析树的输出相同:用 ruby 中的数组以及基本类型来表达的 s-expression。

这个库很容易使用:

RubyParser.new.parse "1+1" 上面的语句会返回 s(:call, s(:lit, 1), :+, s(:array, s(:lit, 1)))Ruby 世界中一直缺少纯 Ruby 实现的 Ruby 语法分析器。“纯 Ruby”意味着该语法分析器:

  • 仅仅包含 Ruby 源文件
  • 没有任何本地扩展或者 C 语言代码(例如通过 RubyInline)——C 语言代码要求用户系统必须包含 C 编译器来处理这些代码

上面这些属性对于保证代码能够通用于各种Ruby 运行时至关重要。如果一个语法分析器的实现使用了基于 C 语言的本地扩展,那么它就无法在不支持这些扩展的 Ruby 版本上运行,例如 JRuby、XRuby 或者.NET 上的 IronRuby 和 Ruby.NET。即便这些 Ruby 版本支持了本地扩展( JRuby 正在考虑这一方案),它还会造成部署问题,因为这要求扩展所使用的库或 DLL 必须被移植到任何可能的 OS/CPU 组合之上(否则某些用户将无法使用该语法分析器)。Ryan Davis 的另一个项目 RubyInline ,通过自动编译那些内联的 C 代码一定程度上的改善了这一状况。但要 RubyInline 要求目标系统需要包含一个 C 编译器——这一条件并不是总能满足,尤其是对于 Windows 系统来说。

因为可以使用类似语法分析树(ParseTree)的通用方法来对Ruby 代码进行分析并获得抽象语法树(Abstract Syntax Tree),所以在Ruby 历史上的一定时期内,纯Ruby 语法分析器的缺失被忽视了。然而自从各种Ruby 运行时雨后春笋一样的出现以来,Ruby 语法分析器被反复实现了很多次——两次使用Java(JRuby 和XRuby),一次使用C#(Ruby.NET 所编写的语法分析器也被IronRuby 所使用)。所有这些分析器提供了不同的抽象语法树以及获取它们的方式。

这造成了Ruby 源代码工具的一些问题。例如,目前 Aptana/RDT (基于 Eclipse)中包含的 Ruby 重构工具就被绑定到 Java 和 JRuby 的抽象语法树上,这使其无法被用在其他的 Ruby 实现上。类似的,针对其他基于 Java 的 Ruby IDE 的工具也正在被开发,这造成了大量代码分析管理工具被限制在 Java 和 JRuby 上。除此之外,这些工具的逻辑使用 Java 而不是 Ruby 编写,这对 Ruby 开发人员来说不够友好。

纯 Ruby 语法分析器提供了改变这种情况的机会——Ruby IDE(或者其他工具)可以获得 Ruby 的抽象语法树,同时避免被绑定到特定的语法分析器实现上。例如,一个基于 Java 的 IDE 可以在开启 JRuby 的同时使用 ruby_parser 进行语法分析。为了达到这一目的,目前版本的 ruby_parser 需要在输出中增加源代码位置的信息,例如,每个抽象语法树的节点需要了解其在源代码中开始和结束位置的偏移。这对源代码工具来说至关重要,因为虽然纯粹的语法树结构信息也很有用,但是如果工具无法了解节点在源码中的位置,它就不能对源码进行修改。

ruby_parser 的另一个使用者是Rubinius。Rubinius 是一个绝大部分代码使用 Ruby 编写的 Ruby 虚拟机,不过它使用的是 Matz 的 Ruby 参考实现(MRI)中所包含的语法分析器,而通过使用 ruby_parser 可以使 Rubinius 移除这一部分的 C 语言代码。此处还存在一个问题:“如果语法分析器是 Ruby 编写的需要 Ruby 虚拟机来运行,那么依赖语法分析器的 Ruby 虚拟器要如何工作?”,这是一个类似“鸡大生蛋,蛋破生鸡”问题。为了避免这个问题,在 Rubinius 的虚拟器中,ruby_parser 的 Ruby 源代码会被编译为Rubinius 字节码。当 Rubinius 启动时,它通过读取 ruby_parser 的字节码文件——这些文件不需要进行语法分析——来运行一个 Ruby 语法分析器。

对于 ruby_parser 来说,还有许多工作要做。发布说明中列出了其中的一些问题:

  • 已知问题: 速度还很不尽如人意。运行 5500 个测试用例目前需要 21 分钟。
  • 已知问题: 代码有些难看。不过这不全是我的错,我会尽快改进这一状况。
  • 已知问题:目前还不支持 newline 节点。
  • 已知问题:功能还可以更加强大。
  • 已知问题:ParseTree 中的 dasgn_curr 声明可能会乱序。
  • 待做事情:加入注释节点。

查看英文原文: ruby_parser 1.0: a Ruby Parser written in Ruby

2008-01-02 23:311806
用户头像

发布了 24 篇内容, 共 31585 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

单商户 V4.4,初心未变,实力依旧!

CRMEB

自助洗车加盟门槛如何?高不高

共享电单车厂家

自助洗车加盟费 车白兔自助洗车 自助洗车加盟门槛

集合处理的利器

技术小生

java8 7月月更

详解SQL中Groupings Sets 语句的功能和底层实现逻辑

华为云开发者联盟

数据库 sql 聚合函数

来看一看智能自助洗车怎么加盟?

共享电单车厂家

自助洗车加盟 加盟自助洗车 车白兔自助洗车

尚硅谷尚优选项目教程发布

小谷哥

HiEngine:可媲美本地的云原生内存数据库引擎

华为云开发者联盟

数据库 华为云 内容数据库引擎

无人自助洗车机投放选址有啥要点

共享电单车厂家

自助洗车加盟 车白兔自助洗车 自助洗车机投放

企业级数据安全,天翼云是这样理解的

天翼云开发者社区

数据安全

一朵云开启智慧交通新未来

天翼云开发者社区

区块链 大数据 物联网

Vue和小程序的关系

Geek_99967b

小程序 Vue

EMQX 5.0 发布:单集群支持 1 亿 MQTT 连接的开源物联网消息服务器

EMQ映云科技

物联网 IoT mqtt #开源 7月月更

中文版Postman?功能真心强大!

Liam

Java 开发者工具 Postman 后端开发 程序员进阶

2022-Java后端工程师面试指南-(并发-多线程)

自然

多线程 并发 7月月更

彻底理解为什么网络 I/O 会被阻塞?

C++后台开发

网络编程 socket 非阻塞网络I/O C++后台开发 C++开发

5. 数据访问 - EntityFramework集成

MASA技术团队

C# .net 微软 后端 Framework

开创人工智能产业新未来!7月8日昇思生态论坛与你相约广州

科技热闻

自助共享洗车能挣钱么?分析下

共享电单车厂家

自助洗车加盟 车白兔自助洗车 自助洗车费用

MySQL数据库索引教程(超详细)

Albert Edison

7月月更

Linux RedHat7.4更换阿里云yum源

Albert Edison

7月月更

企业数字化转型之路,从这里开始

天翼云开发者社区

数字化转型 云存储

养不起真猫,就用代码吸猫 -Unity 粒子实现画猫咪

芝麻粒儿

游戏 Unity 特效 7月月更

现在加盟自助洗车是否还来得及

共享电单车厂家

自助洗车加盟 加盟自助洗车 车白兔自助洗车

跨境支付平台 XTransfer 的低代码实践:如何与其他中台融合是核心

XTransfer技术

技术 前端

Web3.0时代来了,看天翼云存储资源盘活系统如何赋能新基建(下)

天翼云开发者社区

数字化 云存储

RedHat7.4配置yum软件仓库(RHEL7.4)

Albert Edison

7月月更

不要再手动批量替换了,使用python AST模块批量替换

阿呆

Python AST 批量替换

践行自主可控3.0,真正开创中国人自己的开源事业

极狐GitLab

git DevOps gitlab 自主可控 极狐GitLab

华律网牵手观测云,上线系统全链路可观测平台

观测云

鱼和熊掌可以兼得!天翼云弹性裸金属一招鲜!

天翼云开发者社区

服务器 弹性扩容

7000+字图文并茂解带你深入理解java锁升级的每个细节

华为云开发者联盟

Java 开发 华为云

ruby_parser 1.0:Ruby语言实现的Ruby语法分析器_Ruby_Werner Schuster_InfoQ精选文章