Project

General

Profile

Транслятор с языка Sim-nML » History » Version 5

Alexander Kamkin, 09/30/2011 02:18 PM

1 1 Alexander Kamkin
h1. Транслятор с языка Sim-nML
2
3
Данный документ содержит описание схемы трансляции спецификаций микропроцессоров на языке Sim-nML в набор Java классов, которые могут быть использованы инструментом MicroTESK для автоматизированной генерации тестовых программ.
4
5
h2. Язык Sim-nML
6
7
Язык Sim-nML является расширением языка nML.
8
9
h2. Java классы, создаваемые при трансляции
10
11
Список Java классов, которые создаются при трансляции:
12 2 Alexander Kamkin
13 3 Alexander Kamkin
# Класс @ProcessorName@, который наследуется от класса @Processor@. Содержит большую часть информации о специфицируемом процессоре.
14 2 Alexander Kamkin
15
>> *TODO:* уточнить, каким образом формируется имя этого класса. Возможен вариант получаеть это имя из имени файла со спецификацией на Sim-nML, или же можно требовать задавания этого имени от пользователя в качестве одного из параметров метода, который осуществляет трансляцию, или же можно использовать какие-то специальные аннотации в самой спецификации.
16 1 Alexander Kamkin
17 3 Alexander Kamkin
h2. Правила грамматики для «общих» нетерминальных символов
18
19 4 Alexander Kamkin
h3. Бинарная операция
20
21 1 Alexander Kamkin
Правила грамматики для определения бинарных операций.
22 4 Alexander Kamkin
23
<pre>
24 5 Alexander Kamkin
BinOp : ''+''
25
      | ''-''
26
      | ''*''
27
      | ''/''
28
      | ''%''
29
      | DOUBLE_STAR
30
      | LEFT_SHIFT
31
      | RIGHT_SHIFT
32
      | ROTATE_LEFT
33
      | ROTATE_LEFT
34
      | ROTATE_RIGHT
35
      | ''<''
36
      | ''>''
37
      | LEQ
38
      | GEQ
39
      | EQ
40
      | NEQ
41
      | ''&''
42
      | ''^''
43
      | ''|''
44
      | AND
45
      | OR
