Турбо Паскаль 2.0
Описание подготовлено С. Командировой

Программа = ЗаголовокПрограммы ";"  Блок ".".
ЗаголовокПрограммы = PROGRAM Имя ( ИмяФайла { ","ИмяФайла }) ";".
ИмяФайла = Имя.
Имя = Буква { БукваИлиЦифра }.
Буква="A"|"B"|"C"|"D"|"E"|"F"|"G"|"H"|"I"|"J"|"K"|"L"|"M"|"N"|"O"|"P"|"Q"|"R"|
"S"|"T"|"U"|"V"|"W"|"Z"|"X"|"Y"|"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"|"_".
БукваИлиЦифра =  Буква | Цифра.
Цифра = "1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9".
ОператорInline = (INLINE"(")(ЗаписьВоВнутреннемМашинномКоде|"/")")".
ЗаписьВоВнутреннемМашинномКоде = ["<"|">"] Константа | ИмяПеременной
                                 [Знак Константа { Знак Константа}].

Блок = РазделМеток РазделКонстант РазделТипов РазделПеременных
       РазделПроцедурИФункций РазделОператоров ";".
РазделМеток = [ LABEL Метка { "," Метка } ";" ].
Метка = ЦелоеБезЗнака | Идентификатор.
Идентификатор = Имя.
РазделКонстант=[(CONST)(ОпределениеКонстанты | ОписаниеТипизированнойКонстанты)
               {ОпределениеКонстанты | ОписаниеТипизированнойКонстанты}].
ОпределениеКонстанты = Имя "=" Константа.
Константа = [Знак] ЧислоБезЗнака | [Знак] ИмяКонстанты |
            Строка | "#" ЦелоеБезЗнака.
ЧислоБезЗнака = ЦелоеБезЗнака | ВещественноеБезЗнака.
ЦелоеБезЗнака = Цифра { Цифра } | "$" ШестнадцатиричнаяЦифра.
ШестнадцатиричнаяЦифра = Цифра | "A" | "B" | "C" | "D" | "E" | "F" | "a" |
                         "b" | "c" | "d" | "e" | "f".
ВещественноеБезЗнака = ЦелоеБезЗнака "." Цифра { Цифра } | ЦелоеБезЗнака "."
                       Цифра { Цифра } "E" Порядок | ЦелоеБезЗнака "E" Порядок.
Порядок = ЦелоеБезЗнака | Знак ЦелоеБезЗнака.
Знак = "+" | "-".
ИмяКонстанты = Имя.
Строка = "'" символ { символ } "'".
ОписаниеТипизированнойКонстанты=Идентификатор":"Тип"="ТипизированнаяКонстанта.
ТипизированнаяКонстанта = Константа | КонстантаМассив | КонстантаЗапись |
                        КонстантаМножество | NIL.
КонстантаМассив = "(" ТипизированнаяКонстанта {","ТипизированнаяКонстанта}")".
КонстантаЗапись="(" ИмяПоля ":"ТипизированнаяКонстанта {";"
                 ИмяПоля ":"ТипизированнаяКонстанта} ")".
КонстантаМножество="[" [ КонстантаЭлемент {","КонстантаЭлемент}] "]".
КонстантаЭлемент=Константа[".."Константа].
РазделТипов = [ TYPE ОпределениеТипа { ";" ОпределениеТипа } ";" ].
ОпределениеТипа = Имя "=" Тип.
Тип = ПростойТип | СоставнойТип | СсылочныйТип.
ПростойТип = СкалярныйТип | ОграниченныйТип | ИмяТипа.
СкалярныйТип = "(" Имя { "," Имя } ")".
ОграниченныйТип = КонстантаЭлемент.
ИмяТипа = Имя.
СоставнойТип = [ PACKED ] НеупакованныйСоставнойТип.
НеупакованныйСоставнойТип = РегулярныйТип | КомбинированныйТип |
                            МножественныйТип | ФайловыйТип | СтроковыйТип.
РегулярныйТип = ARRAY [ ТипИндекса { "," ТипИндекса } ]  OF ТипКомпоненты.
ТипИндекса = ПростойТип.
ТипКомпоненты = Тип.
КомбинированныйТип = RECORD СписокПолей END.
СписокПолей = ФиксированнаяЧасть | ФиксированнаяЧасть ВариантнаяЧасть |
              ВариантнаяЧасть.
ФиксированнаяЧасть = СекцияЗаписи { "," СекцияЗаписи }.
СекцияЗаписи = [ ИмяПоля { "," ИмяПоля } ":" Тип ].
ВариантнаяЧасть = CASE Дискриминант ИмяТипа OF Вариант { ";" Вариант }.
Дискриминант =  ИмяПоля ":".
Вариант = [ СписокМетокВарианта ":" "(" СписокПолей ")" ].
СписокМетокВарианта = МеткаВарианта { "," МеткаВарианта } .
МеткаВарианта = Константа.
МножественныйТип = SET OF БазовыйТип.
БазовыйТип = ПростойТип.
ФайловыйТип = FILE [OF Тип].
СтроковыйТип = STRING "[" ЦелоеБезЗнака "]".
СсылочныйТип = "^" ИмяТипа.
РазделПеременных = [ VAR ОписаниеПеременной ";"{ ОписаниеПеременной ";" } ].
ОписаниеПеременной=Имя { ","  Имя } ":" Тип [АбсолютноеПредложение] ";".
АбсолютноеПредложение=(ABSOLUTE) ((ЦелоеБезЗнака ":" ЦелоеБезЗнака)|
                      ИмяПеременной).
