Ablexec.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. //===========================================================================//
  2. // Copyright (C) Microsoft Corporation. All rights reserved. //
  3. //===========================================================================//
  4. //***************************************************************************
  5. //
  6. // EXECUTOR.H
  7. //
  8. //***************************************************************************
  9. #ifndef ABLEXEC_H
  10. #define ABLEXEC_H
  11. #ifndef ABLGEN_H
  12. #include "ablgen.h"
  13. #endif
  14. #ifndef ABLSYMT_H
  15. #include "ablsymt.h"
  16. #endif
  17. #ifndef ABLPARS_H
  18. #include "ablparse.h"
  19. #endif
  20. //***************************************************************************
  21. #define STATEMENT_MARKER 0x70
  22. #define ADDRESS_MARKER 0x71
  23. //***************************************************************************
  24. //--------------
  25. // ABL Parameter
  26. #define ABL_PARAM_VOID 0
  27. #define ABL_PARAM_INTEGER 1
  28. #define ABL_PARAM_REAL 2
  29. typedef enum {
  30. ABL_STACKITEM_CHAR,
  31. ABL_STACKITEM_INTEGER,
  32. ABL_STACKITEM_REAL,
  33. ABL_STACKITEM_BOOLEAN,
  34. ABL_STACKITEM_CHAR_PTR,
  35. ABL_STACKITEM_INTEGER_PTR,
  36. ABL_STACKITEM_REAL_PTR,
  37. ABL_STACKITEM_BOOLEAN_PTR,
  38. NUM_ABL_STACKITEMS
  39. } ABLStackItemType;
  40. typedef struct {
  41. char type;
  42. long integer;
  43. float real;
  44. } ABLParam;
  45. typedef ABLParam* ABLParamPtr;
  46. //---------------
  47. // RUN-TIME STACK
  48. typedef union {
  49. long integer;
  50. float real;
  51. unsigned char byte;
  52. Address address;
  53. } StackItem;
  54. typedef StackItem* StackItemPtr;
  55. typedef struct {
  56. long type;
  57. union {
  58. long integer;
  59. float real;
  60. bool boolean;
  61. char character;
  62. long* integerPtr;
  63. float* realPtr;
  64. bool* booleanPtr;
  65. char* characterPtr;
  66. } data;
  67. } ABLStackItem;
  68. typedef ABLStackItem* ABLStackItemPtr;
  69. typedef struct {
  70. StackItem functionValue;
  71. StackItem staticLink;
  72. StackItem dynamicLink;
  73. StackItem returnAddress;
  74. } StackFrameHeader;
  75. typedef StackFrameHeader* StackFrameHeaderPtr;
  76. //***************************************************************************
  77. #if 0
  78. //class ABLmodule {
  79. // public:
  80. // SymTableNodePtr moduleIdPtr;
  81. // public:
  82. //};
  83. #endif
  84. //***************************************************************************
  85. extern char* codeBuffer;
  86. extern char* codeBufferPtr;
  87. extern char* codeSegmentPtr;
  88. extern char* codeSegmentLimit;
  89. extern char* statementStartPtr;
  90. extern TokenCodeType codeToken;
  91. extern long execLineNumber;
  92. extern long execStatementCount;
  93. extern StackItem* stack;
  94. extern StackItemPtr tos;
  95. extern StackItemPtr stackFrameBasePtr;
  96. //***************************************************************************
  97. //----------
  98. // FUNCTIONS
  99. SymTableNodePtr getSymTableCodePtr (void);
  100. TypePtr execRoutineCall (void);
  101. TypePtr execExpression (void);
  102. TypePtr execVariable (void);
  103. //*************************
  104. // CRUNCH/DECRUNCH routines
  105. //*************************
  106. void crunchToken (void);
  107. void crunchSymTableNodePtr (SymTableNodePtr nodePtr);
  108. void crunchStatementMarker (void);
  109. void uncrunchStatementMarker (void);
  110. char* crunchAddressMarker (Address address);
  111. char* fixupAddressMarker (Address address);
  112. void crunchInteger (long value);
  113. void crunchByte (unsigned char value);
  114. void crunchOffset (Address address);
  115. char* createCodeSegment (long& codeSegmentSize);
  116. SymTableNodePtr getCodeSymTableNodePtr (void);
  117. long getCodeStatementMarker (void);
  118. char* getCodeAddressMarker (void);
  119. long getCodeInteger (void);
  120. unsigned char getCodeByte (void);
  121. char* getCodeAddress (void);
  122. //***************
  123. // STACK routines
  124. //***************
  125. void pop (void);
  126. void getCodeToken (void);
  127. void pushInteger (long value);
  128. void pushReal (float value);
  129. void pushByte (char value);
  130. void pushAddress (Address address);
  131. void pushBoolean (bool value);
  132. void pushStackFrameHeader (long oldLevel, long newLevel);
  133. void allocLocal (TypePtr typePtr);
  134. void freeData (SymTableNodePtr idPtr);
  135. //*****************************
  136. // FUNCTION ENTRY/EXIT routines
  137. //*****************************
  138. void routineEntry (SymTableNodePtr routineIdPtr);
  139. void routineExit (SymTableNodePtr routineIdPtr);
  140. void execute (SymTableNodePtr routineIdPtr);
  141. void executeChild (SymTableNodePtr routineIdPtr, SymTableNodePtr childRoutineIdPtr);
  142. //******************
  143. // EXECSTMT routines
  144. //******************
  145. void execStatement (void);
  146. void execAssignmentStatement (SymTableNodePtr idPtr);
  147. TypePtr execRoutineCall (SymTableNodePtr routineIdPtr, bool skipOrder);
  148. TypePtr execDeclaredRoutineCall (SymTableNodePtr routineIdPtr, bool skipOrder);
  149. void execActualParams (SymTableNodePtr routineIdPtr);
  150. void execCompoundStatement (void);
  151. void execCaseStatement (void);
  152. void execForStatement (void);
  153. void execIfStatement (void);
  154. void execRepeatStatement (void);
  155. void execWhileStatement (void);
  156. void execSwitchStatement (void);
  157. void execTransStatement (void);
  158. void execTransBackStatement (void);
  159. //******************
  160. // EXECEXPR routines
  161. //******************
  162. TypePtr execField (void);
  163. TypePtr execSubscripts (TypePtr typePtr);
  164. TypePtr execConstant (SymTableNodePtr idPtr);
  165. TypePtr execVariable (SymTableNodePtr idPtr, UseType use);
  166. TypePtr execFactor (void);
  167. TypePtr execTerm (void);
  168. TypePtr execSimpleExpression (void);
  169. TypePtr execExpression (void);
  170. //*****************
  171. // EXECSTD routines
  172. //*****************
  173. TypePtr execStandardRoutineCall (SymTableNodePtr routineIdPtr, bool skipOrder);
  174. //***************************************************************************
  175. #endif