Разработка компиляторов. Ишакова Е.Н. - 27 стр.

UptoLike

Составители: 

27
1) checkid - процедура, которая для лексемы LEX, являющейся идентифи-
катором, проверяет по таблице идентификаторов TI, описан ли он, и, если опи-
сан, то помещает его тип в стек;
2) checkopпроцедура, выводящая из стека типы операндов и знак опе-
рации, вызывающая процедуру gettype(op, t1, t2, t), проверяющая соответствие
типов и записывающая в стек тип результата операции;
3) gettype(ор, t1, t2, t) – процедура, которая по таблице операций TOP для
операции ор выдает тип t результата и типы t1, t2 операндов;
4) checknotпроцедура проверки типа для одноместной операции «¬».
Таблица 2.2 – Фрагмент таблицы двуместных операций TOP
Операция Тип 1 Тип 2 Тип результата
+
>
int
int
int
int
int
bool
Перечисленные процедуры имеют следующий вид:
procedure checkid;
begin
k:=LEX[2];
if TI[k].descrid = 0 then ERR;
inst(TI[k].typid)
end;
procedure checkop;
begin
outst(top2); outst(op); outst(top1);
gettype(op, t1, t2, t);
if (top1<>t1) or (top2<>t2) then ERR;
inst(t)
end;
procedure checknot;
begin
outst(t);
if t<> bool then ERR;
inst(t)
end;
Правила, описывающие выражения языка М, расширенные процедурами
семантического анализа, принимают вид.
Е Е1 {( > | < | = ) <instl> E1 <checkop>}
E1 Т {(+ | - | ) <instl> T <checkop>}
T F {( * | / | ) <instl> F<checkop>}
F I <checkid>| N<inst(‘int’)> | L <inst(‘bool’)>| ¬F <checknot>|(E)
      1) checkid - процедура, которая для лексемы LEX, являющейся идентифи-
катором, проверяет по таблице идентификаторов TI, описан ли он, и, если опи-
сан, то помещает его тип в стек;
      2) checkop – процедура, выводящая из стека типы операндов и знак опе-
рации, вызывающая процедуру gettype(op, t1, t2, t), проверяющая соответствие
типов и записывающая в стек тип результата операции;
      3) gettype(ор, t1, t2, t) – процедура, которая по таблице операций TOP для
операции ор выдает тип t результата и типы t1, t2 операндов;
      4) checknot – процедура проверки типа для одноместной операции «¬».
     Таблица 2.2 – Фрагмент таблицы двуместных операций TOP
         Операция         Тип 1          Тип 2   Тип результата
            +              int            int          int
            >              int            int         bool
            …              …              …            …
     Перечисленные процедуры имеют следующий вид:
     procedure checkid;
     begin
        k:=LEX[2];
        if TI[k].descrid = 0 then ERR;
        inst(TI[k].typid)
     end;
     procedure checkop;
     begin
        outst(top2); outst(op); outst(top1);
        gettype(op, t1, t2, t);
        if (top1<>t1) or (top2<>t2) then ERR;
        inst(t)
     end;
     procedure checknot;
     begin
        outst(t);
        if t<> bool then ERR;
        inst(t)
     end;
     Правила, описывающие выражения языка М, расширенные процедурами
семантического анализа, принимают вид.
           Е → Е1 {( > | < | = )  E1 }
           E1→ Т {(+ | - | ∨)  T }
           T→ F {( * | / | ∧)  F}
           F→ I | N | L | ¬F |(E)
                                                                             27