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

合集下载

编译原理 第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 语句或

《编译原理》课后习题答案第二章

《编译原理》课后习题答案第二章
此文法没有多余规则,所以消去左递归后的文法就是G′[S]
4、试为文法G[P]:
P∷=begin S end S∷=A|C
A∷=V:=E C∷=if E then S
E∷=V E∷=E+V V∷=i
采用某种程序设计语言构造递归下降识别程序。
解:由于文法存在左递归,进行文法等价变换,得到等价文法G′[P]:
步骤三检查可得f的值与原有的优先矩阵一致所以上表函数即为所求优先函数bell有向图法形式化步骤一构造布尔矩阵b步骤二使用warshall算法构造布尔矩阵b1521步骤三则优先函数为
第二章
习题1
6.答:省略表示法:{1.3,1.33,1.333…};描述表示法:{1.3i|i=1,2,3…}
7.答:x+={0,12,123,1234…};
最小化:
(2)由e构造转换系统:
去ε弧及无用状态和死状态:
因为现在只有一个状态,所以无需再最小化,此时就是最小化.
13.解:建立方程组如下:
W=Ua+Vb ①
U=Va+c ②
V=Ub+c ③
把③代入②得,U=(Ub+c)a+c
=Uba+ca+c
把它改写成U=(ca+c){ba},因此U=(ca|c){ba} ④
follow(E)={#,)}
follow(E′)={#,)}
follow(T)={#,),+,-}
follow(T′)={#,),+,-}
follow(F)={*,/,#,),+,-}
识别输入符号串i*i-(i+i)/i,则识别过程
步骤 栈 输入 输出
0 #E i*i-(i+i)/i# E∷=TE′

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

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

第二章 词法分析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 ′最小化。

编译原理课件第二章

编译原理课件第二章

2
LL文法
从左到右扫描符号串,从左到右构建左推导,是递归下降式语法分析的基础。
3
LR文法
从左到右扫描符号串,从右到左构建右推导,是LR分析器(最常用的语法分析器) 的基础。
语义分析
符号表
类型检查
存储程序中所有标识符的信 息,如名字、值、数据类型、 作用域等。
对程序中的表达式进行类型 检查,检查其数据类型是否 匹配,发现类型错误,报告 错误信息。
目标代码生成
静态链接
所有和程序相关的代码和库都被合并到单一 静态程序中,生成的目标代码提供给编译器 后期处理和执行。
动态链接
当程序执行时,操作系统将共享库动态链接 到程序中。生成更小的目标程序,提高内存 效率。
中间代码生成
生成高级语言与目标代码之 间的中间代码。
优化器和中间代码
1 控制流分析
构建控制流图表示各 代码块的控制流程, 用于优化控制流程。
2 数据流分析
分析程序中信息的传 播和使用,用于优化 算法、寄存器分配和 内存使用。
3 中间代码
支持优化器的三元式、 四元式或间接三元式 形式,可以做优化、 可移植性更好。
编译原理第二章
编译器将源代码转换为目标代码的工具。编译过程分为三个部分:前端,优 化器和后端。本章介绍编译器的概述和基本部件。
编译器
前端
将源程序转换为内部表示, 检查其语法和语义。
优化器
将生成的代码优化,减少目 标代码的大小和时间成本。
后端
生成目标代码,包括中间代 码生成,寄存器分配和指令 生成。
词法分析
To ken
基本的词义单元是记号(Token),个记号表示源语言中的一个词、一个操作符、一个标点 符号或其他语法单元。

编译原理第二章

编译原理第二章

二义文法: G(E): E i|E+E|E*E|(E)
无二义文法:
G(E):E T | E+T T F | T*F F (E) | i
表达式 项|表达式+项 项 因子 | 项*因子 因子 (表达式) | i
2.3.2 语法分析树与二义性
消除二义性:
E
E
E*E
E +E
i
E
+
E
E
*
E i
G(E): E i|E+E|E*E|(E) 是二义文法。
语言的二义性:一个语言是二义性的,如果对它 不存在无二义性的文法。
可能存在G和G’,一个为二义的,一个为无二义的。 但L(G)=L(G’)
二义性问题是不可判定问题,即不存在一个算法, 它能在有限步骤内,确切地判定一个文法是否是 二义的。
可以找到一组二义文法的充分条件。
i
i
i
i
用一种层次观点看待表达式
按照优先集和结合性
2021/3/30
29
2.3.2 语法分析树与二义性
E
用一种层次观点看待表达式
i*i+i
i * (i + i)
i * (i * i + i)
T
i * i * (i + i) + i * i + i
F
取消二义性的文法
i
E T | E + T
T F | T * F
程序设计语言不是上下文无关语言,甚至 不是上下文有关语言。
L7={c| (a|b)*}不能由上下文无关文 法产生,甚至连上下文有关文法也不能产 生,只能由0型文法产生。
现今程序设计语言的语言结构,用上下文 无关文法描述就足够了。

编译原理课件第2章

编译原理课件第2章

第2章 词 法 分 析
在计算机内部,可以有不同的方式来表示记号的类别和属性。 一般情况下,记号的类别可以用整型编码或枚举类型表示,如表 2.1中每个记号类别可以用括号中的整型编码表示,如01表示const, 82表示id等。根据记号类别的不同,记号的属性的值可以有不同 的表示方法。relation的属性值是一个有限可枚举集合,可以用每 个属性值在集合中的位置来表示它,如1表示<,2表示<=,依此 类推。id的属性值是一个无限可枚举集合,因此,只能用每个标 识符的原始输入形式(字符串)来表示,如pi、draw_line等。字面 量的属性根据情况,其表示方式也不同,如数字字面量可由转义 后的实际值表示,如表示为3.1416而不是“3.1416”,而字符串字 面量就无需转义。
第2章 词 法 分 析
例2.1 对于语句:position := initial + rate * 60,可以识别出 下述序列:
标识符 特殊符号 标识符 特殊符号 标识符 特殊符号 数 字字面量
其中position、initial、rate均被识别为标识符,因为它们均符 合同一条规则,即以字母打头的字母数字串。记号至少含有两 个信息:一个是记号的类别,如“标识符”;另一个是记号的 值,如“position”。显然,如果把记号看作是一个类型的话,则 单词就是一个类型中的实例。由于我们总是说识别出一个标识 符,而不说识别出一个position或rate,因而将词法分析器识别出 的序列称为记号流。
第2章 词 法 分 析 例2.2 表达式mycount > 25由表2.2的三个记号组成。其中标 识符的属性值也可以由mycount在符号表中的入口(下标)来表示。
表2.2 记号的表示
第2章 词 法 分 析

编译原理第2章

编译原理第2章

第7页
宿迁学院三系
编译原理
高级语言机器语法描述
2.3 程序语言的语法描述
重点讨论上下文无关文法、语法分析树,以及文 重点讨论上下文无关文法、语法分析树, 法的二义性问题。 法的二义性问题。最后还将对形式语言进行简单 概述。 概述。 是一个有穷字母表, 设Σ是一个有穷字母表,它的每个元素称为一个 符号。 上的一个符号串是指由Σ 符号。 Σ上的一个符号串是指由Σ中的符号所构 成的一个有穷序列。 成的一个有穷序列。不包含任何符号的序列称为 空字,记为ε 表示Σ 空字,记为ε。用Σ﹡表示Σ上的所有符号串的 全体,空字ε也包括在其中。 全体,空字ε也包括在其中。
第4页
宿迁学院三系
编译原理
高级语言机器语法描述
语言的语法规则规定了如何从单词符号形成更大的 结构(即语法单位),换言之, ),换言之 结构(即语法单位),换言之,语法规则是语法单 位的形成规则。 位的形成规则。 一般程序语言的语法单位有:表达式、语句、 一般程序语言的语法单位有:表达式、语句、分程 函数、过程和程序等等。 序、函数、过程和程序等等。 语言的词法规则和语法规则定义了程序的形式结构, 语言的词法规则和语法规则定义了程序的形式结构, 是判断输人字符串是否构成一个形式上正确( 是判断输人字符串是否构成一个形式上正确(即合 程序的依据。 式)程序的依据。
第21页Βιβλιοθήκη 宿迁学院三系编译原理
高级语言机器语法描述
上下文无关文法定义一个语言的中心思想是: 上下文无关文法定义一个语言的中心思想是: 从文法的开始符号出发,反复连续使用产生式, 从文法的开始符号出发,反复连续使用产生式,对非 终结符施行替换和展开。 终结符施行替换和展开。 我们称αAβ直接推出αγβ αAβ直接推出αγβ, 我们称αAβ直接推出αγβ,即 αAβ=> αγβ 仅当A→ 是一个产生式, αβ∈(V A→γ 仅当A→γ是一个产生式,且αβ∈(VT∪VN)。 如果α 如果αl => α2 => ... => αn,则我们称这个序列 是从α αn的一个推导 的一个推导。 是从αl至αn的一个推导。 若存在一个从α 的推导,则称α 可推导出α 若存在一个从αl至αn的推导,则称αl可推导出αn.

编译原理第二章习题答案

编译原理第二章习题答案
令文法G[E]为:
¥
E->E+T|E-T
T->T*F|T/F|F
证明E+T*F是它的一个句型,指出这个句型的所有短语、直接短语和句柄。
[答案]
此句型对应语法树如右,故为此文法一个句型。
或者:因为存在推导序列:E=>E+T=>E+T*F,所以E+T*F句型
此句型相对于E的短语有:E+T-F;相对于T的短语有T*F,
17•下面的文法产生a的个数和b的个数相等的非空a,b$
S->aB|bA
B->bS|aBB|b
A->aS|bAA|a
其中非终结符B推出b比a的个数多1个的串,A则反之。
说明该文法是二义的。
对上述文法略作修改,使之非二义,并产生同样的语言。(略做修改的含义 是:不增加非终结符。)
[答案]
句子aabbab有两种不同的推导。
E->NT|D
T->FT|G
N->D|1|3|5|7|9
D->2|4|6|8
F->N|O
G->D|O
7•已知文法G:
)
E->E+T|E-T|T
T->T*F|T/F|F
F->(E)|i
试给出下述表达式的推导及语法树
(l)i; (2)i*i+i(3)i+i*i (4)i+(i+i)
[答案]
(1)E=>T=>F=>i
也可为(观察得来):G⑸:S—dAA—a|aA|aB B—bB| £
4•已知文法G[Z]:
Z->aZb|ab
<
写出L(G[Z])的全部元素。

《编译原理》第二章 文法和语言

《编译原理》第二章 文法和语言


可以产生语言 L。
A aAb | b
C. Z AbB
Ab
D. Z aAb
A aA | a
A aAb | b
(8)若一个文法是递归的,则它产生语言的句子个数 。 A. 必定是无穷的 B. 根据情况而定 C.是有穷个 D. 有穷个,但是个数很大 (9)文法 G : S xSx | y 所识别的语言是 。
3
B → Bb|ε G[S]产生的语言是什么?G[S]能否改写为等价的正则文法? 四、文法题 (1)文法 G[S ] :
S aSb | P P bPc | bQc Q Qa | a
(1)它是乔姆斯基的哪一种文法? (20S | 0 | 1A B 1A | 0B A 1 | 1S | 0B
符号串是 L(G) 中的句子。 A. 10100010011011 B. 0101001110010010 C.1101010011110111 D. 10100111011010110 (4)有限自动机能识别 。 A. 上下文无关文法 B. 上下文有关文法 C.正规文法 D. 短语文法 (5)由文法的开始符号经 0 步或多部推导产生的文法符号序列是 A. 短语 B. 句柄 C. 句型 D. 句子 (6)一个句型中的最左 称为该句型的句柄 。 A. 短语 B. 直接(简单)短语 C.素短语 D. 终结符号 (7)已知语言 L {a n bbn | n 1} ,则下列文法中, A. Z aZb | aAb B. A aAb
1
A. xyx C. x n yxn (n 0) (10)有文法 G[S ] :
B. ( xyx) * D. x * yx*
S aA | a | bc A aS | bB B aC | bA | b C aB | bS

最新编译原理第二章 习题与答案(修改后)word版本

最新编译原理第二章 习题与答案(修改后)word版本

第2章习题2-1 设有字母表A1 ={a,b,c,…,z},A2 ={0,1,…,9},试回答下列问题:(1) 字母表A1上长度为2的符号串有多少个?(2) 集合A1A2含有多少个元素?(3) 列出集合A1(A1∪A2)*中的全部长度不大于3的符号串。

2-2 试分别构造产生下列语言的文法:(1){a n b n|n≥0};(2){a n b m c p|n,m,p≥0};(3){a n#b n|n≥0}∪{c n#d n|n≥0};(4){w#w r# | w∈{0,1}*,w r是w的逆序排列 };(5)任何不是以0打头的所有奇整数所组成的集合;(6)所有由偶数个0和偶数个1所组成的符号串的集合。

2-3 试描述由下列文法所产生的语言的特点:(1)S→10S0S→aA A→bA A→a(2)S→SS S→1A0A→1A0A→ε(3)S→1A S→B0A→1A A→CB→B0B→C C→1C0C→ε(4)S→aSS S→a2-4 试证明文法S→AB|DC A→aA|a B→bBc|bc C→cC|c D→aDb|ab为二义性文法。

2-5 对于下列的文法S→AB|c A→bA|a B→aSb|c试给出句子bbaacb的最右推导,并指出各步直接推导所得句型的句柄;指出句子的全部短语。

2-6 化简下列各个文法(1) S→aABS|bCACd A→bAB|cSA|cCC B→bAB|cSB C→cS|c(2) S→aAB|E A→dDA|e B→bE|fC→c AB|dSD|a D→eA E→fA|g(3) S→ac|bA A→c BC B→SA C→bC|d2-7 消除下列文法中的ε-产生式(1) S→aAS|b A→cS|ε(2) S→aAA A→bAc|dAe|ε2-8 消除下列文法中的无用产生式和单产生式(1) S→aB|BC A→aA|c|aDb B→DB|C C→b D→B(2) S→SA|SB|A A→B|(S)|( ) B→[S]|[ ](3) E→E+T|T T→T*F|F F→P↑F|P P→(E)|i第2章习题答案2-1 答:(1) 26*26=676(2) 26*10=260(3) {a,b,c,...,z, a0,a1,...,a9, aa,...,az,...,zz, a00,a01,...,zzz},共有26+26*36+26*36*36=34658个2-2 解:(1) 对应文法为G(S)=({S},{a,b},{ S→ε| aSb },S)(2) 对应文法为G(S)=({S,X,Y},{a,b,c},{S→aS|X,X→bX|Y,Y→cY|ε },S)(3)对应文法为G(S)=({S,X,Y},{a,b,c,d,#}, {S→X,S→Y,X→aXb|#, Y→cYd|# },S)(4) G(S)=({S,W,R},{0,1,#}, {S→W#, W→0W0|1W1|# },S)(5) G(S)=({S,A,B,I,J},{0,1,2,3,4,5,6,7,8,9},{S→J|IBJ,B→0B|IB|ε, I→J|2|4|6|8, J→1|3|5|7|9},S)(6)对应文法为S→0A|1B|ε,A→0S|1C,B→0C|1S,C→1A|0B2-3 解:(1) 本文法构成的语言集为:L(G)={(10)n ab m a0n|n,m≥0}。

  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 次较大改动
项目回顾
《编译原理》
相关文档
最新文档