编译原理第7章
程序设计语言编译原理第三版第7章

N→ Є
D →id: T { enter(top(tblptr), , T.type, top(offset)); top(offset):= top(offset) +T.width } 24
§7.2
说明语句
2.含嵌套说明的翻译模式:
(1)语义规则中的操作: Mktable (previous): 创建一张新符号表,并返回指向新表的一个指针; Enter (table, name, type, offset):
(2)置相对地址为当前offset之值, (3)使offset加上该名字所表示的数据对象的域宽。
20
§7.2 说明语句
3. 相应的翻译模式:
PD { offset:=0 } { enter (, T.type,offset);
DD;D
Did:T
offset:=offset+t.width } Tinteger
(0) (1) (2) (3) (4) (5)
(2) (3) (4)
16
§7.1 中间语言
4.间接三元式:便于代码优化处理
方法:间接码表+三元式表
按运算的先后顺序列出有关三元式在三元表中的位置 例: 语句X:=(A+B)*C;Y:=D↑(A+B)的间接三元式表示如下所示: 间接代码 三元式表 (1) (2) (3) (1) (4) (5)
30
已归约串
PLACE
输入串
语义动作
# #X # X:= # X:= # X:= # X:= # X:=
X:= -B*(C+D)# X := -B*(C+D)# X_ -B*(C+D)# X__ B*(C+D)# -B X__B *(C+D)# -E X__B *(C+D)# { E.place:=p=<B>} E1 X_T1 *(C+D)# {E1.place:=newtemp=T1; 生成四元式(1) } … … … … # X:=E*(C X_T1__C +D)# # X:=E*(E1 X_T1__C +D)# { E1.place:=p=<C> } … … … …
第7章 图-有向无环图

