Ада
Описание подготовлено Н. Шумиловой

ГрафСимвол = ОснГрафСимвол | СтрочБуква | ДополСпецСимвол .
ОснГрафСимвол = ПрописБуква | Цифра | СпецСимвол | СимволПробела .
ОснСимвол = ОснГрафСимвол | символупрформатом .
СтрочБуква = "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" .
СпецСимвол = "кав" | "#" | "&" | "'" | "(" | ")" | "*" | "+" |
             "," | "-" | "." | "/" | ";" | ":" |"<" | "=" |
             ">" | "|" .
Идентификатор = Буква { Буква | Цифра } .
Буква = ПрописБуква | СтрочБуква .
ЧислЛитерал = ДесятичЛитерал | ЛитералСОснованием .
ДесятичЛитерал = Целое  [  Целое ]  [  Порядок ] .
Целое = Цифра { Цифра } .
Порядок = "E" [ "+" | "-" ] Цифра { Цифра } .
ЛитералСОснованием = Основание "#" ЦелоеСОснованием
                     [ "." ЦелоеСОснованием ] "#" [ Порядок ] .
Основание = Целое .
ЦелоеСОснованием = РасширЦифра { РасширЦифра } .
РасширЦифра = Цифра | Буква .
СимвЛитерал = "'" ГрафСимвол "'" .
СтрЛитерал = '"' { ГрафСимвол } '" '.
Прагма = PRAGMA Идентификатор [ "(" СопостАрг { "," СопостАрг } ")" ] .
СопостАрг = [ ИдентификаторАргумента "=" ">" ] Имя
            | [ ИдентификаторАргумента "=" ">" ] Выраж .
ИдентификаторАргумента =  Идентификатор .
ОснОписание = ОписОбъекта | ОписТипа | ОписПодпрогр | ОписЗадачи |
              ОписИсключения | ОписПереимен | ОписЧисла | ОписПодтипа |
              ОписПакета | ОписНастройки | КонкретизацияНастройки |
              ОписСубконст .
ОписОбъекта = СписокИдентификаторов ":" [ CONSTANT ]
              УказПодтипа [ ":" "=" Выраж ] ";"
              | СписокИдентификаторов ":" [ CONSTANT ]
              ОпрОгранИндексТипа [ ":" "=" Выраж ] .
ОписЧисла = СписокИдентификаторов ":" CONSTANT ":" "=" УниверсСтатичВыраж .
УниверсСтатичВыраж = Выраж .
СписокИдентификаторов = Идентификатор { ","  Идентификатор } .
ОписТипа = ПолноеОписТипа | НеполноеОписТипа | ОписЛичТипа .
ПолноеОписТипа = TYPE Идентификатор [ РазделДискр ] IS ОпрТипа .
ОпрТипа = ОпрПеречислТипа | ОпрЦелТипа | ОпрВещТипа | ОпрИндексТипа |
          ОпрИменТипа | ОпрСсылочТипа | ОпрПроизводТипа .
ОписПодтипа = SUBTYPE Идентификатор IS УказПодтипа .
УказПодтипа = ОбознТипа  [  Ограничение  ]  .
ОбознТипа = ИмяТипа | ИмяПодтипа .
ИмяТипа = Имя .
ИмяПодтипа = Имя .
Ограничение = ОгранДиапазона | ОгранПлавТипа | ОгранФиксирТипа |
              ОгранИндекса | ОгранДискр .
ОпрПроизводТипа = NEW УказПодтипа .
ОгранДиапазона = RANGE Диапазон .
Диапазон = АтрибутДиапазона | ПростВыраж ".." ПростВыраж .
АтрибутДиапазона = Атрибут .
ОпрПеречислТипа = "(" СпецЛитералаПеречисления
                   { "," СпецЛитералаПеречисления } ")" .
