Exemplo n.º 1
0
static int arithcomp (char *s, char *t, int op, int w)
{
	long l, r;

	l = evalexp (s, w);
	r = evalexp (t, w);

	switch (op) {
	case EQ: return (l == r);
	case NE: return (l != r);
	case LT: return (l < r);
	case GT: return (l > r);
	case LE: return (l <= r);
	case GE: return (l >= r);
	}
	return (0);
}
Exemplo n.º 2
0
int main(int argc, char **argv){
	std::string evalexp(argv[1]);
	
	// Check input expression for unhandling symbols
	if(!checkExpression(evalexp)) return -1;

	// Clear expression from spaces
	for(uint i=0 ; i < evalexp.length(); i++){
		if(evalexp[i] == ' '){
			evalexp.erase(evalexp.begin() + i);
			if(i > 0) i--;
		}
	}
	std::cout << "Evaluating expression is: \"" << evalexp << "\"" << std::endl;

	std::cout << "Result is: " << evalExpression<int>(evalexp) << std::endl;
	return 0;
}
Exemplo n.º 3
0
void goto00(int i)                  /*  GO TO if i=1, else LABEL */
{
    ptr  p ;  symbl  oname ; register int  li ; int  gisav ;
    double  val ;
    
    if (i==0) {                                            /* LABEL */
	if (! runf) derror(22) ;
	if (warea[gi-5]==lf) goto L100 ;
	derror(79) ;                         /* not at start of line */
    }
    if (warea[gi]<'0' && warea[gi]!='(' || warea[gi]>'9') goto L100 ;
    
/* ------------------------------------------------------------------- */
                                            /* branch to line number   */
/* ------------------------------------------------------------------- */

    val=evalexp() ; if (errnum) derror(errnum) ;
    if (val<1 || val>maxlin) derror(13) ;    /* invalid line number */
    if (warea[gi]=='|') {
	if (warea[gi+1]!=vrem && warea[gi+1]!=chr11 &&
	    warea[gi+1]!=vendls) derror(81) ;
    }
    else if (warea[gi]!=lf) derror(33) ;         /* bad termination */
    
    li=linsiz+2 ;                                         /* search */
    do {
	if (BASE*warea[li]+warea[li+1]==(int) val) goto L8 ; /* found*/
	li+=warea[li+2] ;                     /* no, add line length */
    } while (li<endtxt) ;
    derror(68) ;                                       /* not found */
    
    L8 :   if (tracer>0) { if (tracer==2 || tracer==3 || tracer>=6) {
	printf("%c%s",'\33',"[7m") ;           /* ANSI reverse video */
	printf("%s%u%c","G:",lnumber,'\n') ;
	printf("%c%s",'\33',"[0m") ;           /* ANSI restore video */
    }}
    gi=li-1 ; return ;                 /* gi is on lf before target */
    
/* ------------------------------------------------------------------- */
    /* branch to symbolic label    */
/* ------------------------------------------------------------------- */
    
    L100 : p=getvar() ; if (errnum) derror(errnum) ;
    if (vartyp<=0) derror(82) ;                    /* illegal label */
    
    if (warea[gi]=='|') {                       /* faster than AND? */
	if (warea[gi+1]!=vrem) {
	    if (i==0) derror(62) ;                           /* LABEL */
	    if (warea[gi+1]!=chr11 && warea[gi+1]!=vendls) derror(81) ;
	}
    }                                                    /* if | */
    else if (warea[gi]!=lf) derror(33) ;         /* bad termination */
    
    if (p!=NULL) {                                  /* label exists */
	if (p->symtype!=5) derror(82) ;             /* illegal label */
	if (i==0) {                                         /* LABEL */
	    if (intval[p->valptr]!=gi) derror(82) ;      /* duplicate */
	    return ;                                /* skip the label */
	}
	gi=intval[p->valptr] ;                      /* execute GO TO */
	goto L10 ;
    }
    
    if (i==0) return ;                        /* new LABEL, skip it */
    
    gisav=gi ; /* GO TO, search for target label; save gi for error */
    
    strcpy(oname,symbol) ; li=linsiz+6 ; /* start after first token */
    while (li<endtxt) {                                   /* search */
	if (warea[li-1]==vlabel) {
	    gi=li ; p=getvar() ; if (errnum) derror(errnum) ;
	    li=gi ;
	    while (warea[li]!=lf) li++ ;            /* get to next lf */
	    if (strcmp(symbol,oname)==0) { gi=li ; goto L300 ; }
	    /* success */
	    li+=5 ;                          /* get behind next token */
	}
	else li+=warea[li-2] ;                    /* add line length */
    }                                                   /* while */
    gi=gisav ; derror(68) ;                 /* search failure at gi */
    
    L300 : if (gii+1>maxinvar) derror(41) ;
    p=(struct symnode*)malloc(sizeof(struct symnode)) ;
    p->SWITCH=TRUE ;                           /* install new label */
    p->link=hashtab[hashval] ;
    strcpy(p->name,symbol) ;
    p->symtype=5 ;
    hashtab[hashval]=p ;
    p->valptr=gii ;
    intval[gii++]=gi ;
    
    L10 :  
	if (tracer>0) {
	    if (tracer==2 || tracer==3 || tracer>=6) {
		printf("%c%s",'\33',"[7m") ;           /* ANSI reverse video */
		printf("%s%s%c","G: GO TO LABEL ",symbol,'\n') ;
		printf("%c%s",'\33',"[0m") ;           /* ANSI restore video */
	    }
	}
}            /* goto00 */
Exemplo n.º 4
0
void call(int i)                              /* CALL, INVOKE for i = 0, 1 */
{
    int  gkk, li, sym ;  double  val ;
    ptr  p, q, s ;   dsptr  r ;

    if (!runf) derror(22) ;
    p=getvar() ; if (errnum) derror(errnum) ;
    if (p==NULL) derror (201) ;                        /* undefined */
    /* defined, get parameters */
    sym=p->symtype ;                                   /* save type */
    if (i==0 && sym<8 || i>0 && sym!= -59) derror(201) ;
    p->SWITCH=FALSE ;                          /* prevent recursion */
    q=p ;          /* save pointer to procedure or macro definition */

    if (warea[++gi]==')') {                         /* done or ...  */
	if (p->next==NULL) goto L10 ; derror(56) ; }    /* ... mismatch */
    if (p->next==NULL) derror(56) ;                     /* mismatch */
    p=p->next ;                      /* else link to first argument */

    if (i>0) goto L85 ;                                   /* invoke */
    if (warea[gi]==';') {
	if (sym==8) goto L80 ; derror(56) ; } /* call */
    if (sym==8) derror(56) ;                            /* mismatch */

    li=0 ;                          /* call, count value parameters */
    L9 :   li++ ;
    p->SWITCH=TRUE ;                      /* turn local variable ON */
    if (p->symtype==1) relval[p->valptr]=evalexp() ;        /* REAL */
    else if (p->symtype==3)                              /* COMPLEX */
	cvalexp(relval[p->valptr],relval[p->valptr+1]) ;
    else {
	val=evalexp() ;if (errnum) derror(errnum) ;       /* INTEGER */
	if (val>maxint || -val>maxint) derror(20) ;
	intval[p->valptr]=(int) val ;
    }
    if (errnum) derror(errnum) ;

    if (warea[gi]==')') {
	if (p->next==NULL) goto L10 ; derror(56) ; }    /* done */
    if (p->next==NULL) derror(56) ;                     /* mismatch */
    p=p->next ;                       /* else link to next argument */

    if (warea[gi]==';') {               /* no more value parameters */
	if (sym==8+li) goto L80 ; derror(56) ; }
    if (warea[gi]==',') { gi++ ; goto L9 ; } derror(56) ;   /* next */

    L80 :  gi++ ;             /* skip ';' or ',', deal with VAR parameters */
    L85 :  p->SWITCH=TRUE;                       /* turn local variable ON */
    gkk=gi ; s=getvar() ;                     /* might be an array! */
    if (errnum) {
	if (errnum==73) {
	    errnum=0 ;
	    gi=gkk ; start=1 ; s=getvar() ; start=0 ;
	    if (errnum) derror(errnum) ;
	    if (s==NULL || s->symtype!= -1) derror(196) ;
	    p->valptr=s->valptr ;               /* pass array address */
	    goto L87 ;
	}
	derror(errnum) ;
    }

    /*$$*/ if (s==NULL) s=instal() ;             /* no array, install REAL */

    if (s->symtype== -1 && p->symtype==1) goto L90 ;
    if (s->symtype!=p->symtype && s->symtype!= -p->symtype) derror(56) ;
    /* no match */
    L90 :  if (s->symtype>0) p->valptr=s->valptr ;    /* pass by reference */
    else {
	if (s->symtype== -1)                         /* relval index */
	    p->valptr=intval[intval[s->valptr]+s->valptr+1]+getsub(s) ;
	else if (s->symtype== -2)                    /* intval index */
	    p->valptr=intval[s->valptr]+s->valptr+1+getsub(s) ;
	else p->valptr=intval[intval[s->valptr]+s->valptr+1]+2*getsub(s) ;
    }

    L87 :  if (warea[gi]==')') {
	if (p->next==NULL) goto L10 ; derror(56) ; }
    if (p->next==NULL) derror(56) ;
    p=p->next ;

    if (warea[gi]==',') goto L80 ;            /* next VAR parameter */
    derror(33) ;                                 /* bad termination */

    L10 :  gi++ ;                                                /* skip ) */
    /* control stack for return */

    r= (struct dstak*) malloc(sizeof(struct dstak)) ;
    r->head='C' ;
    r->cvar=q ;
    r->radd=gi ;                                      /* on lf or | */
    r->dslink=stktop ;
    stktop=r ;
    flag1=TRUE ;                     /* prevents nested definitions */
    gi=q->valptr ;                              /* go to subroutine */

    if (tracer>0) {
	if (tracer==2 || tracer==3 || tracer>=6) {
	    printf("%c%s",'\33',"[7m") ;        /* ANSI reverse video */
	    printf("%s%s%c","G: EXECUTING PROCEDURE ",q->name,'\n') ;
	    printf("%c%s",'\33',"[0m") ;        /* ANSI restore video */
	}
    }
}                                                       /* call */
int main(int argc, const char *argv[]) {
    /**
     * Test 1
     */
    struct exp *e1, *e2;
    struct explist *l;

    l = NULL;
    l = cons(mkconstant(5), l);
    l = cons(mkconstant(3), l);
    l = cons(mkconstant(2), l);
    e1 = mkopapp(isplus, l);

    l = NULL;
    l = cons(mkvar("x"), l);
    l = cons(mkvar("x"), l);
    l = cons(mkvar("x"), l);
    e2 = mkopapp(ismult, l);

    e1 = mklet("x", e1, e2);

    printf("%d\n", evalexp(e1)); // should print  1000

    /**
     * Test 2
     */
    struct exp *e3, *e4, *e5;

    l = NULL;
    l = cons(mkconstant(5), l);
    l = cons(mkconstant(3), l);
    l = cons(mkconstant(2), l);
    e1 = mkopapp(isplus, l);

    l = NULL;
    l = cons(mkvar("y"), l);
    l = cons(mkvar("x"), l);
    l = cons(mkvar("z"), l);
    e2 = mkopapp(ismult, l);

    e3 = mklet("x", e1, e2);

    e4 = mklet("y", mkconstant(5), e3);

    e5 = mklet("z", mkconstant(40), e4);

    printf("%d\n", evalexp(e5)); // should print 2000

    /**
     * Test 3
     */
    l = NULL;
    l = cons(mkconstant(3), l);
    l = cons(mkvar("x"), l);
    e2 = mkopapp(isplus, l);

    l = NULL;
    l = cons(mkconstant(9), l);
    l = cons(mkvar("x"), l);
    e5 = mkopapp(isplus, l);

    e4 = mklet("x", mkconstant(4), e5);

    l = NULL;
    l = cons(e4, l);
    l = cons(mkvar("x"), l);
    e3 = mkopapp(isplus, l);

    e1 = mklet("x", mklet("x", mkconstant(2), e2), e3);

    printf("%d\n", evalexp(e1)); // should print 18

    return 0;
}