程序设计语言编译原理(第三版)第6章
编译原理第6章

2 执行派生类构造函数的顺序是:
调用基类构造函数,对基类数据成员初始化; ① 调用基类构造函数,对基类数据成员初始化; 调用子对象构造函数,对子对象数据成员初始化; ② 调用子对象构造函数,对子对象数据成员初始化; 再执行派生类构造函数本身, ③ 再执行派生类构造函数本身,对派生类数据成员初始化
6.5 同名覆盖和赋值兼容规则
(2)改造从基类吸收的成员。接收基类成员是程序人员不 改造从基类吸收的成员。
能选择的, 能选择的,但是程序人员可以对这些成员作某些调整改 造。 (3) 在声明派生类时增加的成员。这部分内容是很重要的, 的成员。这部分内容是很重要的, 它体现了派生类对基类功能的扩展。 它体现了派生类对基类功能的扩展。要根据需要仔细考 虑应当增加哪些成员,精心设计。 虑应当增加哪些成员,精心设计。
1、同名覆盖
可以在派生类中声明与基类同名的成员,这样, 可以在派生类中声明与基类同名的成员,这样,在派生类中就存在两个 同名的成员,通过及类对象只能使用新增的同名成员, 同名的成员,通过及类对象只能使用新增的同名成员,这就是同名覆盖 原则。 原则。
在派生类中增加一个与基类函数同名的display()函数: ()函数: 在派生类中增加一个与基类函数同名的 ()函数 void Student::diplay() {cout << "num:"<< num <<endl; cout <<"score:"<< score <<endl;} 在主函数中调用: 在主函数中调用: std.diplay(); 实际执行的是派生类Student中的新增的 中的新增的display()函数。 ()函数 实际执行的是派生类 中的新增的 ()函数。 如果想调用基类的display函数,需用基类类名限定: 函数, 如果想调用基类的 函数 需用基类类名限定: std.Person::display();
编译原理课件(刘铭)第6章

本章小结
也就是说标识符是一个没有意义 的字符序列,而名字有确切的意义。 在程序语言中标识符可以是一个变量 的名字或一个函数的名字。
例如 area , 作为标识符,它没有 任何意思,但作为名字,可以表示 变量名或函数名等。
本章小结
3. 符号表的查找
符号表查找算法与该符号表的构造方法 密切相关即有顺序查找、折半查找和杂 凑查找算法。
6.3 符号表的组织
一个编译程序,从词法分析、语法 分析、语义分析到代码生成的整个过程 中,符号表是连贯上下文进行语义检查、 语义处理、生成代码和存储分配的主要 依据,因此符号表的组织直接关系到这 些语义功能的实现和语义处理的时空效 率。
6.3 符号表的组织
符号表的表格形式
名 字 栏 信 息 栏
符号表的作用
符号表的组织
符号表的建立和查找
6.1 符号表的作用与生成期
符号表的作用 符号表用来存放程序语言中出现 的有关标识符的属性和特征。 符号表在整个编译期间的作用归 纳为以下几个方面: 将标识符的名字及属性登录在符号 表中
6.1 符号表的作用与生成期
在分析说明语句时,编译程序根 据说明语句信息将标识符的相应属性 如标识符的类型:实型,整型,布尔 型等;标识符的种属:数组名,变量 名,过程名,函数名等; 标识符的作用 域:全局变量或局部变量等信息登录 到符号表中。
名字栏存放标识符的名字,信息栏存放 名字相关属性。
. . .
. . .
6.3 符号表的组织
符号表的总体组织 1. 编译程序按名字的不同属性构造出多 个符号表。如常量表、变量名表等。 符号表结构相同,表项等长。不便管理。
2. 编译程序把语言中的所有名字组织在 一张符号表中。 符号表便于管理,但表结构复杂且表项 不等长。
编译原理第六章习题解答

