/* A simple calculator. * * Accepts expressions of the form: * 1+1 * 2*3-4 * (5+6)/7 * etc * * [Ant 19/10/2002] */ manycalcs = [ "\n", "calc", [], [ "fail", "calc" ] ]; calc = [ "read_prefix", [[], 0], "expr", [ "script", [ "declare", "a" ], [ "setparas", ["a"] ], [ "later", "writeln('=',%%);", "a" ] ], [ "fail", "calc_err" ] ]; func op_expr { para op, next; return [ "pivot", op, [ "expr", "expr" ], [ "ignore", ["bras"] ], [ "script", [ "declare", "a", "b" ], [ "setparas", ["a"], ["b"] ], [ "execute", "%% is %% " // op // " %%;", "v_paras[1]", "a", "b" ] ], [ "fail", next ] ]; } expr = op_expr("+", "expr2"); expr2 = op_expr("-", "expr3"); expr3 = op_expr("/", "expr4"); expr4 = op_expr("*", "expr5"); expr5 = [ "prefix", "(", "expr6", [ "script", [ "setparas", ["v_paras[1]"] ] ], [ "fail", "term" ] ]; expr6 = [ "suffix", ")", "expr", [ "script", [ "setparas", ["v_paras[1]"] ] ] ]; term = [ "read_all", [["0","9"]], [ "script", [ "later", "%% = $$;", "v_paras[1]", "v_substrs[1]" ] ] ]; calc_err = [ "read_all", [], [ "script", [ "execute", "writeln('calc: syntax error');" ] ] ]; installAOP("%calc","manycalcs");