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; }