编译原理 第二章
合集下载
编译原理第二章
安徽理工大学 《编译原理》 信息安全系 sb
19
…… <数字>::=9 该文法的字汇表V为:V={0, 1, …, 9, <无 符号整数>, <数字串>, <数字>} •终结符与非终结符: 终结符与非终结符: 终结符与非终结符 给定文法G, 给定文法 ,凡出现在规则左部的符号称 为非终结符,其组成的集合记为: 为非终结符,其组成的集合记为: Vn。凡 不属于V 的符号称为终结符, 不属于 n 的符号称为终结符,其组成的集 合记为: Vt 。 合记为: 字汇表:V= Vn∪Vt 字汇表 Vn∩Vt = φ 若无特殊说 我们用大写字母表示非终结符。 明,我们用大写字母表示非终结符。
安徽理工大学 《编译原理》 信息安全系 sb
17
<代词> ::=I <谓语> ::=<动词><直接宾语> <动词> ::=love <直接宾语> ::=<物主代词><名词> <物主代词> ::=my <名词> ::=motherland 其中,带有尖括号的称为语法成分或语法 类,不带尖括号的称为单词符号或单词。 •文法与字汇表: 文法与字汇表: 文法与字汇表 文法(G[Z])是规则的非空有穷集合。 是规则的非空有穷集合。 文法 是规则的非空有穷集合
安徽理工大学 《编译原理》 信息安全系 sb
8
2.符号串的运算 2.符号串的运算 •符号串相等: 符号串相等: 符号串相等 是字母表∑上的两个符号串 设x, y是字母表 上的两个符号串,若x与y 是字母表 上的两个符号串, 与 的诸符号依次相等,则符号串x, 相等 相等。 的诸符号依次相等,则符号串 y相等。记 为: x=y •符号串的长度: 符号串的长度: 符号串的长度 设x为字母表 上的符号串,符号串中包 为字母表∑上的符号串, 为字母表 上的符号串 含的符号的个数称为符号串x的长度 的长度。 含的符号的个数称为符号串 的长度。用|x| 表示。 表示。
19
…… <数字>::=9 该文法的字汇表V为:V={0, 1, …, 9, <无 符号整数>, <数字串>, <数字>} •终结符与非终结符: 终结符与非终结符: 终结符与非终结符 给定文法G, 给定文法 ,凡出现在规则左部的符号称 为非终结符,其组成的集合记为: 为非终结符,其组成的集合记为: Vn。凡 不属于V 的符号称为终结符, 不属于 n 的符号称为终结符,其组成的集 合记为: Vt 。 合记为: 字汇表:V= Vn∪Vt 字汇表 Vn∩Vt = φ 若无特殊说 我们用大写字母表示非终结符。 明,我们用大写字母表示非终结符。
安徽理工大学 《编译原理》 信息安全系 sb
17
<代词> ::=I <谓语> ::=<动词><直接宾语> <动词> ::=love <直接宾语> ::=<物主代词><名词> <物主代词> ::=my <名词> ::=motherland 其中,带有尖括号的称为语法成分或语法 类,不带尖括号的称为单词符号或单词。 •文法与字汇表: 文法与字汇表: 文法与字汇表 文法(G[Z])是规则的非空有穷集合。 是规则的非空有穷集合。 文法 是规则的非空有穷集合
安徽理工大学 《编译原理》 信息安全系 sb
8
2.符号串的运算 2.符号串的运算 •符号串相等: 符号串相等: 符号串相等 是字母表∑上的两个符号串 设x, y是字母表 上的两个符号串,若x与y 是字母表 上的两个符号串, 与 的诸符号依次相等,则符号串x, 相等 相等。 的诸符号依次相等,则符号串 y相等。记 为: x=y •符号串的长度: 符号串的长度: 符号串的长度 设x为字母表 上的符号串,符号串中包 为字母表∑上的符号串, 为字母表 上的符号串 含的符号的个数称为符号串x的长度 的长度。 含的符号的个数称为符号串 的长度。用|x| 表示。 表示。
编译原理chapter2
* (1)S w,当且仅当w中含有相同个数的a和b。 * w,当且仅当w中a的个数比b的个数多一个。 (2)A * (3)B w,当且仅当w中b的个数比a的个数多一个。
归纳基础 当|w|=1,Aa, B b, 不能从S导出 长度 为1的终极行,则上述结论显然成立。
24
归纳步骤 设(1),(2)和(3)对于长度不超过k-1 的所有w都成立。那么,证明对|w|=k也成立。 对于(1),推导的第一步必是SaB或SbA, * w 对于第一种情形,必有w=aw1且B 1, |w1|=k-1, 它含的b个数比a多一个,因此,w中a,b的个数相 等。推导的第一步是SbA,证明完全类似。反之, * |w|=k, w中a,b的个数相等,要证S w。考虑的S 推导,推导出的开始符号,或为a或为b。若 * SaB,B w1, |w1|=k-1, w1中b的个数比a多一 个,w= aw1。若S bA,证明和类SaB类似。 (2)和(3)的证明留给同学们。
21
例:E E+T T+T F+T a+T a+F a+a
A E E+T T+T F+T a+T a+F E+T T+T F+T a+T a+F a+a 产生式 EE+T ET TF Fa TF Fa a+ a+ +T +T +T
27
定义 2.5
2.3 分析树和二义性
一.
分析树的定义 二. 如何画出分析树 三. 子树 四. 二义性文法的定义 五. 在构造编译程序中如何处理 二义性文法
28
一.分析树的定义 设G=(VT,VN,S,P),G的一棵分析树 满足如下条件: 1. 每一个结点有一个标 记,此标记是VT∪VN∪{ε }中的符号。 2.根的标记是S。3.如果一个结点是内 部结点,且有标记A,那么A必在VN中。 4.如果编号为n的结点有标记A,结点 n1,n2,…,nk是点n的从左到右的儿子,并分 别有标记X1,X2,…,Xk,则AX1X2…Xk必须 是P中的产生式。5. 如果结点n有标记ε , 那么结点n是叶子,且是它父亲唯一的儿 子。
归纳基础 当|w|=1,Aa, B b, 不能从S导出 长度 为1的终极行,则上述结论显然成立。
24
归纳步骤 设(1),(2)和(3)对于长度不超过k-1 的所有w都成立。那么,证明对|w|=k也成立。 对于(1),推导的第一步必是SaB或SbA, * w 对于第一种情形,必有w=aw1且B 1, |w1|=k-1, 它含的b个数比a多一个,因此,w中a,b的个数相 等。推导的第一步是SbA,证明完全类似。反之, * |w|=k, w中a,b的个数相等,要证S w。考虑的S 推导,推导出的开始符号,或为a或为b。若 * SaB,B w1, |w1|=k-1, w1中b的个数比a多一 个,w= aw1。若S bA,证明和类SaB类似。 (2)和(3)的证明留给同学们。
21
例:E E+T T+T F+T a+T a+F a+a
A E E+T T+T F+T a+T a+F E+T T+T F+T a+T a+F a+a 产生式 EE+T ET TF Fa TF Fa a+ a+ +T +T +T
27
定义 2.5
2.3 分析树和二义性
一.
分析树的定义 二. 如何画出分析树 三. 子树 四. 二义性文法的定义 五. 在构造编译程序中如何处理 二义性文法
28
一.分析树的定义 设G=(VT,VN,S,P),G的一棵分析树 满足如下条件: 1. 每一个结点有一个标 记,此标记是VT∪VN∪{ε }中的符号。 2.根的标记是S。3.如果一个结点是内 部结点,且有标记A,那么A必在VN中。 4.如果编号为n的结点有标记A,结点 n1,n2,…,nk是点n的从左到右的儿子,并分 别有标记X1,X2,…,Xk,则AX1X2…Xk必须 是P中的产生式。5. 如果结点n有标记ε , 那么结点n是叶子,且是它父亲唯一的儿 子。
编译原理第二章
2014年6月12日12时3分
2.2 高级语言的一般特性
高级语言的分类: (1)强制式的高级语言(也称过程式语言) 其特点是命令驱动,面向语句。一个强制式语言程序由一 系列的语名组成,每个语句的执行引起若干存储单元中的 值的改变。许多广为使用的语言,如FORTRAN、C、 PASCAL,ADA等等,属于这类语言。
2014年6月12日12时3分
语法分析树与二义性
用一张图表示一个句型的推导,这种表示称为语法分析树, 或简称语法树。语法树有助于理解一个句子语法结构的层 次。语法树的根结由开始符号所标记。随着推导的展开, 当某个非终结符被它的某个候选式所替换时,这个非终结 符的相应结就产生出下一代新结,候选式中自左至右的每 个符号对应一个新结,并用这些符号标记其相应的新结。 每个新结和其你结间都有一条连线。在一棵语法树生长过 程中的任何时刻,所有那些没有后代的端末结自左至右排 列起来就是一个句型。
人们已经证明,二义性问题是不可判定的。即,不存在一 个算法,它能在有限步骤内,确切地判定一个文法是否为 二义的。我们所能做的事是为无二义性寻找一组充分条件。
2014年6月12日12时3分
例如对于算术表达式文法G[E]关于(i*i+i)的语法树如下图 所示。 E
(
E E i * E i
E
+ E i
)
2014年6月12日12时3分
例如,字符串 0.5*X1+C 是一个表达式,其中常数0.5,标 识符X1和C,以及算符*和+称为语言的单词符号,而表达 式0.5*X1+C称为语言的一个语法单位,或语法范畴。 词法规则是指单词符号的形成规则。在现今多数程序语言 中,单词符号一般包括:关键字、标识符、运算符、界符 和常量等等。正规式和有限自动机理论是描述词法结构和 进行词法分析的有效工具。
编译原理第2章
2020/9/7
16
形式语言
• 可用于形式化地描述程序设计语言,包括它由 那些符号串构成,这些符号串的表示、结构和 特性
2020/9/7
17
主要内容
• 程序设计语言 • 语言概述 • 形式语言 • 符号和符号串 • 文法 • 语言(推导) • 语法树与句型分析 • 文法二义性 • 文法与语言分类
2020/9/7
7
有了一组规则以后,按照如下方式用它们导出句子:
开始去找∷=左端的带有〈句子〉的规则并把它由∷=右端的 符号串代替,这个动作表示成:
〈句子〉 〈主语〉〈谓语〉,
然后,在得到串〈主语〉〈谓语〉中,选取〈主语〉或〈谓 语〉,再用相应规则的∷=右端代替之。比如,选取了〈主 语〉,并采用规则〈主语〉∷=〈代词〉,
• 字母表 字母表是元素的非空有穷集合,我们把字母表 中的元素称为符号,因此字母表也称为符号集。不同 的语言可以有不同的字母表,例如:汉语的字母表中 包括汉字、数字及标点符号等,PASCAL语言的字母 表是由字母、数字、若干专用符号及BEGIN、IF之类 的保留字组成。
2020/9/7
21
符号串 由字母表中的符号组成的任何有穷序列称为符 号串,例如00 11 10 是字母表 ={0,1}上的符号 串.
第2章 文法与语言
主要内容
• 程序设计语言 • 语言概述 • 形式语言 • 符号和符号串 • 文法 • 语言(推导) • 语法树与句型分析 • 文法二义性 • 文法与语言分类
2020/9/7
2
主要内容
• 程序设计语言 • 语言概述 • 形式语言 • 符号和符号串 • 文法 • 语言(推导) • 语法树与句型分析 • 文法二义性 • 文法与语言分类
编译原理第二章文法和语言
语言的语法结构
总结词
语言的语法结构是语言形成和发展的核心要素,决定 了语言的表达方式和意义。
详细描述
语言的语法结构是指语言的组织规律和规则,包括词 法、句法、语义等方面的规则。词法规定了词汇的构 成和变化规则,如名词、动词、形容词等词类的划分 ;句法规定了句子结构的规则,如主语、谓语、宾语 等句子的成分及其排列顺序;语义则涉及到词汇和句 子的意义和解释。语言的语法结构是语言理解和生成 的基础,也是语言演变和发展的关键因素。
文法和语言的应用前景
1 2
人工智能领域
文法和语言是人工智能领域的重要基础,可用于 自然语言处理、机器翻译、语音识别等技术的研 究和应用。
计算机科学教育
文法和语言是计算机科学专业的重要课程之一, 对于培养计算机科学人才具有重要意义。
3
软件工程领域
文法和语言可用于软件工程领域中的编译器设计 和开发,提高软件开发的效率和可靠性。
05
文法和语言的未来发展
文法和语言的研究方向
形式语言理论
深入研究形式语言的基本理论, 包括语法、语义和语用等方面, 为自然语言处理和人工智能等领 域提供理论基础。
自然语言处理
结合自然语言处理技术,研究自 然语言的语法、语义和语用规律, 提高自然语言处理的准确性和效 率。
计算语言学
将计算语言学与形式语言理论相 结合,研究语言处理算法和模型, 为机器翻译、语音识别等领域提 供技术支持。
文法和语言的发展趋势
深度学习与文法和语言的结合
01
随着深度学习技术的发展,文法和语言的研究将更加注重与深
度学习的结合,以提高语言处理的性能和效率。
跨媒体语言处理
02
随着多媒体数据的普及,文法和语言的研究将逐渐扩展到跨媒
编译原理第二章 文法和语言
第一节 文法的直观概念
当我们表述一种语言时,无非是说明这种语言的句子,如果语言只含有有穷多个句子,则只需 列出句子的有穷集就行了,但对于有无穷句子的语言来讲,存在着如何给出它的有穷表示的问题。 以自然语言为例, 人们无法列出全部句子, 但是人们可以给出一些规则, 用这些规则来说明 (或 者定义)句子的组成结构,比如: “我是大学生” 。是汉语的一个句子。汉语句子可以是由主语后随 谓语而成,构成谓语的是动词和直接宾语,我们采用 EBNF 来表示这种句子的构成规则: 〈句子〉∷=〈主语〉 〈谓语〉 〈主语〉∷=〈代词〉|〈名词〉 〈代词〉∷=我|你|他 〈名词〉∷=王明|大学生|工人|英语 〈谓语〉∷=〈动词〉 〈直接宾语〉 〈动词〉∷=是|学习 〈直接宾语〉∷=〈代词〉|〈名词〉 “我是大学生”的构成符合上述规则,而“我大学生是”不符合上述规则,我们说它不是句子。 这些规则成为我们判别句子结构合法与否的依据。 一旦有了一组规则以后,我们可以按照如下方式用它们去推导或产生句子。我们开始去找∷= 左端的带有〈句子〉的规则并把它表示成∷=右端的符号串,这个动作表示成: 〈句子〉 〈主语〉 〈谓语〉 ,然后在得到的串〈主语〉 〈谓语〉中,选取〈主语〉或〈谓语〉 ,再用相应的规则∷=右端 代替之。比如,选取了〈主语〉,并采用规则〈主语〉∷=〈代词〉 ,那么得到: 〈主语〉 〈谓语〉〈代 词〉 〈谓语〉 ,重复做下去,我们得到句子: “我是大学生”的全部动作过程是: 〈句子〉 〈主语〉 〈谓语〉 〈谓语〉 〈代词〉 我〈谓语〉 〈直接宾语〉 我〈动词〉 我是〈直接宾语〉 我是〈名词〉 我是大学生 符号 的含义是,使用一条规则,代替 左边的某个符号,产生 右端的符号串。 显然,按照上述办法,不仅生成“我是大学生”这样的句子,还可以生成“王明是大学生” , “王 明学习英语” , “我学习英语” , “他学习英语” , “你是工人” , “你学习王明”等几十个句子。事实上, 使用文法作为工具,不仅为了严格地定义句子的结构,也是为了用适当条数的规则把语言的全部句 子描述出来,是以有穷的集合刻划无穷的集合的工具。
《编译原理》第2章 编译基础-形式语言与有穷自动机
整理课件
句型、推导
G[E]: E→E+T|T T→T*F|F F→(E)|a
对于句子a+a*a 有不同 的推导
EE+T T+T F+T a+T a+T*F a+F*F a+a*F a+a*a
EE+T E+T*F E+T*a E+F*a E+a*a T+a*a F+a*a a+a*a
整理课件
例:奇偶测试器
0
0
1
q0
q1
∈
1
自动机:M=(Q,∑ ,δ ,q0,Z)
Q={ q0, q1}
∑ ={0,1}
q0=q0 Z={q1}
整理课件
映射函数:
δ( q0,0)= q0 0
0
δ( q0,1)= q1
1
δ( q1,0)= q1 q0
q1
δ( q1,1)= q0
1
例:000110001
整理课件
第四节 正规文法与有穷自动机 1、正规文法 产生的语言的推导 例:文法 G=(VN,VT,P,S) 其中: VN={A,B,C}
VT={a,b,c} S=A P:A →aB A →aA
B →bB B →bC C →cC C →c
整理课件
A=>aA=>aaA=>…..=>aa…aB =>aa…abB=>aa…abb…bC =>aa…abb…bcC=> aa…abb…bccC => aa…abb…bcc…c
D→ε
Aa→bD
自然语言属于上下文有关文法
整理课件
文法的类型
句型、推导
G[E]: E→E+T|T T→T*F|F F→(E)|a
对于句子a+a*a 有不同 的推导
EE+T T+T F+T a+T a+T*F a+F*F a+a*F a+a*a
EE+T E+T*F E+T*a E+F*a E+a*a T+a*a F+a*a a+a*a
整理课件
例:奇偶测试器
0
0
1
q0
q1
∈
1
自动机:M=(Q,∑ ,δ ,q0,Z)
Q={ q0, q1}
∑ ={0,1}
q0=q0 Z={q1}
整理课件
映射函数:
δ( q0,0)= q0 0
0
δ( q0,1)= q1
1
δ( q1,0)= q1 q0
q1
δ( q1,1)= q0
1
例:000110001
整理课件
第四节 正规文法与有穷自动机 1、正规文法 产生的语言的推导 例:文法 G=(VN,VT,P,S) 其中: VN={A,B,C}
VT={a,b,c} S=A P:A →aB A →aA
B →bB B →bC C →cC C →c
整理课件
A=>aA=>aaA=>…..=>aa…aB =>aa…abB=>aa…abb…bC =>aa…abb…bcC=> aa…abb…bccC => aa…abb…bcc…c
D→ε
Aa→bD
自然语言属于上下文有关文法
整理课件
文法的类型
编译原理chapter2
•12
{ A, B, …, Z, a, b, …, z }, D: { 0, 1, …, 9 }
L D, LD, L6, L*, L(L D )*, D+
2.2 词法记号的描述与识别
2.2.2 正规式 正规式用来表示简单的语言,叫做正规集 正规式 定义的语言 {} {a} 备注
•13
2.1 词法记号及属性
2.1.3 词法错误
词法分析器对源程序采取非常局部的观点 难以发现下面的错误 fi (a == f (x) ) … 在实数是a.b格式下,可以发现下面的错误 123. 紧急方式的错误恢复 错误修补
•9
回顾
源程序 词法分析器 记号 (token) 取下一个记号 符号表
•25
delim
开始 delim other 22 *
20
21
2.3
有 限 自 动 机
•26
语言的识别是一个程序,它取串x作为输入,当x是语言句子 的时候,它回答“是”,否则回答“不是”。可以通过构造 称为有限自动机的更一般的转换图,把正规式翻译成识别器 。 有限自动机分为确定和不确定两种情况。“不确定”的含义 是,存在这样的状态,对于某个输入符号,它存在不止一种 转换。 确定和不确定的有限自动机能识别的语言正好是正规式所能 a 表达的语言。
•6
for
relation id
for
< , < = , = , … sum, count, D5 “seg. error”
字符f,o,r
< 或 <= 或 = 或 … 由字母开头的字母数字串
number
literal
3.1, 10, 2.8 E12
任何数值常数
编译原理 第二章
词法分析程序GETSYM将完成下列任务:
(1) 滤空格:空格在词法分析时是一种不可缺少的界符,而在语法分析时则是 无用的,所以必须滤掉。 (2) 识别保留字:设有一张保留字表。对每个字母打头的字母、数字字符串要 查此表。若查着则为保留字,将对应的类别放在SYM中。如IF对应值IFSYM,THEN 对应值为THENSYM。若查不着,则认为是用户定义的标识符。 (3) 识别标识符:对用户定义的标识符将IDENT放在SYM中,标识符本身的值放 在ID中。 (4) 拼数:当所取单词是数字时,将数的类别NUMBER放在SYM中,数值本身的值 存放在NUM中。 (5) 拼复合词:对两个字符组成的算符如:>=、∶=、<= 等单词,识别后将 类别送SYM中。 (6) 输出源程序:为边读入字符边输出(可输出在文件中)。
(1) 说明部分的分析
对每个过程(包括主程序,看成一个主过程)的说明对象造名字表TABLE,填写登录 所在的层次、标识符的属性和分配的相对位置。登录信息是调用ENTER过程完成的。 说明部分的处理对主程序看成是第0层过程,主程序定义的过程为第1层,随着嵌套 的深度增加而层次数加大。PL/0允许最大层次为3。 所造名字表放在全程量一维数组TABLE表中。TX为索引表的指针,表中的每个元素 为记录型数据。LEV给出层次,DX给出每层局部量当前已分配到的相对位置,可称地址 指示器,每说明完一个变量后DX指示器加1。 例如:
2.5 PL/0编译程序的目标代码结构和代码生成
编译程序的目标代码是在分析程序体时生成的,在处理说明部分时并不 生成目标代码,而当分析程序体中的每个语句时,当语法正确则调用目标代 码生成过程以生成与PL/0语句等价功能的目标代码,直到编译正常结束。 PL/0编译程序所产生的目标代码是一个假想栈式计算机的汇编语言,可 称为类PCODE指令代码,它不依赖任何具体计算机,其指令集极为简单,指令 格式也很单纯,其格式如下:
编译原理课件第二章
2
LL文法
从左到右扫描符号串,从左到右构建左推导,是递归下降式语法分析的基础。
3
LR文法
从左到右扫描符号串,从右到左构建右推导,是LR分析器(最常用的语法分析器) 的基础。
语义分析
符号表
类型检查
存储程序中所有标识符的信 息,如名字、值、数据类型、 作用域等。
对程序中的表达式进行类型 检查,检查其数据类型是否 匹配,发现类型错误,报告 错误信息。
目标代码生成
静态链接
所有和程序相关的代码和库都被合并到单一 静态程序中,生成的目标代码提供给编译器 后期处理和执行。
动态链接
当程序执行时,操作系统将共享库动态链接 到程序中。生成更小的目标程序,提高内存 效率。
中间代码生成
生成高级语言与目标代码之 间的中间代码。
优化器和中间代码
1 控制流分析
构建控制流图表示各 代码块的控制流程, 用于优化控制流程。
2 数据流分析
分析程序中信息的传 播和使用,用于优化 算法、寄存器分配和 内存使用。
3 中间代码
支持优化器的三元式、 四元式或间接三元式 形式,可以做优化、 可移植性更好。
编译原理第二章
编译器将源代码转换为目标代码的工具。编译过程分为三个部分:前端,优 化器和后端。本章介绍编译器的概述和基本部件。
编译器
前端
将源程序转换为内部表示, 检查其语法和语义。
优化器
将生成的代码优化,减少目 标代码的大小和时间成本。
后端
生成目标代码,包括中间代 码生成,寄存器分配和指令 生成。
词法分析
To ken
基本的词义单元是记号(Token),个记号表示源语言中的一个词、一个操作符、一个标点 符号或其他语法单元。
编译原理第二章综述
• 我们从“产生语言”的角度 出发,讨论文法和语言的形 式定义。 • 产生语言 指制定出有限 条规则,借助它们就能产生 出些语言的句子。 • 我们以几个英语句子构成的 语言为例进行讨论。并设每 个句子都是“主-谓-宾”结 构。 • 语法规则见右。其中,每个 用<>括起来的部分是所要 定义语言中的一个语法实体 (称为语法单位、语法结构 、语法范畴、语法变量等) 。“::=”是用于定义语法结 构的符号,其含义(并读作 )“定义为”.语法规则也 2019/4/10 称为产生式(Production)
注:为使用上的方便,我们用 ‘’ 代替产生式中的 ‘::=’。另外,在 不强调开始符S时,可将文法 G[S] 简记为G。 集合 VT 中的成员为 目标语言 中的符号,集合 VN 中的成员则不是。
2019/4/10
8/77
2.2.1 基本概念和术语
5.符号串集合的和与积 设A,B为两个符号串之集,定义 和 A+B(或A B) = {w | w A,或 w B} 积 A•B(或 AB)= { xy |x A, y B} 显然, A+ = +A = A ; A = A = ;因为εx=xε=x,所以{}A = A{} = A • 例:A={a,b},B={c,d}, AB= ? • {ac,ad,bc,bd}
5/77
2.2.1 基本概念和术语
3。符号串的前(后)缀及子串 设x是一个符号串,我们把从x的尾部删去若干个(包括0个)符 号之后所余下的部分称为x的前缀。把从x的首部删去若干个 (包括0个)符号之后所余下的部分称为x的后缀。 例:x=abc,则ε,a,ab,及abc都是x的前缀;
而ε,c,bc,abc都是x的后缀。 若x的前缀(后缀)不是X本身,则将其称为x的真前缀 (真后缀) 子串:从一个符号串中删去它的一个前缀和一个后缀之后 所余下的部分称为此符号串的子串。 例:x=abcd,则ε,a,b,c,d,ab,bc,cd,abc,bcd及abcd都是x 的子串。 可见,x的任何前缀和后缀都是x的子串,但其子串不一定 是x的前缀或后缀。特别地, ε和x本身既是x的前缀与 后缀,也是它的子串。 6/77 2019/4/10
注:为使用上的方便,我们用 ‘’ 代替产生式中的 ‘::=’。另外,在 不强调开始符S时,可将文法 G[S] 简记为G。 集合 VT 中的成员为 目标语言 中的符号,集合 VN 中的成员则不是。
2019/4/10
8/77
2.2.1 基本概念和术语
5.符号串集合的和与积 设A,B为两个符号串之集,定义 和 A+B(或A B) = {w | w A,或 w B} 积 A•B(或 AB)= { xy |x A, y B} 显然, A+ = +A = A ; A = A = ;因为εx=xε=x,所以{}A = A{} = A • 例:A={a,b},B={c,d}, AB= ? • {ac,ad,bc,bd}
5/77
2.2.1 基本概念和术语
3。符号串的前(后)缀及子串 设x是一个符号串,我们把从x的尾部删去若干个(包括0个)符 号之后所余下的部分称为x的前缀。把从x的首部删去若干个 (包括0个)符号之后所余下的部分称为x的后缀。 例:x=abc,则ε,a,ab,及abc都是x的前缀;
而ε,c,bc,abc都是x的后缀。 若x的前缀(后缀)不是X本身,则将其称为x的真前缀 (真后缀) 子串:从一个符号串中删去它的一个前缀和一个后缀之后 所余下的部分称为此符号串的子串。 例:x=abcd,则ε,a,b,c,d,ab,bc,cd,abc,bcd及abcd都是x 的子串。 可见,x的任何前缀和后缀都是x的子串,但其子串不一定 是x的前缀或后缀。特别地, ε和x本身既是x的前缀与 后缀,也是它的子串。 6/77 2019/4/10
编译原理教程 第二章
图2-2 不同输入字符的状态转换
第2章 词法分析
状态(即结点)数是有限的,其中必有一初始状态以及若 干终止状态,终止状态(终态)的结点用双圈表示以区别于其 它状态。图2-3给出了用于识别标识符、无符号整数、无符 号数的状态转换图,其初始状态均用0状态表示。
第2章 词法分析
(a) 标识符;(b) 无符号整数;(c) 无符号数
第2章 词法分析
对于给定的字母表Σ,正规式和正规集的递归定义如下: (1) ε和Ф都是Σ上的正规式,它们所表示的正规集分别 为{ε}和Ф。 (2) 对任一个a∈Σ,a是Σ上的一个正规式,它所表示的 正规集为{a}。 (3) 如果R和S是Σ上的正规式,它们所表示的正规集分 别为L(R) 和L(S),则: ① R∣S是Σ上的正规式,它所表示的正规集为 L(R)∪L(S); ② R·S是Σ上的正规式,它所表示的正规集为L(R) L(S); ③ (R)*是Σ上的正规式,它所表示的正规集为(L(R))*; ④ R也是Σ上的正规式,它所表示的正规集为L(R)。
第2章 词法分析
为了理解正规式与正规集的含义,我们以程序语言中的 标识符为例予以说明。程序语言中使用的标识符是一个以字 母开头的字母数字串,如果字母用letter表示,数字用digit表 示,则标识符可表示为
letter (letter∣digit)* 其中,letter与 (letter∣digit)*的并置表示两者的连接;括号 中的“∣”表示letter或digit两者选一;“ * ”表示零次或多 次引用由“ * ”标记的表达式;(letter∣digit)*是letter∣digit 的零次或多次并置,即表示一长度为0、1、2、…的字母数 字串;letter (letter∣digit)*表示以字母开头的字母数字串, 也即标识符集。letter (letter∣digit)*就是表示标识符的正规 式,而标识符集就是这个正规式所表示的正规集。
第2章 词法分析
状态(即结点)数是有限的,其中必有一初始状态以及若 干终止状态,终止状态(终态)的结点用双圈表示以区别于其 它状态。图2-3给出了用于识别标识符、无符号整数、无符 号数的状态转换图,其初始状态均用0状态表示。
第2章 词法分析
(a) 标识符;(b) 无符号整数;(c) 无符号数
第2章 词法分析
对于给定的字母表Σ,正规式和正规集的递归定义如下: (1) ε和Ф都是Σ上的正规式,它们所表示的正规集分别 为{ε}和Ф。 (2) 对任一个a∈Σ,a是Σ上的一个正规式,它所表示的 正规集为{a}。 (3) 如果R和S是Σ上的正规式,它们所表示的正规集分 别为L(R) 和L(S),则: ① R∣S是Σ上的正规式,它所表示的正规集为 L(R)∪L(S); ② R·S是Σ上的正规式,它所表示的正规集为L(R) L(S); ③ (R)*是Σ上的正规式,它所表示的正规集为(L(R))*; ④ R也是Σ上的正规式,它所表示的正规集为L(R)。
第2章 词法分析
为了理解正规式与正规集的含义,我们以程序语言中的 标识符为例予以说明。程序语言中使用的标识符是一个以字 母开头的字母数字串,如果字母用letter表示,数字用digit表 示,则标识符可表示为
letter (letter∣digit)* 其中,letter与 (letter∣digit)*的并置表示两者的连接;括号 中的“∣”表示letter或digit两者选一;“ * ”表示零次或多 次引用由“ * ”标记的表达式;(letter∣digit)*是letter∣digit 的零次或多次并置,即表示一长度为0、1、2、…的字母数 字串;letter (letter∣digit)*表示以字母开头的字母数字串, 也即标识符集。letter (letter∣digit)*就是表示标识符的正规 式,而标识符集就是这个正规式所表示的正规集。
编译原理第二章
二义文法: G(E): E i|E+E|E*E|(E)
无二义文法:
G(E):E T | E+T T F | T*F F (E) | i
表达式 项|表达式+项 项 因子 | 项*因子 因子 (表达式) | i
2.3.2 语法分析树与二义性
消除二义性:
E
E
E*E
E +E
i
E
+
E
E
*
E i
G(E): E i|E+E|E*E|(E) 是二义文法。
语言的二义性:一个语言是二义性的,如果对它 不存在无二义性的文法。
可能存在G和G’,一个为二义的,一个为无二义的。 但L(G)=L(G’)
二义性问题是不可判定问题,即不存在一个算法, 它能在有限步骤内,确切地判定一个文法是否是 二义的。
可以找到一组二义文法的充分条件。
i
i
i
i
用一种层次观点看待表达式
按照优先集和结合性
2021/3/30
29
2.3.2 语法分析树与二义性
E
用一种层次观点看待表达式
i*i+i
i * (i + i)
i * (i * i + i)
T
i * i * (i + i) + i * i + i
F
取消二义性的文法
i
E T | E + T
T F | T * F
程序设计语言不是上下文无关语言,甚至 不是上下文有关语言。
L7={c| (a|b)*}不能由上下文无关文 法产生,甚至连上下文有关文法也不能产 生,只能由0型文法产生。
现今程序设计语言的语言结构,用上下文 无关文法描述就足够了。
编译原理第二章_文法与语言
表示A上所有有穷长串的集合 例如:A={ab,c},AA={…… }, AAA={…… } A+ = A* A = AA*
(8)符号串集合的自反闭包
设符号串集合为A,则A的自反闭包记为A* ,定义为: A* = A0 ∪ A1 ∪ A2∪… ∪ An
即A* = A0 ∪ A+ = {ε} ∪ A+ 例如: A= {a,b},则 A*={ε, a, b, aa, ab, ba, bb, aaa, …… }
AB={xy|x∈A,y∈B} 如:若A={ab,c}, B={d,efg},则AB={abd,abefg,cd,cefg} 特别地,有:{ε}A=A{ε}=A
• 空集φ 表示不含任何元素的空集{ }。 有: φA=A φ= φ
<注>请区别: ε,{},{ε}三种表示方法的含义
12
(5) 符号串的方幂
a1 an 表示:从a1出发经过一步或若干步,可推导出an 。
定义2.5 长度为n(n≥0)的推导 a1 an 表示:从a1出发经过0步( a1 =an )或若干步,可推导
出an 。
22
2.2.3 句型、句子、语言
1.句型:设G[S]是一个文法,S是它的开始符号,若S α , 则称α是文法G[S]的句型。
5
(1) <句子>::= <主语> <谓语>
推导过程(3/5)
(2) <主语>::= <代词> | <名词> (3) <代词>::= 我 | 你 | 他 (4) <名词>::=王明| 大学生|工人|英语
(5) <谓语>::=<动词> <直接宾语>
(8)符号串集合的自反闭包
设符号串集合为A,则A的自反闭包记为A* ,定义为: A* = A0 ∪ A1 ∪ A2∪… ∪ An
即A* = A0 ∪ A+ = {ε} ∪ A+ 例如: A= {a,b},则 A*={ε, a, b, aa, ab, ba, bb, aaa, …… }
AB={xy|x∈A,y∈B} 如:若A={ab,c}, B={d,efg},则AB={abd,abefg,cd,cefg} 特别地,有:{ε}A=A{ε}=A
• 空集φ 表示不含任何元素的空集{ }。 有: φA=A φ= φ
<注>请区别: ε,{},{ε}三种表示方法的含义
12
(5) 符号串的方幂
a1 an 表示:从a1出发经过一步或若干步,可推导出an 。
定义2.5 长度为n(n≥0)的推导 a1 an 表示:从a1出发经过0步( a1 =an )或若干步,可推导
出an 。
22
2.2.3 句型、句子、语言
1.句型:设G[S]是一个文法,S是它的开始符号,若S α , 则称α是文法G[S]的句型。
5
(1) <句子>::= <主语> <谓语>
推导过程(3/5)
(2) <主语>::= <代词> | <名词> (3) <代词>::= 我 | 你 | 他 (4) <名词>::=王明| 大学生|工人|英语
(5) <谓语>::=<动词> <直接宾语>
编译原理课件第2章
第2章 词 法 分 析
在计算机内部,可以有不同的方式来表示记号的类别和属性。 一般情况下,记号的类别可以用整型编码或枚举类型表示,如表 2.1中每个记号类别可以用括号中的整型编码表示,如01表示const, 82表示id等。根据记号类别的不同,记号的属性的值可以有不同 的表示方法。relation的属性值是一个有限可枚举集合,可以用每 个属性值在集合中的位置来表示它,如1表示<,2表示<=,依此 类推。id的属性值是一个无限可枚举集合,因此,只能用每个标 识符的原始输入形式(字符串)来表示,如pi、draw_line等。字面 量的属性根据情况,其表示方式也不同,如数字字面量可由转义 后的实际值表示,如表示为3.1416而不是“3.1416”,而字符串字 面量就无需转义。
第2章 词 法 分 析
例2.1 对于语句:position := initial + rate * 60,可以识别出 下述序列:
标识符 特殊符号 标识符 特殊符号 标识符 特殊符号 数 字字面量
其中position、initial、rate均被识别为标识符,因为它们均符 合同一条规则,即以字母打头的字母数字串。记号至少含有两 个信息:一个是记号的类别,如“标识符”;另一个是记号的 值,如“position”。显然,如果把记号看作是一个类型的话,则 单词就是一个类型中的实例。由于我们总是说识别出一个标识 符,而不说识别出一个position或rate,因而将词法分析器识别出 的序列称为记号流。
第2章 词 法 分 析 例2.2 表达式mycount > 25由表2.2的三个记号组成。其中标 识符的属性值也可以由mycount在符号表中的入口(下标)来表示。
表2.2 记号的表示
第2章 词 法 分 析
编译原理第二章
• 占8个字节,student.studclass占2个字节,student.math 占 个字节, 占 个字节, 个字节 个字节 个字节, 占4个字节,可计算三者对应的偏移量为 、8、10,若student记录结构在 个字节 可计算三者对应的偏移量为0、 、 , 记录结构在 运行时被分配一个基址a,则其各分量的地址为: 运行时被分配一个基址 ,则其各分量的地址为: :a student.studclass:a+8 student.math:a+10
3.字符串、表格和队列
• 不同的语言根据不同的需要会拓展出一些实用数据类型。 不同的语言根据不同的需要会拓展出一些实用数据类型。 • 有越来越多的语言把字符串作为一种基本的数据类型,串的长度不 有越来越多的语言把字符串作为一种基本的数据类型, 加限制。这种数据类型给各种处理文字语言的程序带来很多便利。 加限制。这种数据类型给各种处理文字语言的程序带来很多便利。
2.表达式
• 表达式由运算对象和算符组成,对于多数程序语言来说,表达式的形式规 则如下: • (1)变量(包括下标变量)是表达式。 • (2)若E1、E2为表达式,θ是一个二元算符,则E1θE2是表达式。表达式 一般采用中缀形式。 • (3)若E是表达式,θ为一元算符,则θE或Eθ是表达式。 3 θ θ θ • (4)若E是表达式,则(E)是表达式。
结构分量是通过名字而不是像数组元素那样通过下标访问的。结构分 量的名字是所谓复合名字,例如“结构名.分量名”。结构分量的使用 与基本数据结构定义的变量相同,如下述3个赋值语句: • ="LIMING" • student.studclass=3 • student.math=95.4 每个分量的存储地址由记录结构的首地址与相应分量的偏移地址相加 而成。记录结构的每个分量(域)所占用的存储字节数称为该域的长 度。通过累加分量的长度可计算出各分量的偏移量。
3.字符串、表格和队列
• 不同的语言根据不同的需要会拓展出一些实用数据类型。 不同的语言根据不同的需要会拓展出一些实用数据类型。 • 有越来越多的语言把字符串作为一种基本的数据类型,串的长度不 有越来越多的语言把字符串作为一种基本的数据类型, 加限制。这种数据类型给各种处理文字语言的程序带来很多便利。 加限制。这种数据类型给各种处理文字语言的程序带来很多便利。
2.表达式
• 表达式由运算对象和算符组成,对于多数程序语言来说,表达式的形式规 则如下: • (1)变量(包括下标变量)是表达式。 • (2)若E1、E2为表达式,θ是一个二元算符,则E1θE2是表达式。表达式 一般采用中缀形式。 • (3)若E是表达式,θ为一元算符,则θE或Eθ是表达式。 3 θ θ θ • (4)若E是表达式,则(E)是表达式。
结构分量是通过名字而不是像数组元素那样通过下标访问的。结构分 量的名字是所谓复合名字,例如“结构名.分量名”。结构分量的使用 与基本数据结构定义的变量相同,如下述3个赋值语句: • ="LIMING" • student.studclass=3 • student.math=95.4 每个分量的存储地址由记录结构的首地址与相应分量的偏移地址相加 而成。记录结构的每个分量(域)所占用的存储字节数称为该域的长 度。通过累加分量的长度可计算出各分量的偏移量。
计算机程序编译原理 第2章 形式语言概论
文法举例
例2.6 1型文法G6=(VN ,VT ,P,S),其中VN={S,X,Y,Z}, VT={x , y , z} , P={S→xSYZ|xYZ, xY→xy, yY→yy, yZ→yz, ZY→YZ, zZ→zz} 例2.7 2型文法G7=(VN,VT,P,S),其中VN={S,T},VT={a, b,c, d},P={S→aTd, T→bT|cT|b|c } 例2.8 2型文法G8=(VN,VT,P,B),其中VN={B},VT={(,) }, P={B→(B)|BB|( )} 例2.9 2型文法G9=(VN,VT,P,S),其中VN={S},VT={0,1 }, P={S→0S1, S→01} 例2.10 正规文法G10=(VN,VT,P,A),其中VN={A, B, C, D}, VT={x, y, z },P={A→xB|yC, B→zB|y|yC, C→xD, D→yD|x }
文法和语言的几点说明
(1) 文法中某些非终结符不在任何规则的右部出现,该非 终结符称为不可到达的; (2) 文法中某些非终结符,由它不能推出终结符号串来, 称为不可终止的(无用非终结符); (3)可空终结符,可以用于消除左递归; (4)一个文法,如果它的一个句子有两棵或两棵以上的语法 树,则称该句子具有二义性。如果一个文法含有二义性的 句子,则该文法具有二义性。形如U→U的产生式。会引起 文法的二义性。
推导
定 义 2.3 G= ( VN, VT, P, S ) , α→β 是 文 法 G 的 产 生 式 , γ,δ∈V* , 若 有 v, w 满 足 : v=γαδ, w= γβδ, 则 说 : v (应用规则α→β)直接产生w 或说:w是v的直接推导 或说:w 直接归约到v 记作 v ⇒w。 例 G[S]:S→0S1, S→01 直接推导: 0S1⇒0011 (v=0S1,w=0011,使用规则S→01,γ=0,δ=1) S ⇒0S1 (v=S,w=0S1,使用规则S→0S1,γ=ε,δ= ε ) 0S1⇒00S11 (v=0S1,w=00S11,使用规则S→0S1,γ=0,δ=1) 定义2 定义2.4 v⇒+u 若存在v =α0 =>α1=>…=>αn=u, (n>0) 则称u为u的一个推导,记为v⇒+u。 定义2 定义2.5 v⇒*u 表示v⇒+u 或 v=u
编译原理第二章(2-构造文法)
直接推导举例
例1 文法G[E]: E →E+T|T T →T*F|F F →(E)|i
* T F * T*F F
例2 见P14
2.3.3 和语言有关的几个概念
2. 推导
设α0、α1、…αn均为(VT∪VN)*中的符号串,且有 α0α1α2…αn-1αn 则称以上序列是长度为n的推导,即α0可经过n步推导得到αn。
符号串的方幂 设x是符号串,xn 是x自身连结n次。并且x0= ε 则 x1= x x2= xx xn= xx……x= x xn-1 n个 例如, 设 x=abc,则 x1= abc x2= abcabc ……
符号串集合的方幂 A是符号串的集合, An 是集合A自身n次相乘, 并且A0= {ε} 则 A 1= A A2= AA An= AA……A= A An-1 (n>0) n个A 例1 A={a,b} A0= {ε} A1 = {a,b} A2= {aa,ab,ba,bb} A3= {aa,ab,ba,bb}· {a,b} = { aaa,aab,aba,abb,baa,bab,bba,bbb }
2.3.2文法的形式定义
文法是产生式的有穷非空的集合。 文法G是一个四元组,G[S]=(VT,VN,P,S)。 VT——终结符号集。 VN——非终结符号集。 S ——开始符号。至少要在一条产生式中作为左部出现。 P ——表示产生式的有穷非空的集合。
例1
定义标识符的文法
G[<标识符>]=({ A,B,…,Y,Z,0,1,…,9}, {<标识符>,<字母>,<数字>},P,<标识符>) P 定义为: <标识符>→<字母>|<标识符><字母>|<标识符><数字> <字母>→A|B|C|D|E|F|G|……|U|V|W|X|Y|Z
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
改变一个变体记录的标识符,在概念上建立了一个新记录; record price:real 变体记录在同一块存储区上重叠存放所有变体;
case boolean of 变体记录允许程序员根据每个变体的类型,以不同的观点 true:(amount:integer; where:dept); 来解释存储在该区域中的位串; false:(mouth_expected:month)
•
•
基本位串对程序员是不可见的。 优点: 导致不同的程序设计风格 可写性 可读性 例:25+9=34 可修改性 基本表示00011001+00001001 结果00100010
电子科技大学计算机科学与工程学院
程序设计语言与编译
2.编译时能检查变量使用的正确性 进行静态类型检查,如非法运算,形实参类型匹配 3.编译时可以确定无二义的操作 超载(多态)的概念:运算符的意义依赖于操作数的类 型。如“+”可以表示整数加或实数加 编译时,可拒绝混合运算,或提供类型转换指令 合理地使用超载,可以提高语言的可读性和可用性 4.精度控制
电子科技大学计算机科学与工程学院
程序设计语言与编译
边数
例:对于如前定义的多边形, 表示为 有两个域no-of-edges和edge任意正多边形 size,若t1是一个边长为7.53 的等边三角形,则可以写为: 在COBOL和PASCAL中 t1.no-of-edges = 3; 称为记录;在ALGOL中 每边边长 称为结构。 = 3.75; t1.edge-size
integer real
注意:语言把笛卡尔积数据对象看成由若干个域组成, 每个域有一个唯一的名字;通常用域名来选取域,对它进行 修改;
电子科技大学计算机科学与工程学院
程序设计语言与编译 2. 有限映像(射) 定义:从定义域类型DT(domain type)的值的 有限集合,到值域类型RT(range type)的值 的有限集合的函数称为有限映像(射) 。 在语言中 对应什么 构造?
判 定 或 幂
电子科技大学计算机科学与工程学院
集
程序设计语言与编译
例: 第四节 PASCAL语言数据类型结构 type day=(sunday,monday,tuseday,
1.非结构类型 内部类型
wednesday, thursday,
friday,saturday); //枚举
有序类型
type work_day=monday..friday; //子界 integer,real,boolean,char var class_day:work_day; class_day:=succ(class_day); //后继 每一元素都有唯一的前驱和后继 …… 如:整型,布尔型,字符型
put操作把缓冲区中的元素附加到文件末尾
电子科技大学计算机科学与工程学院
程序设计语言与编译 3.指针 指针是PASCAL的第三类数据类型,是非结构的, 可用来构造递归结构; 指针可引用匿名数据对象,这类对象由建 立语句NEW显示分配在堆上; 空指针nil的使用; 指针的操作:赋值,比较(相等或不等) PASCAL指针只能指向匿名数据对象,不能 指向在栈上分配的的单元
电子科技大学计算机科学与工程学院
程序设计语言与编译
4)
文件构造 PASCAL文件是任意类型的诸元素的序列;
例: Get操作把下一个元素读到缓冲区 type pattern=record …end; tape=file of pattern; var t1,t2:tape;
PASCAL文件仅能顺序处理; 只能进行 PUT 和 GET 操作;
PASCAL变体记录的缺点
使用变体记录不安全 可以对变体赋值 可以改变变体标识符 标识符域的标识符可省缺
end
电子科技大学计算机科学与工程学院
程序设计语言与编译
3)集合构造
PASCAL语言的SET构造符是幂集构造受限制的 形式,基类型只能是有序类型,而不能是实数、 集合类型。
例: type vegetable=(bean,cabbage,carrot,celery, lettuce,onion,mushroom,zucchizi); var my_salad,leftover:set of vegetable;
定义新的有序类型的方法
枚举型 子界型
其值不能直接读/写 动态检查范围
电子科技大学计算机科学与工程学院
程序设计语言与编译 2.聚合构造
下标(定义域)的类型;
1)数组构造
构造符ARRAY允许程序员定义有限映像;数组 构造的一般形式为: 元素(值域)的类型; array[t1] of [t2]
注意:PASCAL把下标类型不同的数组看成不同的类型 type a1=array[1..50] of integer;
解决办法: 引入符合数组概念--维数相同,成分类型相同 的数组;符合数组可以形、实参数匹配。
电子科技大学计算机科学与工程学院
程序设计语言与编译
2)记录构造
构造符RECORD用以定义笛卡尔积,一般形式为: Record field_1:type_1; field_2:type_2; 假设t,p是前面定义的多边形, „ t.no_of_edges:=3; field_n:type_n; t.edge_size:=7.53; end p:=t; 记录可以整体访问,也可用圆点“.”作为选择符访问 单个的域;
可看成是从1到50的整数到字符 集的有限映像
电子科技大学计算机科学与工程学院
程序设计语言与编译 3.序列 定义:序列由任意多个数据项组成,这些数据项 称为该序列的成分,且类型相同(记为CT)。
串的一般操作有4种: 例:串是从所周知的序列, 其成分类型为字符;顺序文 件的思路也来自序列的概念
连接
首项选取 尾项选取
子串
电子科技大学计算机科学与工程学院
程序设计语言与编译 4.递归 定义:若数据类型T包含属于同一类型T的成份, 那么类型T称为递归类型。
递归类型的特点:
1) 2)
允许在类型定义中使用被定义类型的名字 指针是建立递归数据对象的重要手段 例:二叉树可通过递归类型 来定义。它的左子树和右子 树分别是另一棵二叉树。
例如: 可读性 (选择名字) 例如: var a: record x:integer; 可修改性 type complex=record radius: real; (不修改变量说明) y:array[1..10] of char 可分性 (重复使用) angle: real; end 一致性检查 end var c1, c2, c3: complex;
内部类型:语言定义的 自定义类型:用户定义的
电子科技大学计算机科学与工程学院
程序设计语言与编译
第二节 内部类型
一. 内部类型的特点
•
内部类型反映基本硬件特性 在语言级,内部类型是共用某些操作的 数据对象的抽象表示
•
电子科技大学计算机科学与工程学院
程序设计语言与编译 二. 内部类型的优越性
1.基本表示的不可见性
电子科技大学计算机科学与工程学院
程序设计语言与编译
有限映像(射)的一些特点
在高级语言中通常体现为数组构造; 值域对象通过下标选取 下标越界会出错,动态检查 下标可用来选取值域的多个元素 SNOBOL4的ARRAY构造符并不要求值域集的所有元素是同 一类型的 例如:PASCAL中的数组说明: var a: array[1..50] of char
电子科技大学计算机科学与工程学院
程序设计语言与编译
内容回顾
2.运行时-代码段+活动记录 4.别名、副作用
笛卡尔积 有限映射 序 递 列 归
记录、结构 数组 字符串、 顺序文件 二叉树 联合、变体记录 集合
1.程序单元
1.编译时-源程序 3.活动记录
2.数据类型
1.值的集合+操作的集合 2.六种数据类型聚合方式
电子科技大学计算机科学与工程学院
程序设计语言与编译
4.小结
Pascal类型
非结构类型
指针类型 (递归)
结构类型
内部类型 整型 实型 字符型 布尔型
子界类型 记录类型 (迪卡尔积) 枚举类型 变体记录 (判定或)
数 组
集合 文件
电子科技大学计算机科学与工程学院
程序设计语言与编译
第六节 C语言数据类型结构
电子科技大学计算机科学与工程学院
程序设计语言与编译 5.判定或 定义:判定或是一个选择对象结构的构造机制, 规定在两个不同选择对象之间作出适当的选择; 每一选择对象结构称为变体。
例如:PASCAL和ADA中的变体 记录; C和ALGOL68中的联合。
电子科技大学计算机科学与工程学院
程序设计语言与编译 6.幂集 定义:类型T的元素所有子集的集合,称为幂集, 记为Powerset(T),T称为基类型。
可以通过数据类型显式定义数据的精度
电子科技大学计算机科学与工程学院
程序设计语言与编译
第三节 用户定义类型
许多语言除了定义内部类型外,还允许程 序员定义新的数据类型,规定基本数据对象的 聚合,乃至聚合的聚合。
How to define?
பைடு நூலகம்
电子科技大学计算机科学与工程学院
程序设计语言与编译 1. 笛卡尔积 定义:N个集合A1,A2,„,An 的笛卡尔积表示为 A1A2„An , 它 是 一 个 集 合 , 其 元 素 为 (a1,a2,„,an), 其中 aiAi 在语言中 对应什么 构造?
幂集类型的操作: 由于具有该类型的变量的值是一个子集,因此它 们的基本操作是集合的操作,比如:联合、与、以及 测试某个元素是否在一个集合中等。
电子科技大学计算机科学与工程学院
case boolean of 变体记录允许程序员根据每个变体的类型,以不同的观点 true:(amount:integer; where:dept); 来解释存储在该区域中的位串; false:(mouth_expected:month)
•
•
基本位串对程序员是不可见的。 优点: 导致不同的程序设计风格 可写性 可读性 例:25+9=34 可修改性 基本表示00011001+00001001 结果00100010
电子科技大学计算机科学与工程学院
程序设计语言与编译
2.编译时能检查变量使用的正确性 进行静态类型检查,如非法运算,形实参类型匹配 3.编译时可以确定无二义的操作 超载(多态)的概念:运算符的意义依赖于操作数的类 型。如“+”可以表示整数加或实数加 编译时,可拒绝混合运算,或提供类型转换指令 合理地使用超载,可以提高语言的可读性和可用性 4.精度控制
电子科技大学计算机科学与工程学院
程序设计语言与编译
边数
例:对于如前定义的多边形, 表示为 有两个域no-of-edges和edge任意正多边形 size,若t1是一个边长为7.53 的等边三角形,则可以写为: 在COBOL和PASCAL中 t1.no-of-edges = 3; 称为记录;在ALGOL中 每边边长 称为结构。 = 3.75; t1.edge-size
integer real
注意:语言把笛卡尔积数据对象看成由若干个域组成, 每个域有一个唯一的名字;通常用域名来选取域,对它进行 修改;
电子科技大学计算机科学与工程学院
程序设计语言与编译 2. 有限映像(射) 定义:从定义域类型DT(domain type)的值的 有限集合,到值域类型RT(range type)的值 的有限集合的函数称为有限映像(射) 。 在语言中 对应什么 构造?
判 定 或 幂
电子科技大学计算机科学与工程学院
集
程序设计语言与编译
例: 第四节 PASCAL语言数据类型结构 type day=(sunday,monday,tuseday,
1.非结构类型 内部类型
wednesday, thursday,
friday,saturday); //枚举
有序类型
type work_day=monday..friday; //子界 integer,real,boolean,char var class_day:work_day; class_day:=succ(class_day); //后继 每一元素都有唯一的前驱和后继 …… 如:整型,布尔型,字符型
put操作把缓冲区中的元素附加到文件末尾
电子科技大学计算机科学与工程学院
程序设计语言与编译 3.指针 指针是PASCAL的第三类数据类型,是非结构的, 可用来构造递归结构; 指针可引用匿名数据对象,这类对象由建 立语句NEW显示分配在堆上; 空指针nil的使用; 指针的操作:赋值,比较(相等或不等) PASCAL指针只能指向匿名数据对象,不能 指向在栈上分配的的单元
电子科技大学计算机科学与工程学院
程序设计语言与编译
4)
文件构造 PASCAL文件是任意类型的诸元素的序列;
例: Get操作把下一个元素读到缓冲区 type pattern=record …end; tape=file of pattern; var t1,t2:tape;
PASCAL文件仅能顺序处理; 只能进行 PUT 和 GET 操作;
PASCAL变体记录的缺点
使用变体记录不安全 可以对变体赋值 可以改变变体标识符 标识符域的标识符可省缺
end
电子科技大学计算机科学与工程学院
程序设计语言与编译
3)集合构造
PASCAL语言的SET构造符是幂集构造受限制的 形式,基类型只能是有序类型,而不能是实数、 集合类型。
例: type vegetable=(bean,cabbage,carrot,celery, lettuce,onion,mushroom,zucchizi); var my_salad,leftover:set of vegetable;
定义新的有序类型的方法
枚举型 子界型
其值不能直接读/写 动态检查范围
电子科技大学计算机科学与工程学院
程序设计语言与编译 2.聚合构造
下标(定义域)的类型;
1)数组构造
构造符ARRAY允许程序员定义有限映像;数组 构造的一般形式为: 元素(值域)的类型; array[t1] of [t2]
注意:PASCAL把下标类型不同的数组看成不同的类型 type a1=array[1..50] of integer;
解决办法: 引入符合数组概念--维数相同,成分类型相同 的数组;符合数组可以形、实参数匹配。
电子科技大学计算机科学与工程学院
程序设计语言与编译
2)记录构造
构造符RECORD用以定义笛卡尔积,一般形式为: Record field_1:type_1; field_2:type_2; 假设t,p是前面定义的多边形, „ t.no_of_edges:=3; field_n:type_n; t.edge_size:=7.53; end p:=t; 记录可以整体访问,也可用圆点“.”作为选择符访问 单个的域;
可看成是从1到50的整数到字符 集的有限映像
电子科技大学计算机科学与工程学院
程序设计语言与编译 3.序列 定义:序列由任意多个数据项组成,这些数据项 称为该序列的成分,且类型相同(记为CT)。
串的一般操作有4种: 例:串是从所周知的序列, 其成分类型为字符;顺序文 件的思路也来自序列的概念
连接
首项选取 尾项选取
子串
电子科技大学计算机科学与工程学院
程序设计语言与编译 4.递归 定义:若数据类型T包含属于同一类型T的成份, 那么类型T称为递归类型。
递归类型的特点:
1) 2)
允许在类型定义中使用被定义类型的名字 指针是建立递归数据对象的重要手段 例:二叉树可通过递归类型 来定义。它的左子树和右子 树分别是另一棵二叉树。
例如: 可读性 (选择名字) 例如: var a: record x:integer; 可修改性 type complex=record radius: real; (不修改变量说明) y:array[1..10] of char 可分性 (重复使用) angle: real; end 一致性检查 end var c1, c2, c3: complex;
内部类型:语言定义的 自定义类型:用户定义的
电子科技大学计算机科学与工程学院
程序设计语言与编译
第二节 内部类型
一. 内部类型的特点
•
内部类型反映基本硬件特性 在语言级,内部类型是共用某些操作的 数据对象的抽象表示
•
电子科技大学计算机科学与工程学院
程序设计语言与编译 二. 内部类型的优越性
1.基本表示的不可见性
电子科技大学计算机科学与工程学院
程序设计语言与编译
有限映像(射)的一些特点
在高级语言中通常体现为数组构造; 值域对象通过下标选取 下标越界会出错,动态检查 下标可用来选取值域的多个元素 SNOBOL4的ARRAY构造符并不要求值域集的所有元素是同 一类型的 例如:PASCAL中的数组说明: var a: array[1..50] of char
电子科技大学计算机科学与工程学院
程序设计语言与编译
内容回顾
2.运行时-代码段+活动记录 4.别名、副作用
笛卡尔积 有限映射 序 递 列 归
记录、结构 数组 字符串、 顺序文件 二叉树 联合、变体记录 集合
1.程序单元
1.编译时-源程序 3.活动记录
2.数据类型
1.值的集合+操作的集合 2.六种数据类型聚合方式
电子科技大学计算机科学与工程学院
程序设计语言与编译
4.小结
Pascal类型
非结构类型
指针类型 (递归)
结构类型
内部类型 整型 实型 字符型 布尔型
子界类型 记录类型 (迪卡尔积) 枚举类型 变体记录 (判定或)
数 组
集合 文件
电子科技大学计算机科学与工程学院
程序设计语言与编译
第六节 C语言数据类型结构
电子科技大学计算机科学与工程学院
程序设计语言与编译 5.判定或 定义:判定或是一个选择对象结构的构造机制, 规定在两个不同选择对象之间作出适当的选择; 每一选择对象结构称为变体。
例如:PASCAL和ADA中的变体 记录; C和ALGOL68中的联合。
电子科技大学计算机科学与工程学院
程序设计语言与编译 6.幂集 定义:类型T的元素所有子集的集合,称为幂集, 记为Powerset(T),T称为基类型。
可以通过数据类型显式定义数据的精度
电子科技大学计算机科学与工程学院
程序设计语言与编译
第三节 用户定义类型
许多语言除了定义内部类型外,还允许程 序员定义新的数据类型,规定基本数据对象的 聚合,乃至聚合的聚合。
How to define?
பைடு நூலகம்
电子科技大学计算机科学与工程学院
程序设计语言与编译 1. 笛卡尔积 定义:N个集合A1,A2,„,An 的笛卡尔积表示为 A1A2„An , 它 是 一 个 集 合 , 其 元 素 为 (a1,a2,„,an), 其中 aiAi 在语言中 对应什么 构造?
幂集类型的操作: 由于具有该类型的变量的值是一个子集,因此它 们的基本操作是集合的操作,比如:联合、与、以及 测试某个元素是否在一个集合中等。
电子科技大学计算机科学与工程学院