译者按:打算翻译一份lex& yacc教程,每天一点点,这个是原文的第一部分,介绍。
1. 介绍
直到1975年,写一个编译器还是一个非常耗时的里程。然后Lesk和Johnson发布了关于lex和yacc的论文。这些工具极大地简化了编译器的构造。lex和yacc的实现细节可以在 Aho[1986]里找到。
Lex和Yacc可以在以下地方找到
1. Mortice Kern Systems(MKS),http://www.mks.com
2.GNU flex and bison, at http://www.gnu.org,
3.Ming, at http://agnes.dida.physik.uni-essen.de/~janjaap/mingw32,
4.Cygnus, at http://www.cygnus.com/misc/gnu-win32, and
5.my version of Lex and Yacc, at http://epaperpress.com
MKS是高质量的商业产品,零售要300刀一份。GUN软件是免费的,到1.24版本时,flex的输出都可以用在商业软件里,bison也是一样的。Ming和Cygnus是32位windows 95/NT上的GUN软件移植。我自己版本基本Ming的,但是用Visual C++编译,并包含一些bug fix的函数。如果你下载了我的版本,记得一定要保持你解压时的目录结构。
源码 a = b + c * d
|
v
词法分析
|
V
语法分析
|
V
语法树 =
/ \
id1 +
/ \
id2 *
| / \
| id3 id4
代码生成
|
V
生成的代码 load id3
mul id4
add id2
store id1
图1.1 编译顺序
Lex生成词法分析的C代码,或者说是扫描器。它使用这样一种模式,匹配输入字串,并将字串转化成符号(token)。符号是这些字串的数字表示。上图可以说明。
当Lex在输入流中找到了变量名,就把它们放入符号表。符号表也同时保存着其它一些信息,比如数据类型(整形还是实形)和变量在内存中的地址。接下来所有对变量的引用都会通过符号表+索引的形式来实现。
Yacc生成语法分析的C代码,或者说是解析器。Yacc利用语法规则,来分析Lex产生的符号,并构造语法树。语法树把符号理清了层次结构。下一步,代码生成,对语法树进行深度优先的遍历来生成代码。有些编译器产生机器码,另外一些,如上图所示,输出的是汇编码。
(yyparse) source
bas.y -> yacc -> y.tab.c |
| \ |
| \ v
y.tab.h cc -> bas.exe
| / |
| / |
bas.l -> lex -> lex.yy.c v
(yylex) 编译输出
图1.2 用Lex/Yacc构造一个编译器
图1.2说明了保用lex和yacc时文件名的转换。我们先设定我们的目标是写一个BASIC编译器。首先,我们使用lex来识别所有的模式匹配,使用yacc来识别语法规则。创建你自己的编译器,bas.exe,的命令,如下:
yacc –d bas.y # 创建 y.tab.h, y.tab.c
lex bas.l # 创建 lex.yy.c
cc lex.yy.c y.tab.c –obas.exe # 编译链接
Yacc从bas.y中读出语法描述,并生成解析器,主要部分是y.tab.c文件中的yyparse。bas.y包含了符号声明的头文件,-d的参数使yacc生成符号的定义并把它们放置在头文件y.tab.h中。Lex读出bas.l中的模式描述,包含y.tab.h头文件,并生成词法分析器,主要部分是yylex,在文件lex.yy.c中。
最后,词法分析器和语法解析器都被编译,并链接在一起,形成一个可执行文件,bas.exe。在它的main函数中,我们调用yyparse来驱动整个编译器。函数yyparse中自动调用yylex来获得每一个符号。
分享到:
相关推荐
《lex&yacc教程》是一份深入探讨这两个经典解析工具的教育资源。lex(也称为flex)和yacc(也称为bison)是用于编译器构造和语言解析的开源工具,广泛应用于计算机科学领域,尤其是编译原理和解析技术的学习与实践中...
《lex&yacc英文第二版》是一本深入探讨词法分析器lex和语法分析器yacc的权威书籍,对于理解编译原理和技术有着极其重要的价值。lex和yacc是两个在软件开发领域广泛使用的工具,它们是构建解析器和编译器的核心组件,...
《lex&yacc》这本书是编译原理领域中的一本经典读物,它深入浅出地介绍了如何使用lex和yacc这两个工具进行编译器构造。lex(也称为flex)和yacc(也称为bison)是两种强大的开源工具,分别用于词法分析和语法分析,...
《Unix下的Lex与Yacc工具详解》 Unix操作系统中,有两个强大的工具——Lex(词法分析生成器)和Yacc(语法分析生成器),它们在软件开发,尤其是编译器和解释器的构建中扮演着核心角色。这两个工具分别负责处理源...
Lex Yacc 第二版 英文版, 经典的lex与Yacc学习资料,虽然是扫描版本但代码部分非常清晰(先前我找到的中文版本代码部分根本看不清楚)
《lex&yacc语言解析》 在计算机科学领域,Lex和Yacc是两个重要的工具,它们主要用于编写编译器和解析器。这两个工具是构建语言处理程序的基础,尤其是在实现词法分析和语法分析阶段。 首先,让我们来了解一下什么...
Lex & Yacc 2ed
《Lex&Yacc详解》是关于编译器设计与实现的深入学习资料,它涵盖了使用Lex和Yacc工具进行词法分析和语法分析的核心技术。这些工具在编译原理领域中占据着重要的地位,因为它们可以帮助开发者高效地构建解析器,从而...
很多人都知道lex&yacc,特别是计算机科班毕业的。因为在unix上自带的bshell就有这些功能。 cygwin里面也有这些。 可是,这种基本的功能,在win32平台下,微软似乎忘了。 有个外国人写了个软件Parser Generator (bum...
"lex与yacc编译原理" lex和yacc是编译原理中两个重要的组件,分别负责词法分析和语法分析。本文档将详细介绍lex和yacc的基本概念、使用方法和应用场景。 Lex是词法分析器的生成器,能够将输入拆分成有意义的单元...
从lex&yacc说到编译器
在lex中,每个识别到的词汇单元都会被赋予一个特定的值,这个值通常用于传递给yacc,以便于yacc进行更进一步的语法分析。 ##### 6.2 递归:“右即错” 在yacc中,递归规则需要特别注意其左递归和右递归的处理方式...
该文档主要讲解了如何用lex和yacc组建一个编译器。并描述了如何做一个复杂的计算器。 This document explains how to construct a compiler using lex and yacc. Lex and yacc are tools used to generate lexical ...
编译原理 lex & yacc qq
总之,Lex和Yacc在编译原理课程设计中扮演着重要角色,它们提供了一种系统化的方法来构建编译器,帮助学生理解和掌握编译器的工作原理。通过东南大学的课程设计,学生不仅能提升编程技能,还能对软件开发的底层机制...
介绍如何使用lex和yacc(用于生成词法分析器和解析器的工具)构造编译器。
《Windows下的Lex与Yacc编译器:便捷的语法分析工具》 在计算机科学领域,编译器是至关重要的工具,它们将高级编程语言转换为机器可理解的指令。其中,Lex和Yacc(现在更常称为Flex和Bison)是两个著名的编译器构造...
在《LEX & YACC TUTORIAL》这份教程中,Tom Niemann很可能详细介绍了如何使用这两个工具,包括如何编写LEX和YACC的输入文件,如何定义词法规则和语法规则,以及如何调试和优化生成的解析器。此外,他还可能讨论了...
非常通俗易懂的讲解lex和yacc的文档,教科书上把lex的作用的作用叫做“词法分析 lexical analysis ”,这个中文叫法非常让人看不明白(叫做“符号提取”更合适),其实从它的英文单词lexical上来看他的意思其实是...
lex & yacc 简明指南(英文原版)