50
第第第 第第第第第第第 第 第第第第第 第第 第第第 第第 =+ 第第 : 第第第第第第第第第第第 第第第 第第第 第第 : 第第第第第第第第第第第第第第第第第第第 第第第第第

第四章 程序语言的设计

  • Upload
    valmai

  • View
    107

  • Download
    1

Embed Size (px)

DESCRIPTION

第四章 程序语言的设计. 第一节 语言的定义 语言=语法+语义 语法 : 用以构造程序及其成分的一组规则 的集合 语义 : 用以规定语法正确的程序或其成分的含义的一组规则的集合. 一 . 语法 1 . 几个术语 ①字母表 : 语言允许使用字符的集合 , 其元素称为字符 ②符号 : 由字符组成的有限串(字符串) ③字汇表 : 由符号组成的集合,其元素称为字 ④词法规则 : 规定什么样的字符串可以构成语言的有效符号 ⑤语法规则 : 确定一个符号序列是否为一个句子 , 并提供句子的结构(什么样的符号序列是合法的 ). 2. 生成的观点 - PowerPoint PPT Presentation

Citation preview

Page 1: 第四章 程序语言的设计

第四章 程序语言的设计

第一节 语言的定义

语言=语法+语义 语法 : 用以构造程序及其成分的一组规则 的集合

语义 : 用以规定语法正确的程序或其成分的含义的一组规则的集合

Page 2: 第四章 程序语言的设计

一 . 语法 1. 几个术语 ①字母表:语言允许使用字符的集合,其元素称为字符 ②符号:由字符组成的有限串(字符串) ③字汇表:由符号组成的集合,其元素称为字 ④词法规则:规定什么样的字符串可以构成语言的有效符号

⑤语法规则:确定一个符号序列是否为一个句子 ,并提供句子的结构(什么样的符号序列是合法的)

Page 3: 第四章 程序语言的设计

2. 生成的观点①一个简单英语句子的描述 I/Students study/run.② 文法 : 语言的一个完整的语法描述 ,记为 (N,T,P,S)

< 句子 >→<主语 ><谓语 > < 主语 >→I|Students < 谓语 >→study|run ③语言 :所有句子的集合

Page 4: 第四章 程序语言的设计

④”标识符”和”表达式”的定义(递归定义) (注意递归的结束条件)标识符 <标识符>→<字母> <标识符>→<标识符><字母 > <标识符>→<标识符><数字 > <字母 >→A|B|…|X|Y|Z|a|b|…|x|y|z <数字 >→0|1|2|3|4|5|6|7|8|9

Page 5: 第四章 程序语言的设计

表达式 < 表达式 >→<标识符 > < 表达式 >→(< 表达式 >) < 表达式 >→< 表达式 >< 运算符 >< 表达式 >

< 运算符 >→+|-|*|/

Page 6: 第四章 程序语言的设计

3.识别的观点用语法图来定义给定的语言①语法图的构造

» N→1|2|…|n对应一个语法图

» 终结符 x

» 非终结符N

» N→1|2|…|n

x

N

2

n

1

Page 7: 第四章 程序语言的设计

1 2 m

» →12…m

» →|

Page 8: 第四章 程序语言的设计

②识别原则 :若一个终结符序列是合法的,那么 ,必须从语法图的入口边通过语法图而到达出口边,而且在通过的过程中 ,恰恰能识别该终结符序列。

Ⅰ.终结符框 Ⅱ.非终结符框 Ⅲ.分支、回溯参见图 4-6 、图 4-7 、图 4-8 、图 4-9

③语言 :语法图能识别的所有终结符序列的集合。

Page 9: 第四章 程序语言的设计

标识符

表达式

运算符

表达式

( )

表达式 表达式

字母字母

数数标识符

字母 数数

数数表达式

表达式( )

表达式 + 表达式

-

/

+

-

/

运算符

图 4-6 图 4-7

图 4-8

图 4-9

Page 10: 第四章 程序语言的设计

4. 语法描述的基本用途①表达语言设计者的意图和设计目标 ;② 指导语言的使用者如何写一个正确的程序;

