资源预览内容
第1页 / 共59页
第2页 / 共59页
第3页 / 共59页
第4页 / 共59页
第5页 / 共59页
第6页 / 共59页
第7页 / 共59页
第8页 / 共59页
第9页 / 共59页
第10页 / 共59页
亲,该文档总共59页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
,第3 语言翻译问题,学习目标:学习和掌握语言的语法的基本概念和基本要素,理解翻译的步骤;学习和掌握BNF文法。 了解通用语法的标准,学习语法的基本要素; 了解几种语言的特点; 学习和掌握源程序分析和目标程序综合的原理和方法; 掌握和使用BNF文法;,重点和难点: 本章的重点是:源程序的分析和目标程序综合的原理与方法;BNF文法; 本章的难点是:语法二义性,语义分析原理;,知识点: 语法;语义;二义性;独立子程序定义;独立数据定义;嵌套子程序定义;独立接口定义;词法分析;语法分析;语义分析;优化;连接与载入;系统自举;语法树;BNF文法,对于在虚拟计算机上实现的高级语言程序,必须经过翻译才能在实际的计算机上运行。 翻译一般要经“词法分析”“语法分析” “语义分析” “代码优化” “目标程序生成”等5个阶段。其中, “语法分析”阶段最为重要,它是描述程序结构的主要手段。 “遍”的概念? “一遍”翻译?“二遍”翻译? “三遍”翻译?,本章概述,本章主要内容,3.1 编程语言语法 3.2 翻译步骤 3.3 BNF文法,3.1 编程语言语法,语法:以句子中词的排列来表明它们的彼此关系。如C语言中,x=y+z具有正确的语法,而x+-则语法错误。 语法是理解一个程序的重要手段,也为将源程序翻译成目标程序提供了必要的信息。 但,只有语法是不够的。如“张三踢足球”和“足球踢张三”,语法都正确,但语义?如 x = 2.54+3.67, 结果为5,6,6.21?,本节主要内容,通用语法标准 语言的语法要素 主程序-子程序结构,通用语法标准,可读性: 如果一个程序的算法和数据结构能够明显的从程序文本中观察出来,则这个程序是可读的。可读的程序称之为自引证的。 可读性成为如今程序编制的重要目标是一。 增加可读性的方法:用自然语句格式、结构化、自由使用关键字和噪声码、注释、不限标识符长度、助记符、自由域格式、完整的声明。,可写性: 可写性是指程序易于编写。语法结构简单的语言程序可写性好。 增加可写性的方法:设计简洁、整齐的语法结构。允许保留不明确声明和操作的隐含。 可写性与可读性是一对矛盾。简洁的结构可增强程序的可写性,但降低了程序的可读性。如C语言,可写性较好,但可读性差。允许保留不明确声明和操作的隐含可增强可写性,但会降低可读性,同时可检验性差。,易检验性: 证明程序的正确性。 这不仅涉及到语法,主要涉及到语义的正确性验证。 目前,主要通过一些测试方法,以及谓词演算方法来验证。,易翻译性: 源程序容易翻译成可执行的目标程序。易翻译性与翻译器密切关联。 易于翻译的关键是结构的规范化。 易翻译性与可读性和可写性之间存在矛盾。如LISP程序易于翻译,但可读性和可写性较差。COBOL语言程序的语义较为简单,可读性和可写性较好,但由于存在数量庞大的语句和声明,翻译极为困难。,无二义性: 所谓二义性是指:相同的语法结构存在两种或更多种理解。无二义性是每个程序语言设计的中心问题。二义性问题通常不是出现在单个的程序元素中,而是在不同结构的相互作用下表现出来的。 例1:C语言中存在两种不同的条件形式: if (ConE) S if (ConE) S1 else S2 每一条语句均清楚的解释了语义,不存在二义性。但将两个语句组合为: if (ConE1) if (ConE2) S1 else S2 此时,存在二义性。,语句S2的执行控制存在不同的理解,是ConE1为假时执行,还是ConE1为假时执行? 解决方法: 插入定界符,如 if (ConE1) if (ConE1) if (ConE2) S1; 或 if (ConE2) S1; else S2; else S2; 二者语义中强制的选择一种作为合法的解释,如就近匹配原则,即else与最近的 if 匹配。,例2:Fortran语言中,函数调用和数组引用语法是完全相同的。如语句 x = A(i,j) 存在二义性。此时A(i,j)是函数A的调用?还是数组A的引用? 解决方法:若没有数组A的声明,就默认为是函数A的调用。Pasacl和C语言中的解决方案是:用表示数组,()表示函数,如Ai,j理解为数组引用, A(i,j)解释为函数调用。,返回本节,语言的语法要素,选用不同的基本语法要素就形成了一种语言的基本风格。下面,将简介一些语法要素。 字符集: 字符集的选择是语法设计的第一步。通常选择的字符集是ASCII字符集。 目前,通常使用8为(一个Byte)来表示一个字符,这足够表示52个大小写字母、10个数字、标点符号以及一些特殊字符。但如今,计算机工业越来越国际化,各个国家的文字、货币符号等已远远超过256。因此,考虑使用16位表示字符集。,标识符: 大多数语言都遵循以字母开始字母和数字组成的字符串作为标识符的原则。有的语言还允许包括“.”和“_”之类的特殊字符。如name_student是C中的合法标识符。这样,可以增强可读性和改善长度方面的限制。 标识符长度应该不受限制。,操作符: 大多数语言均使用 “+” 和 “-” 来表示基本的数学运算操作,除此之外,很少有相同的。 如Pascal使用 “:=”作为赋值操作,而C使用 “=”。 Pascal使用 “=” 作为比较操作,而C使用 “= =”,Fortran 使用字符串.EQ.。,关键字和保留字: 关键字是语句语法中固定部分使用的标识符。当关键字不能用作程序的标识符时,该关键字就是一个保留字。如C语言中的 if, for, while等。 使用保留字使翻译过程中的语法分析变得简单。作为反面例子,Fortran 中用户可以使用DO 和 IF作为标识符,因此以DO 和 IF 开始的语句实际上并不一定是循环或条件语句,所以Fortran 的语法分析较为困难。 使用保留字可增加程序的可读性。 但保留字也不能太多,否则难以记忆,编程不方便。如COBOL的保留字太多。 但当语言扩充而扩充新的保留字时,会引来麻烦。,噪声码: 插入在于语句中用来增加可读性的可选代码。 如Basic 语言中“GOTO”语句中的“GO”是必需的关键字,而“TO”是可选的噪声码。 如汇编语言中, return n 中的n是噪声码。,注释: 注释是程序文档中的重要组成部分。一种语言可以使用多种方法引入注释。如: Basic 中使用 REM 引导单独的注释行; C、Java语言中使用“ /*”和“*/”作为多行注释定界符。 Ada中的“-”,C+中的“/”,Fortran 语言中的“!”,Basic中的“ ”都可以从语句行的人以位置开始标示注释。,空白符(空格) 各种语言使用空白符的规则不太相同。如C语言中,空白符在除字符串数据以外的任何地方没有重要的意义。?起分隔符号的作用。在词法分析中有重要的作用。多余的空白符被忽略。 在SNOBOL4语言中,空白符起基本连接操作作用。,定界符: 定界符一般用于简单的标示诸如语句或表达式这些语法单位的语法元素。 定界符有时仅用来增强可读性和使语法分析变得简单,更多的时候用于清楚的界定特定语法结构的边界以消除二义性。 如Pascal语言中的begin end。C语言中的花括号。,自由或固定字段格式: 如果程序中的语句可以书写在一行的任意位置,则该语言的语法是自由字段格式的。目前绝大多数的高级语言均采用该语法。 若要求程序中的语句每一元素必须在一输入行的指定位置书写,则该语言的语法是固定字段格式的。固定字段格式语言的语法利用输入行的位置来传递信息。如Fortran77语言的一行80列分为四个区:15列为标号区;第6列为“续行标志区”;第772列为语句区;第7380列为注释区。,表达式: 表达式的作用是访问程序中的数据对象并返回值。表达式是语句的基本元素,有时甚至是程序的基本元素。如C中,表达式组成了改变机器状态的基本操作。在ML和LISP语言中,表达式形成了驱动程序执行的基本顺序控制。,语句: 语句是命令式语言中最重要的语法单元。语句的语法对整个语言的规则性、可读性和可写性有着决定性的作用。 侧重于规则性的语言使用一个基本的语句格式。如SNOBOL4语言只使用一种基本的语句语法,即模式匹配替代语句。 侧重于可读性的语言则对不同类型的语句是用不同的语法。大多数的语言采用该方式。,返回本节,主程序-子程序结构,主程序-子程序结构的语法组织的定义与其他语言语法一样千差万别。 独立子程序定义 C语言的语法组织结构将每个子程序定义看作独立的语法单元。 每个子程序能够独立的编译并在装入的时候通过连接形成一个完整的程序。 面向对象语言要求信息能够在独立编译的单元中传递。类定义的继承性要求编译器在程序装入运行之前处理所有独立子程序,int aa(x,y) void bb(x,y) int x,y; float x; int y; main() float a; int b,c; bb(a,b); aa(c,b); ,独立数据定义: 将所有对一个给定数据对象的操作组织在一起。一个子程序可能包括该程序中涉及一个特定数据类型的所有操作,如建立、打印、运算数据记录的操作。 Java、C+和Smalltalk语言中类机制通常采用这种方法。,嵌套子程序定义: 所有子程序的定义嵌套在主程序中。 嵌套子程序定义对于建立模块化程序起者重要的作用。 嵌套子程序定义为那些在编译时定义的、允许静态类型检查且允许为包含非局部引用的子程序编译高效的可执行代码的子程序提供了一种非局部的引用环境。 Pascal语言是嵌套子程序定义的典型。,program mainPro (input, output) procedure pro begin end function fun(x: integer): integer; begin end begin (*main begin) end,独立接口定义: 将若干个子程序相关的接口进行单独定义。 其好处是:1)编译器可方便的检测出相同数据在不同子程序中不同定义的错误;2)调试时只需重新编译修改过的模块,提高编译效率。 如C语言中,“.h”文件形成了形式说明部分,以解决两个独立编译组件之间传输信息的问题,而“.c”文件形成了实现部分。,从可执行语句中独立出来的数据描述 讲数据与程序进行分离; 好处是使得数据格式与程序分区中的运算逻辑独立。只修改数据分区就可以完成数据结构的细微变动而不需同时修改程序。,非独立子程序定义 主程序与子程序之间没有任何语法的区别。即程序组织结构无组织性。 一个函数调用即开始了一个新的子程序,Return 的执行则结束一个子程序。 程序的行为完全是动态的。 SNOBOL4是典型的实例。,返回本章,3.2 翻译的步骤,高级语言源程序必须经过翻译才能在虚拟计算机上运行。 翻译一般是一个较为复杂的过程。通常经过“词法分析”“语法分析” “语义分析” “代码优化” “目标程序生成”等5个阶段。可归纳为源程序的分析和目标代码的生成。 翻译通常追求高效的编译速度或高效的可执行的优化代码。 “一遍”翻译?“二遍”翻译? “三遍”翻译? 由于编译技术的发展,编译速度与扫描次数之间的关系不明显了,而语言的复杂度显得突出,源程序的分析,具体过程包括: 词法分析 语法分析 语义分析,词法分析,将源程序中的字符串划分成基本要素单元:标识符、限定词、运算符、数字、关键字、噪声码、空格、注释等。划分的结果称为语法项。 该分析过程由词法分析器完成。 虽然词法分析的概念简单,但过程复杂,耗费的编译时间较长。必须对源程序进行逐字的阅读和分析。,词法分析实例: 如下列Fortran 语言中的语句如何分析? DO 10 K=1,10
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号