Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТЯП, ТВП / ТЯПМТ / Пособие.doc
Скачиваний:
161
Добавлен:
11.05.2015
Размер:
2.37 Mб
Скачать

9.3.6. Прикладные реализации

Во время компиляции в соответствии с прикладной реализацией идентификатора, например х в х + 4, необходимо:

  1. найти в таблице символов запись, соответствующую определяющей реализации (int x) идентификатора;

  2. поместить в нижний стек статические характеристики, соответствующие идентификатору.

Подразумевается, что в нижний стек также помещаются статические характеристики констант и т.д.

9.4. Проблемы, связанные с типами

Основной проблемой для трансляторов с языков высокого уровня является приведение (автоматическое изменение) типов. Здесь можно выделить, как минимум, шесть задач.

  1. Распроцедуривание- переход от procedure realкreal.

  2. Разыменование, например переход от pointer realкreal.

  3. Объединение, например переход от realкstrutct(real,char).

  4. Векторизация, например переход от realкreal [ ].

  5. Обобщение, например переход от intкreal.

  6. Чистка, например переход от realкvoid.

Возможность осуществления приведения зависит от синтаксической позиции. Например, в левой части присвоения может иметь место только распроцедуривание (вызов процедур без параметров), а в правой части - любое из шести приведений. Иногда возникает необходимость нескольких приведений. Например, еслих имеет видpointer realиapointer int, то прежде чем производить присвоениех=а, необходимо сначала разыменовать, а затем обобщить.

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

SOFT => deprocedure |

deprocedure SOFT

Любое предложение, генерированное посредством SOFT, представляет собой допустимую последовательность приведений в мягкой синтаксической позиции (т.е. в левой части присвоения).

Для раскрытия позиции (например, индекса в a[i]) справедливы следующие правила:

MEEK => deprocedure |

deprocedure MEEK |

dereference |

dereference MEEK.

Другими словами, в раскрытой позиции можно выполнять распроцедуривание и разыменование любое число раз и в любом порядке, например:

pointer procedurepoiter intв видint

Для сильной позиции (например, правая часть присвоения или параметр в вызове процедуры) правила таковы:

STRONG => dereference STRONG |

deprocedure STRONG |

unit |

unit ROW |

widen |

widen widen |

widen ROW |

widen widen ROW |

ROW |

ROW => row |

row ROW

Вид данных до выполнения приведений называется априорным, а после выполнения - апостериорным. В случае сильных и раскрытых синтаксических позиций известны и априорный и апостериорный виды. Для других позиций известен лишь априорный вид и некоторая информация об апостериорном виде, например о том, что он должен начинаться со structилиpointer struct, или о том, что он не должен начинаться сproc, как в левой части присвоения.

Компилятор, применяя соответствующую грамматику, генерирует последовательность приведений из априорного вида к известному либо к подходящему апостериорному виду. Если нельзя найти никакой последовательности приведений, программа синтаксически неправильная.

С другой стороны, если подходящая последовательность существует, компилятор, применяя приведения по порядку, генерирует код времени прогона.

Еще один вид приведения - чистка. Чистка представляет собой особую форму приведения и происходит в тех местах, где стоит точка с запятой

x=y;

Еще одна сложность связана с выбирающим предложением. В предложении

x + if b then 1 else 2.3

во время компиляции необходимо знать тип (вид) правого операнда знака «+». Все варианты выбирающего предложения должны приводить к общему виду, называемому объектным. Этот процесс называется уравнением, и его правила подразумевают, что последовательность сильных приведений можно применять во всех вариантах, кроме одного, в котором используется лишь последовательность приведений, уместных лишь для синтаксической позиции выбирающего предложения. В вышеприведенном примере выбирающее предложение находиться в крепкой синтаксической позиции, которая не допускает расширения. Однако внутри выбирающего предложения один вариант допускает сильное приведение, что может повлечь за собой расширение. В этом случае объектным видом окажется real, и первый вариант следует расширить, а второй нежелательно подвергать приведению.

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