编译原理_-_陈火旺版_-_第三章new

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

状态之间用箭弧连结,箭弧 1
2
上的标记(字符)代表射出结 状态下可能出现的输入字符
Y 3
或字符类。
一张转换图只包含有限个状态,其中 有一个为初态,至少要有一个终态。
编译原理
正则表达式与有穷状态自动机 状态转换图 1. 状态转换图的引进
<id>::=L | <id>L | <id>D
入口
Y
L
B ∷= Ab
C ∷= Bb | b A ∷= a | Ba
{ai bj|i, j≥1}
a
b
Sa A b Z
G[Z]: Z::=Ab|Zb A::=a|Aa
{ai bj ck|i, j, k≥1}
a
b
Sa A bB
c c
Z
G[Z]: Z::=Bc|Zc B::=Ab|Bb
A::=a|Aa
2 例子 助忆符:直接用编码表示不便于记忆,
*
用 1 n 表示:从1出发,经过0步或
若干步,可以推出n。
*

所以 : 即 或
定义:假定G是一个文法,S 是它的开始符号。
如号果的句S型 是*一个,句则子。称文是法一G个所句产型生。的仅句含子终的结全符
体是一个语言,将它记为 L(G)。

3. 应用状态转换图来识别句子 一般的识别步骤如下:
步骤1 从开始状态开始,以它作为当前状态,并从 输入字符串x的最左字符开始,重复步骤2直到达到x的 右端为止。
步骤2 扫描x的下一字符(当前字符),在当前状态射 出的各个弧中找出标记有该字符的弧,并沿此弧前进, 以所达到的状态作为下一当前状态。
假定有输入字符串aababb,要识别它是否是其句子。
L (G ) {
|S ,
编译原理


V
* T
}
复习:程序语言的语法描述
最左推导:任何一步 都是对中的最 左非终结符进行替换。 最右推导:任何一步 都是对中的最 右非终结符进行替换。
编译原理
复习:程序语言的语法描述
用一张图表示一个句型的推导,称为语法树。
E (E) (E+E) (E*E+E) (i*E+E) (i*i+E) (i*i+i)
预处理 子程序
输入 列表 输入缓冲区
扫描器 扫描缓冲区
单词符号
词法分析器的结构
编译原理
一、输入、预处理
输入串放在输入缓冲区中。
预处理子程序:剔除无用的空白、跳格、 回车和换行等编辑性字符;区分标号区、 捻接续行和给出句末符等
扫描缓冲区


起点 搜索
指示器 指示器
编译原理
二、单词符号的识别:超前搜索
S
aababb
A
2A
ababb
B
3B
babb
A
4A
abb
B
5B
bb
A
6A
b
a a ba b b
ห้องสมุดไป่ตู้
7Z
4. 应用状态转换图为正则语言构造正则文法 例 正则语言 {(ab)nb2|n≥0}
a b a b a …b b S A B E F …C Z