③ 指导语言的实现者如何编写一个语法检查程序来识别所有合法的程序。

Page 11: 第四章 程序语言的设计

二 .语义例:大象吃花生 Elephants eat peanuts. 1.何谓语义? 定义语言合法句子的含义,即句子的作用和意义。例:if(a>b)max=a;else max=b;

2. GAM的结构 指令指针+代码存储器C +数据存储器D 举例:若懂汉语,可以将任何外语以汉语解释;亦即理解了汉语则理解了外语.

Page 12: 第四章 程序语言的设计

ip

代码存储器( C )

数据存储器( D )

Page 13: 第四章 程序语言的设计

第二节 文 法

一 . 文法的定义 文法是描述语言的语法结构的形式规则 ,必须准确 ,易于理解 ,且描述能力强

Page 14: 第四章 程序语言的设计

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 为上述产生式的集合

Page 15: 第四章 程序语言的设计

说明 : ①→ 的读法 ,

其中 V*VNV*, V* , V = VT VN

② → 1

→ 2 . . .

→ n

③约定:用英文大写字母表示非终结符;小写字母表示终结符;希腊小写字母表示串

缩写为 → 1| 2|…| n

Page 16: 第四章 程序语言的设计

2. 文法的分类 ①0型文法 :产生式形如→ ②1型文法 :│α│<=│β│ ( S→ 例外)或产生式形如 αAβ→αβ , V +

(上下文有关文法 ) ③2型文法 :产生式形如 A→α (上下文无关文法 )

④3型文法 :产生式形如 A→α 或 A→αB

( 正则文法 ,右线性文法 ) VT

*

Page 17: 第四章 程序语言的设计

3. 简化的上下文无关文法

①不含形如 A→A 的有害规则

②不含多余规则

即 AVN, 必有 S αAβ*

Page 18: 第四章 程序语言的设计

二 . 文法产生的语言1. 推导与归约

①直接推导 : αβ α

即由产生式右边替换产生式左边

②推导 :α1 αn、 α1 αn

③归约 :推导的逆过程

* +

Page 19: 第四章 程序语言的设计

举例 : 已知 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

Page 20: 第四章 程序语言的设计

2. 句型和句子 设文法 G=(VT,VN,S,P), 若 S α, αV*, 则称 α

为文法 G 的一个句型句型。 若上述 α VT ,则称 α 是一个句子,即只含终结符的句型是一个句子句子。

*

*

Page 21: 第四章 程序语言的设计

3. 文法产生的语言

文法 G=(VT,VN,S,P) 的句子的全体 , 称为由文法 G产生的语言 , 记为 L(G), 即

L(G)={α│S αα VT }+ *

Page 22: 第四章 程序语言的设计

G2(I):

I→L│LS

S→T│ST

T→L│D

L→a│b│. . .│z

D→0│1│2│ . . .│9

Page 23: 第四章 程序语言的设计

G3(S):

S→aS│aP

P→bP│bQ

Q→cQ│c

L(G3)={aibjck│i,j,k1}

Page 24: 第四章 程序语言的设计

G4(S):

S→aSPQ│abQ

QP→PQ

bP→bb

bQ→bc

cQ→cc

L(G4)={ aibici│i 1}

Page 25: 第四章 程序语言的设计

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 次使用第六个产生式 )

*

*

*

***

*

**

Page 26: 第四章 程序语言的设计

① 文法的重要特性 : 用有限有限规则描述无穷无穷语言

② 文法的等价 :两个文法 G 和 G’,如果有 L(G)=L(G’), 则称 G 和 G’等价等价

Page 27: 第四章 程序语言的设计

4.语法树(推导树) ——以图的方式表示推导过程 ①推导树是一棵有序的标记树 每个结点的标记是文法 G 的非终结符或终结符; 标记为 A 的内部结点从左到右有子结点 X1, X2,… , Xn, 则 A→X1…Xn是一个产生式 ;

如果有结点标记为,则它必是叶结点,且它是该父结点的唯一子结点。

