
- •1. Грамматики
- •Пример.
- •2. Лексический анализ
- •3. Синтаксический анализ
- •4. Генератор кода
- •Алгоритм.
- •5. Оптимизация кода
- •6. Регулярные множества, их распознавание
- •7. Компиляторы и интерпретаторы.
- •8. Эквивалентность мп-автоматов и кс-грамматик
- •9. Разбор снизу вверх
- •10. Lr(1) - таблица разбора
- •10. Lr(1) - таблица разбора
- •11. Построение lr – таблицы разбора
- •12. Сравнение ll – и lr – методов разбора
- •13. Нормальная форма Хомского
- •14. Нормальная формула Грейбах
- •15. Ll(1)-грамматики
- •16. Ll(1)-таблица разбора
- •17. Контекстно-свободные языки
- •18. Циклы
18. Циклы
Рассмотрим простейший пример цикла:
for i to 10 do something.
Для генерации кода требуется четыре действия, которые размещаются следующим образом:
for i <A1> to 10 <A2> do <A3> something <A4>.
Эти действия таковы.
А1. Выделить память для управляющей переменной i. Поместить сначала в эту память 1:
MOVE «1», address (управляющая переменная).
А2. Генерировать код для записи в память значения верхнего предела рабочего стека:
MOVE address (ulimit) (wostack, current block number, wostack pointer)
(wostack pointer — указатель рабочего стека).Увеличить указатель рабочего стека и уменьшить указатель нижнего стека, где хранились статические характеристики верхнего предела.
А3. Поместить метку
SET LABEL L<next>.
Увеличить next на 1.
Выдать код для сравнения управляющей переменной с верхним пределом и перейти к L<next>, если управляющая переменная больше верхнего предела:
JUMPG L<next>, address (controlled variable), address (ulimit).
Поместить в стек значение next. Поместить в стек значение (next – 1). Увеличить next на 1.
А4. Генерировать код для увеличения управляющей переменной
PLUS address (controlled variable), 1.
Удалить из стека номер (i). Генерировать код для перехода к L(i):
GO TO L<i>.
Удалить из стека номер метки (j). Поместить метку в конец цикла:
SET LABEL L<j>.
Таким образом, цикл
for i to 10 do something
генерирует код следующего вида:
MOVE «1», address (controlled variable)
MOVE address (ulimit), wostack pointer
SET LABEL L1
JUMPG L2 address (controlled variable), address (ulimit)
(something)
GO TO L1
SET LABEL L2.
Действия А4 можно видоизменять, если приращение управляющей переменной будет не стандартным (1), а иным.
for i by 5 to 10 do.
Для этого придется вычислять приращение и хранить его значение в рабочем стеке, чтобы использовать как приращение.
Если цикл содержит часть while, то
for i to 10 while a<b do.
Действие А3 следует видоизменить, чтобы при принятии решения о выходе учитывалось как значение части while, так и управляющей переменной, причем любая из этих проверок достаточна для завершения цикла.