1、中华人民共和国国家标准程序设计语言发布实施国家标准局发布中华人民共和国国家标准程序设计语言代替国家标准局批准实施引言本标准定义了程序设计语言及其子集参看附录其目的是在数据处理系统之间便于程序的交换增进其可移植性本标准用于描述数值计算过程描述计算过程的源程序一般应被翻译程序译成为机器代码本标准适用于数字电子计算机的设计生产和使用对语言的理解应以本标准为准在本标准中凡出现名字其含义都是本标准是原国家标准程序设计语言的修订版它等效采用了国际标准本标准的实施应参照语言基本符号的硬件表示法进行语言的结构算法语言有两种不同的表示基准表示和硬件表示以下的描述用基准表示这就是说在本语言内定义的所有对象都用给定
2、的一组符号来表示只是在符号的选择上和其他表示可以有所不同对于所有表示而言结构和内容应当是一样的基准语言它是定义的语言字符的选择取决于相互容易理解而不是取决于计算机的限制编码者的表示法或纯数字表示法它是编译程序设计人员的基准和指南它是一切硬件表示的指南硬件表示每个硬件表示是对在标准输入设备上有限个字符实施基准语言的紧缩使用特定计算机上的字符集并且是该计算机的翻译程序所接受的语言必须伴有一组特殊的规则用于该硬件表示与基准语言的相互转换应该特别注意在整个基准语言中粗黑体字用于定义独立的基本符号参看和条这些粗黑体字被认为与组成自身的各个字母毫无关系在基准语言中粗黑体字将不作它用算法语言的目的是描述计算
3、过程描述计算规则时用到的基本概念是众所周知的算术表达式而数变量和函数作为其组成部分从这些表达式出发运用算术运算的规则组成语言中自封闭的单位显式公式称为赋值语句采用说明根据编写标准的一般规定删去了原国际标准的第章至第章目的是使得本标准与的核心内容第章一一对应技术内容一致这样做不影响国际间交流为了表明计算过程的流向要加上某些非算术语句和语句子句它们可以描述比如计算语句的选择或迭代重复等因为就这些语句的作用而言一个语句涉及其他语句是必要的所以语句可带有标号一列语句被括在语句括号和之间从而构成一个复合语句语句伴有说明说明本身不是计算指令但它告诉翻译程序语句中出现哪些对象以及对象的某些性质例如作为变量值
4、的数属于哪一类数组的维数或者甚至是定义一个函数的一组规则把一列说明及其后面的一列语句都括在和之间就构成一个分程序每个说明均以此种方式出现于分程序中并且只对该分程序有效程序是一个分程序或一个复合语句该分程序或复合语句仅仅被一个虚构的分程序所包围假设该虚构分程序总是存在的称为环境分程序并且除了调用那些被假定是在环境分程序中说明的过程标识符和函数命名符外它们不使用那些不包含在它们内部的语句和说明环境分程序包含标准函数输入输出操作和可能的其他操作的过程说明它们无需在程序内说明就能使用环境分程序也包含了变量的虚构说明和初始化参看第章下面给出语言的语法和语义每当提到计算的精确度一般说来尚未详细确定或某个过
5、程的结果有待定义或没有定义时要按下述意义加以解释如果附加信息详细说明了所要的精确度和所作的计算种类并且对在完成计算时所有可能发生的情况都详细说明了要采取的操作顺序只在此时才说程序完全确定了一个计算过程语法描述的形式体系语法将借助于元语言公式来描述对它们的解释最好用一个例子来说明括在尖括号内的字符序列代表元语言变量它的值是符号的序列记录和后者的意义是或是元语言连接词公式中的任何记号不是变量或连接词时就表示它自己或一组与它相类似的记号公式中记号和或变量的并列都意味着它们所表示的序列的并列因此上述公式给出形成变量的值的一个递归规则它指出可以有值或或者给定的某个合法值后另外的值可由在它后面跟以符号或跟
6、以变量的某个值而做出假如的值是十进制数字则的某些值是为了便于研究选定一些近似地描述了相应变量的性质的字作为区别元语言变量即出现在尖括号中的字符序列如上例中的的符号在正文中其他地方用到以这种方式出现的字时都要参照对应的语法定义此外有的公式不只在一处给出定义空即没有符号的空串基本符号标识符数和串基本概念基准语言是用下列基本符号构造起来的基本符号字母数字逻辑值界限符字母字母这个字母表可以任意地缩减或者随意地扩充任何其它不同的字符即不与任何数字逻辑值或界限符相同的字符字母没有单独的意义它们是用来组成标识符和串的参看第的标识符第的串在本报告中有时使用字母和取自扩充的字母表它们当然不可被程序员使用如果使用
7、了某一包含这些字母的扩充字母表那么在本报告中使用的这些字母必须系统地改为那个已被扩充的字母表所不包含的字母数字和逻辑值数字数字数字是用来组成数标识符和串的逻辑值逻辑值逻辑值有确定而明显的意义界限符界限符运算符分隔符括号说明符分类符运算符算术运算符关系运算符逻辑运算符顺序运算符算术运算符关系运算符逻辑运算符顺序运算符分隔符括号说明符分类符界限符有确定的意义大部分界限符的意义是明显的否则基意义将在后面适当的地方给出在基准语言中象空白或另起一行等印刷上的特征是没有什么含义的但是为了容易阅读起见可以随意地使用它们为了在程序的符号间加进一段正文下面关于注解的约定成立序列等价于任何不包括的零个或多个字符的
8、序列任何不包括的零个或多个字符的序列任何不包括或或的零个或多个基本符号的序列所谓等价这里是指左列所示三种结构中的任何一种在串外出现时换成右列同一排所示的符号后对程序的执行没有任何影响更可进一步理解为从左向右读在正文中首先遇到的注解结构比该序列中包含的以后的注解结构要优先替换标识符语法标识符字母标识符字母标识符数字例语义标识符没有固定意义只用于标识简单变量数组标号开关和过程它们可以随意地选用标识符也可用作为过程的形式参数这时它们可以代表上述一实体或代表一个串不能用同一标识符表示两个不同的量除非程序的说明确定了这两个量有不相交的作用域参看第条和第章这个规则也适用于过程的形式参数不管该形式参数代表一
9、个量或代表一个串数语法无正负号整数数字无正负号整数数字整数无正负号整数无正负号整数无正负号整数十进制小数无正负号整数指数部分整数十进制数无正负号整数十进制小数无正负号整数十进制小数无正负号数十进制数指数部分十进制数指数部分数无正负号数无正负号数无正负号数例语义十进制数有其通常的含义指数部分是一个比例因子表示的整数次幂类型整数是整型的所有其他的数是实型的参看第条类型说明串语法正则串任何字符序列但不含有或空开串正则串正则串闭串开串闭串开串串闭串闭串串例语义为使本语言能处理字符的序列引入串引号和串内字符的使用是一个硬件表示问题进一步的规则不在基准语言中给出但是建议除和之外的可见字符将表示其自身而除空
10、格之外的不可见字符不该在串内出现为了与语言基本符号的硬件表示法相一致空格可以代表它自身尽管在本文本中字符用来表示一个空格为允许使用不可见或者其他专用字符可把它们放在配对的串引号或配对的符号对偶里来表示有关这种内串的规则不做规定如果使用这种换码机制就得要用注解来说明这个换码序列的意义形式为闭串串的串可视为通过删去闭串的闭串引号和后面串的开串引号和在它们之间的任何布局字符一起形成的串串可用作过程的实在参数参看第条函数命名符和第条过程语句量种类和作用域量可分为下面几个种类简单变量数组标号开关和过程量的作用域是一组语句和表达式在这组语句和表达式内该量的标识符的说明是有效的关于标号的作用域参看第条值和类
11、型值是一些数特殊情况单独一个数的有序集合是一些逻辑值特殊情况单独一个逻辑值的有序集合或者是一个标号我们说某些语法单位有值一般说来在程序执行期间这些值是变动的表达式及其组成部分的值在第章中定义数组标识的值是相应数组的下标变量值的有序集合参看第条各种类型整型实型布尔型基本上表示了值的性质语法单位的类型要参照这些语法单位的值而定表达式在本语言中描写算法过程的程序的基本组成部分是算术表达式布尔表达式和命名表达式这些表达式的组成部分除了某些界限符之外是逻辑值数变量函数命名符标号开关命名符以及初等的算术运算符关系运算符逻辑运算符和顺序运算符因为在变量和函数命名符两者的语法定义中都含有表达式所以表达式及其组
12、成部分的定义必然都是递归的表达式算术表达式布尔表达式命名表达式变量语法变量标识符标识符简单变量变量标识符下标表达式算术表达式下标表下标表达式下标表下标表达式数组标识符标识符下标变量数组标识符下标表变量简单变量下标变量例语义变量是给一个值起的名字在表达式中可用这个值形成其他的值也可用赋值语句参看条改变这个值一个特定变量的值的类型由变量本身的说明参看条类型说明确定或由相应数组标识符的说明参看条数组说明确定下标下标变量是给多维数组参看条数组说明分量的值起的名字下标表中的每个算术表达式占有下标变量的一个下标位置叫做一个下标整个下标表括在下标括号中下标变量所对应的数组分量由其下标的实际数值确定参看条算术
13、表达式每个下标位置的作用类似于一个整型的变量而下标的求值可理解为等价于给这个虚构变量赋值参看条下标变量的值只当下标表达式的值是在数组的下标界参看条数组说明之内时才有定义变量的初值没有说明为的变量的值从进入说明它的分程序到对它赋值之前是无定义的说明为的变量的值在第一次进入说明它的分程序时是如果是算术的或如果是布尔的以后再进入时具有和先前从该分程序退出时同样的值函数命名符语法过程标识符标识符实在参数串表达式数组标识符开关标识符过程标识符字母串字母字母串字母参数界限符字母串实在参数表实在参数实在参数表参数界限符实在参数实在参数部分空实在参数表函数命名符过程标识符实在参数部分例语义函数命名符定出单个数
14、值或单个逻辑值此值是对固定的一组实在参数应用给定的一些规则这些规则由过程说明确定参看条过程说明得到的结果在条过程语句中给出了详细说明实在参数的诸规则并非每个过程说明都定义确定函数命名符的值的规则标准函数和标准过程某些标准函数和标准过程在环境分程序中用下列过程标识符加以说明和这些函数和过程的细节参看附录中给出的环境分程序的详细说明算术表达式语法加法运算符乘法运算符初等量无正负号数变量函数命名符算术表达式因式初等量因式初等量项因式项乘法运算符因式简单算术表达式项加法运算符项简单算术表达式加法运算符项如果子句布尔表达式算术表达式简单算术表达式如果子句简单算术表达式算术表达式例初等量因式项简单算术表达
15、式算术表达式语义算术表达式是计算数值的规则若是简单算术表达式则对表达式中各初等量的实际数值执行指定的算术运算就可以得到这个值这在下面条中有详细的解释若初等量是数其实际数值是显然的对变量而言其实际数值是当前值动态意义下最近赋值的而对函数命名符而言其实际数值是对表达式中过程参数的当前值应用定义此过程的计算规则参看条而得到的值最后对括在圆括号内的算术表达式而言其值必须经过递归分析用其他三类初等量的值表示出来在更一般的含有如果子句的算术表达式中根据布尔表达式的实际值参看条布尔表达式从若干简单算术表达式中选出一个来此选择进行如下一个一个地依次由左向右计算如果子句中的布尔表达式直至找到一个值是的布尔表达式
16、为止于是算术表达式的值就是此布尔表达式后面第一个算术表达式的值如果没有一个布尔表达式具有值那么算术表达式的值是最后的之后的表达式的值在一个表达式内初等量的求值顺序是不确定的如果由于函数命名符的副作用的影响使得不同的求值顺序产生不同的结果那么程序是无定义的在求一个算术表达式的值时当然表达式内的所有初等量都要被求值在任意算术表达式中用如果子句控制而又没被它选择到的表达式除外在用一个转向语句参看从函数命名符转出的特殊情形中放弃表达式的求值然后执行这个转向语句运算符和类型除了如果子句中的布尔表达式外简单算术表达式的组成部分必须是实型或整型参看条类型说明基本运算符的意义和由它们导出的表达式的类型由下述规
17、则给出运算符和有通常的意义加减和乘如果两个运算对象都是整型则表达式的类型也是整型否则是实型运算项因式和项因式都表示除法如果因式具有零值则运算是无定义的否则理解为项乘以因式的倒数这里应当注意到优先规则参看条例如的意思是运算符对实型和型的所有四种组合都有定义并且在任何情况下得到的结果都是实型运算符只当两个运算对象都是整型才有定义并且所得的结果是整型如果和都是整型那么的值由下面的函数给出运算因式初等量表示乘幂这里因式是底而初等量是指数例如表示而表示如果是实型的是实型或整型的那么个的值由下面的函数给出如果和两者都是整型的那么的值由下面的函数给出如果是整型的是实的那么的值由下面的函数给出过程的调用表示程
18、序的动作是无定义的当然使用乘幂运算符的有限误差参看条和使用过程和的有限误差可能是不同的条件表达式的类型形如的算术表达式的类型不取决于的值如果或中有一个是实型的则该表达式就是实型的否则表达式是整型的运算符的优先级在一个表达式中运算的顺序一般是由左向右并有下列附加规则按照条中给出的语法下述优先规则成立第一第二第三在左圆括号和对应的右圆括号之间的表达式接它本身求值并且该值在以后的计算中要用到因此在表达式中总能用适当地加圆括号的办法列出所要的进行运算的顺序实型量的计算实型的数和变量应在数学分析的意义下来解释即把它们定义为本来只有有限准确度的对象类似地在任何算术表达式中与数学上定义的结果相比产生有限误差
19、的可能性是显然可见的将不详细说明什么叫精确的计算但实际上我们了解不同的实现可以对算术表达式进行不同的计算对这些差别的可能后果的控制必须用数值分析的方法来完成这种控制必须作为要描述的过程的一部分并因此要用这个语言本身的术语来表达布尔表达式语法关系运算符关系式简单算术表达式关系运算符简单算术表达式布尔初等量逻辑值变量函数命名符关系式布尔表达式布尔二次量布尔初等量布尔初等量布尔因式布尔二次量布尔因式布尔二次量布尔项布尔因式布尔项布尔因式蕴涵式布尔项蕴涵式布尔项简单布尔量蕴涵式简单布尔量蕴涵式布尔表达式简单布尔量如果子句简单布尔量布尔表达式例语义布尔表达式是计算逻辑值的规则求值的原则和条中给出的算术表
20、达式的求值原则完全类似类型变量和函数命名符用做布尔初等量时必须说明是型参看条类型说明和条函数命名符的值运算符关系运算符和具有通常的意义小于小于或等于等于大于或等于大于不等于当关系式所包含的表达式满足对应的关系时关系式的值是否则是逻辑运算符非与或蕴涵和等价的意义由下表给出运算符的优先级在一个表达式中运算的顺序一般由左向右并有下列附加规则按照条中给出的语法下列优先规则成立第一按照条算术表达式的优先级第二第三第四第五第六第七对括号使用的解释与第条的相同命名表达式语法标号标识符开关标识符标识符开关命名符开关标识符下标表达式简单命名表达式标号开关命名符命名表达式命名表达式简单命名表达式如果子句简单命名表
21、达式命名表达式例语义命名表达式是求语句参看第章语句标号的规则计算原理与算术表达式的计算原理参看第条完全类似在一般情况下如果子句中的布尔表达式将选出一个简单命名表达式如果这是一个标号则所要的结果就已经得到了开关命名符要参照对应的开关说明参看条开关说明并且用开关命名符中下标表达式的实际数值在开关说明所列举的命名表达式中从左向右数选出一个命名表达式因为这样选出来的命名表达式可以又是一个开关命名符所以这个求值显然是一个递归过程下标表达式下标表达式的求值类似于下标变量的求值参看条只当下标表达式取正值是开关表中元素个数中之一时开关命名符的值才有定义语句本语言中的运算单位称为语句它们通常按书写的次序依次执行
22、但此运算顺序可被转向语句它明显地定出自己的后继所中断可被条件语句它可使某些语句被跳过所缩短以及可被循环语句它可使某些语句重复所增长为了能定义特定的动态后继语句可冠以标号因为语句的序列可以组成复合语句和分程序所以语句的定义必须是递归的同样因为第章中所描述的说明也是语法结构的基本部分所以语句的语法定义必须假定说明已经定义好了复合语句和分程序语法无标号基本语句赋值语句转向语句空语句过程语句基本语句无标号基本语句标号基本语句无条件语句基本语句复合语句分程序语句无条件语句条件语句循环语句复合尾部语句语句复合尾部分程序首部说明分程序首部说明无标号复合语句复合尾部无标号分程序分程序首部复合尾部复合语句无标号
23、复合语句标号复合语句分程序无标号分程序标号分程序程序分程序复合语句此语法可解释如下用字母和分别表示任意的语句说明和标号基本语法单位的形式为复合语句分程序应当记住每个语句又可以是一个完整的复合语句或分程序例基本语句复合语句分程序语义每个分程序自动地引进新的一层名称实现如下可用适当的说明参看第章指明分程序内的任何标识符对该分程序而言是局部的这就是分程序内此标识符代表的对象在该分程序外不存在分程序外此标识符代表的任何对象在该分程序内完全取不到分程序内出现的标识符除去那些代表标号的标识符在此分程序未被说明的对此分程序而言是非局部的即它在分程序内和该分程序的直接外层中代表同一个对象用冒号把标号和语句隔开
24、即用标号标出该语句标号的作用好像在最小的包含分程序的首部中有一个说明所谓最小的包含分程序就是其括号和包含着该语句的那个最小的分程序在这个分程序首部隐含地被说明的标号是不同于所有其他局部的标识符的显式说明的从这个意义上说过程体或跟在循环子句后的语句必须认为好象就是已用和括起来的一个分程序这个分程序是嵌套在条中所讲的带有值参数过程的情况下虚构的分程序内不在程序的任何分程序内的标号即不在一个过程体中也不在循环子句后面的语句中隐含地说明在环境分程序的首部因为分程序中的一个语句本身可能又是一个分程序所以应把对分程序而言局部和非局部的概念理解为递归的因此当分程序是分程序中的一个语句时对而言是非局部的标识符
25、对而言可能是非局部的也可能不是非局部的赋值语句语法目标变量过程标识符左部目标左部表左部左部表左部赋值语句左部表算术表达式左部表布尔表达式例语义赋值语句用于把一个表达式的值赋给一个或多个目标只是在定义函数命名符之值的过程体内参看条才可能出现对该过程标识符的赋值如果是对一个下标变量赋值则所有下标的值都必须落在适当的下标范围之内否则程序的作用变成是无定义的一般地此赋值过程被理解成采取下述三个步骤目标中出现的任何下标表达式是按从左到右的顺序求值语句的表达式被求值把表达式的值赋给所有的目标目标中的任何下标表达式应取条那一步已求出来的值类型左部表所有目标的类型必须是相同的如果这个类型是布尔则表达式必须同样
26、是布尔型的表达式如果类型是实或整则表达式一定是算术表达式如果算术表达式的类型与目标的类型不同则不言而喻自动引入适当的转换函数为了从实型转换成整型则转换函数被理解成产生一个数学意义上的即没有舍入误差不超过的最大整型量这里是表达式的值应该注意具有实型的只被定义为有限精确度参看条过程标识符的类型由说明符给出此说明符作为相应的过程说明的第一个符号出现参看条转向语句语法转向语句命名表达式例语义转向语句中断正常的运算顺序它用命名表达式的值明显地定出它的后继语句因此下一个要求执行的语句是以此值为标号的语句限制由于标号固有的局部性所以没有转向语句能从外面进入分程序但转向语句可以从外面进入一个复合语句转向未定义
27、的开关命名符如果命名表达式是其值没有定义的开关命名符则转向语句是无定义的空语句语法空语句空例语句串语义空语句不进行运算它可用于放置一个标号条件语句语法如果子句布尔表达式无条件语句基本语句复合语句分程序如果语句如果子句无条件语句条件语句如果语句如果语句语句如果子句循环语句标号条件语句例语义条件语句根据特定的布尔表达式的当前值去执行某些语句或跳过某些语句如果语句一个如果语句具有如下形式其中是一个布尔表达式是一个无条件语句执行时被求值如果结果是则被执行如果结果是就不被执行如果含有一个标号并且一个转向语句转到这个标号那么不被求值且继续执行具有该标号的语句条件语句无标号条件语句有三种形式即其中是一个无条
28、件语句是一个循环语句是一个语句第一种形式的意义已经在条中给出第二种形式等价于第三种形式等价于对的使用参看条字母如果是条件语句并且同样具有这种形式则规则相同但必须代以不同的标号转进条件语句进入条件语句的转向语句的作用可直接从上面对条件语句的执行的解释得到循环语句语法循环表元素算术表达式算术表达式算术表达式算术表达式算术表达式布尔表达式循环表循环表元素循环表循环表元素循环子语变量标识符循环表循环语句循环子句语句标号循环语句例语义循环子句使它后面的语句不执行或执行多次此外它对自己的控制变量后的变量完成一系列赋值控制变量必须是实型或整型的循环表元素如果循环表包含不止一个元素则等价于其中是一个循环表元素
29、是一个循环表它可由一个或多个元素组成有关的使用可参看条字母算术表达式型元素如果是一个算术表达式则等价于其中把当成一个分程序对待参看条步长一直到型元素如果和是算术表达式则等价于的类型其中把当成一个分程序对待参看条在上面程序里必须把的类型按照的类型替换成或对和的使用参看条字母当型元素如果是一个算术表达式是一个布尔表达式则等价于其中把和上述展开式的最外层复合语句两者都看成是分程序对待参看条对的使用参看条控制变量在出口处的值使用转向语句或循环表已用完而从循环语句出去时在出口处控制变量的值保持最后赋给它的值转进入循环语句跟在循环子句后面的语句总是起类似于分程序的作用而不管它是否具有分程序的形式因此在该语
30、句内的任何标号的作用域决不可能扩充到语句之外过程语句语法实在参数串表达式数组标识符开关标识符过程标识符字母串字母字母串字母参数界限符字母串实在参数表实在参数实在参数表参数界限符实在参数实在参数部分空实在参数表过程语句过程标识符实在参数部分例这些例子对应于条中给出的例子语义过程语句用于要求执行过程体参看条过程说明这里过程体是用写出的语句其执行的结果等价于在执行过程语句时在程序中完成下列运算的结果赋值按值调用把相应的实在参数的值参看条赋给列在过程说明导引中值部分内的所有形式参数这些赋值被认为是在进入过程体之前显式完成的其作用是好象造出一个包含此过程体的附加分程序在此附加分程序中对所有局部于这个虚构
31、分程序的变量进行赋值这些变量的类型在相应的区分部分给出参看条因此按值调用的变量被认为对过程体而言是非局部的但对此虚构的分程序而言却是局部的参看条换名按名调用未列在值表中的任何形式参数在整个过程体中都要换成对应的实在参数如果实在参数是一个表达式而不是一个变量的话把它括在圆括号内以后再换由这种处理过程所加进来的标识符与过程体中原有的其他标识符之间可能的矛盾经过对所包含的形式的或局部的标识符做适当的一系列改变后是可以避免的如果实在参数和形式参数具有不同的算术类型则必须进行适当的类型转换而不考虑使用参数的上下文过程体的代换与执行最后将上面修改过的过程体嵌在过程语句的位置上并执行它如果此过程在过程体的任
32、何非局部量的作用域之外的某处被调用则代换过程体时加进来的那些标识符和其说明在过程语句或函数命名符处有效的那些标识符之间的矛盾经过对后者作适当的一系列改变后是可以避免的实在形式的对应过程语句的实在参数与过程导引的形式参数之间的对应关系建立如下过程语句的实在参数表和过程说明导引的形式参数表必须有相同数目的项按同一次序取两个表中的项就得到这个对应关系限制为了定义一个过程语句显然必须的是和条中定义的施于过程体的运算导出一个正确的语句这就对任何过程语句加了限制即每个实在参数的种类和类型与对应的形式参数的种类和类型要一致这个一般规则的某些重要的特殊情况和某些附加限制如下如果一个串在过程语句或函数命名符中用
33、做实在参数并且定义它们的过程体是一个语句与非的代码相反参看条则这个串只能在此过程体内作为更进一层过程调用中的实在参数归根结底串只能在非的代码所表示的过程体中使用过程体内作为目标出现的不是按值调用的形式参数只能是对应于变量的实在参数表达式的特殊情况过程体内用作数组标识符的形式参数对应的实在参数只能是同维数组的数组标识符此外如果该形式参数按值调用的则在调用期间所建立的局部数组与实在数组要有相同的下标界类似地形式过程参数的任何参数同实在参数在数目种类和类型上必须相一致按值调用的形式参数一般不能对应于开关标识符过程标识符或串因为它们不具有值形式参数部分为空参看条且定出函数命名符之值参看条的过程说明的过
34、程标识符是例外这个过程标识符本身就是一个完整的表达式由形式参数的区分部分所加的限制必须被遵守实在参数和形式参数之间的对应关系依照下表进行形式参数方式实在参数值算术表达式名算术表达式参看条值算术表达式名算术表达式参看条值布尔表达式名布尔表达式参看条值命名表达式名命名表达式值算术数组参看条名整数组参看条值算术数组参看条名实数组参看条值布尔数组参看条名布尔数组参看条无类型名算术过程或无类型过程或布尔过程参看条名算术过程参看条名算术过程参看条名布尔过程参看条名开关名实在串或串标识符如果实在参数本身是一个形式参数则这种对应如上表必须用直接的实在参数的区分部分而不是用最终的实在参数的说明来对应标号参数即使
35、变量没有标号类型标号也可能被按值调用参数界限符所有的参数界限符被认为都是等价的在过程语句中用到的参数界限符和过程导引中用到的那些参数界限符之间除了它们的数目要相同之外不要求有对应关系因此使用精心构造的参数界限符所传达的信息是完全任选的用代码表示的过程体当过程语句调用的过程说明的过程体是用非的代码表示时则加在此过程语句上的限制显然只能从所用代码的特点和使用者的意图来推求因此就超出了基准语言的范围标准过程定义了十个标准过程这些标准过程用和标准函数同样的方式在环境分程序中说明这些过程是和输入输出过程中出现的第一个参数是通道号以标识物理设备或文件用这种方法实现的标识已超出本报告的范围认为每个通道包含一
36、个字符序列存取或赋予这些字符的基本方法是通过过程和实现的过程和在这种意义上是互逆的通过连续调用通道所包含的字符可以用相同数目的调用重新输入但某些精度可能损失过程和同样是一对互逆过程但精度并不损失过程在过程和的每个结尾处被调用它的作用依赖于机器但它必须保证数值数据的连续输出之间能分开这些附加过程的可能实现在附录中作为解释环境分程序的例子给出说明说明用于定义程序中用到的诸量的某些性质并且把这些量与标识符联系起来一个标识符的说明对一个分程序有效在此分程序之外这个特定的标识符可用于其他目的参看条动态地说其含意如下在进入分程序时通过因为里面的标号是局部的所以从外面达不到对此分程序已作说明的所有标识符就有
37、了意义此意义由给出的相应说明的性质决定如果这些标识符已被外面的其他说明所确定它们就暂时得到新的意义另一方面对此分程序未作说明的标识符仍保持其原来的意义在离开分程序时通过或者使用一个转向语句对此分程序已作说明的所有标识符就失去其局部的意义说明可用附加的说明符加以标记它有下述作用当重新进入分程序时固有量的值与上次离开时的值相同而说明的变量中未标记为的其值就没有定义除了标号过程说明的形式参数以及环境分程序中说明的标识符外程序中出现的每个标识符都必须在程序内显式地加以说明在任何一个分程序首部标识符不能显式地或隐式地参看条被说明一次以上语法说明类型说明数组说明开关说明过程说明类型说明语法类型法简单变量简
38、单变量类型表类型局部或固有空类型说明局部或固有类型类型表例语义类型说明用于说明某些标识符以代表给定类型的简单变量已说明为实型的变量只可取正值或负值包括零已说明为整型的变量只可取正整数值或负整数值包括零已说明为布尔型的变量只可取和固有量除了只能在它自己的作用域内可存取之外它好象已经在环境分程序中被说明并且初值是或参看条一样对于由这个过程所引起的标识符之间可能的矛盾可用适当的对所包含的标识符作一些改变的办法来解决数组说明语法下界算术表达式上界算术表达式界偶下界上界界偶表界偶界偶表界偶数组段数组标识符界偶表数组标识符数组段数组表数组段数组表数组段数组说明符类型数组说明局部或固有数组说明符数组表例意义
39、数组说明用于说明一个或几个标识符以代表下标变量的多维数组并给出数组的维数下标的界和变量的类型下标界任何数组的下标界是在此数组的标识符后第一对下标方括号中以界偶表的形式给出的表中每项给出一个下标的下界和上界其形式为两个算术表达式中间用界限符隔开界偶表从左向右依次给出所有下标的界维数维数就是界偶表中界偶的数目类型在一个说明中说明的所有数组具有同样引用类型如果没有给出类型说明符就认为是实型的上下界表达式按计算下标表达式的同样方法计算上下界表达式参看条上下界表达式不能包含在同一分程序首部中任何显式或隐式参看条说明为该数组的标识符说明为数组的界只能具有整型的语法形式参看条仅当所有的下标上界的值不小于所对
40、应的那些下标上界的值时一个数组才有定义如果下标下界大于对应的下标上界时则数组无分量每进入分程序一次就要计算诸上下界表达式一次开关说明语法开关表命名表达式开关表命名表达式开关说明开关标识符开关表例语义一个开关说明定义相应的开关命名符的一组值这些值作为开关表中命名表达式的值一个一个地被定出这些命名表达式中的每一个都和在开关表中从左向右数它的项时得到一个正整数相关联对应于下标表达式参看条给出的一个值开关命名符的值是开关表中以这个给出的值为其关联整数的命名表达式的值开关表中表达式的计算每次引用开关表的项表达式在其中出现时就要去求开关表中该表达式的值求值时用它包含的全体变量的当前值作用域的影响如果一个开
41、关命名符在开关表的命名表达式中某个量的作用域之外出现并且这个开关命名符的值选到了这个命名表达式则该表达式中诸量的标识符和其说明在开关命名符处有效的那些标识符之间的矛盾经过对后者作适当的一系列改变后可以避免过程说明语法形式参数标识符形式参数表形式参数形式参数表参数界限符形式参数形式参数部分空形式参数表标识符表标识符标识符表标识符值部分标识符表空区分符类型数组说明符类型区分部分空区分符标识符表区分部分区分符标识符表过程导引过程标识符形式参数部分值部分区分部分过程体语句代码过程说明过程导引过程体类型过程导引过程体例也参看附录中的例子把大小为的矩阵中绝对值最大的元素送到并把这个元素的下标送到和过程用适
42、当改进过的欧拉变换来计算当从零到无穷时的和数一俟变换过的级数的项的绝对值连续次都小于就停止求和因此应当提供一个整数变元的函数一个上界和一个整数在收敛很慢的级数或发散交错级数的情况下过程特别有效语义过程说明用于定义与过程标识符相关联的过程过程说明的主要部分即过程体是一个语句或一组代码使用过程语句和或函数命令符即可从分程序此分程序首部有该过程说明的其他部分调用该过程体过程导引与过程体相关联它详细说明过程体内代表形式参数的某些标识符每当过程参看条函数命名符和条过程语句被用到时过程体内的形式参数要被赋以实在参数的值或被代以实在参数过程体中不是形式参数的标识符依其在过程体内被说明与否对此过程体而言或是局
43、部的或是非局部的其中那些对过程体而言是非局部的对分程序此分程序首部有该过程说明而言完全可以是局部的不论一个过程体具有或不具有分程序的形式它的作用总是和分程序的作用一样因此当任何标号标出过程体内的一个语句或标出过程体本身时此标号的作用域永远不能达到过程体之外此外如果一个形式参数的标识符在这个过程体内重新被说明包括它被用作一个标号的情况象在条中那样则它就有了局部意义并且在这个内部的局部量的整个作用域内对应于该形式参数的实在参数是不能达到的一个标识符不可以在任何形式参数表内出现一次以上也不可以一个形式参数表包含同一过程导引的过程标识符函数命名符的值对于定义函数命名符之值的过程说明而言在过程体内应当有
44、一个或多个作为目标的过程标识符的使用这些目标中至少有一个应当被赋值并且同过程标识符相关联的类型应当通过类型说明符作为过程说明的第一个符号的出现加以说明如此赋予的最近一次的值要用来继续求表达式函数命名符在此表达式中出现的值在过程体内过程标识符的任何不作为赋值语句中的目标出现时就表示引用这个过程如果在过程内或在由它引用的任何其它过程内一个转向语句转出去而不是通过过程的那么那些已经开始执行但还没有完成的以及那些不包含这个转向语句能进入它的标号的所有语句都不执行所有变量的值还有意义它们保持在执行转向语句之前最近一次的值如果函数命名符作为过程语句来使用那么结果值就被丢失但是若想利用副作用便可以使用这样的
45、语句区分导引含有一个区分部分它给出有关形式参数的种类和类型的信息在这部分内任何形式参数最多只能出现一次代码作为过程体一般认为过程体可用非语言表示由于使用这种功能完全是实现的问题所以在基准语言中不能给出关于代码语言的更进一步的规则附录子集补充件定义了的两个子集记为级和级全语言是级级加上下列限制定义为级子集不包括说明符关于实在参数要有一些附加限制把下面给出的这些行代替条的表中的相应行形式参数方式实在参数名整型表达式参看条名实型表达式参看条值整型数组参看条值实型数组参看条无类型名无类型过程参看条名整型过程参看条名实型过程参看条只提供个字母的一个字母表并认为这个字母表是基准语言的小写字母表如果删除各个
46、标识符的第个字符之后的符号会改变程序的动作则此程序是无定义的级子集除了级的三个限制外还有下列的附加限制过程不能被直接或间接地递归调用若一个参数是按名调用的则其相应的实在参数只能是一个标识符或一个串出现在开关表中的命名表达式只能是标号不包括区分符和类型左部表只能是一个左部若删除各个标识符的第个字符之后的符号会改变程序的动作则此程序是无定义的附录环境分程序补充件作为使用的一个例子详细给出环境分程序的结构就这些标准函数和标准过程的效果而言对它们的描述应该只看作是定义性的实际实现时应寻找一种方式来尽可能高效地产生这些效果至于实型量的算术运算即使这些效果也必须认为只是在有限精度内定义的参看条因此例如不能
47、保证的值恰好等于的值也不能保证和过程的效果恰好与此处所给的相符在要求明确的那些地方且没有指明中所需要的运算的简单方法用一个元语言变量参看条来代替代码简单函数不大于的最大整数即数学函数弧度的正弦体弧度的余弦体的反正切取主值以弧度给出即体的自然对数语句的指数函数语句终止的过程对于的使用参看条字母假定表示一个标准的输出通道的使用参看条字母下列情形要调用过程整数被零除中的无定义运算中的无定义运算中的无定义运算以及在环境分程序中的下列情形负变元的负或零变元的函数溢出的参数无效中的字符无效两次调用中的字符无效三次调用附加诊断信息可在此输出输入输出过程置为通道上当前字符对应于中的第一个位置的值如果字符不在中
48、置为移动通道指针使之指向下一字符体把中相应于值的字符传送到通道语句在执行了条定义的任何必要的连接之后由最外层串括号括起来的开串中字符的个数组成内串参看条的字符是以与实现有关的方式来计数的体输出一个用在一个数之后的结束符以与机器有关的方式转换它为格式控制指令如果要使过程和能读取由过程和所得到的表示式那么结束符就应该是一个空格一个新行或一个分号体取一个读自通道在条定义的整数值整数的结束符可以是一个空格一个新行或一个分号如果要允许其它结束符应把它们加到调用时的串参数的末尾而不必作其他的改动在整数的第一个字符之前可以有任意多个空格或新行读一个字符把新行转换为空格内串作为表达一个新行的单个字符跳过开头的
49、空格或新行除非是正负号或数字否则作故障处理遇到了正负号表示还未遇到数字表示或是至今已得的值表示已遇到数字表示是至今已得的值处理随后的数字如果没有遇到数字或结束符为无效的指出故障把表示值的那些字符传送到通道后面跟一个结束符使用递归自右到左求那些数字的值并从左至右将它们打印出来取一个读自通道在条定义的数的值除了数与整数的不同定义外本过程所有的规则都与的规则相同空格或新行后面可以跟符号读一个字符把新行转换为空格内串作为表示新行的单个字符跳过开头的空格或新行除非是正负号数字小数点或小拾否则作故障处理表示或表示后面的数字是否能起作用对小数点后的位数计数是至今所得的值表示最近读的字符是正负号当小数点前的数字当小数点当小数点后的数字当或小拾当未遇小拾继续下去直至遇到小拾或结束符为止对非数值字符正负号或第二个小数点都作故障处理处理数字除非它不能影响最后所得的值遇小数点处理小数点前的数字处理小数点后的数字如果机器的精度为则后面的数字不会对值有影响如果没遇到过数字作故障处理处理指数部分把表示值的那