СпецЛитералаПеречисления = ЛитералПеречисления .
ЛитералПеречисления = Идентификатор | СимвЛитерал .
ОпрЦелТипа = ОгранДиапазона .
ОпрВещТипа = ОгранПлавТипа | ОгранФиксирТипа .
ОгранПлавТипа = ОпрТочнПлавТипа [ ОгранДиапазона ] .
ОпрТочнПлавТипа = DIGITS СтатичПростВыраж .
СтатичПростВыраж = ПростВыраж .
ОгранФиксирТипа = ОпрТочнФиксирТипа  [ ОгранДиапазона ] .
ОпрТочнФиксирТипа = DELTA СтатичПростВыраж .
ОпрИндексТипа = ОпрНеогрИндексТипа | ОпрОгранИндексТипа .
ОпрНеогрИндексТипа = ARRAY "(" ОпрПодтипаИндекса { "," ОпрПодтипаИндекса } ")"
                     OF УказПодтипаКомпоненты .
УказПодтипаКомпоненты = УказПодтипа .
ОпрОгранИндексТипа = ARRAY  ОгранИндекса OF УказПодтипаКомпоненты .
ОпрПодтипаИндекса = ОбознТипа RANGE "<" ">" .
ОгранИндекса = "(" ДискрДиапазон [ "," ДискрДиапазон ] ")".
ДискрДиапазон =  УказДискретПодтипа | Диапазон .
УказДискретПодтипа = УказПодтипа .
ОпрИменТипа = RECORD СписКомпонент END RECORD .
СписКомпонент = ОписКомпоненты { ОписКомпоненты } |
                { ОписКомпоненты } РазделВар | NULL .
ОписКомпоненты = СписокИдентификаторов ":" ОпрПодтипаКомпоненты [ ":" "="
                 Выраж ] .
ОпрПодтипаКомпоненты = УказПодтипа .
РазделДискр = "(" СпецДискр { ";" СопостДискр } ")" .
СпецДискр = СписокИдентификаторов ":" ОбознТипа  [ ":" "=" Выраж ] .
ОгранДискр = "(" СопостДискр { "," СопостДискр } ")" .
СопостДискр = [ ПростИмяДискр { "|" ПростИмяДискр } "=" ">" ] Выраж .
РазделВар = CASE ПростИмяДискр IS Вар { Вар } END CASE .
ПростИмяДискр = ПростИмя .
Вар = WHEN Выбор { "|" Выбор } "=" ">" СписКомпонент .
Выбор = ПростВыраж | ДискрДиапазон | OTHERS | ПростИмяКомпоненты .
ПростИмяКомпоненты = ПростИмя .
ОпрСсылочТипа = ACCESS Идентификатор [ РазделДискр ] .
НеполноеОписТипа = TYPE Идентификатор [ РазделДискр] .
РаздОпис = { ОснЭлОпис } { ДополЭлОпис } .
ОснЭлОпис = ОснОписание | СпецПредставления | СпецИспол .
ДополЭлОпис = Тело
              | ОписПодпрогр | ОписПакета | ОписЗадачи | ОписНастройки
              | СпецИспол | КонкретизацияНастройки .
Тело = СоотвТело | СледТела .
СоотвТело = ТелоПодпрогр | ТелоПакета | ТелоЗадачи .
Имя = ПростИмя | СимвЛитерал | ЗнакОперации | ИндексКомпонента |
      Отрезок | ИменКомпонента | Атрибут .
ПростИмя = Идентификатор .
Префикс = Имя | ВызовФункции .
ИндексКомпонента = Префикс "(" Выраж { "," Выраж } ")" .
Отрезок = Префикс "(" ДискрДиапазон ")" .
ИменКомпонента = Префикс "." Постфикс .
Постфикс = ПростИмя | СимвЛитерал  | ЗнакОперации | ALL .
Атрибут = Префикс "'" ОбознАтрибута .
ОбознАтрибута = ПростИмя [ "(" УниверсСтатичВыраж ")"] .
Агрегат = "(" СопостКомпонент { "," СопостКомпонент } ")"  .
СопостКомпонент = [ Выбор { "|" Выбор } "=" ">" ] Выраж .
Выраж = Отношение { AND Отношение } | Отношение { AND THEN Отношение }
        | Отношение { OR Отношение } | Отношение { OR ELSE Отношение}
        | Отношение { XOR  Отношение } .
Отношение = ПростВыраж [ ОперОтнош ПростВыраж ] | ПростВыраж [ NOT ]  IN
            Диапазон | ПростВыраж [ NOT ] IN ОбознТипа .
