Project

General

Profile

Sim-nML Translator » History » Version 1

Alexander Kamkin, 04/12/2012 11:00 AM

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