编译器开发-lex与yacc

一、编译器介绍

编译器就是将“高级语言”翻译为“机器语言(低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables) 编译器是软件开发中的核心部件,其作用是其他 任何软件所不能取代的。 编译器在工作过程中,往往完成如下的任务: 1、读取源代码并且获得程序的结构描述 2、分析程序结构,并且生成相应的目标代码 在构造专业的编译器的时候,常常需要使用到lexyacc. 正是因为这两个工具,使得我们编写编译器,解释器等工具的时候工作变得非常简单。 通过使用lex和yacc生成的词法和语法代码比程序员手写代码要方便很多,代码规范,甚至效率有时比手工高。

编译器工作原理

编译器工作原理

lex负责词法解析,而yacc负责语法解析,其实就是lex负责根据指定的正则表达式,将输入的字符串匹配成一个一个的token,同时允许用户将当前匹配到的字符串进行处理,并且允许返回一个标识当前token的标识码。而yacc则负责进行语法解析,将一个个的token最终形成一个完整的语法。

lex与yacc合建编译程序

lex与yacc合建编译程序

三、lex与yacc介绍

在UNIX早期时代,编写一个编译器是一件非常耗时的工作。人们为了简化开发过程,贝尔实验室开发了Lex和YACC程序来解决以上的任务,根据用户描述的语言,生成能够解决问题的C/C++语言代码,供开发者使用。

  • Lex将源代码文件分解为各种词汇,用来分析词法,例如if、int、16。
  • Yacc找到这些词汇的组成方式,用来分析语法,例如int i = 10。
  • GNU软件协会开发了Flex和Bison,其功能与Lex和Yacc基本兼容,并且在Lex和Yacc提供的功能的基础 上进行了各种扩展。
  • 在构造专业的编译器的时候,常常需要使用到lex和yacc. 正是因为这两个工具,使得我们编写编译器,解释器等工具的时候工作变得非常简单。 Lex 代表 Lexical Analyzar。Yacc 代表 Yet Another Compiler Compiler。

四、用途

Lex 和 Yacc 是 UNIX 两个非常重要的、功能强大的工具。事实上,如果你熟练掌握 Lex 和 Yacc 的话,它们的强大功能使创建 FORTRAN 和 C 的编译器如同儿戏,使用这两个工具开发的软件很多,下面简单举几个使用它们开发的软件。 开发编译器(gcc) 、开发解释器(php解析)、 sql解析器(mysql和PostgreSQL的sql解析)、 lex程序本身 、go的语法分析器 、自然语言处理、 文本分析、 Lua 第一版等众多的软件都是lex和yacc的杰作。

五、工具

开发工具 windows下方法:Parser Generator+VC6.0、Parser Generator+Cygwin、记事本+Cygwin

linux下方法:vim+flex+bosin+gcc

Parser Generator作为当前最好用的Windows环境LEX/YACC工具而被广泛应用,之所以推荐它是因为它生成的c文件可以在vc++下通过编译。 Parser Generator的下载地址,下载之后,解压缩,然后安装。

六、Lex与Yacc语法通用样式

  • /* 定义段 */
  • %%
  • / * Flex、Bison代码段(规则) * /
  • %%
  • / * 辅助代码段,C语言 */

分为三段,段与段之间以%%分隔

七、Lex与Yacc编译命令

  • flex -o<由lex生成文件.c> <lex词法分析文件.l>
  • bison -o<yacc生成文件.c> <yacc语法分析文件.y> -d      # 注意-d,用于产生对应的头文件
  • gcc test2yy.c test2ll.c -o test2

关于lex与yacc的语法,由于篇隔限制,这里不作过多的介绍,可以去自学一下。

ps:一些实例代码,已上传到云端,希望能帮助到大家的学习,下载点击这里,有问题大家一起讨论。【原文地址

猜你喜欢

转载自wwww6662003.iteye.com/blog/2059814