home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / p / pascal-.zip / pascal- / pascal.h < prev    next >
C/C++ Source or Header  |  1993-01-01  |  2KB  |  80 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define Variable(Level,Displ) \
  5.   {int x = b, l = Level; while (l--) x = St[x]; St[++s] = x + Displ; }
  6.  
  7. #define ValParam(Level,Displ) \
  8.   {int x = b, l = Level; while (l--) x = St[x]; St[++s] = St[x+2] + Displ; }
  9.  
  10. #define VarParam(Level,Displ) \
  11.   {int x = b, l = Level; while (l--) x = St[x]; St[++s] = St[St[x+2] + Displ]; }
  12.  
  13. #define Index(Lower,Upper,Length,LineNo) \
  14.   {int i = St[s--]; if (i<Lower || i>Upper) RangeErr(LineNo); \
  15.   St[s] += (i - Lower) * Length; }
  16.  
  17. #define Field(Displ) St[s] = St[s] + Displ;
  18.  
  19. #define Constant(Value) St[++s] = Value;
  20.  
  21. #define Value(Length) \
  22.   {int *p = St + s, *q = St + *p, i = Length; s += Length - 1; \
  23.   while (i--) *p++ = *q++; }
  24.  
  25. #define Less s--; St[s] = (St[s]<St[s+1]?1:0);
  26. #define Equal s--; St[s] = (St[s]==St[s+1]?1:0);
  27. #define Greater s--; St[s] = (St[s]>St[s+1]?1:0);
  28. #define NotLess s--; St[s] = (St[s]>=St[s+1]?1:0);
  29. #define NotEqual s--; St[s] = (St[s]!=St[s+1]?1:0);
  30. #define NotGreater s--; St[s] = (St[s]<=St[s+1]?1:0);
  31.  
  32. #define Add s--; St[s] += St[s+1];
  33. #define Subtract s--; St[s] -= St[s+1];
  34. #define Multiply s--; St[s] *= St[s+1];
  35. #define Divide s--; St[s] /= St[s+1];
  36. #define Modulo s--; St[s] %= St[s+1];
  37. #define Minus St[s] = -St[s];
  38.  
  39. #define And s--; St[s] &= St[s+1];
  40. #define Or s--; St[s] |= St[s+1];
  41. #define Not St[s] = 1 - St[s];
  42.  
  43. #define Assign(Length) \
  44.   s -= Length + 1; {int *p = St + St[s+1], *q = St + s+2, i = Length; \
  45.   while (i--) *p++ = *q++; }
  46.  
  47. #define DefAddr(Label) Label:
  48. #define Do(Label) if (!St[s--]) goto Label;
  49. #define Goto(Label) goto Label;
  50.  
  51. #define Read (void)scanf(" %d", &St[St[s--]]);
  52. #define Write (void)printf("%d\n", St[s--]);
  53.  
  54. #define ProcCall(Level,Label) \
  55.   {int x = b, l = Level; while (l--) x = St[x]; \
  56.   St[s+1] = x; St[s+2] = b; b = s + 1; (void)Label(); }
  57.  
  58. #define Procedure(ParLength,VarLength,TempLength,Label,Line) \
  59.   Label(){St[b+2] = b - ParLength; s += VarLength;
  60.  
  61. #define EndProc(Length) \
  62.   s = b - Length -1; b = St[b + 1]; return; }
  63.  
  64. #define Program(VarLength,TempLength,Line) \
  65.   main(){b = 0; s = VarLength - 1;
  66.  
  67. #define EndProg return 0; }
  68.  
  69. #define MaxStack 8192
  70.  
  71. void
  72. RangeErr(Line)
  73. int Line;
  74. {
  75.   (void)fprintf(stderr, "Index out of bounds at line %d\n", Line);
  76.   exit(1);
  77. }
  78.  
  79. static int St[MaxStack], b, s;
  80.