写点什么

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

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

关注

评论

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

你以为Shell只是命令行?读懂这篇文,给你的工作赋能

霍格沃兹测试开发学社

不懂PO 设计模式?这篇实战文带你搞定 PO

霍格沃兹测试开发学社

软件测试 自动化测试 测试开发

一文带你了解接口测试价值与体系

霍格沃兹测试开发学社

软件测试 自动化测试 测试开发

软件测试 | 测试开发 | 如何利用 xUnit 框架对测试用例进行维护?

测吧(北京)科技有限公司

软件测试

Github最新霸榜!Alibaba架构师手写的分布式系统核心原理手册

了不起的程序猿

Java 分布式 开发 分布式系统 java程序员

java基础学习:java中的反射

Java快了!

java;

leetcode 114. Flatten Binary Tree to Linked List 二叉树展开为链表(简单)

okokabcd

LeetCode 算法与数据结构

利器 | TestNG 与 Junit 对比,测试框架如何选择?

霍格沃兹测试开发学社

软件测试 自动化测试 测试开发

利器 | REST Assured 实践(二):断言实现

霍格沃兹测试开发学社

软件测试 自动化测试 测试开发

一文搞懂测试左移和测试右移的 Why-How-What

霍格沃兹测试开发学社

软件测试 自动化测试 测试开发

云架构系统如何做性能分析?| 实战干货

霍格沃兹测试开发学社

软件测试 自动化测试 测试开发

一文彻底理解 Cookie、Session、Token

霍格沃兹测试开发学社

软件测试 自动化测试 测试开发

数据可视化系列教程之React组件使用技巧

云智慧AIOps社区

前端 React 数据可视化

利器 | Java 接口自动化测试首选方案:REST Assured 实践 (一)

霍格沃兹测试开发学社

代码质量管理平台实战| SonarQube 安装、配置及 JaCoCo、Maven 集成

霍格沃兹测试开发学社

软件测试 自动化测试 测试开发

无代码开发平台怎么选?选择合适无代码平台的13个关键步骤

优秀

无代码平台

由循环开始的前端学习杂谈话事录-sam9029

Sam9029

前端 个人博客 成长笔记 9月月更

五分钟了解 Databend 全新 SQL 类型系统

Databend

开源项目 sql 开源社区 SQL分析

「工作小记」关于业务组件的思考

叶一一

前端 React 组件开发 9月月更

软件测试 | 测试开发 | 免安装免配置环境的免费 ios 调试工具 sib 来啦

测吧(北京)科技有限公司

ios 测试

阿里云丁宇:以领先的云原生技术,激活应用构建新范式

阿里巴巴中间件

阿里云 云原生 应用构建

【xShell 7】强悍的Linux远程链接工具、终端模拟器

淋雨

Linux 运维 xshell

程序员交接代码中被植入了恶意删除操作,太狠了!

程序员小毕

Java 程序员 面试 程序人生 码农

从 Linux 内核角度探秘 JDK NIO 文件读写本质

bin的技术小屋

Linux jdk nio Linux Kenel 文件I/O

数字藏品系统软件开发

开源直播系统源码

NFT 数字藏品 数字藏品系统软件开发 数字藏品app

隐私计算,让企业大数据走进数据网络时代

Jessica@数牍

Xshell 7 安装激活与换机转移许可证教程详解

淋雨

Linux xshell #运维

「工作小记」小程序开发的喜怒哀乐

叶一一

小程序 前端 9月月更

利器 | AppCrawler 自动遍历测试实践(三):动手实操与常见问题汇总

霍格沃兹测试开发学社

软件测试 自动化测试 测试开发

代码分析体系及Sonarqube平台

霍格沃兹测试开发学社

软件测试 自动化测试 测试开发

隐私计算中的算子是个啥?可视化组合配置的算子解决方案了解下

Jessica@数牍

隐私计算 算子 隐私计算性能

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