8.7. bool7 (1134683), страница 2
Текст из файла (страница 2)
RULE
BoolExpr ::= Ident
SEMANTICS
Code<0>=Sign<0>
? ”if (Val<1>==T) GOTO TrueLab<0>”
: ”if Val<1>==F) GOTO FalseLab<0>”.
В свою очередь, при генерации машинных команд это правило можно заменить на следующее:
RULE
BoolExpr ::= Ident
SEMANTICS
<TST Ident>;
Code<0>=Sign<0>
? ”BNE TrueLab<0>”
: ”BEQ FalseLab<0>”.
Если элементом логического выражения является сравнение, то генерируется команда, соответствующая знаку сравнения (beq для =, bne для <>, bge для >= и т.д.), если атрибут sign соответствующей вершины имеет значение true, и отрицание (bne для =, beq для <>, blt для >= и т.д.), если атрибут sign имеет значение false.
Приведем несколько примеров. Выражение A AND (B OR C) транслируется в последовательность команд рис. 8.25. Выражение (NOT((A==B)OR(!=D)))AND(NOT((E<F)AND(G>H))) транслируется в последовательность команд рис. 8.26.
TST A CMP A,B
BEQ False BEQ False
TST B CMP C,D
BNE True BNE False
TST C CMP E,F
BEQ False BGE False
True: CMP G,H
False:. . . BGT False
True:
False:
Рис. 8.25 Рис. 8.26
151