/* $OpenXM: OpenXM_contrib2/asir2000/parse/parser.c,v 1.1.1.1 1999/12/03 07:39:12 noro Exp $ */ #include #include "ca.h" #include "parse.h" extern int main_parser; extern char *parse_strp; extern SNODE parse_snode; extern FUNC parse_targetf; int mainparse(snodep) SNODE *snodep; { int ret; main_parser = 1; ret = yyparse(); *snodep = parse_snode; return ret; } int exprparse(f,str,exprp) FUNC f; char *str; FNODE *exprp; { char buf0[BUFSIZ]; char *buf; int i,n; char c; n = strlen(str); if ( n >= BUFSIZ ) buf = (char *)ALLOCA(n+1); else buf = buf0; for ( i = 0; ; i++, str++ ) { c = *str; if ( !c || c == '\n' ) { buf[i] = ';'; buf[i+1] = 0; break; } else buf[i] = c; } parse_strp = buf; parse_targetf = f; main_parser = 0; if ( yyparse() || !parse_snode || parse_snode->id != S_SINGLE ) { *exprp = 0; return 0; } else { *exprp = (FNODE)FA0(parse_snode); return 1; } } void read_eval_loop() { struct oEGT egt0,egt1; extern int prtime,prresult,ox_do_copy; SNODE snode; double r0,r1; double get_rtime(); extern Obj LastVal; LastVal = 0; while ( 1 ) { mainparse(&snode); nextbp = 0; get_eg(&egt0); r0 = get_rtime(); LastVal = evalstat(snode); storeans(LastVal); get_eg(&egt1); r1 = get_rtime(); if ( !ox_do_copy ) { if ( prresult ) { printexpr(CO,LastVal); putc('\n',asir_out); fflush(asir_out); } if ( prtime ) { printtime(&egt0,&egt1,r1-r0); } prompt(); } } }