摘要
该报告对国际算法语言Algol 60进行了完整的定义性描述。这是一种适合以足够简洁的形式表达一大类数值过程的语言,可以直接自动翻译成编程自动计算机的语言。
引言部分介绍了最后一次会议的筹备工作,其中对语言进行了定义。此外,还解释了参考语言、出版语言和硬件表示等概念。
第一章概述了该语言的基本组成和特点,并解释了定义句法结构的形式符号。
第二章列出了所有的基本符号,并定义了称为标识符、数字和字符串的句法单元。进一步定义了量、值等重要概念。
第三章解释了表达式的形成规则和表达式的含义。存在三种不同类型的表达式:算术表达式、布尔表达式(逻辑表达式)和命名表达式。
第四章介绍了语言的操作单位,称为语句。基本语句有:赋值语句(计算公式)、go to语句(明确中断语句的执行顺序)、伪语句和过程语句(调用一个封闭过程的执行,由过程语句定义)。解释了具有陈述特征的更复杂结构的形成。这些语句包括:条件语句、for语句、复合语句和块。
在第五章中,定义了被称为语句的单元,用于定义进入语言描述的过程的单元的永久属性。
报告以使用该语言的两个详细例子和定义的字母索引结尾。
引言
背景
在 1958 年苏黎世会议上编写的关于算法语言Algol的初步报告发表后,人们对Algol语言产生了极大的兴趣。
1958年11月在美因茨举行的一次非正式会议之后,来自几个欧洲国家的约40名有关人士于1959年2月在哥本哈根举行了一次Algol执行会议。他们成立了一个“硬件小组”,以便进行合作工作,直到纸带代码的水平。这次会议还促成哥本哈根的Regnecentralen出版了一份由Peter Naur编辑的Algol公报,作为进一步讨论的论坛。1959年6月在巴黎举行的国际知识产权会议举行了几次正式和非正式会议。这些会议显示出对主要负责拟订该语文的小组的意图有一些误解,但同时明确表示对所涉及的努力存在广泛的理解。经过讨论,决定于1959年1月举行一次国际会议,以改进Algol语言并编写一份最终报告。在1959年11月于巴黎举行的约50人参加的欧洲Algol会议上,选出了7名欧洲代表参加1960年1月的会议,他们代表以下组织:Association Fran¸caise de Calcul、英国计算机协会、Gesellschaft f ¨ur Angewandte Mathematik und Mechanik,以及 Nederlands Rekenmachine Genootschap。七位代表于 1959 年 12 月在美因茨举行了最后一次筹备会议。
同时,在美国,任何想要对Algol提出修改或更正建议的人,都被要求将他的意见发送到 ACM 通讯上,并在那里发表。这这些意见随后成为考虑更改 Algol 语言的依据。SHARE 和 USE 组织都建立了 Algol 工作组,并且这两个组织都代表了 ACM 编程语言委员会。 ACM 委员会于 1959 年 11 月在华盛顿召开会议,审议了所有发送给 ACM Communications 的关于 Algol 的意见。 此外,还选出了七名代表参加了 1960 年 1 月的国际会议。 七位代表于 1959 年 12 月在波士顿举行了最后一次筹备会议。
1960年1月会议
来自丹麦、英国、法国、德国、荷兰、瑞士和美国的十三名代表于1960年1月11日至16日在巴黎举行会议。
在这次会议之前,Peter Naur根据初步报告和筹备会议的建议拟定了一份全新的报告草案,会议采用了这种新形式作为其报告的基础。会议随后着手就报告的每一个项目达成协议。本报告委员会概念及各项协议的结合。
1962 年 4 月会议 [M. Woodger 编辑]
Algol 60 的一些作者于 4 月 2 日至 3 日在意大利罗马通过国际计算中心的设施和礼遇举行了一次会议。 出席会议的代表如下:

会议的目的是纠正Algol 60报告中的已知错误,试图消除其中明显的歧义,并以其他方式澄清 Algol 60 报告。会议没有考虑对语言的扩展。 相关各方针对《Algol公报》第14号中的调查问卷提交的各种更正和澄清建议被用作指南。
本报告是对 Algol 60 报告的补充,该报告应解决其中的一些困难。并非所有与原始报告有关的问题都能得到解决。 委员会决定只报告他们一致认为可以以清晰明确的方式陈述的那些要点,而不冒险对一些可能造成新的模糊的微妙问题草率地作出结论。
与下列领域有关的问题留给国际编程论坛2.1工作组进一步审议,期望目前有关高级编程语言的工作将带来更好的解决方案:
1. 函数的副作用。
2. 按名称调用概念。
3.own:静态的或动态的。
4. For语句:静态或动态。
5. 规范和声明之间的冲突。
出席罗马会议的Algol 60报告的作者们了解到IFIP成立了一个Algol工作组,他们接受了他们在开发、规范和改进Algol语言方面需要承担的任何集体责任,从现在起将移交给该机构。
这份报告已于1962年8月由关于程序设计语言的国际信息处理联合会第2委员会审查,并已获得国际信息处理联合会理事会的批准。
与 Algol 的初步报告一样,它也识别了三种不同级别的语言,即参考语言、出版语言和几种硬件表示。
参考语言
1. 它是委员会的工作语言。
2. 它是定义语言。
3.这些字符由相互理解的容易程度决定,而不是由任何计算机限制、编码符号或纯数学符号决定。
4. 它是编译器构建器的基本参考和指南。
5. 它是所有硬件表示的指南。
6. 它是将出版语言音译为任何适合本地的硬件表示的指南。
7. Algol 语言本身的主要出版物将使用参考表示。
出版语言
1. 出版语言允许参考语言根据印刷体和手写的使用情况而变化(例如下标、空格、指数、希腊字母)。
2. 它用于陈述和交流过程。
3.不同国家使用的字符可能不同,但必须确保与参考表示的明确对应。
硬件表示
1. 每一种语言都是由标准输入设备上有限数量的字符强制执行的参考语言的浓缩。
2. 每一种语言都使用特定计算机的字符集,并且是该计算机的翻译器所接受的语言。
3.每一项都必须附有一套特殊的从出版物或参考语言音译的规则。
对于参考语言和适合出版物的语言之间的音译,建议遵循以下规则。

