使用Flex和Bison更好地进行错误处理

尽管使用 Flex 和 Bison 生成程序非常简单,但是要让这些程序产生用户友 好的语法和语义错误消息却很困难。本文将介绍 Flex 和 Bison 的错误处理特 性,并展示如何使用它们,然后详细介绍它们的一些缺陷。

简介

正如 UNIX 开发人员所了解的那样,Flex 和 Bison 的功能非常强大,非 常适合开发词法和语法解析器,尤其是语言编译器和解释器。如果我们不熟悉它 们所实现的工具 —— 分别是 Lex 和 Yacc —— 可以参 考一下本文 参考资料 一节中有关 Flex 和 Bison 文档的链接,以及其他介绍 这两个程序的文章。

本文介绍了更高级的一些主题:用来在编译器和解 释器中更好地实现错误处理能力的特性和技术。为了展示这些技术,我使用了一 个示例程序 ccalc,它基于 Bison 手册中的计算机实现了一个增强的计算器。 我们可以从本文后面 下载 一节下载 ccalc 和相关文件。

增强包括使用 了很多变量。在 ccalc 中,变量是通过在初始化中首次使用时定义的,例如 a = 3。如果变量是在初始化之前使用的,那就会产生语义错误,使用值为 0 来创 建这个变量,并打印一条消息。

示例源文件

示例源代码中包括 7 个文件:

ccalc.c:主程序,以及一些进行输入、输出和错误处理的函数

ccalc.h:包括了对所有模块的定义

cmath.c:数学函数

parse.y:Bison 使用的输入文法

lex.l:Flex 的输入

makefile:简单的 makefile

defs.txt:示例输入文件

这 个程序接收两个参数:

-debug:产生调试输出

filename:输入文 件名;默认值为 defs.txt

Bison 使用的设置

为了处理变量名和 实际值,Bison 的语义类型必须进行增强:

清单 1. 更好的 Bison 语义 类型

/* generate include-file with symbols and types */
%defines
/* a more advanced semantic type */
%union {
 double value;
 char *string;
}

时间: 2016-11-23

使用Flex和Bison更好地进行错误处理的相关文章

flex-编译原理中的Flex与Bison,都应用在哪些领域,哪些公司在用?

问题描述 编译原理中的Flex与Bison,都应用在哪些领域,哪些公司在用? 大家好, 想问一下, 编译原理中的Flex与Bison,都应用在哪些领域,哪些公司在用? 我 有这方面的 开发经验,想找相关的工作.但是不知道济南哪些公司在用,请 各位大侠帮忙啦!谢谢!不好意思,没分了 ,请帮一下.

创建第一个Flex应用程序

在前面的文章中,笔者已经介绍了RIA.Flex技术和Flex Builder 2集成开发环境.从本 文开始将正式开始讲解使用Flex Builder 2创建Flex应用程序的方方面面.本文内容包括典 型应用程序开发步骤和创建第一个Flex应用程序的过程. 1. 应用程序开发步骤 创 建Flex应用程序的过程并不复杂.通常而言,典型应用程序的开发步骤如下所示: (1)使用文本编辑器或者Flex Builder 2创建MXML文件,并在该文件中添加MXML根标签,代码 如下: <?xml versi

Flex/Silverlight的技术比较

别人博客上看见的,一文下去,引起口水大战,其实仁者见仁,智者见智,每种语言都不可能是完善的,扬长避短才是王道. 基于个人的使用经验,我从语言.框架.开发环境和运行环境四个方面对Flex和Silverlight这两门技术做一个比较,自己认为这个比较还是比较全面的.(这样的比较有意义吗?个人意见,只要别把自己当成宗教教徒,将语言看作工具而不是信仰,那么比较就是有意义的.)   语言(Silverlight以C#为准) 特性 比较 胜出 Flex Silverlight 语法 Flex的编程语言Act

有没有不适合使用flex/lex作为词法分析器的语言?

问题描述 有没有不适合使用flex/lex作为词法分析器的语言? O'REILLY <flex和bison(中文版)>第24面问题5.求指点!我个人认为词法分析既然是把输入流分割成为一个个有意义的记号(参见龙书),而只要是程序设计语言肯定就能分割成为有意义的记号(不然人类就无法理解了),那就一定可以用词法分析器生成器如flex生成,可是书上既然提出了这个问题那一定是有道理的!望指点! 解决方案 此问题已被解决,请参见http://www.zhihu.com/question/29922657

在Linux系统上安装Wine的教程

  Wine,一个在Linux平台上非常受欢迎并且强大的开源应用,有了它,我们可以在Linux平台上完美运行Windows应用与游戏. WineHQ团队,近期宣布了一个新的开发版本Wine1.7.29.这个版本带来了诸多重要的特性,并且修复了44个bug. Wine团队几乎每周都会发布新的开发版本,并且加入许多新特性以及修复漏洞.每个新版本都会支持新的应用与游戏(Windows),这使得Wine在那些想要在Linux下运行Windows应用的用户群体中很流行并且是不可缺少的. 根据变更日志,这个

PostgreSQL服务器管理:从源代码安装

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. 1. 简单版 ./configure make su make install adduser postgres mkdir /usr/local/pgsql/data chown postgres /usr/local/pgsql/data su - postgres /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data /usr/local/pgsql/bin/p

《编译原理实践与指导教程》——1.2 实验指导

1.2 实验指导 词法分析和语法分析这两块,可以说是在整个编译器当中被自动化得最好的部分.也就是说即使没有任何的理论基础,在掌握了工具的用法之后,也可以在短时间内做出功能很全很棒的词法分析程序和语法分析程序.当然这并不意味着,词法分析和语法分析部分的理论基础并不重要.恰恰相反,这一部分被认为是计算机理论在工程实践中最成功的应用之一,对它的介绍也是编译理论课中的重点.但本节指导内容的重点不在于理论而在于工具的使用. 本节指导内容将分别介绍词法分析工具GNU Flex和语法分析工具GNU Bison

c++-一道C++读取文件,动态数组和自定义指令的题目,有什么最优解答?

问题描述 一道C++读取文件,动态数组和自定义指令的题目,有什么最优解答? 读取123.txt,里面含有以下几种指令: ADD_F ADD_B REMOVE_F REMOVE_B RESULT 开始要求创建一个空数组 例如 ADD_F 2 3 5:在数组开头增加2 3 5 ADD_B 3 5 6:在数组结尾增加3 5 6 REMOVE_F 3:删掉数组头3个数字 REMOVE_B 2:删掉数组后2个数字 RESULT:输出当前数组 例子 ADD_F 1 2 3 ADD_B 5 6 7 RESUL

浏览器的工作原理:新式网络浏览器幕后揭秘

英文原文地址:http://blog.csdn.net/wdzxl198/article/details/8992280:http://taligarsiel.com/Projects/howbrowserswork1.htm#Resources: 转载源地址:http://www.html5rocks.com/zh/tutorials/internals/howbrowserswork/: 序言 这是一篇全面介绍 Webkit 和 Gecko 内部操作的入门文章,是以色列开发人员塔利·加希尔大