第六章习题答案4.文法G:S→S;G|GG→G(T)|HH→a|(S)T→T+S|S(1)该文法是算符文法,且不包含ε产生式。
计算每个非终结符的FIRSTVT集合:FIRSTVT(S) = FIRSTVT(S)∪{;}∪FIRSTVT(G) = {;, a, (}FIRSTVT(G) = FIRSTVT(G)∪{(}∪FIRSTVT(H) = {a, (}FIRSTVT(H) = {a, (} = {a, (}FIRSTVT(T) = FIRSTVT(T)∪{+}∪FIRSTVT(S) = {+, ;, a, (}计算每个非终结符的LASTVT集合:LASTVT(S) = {;}∪LASTVT(G) = {;, a, )}LASTVT(G) = {)}∪LASTVT(H) = {a, )}LASTVT(H) = {a, )} = {a, )}LASTVT(T) = {+}∪LASTVT(S) = {+, ;, a, )}①关系由#S#可知:##由G→G(T)|H可知:()②关系S# LASTVT(S)#→{;, a, )}#S; LASTVT(S);→{;, a, )};G( LASTVT(G)( →{a, )}(T) LASTVT(T)) →{+, ;, a, )})S) LASTVT(S)) →{;, a, )})T+ LASTVT(T)+ →{+, ;, a, )}+③关系#S #FISRTVT(S)→ #{;, a, (};G ;FISRTVT(G)→ ;{a, (}(T (FISRTVT(T)→ ({+, ;, a, (}(S (FISRTVT(S)→ ({;, a, (}+S +FISRTVT(S)→ +{;, a, (}构造算符优先关系表如下:+ ; a ( ) # +;a()#由该文法的算符优先关系表可知,该文法是算符优先文法。
(2)句型a(T+S);H;(S)的语法树如右图所示:短语:a(T+S);H;(S),a(T+S);H ,a(T+S),a ,T+S ,H ,(S)句柄:a素短语:a ,T+S ,(S)最左素短语:a(3)对a;(a+a)进行算符优先分析步骤如下:对采用算符优先分析方法进行分析,可知:a;(a+a)和(a+a)均应为该文法的句子。
编译原理chapter6

27
1)控制流语句的翻译 1)控制流语句的翻译
S → if (B) S1 | if (B) S1 else S2 | while (B) S1 | S 1; S 2 | assign
28
控制流语句的翻译
B.code B.true: S1.code ... (a) if begin: B.code B.true: S1.code 指向B.true 指向 指向B.false 指向 指向B.true 指向 指向B.false 指向 B.true: B.code S1.code goto S.next B.false: S2..code . . (b) if-else 指向B.true 指向 指向B.false 指向
21
5)记录中的域的处理 5)记录中的域的处理
我们可以为每个记录创建单独的符号表 处理时
首先创建一个新的符号表,压到栈顶; 首先创建一个新的符号表,压到栈顶; 然后处理对应于字段声明的D,字段都被加入到新符 然后处理对应于字段声明的 , 号表中; 号表中; 最后根据栈顶的符号表构造record类型表达式;符 类型表达式; 最后根据栈顶的符号表构造 类型表达式 号表出栈
语法制导定义的SDT 语法制导定义的SDT P→MD M→ε M→ε{offset=0;} D→T id;N D N→{ top.put(id.lexname,T.t,offset); offset=offset+T.w} D→ε D→ε T→BKC{T.t=C.t;T.w=C.w} K→ε K→ε{t=B.t;w=B.w;} B→int {B.t=integer;B.w=4;} C→ε C→ε{C.t=t;C.w=w;}
产生式 语义规则 S→id:=E S.code:=E.code||gen(id.addr’:=’E.addr) → E→E1+E2 E.addr:=newtemp;E.code := E1.code || E2.code || → gen(E.addr’:=’E1.addr’+’ E2.addr) E→E1*E2 E.addr:=newtemp;E.code := E1.code || E2.code || → gen(E.addr’:=’E1.addr’*’ E2.addr) E→ -E1 → E.addr:=newtemp; E.code := E1.code || gen(E.addr’:=’’uminus’ E1.addr) E→ (E1) E.addr:= E1.addr; → E.code := E1.code E→ id → E.addr:= id.addr; E.code := ‘’
C语言程序设计ppt-第6章 编译预处理

