Calculator: procedure options (main); /* 14 Sept. 2012 */ declare expression character (100) varying initial (''); declare ch character (1); declare (stack controlled, operand) float (18); declare in file input; open file (in) title ('/CALCULAT.DAT,type(text),recsize(100)'); on endfile (in) go to done; put ('Stack contents:'); main_loop: do forever; get file (in) edit (ch) (a(1)); expression = expression || ch; if ch = ' ' then iterate; select (ch); when ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') do; allocate stack; stack = ch; iterate main_loop; end; when ('+') do; operand = stack; free stack; stack = stack + operand; end; when ('-') do; operand = stack; free stack; stack = stack - operand; end; when ('*') do; operand = stack; free stack; stack = stack * operand; end; when ('/') do; operand = stack; free stack; stack = stack / operand; end; when ('^') do; operand = stack; free stack; stack = stack ** operand; end; end; call show_stack; end; done: put skip list ('The reverse polish expression = ' || expression); put skip list ('The evaluated expression = ' || stack); end Calculator;