ВУЗ:
Составители:
outst (kop2); outst(op); outst(topl);
gettype(op,tl,t2,t);
if(topl< >tl)or (top2< >t2)then ERR(ch2);
inst(t)
end;
procedure checknot;
begin
outst(t); if t< > bool then ERR(ch3); inst(t)
end;
Правила, расширенные семантическим анализом,
принимают вид:
Е:: = Е1 | El [ - ] <instl> El
<checkop>
El:: = Т {[ ∪ ] <instl> T <checkop>}
T:: = F {[ ∩ ] <instl> F<checkop>}
F:: = I <checkid> | N <inst(int)> | [false,true] < inst (bool)>|
¬F <checknot>| (E)
Проверим правильность порядка операций x+5*y в
соответствии с рисунком 4.1.
int
int
+
int
int
*
int
+
int
y
5
FF
X
F
TTT T
E1
E
Рисунок 4.1 – Семантическое дерево выражения x+5*y
4.4 Пpовeрка типов операторах
В операторе присваивания проверяется одинаковость типов
слева и справа от символа ":=",а в операторах условном и цикла про-
веряется булевость выражения Е.
Это достигается включением в правило S процедур:
22
outst (kop2); outst(op); outst(topl);
gettype(op,tl,t2,t);
if(topl< >tl)or (top2< >t2)then ERR(ch2);
inst(t)
end;
procedure checknot;
begin
outst(t); if t< > bool then ERR(ch3); inst(t)
end;
Правила, расширенные семантическим анализом,
принимают вид:
Е:: = Е1 | El [ - ] El
El:: = Т {[ ∪ ] T }
T:: = F {[ ∩ ] F}
F:: = I | N | [false,true] < inst (bool)>|
¬F | (E)
Проверим правильность порядка операций x+5*y в
соответствии с рисунком 4.1.
E int + int * int
E1 int + int
int
TT T
F
F F
X
5 y
Рисунок 4.1 – Семантическое дерево выражения x+5*y
4.4 Пpовeрка типов операторах
В операторе присваивания проверяется одинаковость типов
слева и справа от символа ":=",а в операторах условном и цикла про-
веряется булевость выражения Е.
Это достигается включением в правило S процедур:
22
Страницы
- « первая
- ‹ предыдущая
- …
- 17
- 18
- 19
- 20
- 21
- …
- следующая ›
- последняя »
