ВУЗ:
Составители:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 25
- 26
- 27
- 28
- 29
- …
- следующая ›
- последняя »
