500 likes | 600 Views
第四章 程序语言的设计. 第一节 语言的定义 语言=语法+语义 语法 : 用以构造程序及其成分的一组规则 的集合 语义 : 用以规定语法正确的程序或其成分的含义的一组规则的集合. 一 . 语法 1 . 几个术语 ①字母表 : 语言允许使用字符的集合 , 其元素称为字符 ②符号 : 由字符组成的有限串(字符串) ③字汇表 : 由符号组成的集合,其元素称为字 ④词法规则 : 规定什么样的字符串可以构成语言的有效符号 ⑤语法规则 : 确定一个符号序列是否为一个句子 , 并提供句子的结构(什么样的符号序列是合法的 ). 2. 生成的观点
E N D
第四章 程序语言的设计 第一节 语言的定义 • 语言=语法+语义 • 语法:用以构造程序及其成分的一组规则 的集合 • 语义:用以规定语法正确的程序或其成分的含义的一组规则的集合
一.语法 1.几个术语 ①字母表:语言允许使用字符的集合,其元素称为字符 ②符号:由字符组成的有限串(字符串) ③字汇表:由符号组成的集合,其元素称为字 ④词法规则:规定什么样的字符串可以构成语言的有效符号 ⑤语法规则:确定一个符号序列是否为一个句子,并提供句子的结构(什么样的符号序列是合法的)
2. 生成的观点 ①一个简单英语句子的描述 I/Students study/run. ②文法:语言的一个完整的语法描述,记为(N,T,P,S) <句子>→<主语><谓语> <主语>→I|Students <谓语>→study|run ③语言:所有句子的集合
④”标识符”和”表达式”的定义(递归定义) (注意递归的结束条件) 标识符 <标识符>→<字母> <标识符>→<标识符><字母> <标识符>→<标识符><数字> <字母>→A|B|…|X|Y|Z|a|b|…|x|y|z <数字>→0|1|2|3|4|5|6|7|8|9
表达式 <表达式>→<标识符> <表达式>→(<表达式>) <表达式>→<表达式><运算符><表达式> <运算符>→+|-|*|/
x 1 N 2 n 3.识别的观点 用语法图来定义给定的语言 ①语法图的构造 • N→1|2|…|n对应一个语法图 • 终结符x • 非终结符N • N→1|2|…|n
g b1 b2 bm b • →12…m • →|
②识别原则:若一个终结符序列是合法的,那么,必须从语法图的入口边通过语法图而到达出口边,而且在通过的过程中,恰恰能识别该终结符序列。②识别原则:若一个终结符序列是合法的,那么,必须从语法图的入口边通过语法图而到达出口边,而且在通过的过程中,恰恰能识别该终结符序列。 Ⅰ.终结符框 Ⅱ.非终结符框 Ⅲ.分支、回溯 参见图4-6、图4-7、图4-8、图4-9 ③语言:语法图能识别的所有终结符序列的集合。
运算符 数字 + 标识符 字母 - 字母 * 图4-6 图4-7 / 表达式 数字 字母 表达式 字母 标识符 ( ) 表达式 ( ) 表达式 + 表达式 表达式 表达式 运算符 表达式 - * 图4-8 / 图4-9
4.语法描述的基本用途 ①表达语言设计者的意图和设计目标; ②指导语言的使用者如何写一个正确的程序; ③指导语言的实现者如何编写一个语法检查程序来识别所有合法的程序。
二.语义 例:大象吃花生 Elephants eat peanuts. 1.何谓语义? 定义语言合法句子的含义,即句子的作用和意义。 例:if(a>b)max=a;else max=b; 2. GAM的结构 • 指令指针+代码存储器C +数据存储器D • 举例:若懂汉语,可以将任何外语以汉语解释;亦即理解了汉语则理解了外语.
ip 代码存储器(C) 数据存储器(D)
第二节 文 法 一. 文法的定义 文法是描述语言的语法结构的形式规则,必须准确,易于理解,且描述能力强
1. 文法的形式定义 G=(VT,VN,S,P) 例 G0=(VT,VN,S,P): E→E+T|T T→T*F|F F→(E)|i 显然 VT ={+,*,(,),i} VN ={E,T,F} S=E P为上述产生式的集合
说明: ①→的读法, 其中V*VNV*, V*,V=VT VN ② → 1 → 2 . . . → n ③约定:用英文大写字母表示非终结符;小写字母表示终结符;希腊小写字母表示串 缩写为 → 1| 2|…| n
2. 文法的分类 ①0型文法:产生式形如→ ②1型文法:│α│<=│β│(S→例外)或产生式形如αAβ→αβ,V+ (上下文有关文法) ③2型文法:产生式形如A→α (上下文无关文法) ④3型文法:产生式形如A→α或A→αB (正则文法,右线性文法) VT *
3. 简化的上下文无关文法 ①不含形如A→A的有害规则 ②不含多余规则 即AVN, 必有S αAβ *
二. 文法产生的语言 1. 推导与归约 ①直接推导: αβα 即由产生式右边替换产生式左边 ②推导:α1 αn、α1 αn ③归约:推导的逆过程 + *
举例: 已知G(E) E→E+E│E*E│(E)│i i+i*i的推导过程 • E E+E E+E*E E+E*i E+i*i i+i*i • E E+E i+E i+E*E i+i*E i+i*i • E E*E E*i E+E*i E+i*i i+i*i
2. 句型和句子 • 设文法G=(VT,VN,S,P), 若S α, αV*, 则称α为文法G的一个句型。 • 若上述α VT,则称α是一个句子,即只含终结符的句型是一个句子。 * *
3. 文法产生的语言 文法G=(VT,VN,S,P)的句子的全体, 称为由文法G产生的语言, 记为L(G), 即 L(G)={α│S αα VT } * +
G2(I): I→L│LS S→T│ST T→L│D L→a│b│. . .│z D→0│1│2│ . . .│9
G3(S): S→aS│aP P→bP│bQ Q→cQ│c L(G3)={aibjck│i,j,k1}
G4(S): S→aSPQ│abQ QP→PQ bP→bb bQ→bc cQ→cc L(G4)={ aibici│i 1}
* Sai-1S(PQ)i-1 (i-1次使用第一个产生式) aibQ(PQ)i-1(使用第二个产生式) aib(PQ)i-1Q (i-1次使用第三个产生式) aib2(QP)i-2Q2(使用第四个产生式) aib3(QP)i-3Q3 (i-2次使用第三个产生式) …… aibiQi aibicQi-1 (使用第五个产生式) aibici(i-1次使用第六个产生式) * * * * * * * *
①文法的重要特性:用有限规则描述无穷语言 ②文法的等价:两个文法G和G’,如果有L(G)=L(G’),则称G和G’等价
4.语法树(推导树) ——以图的方式表示推导过程 ①推导树是一棵有序的标记树 • 每个结点的标记是文法G的非终结符或终结符; • 标记为A的内部结点从左到右有子结点X1,X2,…, Xn,则A→X1…Xn是一个产生式; • 如果有结点标记为,则它必是叶结点,且它是该父结点的唯一子结点。
E ) ( E E * E E E + i i i ②推导树的构造 例(i+i*i) E ) ( E E + E E E i * i i
③推导树的边缘:一棵推导树所有叶结点的从左到右的连接。③推导树的边缘:一棵推导树所有叶结点的从左到右的连接。 ④文法的二义性:一个句子有两棵不同的推导树。
第三节 语言的设计 • 设计的依据:设计目标— 面向的问题和面向的机器 • 设计内容:表达式、语句、程序单元、程序
第三节 语言的设计 一. 表达式的设计 表达式包括:逻辑表达式、关系表达式、算术表达式 1. 逻辑表达式 <逻辑表达式>→<布尔常量>│<布尔变量>│<关系表达式> │<逻辑表达式>│<逻辑表达式> <逻辑表达式> │<逻辑表达式> <逻辑表达式> <布尔常量>→true│false <布尔变量>→<标识符>
第三节 语言的设计 • 、 、 的优先顺序由低到高 • 布尔表达式的值为true(真)和false(假)
第三节 语言的设计 2. 关系表达式 <关系表达式>→<算术表达式> <关系运算符><算术表达式> <关系运算符>→<│<=│>│>=│=│<> • 关系运算符之间没有优先顺序、没有重载
第三节 语言的设计 3. 算术表达式 <算术表达式>→<常量>│<变量>│(<算术表达式>) │<算术表达式> <算术运算符><算术表达式> • 算术运算符之间有优先顺序、允许重载 • 算术运算符服从左结合 • 上述描述具有二义性
第三节 语言的设计 • 没有二义性的描述: <算术表达式>→<算术表达式>+<项>│<算术表达式>-<项>│<项> <项>→<因子>│<项>*<因子>│<项>/<因子> <因子>→(<算术表达式>)│<常量>│<变量> <变量>→<标识符> <常量>→<各种常量>
第三节 语言的设计 二.语句的设计 1.说明语句 <说明语句>→<常量说明>│<类型说明>│<变量说明> <常量说明>→const <标识符>=<常量> <类型说明>→type <类型名>=<用户定义类型> <变量说明>→var <变量表>:<类型> <变量表>→<变量>│<变量表>,<变量> <类型>→ integer│real│char│boolean│<类型名> <变量>→<标识符> <类型名>→<标识符>
第三节 语言的设计 2.执行语句 (1)赋值语句 <赋值语句>→<变量>:=<表达式> (2)控制语句 • 顺序、选择、重复 • 语句结束符 (3)复合语句 <复合语句>→begin <语句表> end <语句表>→<语句>│<语句表>;<语句>
第三节 语言的设计 3.程序单元的设计 <程序单元>→<程序单元关键字><程序单元名>(<形参表>);<程序单元体> <程序单元关键字>→procedure│function│class│… <程序单元名>→<标识符> <形参表>→<形参>│<形参表>;<形参> • 形参可以是变量、数组、过程等,必须说明类型及与实参的绑定方式
第三节 语言的设计 <程序单元体>→begin <说明部分>;<执行部分> end <说明部分>→<说明语句表> <说明语句表>→<说明语句>│<说明语句表>;<说明语句> <执行部分>→<执行语句表> <执行语句表>→<执行语句>│<执行语句表>;<执行语句>
第三节 语言的设计 <分程序>→begin <说明部分>;<执行部分> end <说明部分>→ <变量说明表> ;<数组说明表> ;<过程说明表> ;<分程序表> <变量说明表>→<变量说明>│<变量说明表>;<变量说明> <数组说明表>→<数组说明>│<数组说明表>;<数组说明> <过程说明表>→<过程说明>│<过程说明表>;<过程说明> <分程序表>→<分程序>│<分程序表>;<分程序>
第三节 语言的设计 4.程序的设计 <程序>→<分程序>
第三节 语言的设计 5.语言设计实例 • 问题:设计一个极小的语言,求n! if n<=0 then F:=1 else F:=n*F(n-1) • 机器:PC机
第三节 语言的设计 <程序>→<分程序> <分程序>→begin <说明语句表>;<执行语句表> end <说明语句表>→ <说明语句>│<说明语句表> ;<说明语句> <说明语句>→<变量说明>│<函数说明> <变量说明>→integer <变量>
第三节 语言的设计 <变量>→<标识符> <标识符>→<字母>│<标识符><字母>│ <标识符><数字> <字母>→a│b│c│d│e│f│g│h│i│j│k│l│m│n│o │p│q │r│s│t│u│v│w│x│y│z <数字>→0│1│2│3│4│5│6│7│8│9 <函数说明>→integer function <标识符>(<参数>);<函数体> <参数>→<变量>
第三节 语言的设计 <函数体>→begin <说明语句>;<执行语句表> end <执行语句表>→<执行语句>│<执行语句表>;<执行语句> <执行语句>→<读语句>│<写语句>│<赋值语句>│<条件语句> <读语句>→read(<变量>) <写语句>→write(<变量>)
第三节 语言的设计 <赋值语句>→<变量>:=<算术表达式> <算术表达式>→<算术表达式>-<项>│<项> <项>→<项>*<因子>│<因子> <因子>→<变量>│<常数>│<函数调用> <常数>→<无符号整数> <无符号整数>→<数字>│<无符号整数><数字>
第三节 语言的设计 <条件语句>→if<条件表达式>then<执行语句>else <执行语句> <条件表达式>→<算术表达式><关系运算符><算术表达式> <关系运算符>→<│<=│>│>=│=│<>
第三节 语言的设计 求n!的程序: begin integer k; integer function F(n); begin integer n; if n<=0 then F:=1 else F:=n*F(n-1) end; read(m); k:=F(m); write(k) end
第三节 语言的设计 6.一些设计准则 (1)可写性:语言通过提供一些构造来方便地表达设计方法以帮助完成程序设计。语言提供的这些构造,使得程序员可以把注意力集中在理解问题和求解问题上。可写性表现在简单性、可表达性、正交性和准确性等方面。 (2)可读性:抽象、注解;影响可修改性和可维护性 (3)可靠性:软件系统正常工作的能力。数据抽象、信息隐蔽、异常处理机制有利于提高可靠性。
第四章习题 • 4-1 ~ 4-4为思考题 • 4-5 ~ 4-11是必做题