编译原理王生原(第二章)

合集下载

编译原理 第2章 词法分析

编译原理 第2章 词法分析

㈢单词二元式编码
经词法分析后,单词用二元式 (code,val) 表示。 code表示单词的种别,用整数码表示。单词种别表示单词 的语法特性,在语法分析时使用。 val表示单词的值,在本书中用字符串表示。单词值表示了 单词的语义特性,在语义分析时使用。
㈣编码原则
通常将标识符归为一种,常数按类型分种,基本字、运算 符及界符采用一符一种。 如果一个种别仅包含一个单词,那么单词种别就可代表该 单词,无需给出单词值。为了输入和处理的方便,无意义的 单词值用字符串"NUL"表示。若一个种别含有多个单词,除 给出种别外,还需给出它的值。
②预处理主要工作 删除注释 删除续行符,以及后续换行符(0AH)。 换行符、TAB和空格具有界符作用,预处理时通常予以保留。 在后面的分析中可以看到,它们的存在反而给后续的单词识别 带来方便。为了简化判断,可在预处理时,将换行符和TAB统 一替换为空格。 大多数语言(除C语言)不区分大小写,可在预处理时,将 大写字母变换成小写字母,或相反,以方便后续处理。 对于受书写格式限制的语言(例Fortran和Cobol),还应识 别标号区,正确给出语句标号。识别续行标志,把相继行捻接 在一起,给出语句结束符。 上述源程序经预处理后,扫描缓冲区中的内容如下所示:
第2章 词法分析
2.1 词法分析器的设计考虑及手工构造
2.1.1 单词类型及二元式编码 2.1.2 源程序的输入及预处理 2.1.3 基本字的识别和超前搜索 2.1.4 遍 2.1.5 状态转换图和词法分析器的手工构造
2.2 正规式、自动机及词法分析器的自动生成
2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 基本概念 正规式与正规集 确定有限自动机(DFA) 非确定有限自动机(NFA) 正规式与确定有限自动机的等价性

编译原理第二章教案

编译原理第二章教案

第2章可计算函数程序设计语言2.1 引言本章提出一种用于对可计算函数进行编程的语言,叫做PCF语言。

它是基于类型化λ演算的函数式语言。

该语言的设计目的是便于后面各章的分析和讨论,而不是把它作为编写大程序的实际语言。

但是若改进它的外观语法,则还是可用它来方便地写出很多函数式程序。

本章还讨论该语言的公理语义、操作语义和指称语义,但不深入到有关基本定理的证明。

本章的主要议题如下:(1)通过一些例子来介绍类型化λ演算及基于它的语言的语法和语义。

(2)用不动点算子来处理函数的递归定义。

(3)讨论该语言的公理语义、操作语义和指称语义,并总结它们之间的联系。

(4)通过一些例子来说明,该语言虽然简单,但是一些基本的编程方法都可以用该语言来实现。

(5)用操作语义来研究该语言的表达能力和局限。

(6)介绍PCF的一些扩充和衍生。

本章主要目的是通过对基于λ演算的语言的介绍,获得这种语言编程能力的感性认识,并总结可用于多种语言研究一般性质和技术。

其中操作语义在本章将比指称语义讨论得深入一些,因为以后各章将集中在指称语义和公理语义上。

本章通过阐明一些熟悉的程序设计构造可以用λ演算来表示,由此看出λ演算在程序设计中的表达能力,并且是从正反两面展示PCF的表达能力。

本章以PCF的扩充和衍生的简短概述结束,它们有实际或理论的意义。

对那些熟悉指称语义的人来说,需要指出的是,本书中λ演算的使用和指称语义中λ演算的传统使用是有区别的。

一个区别是定型,在指称语义的早期研究中,通常把无类型的λ演算作为描述指称语义的元语言,而现在用类型化λ演算。

使用类型化λ演算可以区分每个表达式定义的值的种类,因而可从几方面简化技术分析。

另一个区别是,本书把PCF本身当成一个程序设计语言,而不是作为给出其它语言语义的元语言。

这样做的一个理由是体现类型化λ演算的表达能力,另一个理由是暗示λ演算不仅可用于指称语义,在程序设计语言分析和设计方面,它还用来研究操作和语用(pragmatic)问题。

编译原理第二章

