270 likes | 498 Views
ä¹ é¢˜è§£ç”. 主è¦å†…容. 概论 è¯æ³•åˆ†æž CFG 文法 è¯æ³•分æž. 概论. 编译器的概念ã€ä½œç”¨ ç¼–è¯‘å™¨çš„ç»„æˆ æ€»ä½“ç»“æž„å›¾ã€å‰ç«¯ã€åŽç«¯ 翻译的æ¥éª¤ 编译器ä¸çš„ä¸»è¦æ•°æ®ç»“æž„ 自举和移æ¤. è¯æ³•分æž. è¯æ³•分æžçš„作用 æ£åˆ™è¡¨è¾¾å¼ 自动机( NFA å’Œ DFA ) æ£åˆ™è¡¨è¾¾å¼å’Œè‡ªåŠ¨æœºçš„è½¬æ¢. CFG 文法. æ–‡æ³•çš„ä½œç”¨åŠæ¦‚念 文法的分类 ä¹”å§†æ–¯åŸºçš„æ–‡æ³•åˆ†ç±»åŠ CFG 文法的局é™ã€‚ 文法的二义性 å¦‚ä½•åˆ¤æ–æ–‡æ³•的二义性ã€å¦‚何解决文法的二义性 表示文法: EBNF ã€è¯æ³•图 ä½¿ç”¨æ–‡æ³•ï¼šåˆ†æžæ ‘å’ŒæŠ½è±¡è¯æ³•æ ‘. è¯æ³•分æž. è‡ªä¸Šè€Œä¸‹è¯æ³•分æž
E N D
主要内容 • 概论 • 词法分析 • CFG文法 • 语法分析
概论 • 编译器的概念、作用 • 编译器的组成 • 总体结构图、前端、后端 • 翻译的步骤 • 编译器中的主要数据结构 • 自举和移植
词法分析 • 词法分析的作用 • 正则表达式 • 自动机(NFA和DFA) • 正则表达式和自动机的转换
CFG文法 • 文法的作用及概念 • 文法的分类 • 乔姆斯基的文法分类及CFG文法的局限。 • 文法的二义性 • 如何判断文法的二义性、如何解决文法的二义性 • 表示文法:EBNF、语法图 • 使用文法:分析树和抽象语法树
语法分析 • 自上而下语法分析 • 基本概念:推导、左句型 • 递归下降法和预测分析表法 • LL(1)文法的定义和构造,以及使用分析表对输入串进行分析 • 自下而上语法分析 • 基本概念:归约、右句型、句柄、活前缀 • LR文法的判定、对输入串的分析 • 几种LR分析法的比较 • 两种语法分析的比较
1、偶数:[1-9][0-9]*[02468]|[02468] 2、每个2均在9之前的数字串:(~9)*(~2)* 3、{0, 1}上含有子串010的所有串:.*010.* 4、所有相邻数字都不相同的非空数字串: no_0-8 9 no_0-7 (8|no_0-8 8) ( no_0-8 8)*(no_0-8|)|no_0-8 no_0-6 (7|no_0-7 7) (no_0-8 8)*(no_0-7|)|no_0-7 no_0-5 (6|no_0-6 6) (no_0-6 6)*(no_0-6|)|no_0-6 no_0-4 (5|no_0-5 5) (no_0-5 5)*(no_0-5|)|no_0-5 no_0-3 (4|no_0-4 4) (no_0-4 4)*(no_0-4|)|no_0-4 no_0-2 (3|no_0-3 3) (no_0-3 3)*(no_0-3|)|no_0-3 no_0-1 (2|no_0-2 2) (no_0-2 2)*(no_0-2|)|no_0-2 no_0 (1|no_0-1 1) (no_0-1 1)*(no_0-1|)|no_0-1 result (0|no_0 0) (no_0 0)*(no_0|)|no_0 一、正规表达式
1、将下面的DFA最小化 二、正规表达式和自动机的转换
B A C B D B E C F D G E E F G G F 2、构造和正规式(a*|b*)b(ba)*等价的状态最少的DFA
B A C B D B E C F D G E E F G G F
1、文法S aSbS|bSaS| 产生的语言是什么?该文法是否是二义性文法 [解答] 该文法产生的语言是a的个数和b的个数相等的串的集合。 该文法是二义的,对于句子abab有两个不同的最左推导: S aSbS abS abaSbS ababS abab S aSbS abSaSbS abaSbS ababS abab 三、语法分析
2、写出下面语言的相应文法: (1) L1={anbnci|n1, i 0} (2) L2={anbnambm|n,m0} (3) L2={1n0m1m0n|n,m0} (4) L4={a2m+1bm+1|n,m0} 三、语法分析 [解答] (1) SAB AaAb|ab B cB| (2) SAB AaAb| B aBb| (3) S1S0| A A0A1| (4) SaaSb| ab
3、证明文法:S AaAb|BbBa A B 是LL(1)文法,但不是SLR(1)文法 三、语法分析 [解答] FIRST(AaAb)={a} FIRST(BbBa)={b} 它们交集为空,所以为LL(1)文法。 根据该文法,不管对于什么句子,在面临栈顶符号进行空归约,由于FOLLOW(A)=FOLLOW(B)={a,b},因此在使用空归约时,是将归约成A还是归约成B存在冲突,即归约-归约冲突,所以该文法不是SLR(1)文法。 教材P160,SLR(1)文法的两个条件
4、(ex4.10)文法:declaration type var-list type int | float var-list identifier, var-list|identifier 构造LL(1)分析表,分析输入串int x, y, z 三、语法分析 [解答] (1) 提取左因子,得到: declaration type var-list type int | float var-list identifier var-list’ var-list’ , var-list|
4、 [解答] (2) 求FIRST和FELLOW集合: declaration type var-list type int | float var-list identifier var-list’ var-list’ , var-list| FIRST(type var-list) = {int, float} FIRST(int) = {int} FIRST(float) = {float} FIRST(identifier var-list’) = {identifier} FIRST(, var-list) = {,} FIRST() = {} FELLOW(declaration) = {$} FELLOW(type) = {identifier} FELLOW(var-list) = {$} FELLOW(var-list’) = {$} 三、语法分析
4、 [解答] (2) 求FIRST和FELLOW集合: declaration type var-list type int | float var-list identifier var-list’ var-list’ , var-list| int x,y 三、语法分析
[解答] (3)构造LL(1)分析表 declaration type var-list type int | float var-list identifier var-list’ var-list’ , var-list| FIRST(type var-list) = {int, float} FIRST(int) = {int} FIRST(float) = {float} FIRST(identifier var-list’) = {identifier} FIRST(, var-list) = {,} FIRST() = {} FELLOW(declaration) = {$} FELLOW(type) = {identifier} FELLOW(var-list) = {$} FELLOW(var-list’) = {$}
栈 输入缓冲区 输出 栈 输入缓冲区 输出 $V’i y, z$ V iV’ $D int x, y, z$ $VT int x, y, z$ D TV $V’ , z$ 匹配y $Vint int x, y, z$ Tint $V, ,z $ V’,V $V x, y, z$ 匹配int $V z$ 匹配, $V’i x, y, z$ V iV’ $V’i z$ ViV’ $V’ , y, z$ 匹配x $V,,y, z$ V, V $V’ $ 匹配z $V y, z$ 匹配, $ $ 接受
5、 (ex5.1,5.2) 文法:E (L)|a L L, E | E [解答] (1) 扩展文法,得到: E’ E E (L)|a L L, E | E 项目分别为: E’ .E E a. E’ E. L .L,E E .(L) L L.,E E (.L) L L,.E E (L.) L L,E. E (L). L .E E .a L E. 三、语法分析
5、文法:E (L)|a L L, E | E [解答] (1) LR(0)的DFA 1: E’ E. 0: E’ .E E .(L) E .a E 6: L (L). 5: L E. E ( ) 2: E (.L) L .L,E L .E E .(L) E .a 8: L L,E. a 4: E (L.) L L.,E L E , 3: E a. a 7: L L,.E E .(L) E .a ( ( a
[解答] (2) SLR(1)分析表 1: E’ E. 0: E’ .E E .(L) E .a E 6: E (L). 5: L E. E ( ) 2: E (.L) L .L,E L .E E .(L) E .a 8: L L,E. a 4: E (L.) L L.,E E L , 7: L L,.E E .(L) E .a a 3: E a. ( ( a 文法: E’ E E (L)|a L L, E | E FOLLOW(E’)={$} FOLLOW(E)={), , , $} FOLLOW(L)={), ,}
文法G: (0) E’ E (1) E (L) (2) Ea (3) L L, E (4) L E FOLLOW(E’)={$} FOLLOW(E)={), , , $} FOLLOW(L)={), ,} 分析串:((a),a,(a,a)) 和(a(a))
E’ E E (L)|a L L, E | E [解答] (3) LR(1)项目的DFA 9: [E (L)., $] 1: [E’ E., $] 0: [E’ .E, $] [E .(L), $] [E .a, $] E ) 6: [E (L.), $] [L L.,E, )/,] L ( 2: [E (.L), $] [L .L,E, )/,] [L .E, )/,] [E .(L), )/, ] [E .a, )/,] 12: [L L,E., )/,] a , E E 11: [L L,.E, )/,] [E .(L), )/,] [E .a, )/,] 3: [E a., $] 7: [L E. , )/,] E a ( ( 4: [E a., )/,] 5: [E (.L), )/,] [L .L,E, )/,] [L .E, )/,] [E .(L), )/, ] [E .a, )/,] a , a ( 8: [E (L.), )/,] [L L.,E, )/,] ) L 10: [E (L)., )/,]
文法G: (0) E’ E (1) E (L) (2) Ea (3) L L, E (4) L E
[解答] (4) LALR(1)项目的DFA 1: [E’ E., $] 0: [E’ .E, $] [E .(L), $] [E .a, $] E 6: [E (L)., $/)/,] 5: [L E., )/,] E ( ) 2: [E (.L),$/)/,] [L .L,E, )/,] [L .E, )/,] [E .(L), )/,] [E .a, )/,] 8: [L L,E., )/, a 4: [E (L.), $/)/,] [L L.,E, )/,] L E , a 7: [E L,.E, )/,] [E .(L), )/,] [E .a, )/,] 3: [E a., $/)/,] ( ( a FOLLOW(E’)={$} FOLLOW(E)={), , , $} FOLLOW(L)={), ,} 拥有和SLR(1)相同的状态数
文法G: (0) E’ E (1) E (L) (2) Ea (3) L L, E (4) L E FOLLOW(E’)={$} FOLLOW(E)={), , , $} FOLLOW(L)={), ,} 和SLR(1)分析表相同