Задачи проверки правильности операторов:
1) выяснить, все ли переменные, встречающиеся в операторах, описаны;
2) установить соответствие типов в операторе присваивания слева и справа от символа «:=»;
3) определить, является ли выражение Е в операторах условия и цикла булевым.
Данные задачи решаются путем включения в правило S ранее рассмотренной процедуры checkid, а также новых процедур eqtype и eqbool, имеющих следующий вид:
procedure eqtype;
begin
outst (t 2); outst (t 1);
if t 1 <>t 2 then ERR
end;
procedure eqbool;
begin
outst (t);
if t <> bool then ERR
end;
Правило S с учетом процедур СеА примет вид:
S ® I < checkid >:= E < eqtype > | if E < eqbool > then S else S
while E < egbool > do S | write (E) | read (I < checkid >)
Генерация кода
Результатом СиА должно быть некоторое внутреннее представление исходной цепочки лексем, которое отражает ее синтаксическую структуру. Программа в таком виде может либо транслироваться в объектный код, либо интерпретироваться.
Генерация объектного кода - это перевод компилятором внутреннего представления программы в цепочку символов выходного языка. Генерация объектного кода порождает результирующую объектную программу на языке ассемблера или непосредственно на машинном языке (в машинных кодах). Внутреннее представление программы может иметь любую структуру в зависимости от реализации компилятора, в то время как результирующая программа всегда представляет собой линейную последовательность команд. Поэтому генерация объектного кода (объектной программы) в любом случае должна выполнять действия, связанные с преобразование сложных синтаксических структур в линейные цепочки.
|
|
Формы внутреннего представления программы
Возможны различные формы внутреннего представления синтаксических конструкций исходной программы в компиляторе. Но формы представления, используемые на этапах синтаксического анализа, оказываются неудобными при генерации и оптимизации объектного кода. Поэтому перед оптимизацией и непосредственно перед генерацией объектного кода внутреннее представление программы может преобразовываться в одну из соответствующих форм записи.
Выделяют следующие общепринятые способы внутреннего представления программы:
1) многоадресный код с явно именуемым результатом (тетрады);
2) многоадресный код с неявно именуемым результатом (триады);
3) синтаксические деревья;
4) постфиксная запись;
5) машинные команды или ассемблерный код.