User guide
13.5. LAMBDA EVALUATOR 219
AND prim() = VALOF
{ LET a = TABLE Num, 0
SWITCHON token INTO
{ DEFAULT: writef("Bad expression*n"); ENDCASE
CASE Id: a := mk2(Id, lexval); ENDCASE
CASE Num: a := mk2(Num, lexval); ENDCASE
CASE Y: RESULTIS mk2(Y, nexp(6))
CASE Lam: lex()
UNLESS token=Id DO writes("Id expected*n")
a := lexval
RESULTIS mk3(Lam, a, nexp(0))
CASE Lparen: a := nexp(0)
UNLESS token=Rparen DO writef("’)’ expected*n")
lex()
RESULTIS a
CASE Add: RESULTIS mk2(Pos, nexp(3))
CASE Sub: RESULTIS mk2(Neg, nexp(3))
}
lex()
RESULTIS a
}
AND nexp(n) = VALOF { lex(); RESULTIS exp(n) }
AND exp(n) = VALOF
{ LET a, b = prim(), ?
{ SWITCHON token INTO
{ DEFAULT: BREAK
CASE Lparen:
CASE Num:
CASE Id: UNLESS n<6 BREAK
a := mk3(Ap, a, exp(6)); LOOP
CASE Mul: UNLESS n<5 BREAK
a := mk3(Mul, a, nexp(5)); LOOP
CASE Div: UNLESS n<5 BREAK
a := mk3(Div, a, nexp(5)); LOOP
CASE Add: UNLESS n<4 BREAK
a := mk3(Add, a, nexp(4)); LOOP
CASE Sub: UNLESS n<4 BREAK
a := mk3(Sub, a, nexp(4)); LOOP
CASE Eq: UNLESS n<3 BREAK
a := mk3(Eq, a, nexp(3)); LOOP
CASE Cond: UNLESS n<1 BREAK
b := nexp(0)
UNLESS token=Comma DO writes("Comma expected*n")
a := mk4(Cond, a, b, nexp(0)); LOOP
}
} REPEAT
RESULTIS a
}