编译原理第二章
由字母表中的符号所组成的任何有穷序列称之为该字母表上的 符号串,也称作“字”。 ∑*(Kleene闭包):表示∑上的所有字符串的全体,ε也在其中。Ф表 示不含任何元素的空集{}。 例如:若∑={a,b},则∑*={ε,a,b ,aa,ab,ba,bb,aaa,…}
上一页
下一页
11
▪ 符号串的术语
设s是符号串 前缀:移走s的尾部的零个或多于零个符号 后缀:删去s的头部的零个或多于零个符号 子串:从s中删去一个前缀和一个后缀 子序列:从s中删去零个或多于零个符号(这些符号不要求是连续的) 逆转:将S中的符号按相反次序写出而得到的符号串。 长度:是该符号串中的符号的数目。例如|aab|=3,|ε|=0。 真前缀,真后缀,真子串: x≠sx ≠ 例子:符号串s=banana 前缀:,b,ba,ban,bana,banan,banana 后缀:banana,anana,nana,ana,na,a, 子串:banana,anana,banan,anan,…, 子序列: baa(这些符号不要求是连续的) 逆转(用SR表示):ananab 长度:banana=6
β ε +T +T +T
ε ε
上一页
下一页
23
3.3 最左推导与最右推导
对于推导αβ,如果每一步都是对α中的最左非终结符进行替换 的,则我们称这种推导为最左推导,如果每一步都是对α中的最 右非终结符进行替换的,则我们称这种替换为最右推导。
例2-2:对于文法:E→E+ E|E*E|(E)|i 我们看对于(i*i+i)的推导 最左推导:E (E) (E+E) (E*E+E) (i*E+E) (i*i+E) (i*i+i) 最右推导:E (E) (E+E) (E+i) (E*E+i) (E*i+i) (i*i+i)

编译原理教程课后习题答案第二章

编译原理教程课后习题答案第二章

第二章 词法分析2.1 完成下列选择题:(1) 词法分析器的输出结果是。

a. 单词的种别编码b. 单词在符号表中的位置c. 单词的种别编码和自身值d. 单词自身值(2) 正规式M1和M2等价是指。

a. M1和M2的状态数相等b. M1和M2的有向边条数相等c. M1和M2所识别的语言集相等d. M1和M2状态数和有向边条数相等(3) DFA M(见图2-1)接受的字集为。

a. 以0开头的二进制数组成的集合b. 以0结尾的二进制数组成的集合c. 含奇数个0的二进制数组成的集合d. 含偶数个0的二进制数组成的集合【解答】(1) c (2) c (3) d图2-1 习题2.1的DFA M2.2 什么是扫描器?扫描器的功能是什么?【解答】 扫描器就是词法分析器,它接受输入的源程序,对源程序进行词法分析并识别出一个个单词符号,其输出结果是单词符号,供语法分析器使用。

通常是把词法分析器作为一个子程序,每当词法分析器需要一个单词符号时就调用这个子程序。

每次调用时,词法分析器就从输入串中识别出一个单词符号交给语法分析器。

2.3 设M=({x,y}, {a,b}, f, x, {y})为一非确定的有限自动机,其中f 定义如下:f(x,a)={x,y} f {x,b}={y}f(y,a)=Φ f{y,b}={x,y}试构造相应的确定有限自动机M ′。

【解答】 对照自动机的定义M=(S,Σ,f,So,Z),由f 的定义可知f(x,a)、f(y,b)均为多值函数,因此M 是一非确定有限自动机。

先画出NFA M 相应的状态图,如图2-2所示。

图2-2 习题2.3的NFA M 用子集法构造状态转换矩阵,如表表2-1 状态转换矩阵1b将转换矩阵中的所有子集重新命名,形成表2-2所示的状态转换矩阵,即得到 M ′=({0,1,2},{a,b},f,0,{1,2}),其状态转换图如图2-3所示。

表2-2 状态转换矩阵将图2-3所示的DFA M ′最小化。

编译原理第二章课件