a b bb S ABCZ
a b
因此,G[Z]: Z ∷= Cb
形式语言鸟瞰 2型(上下文无关文法,非确定下推自动机):
产生式形如: A 其中:A VN; (VT VN)*。
3型(正规文法,有限自动机): 产生式形如: A B 或 A 产其生中式:形如V:T*A;A,BB或VNA 其中: VT*;A,BVN
形式语言鸟瞰
0型(短语文法,图灵机):
产生式形如: 其中: (VT VN)*且至少含有一个非终结符; (VT VN)*
1型(上下文有关文法,线性界限自动机):
产生式形如: 其中:|| ||,仅 S 例外。
编译原理
复习:程序语言的语法描述
-
(
13
$LPAR
-
)
14
$RPAR
-
编译原理
空白 字母
0 数字 = + *
, ( ) 其它
字母或数字
非字母与数字 1
数字
3
非数字
5
6 非*
7 *
10
11 12
13 编译原理
* 2 4*
* 8 9
几点重要限制——不必使用超前搜索
所有基本字都是保留字;用户不能用它们作自 己的标识符
基本字作为特殊的标识符来处理;不用特殊的 状态图来识别,只要查保留字表。
字母 j
i 数字 k
\
l
GetChar( ); if (IsLetter( )) {…状态j的对应程序段…;} else if (IsDigit( )) {…状态k的对应程序段…;} else if (ch=‘/’) {…状态l的对应程序段…;} else {…错误处理…;}
编译原理
3 状态转换图的实现
UV={ | U & V }
V自身的 n次积记为 Vn=VV…V
规定V0={},令 V*=V0∪V1∪V2∪V3∪…
称V*是V的闭包;
记 V+=VV* ,称V+是V的正规闭包。
编译原理
复习:程序语言的语法描述
上下文无关文法的定义: 一个上下文无关文法G是一个四元式
G=(VT,VN,S,P),其中
如果基本字、标识符和常数(或标号)之间没 有确定的运算符或界符作间隔,则必须使用一 个空白符作间隔。 DO99K=1,10 要写成 DO 99 K=1,10
编译原理
3 状态转换图的实现
思想:每个状态结对应一小段程序。
做法:
1)对不含回路的分叉结,可用一个CASE语句或 一组IF-THEN-ELSE语句实现
因此用助忆符来表示编码。
编译原理
单词符号 种别编码 助忆符
内码值
DIM
1
$DIM
-
IF
2
$IF
-
DO
3
$DO
-
STOP
4
$STOP
-
END
5
$END
-
标识符
6
$ID
内部字符串
常数(数)
7
$INT 标准二进制形式
=
8
$ASSIGN
-
_
9
$PLUS
-
*
10
$STAR
-
**
11
$POWER
-

12
$COMMA
VT:终结符集合(非空) VN:非终结符集合(非空),且VT VN= S:文法的开始符号,SVN P:产生式集合(有限),每个产生式形式为
P, PVN, (VT VN)*
开始符S至少必须在某个产生式的左部出现一次。
编译原理
复习:程序语言的语法描述
定义:称A直接推出,即
N
出口
取符号
L,D
Y
Y
L N D N 出口
抽象成:
S L I 其他 E 称状态转换图
引进目的:识别正则文法的句子。 状态转换图:为识别正则文法的句子专门设计的有向图。
一个状态转换图可用于识别(或接受)一定 的字符串。(由句子归约到开始符号)
数字
数字
其他
*
1
2
3
识别整常数的状态转换图
字母或数字
字母
基本字:如 begin,repeat, 标识符——表示各种名字:如变量名、数组
名和过程名 常数:各种类型的常数 运算符:+,-,*,/, 界符:逗号、分号、括号和空白
编译原理
输出的单词符号的表示形式:
(单词种别,单词自身的值)
单词种别通常用整数编码表示。
若一个种别只有一个单词符号,则种别编 码就代表该单词符号。假定基本字、运算 符和界符都是一符一种。
A 仅当A 是一个产生式, 且, (VT VN)* 。
如果1 2 n,则我们称这个序 列是从1到n的一个推导。若存在一个从 1到n的推导,则称1可以推导出n 。
编译原理