Page 28: 第四章 程序语言的设计

②推导树的构造 例( i+i*i )

E

( E )

E E*

E E+

i i

i

E

( E )

E E+

EEi

ii

*

Page 29: 第四章 程序语言的设计

③推导树的边缘边缘:一棵推导树所有叶结点的从左到右的连接。

④ 文法的二义性:一个句子句子有两棵不同的推导树。

Page 30: 第四章 程序语言的设计

设计的依据:设计目标— 面向的问题和面向的机器

设计内容:表达式、语句、程序单元、程序

第三节 语言的设计

Page 31: 第四章 程序语言的设计

一 . 表达式的设计 表达式包括:逻辑表达式、关系表达式、算术表达式

1. 逻辑表达式

< 逻辑表达式 >→< 布尔常量 >│< 布尔变量 >│< 关系表达式 >

│< 逻辑表达式 >│< 逻辑表达式 > < 逻辑表达式 >

│< 逻辑表达式 > < 逻辑表达式 >

< 布尔常量 > →true│false

< 布尔变量 > →< 标识符 >

第三节 语言的设计

Page 32: 第四章 程序语言的设计

、 、 的优先顺序由低到高

布尔表达式的值为 true (真)和 false (假)

第三节 语言的设计

Page 33: 第四章 程序语言的设计

2. 关系表达式< 关系表达式 >→< 算术表达式 > < 关系运算符 > <

算术表达式 > < 关系运算符 > →<│<=│>│>=│=│<> 关系运算符之间没有优先顺序、没有重载

第三节 语言的设计

Page 34: 第四章 程序语言的设计

3. 算术表达式< 算术表达式 >→< 常量 >│< 变量 >│ ( < 算术表达

式 > ) │ < 算术表达式 > < 算术运算符 > < 算术表达式 >

算术运算符之间有优先顺序、允许重载 算术运算符服从左结合 上述描述具有二义性

第三节 语言的设计

Page 35: 第四章 程序语言的设计

没有二义性的描述:

< 算术表达式 >→< 算术表达式 >+< 项 >│< 算术表达式 >-< 项 >│< 项 >

< 项 >→< 因子 >│< 项 >*< 因子 >│< 项 >/< 因子 >

< 因子 >→ ( < 算术表达式 > )│ < 常量 >│< 变量 >

< 变量 >→< 标识符 >

< 常量 >→< 各种常量 >

第三节 语言的设计

Page 36: 第四章 程序语言的设计

二 . 语句的设计1. 说明语句< 说明语句 >→< 常量说明 >│< 类型说明 >│< 变量说明 >< 常量说明 >→const < 标识符 >=< 常量 >< 类型说明 >→type < 类型名 >=< 用户定义类型 >< 变量说明 >→var < 变量表 > : < 类型 >< 变量表 >→< 变量 >│< 变量表 > , < 变量 > < 类型 >→ integer│real│char│boolean│< 类型名 > < 变量 >→< 标识符 >< 类型名 >→< 标识符 >

第三节 语言的设计

Page 37: 第四章 程序语言的设计

2. 执行语句( 1 )赋值语句< 赋值语句 >→< 变量 >:=< 表达式 >( 2 )控制语句 顺序、选择、重复 语句结束符( 3 )复合语句< 复合语句 >→begin < 语句表 > end< 语句表 >→< 语句 >│< 语句表 > ; < 语句 >

第三节 语言的设计

Page 38: 第四章 程序语言的设计

3. 程序单元的设计< 程序单元 >→< 程序单元关键字 >< 程序单元名 >(< 形参表

>) ; < 程序单元体 >< 程序单元关键字 >→procedure│function│class│…< 程序单元名 >→< 标识符 >< 形参表 >→< 形参 >│< 形参表 > ; < 形参 > 形参可以是变量、数组、过程等,必须说明类型及与

实参的绑定方式

第三节 语言的设计

Page 39: 第四章 程序语言的设计

< 程序单元体 >→begin < 说明部分 > ; < 执行部分 > end

< 说明部分 >→< 说明语句表 >

