Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по СПО [укр. язык].DOC
Скачиваний:
46
Добавлен:
02.05.2014
Размер:
526.85 Кб
Скачать

Лекція №10.

Генерація коду для типових конструкцій мов програмування.

Генерація коду для простого виразу.

Побудуємо граматику:

Включимо в цю граматику дії:

Введемо деякі позначення:

i:=i+1 – збільшення лічильника;

4) – побудувати четвірку;

Маємо включені дії:

B1:

  • CВ в НС;

B2:

  • Із НС вилучаємо СВ;

  • Із СЗО вилучаємо знак операції;

  • 4) унарної операції;

  • СВ результату заносимо в НС;

B3:

  • Те що і в B2, але із НС вилучається два операнда та будується повна четвірка;

B4:

  • Знак поміщаємо в СЗО;

E1:

  • Перевірка відповідності типів та при необхідності будується четвірка приведення типів.

Оператор присвоювання.

Правило:

Включені дії:

C1:

  • СВ ідентифікатора заносимо в СЗО;

C2:

  • Із НС та ВС виймаємо СВ операндів;

  • 4) привласнити СВ ВС,СВ НС,N;

E2:

  • перевірка відповідності типів, будується додаткова четвірка приведення типів перед четвіркою привласнення.

Оператор IF.

Правило:

Маємо такі включені дії:

E3:

  • перевірка типів;

D1:

  • 4) перейти_по_false Li,N;

  • i заносимо в СЗО;

  • i=i+1;

D2:

  • 4)перейти Li,N;

  • j виймаємо із СЗО;

  • i заносимо в СЗО;

  • i=i+1;

  • 4) мітка Lj,N;

D3:

  • виймаємо в j із СЗО ;

  • 4) мітка Lj,N.

Генерація коду для оператора CASE.

Маємо таку граматику:

Маємо такі включені дії:

F1:

  • CВ ідентифікатора в ВС

  • I заносимо в СЗО (зарезервуємо мітку для кінця оператора);

F2:

  • СВ літерала в НС;

F3:

  • 4) порівняти СВ літералу, СВ НС,N;

  • 4) порівняти СВ літерала, СВ ВС,N;

  • 4) перехід_по_більше Li,N;

  • i заносимо в СЗО;

  • i=i+1;

  • звільняємо НС;

  • 4) порівняти СВ НС, СВ ВС,N;

  • 4) перехід_по_більше Li,N;

  • 4)мітка Li-1,N;

F4:

  • звільнити НС;

  • 4) порівняти СВ НС, СВ ВС,N;

  • 4) перехід_по_рівно Li,N;

  • i заносимо в СЗО;

  • i=i+1, вирішити проблему багатьох міток можна двома способами:

  1. В дії <F8> помістити в СЗО особливу мітку, наприклад –1(FFFF), в <F5> виймати з СЗО до цієї особливої мітки і її теж, та побудувати четвірку.

  2. В дії <F8> заносимо мітку в СЗО, яка буде поставлена перед операторами в дії <F5>. В діях <F3> та <F4> побудуємо перехід на цю мітку, залишаючи її в СЗО.

В цій дії ми використаємо перший варіант, а для міток альтернатив – другий.

F5:

  • 4) перейти Li,N;

  • цикл доки j<>-1:

j виймаємо з СЗО;

4) мітка Lj,N;

  • i заносимо в СЗО;

  • i=i+1;

F6:

  • j вилучаємо із СЗО;

  • k =значенню СЗО, залишаючи його в СЗО;

  • 4) перейти Lk,N;

  • 4) мітка Lj,N;

F7:

  • k виймаємо із СЗО;

  • 4) мітка Lk,N;

F8:

  • -1 заносимо в СЗО.

Лекція №11. Генерація коду для циклу for.

Маємо таку граматику:

Включені дії:

G1:

  • СВ ідентифікатора заносимо в ВС (якщо немає опису змінної циклу, тоді в робочому стекові виділяється комірка, а потім СВ в ВС);

G2:

  • 4) перенести СВ ВС, СВ НС,N;

  • звільнити НС;

G3:

  • 4) мітка Li,N;

  • i заносимо в СЗО;

  • i=i+1;

  • 4) порівняти СВ НС, СВ ВС,N;

  • 4) перейти_по_більше Li,N;

  • i заносимо в СЗО;

  • i=i+1;

G4:

  • в j виймаємо із СЗО;

  • в k виймаємо з СЗО;

  • 4) скласти СВ ВС,1,N;

  • 4) перейти Lk,N;

  • 4) мітка Lj,N;

  • звільнити НС;

  • звільнити ВС;

E1:

  • перевірка контекстних умов та типу результату.

Генерація коду для циклу while.

Побудуємо граматику:

Маємо такі включені дії;

H1:

  • 4) мітка Li,N;

  • i заносимо в СЗО;

  • i=i+1;

  • 4) порівняти СВ НС, true,N;

  • 4) перейти_по_false Li,N;

  • i заносимо в СЗО;

  • i=i+1;

H2:

  • в j виймаємо з СЗО;

  • в k виймаємо з СЗО;

  • 4) перейти Lk,N;

  • 4) мітка Lj,N;

  • звільнити НС.

Соседние файлы в предмете Системное программное обеспечение