| ANSWER TO EXERCISE 70 | |
|
First we must decide how to store floating-point numbers internally: in this case we'll simply store 100x to represent x, so that "5.46'' will be parsed as 546.
[ DigitNumber n type x;
x = NextWordStopped(); if (x==-1) return -1; wn--;
if (type==0)
{ x = WordAddress(wn);
if (x->n>='0' && x->n<='9') return (x->n) - '0';
return -1;
}
if (x=='nought' or 'oh') { wn++; return 0; }
x = TryNumber(wn++); if (x==-1000 x>=10) x=-1; return x;
];
[ FloatingPoint a x b w d1 d2 d3 type;
a = TryNumber(wn++);
if (a==-1000) return -1;
w = NextWordStopped(wn); if (w==-1) return a*100;
x = NextWordStopped(wn); if (x==-1) return -1; wn--;
if (w=='point') type=1;
else
{ if (WordAddress(wn-1)->0~='.' WordLength(wn-1)~=1)
return -1;
}
d1 = DigitNumber(0,type);
if (d1==-1) return -1;
d2 = DigitNumber(1,type); d3 = DigitNumber(2,type);
b=d1*10; if (d2>=0) b=b+d2; else d3=0;
if (type==1)
{ x=1; while (DigitNumber(x,type)>=0) x++; wn--;
}
else wn++;
parsed_number = a*100 + b;
if (d3>=5) parsed_number++;
return 1;
];
|