46 4 Alexander Kamkin
</pre>
47
48
h3. Числовая константа
49
50 1 Alexander Kamkin
Правила грамматики для определения числовых констант.
51 4 Alexander Kamkin
52 1 Alexander Kamkin
ConstNumExpr
53
:
54
ConstExprVal
55
56
|
57
ConstNumExpr BinOp ConstExprVal
58
ConstExprVal
59
:
60
CARD_CONST
61
62
|
63
FIXED_CONST
64
65
|
66
HEX_CONST
67
68
|
69
''!'' ConstNumExpr
70
71
|
72
''~'' ConstNumExpr
73
74
|
75
''+'' ConstNumExpr %prec ''~''
76
77
|
78
''-'' ConstNumExpr %prec ''~''
79
80
|
81
''('' ConstNumExpr '')''
82
TODO: предлагается все числовые константные выражения сразу вычислять, в оттранслированный Java код вставлять уже только значения выражений.
83
Выражение
84
Правила грамматики для определения выражений
85
Bit_Expr
86
:
87
ID
88
89
|
90
Bit_Expr ''+'' Bit_Expr
91
92
|
93
Bit_Expr ''-'' Bit_Expr
94
95
|
96
Bit_Expr ''*'' Bit_Expr
97
98
|
99
Bit_Expr ''/'' Bit_Expr
100
101
|
102
Bit_Expr ''%'' Bit_Expr
103
104
|
105
Bit_Expr DOUBLE_STAR Bit_Expr
106
107
|
108
''('' Bit_Expr '')''
109
110
|
111
FIXED_CONST
112
113
|
114
CARD_CONST
115
116
|
117
STRING_CONST
118
119
|
120
BINARY_CONST
121
122
|
123
HEX_CONST
124
OR правило
125
OrRule
126
:
127
Identifier_Or_List
128
Identifier_Or_List
129
:
130
ID
131
132
|
133
Identifier_Or_List ''|'' ID
134
AND правило
135
AndRule
136
:
137
''('' ParamList '')''
138
ParamList
139
:
140
141
142
|
143
ParamListPart
144
145
|
146
ParamList '','' ParamListPart
147
ParamListPart
148
:
149
ID '':'' TypeExpr
150
151
|
152
ID '':'' ID
153
154
Атрибуты
155
В языке Sim-nML атрибуты используются для описания свойств инструкций и режимов адресации. Описание каждого такого объекта может содержать произвольное число атрибутов. Атрибуты можно разделить на два класса: предопределенные атрибуты и пользовательские атрибуты. Описание предопределенных атрибутов приведено ниже.
156
Правила грамматики для атрибутов:
157
AttrDefList
158
:
159
160
161
|
162
AttrDefList AttrDef
163
AttrDef
164
:
165
ID ''='' AttrDefPart
166
167
|
168
SYNTAX ''='' ID ''.'' SYNTAX
169
170
|
171
SYNTAX ''='' AttrExpr
172
173
|
174
IMAGE ''='' ID ''.'' IMAGE
175
176
|
177
IMAGE ''='' AttrExpr
178
179
|
180
ACTION ''='' ID ''.'' ACTION
181
182
|
183
ACTION ''='' ''{'' Sequence ''}''
184
185
|
186
USES ''='' UsesDef
187
AttrDefPart
188
:
189
Expr
190
191
|
192
''{'' Sequence ''}''
193
Атрибут syntax
194
Атрибут syntax используется для описания ассемблерного кодирования инструкции или режима адресации. Значения данного атрибута должны иметь строковый тип. Можно выделить следующие основные варианты определения атрибута syntax:
195
1)Строковая константа — значение определяется посредством строковой константы. Например, “nop”.
196
2)Атрибут параметра — значение атрибута определяется как значение этого же атрибута syntax у одного из параметров описываемого объекта. Например, x.syntax.
197
3)Форматированная строка — значение атрибута определяется с помощью специальной конструкции format. Данная конструкция является аналогом оператора printf в языке программирования С. Например, format(“%5b”, r).
198
// TODO: добавить полное формальное описание конструкции format + описание транслчции данной конструкции в строковое выражение Java
199
Трансляция:
200
При трансляции данного атрибута в классе, соответствующем описываемому объекту создается метод со следующей сигнатурой:
201
public String syntax()
202
Для случая 1 из приведенного выше списка тело метода просто возвращает данную строковую константу. Для случая 2 метод возвращает результат вызова метода syntax соответствующего аргумента данного объекта. Такой аргумент должен содержаться в качестве поля в классе, соответствующем описываемому объекту. Для случая 3 метод возвращает результат трансляции конструкции format в строковое выражение языка Java.
203
Атрибут image
204
Атрибут image используется для описания бинарного кодирования описываемого объекта. Значения данного атрибута должны иметь строковый тип, причем допустимы только строки, содержащие символы «0», «1» и пробел. Пробелы используются для улучшения читаемости. Варианты определения атрибута image совпадают с вариантами определения атрибута syntax.
205
Трансляция:
206
Полностью аналогична трансляции атрибута syntax.
207
Атрибут action
208
Атрибут action используется для описания семантики выполнения инструкций. 
209
Трансляция:
210
// TODO: при трансляции атрибута action обратить внимание на то, что в некоторых спецификациях данные между соседними в дереве инструкциями передают с использованием переменных (var). Это надо корректно учитывать, так как по умолчанию при трансляции таких объектов предлагается создавать локальные переменные соответствующих методов. С другой стороны, использование переменных для передачи данных между операциями противоречит описанию языка, в котором сказано, что состояние переменных не сохраняется при переходе от одной инструкции к другой.
211
Атрибут uses
212
В текущей версии инструмента данный атрибут не рассматриваем.
213
Основные конструкции языка
214
215
h3. Конструкция let
216
217
Конструкция let используется для объявления констант. Константы обладают следующими свойтсвами:
218
1.Константы получают глобальную область видимости.
219
2.Константа может быть определена только один раз.
220
Правила грамматики для конструкции let:
221
LetDef 
222
:
223
LET ID ''='' LetExpr
224
LetExpr
225
:
226
ConstNumExpr
227
228
|
229
STRING_CONST
230
231
|
232
IF ConstNumExpr THEN LetExpr OptionalElseLetExpr ENDIF
233
234
|
235
SWITCH ''('' ConstNumExpr '')'' ''{'' CaseLetExprList ''}''
236
OptionalElseLetExpr
237
:
238
239
240
|
241
ELSE LetExpr
242
CaseLetExprList
243
:
244
CaseLetExprList1
245
246
|
247
CaseLetExprList1 DEFAULT '':'' LetExpr
248
CaseLetExprList1
249
:
250
CaseLetExprStat
251
252
|
253
CaseLetExprList1 CaseLetExprStat
254
CaseLetExprStat
255
:
256
CASE ConstNumExpr '':'' LetExpr
257
258
Примеры:
259
let REGS = 5
260
let byte_order = “big”
261
let PC = “NIA”
262
let SP = “GPR[29]”
263
Проблемы:
264
Не ясна семантика if и switch в том случае, когда определяемая величина не получает никакого значения, например
265
let c = if 0 then 0 endif
266
Ограничения:
267
На первом этапе разработки прототипа предлагается ограничить поддержку конструкции let только простыми вариантами (без if и switch). Сложные вариаты let практически не используются на практике (ни один из примеров спецификаций представленных на сайте языка не содержал таких конструкций), их ценность представляется сомнительной.
268
Трансляция:
269
Если LetExpr является ConstNumExpr, то вычисляется значение этого выражения. Для каждой определенной в спецификации константы определяется поле к классе ProcessorName следующего вида
270
	public static final <type> ID = LetExpr;
