Project

General

Profile

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

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