Linux Bison更好的语义类型

运维 系统运维
正如UNIX®开发人员所了解的那样,Flex和Linux Bison的功能非常强大,非常适合开发词法和语法解析器,尤其是语言编译器和解释器。

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

简介
正如UNIX®开发人员所了解的那样,Flex和Linux 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:简单的makefiledefs.txt:示例输入文件这个程序接收两个参数:
-debug:产生调试输出filename:输入文件名;默认值为defs.txtBison使用的设置为了处理变量名和实际值,Bison的语义类型必须进行增强:


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

  1. /*generateinclude-filewithsymbolsandtypes*/  
  2. %defines  
  3. /*amoreadvancedsemantictype*/  
  4. %union{  
  5. doublevalue;  
  6. char*string;  
  7. }  

 


有些文法规则可以产生特定的语义类型,这需要像清单2中一样对Bison进行声明。要获得一个可移植性更好的Bison文法版本,我们需要重新定义+-*/()符号。下面这个例子没有使用左括号(,而是使用了结束符符号LBRACE,这是由词法分析提供的。另外,操作符的优先顺序也必须进行声明。

对于Flex来说,所生成的代码通常都依赖于平台所使用的代码页(codepage)。尽管我们可以使用其他代码页,但是必须要对输入进行转换。因此与Bison代码不同,Flex代码尚不能进行移植。

【编辑推荐】

  1. Linux Bash命令关于程序调试详解 
  2. Linux Bash命令关于快捷键应用
  3. Linux Bash Shell系统的应用详解
  4. Linux Bash具体安装步骤及使用介绍
  5. Linux Bash命令查询相关事件详解
     
责任编辑:chenqingxiang 来源: 中国IT实验室
相关推荐

2010-06-23 18:01:22

Linux Bison

2022-10-09 07:07:51

Python类型代码

2023-08-22 13:18:00

Web 开发CSS

2021-02-26 20:40:06

LinuxWindows操作系统

2017-09-08 13:35:48

云优先策略互联网

2019-08-14 08:00:00

Arch LinuxUbuntuLinux

2021-12-22 10:25:13

locateLinuxplocate

2021-12-19 13:56:46

机器学习数据人工智能

2009-06-11 10:14:09

数据类型Java

2009-12-09 16:56:58

Linux网银

2010-08-10 09:12:50

DB2驱动类型

2016-12-09 15:43:49

Liunx

2016-08-05 14:23:15

系统

2021-11-23 09:20:25

Wine 6.22LinuxWindows

2012-07-20 09:37:00

Oracle LinuCentOS

2010-02-03 17:51:42

Ubuntu Linu

2021-06-08 07:48:26

iOS 15 Linux 操作系统

2021-10-04 18:53:01

Linux 5.16 USB 音频驱动补丁

2021-12-23 12:32:48

LinuxAlder Lake酷睿处理器

2022-10-08 08:51:21

KDE PlasmaLinux 桌面Linux
点赞
收藏

51CTO技术栈公众号