+E : E "||" E {$$.c = $1.c;
+ $$.c=abc_dup($$.c);
+ code_t*jmp = $$.c = abc_iftrue($$.c, 0);
+ $$.c=abc_pop($$.c);
+ $$.c = code_append($$.c,$3.c);
+ code_t*label = $$.c = abc_label($$.c);
+ jmp->branch = label;
+ $$.t = join_types($1.t, $3.t, 'O');
+ }
+E : E "&&" E {$$.c = $1.c;
+ $$.c=abc_dup($$.c);
+ code_t*jmp = $$.c = abc_iffalse($$.c, 0);
+ $$.c=abc_pop($$.c);
+ $$.c = code_append($$.c,$3.c);
+ code_t*label = $$.c = abc_label($$.c);
+ jmp->branch = label;
+ $$.t = join_types($1.t, $3.t, 'A');
+ }
+
+E : '!' E {$$.c=$2.c;
+ $$.c = abc_not($$.c);
+ $$.t = TYPE_BOOLEAN;
+ }
+