`
hellhell
  • 浏览: 24070 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

翻译一份lex & yacc教程,希望不要烂尾

阅读更多
译者按:打算翻译一份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来获得每一个符号。
分享到:
评论
1 楼 android_mini 2011-03-31  
怎么没有后续翻译了,还有lz把原文链接也贴出来吧?

相关推荐

    lex&yacc 教程

    《lex&yacc教程》是一份深入探讨这两个经典解析工具的教育资源。lex(也称为flex)和yacc(也称为bison)是用于编译器构造和语言解析的开源工具,广泛应用于计算机科学领域,尤其是编译原理和解析技术的学习与实践中...

    lex&yacc英文第二版

    《lex&yacc英文第二版》是一本深入探讨词法分析器lex和语法分析器yacc的权威书籍,对于理解编译原理和技术有着极其重要的价值。lex和yacc是两个在软件开发领域广泛使用的工具,它们是构建解析器和编译器的核心组件,...

    \lex&yacc

    《lex&yacc》这本书是编译原理领域中的一本经典读物,它深入浅出地介绍了如何使用lex和yacc这两个工具进行编译器构造。lex(也称为flex)和yacc(也称为bison)是两种强大的开源工具,分别用于词法分析和语法分析,...

    lex&yacc.doc

    《Unix下的Lex与Yacc工具详解》 Unix操作系统中,有两个强大的工具——Lex(词法分析生成器)和Yacc(语法分析生成器),它们在软件开发,尤其是编译器和解释器的构建中扮演着核心角色。这两个工具分别负责处理源...

    Lex & Yacc 2ed.pdf

    Lex Yacc 第二版 英文版, 经典的lex与Yacc学习资料,虽然是扫描版本但代码部分非常清晰(先前我找到的中文版本代码部分根本看不清楚)

    lex&yacc语言解析

    《lex&yacc语言解析》 在计算机科学领域,Lex和Yacc是两个重要的工具,它们主要用于编写编译器和解析器。这两个工具是构建语言处理程序的基础,尤其是在实现词法分析和语法分析阶段。 首先,让我们来了解一下什么...

    Lex & Yacc 2ed

    Lex & Yacc 2ed

    Lex&Yacc详解

    《Lex&Yacc详解》是关于编译器设计与实现的深入学习资料,它涵盖了使用Lex和Yacc工具进行词法分析和语法分析的核心技术。这些工具在编译原理领域中占据着重要的地位,因为它们可以帮助开发者高效地构建解析器,从而...

    用lex&yacc制作的计算器

    很多人都知道lex&yacc,特别是计算机科班毕业的。因为在unix上自带的bshell就有这些功能。 cygwin里面也有这些。 可是,这种基本的功能,在win32平台下,微软似乎忘了。 有个外国人写了个软件Parser Generator (bum...

    lex与yacc.pdf

    "lex与yacc编译原理" lex和yacc是编译原理中两个重要的组件,分别负责词法分析和语法分析。本文档将详细介绍lex和yacc的基本概念、使用方法和应用场景。 Lex是词法分析器的生成器,能够将输入拆分成有意义的单元...

    从lex&yacc说到编译器

    从lex&yacc说到编译器

    lex & yacc

    在lex中,每个识别到的词汇单元都会被赋予一个特定的值,这个值通常用于传递给yacc,以便于yacc进行更进一步的语法分析。 ##### 6.2 递归:“右即错” 在yacc中,递归规则需要特别注意其左递归和右递归的处理方式...

    Lex和Yacc入门(A COMPACT GUIDE TO Lex&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;编译原理

    编译原理 lex & yacc qq

    Lex & Yacc

    总之,Lex和Yacc在编译原理课程设计中扮演着重要角色,它们提供了一种系统化的方法来构建编译器,帮助学生理解和掌握编译器的工作原理。通过东南大学的课程设计,学生不仅能提升编程技能,还能对软件开发的底层机制...

    Lex&Yacc精简指南A Compact Guide to Lex & Yacc

    介绍如何使用lex和yacc(用于生成词法分析器和解析器的工具)构造编译器。

    Windows的lex&yacc编译器

    《Windows下的Lex与Yacc编译器:便捷的语法分析工具》 在计算机科学领域,编译器是至关重要的工具,它们将高级编程语言转换为机器可理解的指令。其中,Lex和Yacc(现在更常称为Flex和Bison)是两个著名的编译器构造...

    LEX & YACC TUTORIAL by Tom Niemann

    在《LEX & YACC TUTORIAL》这份教程中,Tom Niemann很可能详细介绍了如何使用这两个工具,包括如何编写LEX和YACC的输入文件,如何定义词法规则和语法规则,以及如何调试和优化生成的解析器。此外,他还可能讨论了...

    Lex和Yacc教程.pdf

    非常通俗易懂的讲解lex和yacc的文档,教科书上把lex的作用的作用叫做“词法分析 lexical analysis ”,这个中文叫法非常让人看不明白(叫做“符号提取”更合适),其实从它的英文单词lexical上来看他的意思其实是...

    lex & yacc 简明指南(英文原版)

    lex & yacc 简明指南(英文原版)

Global site tag (gtag.js) - Google Analytics