МАТЕРИАЛЫ К ПРАКТИЧЕСКИМ ЗАДАНИЯМ



Приложение 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!