expr.atg 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. COMPILER Expr
  2. (* Simple four-function calculator - FileIO library required *)
  3. PROCEDURE GetNumber (VAR Int : INTEGER);
  4. (* Convert latest token to integer value Int *)
  5. VAR
  6. I : CARDINAL;
  7. String : ARRAY [0 .. 20] OF CHAR;
  8. BEGIN
  9. ExprS.GetString(ExprS.pos, ExprS.len, String);
  10. I := 0; Int := 0;
  11. WHILE String[I] # 0C DO
  12. Int := 10 * Int + VAL(INTEGER, ORD(String[I]) - ORD('0')); INC(I)
  13. END;
  14. END GetNumber;
  15. IGNORE CHR(1) .. CHR(15)
  16. CHARACTERS
  17. digit = "0123456789" .
  18. TOKENS
  19. num = digit {digit} .
  20. PRODUCTIONS
  21. Expr (. VAR r: INTEGER; .)
  22. = Expression <r> "=" (. IF Successful() THEN
  23. FileIO.WriteInt(FileIO.con, r, 4)
  24. END .) .
  25. Expression <VAR e: INTEGER> (. VAR t: INTEGER; .)
  26. = Term <e>
  27. { '+' Term <t> (. e := e + t .)
  28. | '-' Term <t> (. e := e - t .)
  29. }.
  30. Term <VAR t: INTEGER> (. VAR f: INTEGER; .)
  31. = Factor <t>
  32. { '*' Factor <f> (. t := t * f .)
  33. | '/' Factor <f> (. t := t DIV f .)
  34. }.
  35. Factor <VAR f: INTEGER> =
  36. num (. GetNumber(f) .)
  37. | '(' Expression <f> ')'.
  38. END Expr.