COMPILER Expr (* Simple four-function calculator - ISO library required *) IMPORT SWholeIO; PROCEDURE GetNumber (VAR Int : INTEGER); (* Convert latest token to integer value Int *) VAR I : CARDINAL; String : ARRAY [0 .. 20] OF CHAR; BEGIN ExprS.GetString(ExprS.pos, ExprS.len, String); I := 0; Int := 0; WHILE String[I] # 0C DO Int := 10 * Int + VAL(INTEGER, ORD(String[I]) - ORD('0')); INC(I) END; END GetNumber; IGNORE CHR(1) .. CHR(15) CHARACTERS digit = "0123456789" . TOKENS num = digit {digit} . PRODUCTIONS Expr (. VAR r: INTEGER; .) = Expression "=" (. IF Successful() THEN SWholeIO.WriteInt(r, 4); END .) . Expression (. VAR t: INTEGER; .) = Term { '+' Term (. e := e + t .) | '-' Term (. e := e - t .) }. Term (. VAR f: INTEGER; .) = Factor { '*' Factor (. t := t * f .) | '/' Factor (. t := t DIV f .) }. Factor = num (. GetNumber(f) .) | '(' Expression ')'. END Expr.