Язык программирования Алгол-60 (описание в формулах БНФ)
Описание подготовлено С. Командировой (http://www.uni-vologda.ac.ru/cs/syntax/algol-60.htm)
Это первый язык, синтаксис которого был описан формально с помощью специально для этого созданной нотации - формул Бэкуса-Наура (БНФ). Ниже с разрешения авторов приведено полное описание этого языка в указанной нотации.
ОсновнойСимвол = Буква | Цифра | ЛогЗначение | Ограничитель.
Буква = "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 г.