(* adapted to Oberon-07 by 0CodErr, KolibriOS team *) (* Example program from Programming In Modula-2, N. Wirth., pg. 56, *) (* - no WINDOWS in this example *) (* this program translates a small language into postfix form * the language is * * expression = term { [ "+" | "-" ] term } * * term = factor { [ "*" | "/" ] factor } * * factor = letter | "(" expression ")" * * letter = "a" | 'b" | … | "z" * * try as input * a+b * a*b+c * a+b*c * a*(b/(c-d)) *) MODULE Postfix; IMPORT In, Out; CONST OUT_LINE_SIZE = 80; IN_LINE_SIZE = 80; VAR ch : CHAR; i, index : INTEGER; out_line : ARRAY OUT_LINE_SIZE OF CHAR; in_line : ARRAY IN_LINE_SIZE OF CHAR; cur_ch : INTEGER; PROCEDURE NextChar(): CHAR; BEGIN INC(cur_ch); RETURN in_line[cur_ch - 1] END NextChar; (* -------------------------------------- *) PROCEDURE expression; VAR addop :CHAR; (* ------------------------------------ *) PROCEDURE term; VAR mulop :CHAR; (* --------------------------------- *) PROCEDURE factor; BEGIN (* factor *) IF ch = "(" THEN ch := NextChar(); expression; WHILE ch # ")" DO ch := NextChar(); END (* WHILE *) ELSE WHILE (ch < "a") OR (ch > "z") DO ch := NextChar(); END; (* WHILE *) out_line[index] := ch; index := index + 1; END; (* IF *) ch := NextChar(); END factor; BEGIN (* term *) factor; WHILE (ch = "*") OR (ch = "/") DO mulop := ch; ch := NextChar(); factor; out_line[index] := mulop; index := index + 1 END; (* WHILE *) END term; BEGIN (* expression *) term; WHILE (ch = "+") OR (ch = "-") DO addop := ch; ch := NextChar(); term; out_line[index] := addop; index := index + 1 END; (* WHILE *) END expression; BEGIN (* Postfix *) In.Open; Out.Open; index := 1; cur_ch := 0; Out.String("Enter expression:"); In.String(in_line); ch := NextChar(); WHILE ch > " " DO expression; FOR i := 1 TO index - 1 DO Out.Char(out_line[i]); END; (* FOR *) Out.Ln; index := 1; cur_ch := 0; Out.String("Enter expression:"); In.String(in_line); ch := NextChar(); END; (* WHILE *) END Postfix.