home *** CD-ROM | disk | FTP | other *** search
/ APDL Public Domain 1 / APDL_PD1A.iso / program / assembler / as / src / c / expr < prev    next >
Encoding:
Text File  |  1992-07-20  |  1.7 KB  |  97 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.         codeOperator(lex.LexOperator.op);
  47.         break;
  48.       default:
  49.         error(ErrorError,TRUE,"Illegal unop.");
  50.     }
  51.     break;
  52.   case LexDelim:
  53.     if(lex.LexDelim.delim == '(') {
  54.       expr(1);
  55.       lex = lexGetPrim();
  56.       if(lex.tag != LexDelim || lex.LexDelim.delim != ')')
  57.         error(ErrorError,TRUE,"Missing ')'");
  58.     } else if(lex.LexDelim.delim == ')') {
  59.       error(ErrorError,TRUE,"Missing '('.");
  60.     } else
  61.       error(ErrorError,TRUE,"Illegal deliminator '%c'.",lex.LexDelim.delim);
  62.     break;
  63.   default:
  64.     error(ErrorError,TRUE,"Illegal expression.");
  65.   }
  66. }
  67.  
  68. static void expr(int pri)
  69. {
  70.   Lex op;
  71.  
  72.   if(pri == 10)
  73.     prim();
  74.   else
  75.     expr(pri+1);
  76.  
  77.   while(lexNextPri() == pri) {
  78.     op = lexGetBinop();
  79.     if(pri == 10)
  80.       prim();
  81.     else
  82.       expr(pri+1);
  83.     codeOperator(op.LexOperator.op);
  84.   }
  85. }
  86.  
  87. void exprBuild(void)
  88. {
  89.   codeInit();
  90.   expr(1);
  91. }
  92.  
  93. Value exprEval(ValueTag legal)
  94. {
  95.   return codeEval(legal);
  96. }
  97.