编译原理第二章课件
例1:文法G: S aSb | ab
L(G)={anbn|n≥1}
28
2.2.2 文法的分类
3型文法(又称线性文法、正则文法、正 规文法)
➢ 如果对文法G中的任一产生式均限制为形如: AB 或 A
其中: A,B∈VN , ∈VT 则称文法G为3型文 法。 ➢ 上述形式的3型文法也称为右线性文法。 ➢ 如果对文法G中的任一产生式均限制为形如:
A0 = { } A1 = { a,b } A2 = AA ={ aa,ab,ba,bb } A3 = A2A ={ aaa,aab,aba,abb,baa,bab,bba,bbb }
……
An =An-1A = AAA……A
12
2.1 基本概念
10.符号串集合的正闭包
设A为符号串的集合,则称A+为符号串集A的 正闭包.具体定义如下:
文法
字符串集合
16
2.2 .1 文法的定义
2.2.1 文法(Grammar)的定义 文法的定义
一个文法G是一个四元组: G = ( VN, VT, S, P )
其中:
➢ VT (Terminal Vocabulary)是一个非空的有限集合,
它的每个元素称为终极符号或终极符,一般用小 写字母表示。 从语法分析的角度看,终极符号是 一个语言不可再分的基本符号。
可合并为一个,缩写为:
P 1 | 2 | … | n
其中,每个i 称为 P 的一个候选式,符号“|” 读作“或” 。
21
⑥一个文法的核心是产生式。 一般约定:
用< >括起来或 大写字母:非终结符 不用< >括起来或小写字母:终结符
22
例1
G =(VN,VT, S, P) 其中:VN={ S , A}

编译原理―第2章 前后文无关文法和语言课件

编译原理―第2章 前后文无关文法和语言课件
?一组终结符号不能被替换的符号单词符号?一组非终结符号能够被替换为终结符号或非终结符号语法单位?一个开始符号从这个符号开始替换最大语法单位程序?一组产生式替换规则把左边的字符串替换为右边的字符串222文法和语言的形式定义19?关键思路?从文法的开始符号出发?反复使用产生式对非终结符进行替换展开?直到整个字符串中不再包含非终结符?这时得到了这个文法的一个句子一个程序?这个过程称为推导222文法和语言的形式定义20?文法的形式定义?产生式规则?产生式是一个有序对通常写作或
符号串集合的方幂: 设A是符号串的集合,则称Ai为符号串集A的 方幂,其中i是非负整数。具体定义如下:
A0 ={ε} A1 =A, A2=AA Ak= AA......A(k个)
11
2.2.1 基本概念和术语
集合的闭包
闭包
集合Σ的闭包Σ*定义如下:Σ*=Σ0∪Σ1∪Σ2∪Σ3∪… 例:设有字母表Σ={0,1},则
从文法的开始符号出发 反复使用产生式,对非终结符进行替换(展开) 直到整个字符串中不再包含非终结符 这时,得到了这个文法的一个句子(一个程序) 这个过程称为推导
19
2.2.2 文法和语言的形式定义
文法的形式定义
产生式(规则)
产生式是一个有序对(α, β),通常写作α→β(或α::=β)
Σ*=Σ0∪Σ1∪Σ2∪…={ε,0,1,00,01,10,11,000,…},即Σ*表示Σ上所有有穷长 的串的集合。
正闭包
Σ+ = Σ1∪Σ2∪Σ3∪…称为Σ的正闭包。 +表示上的除ε外的所有用穷长串的集合。
Σ*= Σ0∪Σ+ Σ+=ΣΣ*=Σ*Σ
12
2.2.1 基本概念和术语
例题 定义标识符是由字母开头、后跟字母或数字的任意组合构成, 设A={a,b,…,z},B={0,1,…,9},将所有标识符的集合用A和B的运算 来表示。

编译原理第二章习题答案

编译原理第二章习题答案

第2章习题解答1.文法G[S]为:S->Ac|aBA->abB->bc写出L(G[S])的全部元素[答案]S=>Ac=>abc或S=>aB=>abc所以L(G[S])={abc}2.文法G[N]为:N->D|NDD->0|1|2|3|4|5|6|7|8|9G[N]的语言是什么?[答案]G[N]的语言是V。

V={0,1,2,3,4,5,6,7,8,9}N=>ND=>NDD.... =>NDDDD...D=>D……D3.已知文法G[S]:Sf dAB Af aA|a B|bB问:相应的正规式是什么?G[S]能否改写成为等价的正规文法? [答案]正规式是daa*b* ;相应的正规文法为(由自动机化简来):G[S]:S —dA A —a|aB B —aB|a|b|bC C —bC|b也可为(观察得来):G[S]:S —dA A —a|aA|aB B —bB| &4.已知文法G[Z]:Z->aZb|ab写出L(G[Z])的全部元素。

