home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 1 / ARM_CLUB_CD.iso / contents / apps / program / a / as1_23 / source / c / expr < prev    next >
Encoding:
Text File  |  1993-12-28  |  1.8 KB  |  98 lines

  1.  
  2. /*
  3.  * expr.c
  4.  * Copyright © 1992 Niklas Röjemo
  5.  */
  6.  
  7. #include "expr.h"
  8. #include "lex.h"
  9. #include "error.h"
  10. #include "global.h"
  11. #include "symbol.h"
  12. #include "code.h"
  13. #include "area.h"
  14.  
  15. static void expr(int pri);
  16.  
  17. static void prim(void)
  18. {
  19.   Lex lex = lexGetPrim();
  20.  
  21.   switch(lex.tag) {
  22.   case LexId:
  23.     codeSymbol(symbolGet(lex));
  24.     break;
  25.   case LexInt:
  26.     codeInt(lex.LexInt.value);
  27.     break;
  28.   case LexString:
  29.     codeString(lex.LexString.len,lex.LexString.str);
  30.     break;
  31.   case LexFloat:
  32.     codeFloat(lex.LexFloat.value);
  33.     break;
  34.   case LexStorage:
  35.     codeStorage();
  36.     break;
  37.   case LexPosition:
  38.     codePosition(areaCurrent);
  39.     break;
  40.   case LexOperator:
  41.     prim();
  42.     switch(lex.LexOperator.op) {
  43.       case Op_none: /* +expr */
  44.         break;
  45.       case Op_neg:      case Op_not:      case Op_lnot:
  46.       case Op_fattr:    case Op_fexec:    case Op_fload:     case Op_fsize: 
  47.         codeOperator(lex.LexOperator.op);
  48.         break;
  49.       default:
  50.         error(ErrorError,TRUE,"Illegal unop.");
  51.     }
  52.     break;
  53.   case LexDelim:
  54.     if(lex.LexDelim.delim == '(') {
  55.       expr(1);
  56.       lex = lexGetPrim();
  57.       if(lex.tag != LexDelim || lex.LexDelim.delim != ')')
  58.         error(ErrorError,TRUE,"Missing ')'");
  59.     } else if(lex.LexDelim.delim == ')') {
  60.       error(ErrorError,TRUE,"Missing '('.");
  61.     } else
  62.       error(ErrorError,TRUE,"Illegal deliminator '%c'.",lex.LexDelim.delim);
  63.     break;
  64.   default:
  65.     error(ErrorError,TRUE,"Illegal expression.");
  66.   }
  67. }
  68.  
  69. static void expr(int pri)
  70. {
  71.   Lex op;
  72.  
  73.   if(pri == 10)
  74.     prim();
  75.   else
  76.     expr(pri+1);
  77.  
  78.   while(lexNextPri() == pri) {
  79.     op = lexGetBinop();
  80.     if(pri == 10)
  81.       prim();
  82.     else
  83.       expr(pri+1);
  84.     codeOperator(op.LexOperator.op);
  85.   }
  86. }
  87.  
  88. void exprBuild(void)
  89. {
  90.   codeInit();
  91.   expr(1);
  92. }
  93.  
  94. Value exprEval(ValueTag legal)
  95. {
  96.   return codeEval(legal);
  97. }
  98.