Dear all,

I think the problem 9 is so useful, that I typed a pseudocode
solution for it. (There may be some curlies missing; Pascal people,
notice that != means not equal, i.e. <>.)

Wilhelmiina
--------------------------------------------------------------------

Grammar:

E -> T+E|T-E|T
T -> F|F*T
F -> DN|(+DN)|(-DN)|(E)
N -> DN|epsilon
D -> 0|1|...|9

Calculator (as pseudocode):

function E {
op1=T;
if (next=='+') {     /* rule E -> T+E */
   next=getnext;
   op2=E;
   return op1+op2;
  }
else
  if (next=='-') {   /* rule E -> T-E */
    next=getnext;
    op2=E;
    return op1-op2;
  }
  else return op1;   /* rule E->T */
}


function T {
op1=F;
if (next=='*') {    /* rule T -> F*T */
   next=getnext;
   op2=T;
   return op1*op2;
   }
else return op1;      /* rule T -> F */
}

function F {
if isdigit(next) {      /* rule F -> DN */
   op=readnumber;
   next=getnext;
   return op;
   }
else
  if (next=='(') {
     next=getnext;
     if (next=='+') {      /* rule F -> (+DN) */
	op=readnumber;
	if (next!=')') ERROR;
	next=getnext;
	return op;
	}
     else {               /* rule F -> (-DN) */
       if (next=='-') {
       next=getnext;
       op=readnumber;
       if (next!=')') ERROR;
       next=getnext;
       return -1*op;
       }
       else {              /* rule F -> (E) */
         next=getnext;
	 op=E;
	 if (next!=')') ERROR;
	 next=getnext;
	 return op;
	 }
     }
   }
   else ERROR;
}