Project

General

Profile

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

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