程序段A
1#0e/6n/2d02i0f
华中科技大学计算机学院C语言课程组
20
6.4.3 条件编译的应用
【例6.5】 采用条件编译,避免多次包含同一个头文件。
为了避免一个头文件被多次包含,可以在头文件的最前面两 行和最后一行加上预编译指令,让头文件在被多个源文件引 用时不会多次编译。
#ifndef _NAME_H
如何方便地处理这些用于输出调试信息的语句?用C99的可 变参数宏,可方便地输出调试信息。
源程序\ex6_2.c 调试阶段定义DEBUG宏,在需要输出调试信息的地方用宏
msg,调试成功后,软件正式发行时,只需将第2行的 #define指令删除或注释掉即可,非常方便。
10/6/2020
华中科技大学计算机学院C语言课程组
16
6.5 条件编译
预处理程序提供了条件编译指令,用于在预处 理中进行条件控制,根据所求条件的值有选择 地包含不同的程序部分,因而产生不同的目标 代码。 这对于程序的移植和调试是很有用的。 对源程序的各部分有选择地进行编译称为条件 编译。
条件编译指令三种形式,控制流与if-else语 句类似。如表6.1所示 .
10/6/2020
华中科技大学计算机学院C语言课程组
14
【例6.3】 用_Generic,编写求和的 通用类型宏sum。
编译原理第六章属性文法和语法制导翻译

第六章 属性文法和语法制导翻译要紧内容:[1] 法制导翻译的大体思想; [2] 属性文法的大体概念; [3] 基于属性文法的处置方式;[4] 在自上而下分析和自下而上分析中的属性计算。
大体要求:[1] 明白得语法制导翻译和属性文法的大体思想和方式, [2] 把握属性的计算方式。
教学要点:本章中,咱们将第一介绍属性文法的大体概念,然后介绍基于属性文法的处置方式,讨论如安在自上而下分析和自下而上分析中实现属性的计算。
讲义摘要:6.1 属性文法一、语义分析的任务一、静态语义分析或静态审查。
例如,类型检查、操纵流检查(操纵流语句必需使操纵转移到合法的地址 )、维数检查、越界检查、名字的作用域分析 等。
二、动态语义处置。
若是静态语义正确,语义处置那么要执行真正的翻译。
例如,变量的存储分派;表达式的求值;语句的翻译(中间代码的生成)。
3、总目标:生成等价的中间代码二、属性文法 一、属性所谓属性,其涉及的概念比较普遍,经常使用以描述事物或人的特点、性质,品质等等。
比如,谈到一个 物体,能够用“颜色”描述它,谈起某人,能够利用“有幽默感“来形容他。
对编译程序利用的语法树的结点,能够用"类型"、"值"或"存储位置"来描述它。
二、属性文法(也称属性翻译文法)属性文法是Knuth 在1968年第一提出的。
它是在上下文无关文法的基础上,为每一个文法符号(终结符或非终结符)配备假设干相关的“值”(称为属性)。
这些属性代表与文法符号相关信息,例如它的类型、值、代码序列、符号表内容等等。
属性与变量一样,能够进行计算和传递。
属性加工的进程即是语义处置的进程。
关于文法的每一个产生式都配备了一组属性的计算规那么,称为语义规那么。
语义规那么所描述的工作能够包括属性计算、静态语义检查、符号表操作、代码生成等等。
3、属性文法的形式化概念形式上讲,一个属性文法是一个三元组:A=(G,V,F),其中 G:是一个上下文无关文法。
编译原理作业集-第六章-修订