ПростВыраж = [ УнарАддитОперация ]  Слаг { БинарАддитОперация Слаг } .
Слаг = Множ { МультОперация Множ } .
Множ = Первич [ "**" Первич ] | ABS Первич  | NOT Первич .
Первич = ЧислЛитерал | NULL | Агрегат | СтрЛитерал | Имя | Генератор
         | ВызовФункции | ПреобразТипа | КвалифицВыраж | "(" Выраж ")" .
ЛогичОпер = AND | OR | XOR .
ОперОтнош = "=" | "/=" | "<" | "<=" | ">" | "="">" .
БинарАддитОперация = "+" | "-" | "&" .
УнарАддитОперация = "+" | "-" .
МультОперация = "*" | "/" | MOD | REM .
ОперВысшПриоритета = "**" | ABS | NOT .
ПреобразТипа = ОбознТипа "(" Выраж ")" .
КвалифицВыраж = ОбознТипа "'" "(" Выраж ")" | ОбознТипа "'" Агрегат .
Генератор = NEW УказПодтипа | NEW КвалифицВыраж .
ПоследОператоров = Оператор { Оператор } .
Оператор = { Метка } ПростОператор | { Метка } СоставОператор .
ПростОператор = ПустОпер | ОперПрисв | ОперВызПроц | ОперВых
                | ОперВозвр | ОперПерех  | ОперВызоваВхода | ОперЗадержки
                | ОперПрекращ | ОперВозбуждения | ОперКода .
СоставОператор = УсловОпер | ОперВыбор | ОперЦикл | ОперБлок
                 | ОперПринятия | ОперОтбора .
Метка = "<" "<" ПростИмяМетки ">" ">" .
ПростИмяМетки = ПростИмя .
ПустОпер = NULL .
ОперПрисв = ИмяПеременной ":=" Выраж .
ИмяПеременной =Имя .
УсловОпер = IF Условие THEN ПоследОператоров { ELSIF Условие THEN
            ПоследОператоров } [ ELSE ПоследОператоров ]
            END IF .
Условие = ЛогичВыраж .
ЛогичВыраж = Выраж .
ОперВыбор = CASE  Выраж IS АльтерОперВыбор { АльтерОперВыбор }
            END CASE .
АльтерОперВыбор = WHEN Выбор { "|" Выбор } "=" ">" ПоследОператоров .
ОперЦикл = [ ПростИмяЦикла   ":" ] [ СхемаИтерации ] LOOP
           ПоследОператоров END LOOP [ ПростИмяЦикла ] .
ПростИмяЦикла =ПростИмя .
СхемаИтерации = WHILE Условие | FOR СпецПараметраЦикла .
СпецПараметраЦикла = Идентификатор IN [ REVERSE ] ДискрДиапазон .
ОперБлок = [ ПростИмяБлока ":" ] [ DECLARE РаздОпис ] BEGIN ПоследОператоров
           [ EXCEPTION ОбрабИсключения { ОбрабИсключения } ]
           END [ ПростИмяБлока ] .
ПростИмяБлока = ПростИмя .
ОперВых = EXIT [ ИмяЦикла ] [ WHEN Условие ] .
ИмяЦикла = Имя .
ОперВозвр = RETURN [ Выраж ] .
ОперПерех = GOTO ИмяМетки .
ИмяМетки =Имя .
ОписПодпрогр = СпецПодпрогр .
СпецПодпрогр = PROCEDURE Идентификатор [ РазделФормальнПараметров ]
               | FUNCTION Обозн [ РазделФормальнПараметров ]
                 RETURN ОбознТипа .
Обозн = Идентификатор | ЗнакОперации .
ЗнакОперации = СтрЛитерал .
РазделФормальнПараметров = "(" СпецПараметра { ";" СпецПараметра } ")" .
СпецПараметра = СписокИдентификаторов ":" Вид ОбознТипа [ ":=" Выраж ] .
Вид = [ IN ] | IN OUT | OUT .
ТелоПодпрогр = СпецПодпрогр IS [ РаздОпис ] BEGIN ПоследОператоров
               [ EXCEPTION ОбрабИсключения { ОбрабИсключения } ]
               END [ Обозн ] .
ОперВызПроц = ИмяПроц [ РазделФактичПараметров ] .
ВызовФункции = ИмяФункц [ РазделФактичПараметров ] .
ИмяПроц =Имя .
ИмяФункц = Имя .
РазделФактичПараметров = "(" СопостПараметров { ","
                          СопостПараметров } ")" .
