История развития программного обеспечения

Язык программирования Алгол-60 (описание в формулах БНФ)

Это первый язык, синтаксис которого был описан формально с помощью специально для этого созданной нотации - формул Бэкуса-Наура (БНФ). Ниже с разрешения авторов приведено полное описание этого языка в указанной нотации.

ОсновнойСимвол = Буква | Цифра | ЛогЗначение | Ограничитель.

Буква = "a"| "b"| "c"| "d"| "e"| "f"| "g"| "h"| "i"| "j"| "k"| "l"| "m"| "n"|

"o"| "p"| "q"| "r"| "s"| "t"| "u"| "v"| "w"| "x"| "y"| "z"| "A"| "B"| "C"|

"D"| "E"| "F"| "G"| "H"| "I"| "J"| "K"| "L"| "M"| "N"| "O"| "P"| "Q"| "R"|

"S"| "T"| "U"| "V"| "W"| "X"| "Y"| "Z".

Цифра = "0"| "1"| "2"| "3"| "4"| "5"| "6"| "7"| "8"| "9".

ЛогЗначение = TRUE | FALSE.

Ограничитель = ЗнакОперации | Разделитель | Скобка | Описатель | Спецификатор.

ЗнакОперации = ЗнакАрифмОперации | ЗнакОперацииОтношения | ЗнакЛогОперации | ЗнакОперацииСледования.

ЗнакАрифмОперации = "+" | "-" | "*" | "/" | "^".

ЗнакОперацииОтношения = "<" | "<=" | ">" | ">=" | "<>".

ЗнакЛогОперации = "\/" | "/\" | "" | "с" | "Ё".

ЗнакОперацииСледования = GO TO | IF | THEN | ELSE | FOR | DO.

Разделитель = "," | "." | "10" | ":" | ";" | ":=" | STEP | UNTIL | WHILE | COMMENT.

Скобка = "(" | ")" | "[" | "]" | "'" | "`" | BEGIN | END.

Описатель = OWN | BOOLEAN | INTEGER | REAL | ARRAY | SWITCH | PROCEDURE.

Спецификатор = STRING | LABEL | VALUE.

Идентификатор = Буква| Идентификатор Буква | Идентификатор Цифра.

ЦелоеБезЗнака = Цифра | ЦелоеБезЗнака Цифра.

Целое = ЦелоеБезЗнака | "+" ЦелоеБезЗнака | "-" ЦелоеБезЗнака.

ПравильнаяДробь = "." ЦелоеБезЗнака.

Порядок = "10" Целое.

ДесятичноеЧисло = ЦелоеБезЗнака | ПравильнаяДробь | ЦелоеБезЗнака ПравильнаяДробь.

ЧислоБезЗнака = ДесятичноеЧисло | Порядок | ДесятичноеЧисло Порядок.

Число = ЧислоБезЗнака | "+" ЧислоБезЗнака | "-" ЧислоБезЗнака.

ЧистаяСтрока = [ символ ].

ОткрытаяСтрока = ЧистаяСтрока | ЧистаяСтрока ЗамкнутаяСтрока ОткрытаяСтрока.

ЗамкнутаяСтрока = "'" ОткрытаяСтрока "'".

Строка = ЗамкнутаяСтрока | ЗамкнутаяСтрока Строка.

ИдентификаторПеременной = Идентификатор.

ПростаяПеременная = ИдентификаторПеременной.

ИндексноеВыражение = АрифмВыражение.

СписокИндексов = ИндексноеВыражение | СписокИндексов "," ИндексноеВыражение.

ИдентификаторМассива = Идентификатор.

ПеременнаяСИндексами = ИдентификаторМассива [ СписокИндексов ].

Переменная = ПростаяПеременная | ПеременнаяСИндексами.

Выражение = АрифмВыражение | ЛогВыражение | ИменующееВыражение.

ИдентификаторПроцедуры = Идентификатор.