参考语言的描述
能说的都说清楚; 不能说的,就必须沉默。——Ludwig Wittgenstein
1.语言结构
如引言中所述,算法语言具有三种不同的表示形式,即参考、硬件和出版物,而续集中描述的发展是根据参考表示。 这意味着在语言中定义的所有对象都由一组给定的符号表示——而且它只是在符号的选择上可能与其他两种表示方式不同。 所有表示的结构和内容必须相同。
算法语言的目的是描述计算过程。用于描述计算规则的基本概念是众所周知的算术表达式,其中包含数字、变量和函数作为组成部分。通过应用算术组合规则,从这些表达式中组合出语言的自包含单元——显式初始化——称为赋值语句。
为了显示计算过程的流程,添加了一些非算术语句和语句子句,它们可能描述计算语句的替代方案或迭代重复。由于语句的功能必须使一个语句指向另一个语句,因此可以为语句提供标签。语句序列可以包含在语句括号 begin 和 end 之间以形成复合语句。
语句由声明支持,语句本身不是计算指令,但会告知翻译人员出现在语句中的对象的存在和某些属性,例如变量作为值的数字类别,数字数组的维数,甚至定义函数的规则集。在begin和end之间的一系列语句和一系列语句构成了一个块。每个语句都以这种方式出现在一个块中,并且仅对该块有效。
程序是不包含在另一个语句中的块语句或复合语句,并且不使用不包含在其中的其他语句。
在续集中,将给出该语言的语法和语义。
1.1.语法描述的形式主义
语法将借助元语言公式进行描述。他们的解释最好用一个例子来解释:

