count = count + 1
print "error is ", target - guess * guess
+ for j:=0; then j = j+3 ; while j < 10:
+ if j != 0 and then 20 / j > 3:
+ print "20 /", j," =", 20 / j
+ else:
+ print "I won't calculate 20 /", j
+ pi ::= 3.1415926535897
+ if 355/113 == pi or else +(pi - 355/113) < 0.001:
+ print "Close enough"
+
###### output: cond_loop
Success
1 2 4 8 16 32 64
2 1.41422
3 1.41421
error is -4.51095e-12
+ I won't calculate 20 / 0
+ 20 / 3 = 6.66667
+ 20 / 6 = 3.33333
+ I won't calculate 20 / 9
+ Close enough
## Say Hello
Boolean expressions. As I haven't implemented precedence in the
parser generator yet, we need different names for each precedence
level used by expressions. The outer most or lowest level precedence
-are Boolean `or` `and`, and `not` which form an `Expression` out of `BTerm`s
-and `BFact`s.
+are Boolean operators which form an `Expression` out of `BTerm`s and
+`BFact`s. As well as `or` `and`, and `not` we have `and then` and `or
+else` which only evaluate the second operand if the result would make
+a difference.
###### Binode types
And,
+ AndThen,
Or,
+ OrElse,
Not,
###### Grammar
b->right = $<3;
$0 = b;
} }$
+ | Expression or else BTerm ${ {
+ struct binode *b = new(binode);
+ b->op = OrElse;
+ b->left = $<1;
+ b->right = $<4;
+ $0 = b;
+ } }$
| BTerm ${ $0 = $<1; }$
BTerm -> BTerm and BFact ${ {
b->right = $<3;
$0 = b;
} }$
+ | BTerm and then BFact ${ {
+ struct binode *b = new(binode);
+ b->op = AndThen;
+ b->left = $<1;
+ b->right = $<4;
+ $0 = b;
+ } }$
| BFact ${ $0 = $<1; }$
BFact -> not BFact ${ {
printf(" and ");
print_exec(b->right, -1, 0);
break;
+ case AndThen:
+ print_exec(b->left, -1, 0);
+ printf(" and then ");
+ print_exec(b->right, -1, 0);
+ break;
case Or:
print_exec(b->left, -1, 0);
printf(" or ");
print_exec(b->right, -1, 0);
break;
+ case OrElse:
+ print_exec(b->left, -1, 0);
+ printf(" or else ");
+ print_exec(b->right, -1, 0);
+ break;
case Not:
printf("not ");
print_exec(b->right, -1, 0);
###### propagate binode cases
case And:
+ case AndThen:
case Or:
+ case OrElse:
case Not:
/* both must be Tbool, result is Tbool */
propagate_types(b->left, c, ok, Tbool, 0);
right = interp_exec(b->right);
rv.bool = rv.bool && right.bool;
break;
+ case AndThen:
+ rv = interp_exec(b->left);
+ if (rv.bool)
+ rv = interp_exec(b->right);
+ break;
case Or:
rv = interp_exec(b->left);
right = interp_exec(b->right);
rv.bool = rv.bool || right.bool;
break;
+ case OrElse:
+ rv = interp_exec(b->left);
+ if (!rv.bool)
+ rv = interp_exec(b->right);
+ break;
case Not:
rv = interp_exec(b->right);
rv.bool = !rv.bool;
a : number
a = A;
b:number = B
- if a > 0 and b > 0:
+ if a > 0 and then b > 0:
while a != b:
if a < b:
b = b - a