《编译与反编译技术》—第3章3.5节语法分析器的生成器

3.5 语法分析器的生成器
本节介绍一个语法分析器的自动产生工具YACC(Yet Another Compiler-Complier),YACC通过输入用户提供的语言的语法描述规格说明,基于LALR(1)语法分析的原理,自动构造一个该语言的语法分析器。YACC源程序又称YACC规格说明,同LEX源程序类似,也由说明部分、翻译规则和辅助过程三部分组成,形式如下:
[说明部分]
%%
翻译规则
[%%
辅助过程]
其中,用方括号括起来的部分可以省略,但是翻译规则部分不能省略。下面通过一个例子来说明YACC源程序。
例3.42 构造一个简单的台式计算器,该计算器读入一个算术表达式,然后计算并打印它的值。该算术表达式文法的产生式为:
E→E+T | T
T→T*F | F
F→(E) | digit
其中,digit表示0~9的单个数字。根据这一文法写出的YACC源程序如下:

%{
# include  <ctype .h>
# include  <stdio.h >
%}
% token  DIGIT
%%
lines   :   expr '\ n'         {printf ( "%d \ n",$1 ) ;}
        ;
expr    :   expr '+' term      {$$ = $1 + $3; }
        |   term
        ;
term    :   term ''factor     {$$ = $1  $3; }
        |   factor
        ;
factor  :   '(' expr ')'       {$$ = $2; }
        |   DIGIT
        ;
%%
yylex ( ) {
        int c;
        c = getchar ( );
        if ( isdigit (c) )
        {
           yylval =c-'0'
           return  DIGIT;
        }
       return c;
}

YACC源程序说明部分有任选的两部分:第一部分是处于“%{”和“%}”之间的部分,这里是一些普通的C语言的声明,在翻译规则或者辅助过程中用到的数据结构都需要在此进行声明。第二部分是文法记号的声明,一般以“%start S”的形式说明文法的开始符号,默认为第一条语法规则的左部符号。用 %token IF、DO、…、ID、… 的形式说明记号,记号被YACC赋予了不会与任何字符值冲突的数字值。
YACC源程序翻译规则部分中的每条规则由一个产生式和有关的语义动作组成。形如产生式A→α1 |α2 |…| αn,在YACC说明文件中写成
A : α1 { 语义动作1 }
| α2 { 语义动作2 }

| αn { 语义动作n }
;
在YACC产生式里用单引号括起来的单个字符,如'c',是由终结符号c组成的记号,没有用引号括起来,也没有被说明成token类型的字母数字串是非终结符号。产生式左部非终结符之后是一个冒号,右部候选式之间用竖线分隔。在规则的末尾用“;”表示规则的结束。YACC语义动作是用C语言描述的语句序列,用“$$”表示与产生式左部非终结符号相关的属性值,用“$i”表示与产生式右部第i个文法符号相关的属性值。由于语义动作都是放在产生式右部的尾部,所以,每当用某一个产生式进行归约时,执行与之相关的语义动作。这样,可以在每个$i值都计算出来之后再求$$的值。比如,在本例的YACC源程序中,产生式E→E+T | T及其相关的语义动作表示为
expr : expr '+' term {$$ = $1 + $3; }
| term
;
在第一个产生式中,非终结符term是右部的第三个文法符号,“+”是第二个文法符号。第一个产生式的语义动作是把右部expr的值和term的值相加,把结果赋给左部非终结符expr作为它的值。第二个产生式的语义动作描述省略,因为当右部只有一个文法符号时,语义动作缺省就是表示值的复写,即它的语义动作是{$$ = $1; }。
YACC源程序辅助过程部分由一些C语言函数组成,其中必须包含名为yylex的词法分析器,其他过程则视需要而定。每次调用函数yylex()时,得到一个二元式的记号:<记号,属性值>。返回的记号必须事先在YACC说明文件的第一部分中用%token说明,属性值必须通过YACC定义的变量yylval传给分析器。

时间: 2024-12-22 10:19:36

《编译与反编译技术》—第3章3.5节语法分析器的生成器的相关文章

《编译与反编译技术》—第2章2.1节词法分析器的需求分析

本节书摘来自华章出版社<编译与反编译技术>一书中的第2章,第2.1节词法分析器的需求分析,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问"华章计算机"公众号查看. 第2章 词法分析的理论与实践 词法分析是编译过程的第一步,也是编译过程必不可少的步骤.编译过程中执行词法分析的程序称为词法分析器.本章主要介绍词法分析器的手动构造和自动构造的原理. 2.1 词法分析器的需求分析 本节首先介绍词法分析器的功能及其输出的单词符号的表示方式,然后研究将词法分析独立出来的原因.

