МАТЕРИАЛЫ К ПРАКТИЧЕСКИМ ЗАДАНИЯМ
Приложение 1
Формальные описания в приложениях 1-4 адаптированы для удобства использования: в БНФ и РБНФ добавлены ссылки на номера правил для понятий, а в СД - названия конструкций.
Описание синтаксиса языка АЛГОЛ-60 в виде БНФ
Источник: Алгоритмический язык АЛГОЛ 60. Модифицированное сообщение.
М.: Мир, 1984. 72 с.
1 <программа> ::= <блок>.2 | <составной оператор>.3
2 <блок> ::= <непомеченный блок>.4 | <метка>.79 : <блок>.2
3 <составной оператор> ::= <непомеченный составной>.5 | <метка>.79 : <составной оператор>.3
4 <непомеченный блок> ::= <заголовок блока>.6 ; <конец составного>.7
5 <непомеченный составной> ::= begin <конец составного>.7
6 <заголовок блока> ::= begin <описание>.8 | <заголовок блока>.6 ; <описание>.8
7 <конец составного> ::= <оператор>.35 end | <оператор>.35 ; <конец составного>.7
8 <описание> ::= <описание типа>.9 | <описание массива>.13 | <описание переключателя>.21 | <описание процедуры>.23
9 <описание типа> ::= <локальный или собственный>.10 <тип>.11 <список типа>.12
10 <локальный или собственный> ::= <пусто>.45 | own
11 <тип> ::= real | integer | Boolean
12 <список типа> ::= <простая переменная>.86 | <простая переменная>.86 , <список типа>.12
|
|
13 <описание массива> ::= <локальный или собственный>.10 <описатель массива>.14 <список массивов>.15
14 <описатель массива> ::= <тип>.11 array | array
15 <список массивов> ::= <сегмент массива>.16 | <список массивов>.15 , <сегмент массива>.16
16 <сегмент массива> ::= <идентификатор массива>.83 [ <список граничных пар>.17 ] | <идентификатор массива>.83 , <сегмент массива>.16
17 <список граничных пар> ::= <граничная пара>.18 | <список граничных пар>.17 , <граничная пара>.18
18 <граничная пара> ::= <нижняя граница>.19 : <верхняя граница>.20
19 <нижняя граница> ::= <арифметическое выражение>.58
20 <верхняя граница> ::= <арифметическое выражение>.58
21 <описание переключателя> ::= switch <идентификатор переключателя>.78 := <переключательный список>.22
22 <переключательный список> ::= <именующее выражение>.75 | <переключательный список>.22 , <именующее выражение>.75
|
|
23 <описание процедуры> ::= procedure <заголовок процедуры>.25 <тело процедуры>.24 | <тип>.11 procedure <заголовок процедуры>.25 <тело процедуры>.24
24 <тело процедуры> ::= <оператор>.35
25 <заголовок процедуры> ::= <идентификатор процедуры>.100 <совокупность формальных параметров>.30 ; <список значений>.28 <совокупность спецификаций>.26
26 <совокупность спецификаций> ::= <пусто>.45 | <спецификация>.27 <список идентификаторов>.29 ; | <совокупность спецификаций>.26 <спецификация>.27 <список идентификаторов>.29 ;
27 <спецификация> ::= string | <тип>.11 | <описатель массива>.14 | label | switch | procedure | <тип>.11 procedure
28 <список значений> ::= value <список идентификаторов> 29 ; | <пусто>.45
29 <список идентификаторов> ::= <идентификатор>.99 | <список идентификаторов>.29 , <идентификатор>.99
30 <совокупность формальных параметров> ::= <пусто>.45 | ( <список формальных параметров>.31 )
|
|
31 <список формальных параметров> ::= <формальный параметр>.34 | <список формальных параметров>.31 <ограничитель параметра>.32 <формальный параметр>.34
32 <ограничитель параметра> ::= , | ) <строка букв>.33 : (
33 <строка букв> ::= <буква>.102 | <строка букв>.33 <буква>.102
34 <формальный параметр> ::= <идентификатор>.99
35 <оператор> ::= <безусловный оператор>.36 | <условный оператор>.50 | <оператор цикла>.53
36 <безусловный оператор> ::= <основной оператор>.37 | <составной оператор>.3 | <блок>.2
37 <основной оператор> ::= <непомеченный основной оператор>.38 | <метка>.79 : <основной оператор>.37
38 <непомеченный основной оператор> ::= <оператор присваивания>.39 | <оператор перехода>.43 | <пустой оператор>.44 | <оператор процедуры>.46
39 <оператор присваивания> ::= <список левой части>.40 <арифметическое выражение>.58 | <список левой части>.40 <логическое выражение>.65
|
|
40 <список левой части> ::= <левая часть>.41 | <список левой части>.40 <левая часть>.41
41 <левая часть> ::= <получатель>.42 :=
42 <получатель> ::= <переменная>.81 | <идентификатор процедуры>.100
43 <оператор перехода> ::= go to <именующее выражение>.75
44 <пустой оператор> ::= <пусто>.45
45 <пусто> ::=
46 <оператор процедуры> ::= <идентификатор процедуры>.100 <совокупность фактических параметров>.47
47 <совокупность фактических параметров> ::= <пусто>.45 | (<список фактических параметров>.48 )
48 <список фактических параметров> ::= < фактический параметр>.49 | <список фактических параметров>.48 <ограничитель параметра> 32 < фактический параметр>.49
49 <фактический параметр> ::= <строка>.88 | <выражение>.57 | <идентификатор массива>.83 | <идентификатор переключателя>.78 | <идентификатор процедуры>.100
50 <условный оператор> ::= <оператор “если”>.51 | <оператор “если”>.51 else <оператор>.35 | <условие>.52 <оператор цикла>.53 | <метка>.79 : <условный оператор>.50
51 <оператор “если”> ::= <условие>.52 <безусловный оператор>.36
52 <условие> ::= if <логическое выражение>.65 then
53 <оператор цикла> ::= <заголовок цикла>.54 <оператор>.35 | <метка>.79 : <оператор цикла>.53
54 <заголовок цикла> ::= for <идентификатор переменной>.87 := <список цикла>.55 do
55 <список цикла> ::= <элемент списка цикла>.56 | <список цикла>.55 , <элемент списка цикла>.56
56 <элемент списка цикла> ::= <арифметическое выражение>.58 | <арифметическое выражение>.58 step <арифметическое выражение>.58 until <арифметическое выражение> 58 | <арифметическое выражение>.58 while <логическое выражение>.65
57 <выражение> ::= <арифметическое выражение>.58 | <логическое выражение>.65 | <именующее выражение>.75
58 <арифметическое выражение>::=<простое арифметическое выражение>.59 | <условие>.52 <простое арифметическое выражение>.59 else <арифметическое выражение>.58
59 <простое арифметическое выражение> ::= <терм>.60 | <знак операции типа сложения>.64 <терм>.60 | <простое арифметическое выражение>.59 <знак операции типа сложения>.64 <терм>.60
60 <терм> ::= <множитель>.61 | <терм>.60 <знак операции типа умножения>.63 <множитель>.61
61 <множитель> ::= <первичное выражение>.62 | <множитель>.61 <первичное выражение>.62
62 <первичное выражение> ::= <число без знака>.93 | <переменная>.81 | <указатель функции>.80 | ( <арифметическое выражение>.58 )
63 <знак операции типа умножения> ::= ´ | / | ¸
64 <знак операции типа сложения> ::= + | –
65 <логическое выражение> ::= <простое логическое выражение>.66 | <условие>.52 <простое логическое выражение>.66 else <логическое выражение>.65
66 <простое логическое выражение> ::= <импликация>.67 | <простое логическое выражение>.66 º <импликация>.67
67 <импликация> ::= <логический терм>.68 | <импликация>.67 É <логический терм>.68
68 <логический терм> ::= <логический одночлен>.69 | <логический терм>.67 Ú <логический одночлен>.69
69 <логический одночлен> ::= <вторичное логическое выражение>.70 | <логический одночлен>.69 Ù <вторичное логическое выражение>.70
70 <вторичное логическое выражение> ::= <первичное логическое выражение>.71 | Ø <первичное логическое выражение>.71
71 <первичное логическое выражение> ::= <логическое значение>.74 | <переменная>.81 | <указатель функции>.80 | <отношение>.72 | ( <логическое выражение>.65 )
72 <отношение> ::= <простое арифметическое выражение>.59 <знак операции отношения>.73 <простое арифметическое выражение>.59
73 <знак операции отношения> ::= < | £ | = | ³ | > | ¹
74 <логическое значение> ::= true | false
75 <именующее выражение> ::= <простое именующее выражение>.76 | <условие>.52 <простое именующее выражение>.76 else <именующее выражение>.75
76 <простое именующее выражение> ::= <метка>.79 | <указатель переключателя>.77 | (<именующее выражение>.75 )
77 <указатель переключателя> ::= <идентификатор переключателя> 78 [ <индексное выражение>.85 ]
78 < идентификатор переключателя> ::= <идентификатор>.99
79 <метка> ::= <идентификатор>.99
80 <указатель функции> ::= <идентификатор процедуры>.100 <совокупность фактических параметров>.47
81 <переменная> ::= <простая переменная>.86 | <переменная с индексами>.82
82 <переменная с индексами> ::= <идентификатор массива>.83 [<список индексов>.84 ]
83 <идентификатор массива > ::= <идентификатор>.99
84 <список индексов> ::= <индексное выражение>.85 | <список индексов>.84 , <индексное выражение>.85
85 <индексное выражение> ::= <арифметическое выражение> 58
86 <простая переменная> ::= <идентификатор переменной>.87
87 <идентификатор переменной> ::= <идентификатор>.99
88 <строка> ::= <замкнутая строка>.89 | <замкнутая строка>.89 <строка>.88
89 <замкнутая строка> ::= ‘ <открытая строка>.90 ’
90 <открытая строка> ::= <чистая строка>.91 | <чистая строка>.91 <замкнутая строка>.89 <открытая строка>.90
91 <чистая строка> ::= <пусто>.45 | <любая последовательность литер, не содержащая ‘ или ’>
92 <число> ::= <число без знака>.93 | + <число без знака>.93 | – <число без знака>.93
93 <число без знака> ::= <десятичное число>.94 | <порядок>.96 | <десятичное число>.94 <порядок>.96
94 <десятичное число> ::= <целое без знака>.98 | <правильная дробь>.95 | <целое без знака>.98 <правильная дробь>.95
95 <правильная дробь> ::= . <целое без знака>.98
96 <порядок> ::= 10 <целое>.97
97 <целое> ::= <целое без знака>.98 | + <целое без знака>.98 | – <целое без знака> .98
98 <целое без знака> ::= <цифра>.101 | <целое без знака>.98 <цифра>.101
99 <идентификатор> ::= <буква>.102 | <идентификатор>.99 <буква>.102 | <идентификатор>.99 <цифра>.101
100 <идентификатор процедуры> ::= <идентификатор>.99
101 <цифра> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
102 <буква> ::= 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
_______________
Приложение 2
Описание синтаксиса языка МОДУЛА-2 в виде РБНФ
Источник: Н. Вирт. Программирование на языке МОДУЛА–2.
М.: Мир, 1987. 224 с.
1 ЕдиницаКомпиляции = ПрограмныйМодуль_2 | МодульОпределений_3 .
2 ПрограмныйМодуль = [ IMPLEMENTATION ] MODULE Идентификатор_69 [ Приоритет_4 ] ";" { Импорт_6 } Блок_8 Идентификатор_69 "." .
3 МодульОпределений = DEFINITION MODULE Идентификатор_69 ";" { Импорт_6 } { Определение_9 } END Идентификатор_69 "." .
4 Приоритет = "[" КонстВыражение_5 "]" .
5 КонстВыражение = Выражение_52 .
6 Импорт = [ FROM Идентификатор_69 ] IMPORT СписИдент_7 ";" .
7 СписИдент = Идентификатор_69 { "," Идентификатор_69 } .
8 Блок = { Описание_10 } [ BEGIN ПослОператоров_36 ] END .
9 Определение = CONST { ОписаниеКонстанты_11 ";" }
| TYPE { Идентификатор_69 [ "=" Тип_13 ] ";" }
| VAR { ОписаниеПеременной_28 ";" } | ЗаголовокПроцедуры_30 ";" .
10 Описание = CONST { ОписаниеКонстанты_11 ";" }
| TYPE { ОписаниеТипа_12 ";" }
| VAR { ОписаниеПеременной_28 ";" }
| ОписаниеПроцедуры_29 ";"
| ОписаниеМодуля_34 ";" .
11 ОписаниеКонстанты = Идентификатор_69 "=" КонстВыражение_5 .
12 ОписаниеТипа = Идентификатор_69 "=" Тип_13 .
13 Тип = ПростойТип_14 | ТипМассив_17 | ТипЗапись_18 | ТипМножество_24 | ТипУказатель_25 | ТипПроцедура_26 .
14 ПростойТип = КвалИдент_50 | Перечисление_15 | ТипДиапазон_16 .
15 Перечисление = "(" СписИдент_7 ")" .
16 ТипДиапазон = [ Идентификатор_69 ] "[" КонстВыражение_5 ".."
КонстВыражение_5 "]" .
17 ТипМассив = ARRAY ПростойТип_14 { "," ПростойТип_14 } OF Тип_13 .
18 ТипЗапись = RECORD ПослСписКомпонент_19 END .
19 ПослСписКомпонент = СписокКомпонент_20 { ";" СписокКомпонент_20 } .
20 СписокКомпонент = [СписИдент_7 ":" Тип_13
| CASE [ Идентификатор_69 ":" ] КвалИдент_50 OF Вариант_21
{ "|" Вариант_21 } [ ELSE ПослСписКомпонент_19 ] END ] .
21 Вариант = [ СписокМетокВарианта_22 ":" ПослСписКомпонент_19 ] .
22 СписокМетокВарианта = МеткиВарианта_23 { "," МеткиВарианта_23 } .
23 МеткиВарианта = КонстВыражение_5 [ ".." КонстВыражение_5 ] .
24 ТипМножество = SET OF ПростойТип_14 .
25 ТипУказатель = POINTER TO Тип_13 .
26 ТипПроцедура = PROCEDURE [ СписокФормТипов_27 ] .
27 СписокФормТипов = "(" [ [VAR]ФормТип_33 { "," [VAR]ФормТип_33} ] ")" [ ":" КвалИдент_50 ] .
28 ОписаниеПеременной = СписИдент_7 ":" Тип_13 .
29 ОписаниеПроцедуры = ЗаголовокПроцедуры_30 ";" Блок_8 Идентификатор_69 .
30 ЗаголовокПроцедуры = PROCEDURE Идентификатор_69 [ ФормальныеПараметры_31 ] .
31 ФормальныеПараметры = "(" [ФПСекция_32 {";" ФПСекция_32 } ] ")" [ ":" КвалИдент_50 ] .
32 ФПСекция = [VAR] СписИдент_7 ":" ФормТип_33 .
33 ФормТип = [ ARRAY OF ] КвалИдент_50 .
34 ОписаниеМодуля = MODULE Идентификатор_69 [ Приоритет_4 ] ";"
{ Импорт_6 } [ Экспорт_35 ] Блок_8 Идентификатор_69 .
35 Экспорт = EXPORT [ QUALIFIED ] СписИдент_7 ";" .
36 ПослОператоров = Оператор_37 { ";" Оператор_37 } .
37 Оператор = [ Присваивание_38 | ВызовПроцедуры_39 | УсловнОператор_42 | ОператорВыбора_43 | ЦиклПока_45 | ЦиклСШагом_47 | ЦиклДо_46 | БезусловнЦикл_48 | ОператорПрисоединения_49 | EXIT | RETURN [ Выражение_52 ] ] .
38 Присваивание = Обозначение_40 ":=" Выражение_52 .
39 ВызовПроцедуры = Обозначение_40 [ ФактическиеПараметры_41 ] .
40 Обозначение = КвалИдент_50 { "." Идентификатор_69 | "^" | "[" СписВыражений_51 "]" } .
41 ФактическиеПараметры = "(" [ СписВыражений_51 ] ")" .
42 УсловнОператор = IF Выражение_52 THEN ПослОператоров_36 { ELSIF Выражение_52 THEN ПослОператоров_36 } [ ELSE ПослОператоров_36 ] END .
43 ОператорВыбора = CASE Выражение_52 OF Альтернатива_44 { "|" Альтернатива_44 } [ ELSE ПослОператоров_36 ] END .
44 Альтернатива = [ СписокМетокВарианта_22 ":" ПослОператоров_36 ] .
45 ЦиклПока = WHILE Выражение_52 DO ПослОператоров_36 END .
46 ЦиклДо = REPEAT ПослОператоров_36 UNTIL Выражение_52 .
47 ЦиклСШагом = FOR Идентификатор_69 ":=" Выражение_52 TO Выражение_52 [BY КонстВыражение_5 ] DO ПослОператоров_36 END .
48 БезусловнЦикл = LOOP ПослОператоров_36 END .
49 ОператорПрисоединения = WITH Обозначение_40 DO ПослОператоров_36 END .
50 КвалИдент = Идентификатор_69 { "." Идентификатор_69 } .
51 СписВыражений = Выражение_52 { "," Выражение_52 } .
52 Выражение = ПростоеВыражение_54 [ Отношение_53 ПростоеВыражение_54 ] .
53 Отношение = "=" | "#" | "<" | ">" | "<=" | ">=" | IN .
54 ПростоеВыражение = [ "+" | "–" ] Слагаемое_56 { ОперацияТипаСложения_55 Слагаемое_56 } .
55 ОперацияТипаСлоожения = "+" | "–" | OR .
56 Слагаемое = Множитель_58 { ОперацияТипаУмножения_57 Множитель_58} .
57 ОперацияТипаУмножения = "*" | "/" | DIV | MOD | AND .
58 Множитель = Число_61 | Цепочка_68 | Множество_59 | NOT Множитель_58 | Обозначение_40 [ ФактическиеПараметры_41 ] | "(" Выражение_52 ")" .
59 Множество = [ КвалИдент_50 ] "{" [ Элемент_60 {"," Элемент_60 } ] "}" .
60 Элемент = Выражение_52 [ ".." Выражение_52 ] .
61 Число = Целое_62 | Действительное_63 .
62 Целое = Цифра_66 { Цифра_66 } | ВосьмеричнаяЦифра_67 { ВосьмеричнаяЦифра_67 } "C" | Цифра_66 { Шестнадцатеричная_Цифра_65 } "H" .
63 Действительное = Цифра_66 { Цифра_66 } "." { Цифра_66 } [ Порядок_64 ] .
64 Порядок = "E" [ "+" | "–" ] Цифра_66 { Цифра_66 } .
65 ШестнадцатеричнаяЦифра = Цифра_66 | "A" | "B" | "C" | "D" | "E" | "F" .
66 Цифра = ВосьмеричнаяЦифра_67 | "8" | "9" .
67 ВосьмеричнаяЦифра = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" .
68 Цепочка = "' " { литера } " ' " | ' " ' { литера } ' " ' .
69 Идентификатор = Буква_70 { Буква_70 | Цифра_66 } .
70 Буква = "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" | "v" | "w" | "x" | "y" | "z" .
71 литера = любой представимый на дисплее символ .
____________________
Приложение 3
Дата добавления: 2018-04-05; просмотров: 311; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!