AICon 上海站|90%日程已就绪,解锁Al未来! 了解详情
写点什么

Treetop——基于 Ruby 的 PEG 解析器生成器

  • 2008-01-22
  • 本文字数:1041 字

    阅读完需:约 3 分钟

Ruby 已经有了一个叫做 RACC 的解析器生成器,是一个 YACC 的移植版本(被用来编写ruby_parser,第一个用Ruby 写成的Ruby 解析器)。

当谈到解析器生成器的时候,解析表达式语法(PEG)最近因为一篇 Bryan Ford 介绍的一种叫做“Packrat 解析”优化的论文而 变得很流行。Packrat 解析解决了诸如指数级解析时间的问题。这是由于解析器使用回溯来解析代码,例如,它们会尝试诸多结果的组合直到找到正确的那一 个。Packrat 解析的解决方法是使用记忆化,例如将解析的中间结果保存下来,而不是一遍一遍的重新计算。这决定了 Packrat 解析的时间复杂度是线 性的,但是缺点是需要很大的内存,通常是源代码大小的几倍。注意,其他的解析器生成器也是采用类似的方法,比如 ANTLR

基于这个前提, Treetop 网站上如此解释 PEG 的优点:

解析表达式语法(PEGs)编写简单、易于维护。它们是简单但功能强大的泛化正则表达式,比起传统的 LALR 或者 LR-1 语法的解析器生成器来说更易于使用。没有必要再进行符号化解析,或者用于有限度上下文敏感的前向断言。

Treetop 会自动生成解析树,而且还允许用户添加方法来定制所生成的节点:
grammar Arithmetic<br></br> rule additive<br></br>  multitive '+' additive {<br></br>  def value<br></br>  multitive.value + additive.value<br></br>  end<br></br>  }<br></br> /<br></br>  multitive<br></br> end<br></br># other rules below ... <br></br>end 这段代码的意思是通过 additive 节点生成的节点有一个叫做 value 的方法。另外,可以为每条规则指定一个要生成的节点类。(注意:这个斜杠是选择操作符,意思是,additive 规则要么是两个操作数和之间的加号,要么是 multitive 规则的结果)。 在开始使用 Treetop 之前,你需要先安装它。可以从Rubyforge 下载Treetop 的源代码,或者通过gem 安装,命令为:

gem install treetop 想要开始使用它的话,可以去查看Treetop 的文档或者看看上文中的示例。Treetop 需要一个简单的算术表达式解析器、一个非常基本的语言解析器以及运行时间。

Treetop 可以通过 tt 工具将语法定义文件转换成 Ruby 代码: <span>tt foo.treetop</span> 另一种选择是通过 Ruby 代码来进行解析器生成
Treetop.load "arithmetic"<br></br>parser = ArithmeticParser.new<br></br><span color="#000000">parser.parse('1+1') </span> Treeop 创始人的现场演示,参见 Nathan Sobo 在 RubyConf 2007 上关于 Treetop 的报告
查看英文原文: Treetop - PEG parser generator for Ruby

2008-01-22 01:171856
用户头像

发布了 80 篇内容, 共 21.2 次阅读, 收获喜欢 5 次。

关注

评论

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

11. 用别人写好的代码,完成我的工作,剩下的时间去摸鱼

梦想橡皮擦

Python 2月春节不断更 python入门

SonarQube&Gitlab-CI 实现静态代码分析

夏兮。

ci gitlab SonarQube

这是我的第一次JavaScript初级技巧

我是哪吒

JavaScript 学习 程序员 大前端 2月春节不断更

开箱即用cypress

夏兮。

PO Cypress

翻译:《实用的Python编程》01_04_Strings

codists

人工智能 爬虫 后端 数据结构与算法 Python Monad

【活动回顾】4步2小时,搭建爆火的语音聊天室

ZEGO即构

week12-conclusion

J

分布式任务框架:xxl-job使用问题整理

程序员架构进阶

开源 分布式任务调度 七日更 2月春节不断更 XXL-JOB

LeetCode题解:62. 不同路径,动态规划,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

诊所数字化:诊所老板为什么拒绝预约制?

boshi

数字化转型 医院 七日更

ARTS打卡 第31周

引花眠

微服务 ARTS 打卡计划

如何搭建自动化测试框架

夏兮。

js puppeteer automation

日记 2021年2月16日(周二)

Changing Lin

2月春节不断更

【STM32】TIM---基本定时器

AXYZdong

硬件 stm32 2月春节不断更

1480. 一维数组的动态和

小马哥

算法 七日更

Jacoco统计web接口/功能测试的代码覆盖率

夏兮。

tomcat WebService JACOCO

第十二周命题作业

cc

第十二周学习心得

cc

程序员成长第八篇:做好测试工作

石云升

程序员 测试 2月春节不断更

CI-基于JMeter的性能测试

夏兮。

自动化测试中的Page Object

夏兮。

Python PO selenium

今日笔记

Nydia

第四章作业

Deborah

sonarLint与IntelliJ IDEA 集成

夏兮。

消息队列Kafka:入门基础

正向成长

kafka

数据量大读写缓慢如何优化(5)【读缓存】

我爱娃哈哈😍

redis 缓存 架构设计实战 缓存设计

深度讲解背包问题:面试中每五道动态规划就有一道是背包模型 ...

宫水三叶的刷题日记

深度思考 面试 LeetCode 动态规划 数据结构与算法

【LeetCode】数组拆分Java题解

Albert

算法 LeetCode 2月春节不断更

Flink集群部署:Standalone部署

正向成长

web自动化测试-puppeteer入门与实践

夏兮。

puppeteer

DO、DTO、BO、VO、POJO区别

安琪拉的博客

系统设计

Treetop——基于Ruby的PEG解析器生成器_Ruby_Werner Schuster_InfoQ精选文章