Project

General

Profile

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

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