File: knuth3.k

package info (click to toggle)
kimwitu-doc 10a-3
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, sarge
  • size: 1,192 kB
  • ctags: 341
  • sloc: makefile: 166; yacc: 125; ansic: 40; lex: 18; sh: 2
file content (41 lines) | stat: -rw-r--r-- 1,039 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/* illustrating a multi-pass evaluation */
void pass1_number(number $n) {
    Nonfraction(b):	{ pass1_bitstring(b); }
    Fraction(b1, b2):	{ pass1_bitstring(b1);
			  pass1_bitstring(b2); }
}

void pass1_bitstring(bitstring $b) {
    Oneb:		{ b->length=1;}
    Moreb(bs, *):	{ pass1_bitstring(bs);
			  b->length=bs->length+1; }
}

/* pass1_bit omitted, it does nothing */

void pass2_number(number $n) {
    Nonfraction(b):	{ b->scale=0;
			  pass2_bitstring(b);
			  n->value= b->value; }
    Fraction(b1, b2):	{ b1->scale=0;
			  b2->scale= -b2->length;
			  pass2_bitstring(b1);
			  pass2_bitstring(b2);
			  n->value= b1->value+b2->value; }
}

void pass2_bitstring(bitstring $bs) {
    Oneb(b):		{ b->scale= bs->scale;
			  pass2_bit(b);
			  bs->value= b->value; }
    Moreb(b1, b2):	{ b2->scale= bs->scale;
			  b1->scale= bs->scale+1;
			  pass2_bitstring(b1);
			  pass2_bit(b2);
			  bs->value= b1->value + b2->value; }
}

void pass2_bit(bit $b) {
    One:		{ b->value= exp2((float)b->scale); }
    Zero:		{ b->value= 0.0; }
}