РазделПроцедурИФункций = { ОписаниеПроцедурыИлиФункции ";" }.
ОписаниеПроцедурыИлиФункции = ОписаниеПроцедуры | ОписаниеФункции.
ОписаниеПроцедуры = ЗаголовокПроцедуры ТелоПроцедуры.
ЗаголовокПроцедуры = PROCEDURE Имя [ "(" РаздФормПараметров
                     { ";" РаздФормПараметров } ")" ] ";".
РаздФормПараметров = [ VAR ] ГруппаПараметров.
ТелоПроцедуры=Блок | FORWARD | EXTERNAL | ОператорInline.
ГруппаПараметров = Имя { "," Имя } ":" ИмяТипа.
ОписаниеФункции = ЗаголовокФункции ТелоФункции.
ЗаголовокФункции = FUNCTION Имя [ "(" РаздФормПараметров { ";"
                   РаздФормПараметров } ")"] ":" ТипРезультата ";".
ТипРезультата = ИмяТипа | STRING | FILE.
ТелоФункции = Блок | FORWARD | EXTERNAL | ОператорInline.
РазделОператоров = СоставнойОператор.
Оператор = НепомеченныйОператор | Метка ":" НепомеченныйОператор.
НепомеченныйОператор = ПростойОператор | СложныйОператор.
ПростойОператор = ОператорПрисваивания | ОператорПроцедуры |
                  ОператорПерехода | ПустойОператор.
ОператорПрисваивания = Переменная ":=" Выражение | ИмяФункции ":=" Выражение.
Переменная = ПолнаяПеременная | КомпонентаПеременной | УказаннаяПеременная.
ПолнаяПеременная = ИмяПеременной.
ИмяПеременной = Имя.
КомпонентаПеременной = ИндексированнаяПеременная ОбозначениеПоля | БуферФайла.
ИндексированнаяПеременная = ПеременнаяМассив [ Выражение {"," Выражение } ].
ПеременнаяМассив = Переменная.
ОбозначениеПоля = ПеременнаяЗапись "." ИмяПоля.
ПеременнаяЗапись = Переменная.
ИмяПоля = Имя.
БуферФайла = ПеременнаяСсылка "^".
ПеременнаяФайл = Переменная.
УказаннаяПеременная = ПеременнаяФайл "^".
ПеременнаяСсылка = Переменная.
Выражение = ПростоеВыражение | ПростоеВыражение ОперацияОтношения
            ПростоеВыражение.
ОперацияОтношения = "=" | "<>" | "<" | ">" | "<=" | ">=" | IN.
ПростоеВыражение = Слагаемое | Знак Слагаемое | ПростоеВыражение
                   АддитивнаяОперация Слагаемое.
АддитивнаяОперация = "+" | "-" | OR | XOR.
Слагаемое = Множитель | Слагаемое МультипликативнаяОперация Множитель.
МультипликативнаяОперация = "*" | "/" | DIV | MOD | SHL | SHR.
Множитель = Переменная | КонстБезЗнака | ( Выражение ) | ОбозначениеФункции |
            ( Множество ) | NOT Множитель.
КонстБезЗнака = ЧислоБезЗнака | Строка | ИмяКонстанты | NIL.
ОбозначениеФункции = ИмяФункции | ИмяФункции ( ФактПараметр { ","
                     ФактПараметр } ).
ИмяФункции = Имя.
Множество = [ СписокЭлементов ].
СписокЭлементов = [ Элемент { "," Элемент } ].
Элемент = Выражение | Выражение ".." Выражение.
ОператорПроцедуры = ИмяПроцедуры | ИмяПроцедуры ( ФактПараметр { ","
                    ФактПараметр } ).
ИмяПроцедуры = Имя.
ФактПараметр = Выражение | Переменная | ИмяПроцедуры | ИмяФункции.
ОператорПерехода = GOTO Метка.
ПустойОператор = Пусто.
Пусто =  .
СложныйОператор = СоставнойОператор | ВыбирающийОператор | ОператорЦикла |
                  ОператорПрисоединения.
СоставнойОператор = BEGIN Оператор { "," Оператор } END.
ВыбирающийОператор = УсловныйОператор | ОператорВарианта.
УсловныйОператор = IF Выражение THEN Оператор [ ELSE Оператор ].
ОператорВарианта = CASE Выражение OF ЭлементСпискаВариантов
                   { ";" ЭлементСпискаВариантов } END.
ЭлементСпискаВариантов = [ СписокМетокВарианта ":" Оператор ].
СписокМетокВарианта = МеткаВарианта { "," МеткаВарианта }.
ОператорЦикла = ЦиклСПредУсловием | ЦиклСПостУсловием | ЦиклСПараметром.
ЦиклСПредУсловием = WHILE Выражение DO Оператор.
ЦиклСПостУсловием = REPEAT Оператор { "," Оператор } UNTIL Выражение.
ЦиклСПараметром = FOR ПараметрЦикла ":=" СписокЦикла DO Оператор.
СписокЦикла = НачЗнач TO КонЗнач | НачЗнач DOWNTO КонЗнач.
ПараметрЦикла = Имя.
НачЗнач = Выражение.
КонЗнач = Выражение.
ОператорПрисоединения = WITH СписокПеременныхЗаписей DO Оператор.
СписокПеременныхЗаписей = ПеременнаяЗапись { "," ПеременнаяЗапись }.