isoexpr.atg 1.3 KB

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