230 likes | 431 Views
习题. 1-1 参照文法, E → E + E | E * E | ( E ) | I 写出以下表达式的生成过程 ( 最左派生、最右派生 ) : i * ( i + i ) * i. 1-2 扩充 文法 < 电话号码 > → < 局代码 >< 本机代码 > < 电话号码 > → < 地区前缀 >< 局代码 >< 本机代码 > < 地区前缀 > → < 地区代码 > - < 地区前缀 > →(< 地区代码 >) < 地区代码 > → DIGIT DIGIT < 地区代码 > → DIGIT DIGIT DIGIT
E N D
习题 • 1-1 参照文法, E → E + E | E * E | ( E ) | I 写出以下表达式的生成过程(最左派生、最右派生): • i * ( i + i ) * i
1-2 扩充文法 • <电话号码> → <局代码><本机代码> • <电话号码> → <地区前缀><局代码><本机代码> • <地区前缀> → <地区代码> - • <地区前缀> →(<地区代码>) • <地区代码> → DIGIT DIGIT • <地区代码> → DIGIT DIGIT DIGIT • <局代码> → DIGIT DIGIT DIGIT DIGIT • <本机代码> → DIGIT DIGIT DIGIT DIGIT • 增加包括国际代码的电话号码描述 • 如:86-010-6739-1742
1-3 给定文法如下: • E → T | E + T | E - T • T → F | T * F | T / F • F → ( F ) | i • 画出表达式 i*(i+i)+i 的分析树 • 1-4 判断上题的文法属于哪个类型的文法?为什么?
例2-1(1/2) DOS 命令 date 的输出格式 例:9-2-1993、09-03-1993、9-03-93 语法 date → month - day - year 词法 month → DIGIT DIGIT | DIGIT day → DIGIT DIGIT | DIGIT year → DIGIT DIGIT | DIGII DIGIT DIGIT DIGIT
例2-1(2/2) 语义 year(年)、month(月)、day(日) 语义约束条件 0 < month.value < 13 0 < day.value < 32,31,30 0 < year.value < 10000
习题 • 2-1 试分析一个简短的 C 程序,找出几个属于语法、词法、语义的语言现象。 • 2-2 试分析例 2-1 的 date 输出数据的处理中,应该做哪些词法分析、语法分析、语义处理。 • 2-3 理解交叉编译和自展技术
习题 • P97 练习3.1~3.2;3.3,3.4选做 • 练习3.5~3.13——有能力者可以完成 • 3-1 构造下列正规式的状态图 • a ( ( a | b )* | a b* a )* b • 3-2 给出下述文法所对应的正规式 • S → 0 A | 1 B • A → 1 S | 1 (01|10)* • B → 0 S | 0
3-3 文法G[<单词>]为: <单词> → <标识符> | <整数> <标识符> → <标识符> <字母> | <标识符> <数字> | <字母> <整数> → <整数> <数字> | <数字> <字母> → A | B | … | Y | Z <数字> → 1 | 2 | … | 8 | 9 | 0 将该文法改写为正规文法 • 3-4 上机题 • 合并例3-3和例3-4的状态图,设计并实现一个词法分析函数,每次返回一个单词种别和属性;编制主程序完成测试(输入和输出)。
1~3章自测题 1、设 r=(1|0)*0((0|1|2)2|(0|1|2) 3)(0|1|2|3|4|5|6|7|8|9)8 求RG G 和FA M使得L(M)=L(G)=L(r) 2、构造算术表达式的文法G,并且 1) 指出各语法变量的意义 2) 求 x+log( |sin(y)| +b4) 最左推导、最右推导 3) 求 x+log( |sin(y)| +b4) 的语法树 3、叙述下列概念的定义和意义 前缀、文法、直接推导、规范归约、短语、句柄、正规式、正规定义式、种别码与属性值、双缓冲 4、编译程序的总体结构及各模块的功能;编译程序的实现方法;如何根据FA实现扫描器?
习题: 4-1 改写以下文法,消除左递归 • M → M a H | H • H → b ( M ) | ( M ) | b 4-2 求以下文法中各非终结符的FIRST集和FOLLOW集 • A → b a B | • B → A b b | a 4-3 构造如下给定文法的递归子程序 • S → a|↑|( T ) • T → T,S|S
上机题 4-4 给定下列文法: • S→id=E; • S→if C then S • S→while C do S • C→E>E • C→E<=E 用递归子程序法设计并实现语法分析程序,按照生成顺序输出产生式 练习: P202~204 4.1~4.8
4-5 构造如下给定文法的预测分析表 • S → A B • A → B a| • B → D b|D • D → d| 4-6 判断下述文法可否改写为 LL(1)文法 • a. S→A|B • A→aA|a • B→bB|b • b. S→i|(E) • E→E+S|E-S|S
思考题 • 4-7 能否直接用语法图描述 E→E+E|E-E|E*E |E/E|-E|(E)|id|const,并用递归子程序法实现语法分析?为什么? • 4-8 能否将各种单词的文法直接并入表达式语法,进行语法分析处理?试分析这样做会有哪些好的影响和不好的影响。 • 练习 P204:4.9~4.13
4-9 给出布尔表达式的文法,构造其算符优先关系表 • bexpr → bexpr OR bexpr • bexpr → bexpr AND bexpr • bexpr → NOT bexpr • bexpr →( bexpr ) • bexpr → TRUE • bexpr → FALSE • 练习:P205 4.15~4.17
4-10求给定文法的拓广文法的LR(0)项目集规范族,及相应的LR(0)分析表:4-10求给定文法的拓广文法的LR(0)项目集规范族,及相应的LR(0)分析表: • S A • A B A | • B a B | b • 4-11 说明为什么各种 LR 分析方法的分析能力不同?
4-12 已知文法 A a A d | a A b | ,判断该文法是否是 SLR(1) 文法,如果是 SLR(1)文法,则构造分析表;并对输入串ab# 给出分析过程。 • 4-13 证明下列文法不是 LR(0) 文法, 是 SLR(1) 文法。 • S A • A A b | b B a • B a A c | a | a A b • 练习:P206~P207 4.18~4.25
思考题:如何在计算机中存储一个文法的所有LR(0)项目最能节省空间?如果某文法有n个产生式,这些产生式的右部的最大长度为m,问:你所给出的存储方案需要的存储空间与n和m有什么样的关系?假设:一个字符占一个字节,一个整数占两个字节。思考题:如何在计算机中存储一个文法的所有LR(0)项目最能节省空间?如果某文法有n个产生式,这些产生式的右部的最大长度为m,问:你所给出的存储方案需要的存储空间与n和m有什么样的关系?假设:一个字符占一个字节,一个整数占两个字节。
习题 5-1 下列文法是一个二进制数的文法。试根据该文法,编写一个语法制导定义,描述由S 生成的二进制数的数值计算。(提示:val、n) S → L . L L → L B | B B → 0 | 1 5-2 参照下列表达式文法编写语法制导定义,描述表达式的类型计算。要求在不同精度的数的计算中,结果取精度高的类型。(提示:type、tran、n、类型判定与转换) E → E + T | T T → n.n | n
5-3.把下列语句翻译成三地址代码 while a > 10 if b = 100 then while a < 20 do a := a + b - 1
上机题(选做):在第四章上机题的基础上,补充以下的语义处理功能,形成一个将源程序翻译成三地址代码序列的翻译程序:上机题(选做):在第四章上机题的基础上,补充以下的语义处理功能,形成一个将源程序翻译成三地址代码序列的翻译程序: • 将表达式、赋值语句翻译成三地址代码 • 将 If 条件语句、While 循环语句翻译成三地址代码
思考题:试分析以下 C 程序的运行结果 float x, y; char buf[32]; main( ) { int i; char *p = &x + 20; for( i = 0; i < 32; i++ ) buf[ i ] = ‘a’ + i; while( *++p != ‘x’ ) putchar( *p ); }
思考题6-1 程序的执行过程中如何进行存储分配?何时为哪些数据目标分配存储空间? • 思考题6-2 什么叫静态绑定?什么叫动态绑定?变量的绑定和过程的绑定有什么区别?
思考题7-1 P374 7.1 • 思考题7-2 设m维数组A[n1,n2,…,nm]是按照列优先存放的,其各维的下界是0,首地址为a,请给出A [i1,i2,…,im]的地址的计算公式,并给出相应的语法制导定义。 • 思考题7-3 试分别给出下列语句的三地址码,并希望你能讲清楚是如何转换出来的。 • call sub(a+5,b*a,c) • fun(a+5,b*a,c)