1 / 79

第 2 章 高级语言 及其语法描述

第 2 章 高级语言 及其语法描述. 本章主要内容. 本章概述高级语言的结构和主要的共同特征,并介绍程序语言的语法描述方法。 2.1 程序语言的定义 2.2 高级语言的一般特性 2.3 程序语言的语法描述. 2.1 程序语言的定义. 任何语言实现的基础是语言的定义。语言的定义决定了该语言具有什么样的 语言功能 、什么样的 数据结构 、什么样的 程序结构 以及具体的 使用形式 等形式问题。 对于语言用户来说,语言定义就是一本用户手册; 对于编译程序设计者来说,语言定义就是具体实现的理论依据。.

lorin
Download Presentation

第 2 章 高级语言 及其语法描述

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第2章 高级语言 及其语法描述

  2. 本章主要内容 本章概述高级语言的结构和主要的共同特征,并介绍程序语言的语法描述方法。 2.1 程序语言的定义 2.2 高级语言的一般特性 2.3 程序语言的语法描述

  3. 2.1 程序语言的定义 任何语言实现的基础是语言的定义。语言的定义决定了该语言具有什么样的语言功能、什么样的数据结构、什么样的程序结构以及具体的使用形式等形式问题。 • 对于语言用户来说,语言定义就是一本用户手册; • 对于编译程序设计者来说,语言定义就是具体实现的理论依据。

  4. 一个程序语言是一个记号系统。主要由语法和语义两个方面定义。一个程序语言是一个记号系统。主要由语法和语义两个方面定义。 2.1.1 语法 任何语言程序都可以看成是一定字符集(称为字母表)上的字符串(有限序列)。 所谓一个语言的语法是指这样的一组规则,用它可以形成和产生一个合式的程序。这些规则一部分称为词法规则,另一部分能称为语法规则(或产生规则)。

  5. 注意这里提到三个概念: • 一个程序只是用一个有限字符集作为字母表; • 词法规则是指单词符号的形成规则。单词符号一般包括:各类型的常数、标识符、基本字、算符和界符等。 • 语言的语法规则规定了如何从单词符号形成更大的结构(即语法单位),换言之,语法规则是语法单位的形成规则。 一般程序语言的语法单位有:表达式、语句、分程序、函数、过程和程序等。

  6. 2.1.2 语义 对于一个语言来说,不仅要给出它的词法、语法规则,而且要定义它的单词符号和语法单位的意义。这就是语义问题。 语义是指这样的一组规则,使用它可以定义一个程序的意义。 采用的方法:基于属性文法的语法制导翻译方法。

  7. 程序 子程序 或 分程序 语句 表达式 算符 函数调用 数据引用 一个程序语言的基本功能是描述数据和对数据的运算。所谓程序,从本质上来说是描述一定数据的处理过程。在现今的程序语言中,一个程序大体可以视为下面所示的层次结构:

  8. 2.2 高级语言的一般特性 2.2.1 高级语言的分类 • 强制式语言(过程式语言) FORTRAN、C、Pascal • 应用式语言(函数式语言) LISP • 基于规则的语言(逻辑程序设计语言) Prolog • 面向对象语言 Visual C++、Visual Basic.NET

  9. 强制式语言(过程式) • 命令驱动,面向语句 • 这类语言遵循了通常计算机体系结构指令的顺序执行机制,多种语言从属于命令式语言 C、C++、FORTRAN、ALGOL、Pascal、Ada、COBOL等 • 程序特点: 语句1; 语句2; 语句3; …… 语句的执行引起存储单元中值的改变。

  10. 应用式(函数式) • 注重程序表示的功能,而不是程序的一个个语句执行时状态的变化 LISP、ML • 程序特点: Function n(…Function2(Function1(data))…) • 程序执行: 执行一个个函数施用在数据上的变换最终得到的结果 • 编译: 语法分析容易; 语义处理复杂;

  11. 基于规则的语言 • 通过检查某一个条件是否被满足来决定相应的动作是否被执行 • Prolog、BNF语法分析技术、YACC等 • 程序特点(语法形式): 条件1 动作1 条件2 动作2 条件3 动作3

  12. 面向对象语言 • 封装、继承和多态机制 • Smalltalk是完全面向对象的语言,而C++、Ada等语言是在现有的类型机制上加入了继承等概念

  13. 2.2.2 程序结构 • 一、FORTRAN • 一个FORTRAN 程序由一个主程序段和若干个(可以是0个)辅助程序段组成。(如右侧) FORTRAN MAIN … END SUBROUTINE SUB1 … END … SUBROUTINE SUBn … END 辅助程序段可以是子程序、函数段或数据。每程序段由一系列说明语句和执行语句组成。各程序段可以独立编译。 一个FORTRAN 程序各程序段所定义的各种名字通常是彼此独立的。

  14. 二、Pascal Pascal 是一个允许子程序嵌套定义的语言。一个Pascal程序可以看作是操作系统调用的一个子程序,而子程序中又可以定义别的子程序。是一种嵌套结构。 program main … procedure P1; … procedure P11; … begin … end; begin … end; procedure P2; … begin … end; begin … end

  15. 三、Java语言 Java是一种面向对象的高级语言,它很重要的方面是类和继承的概念,同时支持多态性和动态绑定等特性。 class car{ int color_number; int speed; push_break(){..} … } 封装、继承和多态。 在Java中,变量和方法的定义之前可以加上public、private、protected等修饰词,以限制其它类的对象对这些变量和方法的使用。

  16. 2.2.3 数据类型与操作 一个数据类型通常包括以下三种要素: • 用于区别这种类型的数据对象的属性 • 这种类型的数据对象可以具有的值 • 可以作用于这种类型数据对象的操作 单元的内容为名字的值 名字 存储单元 决定了它能具有什么样的值; 值在计算机内的表示方式; 对它能施加什么运算。 类型 属性 作用域 名字的作用域规定了值的存在范围。 说明语句

  17. 一、初等数据类型 常见的初等数据类型有: • 数值数据 • 逻辑数据 • 字符数据 • 指针类型 二、数据结构 • 数组 从逻辑上说,一个数组是由同一类型数据所组成的某种n维矩形结构。 数组的每个元素是矩形结构中的一个点,它的位置可通过给出每维的下标来确定。

  18. 根据数组的类型,每个数组元素在计算机中占有同样大小的存储空间。如果一个数组所需的存储空间大小在编译时就已知道则称此数组是一个确定数组;否则称为可变数组。根据数组的类型,每个数组元素在计算机中占有同样大小的存储空间。如果一个数组所需的存储空间大小在编译时就已知道则称此数组是一个确定数组;否则称为可变数组。 设int A[l1…u1][l2…u2]…[ln…un]为n维数组, 各维的长度:di=ui-li+1(1≤i≤n) • 数组的存储表示有多种形式,最简单的一种是把整个数组按行(或按列)存放在一片连续存储区中。 • 数组元素的地址计算和数组的存储方式密切相关。编译程序要实现地址计算公式,使数组元素得到正确的引用。

  19. 在编译过程中,当碰到数组说明时,必须把数组的有关的信息记录在一个“内情向量”之中,以便以后计算数组元素的地址时引用这些信息。每个数组的内情向量必须包括:维数,各维的上下限,首地址,以及数组元素的类型等。在编译过程中,当碰到数组说明时,必须把数组的有关的信息记录在一个“内情向量”之中,以便以后计算数组元素的地址时引用这些信息。每个数组的内情向量必须包括:维数,各维的上下限,首地址,以及数组元素的类型等。 • 对于确定数组来说,内情向量可登记在编译时的符号表中,对于可变数组,内情向量的信息在编译时无法全部知道,只有到运行阶段才能全确定下来,存贮分配也要等到运行时方能进行。

  20. K K+1 … K+20 … K+24 … • 记录 从逻辑上说,记录结构是由已知类型的数据组合起来的一种结构。 Struct student { char name[20]; boolean partmember; int age; }stu; 记录结构最简单的存贮方式是连续存放。上述变量stu共占7个字,共28个字节

  21. 3.抽象数据类型 一个抽象数据类型包括: • 数据对象的一个集合 • 作用于这些数据对象的抽象运算的集合 • 这种类型对象的封装 C++、Java语言通过类对抽象类型提供支持。

  22. 2.2.4 语句与控制结构 一、表达式 一个表达式是由运算量(亦称操作数,即数据引用或函数调用)和算符组成的。 对于大多数程序语言来说,表达式的形成规则可概括为: (1)变量(包括下标变量)、常数是表达式; (2)若E1、E2为表达式,θ为二元算符,则 E1 θ E2为表达式; (3)若E为表达式, θ为一元算符,则θE为表达式; (4)若E为表达式,则(E)是表达式。

  23. 在多数语言中算术算符和逻辑算符的优先顺序一般规定如下:在多数语言中算术算符和逻辑算符的优先顺序一般规定如下: 乘幂 ( ** 或 ↑ ) 一元负 ( - ) 乘、除 ( * , /, ÷ ) 加、减 ( + , - ) 关系符 ( < , = , >, <=, <>, >= ) 非 ( ﹁, not, 或 .NOT. ) 与 (∧, &, and 或 .AND. ) 或 ( ∨,∣, or 或 .OR . ) 隐含 (  或 imp ) 等值 ( ≡, ~ 或 equi )

  24. 算符的代数性质(交换律、结合律和分配律)常常可用来优化目标程序的质量。但是必须注意两点:算符的代数性质(交换律、结合律和分配律)常常可用来优化目标程序的质量。但是必须注意两点: (1)代数性质引用到什么程度视具体语言的不同而不同。如在ALGOL中把 A*B+C*D 处理成C*D+A*B, 则至少是对ALGOL不够忠实。 (2)数学上成立的代数性质在计算机上未必完全成立。如:(A+B)+C=A+(B+C)在计算机上并不普遍成立。

  25. 二、语句 • 说明性语句旨在定义不同数据类型的变量或运算。 • 执行性语句旨在描述程序的动作。执行性语句又可分赋值语句、控制语句和输入/输出语句。 1.赋值语句 A=B 名字的左值指它所代表的存贮单元地址,右值指该单元的内容。

  26. 2.控制语句 多数语言中所含的控制语句有: 无条件转移语句: goto L 条件语句: if B then S if B then S1 else S2 循环语句: while B do S repeat S until B for i:=E1 step E2 until E3 do S 过程调用语句: call P( X1,X2,…,Xn) 返回语句: return(E) 重要的是必须了解这些语句在不同语言中的不同含义。

  27. 3.说明语句 说明语句旨在定义名字的性质。编译程序把这些性质登记在符号表中,并检查程序中名字的引用和说明是否相一致。 许多说明语句没有相应的代码。但有些语句,如过程说明语句,和可变数组说明语句则有相应的目标代码。 4.简单句和复合句 简单句是指那些不含其它语句成分的基本句,如赋值句、 goto句等。 复合句则指那些句中有句的语句。 if(x==0) then x=1;

  28. 2.3 程序语言的语法描述 本节将介绍语法结构的形式描述问题。 首先引入几个概念: • 字母表:设是一个有穷字母表,它的每个元素称为一个符号。 • 符号串:上的一个符号串是指由中的符号所构成的有穷序列。 • 空字:不包含任何符号的序列称为空字,记为。 • 用*表示上的所有符号串的全体,空字也包括在其中。 • 空集:表示不含任何元素的空集{}。 注意:、{}和{}的区别。

  29. *的子集U和V中的(连接)积定义为: UV={∣U & V } 即集合UV中的符号串是由U和V的符号串连接而成的。注意,一般UVVU,但(UV)W=U(VW). • V自身的n次(连接)积记为: Vn = V V…V (n个V) 规定 V0 = {}. 令: V* = V0V1V2… 称 V*是V的闭包。 记V+ = VV*, 称 V+是V的正则闭包。 闭包V*中的每个符号都是由V中的符号串经有限次连接而成的。

  30. V0={ε} • V1=V • V2=VV • Vn=VVn-1 • V+=V1 ∪V2 ∪V3 ∪… ∪Vn ∪… • V*=V0 ∪V+ = {ε} ∪V+ = V+ ∪ {ε} • {ε}V = V{ε}=V • Vφ=φV=φ • V+=VV*=V*V

  31. 例:若={a,b}则 *={,a,b,aa,ab,ba,bb,aaa,…} {0, 1}+={0, 1, 00, 01, 10,11, 000, 001, 010, 011, 100, ……} {a, b, c, d}+={a, b, c, d, aa, ab, ac, ad, ba, bb, bc, bd, ……, aaa, aab, aac, aad, aba, abb, abc,……} {0, 1}*={ε, 0, 1, 00, 01, 10,11, 000, 001, 010, 011, 100, ……} {a, b, c, d}*={ε, a, b, c, d, aa, ab, ac, ad, ba, bb, bc, bd, ……, aaa, aab, aac, aad, aba, abb, abc,……}

  32. AB={0a, 0b, 1a, 1b} 例:A={0, 1},B={a, b},AB=? 例:A={0, 1}A3 =? A3 ={000, 001, 010, 011, 100, 101, 110, 111} 例:L: { A, B, …, Z, a, b, …, z }, D: { 0, 1, …, 9 } 求:L∪D, LD, L6, L*, L(L∪D )*, D+

  33. 例:L: { A, B, …, Z, a, b, …, z }, D: { 0, 1, …, 9 } 1)L∪D 2) LD 3)L6 4)L* 5)L(L∪D )* 6)D+ 字母和数字的集合 所有1个字母后跟随1个数字的串的集合 6个字母串的集合 所有字母串(含ε)的集合 以字母开头的所有字母数字串的集合 不含空字的数字串

  34. 2.3.1 上下文无关文法 文法是描述语言的语法结构的形式规则(即语法规则)。 设计程序语言的文法的目的就是用适当条数的规则把该程序语言全部成分描述出来。 所谓上下文无关文法是这样一种文法,它所定义的语法范畴(或语法单位)是完全独立于这种范畴可能出现的环境的。

  35. 分析:The grey wolf will eat the goat 〈句子〉 语法分析树 〈谓语〉 〈主语〉 〈冠词〉 〈形容词〉 〈名词〉 〈直接宾语〉 〈动词〉 〈助动词〉 〈动原〉 〈冠词〉 〈名词〉 The grey wolf will eat the goat

  36. <句子><主语><谓语> <主语><冠词><形容词><名词> <冠词>The <形容词>grey <名词>wolf <谓语><动词><直接宾语> <动词><助动词><动词原形> <助动词>will <动词原形>eat <直接宾语><冠词><名词> <名词>goat

  37. 一个上下文无关文法G包括四个组成部分: 一组终结符号 一组非终结符 一个开始符号 一组产生式 所谓终结符号乃是组成语言的基本符号,即指程序语言中的单词符号,如基本字,标识符,常数,算符和界符等。 所谓非终结符号(也称语法变量)用来代表语法范畴。如“算术表达式”、“布尔表达式”、“过程”等。一个非终结符代表一个一定的语法概念。因此非终结符是一个类(或集合)记号,而不是个体记号。

  38. 开始符号是一个特殊的非终结符号,它代表所定义的语言中的语法范畴,这个语法范畴通常称为“句子”。开始符号是一个特殊的非终结符号,它代表所定义的语言中的语法范畴,这个语法范畴通常称为“句子”。 产生式(也称为产生规则或简称规则)是定义语法范畴的一种书写规则。一个产生式的形式是: A→ α 其中箭头左边的A是一个非终结符,称为产生式的左部符号;箭头右边的α是终结符号或与非终结符号组成的一符号串,称为产生式的右部。

  39. 分析:The grey wolf will eat the goat 终结符号集={the,grey, wolf,will, eat, goat} 非终结符号集={句子,主语, 谓语, 冠词, 形容词, 名词 , 动词 , 直接宾语 , 助动词 ,动词原形 } 产生式={句子主语谓语,……} 开始符号= 句子

  40. 句子主语 谓语  冠词 形容词 名词 谓语  the 形容词 名词 谓语  the grey名词 谓语  the grey wolf 谓语  the grey wolf 动词 直接宾语  …...  the grey wolf will eat the goat 句子 the grey wolf will eat the goat the grey wolf will eat the wolf the grey goatwill eat the wolf the grey goatwill eat the goat 符合语法且符合语义的句子仅是: the grey wolf will eat the goat

  41. 产生式是用来定义语法范畴的。 例如要定义一类含+、*的算术表达式,这个定义可以这样给出: • 变量是一个算术表达式; • 若E1和E2是算术表达式,则E1+E2、E1*E2和(E1)也是算术表达式。 对于这个定义,用产生式描述: E→i E→E+E E→E*E E→(E) 其中E代表“算术表达式”,i代表“变量”

  42. 定义一个上下文无关文法G是一个四元式 (VT,VN,S,P)其中 VT是一个非空有限集,它的每一个元素称为终结符号; VN是一个非空有限集,它的每一个元素称为非终结符号, VT∩VN=; S是一个非终结符号,称为开始符号。开始符号S至少必须在某一产生式的左部出现一次。; P是一个产生式(有限)集合,每个产生式形式是P→ (读作:P定义为 ),其中,P∈VN, ∈(VT∪VN)*.

  43. 产生式的简写 对一组有相同左部的产生式: P  1 P  2 … P   n 缩写为: P  1 |  2 | … |  n 读作:P定义为或者 1 ,或者 2 ,…,或者 n 。  1,  2, … ,  n称为候选式(Candidate)。

  44. 直接推导与归约 推导与归约—使用产生式的右部取代左部的过程称为推导,反之将左部取代右部的过程称为归约。 令G=(VT,VN,S,P), 若Aγ∈P, 且α,β∈(VT∪VN)*,则称αAβ直接推出αγβ,表示成 αAβαγβ。或称αγβ直接归约到αAβ。

  45. 如果存在一个直接推导序列: α1α2… αn(n>0),则称α1可推导出αn,表示成α1 αn。意指从α1出发,经一步或若干步,可推导出αn。 用0αn 表示经0步或若干步,可推导出αn。等价于α0=αn或者α0αn +  *  + 

  46. 1、EE + E • 2、EE * E • 3、E(E) • 4、Ei 推导/归约举例 E  E + E (1)串中含有语法变量(即非终结符号)  i + E (4)串中含有语法变量  i + E*E (2)串中含有语法变量  i + i*E (4)串中含有语法变量  i + i*i (4)串中没有语法变量 到此串中已经没有(语法)变量了,不能再推了。

  47. *  假定G是一个文法,S是它的开始符号。如果S (表示从S出发,经0步或若干步可推出),则称是一个句型。仅含终结符号的句型是一个句子。文法G所产生的句子的全体是一个语言,将它记为L(G). L(G)={|S  & ∈VT* } 例如:表达式 i + i * i 的生成 E => E + E => i + E => i + E * E => i + i * E => i + i * i +  • 1、EE + E • 2、EE * E • 3、E(E) • 4、Ei 句型 句子

  48. 文法G 的作用:以有限的规则描述无限的语言现象 有限: 产生式集合 终结符集合 非终结符集合 无限:由开始符号导出的句子

  49. 例2.1考虑一个文法G1: S→bA A→aA|a 它定义了一个什么语言呢? 解:从开始符号S出发,可以推出如下句子: SbA ba SbA baA baa SbA baA  …  baa…a 可以写为:L(G1)={ban|n≥1}

  50. 例2.2 考虑文法G2: SAB AaA|a BbB|b 求L(G2)? 解:SABaBab SABaABaaBaab SABaABaaBaabBaabb … L(G2)={ambn|m,n≥1}

More Related