Data+AI时代,如何打造下一代数智平台? 了解详情
写点什么

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

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

关注

评论

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

ShardingSphere Proxy 初步体验

ShardingSphere-Proxy

JIT-动态编译与AOT-静态编译:java/ java/ JavaScript/Dart乱谈

zhoulujun

dart JIT AOT 动态编译 静态编译

从λ演算到函数式编程聊闭包(2):彻底理解JavaScript闭包规则

zhoulujun

闭包 闭包函数

按下数字化转型快进键!DataPipeline与星环大数据平台完成产品兼容互认证

DataPipeline数见科技

Go- 递归函数

HelloBug

递归 Go 语言

Go- 闭包函数

HelloBug

Go- 函数执行时间

HelloBug

Go 语言 函数执行时间

3 分钟了解 JSON Schema

程序员鱼皮

Java json 数据库 大前端 后端

客户需求难以推进和实现?企业如何有效管理项目需求?

优秀

项目管理

下载超过10万次?阿里大佬的《高并发、性能调优笔记》一战封神

Java架构师迁哥

太厉害了!腾讯T4大牛把《数据结构与算法》讲透了,带源码笔记

编程susu

Java 编程 程序员 计算机 技术宅

架构实战营1期模块6作业——微服务架构

tt

架构实战营

本科毕业六年,裸辞备战三个月,四面阿里巴巴定级P7

编程susu

Java 编程 程序员 面试 计算机

使用明道云搭建电梯维修与保养系统

明道云

模块(一)什么是架构

我是一只小小鸟

neo4j 图数据库基础

escray

学习 neo4j 8月日更

解决生命科学研究痛点,北鲲云计算着力打造行业解决方案

北鲲云

Python Qt GUI设计:将UI文件转换为Python文件的三种妙招(基础篇—2)

不脱发的程序猿

Python qt GUI UI文件转换为Python文件

特斯拉依旧头铁坚持视觉路线,激光雷达会笑到最后吗?

脑极体

混合模型与期望最大化算法(三)

Databri_AI

算法 混合模型

模块一

树建

架构实战营

正经人一辈子都用不到的 JavaScript 方法总结 (一)

编程三昧

JavaScript 大前端 8月日更 模板字符串 String.raw

笔记-python面向对象

加里都好

Python代码阅读(第17篇):列表元素按位合并

Felix

Python 编程 Code Programing 阅读代码

数据挖掘经典算法之K-邻近算法(超详细附代码)

Python研究者

8月日更

实时数据引擎系列(二): 批流一体的数据

tapdata

网络攻防学习笔记 Day115

穿过生命散发芬芳

网络安全 8月日更

JS遍历循环方法性能对比:for/while/for in/for of/map/foreach/every

zhoulujun

foreach map for for in

从λ演算到函数式编程聊闭包(1):闭包概念在Java/PHP/JS中形式

zhoulujun

闭包 闭包函数

网络上数据通信过程

一个大红包

8月日更

每天学习10个实用Javascript代码片段(五)

devpoint

定时器 JavaScrip 8月日更

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