271
где <type> может принимать следующие значения:
272
String – в случае, если LetExpr является STRING_CONST
273
int – в случае, если LetExpr является числовым выражением и вычисленное  значение есть целое.число, убирающееся в int.
274
long – в случае, если LetExpr является числовым выражением и вычисленное  значение есть целое.число, не убирающееся в int.
275
float – в случае, если  LetExpr является числовым выражением и его вычисленное значение есть число с фиксированной или плавающей точкой, убирающееся в тип float.
276
double – в случае, если  LetExpr является числовым выражением и его вычисленное значение есть число с фиксированной или плавающей точкой, не убирающееся в тип float.
277
Ошибочные ситуации:
278
наличие целых чисел, которые «не убираются» в long
279
наличие чисел с плавающей точкой, которые «не убираются» в double
280
Конструкция type
281
Конструкция type используется для определения синонимов новых типов. Синонимы определяются на основе существующих стандартных типов:
282
bool: определяет булевский тип, имеющий два предопределенных значений false и true. При применении преобразования типов (смотри coerces) false отображается в 0, true – в 1. При обратном преобразовании 0 отображается в false, любое ненулевое значение отображается в true.
283
int(n):определяет интервал целых чисел 
284
card(n): определяет интервал натуральных чисел 
285
float: определяет число с плавающей точкой согласно стандарту IEEE754 // TODO: несоответствие грамматики и описания
286
fix(n, m):определяет число с фиксированной точкой, в котором n бит отводятся под мантису и m бит под экспоненту.// TODO: уточнить, что описано в документации
287
[n..m]: определяет интервал натуральных чисел (ограничение)
288
enum(): определяет перечислимый тип, где именованные константы принимают значения от 0 до n-1.Будет совпадать с типом card(ceiling())
289
Правила грамматики для конструкции type:
290
TypeSpec
291
:
292
TYPE ID ''='' TypeExpr
293
TypeExpr
294
:
295
BOOL
296
297
|
298
INT ''('' ConstNumExpr '')''
299
300
|
301
CARD ''('' ConstNumExpr '')''
302
303
|
304
FIX ''('' ConstNumExpr '','' ConstNumExpr '')''
305
306
|
307
FLOAT ''('' ConstNumExpr '','' ConstNumExpr'')''
308
309
|
310
''['' ConstNumExpr DOUBLE_DOT ConstNumExpr '']''
311
312
|
313
ENUM ''('' IdentifierList '')''
314
IdentifierList
315
:
316
ID
317
318
|
319
ID ''='' CARD_CONST
320
321
|
322
IdentifierList '','' ID
323
324
|
325
IdentifierList '','' ID ''='' CARD_CONST
326
327
Примеры:
328
type bit
329
 =
330
card ( 1 )
331
type byte
332
 =
333
card ( 8 )
334
type address
335
 =
336
card ( REGS )
337
type breakcode
338
 =