СопостПараметров = [ ФормПараметр "=" ">" ] ФактичПараметр .
ФормПараметр = ПростИмяПараметра .
ПростИмяПараметра = ПростИмя .
ФактичПараметр = Выраж | ИмяПеременной | ОбознТипа "(" ИмяПеременной ")" .
ОписПакета = СпецПакета .
СпецПакета = PACKAGE Идентификатор IS { ОснЭлОпис } [ PRIVATE
             { ОснЭлОпис } ] END [ ПростИмяПакета ] .
ПростИмяПакета =ПростИмя .
ТелоПакета = PACKAGE BODY ПростИмяПакета IS [ РаздОпис ]
             [ BEGIN ПоследОператоров [ EXCEPTION ОбрабИсключения
             { ОбрабИсключения } ] ] END [ ПростИмяПакета ] .
ОписЛичТипа = TYPE Идентификатор [ РазделДискр ] IS [ LIMITED ] PRIVATE .
ОписСубконст = СписокИдентификаторов ":" CONSTANT ОбознТипа .
СпецИспол = USE ИмяПакета { "," ИмяПакета } .
ИмяПакета = Имя .
ОписПереимен = Идентификатор ":" ОбознТипа RENAMES ИмяОбъекта ";"
               | Идентификатор ":" EXCEPTION RENAMES ИмяИсключ  ";"
               | PACKAGE Идентификатор RENAMES ИмяПакета  ";"
               | СпецПодпрогр RENAMES ИмяПодпрИлиВхода .
ИмяПодпрИлиВхода =Имя .
ИмяИсключ = Имя .
ИмяОбъекта =Имя .
ОпрСсылочТипа = ACCESS УказПодтипа .
НеполОписТипа = TYPE Идентификатор [ РазделДискр ] .
ОписЗадачи = СпецЗадачи .
СпецЗадачи = TASK [ TYPE ] Идентификатор [ IS { ОписВхода }
             {СпецПредставления } END [ ПростИмяЗадачи ] ] .
ТелоЗадачи = TASK BODY ПростИмяЗадачи IS [ РаздОпис ] BEGIN
             ПоследОператоров [ EXCEPTION  ОбрабИсключения { ОбрабИсключения } ]
             END [ ПростИмя ] .
ПростИмяЗадачи =ПростИмя .
ОписВхода = ENTRY Идентификатор [ "(" ДискрДиапазон ")" ]
            [ РазделФормальнПараметров] .
ОперВызоваВхода = ИмяВхода [ РазделФактичПараметров ] .
ИмяВхода = Имя.
ОперПринятия = ACCEPT ПростИмя [ "("  ИндексВхода ")" ]
               [ РазделФормальнПараметров ] [ DO ПоследОператоров
               END [ ПростИмяВхода ]] .
ПростИмяВхода =ПростИмя.
ИндексВхода = Выраж .
ОперЗадержки = DELAY ПростВыраж .
ОперОтбора = ОтборСОжид | УсловВызовВхода | ВременВызовВхода .
ОтборСОжид = SELSCT АльтерОтбора { OR АльтерОтбора } [ ELSE
             ПоследОператоров ] END SELSCT .
АльтерОтбора = [ WHEN Условие "=" ">" ] АльтерОтбораСОжид .
АльтерОтбораСОжид = АльтерПринятия | АльтерЗадержки | АльтерЗавершения .
АльтерПринятия = ОперПринятия [ ПоследОператоров ] .
АльтерЗадержки = ОперЗадержки [ ПоследОператоров ] .
АльтерЗавершения = TERMINATE .
УсловВызовВхода = SELSCT ОперВызоваВхода [ ПоследОператоров ]
                  ELSE ПоследОператоров END SELSCT .
ВременВызовВхода = SELSCT ОперВызоваВхода [ ПоследОператоров ]
                   OR АльтерЗадержки END SELSCT .
ОперПрекращ = ABORT ИмяЗадачи { "," Имя } .
ИмяЗадачи =Имя .
Компиляция = { КомпилируемыйМодуль }.
КомпилируемыйМодуль = СпецКонтекста БиблиотечныйМодуль
                      |СпецКонтекста ВторичныйМодуль .