通 一常 步,或用若干 1步,可n 表以示推:出从n。1出发,经过
复习:程序语言的语法描述
几个概念:
考虑一个有穷 字母表∑ 字符集 其中每一个元素称为一个字符 ∑上的字(也叫字符串) 是指由∑中的字符所构
成的一个有穷序列 不包含任何字符的序列称为空字,记为ε 用∑*表示∑上的所有字的全体,包含空字ε
编译原理
复习:程序语言的语法描述
∑*的子集U和V的连接(积)定义为
词法分析是作为一个独立的阶段,是否 应当将其处理为一遍呢?
作为独立阶段的优点:结构简洁、清晰和条 理化,有利于集中考虑词法分析一些枝节问 题。
不作为一遍:将其处理为一个子程序。
编译原理
词法分析器
单词符号
源程序 词法分
语法分
析器
析器
...
取下一单词
符号表
编译原理
3.2 词法分析器的设计
编译原理
例 FORTRAN程序
IF (5.EQ.M) GOTO 100
输出单词符号:
逻辑IF (34,-)
左括号 (2,-)
整常数 (20, ‘5’的二进制)
等号
(6,-)
标识符 (26, ‘M’)
右括号 (16,-)
GOTO
(30,-)
标号
(19, ‘100’的二进制)
编译原理
二、词法分析器作为一个独立子程序
其他
*
1
2
3
识别标识符的状态转换图
编译原理
例 正则文法G[Z]:
Z∷=Za|Ab|Ba
A∷=Bb|a
B∷=Aa|b
A
a
b
S
a
b
b
Za
a
B
2. 状态转换图的构造 设N为非终结符号,T为终结符号, 状态转换图构造步骤如下:
步骤1 以符号S为开始状态作结点(假定文法的字 汇表中不包含符号S);
步骤2 以每一个非终结符号为状态作结点; 步骤3 开始符号为终止状态; 步骤4 对于形如Q∷=T的每个规则,引一条从开始 状态S到状态Q的弧,其标记为T;而对形如Q∷=NT的 规则引一条从状态N到Q的弧,其标记为T。
E (E) (E+E) (E+i) (E*E+i) (E*i+i) (i*i+i)
编译原理
复习:程序语言的语法描述
定义:如果一个文法存在某个句子对应两 颗不同的语法树,则说这个文法是二义的。
语言的二义性:一个语言是二义性的,如 果对它不存在无二义性的文法。
编译原理
复习:程序语言的语法描述
运行状态转换图: 利用状态转换图识别正则文法句子的过程。
例 正则文法G[Z]:
Z∷=Za|Aa|Bb
A∷=Ba|a
B∷=Ab|b
A
a
a
S
ba
b
b
B
输入字符串:ababaaa
Za
当识别一个字符串x时,如果能从状态转换图的开始
状最态后出的发当ZA,前∷∷行 状==进 态ZBa达 为b|到终|A止xab的状|右态B端。a, x为句子的充分必要条件是 B∷=Aa|b
1 基本字识别(没有分隔符时) 例如: DO99K=1,10 DO 99 K = 1,10 IF(5.EQ.M)GOTO55 IF (5.EQ.M) GOTO 55 DO99K=1.10 IF(5)=55 需要超前搜索才能确定哪些是基本字
编译原理
2 标识符识别: 字母开头的字母数字串,后跟界符或算符
3 常数识别: 识别出算术常数并将其转变为二进制内码
表示。有些也要超前搜索。 5.EQ.M 5.E08
4 算符和界符的识别 把多个字符符合而成的算符和界符拼合成
一个单一单词符号。 :=, **, .EQ. , ++,--,>=
编译原理
三、状态转换图
1 概念
状态转换图是一张有限方向图。
结点代表状态,用圆圈表示。 X
编译原理
第三章 词法分析
词法分析的任务:从左至右逐个字符地 对源程序进行扫描,产生一个个单词符 号。
词法分析器(Lexical Analyzer) 又称扫描 器(Scanner):执行词法分析的程序
编译原理
3.1 对于词法分析器的要求
一、词法分析器的功能和输出形式 功能:输入源程序、输出单词符号 单词符号的种类:
若一个种别有多个单词符号,则对于每个 单词符号,给出种别编码和自身的值。
标识符单列一种;标识符自身的值表示成 按机器字节划分的内部码。
常数按类型分种;常数的值则表示成标准 的二进制形式。
编译原理
例 C程序
while (i>=j) i--;
输出单词符号:
< while, - > < (, - > < id, 指向i的符号表项的指针 > < >=, - > < id, 指向j的符号表项的指针 > < ), - > < id, 指向i的符号表项的指针 > < --, - > < ;, - >
输入字符串x=aababb, 是否是该文法的句子? aa babb
SABABA Z
或写为:
(S)a→(A)a→(B)b→(A)a→(B)b→(A)b→Z Z是终止状态,所以,
输入字符串aababb是上述文法的句子。
为什么
可以通过运行状态转换图来识别正则文法的句子?
步骤 当前状态 输入的其余部分
Z
1
2)对含回路的状态结,可对应一段由WHILE结构 和IF语句构成的程序.
字母或数字
i 其它 j
GetChar( ); while (IsLetter( ) or IsDigit( ))
GetChar( ); …状态j的对应程序段…
相关文档
最新文档