第六章属性文法和语法制导翻译本章要点1. 属性文法,基于属性文法的处理方法;2. S-属性文法的自下而上计算;3. L-属性文法的自顶向下翻译;4. 自下而上计算继承属性;本章目标掌握和理解属性方法、基于属性文法的处理方法、S-属性文法和自下而上计算、L-属性文法和自顶向下翻译、自下而上计算继承属性等内容。
本章重点1.语法制导翻译基本思想。
2.语义规则的两种描述方法:语法制导的定义和翻译方案。
语法制导的定义没有指明语义规则的计算次序,而翻译方案显式给出语义规则(或叫语义动作)的计算次序和位置。
3.基于属性文法的处理方法,综合属性定义(S属性定义)和L属性定义。
4.设计简单问题的语法制导定义和翻译方案,这是本章的重点和难点。
这种设计可看成是一种程序设计,是一种事件驱动形式的程序设计,因此它比一般的编程要难得多。
这里的事件是句子中各种语法结构的识别。
5.语义规则的三种计算方法:分析树方法、基于规则的方法和忽略规则的方法。
6.S属性的自下而上计算(边语法分析边属性计算,忽略规则的方法)。
7.L属性的自上而下计算(边语法分析边属性计算,忽略规则的方法)。
8.递归计算(先语法分析后属性计算,基于规则的方法)。
本章难点1. 设计简单问题的语法制导定义和翻译方案;作业题一、单项选择题:1. 文法开始符号的所有________作为属性计算前的初始值。
a. 综合属性b. 继承属性c. 继承属性和综合属性d. 都不是2. 对应于产生式A→XY继承属性Y.y的属性计算,可能正确的语义规则是________。
a. A.a:=f(X.x,Y.y);b. )Y.y:=f(A.a,Y.y);c. Y.y:=f(X.x);d. A.a:=f(Y.y);3. 描述文法符号语义的属性有两种,一种称为__ __,另一种称为__ ___。
a. L-属性b. R-属性c. 综合属性d. 继承属性4. 出现在产生式________和出现在产生式________不由所给的产生式的属性计算规则进行计算,而是由其他产生式的属性规则计算或者由属性计算器的参数提供。
编译原理第六章算符优先分析法

编译原理第六章算符优先分析法第六章算符优先分析法课前索引【课前思考】◇什么是⾃下⽽上语法分析的策略?◇什么是移进-归约分析?◇移进-归约过程和⾃顶向下最右推导有何关系?◇⾃下⽽上语法分析成功的标志是什么?◇什么是可归约串?◇移进-归约过程的关键问题是什么?◇如何确定可归约串?◇如何决定什么时候移进,什么时候归约?◇什么是算符⽂法?什么是算符优先⽂法?◇算符优先分析是如何识别可归约串的?◇算符优先分析法的优缺点和局限性有哪些?【学习⽬标】算符优先分析法是⾃下⽽上(⾃底向上)语法分析的⼀种,尤其适应于表达式的语法分析,由于它的算法简单直观易于理解,因此,也是学习其它⾃下⽽上语法分析的基础。
通过本章学习学员应掌握:◇对给定的⽂法能够判断该⽂法是否是算符⽂法◇对给定的算符⽂法能够判断该⽂法是否是算符优先⽂法◇对给定的算符⽂法能构造算符优先关系表,并能利⽤算符优先关系表判断该⽂法是否是算符优先⽂法。
◇能应⽤算符优先分析算法对给定的输⼊串进⾏移进-归约分析,在分析的每⼀步能确定当前应移进还是归约,并能判断所给的输⼊串是否是该⽂法的句⼦。
◇了解算符优先分析法的优缺点和实际应⽤中的局限性。
【学习指南】算符优先分析法是⾃下⽽上语法分析的⼀种,它的算法简单、直观、易于理解,所以通常作为学习其它⾃下⽽上语法分析的基础。
为学好本章内容,学员应复习有关语法分析的知识,如:什么是语⾔、⽂法、句⼦、句型、短语、简单短语、句柄、最右推导、规范归约基本概念。
【难重点】◇通过本章学习后,学员应该能知道算符⽂法的形式。
◇对⼀个给定的算符⽂法能构造算符优先关系分析表,并能判别所给⽂法是否为算符优先⽂法。
◇分清规范句型的句柄和最左素短语的区别,进⽽分清算符优先归约和规范归约的区别。
◇算符优先分析的可归约串是句型的最左素短语,在分析过程中如何寻找可归约串是算符优先分析的关键问题。
对⼀个给定的输⼊串能应⽤算符优先关系分析表给出分析(归约)步骤,并最终判断所给输⼊串是否为该⽂法的句⼦。