Project

General

Profile

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

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