Project

General

Profile

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

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