Описание синтаксиса языка ПАСКАЛЬ в виде СД
Источник : Н. Вирт. Алгоритма + Структуры данных = Программы.
М.: Мир, 1985. с.406.
Приложение 4
Описание синтаксиса языка ADA в виде РБНФ
Источник: Н. Джехани. Язык АДА. М.: Мир, 1988. 552 с.
( Упрощенный вариант )
1 компилируемый_ модуль::= { спецификация_использования_3 } библиотечный_модуль_2
2 библиотечный_модуль ::= тело_пакета_5 | тело_подпрограммы_21
3 спецификация_использования ::= USE имя_пакета_4 {"," имя_пакета_4 }
4 имя_пакета ::= простое_имя_148
5 тело_пакета ::= PACKAGE BODY простое_имя_пакета_6 IS { раздел_описаний_7 } [ BEGIN последовательность_операторов_89 [ EXCEPTION обработчик_исключений_139 { обработчик_исключений_139 } ] ] END [ простое_имя_пакета_6 ]
|
|
6 простое_имя_пакета ::= простое_имя_148
7 раздел_описаний ::= { основной_элемент_описания_8 } { дополнительный_элемент_описания_10 }
8 основной_элемент_описания ::= основное_описание_9 | спецификация_представления_77 | спецификация_использования_3
9 основное_описание ::= описание_числа_27 | описание_суб-константы_156 | описание_объекта_25 | описание_типа_29 | описание_подтипа_34 | | описание_переименования_72 | описание_исключения_138
10 дополнительный_элемент_описания ::= тело_подпрограммы_21 | тело_пакета_5 | тело_задачи_24 | описание_подпрограммы_15 | описание_пакета_13 | описание_задачи_22 | след_тела_11
11 след_тела ::= спецификация_подпрограммы_16 IS SEPARATE ";" | PACKAGE BODY простое_имя_пакета_6 IS SEPARATE ";" | TASK BODY простое_имя_задачи_12 IS SEPARATE ";"
12 простое_имя_задачи ::= простое_имя_148
13 описание_пакета ::= спецификация_пакета_14 ";"
14 спецификация_пакета ::= PACKAGE идентификатор_179 IS { основной_элемент_описания_8 } [ PRIVATE { основной_элемент_описания_8 } ] END [ простое_имя_пакета_6 ]
|
|
15 описание_подпрограммы ::= спецификация_подпрограммы_16 ";"
16 спецификация_подпрограммы ::= PROCEDURE идентификатор_179 [раздел_формальных_параметров_18] | FUNCTION обозначение_17 [ раздел_формальных_параметров_18 ] RETURN обозначение_типа_36
17 обозначение ::= идентификатор_179
18 раздел_формальных_параметров ::= "(" спецификация_параметра_19 { ";" спецификация_параметра_19 } ")"
19 спецификация_параметра ::= список_идентификаторов_26 ":" вид_20 обозначение_типа_36 [ ":=" выражение_141 ]
20 вид ::= [ IN ] | IN OUT | OUT
21 тело_подпрограммы ::= спецификация_подпрограммы_16 IS [ раздел_описаний_7 ] BEGIN последовательность_операторов_89 [ EXCEPTION обработчик_исключений_139 { обработчик_исключений_139 } ] END [ обозначение_17 ] ";"
|
|
22 описание_задачи ::= спецификация_задачи_23 ";"
23 спецификация_задачи ::= TASK [ TYPE ] идентификатор_179 [ IS { описание_входа_88 } { спецификация_представления_77 } END [ простое_имя_задачи_12 ] ]
|
|
24 тело_задачи ::= TASK BODY простое_имя_задачи_12 IS [ раздел_описаний_7 ] BEGIN последовательность_операторов_89 [ EXCEPTION обработчик_исключений_139 { обработчик_исключений_139 } ] ] END [ простое_имя_задачи_12 ]
25 описание_объекта ::= список_идентификаторов_26 ":"[ CONSTANT ] указание_подтипа_35 [ ":=" выражение_141 ] | список_идентификаторов_26 ":"[ CONSTANT ] определение_ограниченного_типа_массива_55 [ ":=" выражение_141 ]
26 список_идентификаторов ::= идентификатор_179 {"," идентификатор_179 }
27 описание_числа ::= список_идентификаторов_26 ":" CONSTANT ":=" универсальное_статическое_выражение_28
28 универсальное_статическое_выражение ::= выражение_141
29 описание_типа ::= полное_описание_типа_30 | неполное_описание_типа_31 | описание_личного_типа_32
30 полное_описание_типа ::= TYPE идентификатор_179 [ раздел_дискриминантов_63 ] IS определение_типа_33
31 неполное_описание_типа::= TYPE идентификатор_179 [ раздел_дискриминантов_63 ]
32 описание_личного_типа ::= TYPE идентификатор_179 [ раздел_дискриминантов_63 ] IS [ LIMITED ] PRIVATE
33 определение_типа ::= определение_перечислимого_типа_43 | определение_целого_типа_46 | определение_вещественного_типа_47 | определение_типа_массива_52 | определение_типа_записи_59 | определение_ссылочного_типа_71 | определение_производного_типа_40
34 описание_подтипа ::= SUBTYPE идентификатор_179 IS указание_подтипа_35
35 указание_подтипа ::= обозначение_типа_36 [ ограничение_39 ]
36 обозначение_типа ::= имя_типа_37 | имя_подтипа_38
37 имя_типа ::= идентификатор_179
38 имя_подтипа ::= идентификатор_179
39 ограничение ::= ограничение_диапазона_41 | ограничение_плавающего_типа_48 | ограничение_фиксированного_типа_50 | ограничение_индекса_57 | ограничение_дискриминанта_65
40 определение_производного_типа ::= NEW указание_подтипа_35
41 ограничение_диапазона ::= RANGE диапазон_42
42 диапазон ::= простое_выражение_143 ".." простое_выражение_143
43 определение_перечислимого_типа ::= ( спецификация_литерала_перечисления_44 { "," спецификация_литерала_перечисления_44 } )
44 спецификация_литерала_перечисления ::= литерал_перечисления_45
45 литерал_перечисления ::= идентификатор_179 | символьный_литерал_184
46 определение_целого_типа ::= ограничение_диапазона_41
47 определение_вещественного_типа ::= ограничение_плавающего_типа_48 | ограничение_фиксированного_типа_50
48 ограничение_плавающего_типа ::= определение_точности_плавающего_типа_49 [ ограничение_диапазона_41 ]
49 определение_точности_плавающего_типа ::= DIGITS статическое_простое_выражение_168
50 ограничение_фиксированного_типа ::= определение_точности_фиксиров_типа_51 [ограничение_диапазона_41]
51 определение_точности_фиксиров_типа ::= DELTA статическое_простое_выражение_168
52 определение_типа_массива ::= определение_неограниченного_типа_массива_53 | определение_ограниченного_типа_массива_55
53 определение_неограниченного_типа_массива ::= ARRAY "(" определение_подтипа_индекса_56 { "," определение_подтипа_индекса_56 } ")" OF указание_подтипа_компоненты_54
54 указание_подтипа_компоненты ::= указание_подтипа_35
55 определение_ограниченного_типа_массива ::= ARRAY ограничение_индекса_57 OF указание_подтипа_компоненты_54
56 определение_подтипа_индекса ::= обозначение_типа_36 RANGE "< >"
57 ограничение_индекса ::= "(" дискретный_диапазон_58 { , дискретный_диапазон_58 } ")"
58 дискретный_диапазон ::= указание_подтипа_35 | диапазон_42
59 определение_типа_записи ::= RECORD список_компонент_60 END RECORD
60 список_компонент ::= описание_компоненты_61 { описание_компоненты_61 } | { описание_компоненты_61 } раздел_вариантов_67 | NULL
61 описание_компоненты ::= список_идентификаторов_26 ":" определение_подтипа_компоненты_62 [ ":=" выражение_141 ]
62 определение_подтипа_компоненты ::= указание_подтипа_35
63 раздел_дискриминантов ::= "(" спецификация_дискриминанта_64 { ";" спецификация_дискриминанта_64} ")"
64 спецификация_дискриминанта := список_идентификаторов_26 ":" обозначение_типа_36 [ ":=" выражение_141 ]
65 ограничение_дискриминанта ::= "(" сопоставление_дискриминанта_66 { "," сопоставление_дискриминанта_66 } ")"
66 сопоставление_дискриминанта ::= [ простое_имя_дискриминанта_76 { "|" простое_имя_дискриминанта_76 } "=>" ] выражение_141
67 раздел_вариантов ::= CASE простое_имя_дискриминанта_76 IS вариант_68 { вариант_68 } END CASE ";"
68 вариант ::= WHEN выбор_69 { "|" выбор_69 } "=>" список_компонент_60
69 выбор ::= простое_выражение_143 | дискретный_диапазон_58 | OTHERS | простое_имя_компоненты_70
70 простое_имя_компоненты ::= простое_имя_148
71 определение_ссылочного_типа ::= ACCESS указание_подтипа_35
72 описание_переименования ::= идентификатор_179 ":" обозначение_типа_36 RENAMES имя_объекта";" | идентификатор_179 ":" EXCEPTION RENAMES имя_исключения_74";" | PACKAGE идентификатор_179 RENAMES имя_пакета_4";"
| спецификация_подпрограммы_16 RENAMES имя_подпрограммы_или_входа_73 ";"
73 имя_подпрограммы_или_входа ::= простое_имя_148
74 имя_исключения ::= простое_имя_148
75 имя_объекта ::= простое_имя_148
76 простое_имя_дискриминанта ::= простое_имя_148
77 спецификация_представления ::=
спецификация_представления_типа_78 | спецификация_адреса_87
78 спецификация_представления_типа ::= спецификация_длины_79 | спецификация_представления_перечисления_80 | спецификация_представления_записи_82
79 спецификация_длины ::= FOR атрибут_154 USE простое_выражение_143
80 спецификация_представления_перечисления ::= FOR простое_имя_типа_81 USE агрегат_157
81 простое_имя_типа ::= простое_имя_148
82 спецификация_представления_записи ::= FOR простое_имя_типа_81 USE RECORD [ спецификация_выравнивания_83 ] { спецификация_компоненты_84 } END RECORD
83 спецификация_выравнивания ::= AT MOD статическое_простое_выражение_168
84 спецификация_компоненты ::= имя_компоненты_85 AT статическое_простое_выражение_168 RANGE статический_диапазон_86
85 имя_компоненты ::= простое_имя_148
86 статический_диапазон ::= диапазон_42
87 спецификация_адреса ::= FOR простое_имя_148 USE AT простое_выражение_143
88 описание_входа ::= ENTRY идентификатор_179 ["(" дискретный_диапазон_58 ")"] [ раздел_формальных_параметров_18 ]
89 последовательность_операторов ::= оператор_90 { оператор_90 }
90 оператор ::= {метка_93 } простой_оператор_91 | { метка_93 } составной_оператор_92
91 простой_оператор ::= пустой_оператор_95 | оператор_присваивания_96 | оператор_вызова_процедуры_114 | оператор_перехода_112 | оператор_выхода_109 | оператор_возврата_111 | оператор_задержки_126 | оператор_вызова_входа_121 | оператор_прекращения_136 | оператор_возбуждения_100
92 составной_оператор ::= условный_оператор_98 | оператор_выбора_101 | оператор_цикла_102 | оператор_блока_107 | оператор_принятия_123 | оператор_отбора_127
93 метка ::= "<<" простое_имя_метки_94 ">>"
94 простое_имя_метки ::= простое_имя_148
95 пустой_оператор ::= NULL
96 оператор_присваивания ::= имя_переменной_97 := выражение_141 ;
97 имя_переменной ::= имя_147
98 условный_оператор ::= IF условие_99 THEN последовательность_операторов_89 {ELSIF условие_99 THEN последовательность_операторов_89 } [ ELSE последовательность_операторов_89 ] END IF ";"
99 условие ::= выражение_141
100 оператор_возбуждения ::= RAISE [ имя_исключения_74 ] ";"
101 оператор_выбора ::= CASE выражение_141 IS альтернатива_оператора_выбора _102 { альтернатива_оператора_выбора_102 } END CASE ";"
102 альтернатива_оператора_выбора ::= WHEN выбор_69 { "|" выбор_69 } "=>" последовательность_операторов_89
103 оператор_цикла ::= [ простое_имя_цикла_104 ":" ] [ схема_итерации_105 ] LOOP последовательность_операторов_89 END LOOP [ простое_имя_цикла_104 ] ";"
104 простое_имя_цикла ::= простое_имя_148
105 схема_итерации ::= WHILE условие_99 | FOR спецификация_параметра_цикла_106
106 спецификация_параметра_цикла ::= идентификатор_179 IN [ REVERSE] дискретный_диапазон_58
107 оператор_блока ::= [ простое_имя_блока_108 ":" ] [ DECLARE раздел_описаний_7 ] BEGIN последовательность_операторов_89 [ EXCEPTION обработчик_исключений_139 { обработчик_исключений_139 } ] END [ простое_имя_блока_108 ] ";"
108 простое_имя_блока ::= простое_имя_148
109 оператор_выхода ::= EXIT [ имя_цикла_110 ] [ WHEN условие_99 ] ";"
110 имя_цикла ::= простое_имя_148
111 оператор_возврата ::= RETURN [ выражение_141 ] ";"
112 оператор_перехода ::= GOTO имя_метки_113 ";"
113 имя_метки ::= простое_имя_148
114 оператор_вызова_процедуры ::= имя_процедуры_115 [ раздел_фактических_параметров_116 ] ";"
115 имя_процедуры ::= простое_имя_148
116 раздел_фактических_параметров ::= "("сопоставление_параметров_117 { "," сопоставление_параметров_117 } ")"
117 сопоставление_параметров ::= [ формальный_параметр_118 "=>" ] фактический_параметр_120
118 формальный_параметр ::= простое_имя_параметра_119
119 простое_имя_параметра ::= простое_имя_148
120 фактический_параметр ::= выражение_141 | имя_переменной _97 | обозначение_типа_36 "(" имя_переменной_97 ")"
121 оператор_вызова_входа ::= имя_входа_122 [ раздел_фактических_параметров_116 ] ";"
122 имя_входа ::= простое_имя_148
123 оператор_принятия ::= ACCEPT простое_имя_148 [ "(" индекс_входа_125 ")" ] [ раздел_формальных_параметров_18 ] [ DO последовательность_операторов_89 END [ простое_имя_входа_124 ] ] ";"
124 простое_имя_входа ::= простое_имя_148
125 индекс_входа ::= выражение_141
126 оператор_задержки ::= DELAY простое_выражение_143 ";"
127 оператор_отбора ::= отбор_с_ожиданием_128 | условный вызов_входа_134 | временной_вызов_входа_135
128 отбор_с_ожиданием ::= SELECT альтернатива_отбора_129 { OR альтернатива_отбора_129 } [ ELSE последовательность_операторов_89 ] END SELECT ";"
129 альтернатива_отбора ::= [ WHEN условие_99 "=>" ] альтернатива_отбора_с_ожиданием_130
130 альтернатива_отбора_с_ожиданием ::= альтернатива_принятия_131 | альтернатива_задержки_132 | альтернатива_завершения_133
131 альтернатива_принятия ::= оператор_принятия_123 [ последовательность_операторов_89 ]
132 альтернатива_задержки ::= оператор_задержки_126 [ последовательность_операторов_89 ]
133 альтернатива_завершения ::= TERMINATE ";"
134 условный_вызов_входа ::= SELECT оператор_вызова_входа_121 [ последовательность_операторов_89 ] ELSE последовательность_операторов_89 END SELECT ";"
135 временной_вызов_входа ::= SELECT оператор_вызова_входа_121 [ последовательность_операторов_89 ] OR альтернатива_задержки_132 END SELECT ";"
136 оператор_прекращения ::=ABORT имя_задачи_137 {"," имя_задачи_137 }";"
137 имя_задачи ::= простое_имя_148
138 описание_исключения ::= список_идентификаторов_26 ":"EXCEPTION";"
139 обработчик_исключений ::= WHEN выбор_исключения_140 { "|" выбор_исключения_140 } "=>" последовательность_операторов_89
140 выбор_исключения ::= имя_исключения_74 | OTHERS
141 выражение ::= отношение_142 { AND отношение_142 } | отношение_142 { AND THEN отношение_142 } | отношение_142 { OR отношение_142 } | отношение_142 { OR ELSE отношение_142 } | отношение_142 { XOR отношение_142 }
142 отношение ::= простое_выражение_143 [ операция_отношения_161 простое_выражение_143 ] | простое_выражение_143 [ NOT ] IN диапазон_42 | простое_выражение_143 [ NOT ] IN обозначение_типа_36
143 простое_выражение ::= [ унарная_аддитивная_операция_163] слагаемое_144 { бинарная_аддитивная_операция_162 слагаемое_144 }
144 слагаемое ::= множитель_145 {мультипликативная_операция_164 множитель_145 }
145 множитель ::= первичное_146 [ "**" первичное_146 ] | ABS первичное_146 | NOT первичное_146
146 первичное ::= числовой_литерал_169 | NULL | агрегат_157 | строковый_литерал_185 | имя_147 | генератор_166 | вызов_функции_159 | преобразование_типа_165 | квалифицированное_выражение_167 | " (" выражение_141 ")"
147 имя ::= простое_имя_148 | индексированная_компонента_149 | отрезок_150 | именуемая_компонента _151 | символьный_литерал_184 | атрибут_154
148 простое_имя ::= идентификатор_179
149 индексированная_компонента ::= префикс_152 "(" выражение_141 {"," выражение_141 } ")"
150 отрезок ::= префикс_152 "(" дискретный_диапазон_58 ")"
151 именуемая_компонента ::= префикс_152 "." постфикс_153
152 префикс ::= имя_147 | вызов_функции_159
153 постфикс ::= простое_имя_148 | символьный_литерал_184 | ALL
154 атрибут ::= префикс_152 "‘" обозначение_атрибута_155
155 обозначение_атрибута ::= простое_имя_148 [ универсальное_статическое_выражение_28 ]
156 описание_суб-константы ::= список_идентификаторов_26 ":" CONSTANT обозначение_типа_36
157 агрегат ::= "("сопоставление_компонент_158 {"," сопоставление_компонент_158 }")"
158 сопоставление_компонент ::= [ выбор_69 { “|” выбор_69 } "=>" ] выражение_141
159 вызов_функции ::= имя_функции_160 [ раздел_фактических_параметров_116 ]
160 имя_функции ::= простое_имя_148
161 операция_отношения ::= "=" | "/=" | "<" | "<=" | ">" | ">="
162 бинарная_аддитивная_операция ::= "+" | "–" | "&"
163 унарная_аддитивная_операция ::= "+" | "–"
164 мультипликативная_операция ::= "*" | "/" | MOD | REM
165 преобразование_типа ::= обозначение_типа_36 "(" выражение_141 ")"
166 генератор = NEW указание_подтипа_35 | NEW квалифицированное_выражение_167
167 квалифицированное_выражение = обозначение_типа_36 "‘" "(" выражение_141 ")" | обозначение_типа_36 "‘" агрегат_157
168 статическое_простое_выражение ::= выражение_141
169 числовой_литерал ::= десятичный литерал_170 | литерал_по_основанию_173
170 десятичный литерал ::= целое_171 ["." целое_171 ] порядок_172
171 целое ::= цифра_178 { [ подчеркивание_186 ] цифра_178 }
172 порядок ::= "E" [ "+" ] целое_171 | "E" "–" целое_171
173 литерал_по_основанию ::= основание_174 "#" целое_по_основанию_175 [ "." целое_по_основанию_175 ] [ "#" порядок_172 ]
174 основание ::= целое_171 // в интервале 2 - 16
175 целое_по_основанию ::= расширенная цифра_176 { [ подчеркивание_186 ] расширенная_цифра_176 }
176 расширенная цифра ::= цифра_178 | спец_буква_177
177 спец_буква = "A" | "B" | "C" | "D" | "E" | "F"
178 цифра = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" |"8" | "9"
179 идентификатор ::= буква_180 { [ подчеркивание_186 ]буква_или_цифра_180 }
180 буква_или_цифра ::= буква_180 | цифра_178
181 буква ::= прописная_буква_182 | строчная_буква_183
182 прописная_буква ::= "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"
183 строчная_буква ::= "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"
184 символьный_литерал ::= "‘" графический_символ_187 "’"
185 строковый_литерал ::= "“" { графический_символ_187 } "“"
186 подчеркивание ::= "_"
187 графический_символ ::= любой_представимый_на_дисплее_символ
___________________
Приложение 5
Грамматика простого языка программирования
Пример программы :
program PRIM ;
integer S , a[10], i ; real S1;
S = 0; i = 1;
LS: S = S + a[ i ] ;
i = i + 1; if i < 11 then goto LS ;
S1 = 0.25 * S
end .
1 | <PRG> ® program ID ; <SO> <SOP> end . |
2 | <SO> ® <O> ; <PSO> |
3 4 | <PSO> ® <O> ; <PSO> ® e |
5 | <O> ® <T> <SP> |
6 7 | <T> ® integer ® real |
8 | <SP> ® <P> <PSP> |
9 10 | <PSP> ® , <P> <PSP> ® e |
11 | <P> ® ID <PP> |
12 13 | <PP> ® [ <SIG> ] ® e |
14 | <SIG> ® CN <PSG> |
15 16 | <PSG> ® , CN <PSG> ® e |
17 | <SOP> ® <OP> <PSOP> |
18 19 | <PSOP> ® ; <OP> <PSOP> ® e |
20 21 | <OP> ® ID : <NOP> ® <NOP> |
22 23 24 | <NOP> ® if <US> then <NOP> <ELE> ® <PE> = <W> ® goto ID |
24 25 | <ELE> ® else <NOP> ® e |
26 | <US> ® <W> <ZS> <W> |
27 28 29 | <ZS> ® > ® < ® = |
30 31 | <W> ® <S> ® <W> + <S> |
32 33 | <S> ® <M> ® <S> * <M> |
34 35 36 | <M> ® <PE> ® CN ® ( <W> ) |
37 | <PE> ® ID <PPE> |
38 39 | <PPE> ® [ <SIW> ] ® e |
40 | <SIW> ® <W> <PSW> |
41 42 | <PSW> ® , <W> <PSW> ® e |
Обозначения в грамматике:
<SO> – список описаний
<O> – описание
<T> – тип
<SP> – список переменных
<P> – описываемая переменная
<SIG> – список индексных границ
<SOP> – список операторов
<OP> – оператор общего вида
<NOP> – непомеченный оператор
<ELE> – else-ветвь или пусто ( e ),
<US> – условие
<ZS> – знак сравнения
<W> – выражение
<S> – слагаемое
<M> – множитель
<PE> – переменная (простая или с индексами)
<SIW> – список индексных выражений
*) если необходимо определить продолжение некоторого элемента, то добавляется буква “P”, например, <SO> – <PSO> и т.п.
Приложение 6
Дата добавления: 2018-04-05; просмотров: 320; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!