Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Нейтрализация ошибок в ГПП.




Ошибки: 1) отсутствие ОП

2) основа правильно выделена, но нет правил с нужной правой частью.

Для ошибок 2) делается минимальная коррекция основы, так чтобы подошло правило, «ближайшее» к выделенной основе.

Для ошибок 1) либо изменение символов

либо вставка символов во входную цепочку или в стек

либо удаление из входной цепочки или из стека


5. КОНТЕКСТНЫЙ АНАЛИЗ.

На входе: синтаксическое дерево разбора.

На выходе: атрибутное дерево программы; удаление всех нетерминалов;

Контекстный анализ состоит из 2-х этапов:

идентификация: определяются атрибуты лексем (висячих вершин);

атрибутная индукция: определяются атрибуты понятий (невисячих вершин).

В качестве атрибутов используются, например, типы переменных (операндов операций).

Идентификация.

Если лексема - const, то вид ее определяет эти атрибуты.

Если лексема - не const, то определяется тип специфическим атрибутом программы, определяющим лексему. Определяющее вхождение только в своей области определения. Правило определения области действия должно однозначно поставить в соответствие область, определяющую вхождение лексем.

Идентификация может служить источником ошибок, называемых семантическими.

Реализация идентификации идет в виде построения таблицы имен. Она содержит: имя (8 символов), ссылка на продолжение имени, тип, ссылка на атрибуты массива.

При вложенных областях имя объекта усложняется: нумеруются области и имя: номер-области.имя- переменной, С ними при трансляции связан стек. Если описание массивов динамическое, то идентификацию провести нельзя. Этот атрибут помечается, что определяется при выполнении программы.

Имеются полиморфные процедуры, выполняющиеся в зависимости от типа переменных.

5.2. Атрибутная индукция. Идет либо снизу вверх, либо сверху вниз.

       
   


+

/ \ cнизу

а * вверх

/ \

b c

Поскольку у нас *, то надо «идти на жертвы»,т.е. при преобразовании типов (в случае + можно оставить одно преобразование)


6. ГЕНЕРАЦИЯ КОДА.

6.1. Общая схема генерации.

Методы генерации зависят от выходного языка.

Рассмотрим трехадресную модель. В ней команды имеют вид

Q i AiBiCi, где Q i -код операции, Ai, Bi – операнды(их адреса), Ci - адрес результата.

Goto M~БП-М-

Генерация – это превращение атрибутного дерева в строку объектной программы.

Каждую (невисячую) вершину атрибутного дерева превратим в строку объектного кода с помощью трансдуктора (для каждой операции- свой трансдуктор).

В каком порядке обходится дерево? Управляющий алгоритм определяет обход дерева и построение строки. Просмотр происходит последовательно, без возврата.

При нисходящем разборе используют префиксную запись, при восходящем – постфиксную.

Для входной строки а:= b + c * d постфикс: cd * b + a:= или abcd *+:=, префикс::= a + b * cd.

Т.к. функции могут иметь произвольное число параметров, нужны разделители ◁, ▷ и |.

Для строки F(x,y,z) - постфикс ◁ x | y | z | F ▷, префикс ◁ F | x | y | z ▷.

Помимо трансдуктора элементарных операций необходимы обобщенные трансдукторы (метатрансдукторы) для более сложных конструкций.

 

6.2. Генерация выражений и операций присваивания.

Пусть у нас нет переменных с индексами и функций.

Тогда трансдуктор имеет дело с деревом, у которого корень и невисячие вершины –операции, а листья –переменные или константы.

Пример 1. Постфиксная: abc +* db -2 ­/ (кстати, инфиксная запись такова: a *(b + c)/(d - b) ­2)

Стек:    
$ a b c + t1=a+b + b c t1
$ a t1 * t2=a*t1 * a t1 t2
$ t2 d b – t3=d-b - d b t3
$ t2 t3 2­ t4=t3 ­ 2 ­ t3 2 t4
$ t2 t4 / t5=t2 / t4 / t2 t4 t5
$ t5    

 

/

/ \

* ­

/ \ / \

a + - 2

/ | | \

b c d b

Можно было обойтись двумя ячейками t1,t2,t5 ~ t1; t3? t4 ~ t2.

Пример 2. a * b -(c - d)*(b + c)

Составим постфикс: ab * cd - bc +*- (обход слева) cb + dc -* ba *- (Обход справа)

Стек Код   Стек Код
$ a b * * a b t 1   $ c b + + b c t 1
$ t 1 c d - - c d t 2   $ t 1 dc - - c d t 2
$ t 1 t 2 c + + b c t 3   $ t 1 t 2 * * t 2 t 1 t 1
$ t 1 t 2 t 3 * * t 2 t 1 t 2   $ t 1 ba * * a b t 2
$ t1 t2 - - t 1 t 2 t 1   $ t 1 t 2 - - t 2 t 1 t 1
$ t1     $ t1  

Какой обход дерева операций использовать (слева или справа), можно узнать на этапе контекстного анализа.

 

 

Вводится характеристика вершины (сколько переменных надо для обсчета вершины v):

n (v) = if n (v 1) = n (v 2) then n (v 1)+1 else max { n (vi)}

Сначала нужно раскрывать ту вершину, у которой n (v) больше!!!

Вопрос на экзамен: проследите за порядком операндов в некоммутирующих операциях.


Пусть исполнитель – одноадресная машина, у которой есть накопитель S и команды:

L x (load = загрузка ячейки x в накопитель: x ®S)

ST x (storage = сохранение накопителя в ячейке x: S® x)

Ä x -одна из операций (сложение, вычитание, умножение, деление) SÄx®S

Команда – cdt трехадресной модели реализуется тремя командами одноадресной модели:

- c d t 2 L c  
  - d  
  ST t 1  
+ b c t 1 L b  
  + c  
* t 2 t 1 t 1 * t 1  
  ST t 1  
* a b t 2 L a  
  * b  
- t 2 t 1 t 1 - t 1  
  ST t 1  

5 команд в трехадресной машине занимают 15 команд в одноадресной. Но можно и быстрее. Необязательно заменять любую команду тремя, т.к. сумматор иногда выполняет роль рабочей ячейки. Поменяв порядок обхода дерева операций, мы обошлись в одноадресной машине одной дополнительной ячейкой, а не двумя.

Замечания:

1) когда требуется выбрать результат предыдущей операции, в стек записывается символ S.

2) Если операция некоммутируемая, то выгоднее сначала обойти правую ветвь дерева

3) Память бывает разных видов: быстрая, оперативная и на дисках. Если быстрая память находится в регистрах, то нужно использовать их для рабочих переменных.

4) Если компьютер является стековой машиной, то это удобно для генерации.






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных