Замечания

 

Мы обсудили пять видов действий, выполняемых транслятором: лексический, синтаксический, семантический анализы, оптимизацию и генерацию кода. Эти понятия обязательны для организации построения компилятора, однако эту классификацию не надо воспринимать как догму, так как:

1) выделение некоторых этапов работы компилятора можно подвергнуть сомнению;

2) необходимые действия должны выполняться там, где это наиболее удобно;

3) смысл этапов сильно зависит от типов входного и выходного языков и цели трансляции.

 

Блоки и проходы компилятора

 

Рассмотрим взаимодействия между блоками. Например, между лексическим и синтаксическим. Возможно два типа взаимодействия:

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

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

В упрощенной модели компилятора проходы можно организовать четырьмя разными способами:

1) Однопроходный. Управление передает в следующий блок каждый раз когда требуется или производится лексема или атом.

2) Трехпроходный. Лексический блок заготавливает всю последовательность лексем, затем синтаксический блок порождает всю последовательность атомов, которая используется генератором кода при порождении объектного кода.

3) Двухпроходный. Возможны два типа двухпроходной организации:

- в первом случае лексический и синтаксический блоки работают одновременно в течении одного прохода;

- в другом случае синтаксический блок и генератор кода работают одновременно в течении одного прохода.

Вопросы и упражнения

1. В чем состоит задача трансляции?

2. Какой тип языкового процессора называют компилятором? Препроцессором? Интерпретатором?

3. Из каких основных блоков обычно состоит компилятор?

4. Что понимается под лексемой при разработке компилятора?

5. Какова главная функция лексического блока? Синтаксического? Генератора кода?

6. Опишите входную и выходную информацию при обработке каждым блоком компилятора следующей программы:

Begin a:=5; b:=a+7*(2*a/b-abc)/40b; end

Синтаксически-ориентированный метод трансляции