postfix.ob07 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. (*
  2. adapted to Oberon-07 by 0CodErr, KolibriOS team
  3. *)
  4. (* Example program from Programming In Modula-2, N. Wirth., pg. 56, *)
  5. (* - no WINDOWS in this example *)
  6. (* this program translates a small language into postfix form
  7. * the language is
  8. *
  9. * expression = term { [ "+" | "-" ] term }
  10. *
  11. * term = factor { [ "*" | "/" ] factor }
  12. *
  13. * factor = letter | "(" expression ")"
  14. *
  15. * letter = "a" | 'b" | … | "z"
  16. *
  17. * try as input
  18. * a+b
  19. * a*b+c
  20. * a+b*c
  21. * a*(b/(c-d))
  22. *)
  23. MODULE postfix;
  24. IMPORT In, Out, Console;
  25. CONST
  26. OUT_LINE_SIZE = 80;
  27. IN_LINE_SIZE = 80;
  28. VAR
  29. ch : CHAR;
  30. i, index : INTEGER;
  31. out_line : ARRAY OUT_LINE_SIZE OF CHAR;
  32. in_line : ARRAY IN_LINE_SIZE OF CHAR;
  33. cur_ch : INTEGER;
  34. PROCEDURE NextChar(): CHAR;
  35. BEGIN
  36. INC(cur_ch)
  37. RETURN in_line[cur_ch - 1]
  38. END NextChar;
  39. PROCEDURE expression;
  40. VAR
  41. addop :CHAR;
  42. PROCEDURE term;
  43. VAR
  44. mulop :CHAR;
  45. PROCEDURE factor;
  46. BEGIN (* factor *)
  47. IF ch = "(" THEN
  48. ch := NextChar();
  49. expression;
  50. WHILE ch # ")" DO
  51. ch := NextChar()
  52. END (* WHILE *)
  53. ELSE
  54. WHILE (ch < "a") OR (ch > "z") DO
  55. ch := NextChar()
  56. END; (* WHILE *)
  57. out_line[index] := ch;
  58. index := index + 1
  59. END; (* IF *)
  60. ch := NextChar()
  61. END factor;
  62. BEGIN (* term *)
  63. factor;
  64. WHILE (ch = "*") OR (ch = "/") DO
  65. mulop := ch;
  66. ch := NextChar();
  67. factor;
  68. out_line[index] := mulop;
  69. index := index + 1
  70. END (* WHILE *)
  71. END term;
  72. BEGIN (* expression *)
  73. term;
  74. WHILE (ch = "+") OR (ch = "-") DO
  75. addop := ch;
  76. ch := NextChar();
  77. term;
  78. out_line[index] := addop;
  79. index := index + 1
  80. END (* WHILE *)
  81. END expression;
  82. BEGIN (* Postfix *)
  83. Console.open;
  84. index := 1; cur_ch := 0;
  85. Out.String("Enter expression:");
  86. In.String(in_line);
  87. ch := NextChar();
  88. WHILE ch > " " DO
  89. expression;
  90. FOR i := 1 TO index - 1 DO
  91. Out.Char(out_line[i])
  92. END; (* FOR *)
  93. Out.Ln;
  94. index := 1; cur_ch := 0;
  95. Out.String("Enter expression:");
  96. In.String(in_line);
  97. ch := NextChar()
  98. END; (* WHILE *)
  99. Console.exit(TRUE)
  100. END postfix.