ВУЗ:
Составители:
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
- …
- следующая ›
- последняя »