《编译与反编译技术》—第1章1.5节高级语言及其分类

本节书摘来自华章出版社<编译与反编译技术>一书中的第1章,第1.5节高级语言及其分类,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问"华章计算机"公众号查看. 1.5 高级语言及其分类 根据应用类型的不同,涌现了多种多样的面向人类的高级语言,其中典型的有如下几类形式. 1.过程式语言 过程式语言也称为强制式语言(Imperative Language).这类语言的特点是面向语句,命令驱动.一个用过程式语言编写的程序由一系列语句组成,语句的执行会引起若干存储单元中的值

《编译与反编译技术》—第1章1.8节UNIX/Linux环境中的make和makefile

本节书摘来自华章出版社<编译与反编译技术>一书中的第1章,第1.8节UNIX/Linux环境中的make和makefile ,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问"华章计算机"公众号查看. 1.8 UNIX/Linux环境中的make和makefile 在UNIX或Linux环境中,make是一个非常重要和经常使用的编译工具.无论是自己进行项目开发还是安装应用软件,都会经常用到make或make install.使用make工具,可以将大型的开发项目分解成

《编译与反编译技术》—第2章2.2词法分析器的设计

本节书摘来自华章出版社<编译与反编译技术>一书中的第2章,第2.2节词法分析器的设计,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问"华章计算机"公众号查看. 2.2 词法分析器的设计 下面将词法分析器作为一个独立的子程序来考虑其设计.本节主要探讨实现词法分析器的关键技术和词法分析器的手工实现. 2.2.1 输入及其处理 词法分析器的结构如图2-3所示.词法分析器首先将源程序文本输入一个缓冲区中,该缓冲区称为输入缓冲区,单词符号的识别可以直接在输入缓冲区中进行.但在

《编译与反编译技术实战》——第1章 实践的环境与工具 1.1 实践环境概述

第1章 实践的环境与工具 本书致力于通过实践及案例,从正反向两个角度介绍编译系统的一般构造原理和基本实现技术,本章首先对书中内容涉及的环境与工具进行简单介绍,这些工具都是编译与反编译过程中常用的工具. 1.1 实践环境概述 在编译过程中所涉及的环境主要是编译环境及工具链,常用的工具有词法分析生成器.语法分析生成器.编译器.汇编器.链接器等.在反编译过程中主要涉及反汇编器.静态或动态的调试与分析工具.下面对近年来流行的编译与反编译工具逐一进行简单介绍.

《编译与反编译技术实战 》一 第1章 实践的环境与工具

第1章 实践的环境与工具 本书致力于通过实践及案例,从正反向两个角度介绍编译系统的一般构造原理和基本实现技术,本章首先对书中内容涉及的环境与工具进行简单介绍,这些工具都是编译与反编译过程中常用的工具. 1.1 实践环境概述 在编译过程中所涉及的环境主要是编译环境及工具链,常用的工具有词法分析生成器.语法分析生成器.编译器.汇编器.链接器等.在反编译过程中主要涉及反汇编器.静态或动态的调试与分析工具.下面对近年来流行的编译与反编译工具逐一进行简单介绍.

《编译与反编译技术》—第2章2.3节有穷自动机

本节书摘来自华章出版社<编译与反编译技术>一书中的第2章,第2.3节有穷自动机,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问"华章计算机"公众号查看. 2.3 有穷自动机 前面在介绍词法分析程序的手工实现时引入了状态转换图,为了讨论词法分析器的自动生成,需要将上述状态图的概念形式化,即引入有穷自动机.有穷自动机分为确定的有穷自动机和非确定的有穷自动机. 2.3.1 确定的有穷自动机 定义2.9(确定的有穷自动机(Deterministic Finite Autom

《编译与反编译技术实战》——第1章实践的环境与工具

第1章实践的环境与工具本书致力于通过实践及案例,从正反向两个角度介绍编译系统的一般构造原理和基本实现技术,本章首先对书中内容涉及的环境与工具进行简单介绍,这些工具都是编译与反编译过程中常用的工具.

《编译与反编译技术》—第1章1.7节C语言程序的编译流程

本节书摘来自华章出版社<编译与反编译技术>一书中的第1章,第1.7节C语言程序的编译流程,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问"华章计算机"公众号查看. 1.7 C语言程序的编译流程 本节以C语言程序的编译流程为例,介绍实际的C语言编译器是如何运作的.通常把整个代码的编译流程分为编译过程和链接过程. 1.编译过程 编译过程可分为编译预处理.编译与优化.汇编等阶段. (1)编译预处理 编译预处理即读取C源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处