[BACK]Return to parser.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / parse

File: [local] / OpenXM_contrib2 / asir2000 / parse / parser.c (download)

Revision 1.1, Fri Dec 3 07:39:12 1999 UTC (24 years, 5 months ago) by noro
Branch: MAIN

Initial revision

/* $OpenXM: OpenXM_contrib2/asir2000/parse/parser.c,v 1.1 1999/12/03 07:39:12 noro Exp $ */
#include <ctype.h>
#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();
		}
	}
}