InfoQ

新闻

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

作者 Werner Schuster译者 李明(nasi) 发布于 2008年1月22日 上午1时17分

社区
Ruby
主题
编程,
领域特定语言
标签
语言特性,
语言,
代码生成
Ruby已经有了一个叫做RACC的解析器生成器,是一个YACC的移植版本(被用来编写ruby_parser,第一个用Ruby写成的Ruby解析器)。

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

基于这个前提Treetop网站上如此解释PEG的优点:
解析表达式语法(PEGs)编写简单、易于维护。它们是简单但功能强大的泛化正则表达式,比起传统的LALR或者LR-1语法的解析器生成器来说更易于使用。没有必要再进行符号化解析,或者用于有限度上下文敏感的前向断言。
Treetop会自动生成解析树,而且还允许用户添加方法来定制所生成的节点:
grammar Arithmetic
 rule additive
 multitive '+' additive {
 def value
 multitive.value + additive.value
 end
  }
 /
 multitive
end
# other rules below ...
end
这段代码的意思是通过additive节点生成的节点有一个叫做value的方法。另外,可以为每条规则指定一个要生成的节点类。(注意:这个斜杠是选择操作符,意思是,additive规则要么是两个操作数和之间的加号,要么是multitive规则的结果)。

在开始使用Treetop之前,你需要先安装它。可以从Rubyforge下载Treetop的源代码,或者通过gem安装,命令为:
gem install treetop 
想要开始使用它的话,可以去查看Treetop的文档或者看看上文中的示例。Treetop需要一个简单的算术表达式解析器、一个非常基本的语言解析器以及运行时间。

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

查看英文原文:Treetop - PEG parser generator for Ruby

没有回复

回复

深度内容

Flex与JSON及XML的互操作

平台需要互操作性。在这篇文章中,作者仔细研究了Flex和JSON及XML的互操作性。文章也包含了使用E4X库来将XML映射到图表和表格组件的内容,还演示了如何使用as3core库来解码JSON消息。

用Qi4j进行面向组合编程

本文将简要介绍面向组合编程(COP,Composite Oriented Programming)的概念,展示它如何规避OOP存在的一些问题,并重新点燃使用可重用部件组装领域模型(Domain Model)的希望。

系统开发——新学科,新教育

一门新的计算机学科——“系统开发”,强调人性化、匠艺、设计、创意、创新和新事物的涌现,并建议用被称为“bottega”的工作室替代乏善可陈的教室。

图书聚焦:Visual Studio 2008 揭秘

Mike Snell和Lars Powers用他们最近由Sams出版的新书《Visual Studio 2008揭秘》,试图帮助大家提高开发人员的生产力。本文包括一个下载样章——第10章调试。

BPEL为何不是BPM的圣杯?

Pierre Vigneras在本文中讨论了作为标准之一的BPEL所存在的问题。Pierre先给我们大致介绍了一个简单的并行流程,接着讨论了从业者在试图以一个结构化模型为基础表达非结构化流程时遇到的一系列问题。

基于范型的多语言编程

你是否仔细思考过,为什么人们总在讨论“要正确的语言做恰当的事情”?在这篇文章中,Sadek Drobi向你解释了为什么应该在系统内部混合使用多种语言。

采访与书摘《Pro Web 2.0 Application Development with GWT》

Jeff Dwyer就关于他的新书(《Pro Web 2.0 Application Development with GWT》)、GWT1.5以及创建可搜索的Ajax应用谈了一些他的见解。

时刻准备着,迎接IT业的春天

我们需要设身处地地为客户及客户的业务本身着想,与客户同舟共济。更多创新的思路、产品和模式也同样将为IT业带来新的出路。IT业并不需要坐以待毙,在春天到来之后,市场将会更加繁荣!