ФактПараметр = Строка | Выражение | ИдентификаторМассива | ИдентификаторПереключателя | ИдентификаторПроцедуры.

СтрокаБукв = Буква | СтрокаБукв Буква.

ОграничительПараметра = "," | ")" СтрокаБукв ":" "(".

СписокФактПараметров = ФактПараметр | СписокФактПараметров ОграничительПараметра ФактПараметр.

СовокупностьФактПараметров = [ "(" СписокФактПараметров ")" ].

УказательФункции = ИдентификаторПроцедуры СовокупностьФактПараметров.

ЗнакОперацииТипаСложения = "+"| "-".

ЗнакОперацииТипаУмножения = "*"|"/"| ":".

ПервичноеВыражение = ЧислоБезЗнака | Переменная | УказательФункции | "(" АрифмВыражение ")".

Множитель = ПервичноеВыражение | Множитель "^" ПервичноеВыражение.

Терм = Множитель | Терм ЗнакОперацииТипаУмножения Множитель.

ПростАрифмВыражение = Терм | ЗнакОперацииТипаСложения Терм | ПростАрифмВыражение ЗнакОперацииТипаСложения Терм.

Условие = IF ЛогВыражение THEN.

АрифмВыражение = ПростАрифмВыражение | Условие ПростАрифмВыражение ELSE АрифмВыражение.

Отношение = ПростАрифмВыражение ЗнакОперацииОтношения ПростАрифмВыражение.

ПервичЛогВыражение = ЛогВыражение | Переменная | УказательФункции | Отношение | "(" ЛогВыражение ")".

ВторЛогВыражение = ПервичЛогВыражение | "г" ПервичЛогВыражение.

ЛогОдночлен = ВторЛогВыражение | ЛогОдночлен "/\" ВторЛогВыражение.

ЛогическийТерм = ЛогОдночлен | ЛогическийТерм "\/" ЛогОдночлен.

Импликация = ЛогическийТерм | Импликация "с" ЛогическийТерм.

ПростЛогВыражение = Импликация | ПростЛогВыражение "=" Импликация.

ЛогВыражение = ПростЛогВыражение | Условие ПростЛогВыражение ELSE ЛогВыражение.

Метка = Идентификатор.

ИдентификаторПереключателя = Идентификатор.

УказательПереключателя = ИдентификаторПереключателя [ ИндексноеВыражение ].

ПростИменВыражение = Метка | УказательПереключателя | "(" ИменующееВыражение ")".

ИменующееВыражение = ПростИменВыражение | Условие ПростИменВыражение ELSE ИменующееВыражение.

НепомечОснОператор = ОператорПрисваивания | ОператорПерехода | ПустойОператор | ОператорПроцедуры.

ОсновнойОператор = НепомечОснОператор | Метка ":" ОсновнойОператор.

БезусловныйОператор = ОсновнойОператор | СоставнойОператор | Блок.

Оператор = БезусловныйОператор | УсловныйОператор | ОператорЦикла.

КонецСоставного = Оператор END | Оператор ";" КонецСоставного.

ЗаголовокБлока = BEGIN Описание | ЗаголовокБлока ";" Описание.

НепомеченныйСоставной = BEGIN КонецСоставного.

НепомеченныйБлок = ЗаголовокБлока ";" КонецСоставного.

СоставнойОператор = НепомеченныйСоставной | Метка ":" СоставнойОператор.

Блок = НепомеченныйБлок | Метка ":" Блок.

Программа = Блок | СоставнойОператор.

Получатель = Переменная | ИдентификаторПроцедуры.

ЛеваяЧасть = Получатель ":=".

СписокЛевойЧасти = ЛеваяЧасть | СписокЛевойЧасти ЛеваяЧасть.

ОператорПрисваивания = СписокЛевойЧасти АрифмВыражение | СписокЛевойЧасти ЛогВыражение.

ОператорПерехода = GO TO ИменующееВыражение.

Пусто = .

ПустойОператор = Пусто.

Условие = IF ЛогВыражение THEN.

