NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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:311679
用户头像

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

关注

评论

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

Redis做消息队列全攻略

架构师修行之路

redis MQ 消息队列

数字货币钱包系统定制开发,区块链钱包源码

13530558032

week12学习总结

burner

分布式QoS算法解析

焱融科技

分布式 算法 焱融科技 分布式文件存储 QoS

滴滴七层接入平台实践和探索

滴滴技术

微服务 运维 滴滴技术 七层接入

自定义线程池来实现文档转码

架构师修行之路

区块链交易所开发源码,数字货币交易所app开发

13530558032

迭代技术方案设计文档规范

程序员架构进阶

技术方案

基于Prometheus的微服务应用监控

易观大数据

滴滴云平台事业群——就是稳!

滴滴技术

招聘 滴滴技术 滴滴云平台事业群分享月

第 0 期架构师训练营第 8 周作业2-总结

fujin

滴滴推理引擎IFX:千万规模设备下AI部署实践

滴滴技术

人工智能 学习 AI 滴滴技术 IFX

滴滴数据通道服务演进之路

滴滴技术

大数据 滴滴技术 数据服务通道

物联网的银河,华为的桨,少年的歌

脑极体

区块链支付系统源码开发,USDT承兑支付平台

13530558032

合约跟单系统开发,数字货币合约跟单软件搭建

13530558032

突破传统 区块链如何实现病历永存

CECBC

区块链 电子病历 信息共享

拥抱K8S系列-03-服务器部署应用和docker部署应用区别(MySQL篇)

张无忌

MySQL Docker 运维

GPU虚拟机创建时间深度优化

滴滴技术

云计算 虚拟化 滴滴技术

第 0 期架构师训练营第 8 周作业 1

fujin

滴滴ElasticSearch千万级TPS写入性能翻倍技术剖析

滴滴技术

大数据 elasticsearch 滴滴技术

可编程网卡芯片在滴滴云网络的应用实践

滴滴技术

云计算 芯片 滴滴技术

滴滴Ceph分布式存储系统优化之锁优化

滴滴技术

云计算 分布式存储 Ceph 滴滴技术

1.Flink检查点算法-15

小知识点

scala 大数据 flink

隐私计算会成为“金融”向“数科”转型的一剂猛药?

hellompc

区块链技术成为金融业务应用热点

CECBC

区块链 人工智能 金融

滴滴数据仓库指标体系建设实践

滴滴技术

大数据 数据仓库 滴滴技术

c语言函数指针之回调函数

C语言与CPP编程

C语言 回调函数 函数 函数指针

浅析LR.Net工作流引擎

Learun

.net 敏捷开发 工作流

实时数仓在滴滴的实践和落地

滴滴技术

大数据 滴滴技术 数据通道服务

【Spring注解驱动开发】AOP核心类源码解析,这是最全的一篇了!!

冰河

spring aop ioc

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