算法的执行步骤: 算法的执行步骤: 1、用一个数组记录每个结点的入度。将入度为零的 、用一个数组记录每个结点的入度。 结点进栈。 结点进栈。 2、将栈中入度为零的结点V输出。 、将栈中入度为零的结点 输出 输出。 3、根据邻接表找到结点 的所有的邻接结点, 并将 、根据邻接表找到结点V的所有的邻接结点 的所有的邻接结点, 这些邻接结点的入度减一。 这些邻接结点的入度减一 。 如果某一结点的入度变 为零,则进栈。 为零,则进栈。
3
2
3、找到全为零的第 k 列,输出 k 、 4、将第 k 行的全部元素置为零 、 行的全部元素置为零
…………………
7
53、4;直至所有元素输出完毕。 、 ;直至所有元素输出完毕。
1 2 3 4 5 6 7
0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
template<class T> int BinaryTree <T>:: NumOfOne ( node <T> *t )
{ int k=0; if (t==NULL ) //空二叉树 //空二叉树 return 0; if (t所指结点 的度为 k=1 所指结点 的度为1) k=1; d1= NumOfOne ( t->lchild); //递归求左子树叶结点数 //递归求左子树叶结点数 d2= NumOfOne ( t->rchild); } //递归求右子树叶结点数 //递归求右子树叶结点数 return (d1+d2+k);
A B
AOE网络:结点为事件,有向边指向表示事件的执行次序。 网络:结点为事件,有向边指向表示事件的执行次序。 网络 有向边定义为活动,边的权值为活动进行所需要的时间。 有向边定义为活动,边的权值为活动进行所需要的时间。
《编译原理》课后习题答案

第7 题证明下述文法G[〈表达式〉]是二义的。
〈表达式〉∷=a|(〈表达式〉)|〈表达式〉〈运算符〉〈表达式〉〈运算符〉∷=+|-|*|/答案:可为句子a+a*a 构造两个不同的最右推导:最右推导1 〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉a=>〈表达式〉* a=>〈表达式〉〈运算符〉〈表达式〉* a=>〈表达式〉〈运算符〉a * a=>〈表达式〉+ a * a=>a + a * a最右推导2 〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉〈运算符〉a=>〈表达式〉〈运算符〉〈表达式〉* a=>〈表达式〉〈运算符〉a * a=>〈表达式〉+ a * a=>a + a * a第8 题文法G[S]为:S→Ac|aB A→ab B→bc该文法是否为二义的?为什么?答案:对于串abc(1)S=>Ac=>abc (2)S=>aB=>abc即存在两不同的最右推导。
所以,该文法是二义的。
或者:对输入字符串abc,能构造两棵不同的语法树,所以它是二义的。
第9 题考虑下面上下文无关文法:S→SS*|SS+|a(1)表明通过此文法如何生成串aa+a*,并为该串构造语法树。
(2)G[S]的语言是什么?答案:(1)此文法生成串aa+a*的最右推导如下S=>SS*=>SS*=>Sa*=>SS+a*=>Sa+a*=>aa+a*(2)该文法生成的语言是:*和+的后缀表达式,即逆波兰式。
第10 题文法S→S(S)S|ε(1) 生成的语言是什么?(2) 该文法是二义的吗?说明理由。
答案:(1)嵌套的括号(2)是二义的,因为对于()()可以构造两棵不同的语法树。
第11 题令文法G[E]为:E→T|E+T|E-T T→F|T*F|T/F F→(E)|i证明E+T*F 是它的一个句型,指出这个句型的所有短语、直接短语和句柄。
编译原理第三版课后习题答案

编译原理第三版课后习题答案编译原理是计算机科学中的一门重要课程,它研究的是如何将高级程序语言转换为机器语言的过程。
而《编译原理》第三版是目前被广泛采用的教材之一。
在学习过程中,课后习题是巩固知识、提高能力的重要环节。
本文将为读者提供《编译原理》第三版课后习题的答案,希望能够帮助读者更好地理解和掌握这门课程。
第一章:引论习题1.1:编译器和解释器有什么区别?答案:编译器将整个源程序转换为目标代码,然后一次性执行目标代码;而解释器则逐行解释源程序,并即时执行。
习题1.2:编译器的主要任务是什么?答案:编译器的主要任务是将高级程序语言转换为目标代码,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等过程。
第二章:词法分析习题2.1:什么是词法分析?答案:词法分析是将源程序中的字符序列划分为有意义的词素(token)序列的过程。
习题2.2:请给出识别下列词素的正则表达式:(1)整数:[0-9]+(2)浮点数:[0-9]+\.[0-9]+(3)标识符:[a-zA-Z_][a-zA-Z_0-9]*第三章:语法分析习题3.1:什么是语法分析?答案:语法分析是将词法分析得到的词素序列转换为语法树的过程。
习题3.2:请给出下列文法的FIRST集和FOLLOW集:S -> aAbA -> cA | ε答案:FIRST(S) = {a}FIRST(A) = {c, ε}FOLLOW(S) = {$}FOLLOW(A) = {b}第四章:语义分析习题4.1:什么是语义分析?答案:语义分析是对源程序进行静态和动态语义检查的过程。
习题4.2:请给出下列文法的语义动作:S -> if E then S1 else S2答案:1. 计算E的值2. 如果E的值为真,则执行S1;否则执行S2。
第五章:中间代码生成习题5.1:什么是中间代码?答案:中间代码是一种介于源代码和目标代码之间的表示形式,它将源代码转换为一种更容易进行优化和转换的形式。
编译原理第七章练习题

第7节习题一、单项选择题1、中间代码生成所依据的是。
a.语法规则b.词法规则c.语义规则d.等价变换规则2、四元式之间的联系是通过实现的。
a.指示器b.临时变量c.符号表d.程序变量3、后缀式ab+cd+/可用表达式来表示。
a.a+b/c+db.(a+b)/(c+d)c.a+b/(c+d)d.a+b+c/d4、表达式(┓A∨B)∧(C∨D)的逆波兰表示为。
a. ┓AB∨∧CD∨b. A┓B∨CD∨∧c. AB∨┓CD∨∧d. A┓B∨∧CD∨5所对应的表达式为。
a.A+B+C+Db.A+(B+C)+Dc.(A+B)+C+Dd.(A+B)+(C+D)6、四元式表示法的优点为。
a.不便于优化处理,但便于表的更动b.不便于优化处理,但节省存储空间c.便于优化处理,也便于表的更动d.便于表的更动,也节省存储空间7、终结符具有属性。
a.传递b.继承c.抽象d.综合解答1、选c。
2、四元式之间的联系是通过临时变量实现的,故选b。
3、选b。
4、选b。
5、选d。
6、四元式表示法的优点与间接三元式相同,故选c。
7、选d。
二、多顶选择题1、中间代码主要有。
a.四元式b.二元式c.三元式d.后缀式e.间接三元式2、下面中间代码形式中,能正确表示算术表达式a+b+c 的有 。
a .ab+c+ b .abc++ e .a+b+c3、在下面的 语法制导翻译中,采用拉链-回填技术。
a .赋值语句 b .goto 语句 c .条件语句 d .循环语句4、下列 中间代码形式有益于优化处理。
a .三元式 b .四元式 c .间接三元式 d .逆波兰表示法 e .树形表示法5、在编译程序中安排中间代码生成的目的是 。
a .便于进行存储空间的组织 b .利于目标代码的优化c .利于编译程序的移植d .利于目标代码的移植e .利于提高目标代码的质量 6、下面的中间代码形式中, 能正确表示算术表达式a .ab+c*b .abc*+c .a+b*c7、三地址代码语句具体实现通常有 表示方法。
编译原理习题及答案(整理后)

第一章1、将编译程序分成若干个“遍”是为了。
b.使程序的结构更加清晰2、构造编译程序应掌握。
a.源程序b.目标语言c.编译方法3、变量应当。
c.既持有左值又持有右值4、编译程序绝大多数时间花在上。
d.管理表格5、不可能是目标代码。
d.中间代码6、使用可以定义一个程序的意义。
a.语义规则7、词法分析器的输入是。
b.源程序8、中间代码生成时所遵循的是- 。
c.语义规则9、编译程序是对。
d.高级语言的翻译10、语法分析应遵循。
c.构词规则二、多项选择题1、编译程序各阶段的工作都涉及到。
b.表格管理c.出错处理2、编译程序工作时,通常有阶段。
a.词法分析b.语法分析c.中间代码生成e.目标代码生成三、填空题1、解释程序和编译程序的区别在于是否生成目标程序。
2、编译过程通常可分为5个阶段,分别是词法分析、语法分析中间代码生成、代码优化和目标代码生成。
3、编译程序工作过程中,第一段输入是源程序,最后阶段的输出为标代码生成程序。
4、编译程序是指将源程序程序翻译成目标语言程序的程序。
一、单项选择题1、文法G:S→xSx|y所识别的语言是。
a. xyxb. (xyx)*c.x n yx n(n≥0) d. x*yx*2、文法G描述的语言L(G)是指。
a. L(G)={α|S+⇒α , α∈V T*}b. L(G)={α|S*⇒α, α∈V T*}c. L(G)={α|S*⇒α,α∈(V T∪V N*)} d. L(G)={α|S+⇒α, α∈(V T∪V N*)}3、有限状态自动机能识别。
a. 上下文无关文法b. 上下文有关文法c.正规文法d. 短语文法4、设G为算符优先文法,G 的任意终结符对a、b有以下关系成立。
a. 若f(a)>g(b),则a>bb.若f(a)<g(b),则a<bc. a~b都不一定成立d. a~b一定成立5、如果文法G是无二义的,则它的任何句子α。
a. 最左推导和最右推导对应的语法树必定相同b. 最左推导和最右推导对应的语法树可能不同c. 最左推导和最右推导必定相同d. 可能存在两个不同的最左推导,但它们对应的语法树相同6、由文法的开始符经0步或多步推导产生的文法符号序列是。
《编译原理》(陈火旺版)课后作业参考答案ch6-10

第6章 属性文法和语法制导翻译7. 下列文法由开始符号S 产生一个二进制数,令综合属性v al 给出该数的值:试设计求S.val 的属性文法,其中,已知B 的综合属性c, 给出由B 产生的二进位的结果值。
例如,输入101.101时,S.val=5.625,其中第一个二进位的值是4,最后一个二进位的值是0.125。
【答案】11. 设下列文法生成变量的类型说明:(1)构造一下翻译模式,把每个标识符的类型存入符号表;参考例6.2。
【答案】第7章 语义分析和中间代码产生1. 给出下面表达式的逆波兰表示(后缀式):3. 请将表达式-(a+b)*(c+d)-(a+b+c)分别表示成三元式、间接三元式和四元式序列。
【答案】间接码表:(1)→(2)→(3)→(4)→(1)→(5)→(6)4. 按7.3节所说的办法,写出下面赋值句A:=B*(-C+D ) 的自下而上语法制导翻译过程。
给出所产生的三地址代码。
【答案】5. 按照7.3.2节所给的翻译模式,把下列赋值句翻译为三地址代码: A[i, j]:=B [i, j] + C[A [k, l]] + d [ i+j] 【答案】6. 按7.4.1和7.4.2节的翻译办法,分别写出布尔式A or ( B and not (C or D) )的四元式序列。
【答案】用作数值计算时产生的四元式: 用作条件控制时产生的四元式:其中:右图中(1)和(8)为真出口,(4)(5)(7)为假出口。
7. 用7.5.1节的办法,把下面的语句翻译成四元式序列: While A<C and B<D do if A=1 then C:=C+1else while A ≦D do A:=A+2; 【答案】第9章 运行时存储空间组织4. 下面是一个Pascal 程序:当第二次( 递归地) 进入F 后,DISPLAY 的内容是什么?当时整个运行栈的内容是什么? 【答案】第1次进入F 后,运行栈的内容: 第2次进入F 后,运行栈的内容:第2次进入F 后,Display 内容为:5. 对如下的Pascal 程序,画出程序执行到(1)和(2)点时的运行栈。
编译原理作业集-第七章(精选.)

编译原理作业集-第七章(精选.)第七章语义分析和中间代码产⽣本章要点1. 中间语⾔,各种常见中间语⾔形式;2. 说明语句、赋值语句、布尔表达式、控制语句等的翻译;3. 过程调⽤的处理;4. 类型检查;本章⽬标掌握和理解中间语⾔,各种常见中间语⾔形式;各种语句到中间语⾔的翻译;以及类型检查等内容。
本章重点1.中间代码的⼏种形式,它们之间的相互转换:四元式、三元式、逆波兰表⽰;3.赋值语句、算术表达式、布尔表达式的翻译及其中间代码格式;4.各种控制流语句的翻译及其中间代码格式;5.过程调⽤的中间代码格式;6.类型检查;本章难点1. 各种语句的翻译;2. 类型系统和类型检查;作业题⼀、单项选择题:1. 布尔表达式计算时可以采⽤某种优化措施,⽐如A and B⽤if-then-else可解释为_______。
a. if A then true else B;b. if A then B else false;c. if A then false else true;d. if A then true else false;2. 为了便于优化处理,三地址代码可以表⽰成________。
a. 三元式b. 四元式c. 后缀式d. 间接三元式3. 使⽤三元式是为了________:a. 便于代码优化处理b. 避免把临时变量填⼊符号表c. 节省存储代码的空间d. 提⾼访问代码的速度4. 表达式-a+b*(-c+d)的逆波兰式是________。
a. ab+-cd+-*;b. a-b+c-d+*;c. a-b+c-d+*;d. a-bc-d+*+;5. 赋值语句x:=-(a+b)/(c-d)-(a+b*c)的逆波兰式表⽰是_______。
a. xab+cd-/-bc*a+-:=;a. xab+/cd-bc*a+--:=;a. xab+-cd-/abc*+-:=;a. xab+cd-/abc*+--:=;6. 在⼀棵语法树中结点的继承属性和综合属性之间的相互依赖关系可以由________来描述。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
简单地说,
§综合属性用于“自下而上”传递信息, §继承属性用于“自上而下”传递信息。
注意: 终结符只有综合属性,由词法分析程序 提供; 非终结符既有综合属性和继承属性,但 文法开始符号没有继承属性。
二、属性文法
1、语义规则(属性等式) 为文法的每一个产生式(规则)配备的计算 属性的计算规则。 2、属性文法 为文法的每个符号引入一组属性,且让该 文法附加上语义规则时,构成了属性文法。
v 目的:
产生式 L E E T T F F →E →E1+T →T →T1*F →F →(E) →digit
语义规则 print(E.val) E.val:=E1.val+T.val E.val:=T.val T.val:=T1.val*F.val T.val:=F.val F.val:=E.val F.val:=digit.lexval
– 求解简单算术表达式的值。
v 求解步骤:
l 1、编制算术表达式的文法 l 2、引入属性表示语义信息 l 3、用语义规则描述表达式的求值
Val:表示非终结符的整数值,综合属性 lexval 是单词 digit 的属性
L 例:3*5+4 的分析树 和属性计 算 E E ⋅val:=15 + T T ⋅val:=3 * F ⋅val:=3 digit ⋅lexval:=3 ⋅val:=15 F ⋅val:=5 ⋅val:=19 T F ⋅val:=4 ⋅val:=4
例:建立说明语句的语法制导定义
例:说明语句类型信息统计
v 目的
– 分析说明语句 D,为变量指定类型
v 求解步骤:
产生式 (1)D→TL (2)T→int (3)T→real (4)L→L1,id (5)L→id
• 1、编写说明语句的文法 • 2、将类型信息作为类型描述
语义规则 L.in:=T.type T.type:=integer T.type:=real L1.in:=L.in addtype(id.entry,L.in)} addtype(id.entry,L.in)}
l 总目标:生成等价的中间代码
语义分析通常包括:
(1)类型检查。验证程序中执行的每个操作是否 遵守语言的类型系统的过程,编译程序必须报 告不符合类型系统的信息。 (2)控制流检查。控制流语句必须使控制转移到 合法的地方。例如,在C语言中break语句使控 制跳离包括该语句的最小while、for或switch 语句。如果不存在包括它的这样的语句,则就 报错。
-2-3 -2-3 -2-3-
#E+F #E+T #E+T* #E+T*5 #E+T*F #E+T #E
*5# *5# 5# # # # #
016975 -2-3-01697(10) -2-3-5 0169 -2-(15) 01 -(17)
7.3 中间代码的形式
“中间代码生成”程序的任务是:把经过语 法分析和语义分析而获得的源程序中间表 示翻译为中间代码表示。 采用独立于机器的中间代码的好处: 1.便于目标代码的移植; 2.便于进行独立于机器的代码优化工作。
【学习目标】
第七章 语法制导翻译和 中间代码生成
◇明确语义分析在编译过程所处的阶段和作用。 ◇掌握属性文法的基本概念。 ◇使用属性文法和语法制导翻译方法描述具体的 语义分析和产生中间代码。
【学习指南】
紧接在词法分析和语法分析之后,编译程序要 做的工作就是进行静态语义检查和翻译。静态 语义检查通常包括:类型检查,控制流检查, 一致性检查,相关名字检查及名字的作用域分 析等等。虽然源程序可以直接翻译为目标语言 代码,但是许多编译程序都采用了独立于机器 的,复杂性介于源语言和机器语言之间的中间 语言。其好处便于进行与目标机无关的代码优 化,也使得编译的前后端接口清晰,编译程序 结构在逻辑上更简明。
语义规则的两种描述:
– 语法制导定义:语义的抽象说明 – 翻译方案:规定实现方法(计算次序)
设计简单问题的语法制导定义和翻译方案 是本章的重点和难点。
•直观地说,一个语法制导翻译的基础是一个 文法,其中翻译成分依附在每一产生式上。 •将语义动作中的计算向前移,使继承属性的 计算出现在其文法符号之前。 产生式 (1)D→T {L.in:=T.type} L (2)T→int {T.type:=integer} (3)T→real {T.type:=real} (4)L→ {L1.in:=L.in} 1,id L {addtype(id.enery,L.in)} (5)L→id {addtype(id.enery,L.in)}
in:起到类型 传递的作用, 继承属性
7.2
语法制导翻译
⋅type:=int
⋅in:=int , id3
语法制导翻译方法是目前大多数编译 程序 普遍采用的一种方法。
•一个翻译是符号串对的一个集合。在一个编译 程序定义的翻译中,符号串对是源程序和目标程 序。各个编译阶段定义一个翻译, •词法分析:(字符串,单词串) •语法分析:(单词串,语法树) •代码生成: (语法树,汇编语言) 翻译的任务:首先是语义分析和正确性检查, 若正确,则翻译成中间代码或目标代码。
定义: 三元组:A=(G,V,F) – G 是上下文无关文法。 – V 属性的有穷集。 – F 关于属性的属性断言或一组属性的语义规 则。断言或语义规则与一个产生式相联,只引 用该产生式左端或右端的终结符或非终结符 相联的属性。 即: § 基础文法G § 每个文法符号有一组属性 § 每个文法产生式A →α有一组形式为 b:=f(c1,c2,…,ck)的语义规则,其中f是函 数,b和c1,c2,…,ck是该产生式文法符号的属 性。
中间语言的形式
v v v
后缀式
三元式
树形表示 v四元式
特点
v v
形式简单、语义明确、便于翻译 独立于目标语言
一、 树形表示 叶结点:运算对象 内部结点:运算符 二目运算对应二叉子树,多目运算对应多 叉子树。 assign(:=) 例如: a:=b*c+b*d a + * b c b * d
v
v表示:
文法规则(产生式) 规则1 … 规则n
v关系
语义规则 相关的属性等式 … 相关的属性等式
–语义信息作为终结符和非终结符的属性 –语义分析定义为产生式的断言和谓词
v用法
l 针对语义,为文法符号设置属性
– 终结符使用单词的属性
l 为每个产生式设置语义规则
– 描述各属性的关系
例:简单算术表达式的求值
例:简单算术表达式的求值 产生式 L E E T T F F →E →E1+T →T →T1*F →F →(E) →digit 语义规则 print(E.val) E.val:=E1.val+T.val E.val:=T.val T.val:=T1.val*F.val T.val:=F.val F.val:=E.val F.val:=digit.lexval
补充: 数字串的文法: N→N1D N.val:=N1.val*10+D.val N→D N.val:=D.val D→0 D.val:=0 Nval=18 val=18 D→1 D.val:=1 6 D→9 D.val:=9 Nval=18 Dval=6 val=18 val=6 计算一个输入串 Nval=1 Dval=8 val=1 val=8 的值。 6 Dval=1 8 例如‘186’ val=1 Val:表示值 1
4、属性与变量一样,可以进行计算和传递。属 性加工的过程即是语义处理的过程。 5、属性值分成不相交的两类:
v综合属性(synthesized v继承属性(inherited
attribute) attribute)。
在语法树中,
§一个结点的综合属性值由子结点的属性值来 计算; §一个结点的继承属性值是由该结点兄弟结点
L ⋅in:=int
L ⋅in:=int , id1 addtype
addtype id2 addtype
注释分析树
addtype 在符号表中为变量 填加类型信息 addtype(id.entry,L.in) entry:单词 id 的属性
使用的方法称作语法制导翻译。
定义:
在语法分析过程中,随着分析的步步进展,根 据每个产生式所对应的语义子程序(或语义规 则描述的语义动作)进行翻译的办法叫语法制 导翻译。
7.1
属性(Attribute)文法
l 语义分析的描述 – 描述语法规则的同时,编写相应的语义动作 和计算顺序 l 语义的形式化描述 – 操作语义学、公理语义学、指称语义学 l 属性文法 – 接近形式化的语义描述方法
l 属性文法是Knuth在1968年提出的 l 属性文法的特点
– – – –
是一种接近形式化的语义描述方法 长于描述静态语义、短于描述动态语义 每个语法符号有相应的属性符号 每个产生式有相应的计算属性的规则: • 属性变量=属性表达式
T 的属 性 type 和变量表 L 的属性 in。
type:表示类型,综合属性 in:起到类型传递的作用,继承属性 entry:单词 id 的属性 addtype 在符号表中为变量填加类型信息
2、举例:int id1,id2,id3 建立语法树
type: T 表示 类型, 综合 int 属性
D L
语义分析通常包括:
(3)一致性检查。在很多场合要求对象只能被定 义一次。例如Pascal语言规定同一标识符在一 个分程序中只能被说明一次,同一case语句的 标号不能相同,枚举类型的元素不能重复出现 等等。 (4)相关名字检查。有时,同一名字必须出现两 次或多次。例如,Ada 语言程序中,循环或 程序块可以有一个名字,出现在这些结构的开 头和结尾,编译程序必须检查这两个地方用的 名字是相同的。 (5)名字的作用域分析