курсовая 2. 1 Постановка задачи 4 2 Формальная модель задачи 5
Скачать 0.89 Mb.
|
Перевод в ПОЛИЗ операторов. Каждый оператор языка программирования может быть представлен как n-местная операция с семантикой, соответствующей семантике оператора.Оператор присваивания I ass B в ПОЛИЗе записывается: IB ass, где «ass» - двуместная операция, I, B – операнды операции присваивания; I – означает, что операндом операции «ass» является адрес переменной I, а не ее значение. Пример 2: Оператор x ass x+9 в ПОЛИЗе имеет вид: x x 9 + ass. Оператор перехода в терминах ПОЛИЗа означает, что процесс интерпретации необходимо продолжить с того элемента ПОЛИЗа, который указан как операнд операции перехода. Чтобы можно было ссылаться на элементы ПОЛИЗа, будем считать, что все они пронумерованы, начиная с единицы (например, последовательные элементы одномерного массива). Пусть ПОЛИЗ оператора, помеченного меткой L, начинается с номера p, тогда оператору безусловного перехода goto L в ПОЛИЗе будет соответствовать: p!, где ! – операция выбора элемента ПОЛИЗа, номер которого равен p. Условный оператор. Введем вспомогательную операцию – условный переход «по лжи» с семантикой if not E goto L. Это двуместная операция с операндами E и L. Обозначим ее !F, тогда в ПОЛИЗе она будет записываться: E p !F, где p – номер элемента, с которого начинается ПОЛИЗ оператора, помеченного меткой L. С использованием введенной операции условный оператор if E then S else S4 в ПОЛИЗе будет записываться: E p1 !F S p2 ! S4, где p1 – номер элемента, с которого начинается ПОЛИЗ оператора S4, а p1 – оператора, следующего за условным оператором. Пример 3: ПОЛИЗ оператора if x>0 x ass x-5 else x ass x*2 представлен в таблице 2.3. Таблица 3 – ПОЛИЗ оператора if
Оператор цикла while. С учетом введенных операций оператор цикла while E do S в ПОЛИЗе будет записываться: E p1 !F S po !, где po – номер элемента, с которого начинается ПОЛИЗ выражения B, а p1 – оператора, следующего за данным оператором цикла. Оператор цикла for. С учетом введенных операций оператор цикла for G to E do S в ПОЛИЗе будет записываться: G E I <= p1 !F S I I 1 +ass po !, где po – номер элемента, с которого начинается операция сравнения , а p1 – оператора, следующего за данным оператором цикла. Операторы ввода и вывода языка М одноместные. Пусть R – обозначение операции ввода, а W – обозначение операции вывода, тогда оператор read (I) в ПОЛИЗе запишется как I R, а оператор write (E) – E W. Составной оператор begin S1; S2;...; Sn end в ПОЛИЗе записывается как S1 S2... Sn. Пример 4: ПОЛИЗ оператора while n<9 do t ass n*n-1: n ass n-1; Таблица 4 – ПОЛИЗ оператора while Синтаксически управляемый перевод. На практике СиА, СеА и генерация внутреннего представления программы осуществляется часто одновременно. Способ построения промежуточной программы – синтаксически управляемый перевод. В его основе лежит грамматика с действиями. Параллельно с анализом исходной цепочки лексем осуществляются действия по генерации внутреннего представления программы. Для этого грамматика дополняется вызовами соответствующих процедур. Пример 5: Составим процедуры перевода в ПОЛИЗ программы на языке М. ПОЛИЗ представляет собой массив, каждый элемент которого является парой вида (n, k), где n – номер таблицы лексем, k – номер лексемы в таблице. Расширяем набор лексем: 1) в таблицу ограничителей добавляем новые операции ! (22), !F (19), R (21), W (20); 2) для ссылок на номера элементов ПОЛИЗа введем нулевую таблицу лексем, т.е. пара (0, p) - это лексема, обозначающая p-ый элемент в ПОЛИЗе; 3) чтобы различать операнды-переменные и операнды-адреса переменных, обозначим переменные как 4 таблицу лексем, а адреса – 5. 3.5 Интерпретация ПОЛИЗа программы Ход интерпретации программы с помощью таблицы Интерпретируем следующую программу: program var integer a,b; begin b ass 1; for a ass 1 to 2 do b ass b+1 write(b) end. ПОЛИЗ данной программы будет иметь вид: Таблица 5 – ПОЛИЗ исходной программы
Процесс интерпретации программы на модельном языке М, записанной в форме ПОЛИЗа, показан в таблице 6. Таблица 6 – Ход интерпретации ПОЛИЗа программы
9> |