< 说明语句表 >→< 说明语句 >│< 说明语句表 > ; < 说明语句 >

< 执行部分 >→< 执行语句表 >

< 执行语句表 >→< 执行语句 >│< 执行语句表 > ; < 执行语句 >

第三节 语言的设计

Page 40: 第四章 程序语言的设计

< 分程序 >→begin < 说明部分 > ; < 执行部分 > end

< 说明部分 >→ < 变量说明表 > ; < 数组说明表 > ; < 过程说明表 > ;

< 分程序表 >

< 变量说明表 >→< 变量说明 >│< 变量说明表 > ; < 变量说明 >

< 数组说明表 >→< 数组说明 >│< 数组说明表 > ; < 数组说明 >

< 过程说明表 >→< 过程说明 >│< 过程说明表 > ; < 过程说明 >

< 分程序表 >→< 分程序 >│< 分程序表 > ; < 分程序 >

第三节 语言的设计

Page 41: 第四章 程序语言的设计

4. 程序的设计< 程序 >→< 分程序 >

第三节 语言的设计

Page 42: 第四章 程序语言的设计

5. 语言设计实例 问题:设计一个极小的语言,求 n !

if n<=0 then F:=1 else F:=n*F(n-1)

机器: PC 机

第三节 语言的设计

Page 43: 第四章 程序语言的设计

< 程序 >→< 分程序 >

< 分程序 >→begin < 说明语句表 > ; < 执行语句表 > end

< 说明语句表 >→ < 说明语句 >│< 说明语句表 > ; < 说明

语句 >

< 说明语句 >→< 变量说明 >│< 函数说明 >

< 变量说明 >→integer < 变量 >

第三节 语言的设计

Page 44: 第四章 程序语言的设计

< 变量 >→< 标识符 >

< 标识符 >→< 字母 >│< 标识符 >< 字母 >│ < 标识符 >< 数字 >

< 字母 >→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 < 标识符 > ( < 参数 > ); < 函数体 >

< 参数 >→< 变量 >

第三节 语言的设计

Page 45: 第四章 程序语言的设计

< 函数体 >→begin < 说明语句 > ; < 执行语句表 > end

< 执行语句表 >→< 执行语句 >│< 执行语句表 > ; < 执行语

句 >

< 执行语句 >→< 读语句 >│< 写语句 >│< 赋值语句 >│< 条件语句

>

< 读语句 >→read(< 变量 >)

< 写语句 >→write(< 变量 >)

第三节 语言的设计

Page 46: 第四章 程序语言的设计

< 赋值语句 >→< 变量 >:=< 算术表达式 >

< 算术表达式 >→< 算术表达式 >-< 项 >│< 项 >

< 项 >→< 项 >*< 因子 >│< 因子 >

< 因子 >→< 变量 >│< 常数 >│< 函数调用 >

< 常数 >→< 无符号整数 >

< 无符号整数 >→< 数字 >│< 无符号整数 >< 数字 >

第三节 语言的设计

Page 47: 第四章 程序语言的设计

< 条件语句 >→if< 条件表达式 >then< 执行语句 >else < 执行语句 >

< 条件表达式 >→< 算术表达式 >< 关系运算符 ><

算术表达式 >< 关系运算符 > →<│<=│>│>=│=│<>

第三节 语言的设计

Page 48: 第四章 程序语言的设计

求 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

第三节 语言的设计

Page 49: 第四章 程序语言的设计

6. 一些设计准则( 1 )可写性:语言通过提供一些构造来方便地表达设

计方法以帮助完成程序设计。语言提供的这些构造,使得程序员可以把注意力集中在理解问题和求解问题上。可写性表现在简单性、可表达性、正交性和准确性等方面。

( 2 )可读性:抽象、注解;影响可修改性和可维护性( 3 )可靠性:软件系统正常工作的能力。数据抽象、

信息隐蔽、异常处理机制有利于提高可靠性。

第三节 语言的设计

Page 50: 第四章 程序语言的设计

第四章习题

4-1 ~ 4-4 为思考题 4-5 ~ 4-11 是必做题