implement MathCalc; include "sys.m"; sys: Sys; include "draw.m"; draw: Draw; include "tk.m"; tk: Tk; include "bufio.m"; bufmod : Bufio; Iobuf : import bufmod; include "../lib/tcl.m"; include "tcllib.m"; MathCalc : module { init: fn(nil: ref Draw->Context, nil: list of string); }; init(nil: ref Draw->Context, nil: list of string) { sys = load Sys "$Sys"; draw = load Draw "$Draw"; cal := load TclLib "/dis/lib/tcl_calc.dis"; if (cal==nil){ sys->print("cal load %r\n"); exit; } bufmod = load Bufio Bufio->PATH; if (bufmod==nil){ sys->print("bufmod load %r\n"); exit; } iob := bufmod->fopen(sys->fildes(0),bufmod->OREAD); if (iob==nil){ sys->print("mathcalc: cannot open stdin for reading: %r\n"); return; } input : string; new_inp := "calc%"; sys->print("%s ", new_inp); while((input=iob.gets('\n'))!=nil){ input=input[0:len input -1]; if (input=="quit") exit; arr:=array[] of {input}; (i,msg):=cal->exec(nil,arr); if (msg!=nil) sys->print("%s\n",msg); sys->print("%s ", new_inp); } } # expr0 : expr1 # | expr0 '+' expr0 # | expr0 '-' expr0 # ; # # expr1 : expr2 # | expr1 '*' expr1 # | expr1 '/' expr1 # ; # # expr2 : '-' expr2 # | '+' expr2 # | expr3 # ; # # expr3 : INT # | REAL # ;