чином представляти BASED-змінні в ассемблеровском еквіваленті програми (на виході).
· відсутні арифметичні операції
За цим, для визначеності, були введені наступні обмеження на мовні конструкції компілятора ЯВУ:
· Обмеження на цілі десяткові змінні:
o мають тип P в ассемблеровском еквіваленті програми;
o визначаються як без знакові, тобто завжди позитивні;
o мають довжину 3 байти (мантиса дорівнює 5 (одна тетрада на знак)), тобто це числа від 0 до 99 999;
o НЕ ініціалізовані десяткові змінні на ЯВУ инициализируются нулем в ассемблеровском еквіваленті програми.
· BASED-змінні:
o тільки цілі десяткові
o не мають своє уявлення в пам'яті програми, для цього вони оголошуються через оператор EQU асемблера ЄС ЕОМ.
· Оператор присвоювання кодується в 6 байтовую команду типу SS (Storage - Storage) мови Асемблера. Це означає, що присвоювання працює без використання допоміжних регістрів.
· Покажчики оголошуються як тип A в ассемблеровском еквіваленті програми, мають розмір 4 байта (довжину адреси в ЄС ЕОМ).
Опис розробленого синтаксису мови
Синтаксис існуючого макета був розширений такими правилами:
· додано правило декларування десяткових змінних з ініціалізацією і без
· додано правило декларування покажчиків і десяткових змінних, що базуються на даних, на які посилається цей покажчик
· додано правило отримання адреси існуючої змінної
· додано правило роботи оператора присвоювання
Таким чином, граматика мови має наступний вигляд:
1. lt; PRO gt; ::= Lt; OPR gt; lt; TEL gt; lt; OEN gt;
. lt; OPR gt; ::= Lt; IPR gt;: PROC_OPTIONS (MAIN);
. lt; IPR gt; ::= Lt; IDE gt;
. lt; IDE gt; ::= Lt; BUK gt; | Lt; IDE gt; lt; BUK gt; | Lt; IDE gt; lt; CIF gt;
. lt; BUK gt; ::=A | B | C | D | E | M | P | X
. lt; CIF gt; ::=0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
. lt; TEL gt; ::= Lt; ODC gt; | Lt; TEL gt; lt; ODC gt; | Lt; TEL gt; lt; OPA gt;
. lt; ODC gt; ::=DCL_ lt; IPE gt; _BIN_FIXED ( lt; RZR gt;); | _ lt; IPE gt; _BIN_FIXED ( lt; RZR gt;) INIT ( lt; LIT gt;); | _ lt; IPE gt; _DECIMAL_FIXED_INIT ( lt; RZR gt;); | _ lt; IPE gt; _DECIMAL_FIXED; | _ lt; IPE gt; _POINTER; | _ lt; IPE gt; _DECIMAL_FIXED_BASED ( lt; IPE gt;);
. lt; IPE gt; ::= Lt; IDE gt;
. lt; RZR gt; ::= Lt; CIF gt; | Lt; RZR gt; lt; CIF gt;
. lt; LIT gt; ::= Lt; MAN gt; B
. lt; MAN gt; ::=1 | lt; MAN gt; 0 | lt; MAN gt; 1
. lt; OPA gt; ::= Lt; IPE gt;=ADDR ( lt; IPE gt;); |
lt; IPE gt;= lt; AVI gt ;;
. lt; AVI gt; ::= Lt; LIT gt; | Lt; IPE gt; | Lt; AVI gt; lt; ZNK gt; lt; LIT gt; |
lt; AVI gt; lt; ZNK gt; lt; IPE gt;
. lt; ZNK gt; ::=+ | -
. lt; OEN gt; ::=END_ lt; IPR gt;
Рис. 1 Розпізнавання граматичних правил у форматі продукцій
Перетворення в код асемблера ЄС ЕОМ
Слідуючи введеним обмеженням, отримуємо наступний ассемблеровскій еквівалент на виході компілятора ЯВУ:
. Змінні:
. 1. Цілі десяткові змінні оголошуються як тип PL3 X через команду DC, де Х - значення при ініціалізації. P - стандартний тип десяткових змінних в Асемблері IBM 370. Літера L означає довжину числа в байтах, яка відповідає 3 байтам - фіксоване значення, зазначене в обмеженнях до компілятора ЯВУ.
. 2. Покажчики оголошуються як тип A через команду DS. Команда DS асемблера IBM 370 виділяє пам'ять на 4 байта НЕ ініціалізованих даних, тому покажчики не можуть бути ініцілізіровани, а довжина 4 байта відповідає довжині адреси архітектури IBM 370.
1.3. BASED-змінні оголошуються через псевдокоманда EQU:
lt; ім'я змінної gt; EQU lt; ім'я покажчика gt ;. Т.к. BASED-змінні є лише представленням вже існуючого десяткового числа через покажчик, логічно використання ассемблерной псевдокоманди EQU, яка не виділяє пам'ять під змінну. Надалі, при компіляції з асемблера в байт-код, використовуватиметься підстанов...