- •5.2. Ll(1)-метод синтаксического анализа.
- •Отношения между классами кс-грамматик
- •1.Семантический анализ
- •1.1. Польская инверсная запись
- •1.2.Интерпретация полиЗа
- •1.3.Генерирование команд по полиЗу
- •1.4.Алгоритм Замельсона и Бауэра перевода выражений в полиз
- •7.5. Атрибутные грамматики
- •Генерация кода Свойства языка внутреннего представления программы.
- •Синтаксически управляемый перевод на примере перевода арифметического выражения в полиз.
- •Представление условных операторов, операторов цикла и оператора безусловного перехода в полиз.
- •Генерация кода на языке ассемблер, для вычисления арифметического выражения.
- •Генерация кода для операторов read и write языка паскаль.
- •Генерация кода для условного оператора if, вложенного оператора if языка паскаль.
- •Генерация кода для оператора цикла for, вложенного оператора for языка паскаль.
- •Генерация кода для операторов цикла while, repeat языка паскаль.
Генерация кода для операторов цикла while, repeat языка паскаль.
Закончим обсуждение генерации кода примером для условным циклов. Первым будет цикл WHILE.
WHILE (условие) DO |
w_loop_XXX: ...;код вычисления ...;условия test bx,bx jz w_loop_exit_XXX |
Здесь мы генерируем уникальную метку (реально только уникальный суффикс), которую мы ложим на стек вместе с ярлыком _WHILE_, заметим, что между метками располагается не показанный здесь код вычисления условия, который возвращает булево значение на вершине стека |
... ; |
jmp w_loop_XXX w_loop_exit_XXX: |
Вынимаем из стека управляющих операторов ярлык _WHILE_, генерируем переход к началу циклаb метку окончания цикла |
Аналогичный пример для REPEAT:
REPEAT ... |
r_loop_XXX: ... |
Здесь мы генерируем уникальную метку, которую мы ложим на стек вместе с ярлыком _REPEAT_ |
UNTIL(условие); |
...;код вычисления ...;условия test bx,bx jnz r_loop_XXX |
Вынимаем из стека управляющих операторов ярлык _WHILE_, генерируем код вычисления условия, который возвращает булево значение на вершине стека и генерируем переход к началу цикла |
Аналогично, вряд ли требуются дополнительные комментарии и ясно, как поддерживаются вложенные операторы WHILE/REPEAT.
