第三章 语言翻铎
第三章 语 言 翻 译
31语言的语法 语法:单词作为语句中元素的显示它们之间关系的布局。描述 了构成有效程序的符号序列。如C中,x=y+z是有效的符号序列, 而x+-则不是。 语法提供了理解程序需要的有意义的信息。也提供了大量源程 序到目标程序翻译所需的信息。 单靠语法并不足以无二义地刻划语句的结构。如: x-245+367,语法并不能告诉我们x是否被声明或是否声明为 实数。ⅹ=56或6.12均是可能的。 因此,对语言的完整描述单靠语法结构是不够的,还需涉及语 义。如:声明的使用、操作、顺序控制和引用环境等影响变量, 并不总是由语法决定。 虽然如此,语法仍是语言描述中的重要属性。 现在,语法描述已是一个解决了的问题,源程序的语法理解阶 段是相当机械的,YACC等工具可自动生成给定程序的语法描 述
3.1 语言的语法 •语法:单词作为语句中元素的显示它们之间关系的布局。描述 了构成有效程序的符号序列。如C中,x=y+z是有效的符号序列, 而xy+-则不是。 •语法提供了理解程序需要的有意义的信息。也提供了大量源程 序到目标程序翻译所需的信息。 •单 靠 语 法 并 不 足 以 无 二 义 地 刻 划 语 句 的 结 构 。 如 : x=2.45+3.67,语法并不能告诉我们x是否被声明或是否声明为 实数。x=5,6或6.12均是可能的。 •因此,对语言的完整描述单靠语法结构是不够的,还需涉及语 义。如:声明的使用、操作、顺序控制和引用环境等影响变量, 并不总是由语法决定。 •虽然如此,语法仍是语言描述中的重要属性。 •现在,语法描述已是一个解决了的问题,源程序的语法理解阶 段是相当机械的,YACC等工具可自动生成给定程序的语法描 述
般语法准则 语法的主要目的是为程序员和语言处理器间通讯提供一套 注记方法。而特殊语法结构的选择被限制于特殊的信息项 通讯 例如:某特定变量有类型实数,可以用多种方式表达。 可以是显示声明或隐含的命名约定,等。 语法细节的选择大部分是基于第二准则,如可读性,它和 通讯的主要目标无关。 有很多二级准则,通常可按其目标分类,分为:易读、易 写、易翻译、无二义等目标。这些目标间有时会有冲突
一般语法准则 •语法的主要目的是为程序员和语言处理器间通讯提供一套 注记方法。而特殊语法结构的选择被限制于特殊的信息项 通讯。 例如:某特定变量有类型实数,可以用多种方式表达。 可以是显示声明或隐含的命名约定,等。 •语法细节的选择大部分是基于第二准则,如可读性,它和 通讯的主要目标无关。 •有很多二级准则,通常可按其目标分类,分为:易读、易 写、易翻译、无二义等目标。这些目标间有时会有冲突
易读性( Readability 程序是易读的,如果程序表示的算法和数据的结构可从程 序文本的检査明显了解。一个易读的程序,通常称为自文 档的(不需其他用于理解的辅助文档)。 增加易读性的方式:自然的语句格式、结构化语句、关键 字和噪音字的自由使用、嵌入式注释机制、不限长标识符, 记忆操作符、自由域格式、完全的数据声明等。 易读性并不能由语言设计保证,最好的设计也可能由于糟 糕的编程而破坏。当然,语法设计也可能使最有意识的程 序员写出难理解的程序,如APL。 COBOL强调易读,但其 代价是牺牲了易写和易翻译, 增加易读性一语法不同应反映语义不同,做相似事的程序 结构是相似的。做不同事的程序其结构需有明显不同。语 如只提供了少数不同语法结构,通常导致程序易读性差。 如APL, SNOBOL4等,只提供一种语句格式,赋值、子程 序调用、简单GOTO、子程序返回,多路条件分支、及其它 常见程序结构的差异只能通过个别操作子的不同来反应
•易读性(Readabitity) 程序是易读的,如果程序表示的算法和数据的结构可从程 序文本的检查明显了解。一个易读的程序,通常称为自文 档的(不需其他用于理解的辅助文档)。 增加易读性的方式:自然的语句格式、结构化语句、关键 字和噪音字的自由使用、嵌入式注释机制、不限长标识符, 记忆操作符、自由域格式、完全的数据声明等。 易读性并不能由语言设计保证,最好的设计也可能由于糟 糕的编程而破坏。当然,语法设计也可能使最有意识的程 序员写出难理解的程序,如APL。COBOL强调易读,但其 代价是牺牲了易写和易翻译。 增加易读性—语法不同应反映语义不同,做相似事的程序 结构是相似的。做不同事的程序其结构需有明显不同。语 言如只提供了少数不同语法结构,通常导致程序易读性差。 如APL,SNOBOL4等,只提供一种语句格式,赋值、子程 序调用、简单GOTO、子程序返回,多路条件分支、及其它 常见程序结构的差异只能通过个别操作子的不同来反应
易写性 易写性(使用简明的、规则的语法结构)通常和易读性(冗 余结构是有帮助的)相冲突。 隐含的语法约定允许声明和操作不需刻划,从而使程序更短 更易写,但不易读。其他特性对两个目标均有增强:如结构 化语句、简单自然语句格式、记忆操作符、未限制标记符等 通常使程序易写,通过允许在程序中直接表示问题的算法和 数据的自然结构 语法称为冗余的,如果以多种方式传达同样的信息。有些冗 余性有用的,因它允许程序易读,并允许翻译时错误检测 缺点是不易写 大多数缺省规则(针对语言结构含义)试图减少冗余,通过 删去某些显式的含义陈述,因为这些含义可从语境中导出。 例, Fortran中约定,ⅠN打头的变量为整型,其他为实数, 这样不需声明,但缺点是有副作用,如:拼写错误不能被编 译器检测到,例如: INDEX被写成ⅠNDX→则变成新变量
•易写性 易写性(使用简明的、规则的语法结构)通常和易读性(冗 余结构是有帮助的)相冲突。 隐含的语法约定允许声明和操作不需刻划,从而使程序更短、 更易写,但不易读。其他特性对两个目标均有增强:如结构 化语句、简单自然语句格式、记忆操作符、未限制标记符等 通常使程序易写,通过允许在程序中直接表示问题的算法和 数据的自然结构。 语法称为冗余的,如果以多种方式传达同样的信息。有些冗 余性有用的,因它允许程序易读,并允许翻译时错误检测。 缺点是不易写。 大多数缺省规则(针对语言结构含义)试图减少冗余,通过 删去某些显式的含义陈述,因为这些含义可从语境中导出。 例,Fortran中约定,I-N打头的变量为整型,其他为实数, 这样不需声明,但缺点是有副作用,如:拼写错误不能被编 译器检测到,例如:INDEX被写成INDX→则变成新变量
易验证性 和易读、易写相关的概念是程序正确性或程序验证。 多年经验表明,理解每条程序语言语句是容易的,创建正 确程序的整个过程却是困难的。 因此,需有技术,使得能数学地证明程序是正确的。 易翻译性 即易于翻译成可执行形式。 易读性和易写性是面向程序员的需要。易翻译性(关键是 结构的正则性)是面向翻译器(处理被写成的程序)的需 要 如LISP程序,不易读、也不易写、但易于翻译,主要由于 其语法简单且正则 当特殊语法结构增加,将导致翻译困难,如 COBOL,允许 大量的语句和声明形
•易验证性 和易读、易写相关的概念是程序正确性或程序验证。 多年经验表明,理解每条程序语言语句是容易的,创建正 确程序的整个过程却是困难的。 因此,需有技术,使得能数学地证明程序是正确的。 •易翻译性 即易于翻译成可执行形式。 易读性和易写性是面向程序员的需要。易翻译性(关键是 结构的正则性)是面向翻译器(处理被写成的程序)的需 要。 如LISP程序,不易读、也不易写、但易于翻译,主要由于 其语法简单且正则。 当特殊语法结构增加,将导致翻译困难,如COBOL,允许 大量的语句和声明形式
没有含混性 含混性是语言设计中的一个中心问题 个语言定义理想地为每个语法结构提供唯一的意义 而含混性结构允许两个或多个不同解释。通常不是由个体 程序元素的结构产生,而是由于不同结构的交迭 例如 if Boolean exp then statement else statement2 If Boolean exp then statement1 当两种形式组合时,有可能出现二义情况。 Fortran中,A(I,J)可能是数组元素,也可能是函数调用 事实上,上面提到的含混在语言中均有解决方案
•没有含混性 含混性是语言设计中的一个中心问题。 一个语言定义理想地为每个语法结构提供唯一的意义。 而含混性结构允许两个或多个不同解释。通常不是由个体 程序元素的结构产生,而是由于不同结构的交迭。 例如: if Boolean exp then statement1 else statement2. If Boolean exp then statement1 当两种形式组合时,有可能出现二义情况。 Fortran中,A(I,J)可能是数组元素,也可能是函数调用。 事实上,上面提到的含混在语言中均有解决方案
条件语句的两种不同解释: Boolean expression Boolean expression alse false Boolean expression Statement Boolean expression Statement Statement Statement
条件语句的两种不同解释:
例:因组合而形成的悬空else: If Boolean expl then if Boolean exp2 then stat I else stat2 Algol解决方案:改变语法,引入分界符 begin.end。 Ada解决方案:每个i语句必须以 end if分界符结尾。 C和 Pascal解决方案:从二义结构中仼选一种解释。对本例 而言,最后的else总是和最近的then配对 FORTRAN中函数调用和数组引用的二义性由规则解决: A(I,J)被视为函数调用,如果没有数组A的声明。但这个假 定只能在程序装载、链接时被检查。 Pascal中区分二者的方法是使用不同的括号,如:[.]用于 界定数组参数,(.)用于界定函数调用的参数
例:因组合而形成的悬空else: If Boolean exp1 then if Boolean exp2 then stat1 else stat2 Algol解决方案:改变语法,引入分界符begin…end。 Ada解决方案:每个if语句必须以end if分界符结尾。 C和Pascal解决方案:从二义结构中任选一种解释。对本例 而言,最后的else总是和最近的then配对。 FORTRAN中函数调用和数组引用的二义性由规则解决: A(I, J)被视为函数调用,如果没有数组A的声明。但这个假 定只能在程序装载、链接时被检查。 Pascal中区分二者的方法是使用不同的括号,如:[…]用于 界定数组参数,(…)用于界定函数调用的参数
语言的语法元素 语言的语法风格由各种基本语法元素的选取所决定 字符集 字符集的选择是语言设计的第一件事 已有一些标准字符集,如:ASCI码。通常是选择一个标 准的字符集。 但也有不标准的,如APL。 字符集的选择对确定可被用于语言实现的ⅣO设备的类型 是非常重要的。如:C的字符集可用于大多数O设备。 而APL的字符集则不能直接用于大多数O设备。 通常用8位来表示字符(60年代早期用6位),这似乎是 足够的。但是,随着计算机产业的国际化进程,可能16 位表示是必需的(可有65536个字符)
语言的语法元素 语言的语法风格由各种基本语法元素的选取所决定。 •字符集 字符集的选择是语言设计的第一件事。 已有一些标准字符集,如:ASCII码。通常是选择一个标 准的字符集。 但也有不标准的,如APL。 字符集的选择对确定可被用于语言实现的I/O设备的类型 是非常重要的。如:C的字符集可用于大多数I/O设备。 而APL的字符集则不能直接用于大多数I/O设备。 通常用8位来表示字符(60年代早期用6位),这似乎是 足够的。但是,随着计算机产业的国际化进程,可能16 位表示是必需的(可有65536个字符)