[答案]Z=>aZb=>aaZbb=>aaa..Z...bbb=> aaa..ab...bbbL(G[Z])={a n b n|n>=1}5.给出语言{a n b n c1 n>=1,m>=0}的上下文无关文法。

[分析]本题难度不大,主要是考上下文无关文法的基本概念。

上下文无关文法的基本定义是:A-> B ,A € Vn ,B€( VnU Vt) *,注意关键问题是保证a n b n的成立,即“ a与b的个数要相等”,为此,可以用一条形如A->aAb|ab的产生式即可解决。

[答案]构造上下文无关文法如下:S->AB|AA->aAb|abB->Bc|c[扩展]凡是诸如此类的题都应按此思路进行,本题可做为一个基本代表。

基本思路是这样的:要求符合a n b n c m,因为a与b要求个数相等,所以把它们应看作一个整体单元进行,而c m做为另一个单位,初步产生式就应写为S->AB,其中A推出a n b n,B推出c m。

编译原理王生原(第二章)_图文

编译原理王生原(第二章)_图文

YACC 源程序举例 (续)
%% input line
exp
%%
: /* empty string */ | input line ; : '\n' | exp '\n' { printf ("\t%d\n", $1); } | error ‘\n’ ; : INTEGER { $$ = $1; } | exp '+' exp { $$ = $1 + $3; } | exp '*' exp { $$ = $1 * $3; } | '(' exp ')' { $$ = $2; } ;
其他辅助工具
MIPS SPIM (Wisconsin大学 )
/~larus/spim.html
Eclipse /
Lex & YACC 简介
Lex 与 YACC 工具
Lex & YACC 简介
项目框架的总体结构
当前项目中编译器的逻辑结构
项目框架的总体结构
当前项目中编译器的逻辑结构
实验内容
四个阶段
实验内容
四个阶段
Phase 1 词法和语法分析
借助 Lex 和 Yacc 实现词法和语法分析 一遍扫描后产生一种高级中间表示 (实验指定的抽象语法树 AST)
Phase 2 语义分析
Lex 源程序式样
%} 定义节
}%
/* 可选,包含头文件、宏定义或全局 C 代码*/
辅助定义节 /*可选,在此可以为正规式定义宏名字*/
%%
规则节
/* 源程序的主体,不可或缺,由模式 (Lex 正规表达式)和动作( C 语句或
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

assign varref i intconst 0
les varref i varref numTimes
varref powerbook
newobj Mac
assign print
varref powerbook
varref i add
stringconst "sad\n"
varref i intconst 1
program class Computer <empty> vardecl cpu inttype func Crash voidtype formals vardecl numTimes inttype stmtblock vardecl i inttype for ……
05 级至今 Decaf / Mind 项目
以 Mind 项目为基础,开发语言由 C++ 改为 Java
项目回顾
《编译原理》
清华 Decaf / Mind 项目
参与项目开发的部分同学
杨俊峰(Stanford 助教) 张迎辉(计99-计00助教) 毛雁华(计00-计01助教,X86后端) 刘天淼(计01助教,Windows环境) 唐 硕(计02助教,TOOL) 梁英毅(计03-计05助教,Java 版,Mind,RA) 张 铎(计05-计07助教,改 Mind 至 Java 版) 蒋 波(参与 Decaf 语言规范的翻译 ) (还有许多同学没有一一列举)
实验内容
《编译原理》
四个阶段
Decaf/Mind 程序
语义分析
字符串
词法分析
单词序列
语法分析
抽象语法树
阶段一
(1)构建符号表; (2)非上下文无关
语法检查; (3)类型检查
三地
生成 汇编代码 址码
中间代码优化
(1)划分基本块; (2)数据流分析;
带标注的抽
阶段二
象语法树 三地
址码
中间代码生成
MIPS汇编代码
阶段四
阶段三Βιβλιοθήκη 实验内容《编译原理》 四个阶段
Phase 1 词法和语法分析
借助 Lex 和 Yacc 实现词法和语法分析 一遍扫描后产生一种高级中间表示 (实验指定的抽象语法树 AST)
Phase 2 语义分析
遍历抽象语法树构造符号表、实现静态语 义分析,产生带标注的抽象语法树
Phase 3 生成三地址码 TAC
}
string-constant
实验内容
《编译原理》
Phase 2
遍历 AST 构造符号表、实现静态语义分析
GLOBAL SCOPE: (1,1) -> class Computer (10,1) -> class Mac : Computer (17,1) -> class Main CLASS SCOPE OF 'Computer': (2,9) -> variable cpu : int (3,10) -> function Crash : class : Computer->int->void FORMAL SCOPE OF 'Crash': (3,10) -> variable @this : class : Computer (3,20) -> variable @numTimes : int LOCAL SCOPE: (4,13) -> variable i : int CLASS SCOPE OF 'Mac': (11,9) -> variable mouse : int (12,10) -> function Crash : class : Mac->int->void FORMAL SCOPE OF 'Crash': (12,10) -> variable @this : class : Mac (12,20) -> variable @numTimes : int LOCAL SCOPE: CLASS SCOPE OF 'Main': (18,17) -> static function main : void FORMAL SCOPE OF 'main': LOCAL SCOPE: (19,19) -> variable powerbook : class : Mac
}
class Mac extends Computer { int mouse; void Crash(int numTimes) { Print("ack!"); }
}
class Main { static void main() { class Mac powerbook; powerbook = new Mac(); powerbook.Crash(2); }
定义 Decaf 语法的一个 可能的上下 文无关文法 G[Program]
(片断)
实验内容
《编译原理》
Phase 1
借助 Lex 和 Yacc 实现词法和语法分析
class
Program ClassList
生成一种高级中间表示
program
(抽象语法树 AST) class Main <empty>
Stanford University Massachusetts Institute of Technology University of Tennessee Brown University Texas A&M University Southern Adventist University ……
ClassDefn
static func main voidtype
identifier ExtendsClause‘{’FieldList ‘}’
<empty> FieldList
FunctionDefn
formals
<empty> static Type identifier ‘(’Farmals ‘)’ StmBlock
第二讲
《编译原理》
Decaf / Mind 编译实验项目
Decaf / Mind 编译实验项目 《编译原理》
项目回顾 项目框架的总体结构
实验内容 实验环境 实验安排 考核方案
项目回顾
《编译原理》
Decaf 语言
一种强类型的、单继承的简单面向对象语言 许多大学用作教学语言
| Type identifier '(' Formals ')' StmtBlock StmtBlock ® '{' StmtList '}' StmtList ® StmtList Stmt | <empty> Stmt ® VariableDecl | IfStmt | WhileStmt | … | PrintStmt ';' | StmtBlock Expr ® Constant | Expr '+' Expr | … Constant ® int_const | string_const | … ExprList ® ExprList ',' Expr Expr WhileStmt ® while '(' Expr ')' Stmt PrintStmt ® print '(' ExprList ')' ……
项目回顾
《编译原理》
清华 Decaf / Mind 项目
始于计算机系98级本科生《编译原理》课 基于 Stanford University 课程 CS143
/class/cs143/
根据实际需要进行了一定的修改和简化
如:适应 Windows 平台 增加目标代码在 X86 上的执行 02 级的 TOOL 项目
Phase 4 基于 TAC 实现一些简单的数据流分析
实验内容
《编译原理》
Phase 1
借助 Lex 和 Yacc 实现词法和语法分析
class Computer { int cpu; void Crash(int numTimes) { int i; for (i = 0; i < numTimes; i = i + 1) Print("sad\n"); }
项目框架的总体结构
《编译原理》
当前项目中编译器的逻辑结构
Decaf/Mind 程序
字符串
词法分析
单词序列
抽象语法树
语法分析
语义分析
带标注的抽象语法树
三地址码
三地址码
生成 汇编代码
中间代码优化
中间代码生成
MIPS汇编代码
项目框架的总体结构
《编译原理》
当前项目中编译器的逻辑结构
Decaf/Mind 程序
void
<empty> ‘{’ StmtList ‘}’
stmtblock print
stringconst "hello world"
比较:语法分析结果 (具体语法树 CST)
PrintStmt
‘;’
print ‘(’ ExprList ‘)’
Expr
Constant
class Main { static void main() { print("hello world"); }
03 级之后经历了3 次较大改动
项目回顾
《编译原理》
相关文档
最新文档