home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / CPROG / AS11.ZIP / EVAL.C < prev    next >
Text File  |  1986-11-01  |  4KB  |  178 lines

  1. /*
  2.  *      eval --- evaluate expression
  3.  *
  4.  *      an expression is constructed like this:
  5.  *
  6.  *      expr ::=  expr + term |
  7.  *                expr - term ;
  8.  *                expr * term ;
  9.  *                expr / term ;
  10.  *                expr | term ;
  11.  *                expr & term ;
  12.  *                expr % term ;
  13.  *                expr ^ term ;
  14.  *
  15.  *      term ::=  symbol |
  16.  *                * |
  17.  *                constant ;
  18.  *
  19.  *      symbol ::=  string of alphanumerics with non-initial digit
  20.  *
  21.  *      constant ::= hex constant |
  22.  *                   binary constant |
  23.  *                   octal constant |
  24.  *                   decimal constant |
  25.  *                   ascii constant;
  26.  *
  27.  *      hex constant ::= '$' {hex digits};
  28.  *
  29.  *      octal constant ::= '@' {octal digits};
  30.  *
  31.  *      binary constant ::= '%' { 1 | 0 };
  32.  *
  33.  *      decimal constant ::= {decimal digits};
  34.  *
  35.  *      ascii constant ::= ''' any printing char;
  36.  *
  37.  */
  38. eval()
  39. {
  40.  int     left,right;     /* left and right terms for expression */
  41.  char    o;              /* operator character */
  42.  
  43. #ifdef DEBUG
  44.  printf("Evaluating %s\n",Optr);
  45. #endif
  46.  Force_byte = NO;
  47.  Force_word = NO;
  48.  if(*Optr=='<'){
  49.   Force_byte++;
  50.   Optr++;
  51.   }
  52.  else if(*Optr=='>'){
  53.   Force_word++;
  54.   Optr++;
  55.   }
  56.  left = get_term();         /* pickup first part of expression */
  57.  
  58.  while( is_op(*Optr)){
  59.   o = *Optr++; /* pickup connector and skip */
  60.   right = get_term();     /* pickup current rightmost side */
  61.   switch(o){
  62.    case '+': left += right; break;
  63.    case '-': left -= right; break;
  64.    case '*': left *= right; break;
  65.    case '/': left /= right; break;
  66.    case '|': left |= right; break;
  67.    case '&': left &= right; break;
  68.    case '%': left %= right; break;
  69.    case '^': left = left^right; break;
  70.    }
  71.   }
  72.  
  73.  Result= left;
  74. #ifdef DEBUG
  75.  printf("Result=%x\n",Result);
  76.  printf("Force_byte=%d  Force_word=%d\n",Force_byte,Force_word);
  77. #endif
  78.  return(YES);
  79. }
  80.  
  81. /*
  82.  *      is_op --- is character an expression operator?
  83.  */
  84. is_op(c)
  85. char c;
  86. {
  87.  if( any(c,"+-*/&%|^"))
  88.   return(YES);
  89.  return(NO);
  90. }
  91.  
  92.  
  93. /*
  94.  *      get_term --- evaluate a single item in an expression
  95.  */
  96. get_term()
  97. {
  98.  char    hold[MAXBUF];
  99.  char    *tmp;
  100.  int     val = 0;        /* local value being built */
  101.  int     minus;          /* unary minus flag */
  102.  struct nlist *lookup();
  103.  
  104.  if( *Optr == '-' ){
  105.   Optr++;
  106.   minus =YES;
  107.   }
  108.  else
  109.   minus = NO;
  110.  
  111.  while( *Optr == '#' ) Optr++;
  112.  
  113.  /* look at rest of expression */
  114.  
  115.  if(*Optr=='%'){ /* binary constant */
  116.   Optr++;
  117.   while( any(*Optr,"01"))
  118.    val = (val * 2) + ( (*Optr++)-'0');
  119.   }
  120.  else if(*Optr=='@'){ /* octal constant */
  121.   Optr++;
  122.   while( any(*Optr,"01234567"))
  123.    val = (val * 8) + ((*Optr++)-'0');
  124.   }
  125.  else if(*Optr=='$'){ /* hex constant */
  126.   Optr++;
  127.   while( any(*Optr,"0123456789abcdefABCDEF"))
  128.    if( *Optr > '9' )
  129.     val = (val * 16) + 10 + (mapdn(*Optr++)-'a');
  130.    else
  131.     val = (val * 16) + ((*Optr++)-'0');
  132.   }
  133.  else if( any(*Optr,"0123456789")){ /* decimal constant */
  134.   while(*Optr >= '0' && *Optr <= '9')
  135.    val = (val * 10) + ( (*Optr++)-'0');
  136.   }
  137.  else if(*Optr=='*'){    /* current location counter */
  138.   Optr++;
  139.   val = Old_pc;
  140.   }
  141.  else if(*Optr=='\''){   /* character literal */
  142.   Optr++;
  143.   if(*Optr == EOS)
  144.    val = 0;
  145.   else
  146.    val = *Optr++;
  147.   }
  148.  else if( alpha(*Optr) ){ /* a symbol */
  149.   tmp = hold;     /* collect symbol name */
  150.   while(alphan(*Optr))
  151.    *tmp++ = *Optr++;
  152.   *tmp = EOS;
  153.   if(lookup(hold) != NULL)
  154.    val = Last_sym;
  155.   else{
  156.    if(Pass==1){    /* forward ref here */
  157.     fwdmark();
  158.     if( !Force_byte )
  159.      Force_word++;
  160.     val = 0;
  161.     }
  162.    }
  163.   if(Pass==2 && Line_num==F_ref && Cfn==Ffn){
  164.    if( !Force_byte  )
  165.     Force_word++;
  166.    fwdnext();
  167.    }
  168.   }
  169.  else
  170.   /* none of the above */
  171.   val = 0;
  172.  
  173.  if(minus)
  174.   return(-val);
  175.  else
  176.   return(val);
  177. }
  178.