339
card (20 )
340
341
Проблемы:Моделирование чисел с фиксированной точкой.
342
Ограничения: в текущей реализации не рассматриваем случаи, когда определяется интервал, по мощности превосходящий максимальный соответствующий стандартный тип а Java. Например, исключаем из рассмотрения card (128).
343
Трансляция: 
344
Для каждого такого типа-синонима создается новый класс с именем ID, единственным полем которого будет переменная объемлющего типа, а методы будут обеспечивать корректность работы с этой переменной, контролируя невыход их множества допустимых значений. В случае нарушения данных ограничений метод должен выбрасывать исключение.
345
Необходимо учесть, что при трансляции операторов присваивания таким переменным, надо использовать методы set из соответствующих классов. Причем эти методы set должны в качестве параметров принимать так же номер строки и позицию в nml файле, по которой находится данный оператор присваивания. Эти данные используются отладки спецификаций в случае ошибок.
346
Перечисления транслируются в стандартные Java перечисления. Например, пусть есть перечисление:
347
type <name> = enum(id1 = val1, id2 = val2, …, idn = valn)
348
Оно транслируется в отдельный файл <name>.java, который содержит Java перечисление следующего вида:
349
public enum <name> {
350
	id1(val1), id2(val2), …, idn(valn)
351
}
352
Ошибочные ситуации:
353
354
h3. Конструкция mem
355
356
Конструкция mem используется для описания памяти моделируемого микропроцессора. Общий вид такого определения представлен ниже:
357
mem M [N, type] [optional-properties]
358
В этом определении, M – имя данного объекта памяти, N – количество ячеек памяти, и type – тип каждой такой ячейки памяти. Если тип не указан, то по умолчанию тип полагается равным card(8). Доступ к данным ячейкам памяти осуществляется по средствам оператора индексирования:M[0], M[1], … , M[n-1]. Опциональные параметры могут быть следующими:
359
alias – описывает новую память как синоним какойто части уже описанной памяти. В этом случае оба имени будут ссылать на одни и те же ячейки памяти, но могут интерпретировать их по разному. Например:
360
mem A[6, int(32)]
361
mem M[3, card(32)] alias = A[3]
362
В этом случае ячейки памяти, доступные по обращениям A[3], A[4], A[5], теперь могут быть доступны и по обращениям M[0], M[1], M[2] соответственно. Отличие заключается в том, что в случае обращений с использованием имени A содержимое ячейки интерпретируется как 32-ух разрядное знаковое число, в случае же, когда обращение идет по имени M, содержимое интерпретируется, как беззнаковое число.
363
Правила грамматики для конструкции mem:
364
Bit_Optr : BIT_LEFT Bit_Expr DOUBLE_DOT Bit_Expr BIT_RIGHT
365
MemorySpec
366
:
367
MEM ID ''['' SizeType '']'' OptionalMemVarAttr
368
SizeType
369
:
370
TypeExpr
371
372
|
373
ConstNumExpr
374
375
|
376
ConstNumExpr '','' TypeExpr
377
OptionalMemVarAttr
378
:
379
380
381
|
382
ALIAS ''='' MemLocation
383
MemLocation
384
:
385
ID Opt_Bit_Optr
386
387
|
388
ID ''['' NumExpr '']'' Opt_Bit_Optr
389
Opt_Bit_Optr
390
:
391
392
393
|
394
Bit_Optr
395
Bit_Optr
396
:
397
BIT_LEFT Bit_Expr DOUBLE_DOT Bit_Expr BIT_RIGHT
398
399
// TODO: не ясна семантика Opt_Bit_Expr в грамматики для конструкции
400
 mem, в примерах использование именно такой формы тоже не было встречено.
401
Примеры:
402
	mem A[6, int(32)]
403
	mem M[3, card(32)] alias = A[3] 
404
Проблемы:
405
Ограничения:
406
Трансляция:
407
Анализ спецификаций на языке Sim-nML позволил выявить, что конструкция mem может быть использована для двух различных целей. Во-первых, она может использоваться для описания памяти моделируемого микропроцессора. В этом случае число ячеек памяти в описании довольно большое (N >> 1). Необходимо найти описание с максимальным числом ячеек, именно оно будет транслироваться в класс, моделирующий память. При трансляции данного описания создается класс ProcessorNameMemory, который является наследником абстрактного класса Memory из библиотеки поддержки трансляции. Класс ProcessorNameMemory имеет следующий вид:
408
class ProcessorNameMemory {
409
	public static final SIZE = <N>;
410
	protected HashMap(Long, <type>) memoryHashMap = new HashMap(Long, <type>)();
411
}
412
Для всех других описаний памяти, которые являются синонимами основной памяти (используют alias <имя основной памяти>), в атрибутах action для операций необходимо изменять обращения по этим именам на обращения по имени основной памяти.
413
Второй класс описаний памяти составляют описания, которые имеют небольшое число ячеек (обычно 1 или 2). Такие описания используются в качестве локальных переменных при описании атрибутов action для инструкций. Все такие описания при трансляции запоминаются. Затем при трансляции атрибутов action в методы инструкций, для каждой запомненной памяти, по которой присутствует обращение в данном атрибуте, вводится локальная переменная соответствующего типа. Все обращения по данным элементам памяти заменяются при трансляции на обращения к данной переменной. Например,
414
	mem tmp_signed_byte [ 1 , int (32) ]