括号 中包含的字符序列表示元语言变量,其值为符号序列。标记::=::= 和∣\rvert (后者有or的意思)是元语言连接词。公式中的任何符号,如果不是变量或连接词,则表示其自身(或与之相似的一类符号)。公式中的符号和/或变量并列表示所表示的序列并列。因此,上面的公式给出了变量⟨ab⟩\langle ab\rangle 值形成的递归规则。它表示⟨ab⟩\langle ab\rangle 可能具有值(或给定⟨ab⟩\langle ab\rangle 的某个合法值,可以通过在它后面加上字符(或通过在它后面加上变量⟨d⟩\langle d\rangle 的某个值来形成另一个值。如果⟨d⟩\langle d\rangle 为十进制数字,则⟨ab⟩\langle ab\rangle 的某些值为:

为了便于研究,我们选取了用于区分元语言变量的符号(即上例中括号⟨⟩\langle\rangle 中出现的字符序列为⟨ab⟩\langle ab\rangle )作为近似描述相应变量性质的词。 以这种方式出现的词在文本的其他地方使用时,它们将指相应的句法定义。 此外,在不止一处给出了一些公式。
定义:

(即符号的空字符串)。
2.基本符号、标识符、数字和字符串
基本概念
参考语言由下列基本符号构成:

2.1.字母

这个字母表可以被任意限制,或扩展为任何其他独特的字符(即不与任何数字、逻辑值或分隔符重合的字符)。
字母没有单独的意义。 它们用于形成标识符和字符串(参见第 2.4标识符,第 2.6字符串)。
2.2. 数字和逻辑值
2.2.1数字

数字用于形成数字、标识符和字符串。
2.2.2.逻辑值

逻辑值具有固定的明显含义。
2.3.分隔符

分隔符具有固定的含义,在大多数情况下是显而易见的,否则将在后续的适当位置给出。
空格或换行等排版功能在参考语言中没有意义。 但是,它们可以自由使用以方便阅读。
为了在程序的符号中包含文本,遵循以下“注释”约定:

这里的等价意味着,在字符串之外的任何情况下,左手列中显示的三个结构中的任何一个都可以被右手列中同一行中显示的符号替换,而不会对程序的操作产生任何影响。进一步理解,当从左到右阅读时,文本中首先遇到的注释结构优先于序列中包含的后续结构被替换。
2.4.标识符
2.4.1.语法

2.4.2.示例

2.4.3.语义
标识符没有内在含义,但用于识别简单的变量、数组、标签、交换和程序。 它们可以自由选择(参见第 3.2.4 节标准函数)。
相同的标识符不能用于表示两个不同的量,除非这些量具有过程声明所定义的不相交范围(参见第 2.7 节数量、种类和范围和第 5 节声明)。
2.5.数字
2.5.1.语法

2.5.2.示例

2.5.3.语义
十进制数有其传统含义。 指数部分是比例因子,表示为 10 的整数幂。
2.5.4.类型
整数的类型为整数。所有其他数字都是实数类型(参见5.1节的类型声明)。
2.6.字符串
2.6.1.语法

2.6.2.示例

2.6.3.语义
为了使语言能够处理任意基本符号序列,引入了字符串引号' and '。 这个符号表示一个空格。 它在字符串之外没有任何意义。 字符串用作过程的实际参数(参见第 3.2 节函数指示符和第 4.7 节过程语句)。
2.7.数量、种类和范围
可以区分以下类型的量:简单变量、数组、标识、交换和程序。
数量的范围是一组语句和表达式,其中与该数量关联的标识符的声明是有效的。 有关标签,请参见第 4.1.3 节。
2.8.值和类型
值是一组有序的数字(特殊情况:单个数字)、一组有序的逻辑值(特殊情况:单个逻辑值)或一个标签。
某些语法单元具有值。 这些值通常会在过程执行期间发生变化。表达式的值及其组成部分在第 3 节中定义。数组标识符的值是相应的下标变量数组的有序值集(参见第 3.1.4.1节)。
各种“类型”(整数、实数、布尔值)基本上表示值的属性。与语法单元相关联的类型引用这些单元的值。
3.表达式
在该语言中,描述算法过程的程序的主要组成部分是算术、布尔和指定表达式。除了某些定界符外,表达式的组成部分是逻辑值、数字、变量、函数指示符、基本算术运算符、关系运算符、逻辑运算符和顺序运算符。由于变量和函数指示符的语法定义都包含表达式,因此表达式及其组成部分的定义必然是递归的。

3.1.变量
3.1.1.语法

3.1.2.示例

3.1.3.语义
变量是对单个值的指定。该值可以在表达式中用于形成其他值,并可以通过赋值语句随意更改(第4.2节)。特定变量的值的类型在变量本身的声明中定义(参见5.1节类型声明)或对应的数组标识符(参见第5.2节数组声明)。
3.1.4.下标
3.1.4.1.
下标变量指定的值是多维数组的组成部分(参见5.2节数组声明)。下标列表的每个算术表达式占据下标变量的一个下标位置,称为下标。完整的下标列表包含在下标方括号[]中。下标变量引用的数组分量由其下标的实际数值指定(参见3.3节算术表达式)。
3.1.4.2.
每个下标位置的行为都类似于一个整数类型的变量,下标的计算等价于对这个虚构变量的赋值(参见4.2.4节)。下标变量的值只有在下标表达式的值在数组的下标边界内时才会被定义(参见第5.2节数组声明)。
3.2.函数指示符
3.2.1.语法

3.2.2.示例

3.2.3.语义
函数指示符定义单个数值或逻辑值,通过应用由程序声明定义的给定规则集得到结果(参见5.4节程序声明)到固定的实际参数集。实际参数规范的规则见4.7节过程语句。并不是每个过程声明都定义了函数指示符的值。
3.2.4.标准函数
某些标识符应该保留给标准的分析函数,这些函数将表示为过程。建议保留列表应包含以下内容:
abs (E)为表达式 E 的值的模数(绝对值)
sign (E)表示 E 值的符号(+1 表示 E>0,0 表示 E=0,-1 表示 E<0)
sqrt (E) 为 E 值的平方根
sin (E)为 E 值的正弦值
cos (E)为 E 值的余弦
arctan (E)为 E 值的反正切的主值
ln (E)为 E 值的自然对数
exp (E)为E(eE)E\left(e^E\right) 值的指数函数
这些函数都可以对实数和整数类型的参数进行操作。它们都将产生类型为实数的值,除了sign(E)sign\left(E\right) 的值类型为整数。在特定的表示形式中,这些函数在没有明确声明的情况下可用(参见第5节声明)。
3.2.5.传递函数
可以理解为,可以定义任何一对数量和表达式之间的传递函数。在标准函数中,建议有一个函数,即

它将一个实数类型的表达式“转换”为一个整数类型的表达式,并将不大于 E 值的最大整数值赋值给它。
3.3.算术表达式
3.3.1.语法

3.3.2.示例
基元:

因子:

项:

简单算术表达式:

算术表达式:

3.3.3.语义
算术表达式是用于计算数值的规则。 在简单算术表达式的情况下,该值是通过对表达式的基数的实际数值执行指定的算术运算来获得的,如下面的第 3.3.4 节中详细说明的。 在数字的情况下,主要的实际数值是显而易见的。 对于变量,它是当前值(在动态意义上最后分配),对于函数指示符,它是由定义过程的计算规则产生的值(参见第 5.4.4 节函数指示符的值)应用于当前表达式中给出的过程参数的值。 最后,对于括在括号中的算术表达式,该值必须通过递归分析以其他三种基本类型的值表示。
在包括 if 子句的更一般的算术表达式中,根据布尔表达式的实际值从几个简单的算术表达式中选择一个(参见第 3.4 节布尔表达式)。 这种选择是这样进行的: if 子句的布尔表达式从左到右依次计算,直到找到一个值为 true 的表达式。 那么算术表达式的值就是这个布尔值之后的第一个算术表达式的值(在这个位置找到的最大算术表达式被理解)。构造:

相当于构造:

3.3.4.运算符和类型
除了if子句中的布尔表达式外,简单算术表达式的组成部分必须是实数或整数类型(参见5.1节类型声明)。基本操作符的含义以及它们指向的表达式的类型由下列规则给出:
3.3.4.1.
运算符+、−和×具有传统意义(加、减、乘)。如果两个操作数都是整数类型,则表达式的类型为整数,否则为实值。
3.3.4.2.
运算⟨term⟩/⟨factor⟩\langle term\rangle/\langle factor\rangle 和⟨term⟩÷⟨factor⟩\langle term\rangle÷\langle factor\rangle 都表示除法,应理解为术语乘以因子的倒数,并适当考虑优先规则(参见第 3.3.5 节)。因此,举个例子

等同于

运算符// 适用于所有四种实数和整数类型的组合,在任何情况下都会产生实数类型的结果。运算符÷÷ 只适用于两个整数类型的操作数,其结果的类型为整数,其数学定义如下:

(参见第3.2.4和3.2.5节)。
3.3.4.3.
运算⟨factor⟩↑⟨factor⟩\langle factor\rangle\uparrow\langle factor\rangle 表示指数,其中因子是基数,主要因子是指数。因此,举个例子

其中

ii 表示整数类型,rr 表示实数类型,aa 表示整数或实数类型,结果如下所示:

3.3.5.运算符的优先级
一个表达式内的运算顺序通常是从左到右,有以下附加规则:
3.3.5.1.
根据3.3.1节给出的语法,以下优先级规则成立:

3.3.5.2.
左括号和匹配的右括号之间的表达式由自身计算,该值用于后续计算。 因此,表达式中所需的操作执行顺序总是可以通过括号的适当定位来安排。
3.3.6.实数运算
实数类型的数字和变量必须在数值分析的意义上进行解释,即作为固有定义的实体,只有有限的精度。 类似地,在任何算术表达式中出现与数学定义结果的有限偏差的可能性是明确理解的。 然而,不会指定精确的算术,并且确实可以理解不同的硬件表示可以不同地评估算术表达式。 必须通过数值分析的方法来控制这种差异的可能后果。 这种控制必须被认为是要描述的过程的一部分,因此将用语言本身来表达。
3.4.布尔表达式
3.4.1.语法

3.4.2.示例

3.4.3.语义
布尔表达式是用于计算逻辑值的规则。 求值原理与 3.3.3 节中给出的算术表达式完全类似。
3.4.4.类型
作为布尔基元输入的变量和函数指示符必须声明为布尔值(参见第 5.1 节类型声明和第 5.4.4 节函数指示符的值)。
3.4.5.运算符
当涉及的表达式满足相应的关系时,关系的值为true,否则为false。
逻辑运算符¬(not)\neg\left(not\right) 、∧(and)∧\left(and\right) 、∨(or)∨\left(or\right) 、⊃(implies)⊃\left(implies\right) 和≡(equivalent)≡\left(equivalent\right) 的意义由下表给出。

3.4.6.运算符的优先级
一个表达式内的操作顺序通常是从左到右,有以下附加规则:
3.4.6.1.
根据3.4.1节给出的语法,以下优先级规则成立:

3.4.6.2.
括号的使用将按照3.3.5.2节给出的含义进行解释。
3.5.命名表达式
3.5.1.语法

3.5.2.示例

3.5.3.语义
命名表达式是用于获得语句标签的规则(参见第4节语句)。同样,求值的原理完全类似于算术表达式(3.3.3节)。在一般情况下,if子句的布尔表达式将选择一个简单的指定表达式。如果这是一个标签,那么所需的结果已经找到了。Switch指示符引用相应的Switch声明(参见第5.3节Switch声明),并根据下标表达式的实际数值,从左到右计数,选择Switch声明中列出的指定表达式之一。由于这样选择的指定表达式可能又是一个开关指示符,因此计算显然是一个递归过程。
3.5.4.下标表达式
下标表达式的求值类似于下标变量的求值(参见第 3.1.4.2 节)。 仅当下标表达式采用正值1、2、3、...、n1、2、3、...、n 之一时,才定义Switch指示符的值,其中nn 是Switch列表中的项数。
3.5.5.无符号整数作为标签
用作标签的无符号整数具有前导零不影响其含义的特性,例如00127表示与217相同的标签。
4.语句
语言中的操作单元称为语句(statement)。它们通常会像所写的那样连续执行。但是,go to语句可以打断这一操作序列,go to语句明确定义其后续操作,并被条件语句缩短,这可能导致某些语句被跳过。
为了能够定义一个特定的动态序列,可以为语句提供标签。
由于语句序列可以组合成复合语句或语句块,因此语句的定义必须是递归的。另外,由于第5节描述的声明从根本上进入了语法结构,因此语句的语法定义必须假定声明已经定义。
4.1.复合语句和块
4.4.1.语法


这种句法可以用下面的方式来说明:分别用字母 S、D、L 表示任意语句、声明和标签,基本语法单元采用以下形式:
复合语句:

块:

应该记住,每个语句 S 也可以是完整的复合语句或块。
4.1.2示例
基本语句:

复合语句:

块:

4.1.3.语义
每个区块都会自动引入一个新的命名层次。其实现方式如下:块内发生的任何标识符都可以通过适当的声明(参见第5节声明)被指定为所述块的局部变量。这意味着(a)在块内部由该标识符表示的实体在其外部不存在;(b)在块外部由该标识符表示的任何实体在块内部是完全不可访问的。
标识符(除了代表标签的标识符)出现在一个块中,但没有被声明到这个块中,这对它来说是非局域的,即将表示块内和紧接在它外面的同一个层次的实体。用冒号与语句分隔的标签,即标记该语句,表现为声明在最小包围块的头部,即其括号开始和结束包围该语句的最小块。在这种情况下,必须将过程体看作是由begin和end包围的,并将其视为一个块。
由于块的语句本身也可能是块,因此必须递归地理解块的局部和非局部概念。因此,对于块A来说非本地的标识符,对于块B来说可能非本地的,也可能不是,其中A是一条语句。
4.2.赋值语句
4.2.1.语法

4.2.2.示例

4.2.3.语义
赋值语句用于将表达式的值赋给一个或多个变量或过程标识符。对过程标识符的赋值只能发生在定义函数标识符值的过程体内(参见第5.4.4节)。一般情况下,该过程可理解为以下三个步骤:
4.2.3.1.
在左侧变量中出现的任何下标表达式都按从左到右的顺序求值。
4.2.3.2.
对语句的表达式求值。
4.2.3.3.
表达式的值被赋给所有左边部分的变量,任何下标表达式都具有步骤4.2.3.1中计算的值。
4.2.4.类型
与左侧部分列表的所有变量和过程标识符关联的类型必须相同。 如果类型是 Boolean,则表达式同样必须是 Boolean。 如果类型是实数或整数,则表达式必须是算术的。 如果算术表达式的类型不同于与变量和过程标识符相关联的类型,则可以理解为自动调用适当的传递函数。 对于从实数类型到整数类型的传输,传输函数被理解为产生等效于的结果

其中E是表达式的值。与过程标识符相关联的类型由声明器给出,声明器作为相应过程声明的第一个符号出现(参见第5.4.4节)。
4.3.Go to语句
4.3.1.语法

4.3.2.示例

4.3.3.语义
go to语句通过指定表达式的值显式地定义其后续操作,中断了由语句写入定义的正常操作序列。因此,下一个要执行的语句将是有这个值作为标签的语句。
4.3.4.限制
因为标签本身是局部的,所以没有go to语句可以从外部引导到块中。然而,go to语句可能从外部引出复合语句。
4.3.5.转到未定义的Switch指示符
如果指定表达式是值未定义的Switch指示符,则go to语句等价于伪语句。
4.4.伪语句
4.4.1.语法

4.4.2.示例

4.4.3.语义
伪语句不执行任何操作。这可能是一个标签。
4.5.条件语句
4.5.1.语法

4.5.2.示例

4.5.3.语义
根据指定的布尔表达式的运行值,条件语句将导致执行或跳过某些语句。
4.5.3.1.
如果If子句的布尔表达式为true,则执行If语句的无条件语句。否则它将被跳过,操作将由下一条语句继续。
4.5.3.2 .
根据语法的不同,条件语句有两种不同的形式。这些可以说明如下:

这里B1到B3是布尔表达式,而S1到S3是无条件语句。S4是完整条件语句之后的语句。
条件语句的执行过程可以这样描述:if子句的布尔表达式从左到右依次求值,直到找到值为true的一个。然后执行这个布尔值后面的无条件语句。除非此语句明确定义其后继,否则下一个要执行的语句将是S4,即完整条件语句之后的语句。因此,分隔符else的作用可以这样描述:它将紧跟其后的语句定义为完整条件语句之后的语句。
构建

相当于

如果 if 子句的布尔表达式都不为真,则整个条件语句的效果将等同于伪语句的效果。
为了进一步解释,下图可能有助于理解:

4.5.4.转到条件语句
转到条件语句的效果直接源自上述对else语句效果的解释。
4.6.For语句
4.6.1.语法

4.6.2.示例

4.6.3.语义
for子句导致它前面的语句S被重复执行零次或多次。此外,它还对其控制的变量执行一系列赋值操作。该过程可以通过下图可视化:

在这幅图中,initialize一词的意思是:执行for子句的第一次赋值。Advance的意思是:执行for子句的下一次赋值。Test确定是否执行了最后一次赋值。如果是,则继续执行for语句的后续语句。否则,执行for子句后面的语句。
4.6.4. for列表元素
for列表给出了获取连续分配给受控变量的值的规则。这个值序列是从for列表元素中获得的,按它们写入的顺序逐个取这些值。for列表元素的三种类型中的每一种所生成的值序列以及语句S的相应执行由以下规则给出:
4.6.4.1.算术表达式
该元素产生一个值,即给定算术表达式的值,即在语句 S 的相应执行之前立即计算的给定算术表达式的值。
4.6.4.2.Step-until元素
形式为 A step B until C 的元素,其中 A、B 和 C 是算术表达式,会产生一个执行,该执行可以用附加的 Algol 语句最简洁地描述如下:

其中 V 是 for 子句的受控变量,“元素用尽”指向根据 for 列表中的下一个元素进行的评估,或者如果step-until-element 是列表中的最后一个元素,则指向程序中的下一个语句。
4.6.4.3.While元素
while -element由形式为E while F的for列表元素控制的执行,其中E是一个算术表达式,F是一个布尔表达式,用附加的Algol语句最简洁地描述如下:

其中符号与上面4.6.4.2相同。
4.6.5.退出时受控变量的值
当通过go to语句退出语句S(应该是复合语句)时,受控变量的值将与go to语句执行之前的值相同。
另一方面,如果退出是由于耗尽for列表,则退出后受控变量的值是未定义的。
4.6.6.转到 for 语句
在for语句之外的go to语句的效果是未定义的,它引用for语句中的标签。
4.7.过程语句
4.7.1.语法


4.7.2.示例

这些例子与5.4.2节给出的例子相对应。
4.7.3.语义
过程语句用于调用(调用)过程主体的执行(参见第5.4节过程声明)。如果过程主体是用Algol编写的语句,则此执行的效果将等同于在执行过程语句时对程序执行以下操作的效果。
4.7.3.1.赋值(按值调用)
在过程声明标题的值部分引用的所有形式参数都被赋值(参见第 2.8 节值和类型),这些赋值被认为是在进入过程体之前显式执行的。效果就好像创建了一个包含过程体的额外块,在其中对虚拟块中的变量进行了赋值,这些变量的类型与相应的规范(参见5.4.5节)中给出的类型相同。因此,通过值调用的变量对过程体来说是非局部的,但对虚拟块来说是局部的(参见5.4.3节)。
4.7.3.2.名称替换(按名调用)
在整个过程中,任何没有在值列表中引用的形式形参都被相应的实际形参替换,在语法上可能的情况下,将实际形参括在括号中。通过此过程插入的标识符与过程主体中已经存在的其他标识符之间可能的冲突,将通过对所涉及的正式或局部标识符进行适当的系统更改来避免。
4.7.3.3.主体更换与执行
最后,如上所述修改的过程体被插入到过程语句的位置并执行。如果从过程体的任何非局部量的范围之外的地方调用过程,则通过主体替换过程插入的标识符与声明在过程语句或函数指示符所在位置有效的标识符之间的冲突将通过对后者标识符进行适当的系统更改来避免。
4.7.4.实参-形参对应
过程语句的实际参数与过程标题的形式参数之间的对应关系建立如下:过程语句的实际参数列表必须与过程声明标题的形式参数列表有相同的条目数。通过按相同的顺序取这两个列表的项,就可以得到对应的结果。
4.7.5.限制
对于要定义的过程语句,显然有必要对4.7.3.1节和4.7.3.2节中定义的过程主体的操作导致正确的Algol语句。
这对任何过程语句提出了限制,即每个实际形参的类型和类型必须与相应形式形参的类型和类型兼容。这一一般规则的一些重要的特殊情况如下:
4.7.5.1.
如果在过程语句或函数指示器中作为实际参数提供了一个字符串,其定义的过程体是Algol 60语句(与非Algol代码相反,参见4.7.8节),则该字符串只能在过程体中作为进一步过程调用的实际参数使用。最终,它只能被用非algol代码表示的过程体使用。
4.7.5.2.
在过程体内的赋值语句中作为左侧变量出现的形式形参,如果没有按值调用,则只能对应于作为变量的实际形参(表达式的特殊情况)。
4.7.5.3.
在过程体中用作数组标识符的形式形参只能对应于一个实际形参,该形参是具有相同维度的数组的数组标识符。此外,如果形式形参是按值调用的,则在调用期间创建的本地数组将具有与实际数组相同的下标边界。
4.7.5.4.
按值调用的形式形参通常不能对应于开关标识符或过程标识符或字符串,因为后者不具有值(例外是过程声明的过程标识符,它具有空的形式形参部分(参看第5.4.1节)并定义了函数指示符的值(参见第5.4.4节)。这个过程标识符本身就是一个完整的表达式)。
4.7.5.5.
任何形式参数都可能对与之相关联的对应实际参数的类型有限制(这些限制可以,也可以不通过过程标题中的规范给出)。在程序说明中显然必须遵守这些限制。
4.7.6.已删除
4.7.7.参数分隔符
所有参数分隔符都被理解为等价的。在过程语句中使用的参数分隔符与过程标题中使用的参数分隔符之间除了它们的编号相同之外,不期望有任何对应关系。因此,使用精心设计的表所传达的信息完全是可选的。
4.7.8.用代码表示的过程主体
对调用一个用非algol代码表示的过程的过程语句施加的限制显然只能从所使用的代码的特征和用户的意图派生,因此不属于参考语言的范围。
5.声明
声明用于定义程序中使用的数量的某些属性,并将它们与标识符关联起来。标识符的声明对于一个块是有效的。在此块之外,特定标识符可以用于其他目的(参见第4.1.3节)。
动态地,这意味着以下内容:在进入块时(通过开始,因为内部标签是本地的,因此无法从外部访问)为块声明的所有标识符都假定所给声明的性质所暗示的重要性。 如果这些标识符已经由外部的其他声明定义,那么它们暂时被赋予了新的意义。 另一方面,未为块声明的标识符保留其旧含义。
在从块退出时(通过end,或通过go to语句),为块声明的所有标识符将失去其本地意义。
声明可以用附加的声明器own标记。这有以下效果:在重新进入块时,own数量的值将与最后一个退出时的值保持不变,而未标记为own的声明变量的值是未定义的。除了过程声明的标签和形式化参数外,标准函数的标签和形式化参数可能例外(参看3.2.4和3.2.5节),程序的所有标识符都必须声明。任何标识符都不能在任何一个块头中声明超过一次。
语法

5.1.类型声明
5.1.1.语法

5.1.2.示例

5.1.3.语义
类型声明用于声明某些标识符,以表示给定类型的简单变量。真正声明的变量只能假定为正值或负值,包括0。使用整数声明的变量只能假设正整数和负整数,包括零。布尔值声明的变量只能假定值为true和false。
在算术表达式中,任何可以被实变量声明的位置都可以被整数变量声明的位置所占据。
5.2.数组声明
5.2.1.语法

5.2.2.示例

5.2.3.语义
数组声明声明一个或多个标识符来表示下标变量的多维数组,并给出数组的维度、下标的范围和变量的类型。
5.2.3.1.下标边界
任何数组的下标边界都以绑定对列表的形式在该数组标识符后面的第一个下标括号中给出。此列表的每一项都以两个算术表达式的形式给出下标的下界和上界,由分隔符:分隔。绑定对列表根据从左到右的顺序给出了所有下标的边界。
5.2.3.2.尺寸
尺寸由绑定对列表中的项数给出。
5.2.3.3.类型
在一个声明中声明的所有数组都具有相同的引号类型。如果没有给出类型声明符,则可以理解为类型real。
5.2.4.下限表达式
5.2.4.1.
表达式的计算方法与下标表达式相同(参见3.1.4.2节)。
5.2.4.2.
表达式只能依赖于数组声明有效的块的非本地变量和过程。因此,在程序的最外层块中,只能声明具有常量边界的数组声明。
5.2.4.3.
只有当所有上下标边界的值都不小于相应下界的值时,数组才被定义。
5.2.4.4.
表达式将在每次跟踪时计算一次块。
5.2.5.下标变量的标识
下标变量的标识与数组声明中给出的下标边界没有关系。然而,即使声明数组拥有相应的下标变量的值,在任何时候,也只会定义那些下标在最近计算下标边界内的变量的值。
5.3.Switch声明
5.3.1.语法

5.3.2.示例

5.3.3.语义
Switch语句定义了相应Switch指示符的值集。 这些值作为在开关列表中输入的指定表达式的值一一给出。 对于这些指定表达式中的每一个,都有一个正整数 1, 2, ... ,它是通过从左到右计算列表中的项目而获得的。 对应于下标表达式的给定值的开关指示符的值(参见第 3.5 节命名表达式)是Switch列表中的命名表达式的值,该给定值作为其相关整数。
5.3.4.评估Switch列表中的表达式
每当引用Switch列表中的表达式时,将使用所有相关变量的当前值对该表达式的列表项进行计算。
5.3.5.范围的影响
如果Switch指示符出现在Switch列表中进入命名表达式的数量的范围之外,并且该Switch指示符的计算选择了该指定表达式,那么该表达式中数量的标识符与在Switch指示符处声明有效的标识符之间的冲突将通过对后者标识符进行适当的系统更改来避免。
5.4.过程声明
5.4.1.语法

5.4.2.示例(另见报告末尾的示例)

5.4.3.语义
过程声明用于定义与过程标识符关联的过程。过程声明的主要组成部分是一个语句或一段代码,即过程体,通过使用过程语句和/或函数指示符,可以从出现过程声明的块的其他部分激活。与正文相关联的是标题,它指定出现在正文中的某些标识符以表示形式参数。过程主体中的形式参数将在激活过程时(参见第 3.2 节函数指示符和第 4.7 节过程语句)被分配实际参数的值或替换为实际参数。过程主体中非正式的标识符对于主体来说要么是本地的,要么是非本地的,这取决于它们是否在主体内声明。它们中的那些对于主体来说是非本地的,很可能对于出现过程声明的头部的块来说是本地的。过程体总是像块一样起作用,无论它是否具有“一”的形式。因此,在主体或主体本身中标记语句的任何标签的范围永远不能超出过程主体。此外,如果在过程体中重新声明了形参的标识符(包括在 4.1.3 节中将其用作标签的情况),则赋予其局部意义,并且对应于它的实际参数是不可访问的遍及其内部局部量的范围。
5.4.4.函数指示符的值
对于定义函数标识符值的过程声明,必须在过程声明体中出现一个或多个显式的赋值语句,其左侧为过程标识符;必须执行其中至少一个,并且必须通过将类型声明符作为过程声明的第一个符号来声明与进程标识符相关联的类型。最后一个赋值用于继续计算出现函数指示符的表达式。进程标识符出现在过程主体中,而不是赋值语句的左侧,表示激活了过程。
5.4.5.规范
在标题中可以包括一个规范部分,通过一个明显的表示法给出关于形式参数的种类和类型的信息。在这部分中,形式参数不得出现一次以上。必须提供按值调用的形式参数规范(参见第4.7.3.1节),可省略按名称调用的形式参数规范(参见第4.7.3.2节)。
5.4.6.代码作为程序主体
据了解,程序主体可以用非algol语言表示。由于该特性的使用应该完全是硬件表示的问题,因此在参考语言中不能给出关于该代码语言的进一步规则。
过程声明的示例
例1
procedure euler (f ct, sum, eps, tim); value eps, tim; integer tim; real procedure f ct; real sum, eps; comment euler通过适当改进的欧拉变换计算i从0 到∞ 的fct(i) 的和。只要发现变换后的级数的项的绝对值小于eps ,就停止求和。因此,应该为函数fct 提供一个整数参数、一个上限eps 和一个整数tim 。输出是总和。欧拉在缓慢收敛或发散交替级数的情况下特别有效; begin integer i, k, n, t; array m[0 : 15]; real mn, mp, ds; i := n := t := 0; m[0] := f ct(0); sum := m[0]/2; nextterm : i := i + 1; mn := f ct(i); for k := 0 step 1 until n do begin mp := (mn + m[k])/2; m[k] := mn; mn := mp end means; if (abs(mn) < abs(m[n])) ∧ (n < 15) then begin ds := mn/2; n := n + 1; m[n] := mn end accept else ds := mn; sum := sum + ds; if abs(ds) < eps then t := t + 1 else t := 0; if t < tim then go to nextterm end euler
例2
procedure RK(x, y, n, FKT, eps, eta, xE, yE, f i); value x, y; integer n; Boolean f i; real x, eps, eta, xE; array y, yE; procedure FKT; comment RK 使用 Runge-Kutta 方法对微分方程系统y′k=fk(x,y1,y2,…,yn)(k=1,2,…n) 进行积分,并自动搜索适当的积分长度步。参数是:x 的初始值x 和y[k] 以及未知函数yk(x) 。系统的阶数n 。表示要集成的系统的过程 FKT(x,y,n,z) ,即函数集fk 。控制数值积分精度的公差值eps 和eta 。积分区间xE 的结束;表示解x=xE 的输出参数yE 。布尔变量fi ,对于RK 的孤立项或第一个元素,必须始终赋予其值 true。但是,如果函数y 必须在多个网格点x0,x1,...,xn 处可用,则必须重复调用该过程(对于k=0,1,…,n−1 ,其中x=xk,xE=x(k+1) ,) 然后后面的调用可能会在fi=false 的情况下发生,这样可以节省计算时间。 FKT 的输入参数必须是x,y,z,n ,输出参数z 表示导数集合z[k]=fk(x,y[1],y[2],...,y[n]) ) 对于x 和实际的y 。comp 作为非本地标识符进入的过程; begin array z, y1, y2, y3[1 : n]; real x1, x2, x3, H; Boolean out; integer k, j; own real s, Hs; procedure RK1ST(x, y, h, xe, ye); real x, h, xe; array y, ye; comment RK1ST集成了一个具有初始值x、y[k] 的单一 Runge-Kutta 步骤,这会产生输出参数xe=x+h 和 ye[k],后者是xe 处的解。 重要:参数n、FKT、z作为非本地实体进入RK1ST; begin array w[1 : n], a[1 : 5]; integer k, j; a[1] := a[2] := a[5] := h/2; a[3] := a[4] := h; xe := x; for k := 1 step 1 until n do ye[k] := w[k] := y[k]; for j := 1 step 1 until 4 do begin FKT(xe, w, n, z); xe := x + a[j]; for k := 1 step 1 until n do begin w[k] := y[k] + a[j] × z[k]; ye[k] := ye[k] + a[j + 1] × z[k]/3 end k end j end RK1ST;
概念和句法单位定义的字母索引
所有的参考都是通过章节编号给出的。参考文献分为三组:
Def在缩写' def '之后,提供对句法定义(如果有的话)的引用。
Synt在缩写' synt '之后,给出了元语言公式中出现的引用。def - group中已引用的参考文献不再赘述。
text沿用"文本"一词,参考文中给出的定义。
开头收集了除划线字以外的符号所代表的基本符号。这些例子在编制索引时被忽略了。
符号
++ see: plus
−- see: minus
×\times see: multiply
// ÷\div see: divide
↑\uparrow see: exponentiation
<< ≤\leq == ≥\geq >> ≠\ne see: <relational operator>
≡\equiv ⊃\supset ∨\lor ∧\land ¬\neg see: <logical operator>
,, see: comma
.. see: decimal point
1010 see: ten
:: see: colon
;; see: semicolon
≔\coloneqq see: colon equal
_ see: space
(\lparen )) see: parentheses
[\lbrack ]\rbrack see: subscript bracket
′^{\prime} ′^{\prime} see: string quote
A
<actual parameter>, def 3.2.1, 4.7.1
<actual parameter list>, def 3.2.1, 4.7.1
<actual parameter part>, def 3.2.1, 4.7.1
<adding operator>, def 3.3.1
alphabet, text 2.1
arithmetic, text 3.3.6
<arithmetic expression>, def 3.3.1, synt 3, 3.1.1, 3.4.1, 4.2.1, 4.6.1, 5.2.1 text 3.3.3
<arithmetic operator>, def 2.3 text 3.3.4
array, synt 2.3, 5.2.1, 5.4.1
array, text 3.1.4.1
<array declaration>, def 5.2.1 synt 5 text 5.2.3
<array identifier>, def 3.1.1 synt 3.2.1, 4.7.1, 5.2.1 text 2.8
<array list>, def 5.2.1
<array segment>, def 5.2.1
<assignment statement>, def 4.2.1 synt 4.1.1 text 1, 4.2.3
B
<basic statement>, def 4.1.1 synt 4.5.1
<basic symbol>, def 2
begin, synt 2.3, 4.1.1
<block>, def 4.1.1 synt 4.5.1 text 1, 4.1.3, 5
<block head>, def 4.1.1
Boolean, synt 2.3, 5.1.1 text 5.1.3
<Boolean expression>, def 3.4.1 synt 3, 3.3.1, 4.2.1, 4.5.1, 4.6.1 text 3.4.3
<Boolean factor>, def 3.4.1
<Boolean primary>, def 3.4.1
<Boolean secondary>, def 3.4.1
<Boolean term>, def 3.4.1
<bound pair>, def 5.2.1
<bound pair list>, def 5.2.1
<bracket>, def 2.3
C
<code>, synt 5.4.1 text 4.7.8, 5.4.6
colon :\colon , synt 2.3, 3.2.1, 4.1.1, 4.5.1, 4.6.1, 4.7.1, 5.2.1
colon equal ≔\coloneqq , synt 2.3, 4.2.1, 4.6.1, 5.3.1
comma ,, , synt 2.3, 3.1.1, 3.2.1, 4.6.1, 4.7.1, 5.1.1, 5.2.1, 5.3.1, 5.4.1
comment, synt 2.3
comment convention, text 2.3
<compound statement>, def 4.1.1 synt 4.5.1 text 1
<compound tail>, def 4.1.1
<conditional statement>, def 4.5.1 synt 4.1.1 text 4.5.3
D
<decimal fraction>, def 2.5.1
<decimal number>, def 2.5.1 text 2.5.3
decimal point . , synt 2.3, 2.5.3
<declaration>, def 5 synt 4.1.1 text 1, 5 (complete section)
<declarator>, def 2.3
<delimiter>, def 2.3 synt 2 <designational expression>, def 3.5.1 synt 3, 4.3.1, 5.3.1 text 3.5.3
<digit>, def 2.2.1 synt 2, 2.4.1, 2.5.1
dimension, text 5.2.3.2
divide // ÷\div , synt 2.3, 3.3.1 text 3.3.4.2
<dummy statement>, def 4.4.1 synt 4.1.1 text 4.4.3
E
else, synt 2.3, 3.3.1, 3.4.1, 3.5.1, 4.5.1 text 4.4.3
<empty>, def 1.1 synt 2.6.1, 3.2.1, 4.4.1, 4.7.1, 5.4.1
end, synt 2.3, 4.1.1
entier, text 3.2.5
exponentiation , synt 2.3, 3.3.1 text 3.3.4.3
<expression>, def 3 synt 3.2.1, 4.7.1 text 3 (complete section)
<exponential part>, def 2.5.1 text 2.5.3
F
<factor>, def 3.3.1
false, synt 2.2.2
<for clause>, def 4.6.1 text 4.6.3
<for list>, def 4.6.1 text 4.6.4
<for list element>, def 4.6.1 text 4.6.4.1, 4.6.4.2, 4.6.4.3
<formal parameter>, def 5.4.1 text 5.4.3
<formal parameter list>, def 5.4.1
<formal parameter part>, def 5.4.1
<for statement>, def 4.6.1 synt 4.1.1, 4.5.1 text 4.6 (complete section)
<function designator>, def 3.2.1 synt 3.3.1, 3.4.1 text 3.2.3, 5.4.4
G
goto, synt 2.3, 4.3.1
<go to statement>, def 3.4.1 synt 4.1.1 text 4.3.3
I
<identifier>, def 2.4.1 synt 3.1.1, 3.2.1, 3.5.1, 5.4.1 text 2.4.3
<identifier list>, def 5.4.1
if, synt 2.3, 3.3.1, 4.5.1
<if clause>, def 3.3.1, 4.5.1 synt 3.4.1, 3.5.1 text 3.3.3, 4.5.3.2
<if statement>, def 4.5.1 text 4.5.3.1
<implication>, def 3.4.1
integer, synt 2.3, 5.1.1 text 5.1.3
<integer>, def 2.5.1 text 2.5.4
L
label, synt 2.3, 5.4.1
<label>, def 3.5.1 synt 4.1.1, 4.5.1, 4.6.1 text 1, 4.1.3
<left part>, def 4.2.1
<left part list>, def 4.2.1
<letter>, def 2.1 synt 2, 2.4.1, 3.2.1, 4.7.1
<letter string>, def 3.2.1, 4.7.1
local, text 4.1.3
<local or own type>, def 5.1.1 synt 5.2.1
<logical operator>, def 2.3 synt 3.4.1 text 3.4.5
<logical value>, def 2.2.2 synt 2, 3.4.1
<lower bound>, def 5.2.1 text 5.2.4
M
minus −- , synt 2.3, 2.5.1, 3.3.1 text 3.3.4.1
multiply ×\times , synt 2.3, 3.3.1 text 3.3.4.1
<multiplying operator>, def 3.3.1
N
non-local, text 4.1.3
<number>, def 2.5.1 text 2.5.3, 2.5.4
O
<open string>, def 2.6.1
<operator>, def 2.3
own, synt 2.3, 5.1.1 text 5, 5.2.5
P
<parameter delimiter>, def 3.2.1, 4.7.1 synt 5.4.1 text 4.7.7
parentheses (), synt 2.3, 3.2.1, 3.3.1, 3.4.1, 3.5.1, 4.7.1, 5.4.1 text 3.3.5.2
plus ++ , synt 2.3, 2.5.1, 3.3.1 text 3.3.4.1
<primary>, def 3.3.1
procedure, synt 2.3, 5.4.1
<procedure body>, def 5.4.1
<procedure declaration>, def 5.4.1 synt 5 text 5.3
<procedure heading>, def 5.4.1 text 5.4.3
<procedure identifier>, def 3.2.1 synt 3.2.1, 4.7.1, 5.4.1 text 4.7.5.4
<procedure statement>, def 4.7.1 synt 4.1.1 text 4.7.3
<program>, def 4.1.1 text 1
<proper string>, def 2.6.1
R
real, synt 2.3, 5.1.1 text 5.1.3
<relation>, def 3.4.1 text 3.4.5
<relational operator>, def 2.3, 3.4.1
S
scope, text 2.7
semicolon ; , synt 2.3, 4.1.1, 5.4.1
<separator>, def 2.3
<sequential operator>, def 2.3
<simple arithmetic expression>, def 3.3.1 text 3.3.3
<simple Boolean>, def 3.4.1
<simple designational expression>, def 3.5.1
<simple variable>, def 3.1.1 synt 5.5.1 text 2.4.3
space _, synt 2.3 text 2.3, 2.6.3
<specification part>, def 5.4.1 text 5.4.5
<specificator>, def 2.3
<specifier>, def 5.4.1
standard function, text 3.2.4, 3.2.5
<statement>, def 4.1.1 synt 4.5.1, 4.6.1, 5.4.1 text 4 (complete section)
statement bracket see begin end
step, synt 2.3, 4.6.1 text 4.6.4.2
string, synt 2.3, 5.4.1
<string>, def 2.6.1 synt 3.2.1, 4.7.1 text 2.6.3
string quotes ′^{\prime} ′^{\prime} , synt 2.3, 2.6.1 text 2.6.3
subscript, text 3.1.4.1
subscript bound, text 5.2.3.1
subscript brackets [], synt 2.3, 3.1.1, 3.5.1, 5.2.1
<subscripted variable>, def 3.1.1 text 3.1.4.1
<subscript expression>, def 3.1.1 synt 3.5.1
<subscript list>, def 3.1.1
successor, text 4
switch, synt 2.3, 5.3.1, 5.4.1
<switch declaration>, def 5.3.1 synt 5 text 5.3.3
<switch designator>, def 3.5.1 text 3.5.3
<switch identifier>, def 3.5.1 synt 3.2.1, 4.7.1, 5.3.1
<switch list>, def 5.3.1
T
<term>, def 3.3.1
ten <SUB>10</SUB>, synt 2.3, 2.5.1
then, synt 2.3, 3.3.1, 4.5.1
transfer function, text 3.2.5
true, synt 2.2.2
<type>, def 5.1.1 synt 5.4.1 text 2.8
<type declaration>, def 5.1.1 synt 5 text 5.1.3
<type list>, def 5.1.1
U
<unconditional statement>, def 4.1.1, 4.5.1
<unlabelled basic statement>, def 4.1.1
<unlabelled block>, def 4.1.1
<unlabelled compound>, def 4.1.1
<unsigned integer>, def 2.5.1, 3.5.1
<unsigned number>, def 2.5.1 synt 3.3.1
until, synt 2.3, 4.6.1 text 4.6.4.2
<upper bound>, def 5.2.1 text 5.2.4
V
value, synt 2.3, 5.4.1
value, text 2.8, 3.3.3
<value part>, def 5.4.1 text 4.7.3.1
<variable>, def 3.1.1 synt 3.3.1, 3.4.1, 4.2.1, 4.6.1 text 3.1.3
<variable identifier>, def 3.1.1
W
while, synt 2.3, 4.6.1 text 4.6.4.3
该报告发表在《Numerische数学》、《ACM通讯》和《英国计算机公司杂志》上。
原文链接:http://homepages.cs.ncl.ac.uk/cliff.jones/publications/OCRd/BBG63.pdf
---煤油灯科技victorlamp.com翻译整理---