БезусловныйОператор = ОсновнойОператор | СоставнойОператор | Блок.

ОператорЕсли = Условие БезусловныйОператор.

УсловныйОператор = ОператорЕсли | ОператорЕсли ELSE Оператор | Условие ОператорЦикла | Метка ":" УсловныйОператор.

ЭлементСпискаЦикла = АрифмВыражение | АрифмВыражение STEP АрифмВыражение UNTIL АрифмВыражение | АрифмВыражение WHILE ЛогВыражение.

СписокЦикла = ЭлементСпискаЦикла | СписокЦикла "," ЭлементСпискаЦикла.

ЗаголовокЦикла = FOR Идентификатор ":=" СписокЦикла DO.

ОператорЦикла = ЗаголовокЦикла Оператор | Метка ":" ОператорЦикла.

ФактическийПараметр = Строка | АрифмВыражение | ИдентификаторМассива | ИдентификаторПереключателя | ИдентификаторПроцедуры.

СтрокаБукв = Буква | СтрокаБукв Буква.

ОграничительПараметра = "," | ")" СтрокаБукв ":" "(".

СписокФактПараметров = ФактическийПараметр | СписокФактПараметров ОграничительПараметра ФактическийПараметр.

СовокупностьФактическихПараметров = [ "(" СписокФактПараметров ")" ].

ОператорПроцедуры = ИдентификаторПроцедуры СовокупностьФактическихПараметров.

Описание = ОписаниеТипа | ОписаниеМассива | ОписаниеПереключателя | ОписаниеПроцедуры.

СписокТипа = ПростаяПеременная | ПростаяПеременная "," СписокТипа.

Тип = REAL | INTEGER | BOOLEAN.

ЛокальныйИлиСобственный = [ OWN ].

ОписаниеТипа = ЛокальныйИлиСобственный Тип СписокТипа.

НижняяГраница = АрифмВыражение.

ВерхняяГраница = АрифмВыражение.

ГраничнаяПара = НижняяГраница ":" ВерхняяГраница.

СписокГраничныхПар = ГраничнаяПара | СписокГраничныхПар "," ГраничнаяПара.

СегментМассива = ИдентификаторМассива [ СписокГраничныхПар ] | ИдентификаторМассива "," СегментМассива.

СписокМассивов = СегментМассива | СписокМассивов ","СегментМассива.

ОписательМассива = [ Тип ] ARRAY.

ОписаниеМассива = ЛокальныйИлиСобственный ОписательМассива СписокМассивов.

ПереключательныйСписок = ИменующееВыражение | ПереключательныйСписок "," ИменующееВыражение.

ОписаниеПереключателя = SWITCH ИдентификаторПереключателя ":=" ПереключательныйСписок.

ФормальныйПараметр = Идентификатор.

СписокФормальныхПараметров = ФормальныйПараметр | СписокФормальныхПараметров ОграничительПараметра ФормальныйПараметр.

СовокупностьФормальныхПараметров = [ "(" СписокФормальныхПараметров ")" ].

СписокИдентификаторов = Идентификатор | СписокИдентификаторов "," Идентификатор.

СписокЗначений = [ VALUE СписокИдентификаторов ";" ].

Спецификация = STRING | Тип | ОписательМассива | LABEL | SWITCH | PROCEDURE | Тип PROCEDURE.

СовокупностьСпецификаций = [ Спецификация СписокИдентификаторов ";"| СовокупностьСпецификаций Спецификация СписокИдентификаторов";" ].

ЗаголовокПроцедуры = ИдентификаторПроцедуры СовокупностьФормальныхПараметров ";" СписокЗначений СовокупностьСпецификаций.

ТелоПроцедуры = Оператор | код.

ОписаниеПроцедуры = PROCEDURE ЗаголовокПроцедуры ТелоПроцедуры | Тип PROCEDURE ЗаголовокПроцедуры ТелоПроцедуры.

Статья опубликована 17.09.2002 г.