415
416
	action = {
417
		 tmp_signed_byte = 31
418
419
	}
420
При трансляции атрибута action получаем получим:
421
	public void execute(...) {
422
		int tmp_signed_byte
423
424
	}
425
426
// TODO: определить абстрактный класс Memory
427
428
Ошибочные ситуации:
429
430
h3. Конструкция reg
431
432
Конструкция reg используется для описания регистров микропроцессора. Общая форма описания регистров представлена ниже:
433
reg R [N, type] [optional-properties]
434
В представленном определении R – имя регистрового файла, N – опциональный параметр, показывающий количество регистров в регистровом файле и type – тип каждого регистра. Если параметр N не указан, то по умолчанию он полагается равным 1.Доступ к регистрам данного регистрового файла осуществляется посредством оператора индексирования — R[0], R[1], …, R[N-1]. Определение регистров может иметь следующие опциональные атрибуты:
435
Ports: позволяет указать число портов чтения и записи для данного регистрового файла. Например:
436
reg R[16, int(8)] port = 3, 2
437
В представленном примере регистровый файл R имеет 3 порта для записи и 2 порта для чтения. Кроме того, каждый регистр в данном регистровом файле имеет 2 порта для чтения, так же как и весь регистровый файл, и один порт для записи. Порты чтения и записи для регистров рассматриваются в качестве ресурсов и используются для определения зависимостей между инструкциями.
438
Initial: позволяет указать начальное значение для описанных регистров. Например:
439
reg R[1, card(32)] initial = 100
440
Правила грамматики для конструкции reg:
441
RegisterSpec
442
:
443
REG ID ''['' SizeType '']'' OptionalRegAttr
444
OptionalRegAttr
445
:
446
447
448
|
449
PortsDef
450
451
|
452
InitialDef
453
454
|
455
PortsDef InitialDef
456
457
|
458
InitialDef PortsDef
459
PortsDef
460
:
461
PORTS ''='' CARD_CONST '','' CARD_CONST
462
InitialDef
463
:
464
INITIALA ''='' ConstNumExpr
465
466
Примеры:
467
	reg GPR [2 ** REGS, signed_long]
468
	reg LO [1, signed_long]
469
	reg NIA [1, long]
470
Проблемы:
471
Ограничения:
472
Трансляция:
473
Для каждого описанного регистрового файла создается класс RegisterFileName, который является наследником абстрактного класса библиотеки поддержки трансляции Register. Класс Register содержит следующие поля и методы:
474
class Register {
475
	public static final int WRITE_PORTS = 1;
476
	public static final int READ_PORTS = 1;
477
	...
478
}
479
Класс RegisterFileName содержит следующие поля и методы:
480
class RegisterFileName {
481
	public static final int READ_PORTS = <read_ports>;
482
	protected <type> value = <init_value>;
483
	...
484
}
485
Так же в класс ProcessorName добавляются следующие поля и методы:
486
	public static final int RegisterFileName_WRITE_PORTS = <write_ports>;
487
	protected RegisterFileName <some_uniq_name> [] = {
488
		new RegisterFileName(),
489
		...
490
	}
491
Причем количество элементов в массиве RegisterFileName равно N.
492
Ошибочные ситуации:
493
494
h3. Конструкция var
495
496
Конструкция var используется для определения временных переменных. Типичная конструкция определения временной переменной выглядит следующим образом:
497
var TEMP[N, type]
498
В приведенном выше определении TEMP – имя массива временных переменных, N – количество переменных в определенном массиве и type – тип каждой переменной в массиве. Если параметр N не определен, то по умолчанию он полагается равным 1. Доступ к переменным осуществляется посредством оператора индексирования — TEMP[0], TEMP[1], …, TEMP[N-1]. Важно отметить, что значения временных переменных не сохраняются при переходе от одной инструкции к другой.
499
// COMMENT: по всей видимости переменные были введены в язык для прекращения нецелевого использования конструкций определения памяти для введения временных данных. Смотри второй класс конструкций определения памяти в разделе «трансляция» описания конструкции mem.
500
Правила грамматики для конструкции var:
501
// TODO: противоречие между текстовым описанием и грамматикой.
502
VarSpec
503
:
504
VAR ID ''['' SizeType '']'' OptionalMemVarAttr
505
506
Примеры:
507
	var amod[1, card(8)]