БиблиотечныйМодуль = ОписПодпрогр | ОписПакета |ОписНастройки
                      |КонкретизацияНастройки | ТелоПодпрогр .
ВторичныйМодуль = ТелоБиблиотечногоМодуля |Субмодуль .
ТелоБиблиотечногоМодуля = ТелоПодпрогр | ТелоПакета .
СпецКонтекста = { СпецСовместности { СпецИспол } } .
СпецСовместности = WITH ПростИмяМодуля { "," ПростИмяМодуля } .
ПростИмяМодуля = ПростИмя .
СледТела = СпецПодпрогр IS SEPARATE ";" | PACKAGE BODY ПростИмяПакета
            IS SEPARATE ";" | TASK BODY ПростИмяЗадачи IS SEPARATE .
Субмодуль = SEPARATE "(" ИмяРодитМодуля ")" СоотвТело .
ИмяРодитМодуля = Имя .
ОписИсключения = СписокИдентификаторов ":" EXCEPTION .
ОбрабИсключения = WHEN ВыборИсключения { "|" ВыборИсключения } "=" ">"
                   ПоследОператоров .
ВыборИсключения = ИмяИсключ | OTHERS .
ОперВозбуждения = RAISE [ ИмяИсключ ] .
ОписНастройки = СпецНастройки .
СпецНастройки = РазделФормальнПараметровНастройки СпецПодпрогр
                | РазделФормальнПараметровНастройки СпецПакета.
РазделФормальнПараметровНастройки =  GENERIC { ОписПараметраНастройки } .
ОписПараметраНастройки = СписокИдентификаторов [ IN [ OUT ] ]
                          ОбознТипа [ ":=" Выраж ] ";" | TYPE Идентификатор
                          IS ОпрНастТипа ";" | ОписЛичТипа | WITH
                          СпецПодпрогр [ IS Имя ] ";" |
                          WITH СпецПодпрогр [ IS "<" ">" ].
ОпрНастТипа = "(" "<" ">" ")" | RANGE "<" ">" | DELTA "<" ">"
               | ОпрИндексТипа |ОпрСсылочТипа .
КонкретизацияНастройки = PACKAGE Идентификатор IS NEW ИмяНастрПакета
                         [РазделФактичПараметровНастройки] ";"
                          | PROCEDURE Идентификатор IS NEW ИмяНастрПроцедуры
                          [РазделФактичПараметровНастройки] ";"
                          | FUNCTION Обозн IS NEW ИмяНастрФункции
                          [РазделФактичПараметровНастройки] .
РазделФактичПараметровНастройки = "(" СопостПараметровНастройки
                                  { "," СопостПараметровНастройки  } ")".
СопостПараметровНастройки = [ФормальныйПараметрНастройки "=" ">" ]
                             ФормальныйПараметрНастройки.
ФормальныйПараметрНастройки = ПростИмяПараметра | ЗнакОперации .
ФактичПараметрНастройки = Выраж | ИмяПеременной | ИмяПодпрогр | ИмяВхода
                         | ОбознТипа .
ИмяПодпрогр = Имя .
ИмяНастрПроцедуры = Имя .
ИмяНастрПакета =Имя .
ИмяНастрФункции = Имя .
СпецПредставления = СпецПредставленияТипа | СпецАдреса .
СпецПредставленияТипа = СпецДлины | СпецПредставленияПеречисления
                        | СпецПредставленияЗаписи СпецПредставленияПеречисления.
СпецДлины = FOR Атрибут USE ПростВыраж .
СпецПредставленияПеречисления = FOR ПростИмяТипа USE Агрегат .
ПростИмяТипа = ПростИмя .
СпецПредставленияЗаписи = FOR ПростИмяТипа USE
                          RECORD [ СпецВыравнивания ] { СпецКомпоненты }
                          END RECORD .
СпецВыравнивания = AT MOD СтатичПростВыраж .
СпецКомпоненты = ИмяКомпоненты AT СтатичПростВыраж RANGE СтатичДиапазон .
ИмяКомпоненты = Имя.
СтатичДиапазон = Диапазон .
СпецАдреса = FOR ПростИмя USE AT ПростВыраж .
ОперКода = ОбознТипа | АгрегатЗаписи .
АгрегатЗаписи = Агрегат .