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