508
	var carry[1, card(1)]
509
	var op1[1, int(32)]
510
Проблемы:
511
Ограничения:
512
Трансляция:
513
Трансляция выполняется аналогично второму классу конструкций определения памяти. Описание приводится в разделе «трансляция» описания конструкции mem.
514
Ошибочные ситуации:
515
Конструкция mode
516
Конструкция mode используется для спецификации механизмов адресации. Основу данного описания этих механизмов составляют два вида конструкций: «И»-правила и «ИЛИ»-правила.
517
«ИЛИ»-правила используются для описания логически связанной группы механизмов адресации. С помощью «ИЛИ»-правила можно задать группе таких механизмов общие атрибуты. Общий вид «ИЛИ»-правила следующий:
518
519
520
«И»-правила используются для описания листовых элементов в дереве механизмов адресации. Общий вид «И»-правила следующий:
521
522
523
Правила грамматики для конструкции mode:
524
ModeRuleSpec
525
:
526
MODE ID ModeSpecPart
527
ModeSpecPart
528
:
529
AndRule OptionalModeExpr AttrDefList
530
531
|
532
OrRule
533
OptionalModeExpr
534
:
535
536
537
|
538
''='' Expr
539
Примеры:
540
Проблемы:
541
Ограничения:
542
Трансляция:
543
Трансляция дерева «И»-«ИЛИ» правил проводится идентично как для инструкций, так и для режимов адресации. Подробные описания общих концепций трансляции приведены в разделе «Трансляция» описания конструкции op. Эти положения верны и при описании режимов адресации. Специфические моменты при трансляции этих описаний отражены ниже.
544
У и правил конструкции mode может присутствовать дополнительный опциональный элемент, который вычисляет значение параметра, передающегося данным способом адресации. Для каждого правила, обладающего таким элементом, в соответствующем классе создается тело метода getValue() на основе описания данного элемента. Метод возвращает оттранслированное выражение записанное в правиле после знака равенства.
545
Ошибочные ситуации:
546
547
h3. Конструкция op
548
549
Конструкция op используется для описания системы команд моделируемого процессора.
550
Правила грамматики для конструкции op:
551
OpRuleSpec
552
:
553
OP ID OpRulePart
554
OpRulePart
555
:
556
AndRule AttrDefList
557
558
|
559
OrRule
560
561
Примеры:
562
Проблемы:
563
Ограничения:
564
Трансляция:
565
Общие положения при трансляции древовидной структуры «И»-«ИЛИ» правил заключаются в следующем. Для каждого правила создается класс. Классы, соответствующие элементам из правых частей «ИЛИ» правил связываются с классом, соответствующим элементу в левой части, отношением наследования. Каждый класс, соответствующий элементу из списка параметров в «И»-правиле, связывается с классом, соответствующим элементу из левой части правила, отношением агрегации. На примере ниже продемонстрированы данные принципы с использованием нотации UML для отображения зависимостей между классами.
566
op instruction(inst alu_op)
567
op alu_instruction = add | sub
568
В каждом из этих классов создаются методы, соответствующие атрибутам. Механизм трансляции атрибутов подробно описан в разделе «Атрибуты». Имена создаваемых классов должны содержать некоторый служебный суффикс, что будет говорить о служебном внутреннем использовании данных классов. 
569
Для каждого элемента из списка параметров «И» правила в соответствующем классе создаются поле. Для класса также создается конструктор с сигнатурой, соответствующей данному правилу, который инициализирует эти поля.
570
// TODO: посмотреть информацию про модификаторы доступа классов, пакетов для защиты служебных классов от некорректного использования.
571
Далее, для каждого листового элемента в дереве инструкций создается еще один класс, который наследуется от класса Instruction (соответствует корню дерева). Эти классы распределяются по пакетам в соответствии со структурой дерева. Для каждого не листового узла дерева создается отдельный пакет, куда вложены все пакеты и классы, соответствующие потомкам данного узла.
572
Ошибочные ситуации: