Aseba  1.5.5
compiler.h
1 /*
2  Aseba - an event-based framework for distributed robot control
3  Copyright (C) 2007--2016:
4  Stephane Magnenat <stephane at magnenat dot net>
5  (http://stephane.magnenat.net)
6  and other contributors, see authors.txt for details
7 
8  This program is free software: you can redistribute it and/or modify
9  it under the terms of the GNU Lesser General Public License as published
10  by the Free Software Foundation, version 3 of the License.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU Lesser General Public License for more details.
16 
17  You should have received a copy of the GNU Lesser General Public License
18  along with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20 
21 #ifndef __ASEBA_COMPILER_H
22 #define __ASEBA_COMPILER_H
23 
24 #include <vector>
25 #include <deque>
26 #include <string>
27 #include <map>
28 #include <set>
29 #include <utility>
30 #include <istream>
31 
32 #include "errors_code.h"
33 #include "../common/types.h"
34 #include "../common/utils/FormatableString.h"
35 
36 namespace Aseba
37 {
42 
43  // pre-declaration
44  struct Node;
45  struct ProgramNode;
46  struct StatementNode;
47  struct BinaryArithmeticNode;
48  struct AssignmentNode;
49  struct TupleVectorNode;
51 
53  typedef std::map<std::wstring, std::pair<unsigned, unsigned> > VariablesMap;
55  typedef std::map<std::wstring, unsigned> FunctionsMap;
56 
59  {
62  {
63  NamedVariable(const std::wstring &name, unsigned size) : size(size), name(name) {}
64  NamedVariable() : size(0) {}
65 
66  unsigned size;
67  std::wstring name;
68  };
69 
71  struct LocalEvent
72  {
73  std::wstring name;
74  std::wstring description;
75  };
76 
79  {
80  NativeFunctionParameter(const std::wstring &name, int size) : size(size), name(name) {}
82 
83  int size;
84  std::wstring name;
85  };
86 
89  {
90  NativeFunction(const std::wstring &name, const std::wstring &description) : name(name), description(description) {}
91  NativeFunction() {}
92 
93  std::wstring name;
94  std::wstring description;
95  std::vector<NativeFunctionParameter> parameters;
96  };
97 
98  std::wstring name;
99  unsigned protocolVersion;
100 
101  unsigned bytecodeSize;
102  unsigned variablesSize;
103  unsigned stackSize;
104 
105  std::vector<NamedVariable> namedVariables;
106  std::vector<LocalEvent> localEvents;
107  std::vector<NativeFunction> nativeFunctions;
108 
109  TargetDescription() : protocolVersion(0), bytecodeSize(0), variablesSize(0), stackSize(0) { }
110  uint16 crc() const;
111  VariablesMap getVariablesMap(unsigned& freeVariableIndex) const;
112  FunctionsMap getFunctionsMap() const;
113  };
114 
117  {
118  BytecodeElement();
119  BytecodeElement(unsigned short bytecode) : bytecode(bytecode), line(0) { }
120  BytecodeElement(unsigned short bytecode, unsigned short line) : bytecode(bytecode), line(line) { }
121  operator unsigned short () const { return bytecode; }
122  unsigned getWordSize() const;
123 
124  unsigned short bytecode;
125  unsigned short line;
126  };
127 
129  struct BytecodeVector: std::deque<BytecodeElement>
130  {
132  BytecodeVector() : maxStackDepth(0), callDepth(0), lastLine(0) { }
133 
134  unsigned maxStackDepth;
135  unsigned callDepth;
136  unsigned lastLine;
137 
138  void push_back(const BytecodeElement& be)
139  {
140  std::deque<BytecodeElement>::push_back(be);
141  lastLine = be.line;
142  }
143 
144  void changeStopToRetSub();
145  unsigned short getTypeOfLast() const;
146 
148  typedef std::map<unsigned, unsigned> EventAddressesToIdsMap;
149  EventAddressesToIdsMap getEventAddressesToIds() const;
150  };
151 
152  // predeclaration
153  struct PreLinkBytecode;
154 
156  struct SourcePos
157  {
158  unsigned character;
159  unsigned row;
160  unsigned column;
161  bool valid;
162 
163  SourcePos(unsigned character, unsigned row, unsigned column) : character(character - 1), row(row), column(column - 1) { valid = true; }
164  SourcePos() : character(0), row(0), column(0), valid(false) { }
165  std::wstring toWString() const;
166  };
167 
170  {
171  public:
172  ErrorMessages();
173 
175  typedef const std::wstring (*ErrorCallback)(ErrorCode error);
177  static const std::wstring defaultCallback(ErrorCode error);
178  };
179 
181  struct Error
182  {
184  std::wstring message;
185  Error(const SourcePos& pos, const std::wstring& message) : pos(pos), message(message) { }
188  Error() { message = L"not defined"; }
189 
191  std::wstring toWString() const;
192  };
193 
194  struct TranslatableError : public Error
195  {
196  TranslatableError() : Error() {}
197  TranslatableError(const SourcePos& pos, ErrorCode error);
198  TranslatableError &arg(int value, int fieldWidth = 0, int base = 10, wchar_t fillChar = ' ');
199  TranslatableError &arg(long int value, int fieldWidth = 0, int base = 10, wchar_t fillChar = ' ');
200  TranslatableError &arg(unsigned value, int fieldWidth = 0, int base = 10, wchar_t fillChar = ' ');
201  TranslatableError &arg(float value, int fieldWidth = 0, int precision = 6, wchar_t fillChar = ' ');
202  TranslatableError &arg(const std::wstring& value);
203 
204  Error toError(void);
205  static void setTranslateCB(ErrorMessages::ErrorCallback newCB);
206 
207  static ErrorMessages::ErrorCallback translateCB;
208  WFormatableString message;
209  };
210 
212  typedef std::vector<std::wstring> VariablesNamesVector;
213 
215  struct NamedValue
216  {
218  NamedValue(const std::wstring& name, int value) : name(name), value(value) {}
219 
220  std::wstring name;
221  int value;
222  };
223 
226 
229 
231  struct NamedValuesVector: public std::vector<NamedValue>
232  {
233  bool contains(const std::wstring& s, size_t* position = 0) const;
234  };
235 
238 
241 
244  {
246  EventsDescriptionsVector events;
248  ConstantsDefinitions constants;
249 
251  void clear() { events.clear(); constants.clear(); }
252  };
253 
255  typedef std::vector<short int> VariablesDataVector;
256 
258  class Compiler
259  {
260  public:
262  struct Token
263  {
264  enum Type
265  {
266  TOKEN_END_OF_STREAM = 0,
267  TOKEN_STR_when,
268  TOKEN_STR_emit,
269  TOKEN_STR_hidden_emit,
270  TOKEN_STR_for,
271  TOKEN_STR_in,
272  TOKEN_STR_step,
273  TOKEN_STR_while,
274  TOKEN_STR_do,
275  TOKEN_STR_if,
276  TOKEN_STR_then,
277  TOKEN_STR_else,
278  TOKEN_STR_elseif,
279  TOKEN_STR_end,
280  TOKEN_STR_var,
281  TOKEN_STR_const,
282  TOKEN_STR_call,
283  TOKEN_STR_sub,
284  TOKEN_STR_callsub,
285  TOKEN_STR_onevent,
286  TOKEN_STR_abs,
287  TOKEN_STR_return,
288  TOKEN_STRING_LITERAL,
289  TOKEN_INT_LITERAL,
290  TOKEN_PAR_OPEN,
291  TOKEN_PAR_CLOSE,
292  TOKEN_BRACKET_OPEN,
293  TOKEN_BRACKET_CLOSE,
294  TOKEN_COLON,
295  TOKEN_COMMA,
296  TOKEN_ASSIGN,
297  TOKEN_OP_OR,
298  TOKEN_OP_AND,
299  TOKEN_OP_NOT,
300 
301  TOKEN_OP_EQUAL, // group of tokens, don't split or mess up
302  TOKEN_OP_NOT_EQUAL, //
303  TOKEN_OP_BIGGER, //
304  TOKEN_OP_BIGGER_EQUAL, //
305  TOKEN_OP_SMALLER, //
306  TOKEN_OP_SMALLER_EQUAL, //
307 
308  TOKEN_OP_ADD, // group of 2 tokens, don't split or mess up
309  TOKEN_OP_NEG, //
310  TOKEN_OP_MULT, // group of 3 tokens, don't split or mess up
311  TOKEN_OP_DIV, //
312  TOKEN_OP_MOD, //
313  TOKEN_OP_SHIFT_LEFT, // group of 2 tokens, don't split or mess up
314  TOKEN_OP_SHIFT_RIGHT, //
315  TOKEN_OP_BIT_OR, // group of 4 tokens, don't split or mess up
316  TOKEN_OP_BIT_XOR, //
317  TOKEN_OP_BIT_AND, //
318  TOKEN_OP_BIT_NOT, //
319 
320  TOKEN_OP_ADD_EQUAL, // group of 12 tokens, don't split or mess up
321  TOKEN_OP_NEG_EQUAL, //
322  TOKEN_OP_MULT_EQUAL, //
323  TOKEN_OP_DIV_EQUAL, //
324  TOKEN_OP_MOD_EQUAL, //
325  TOKEN_OP_SHIFT_LEFT_EQUAL, //
326  TOKEN_OP_SHIFT_RIGHT_EQUAL, //
327  TOKEN_OP_BIT_OR_EQUAL, //
328  TOKEN_OP_BIT_XOR_EQUAL, //
329  TOKEN_OP_BIT_AND_EQUAL, //
330 
331  TOKEN_OP_PLUS_PLUS,
332  TOKEN_OP_MINUS_MINUS
333 
334  } type;
335  std::wstring sValue;
336  int iValue;
338 
339  Token() : type(TOKEN_END_OF_STREAM), iValue(0) {}
340  Token(Type type, SourcePos pos = SourcePos(), const std::wstring& value = L"");
341  const std::wstring typeName() const;
342  std::wstring toWString() const;
343  operator Type () const { return type; }
344  };
345 
348  {
349  std::wstring name;
350  unsigned address;
351  unsigned line;
352 
353  SubroutineDescriptor(const std::wstring& name, unsigned address, unsigned line) : name(name), address(address), line(line) {}
354  };
356  typedef std::vector<SubroutineDescriptor> SubroutineTable;
358  typedef std::map<std::wstring, unsigned> SubroutineReverseTable;
360  typedef std::set<unsigned> ImplementedEvents;
362  typedef std::map<std::wstring, int> ConstantsMap;
364  typedef std::map<std::wstring, unsigned> EventsMap;
365 
366  friend struct AssignmentNode;
367  friend struct CallSubNode;
368 
369  public:
370  Compiler();
371  void setTargetDescription(const TargetDescription *description);
372  const TargetDescription *getTargetDescription() const { return targetDescription;}
373  const VariablesMap *getVariablesMap() const { return &variablesMap; }
374  const SubroutineTable *getSubroutineTable() const { return &subroutineTable; }
375  void setCommonDefinitions(const CommonDefinitions *definitions);
376  bool compile(std::wistream& source, BytecodeVector& bytecode, unsigned& allocatedVariablesCount, Error &errorDescription, std::wostream* dump = 0);
377  void setTranslateCallback(ErrorMessages::ErrorCallback newCB) { TranslatableError::setTranslateCB(newCB); }
378  static std::wstring translate(ErrorCode error) { return TranslatableError::translateCB(error); }
379  static bool isKeyword(const std::wstring& word);
380 
381  protected:
382  void internalCompilerError() const;
383  void expect(const Token::Type& type) const;
384  unsigned expectUInt12Literal() const;
385  unsigned expectUInt16Literal() const;
386  unsigned expectPositiveInt16Literal() const;
387  int expectAbsoluteInt16Literal(bool negative) const;
388  unsigned expectPositiveConstant() const;
389  int expectConstant() const;
390  unsigned expectPositiveInt16LiteralOrConstant() const;
391  int expectInt16Literal();
392  int expectInt16LiteralOrConstant();
393  unsigned expectGlobalEventId() const;
394  unsigned expectAnyEventId() const;
395  std::wstring eventName(unsigned eventId) const;
396  template <int length>
397  bool isOneOf(const Token::Type types[length]) const;
398  template <int length>
399  void expectOneOf(const Token::Type types[length]) const;
400 
401  void freeTemporaryMemory();
402  unsigned allocateTemporaryMemory(const SourcePos varPos, const unsigned size);
403  AssignmentNode* allocateTemporaryVariable(const SourcePos varPos, Node* rValue);
404 
405  VariablesMap::const_iterator findVariable(const std::wstring& name, const SourcePos& pos) const;
406  FunctionsMap::const_iterator findFunction(const std::wstring& name, const SourcePos& pos) const;
407  ConstantsMap::const_iterator findConstant(const std::wstring& name, const SourcePos& pos) const;
408  EventsMap::const_iterator findGlobalEvent(const std::wstring& name, const SourcePos& pos) const;
409  EventsMap::const_iterator findAnyEvent(const std::wstring& name, const SourcePos& pos) const;
410  SubroutineReverseTable::const_iterator findSubroutine(const std::wstring& name, const SourcePos& pos) const;
411  bool constantExists(const std::wstring& name) const;
412  void buildMaps();
413  void tokenize(std::wistream& source);
414  wchar_t getNextCharacter(std::wistream& source, SourcePos& pos);
415  bool testNextCharacter(std::wistream& source, SourcePos& pos, wchar_t test, Token::Type tokenIfTrue);
416  void dumpTokens(std::wostream &dest) const;
417  bool verifyStackCalls(PreLinkBytecode& preLinkBytecode);
418  bool link(const PreLinkBytecode& preLinkBytecode, BytecodeVector& bytecode);
419  void disassemble(BytecodeVector& bytecode, const PreLinkBytecode& preLinkBytecode, std::wostream& dump) const;
420 
421  protected:
422  Node* parseProgram();
423 
424  Node* parseStatement();
425 
426  Node* parseBlockStatement();
427 
428  Node* parseReturn();
429  void parseConstDef();
430  Node* parseVarDef();
431  AssignmentNode* parseVarDefInit(MemoryVectorNode* lValue);
432  Node* parseAssignment();
433  Node* parseIfWhen(bool edgeSensitive);
434  Node* parseFor();
435  Node* parseWhile();
436  Node* parseOnEvent();
437  Node* parseEmit(bool shorterArgsAllowed = false);
438  Node* parseSubDecl();
439  Node* parseCallSub();
440 
441  Node* parseOr();
442  Node* parseAnd();
443  Node* parseNot();
444 
445  Node* parseCondition();
446 
447  Node *parseBinaryOrExpression();
448  Node *parseBinaryXorExpression();
449  Node *parseBinaryAndExpression();
450 
451  Node* parseShiftExpression();
452  Node* parseAddExpression();
453  Node* parseMultExpression();
454  Node* parseUnaryExpression();
455  Node* parseFunctionCall();
456 
457  TupleVectorNode* parseTupleVector(bool compatibility = false);
458  Node* parseConstantAndVariable();
459  MemoryVectorNode* parseVariable();
460  unsigned parseVariableDefSize();
461  Node* tryParsingConstantExpression(SourcePos pos, int& constantResult);
462  int expectConstantExpression(SourcePos pos, Node* tree);
463 
464  protected:
465  std::deque<Token> tokens;
466  VariablesMap variablesMap;
467  ImplementedEvents implementedEvents;
468  FunctionsMap functionsMap;
469  ConstantsMap constantsMap;
470  EventsMap globalEventsMap;
471  EventsMap allEventsMap;
472  SubroutineTable subroutineTable;
473  SubroutineReverseTable subroutineReverseTable;
474  unsigned freeVariableIndex;
475  unsigned endVariableIndex;
478 
479  ErrorMessages translator;
480  }; // Compiler
481 
484  {
486  typedef std::map<unsigned, BytecodeVector> EventsBytecode;
487  EventsBytecode events;
488 
490  typedef std::map<unsigned, BytecodeVector> SubroutinesBytecode;
491  SubroutinesBytecode subroutines;
492 
494 
495  PreLinkBytecode();
496 
497  void fixup(const Compiler::SubroutineTable &subroutineTable);
498  };
499 
502 } // namespace Aseba
503 
504 #endif
505 
std::wstring name
name of the function
Definition: compiler.h:93
ConstantsDefinitions constants
All globally defined constants.
Definition: compiler.h:248
std::map< unsigned, BytecodeVector > SubroutinesBytecode
Map of routines id to routine bytecode.
Definition: compiler.h:490
std::vector< NativeFunction > nativeFunctions
native functions
Definition: compiler.h:107
std::vector< LocalEvent > localEvents
events available locally on target
Definition: compiler.h:106
std::wstring description
description (some short documentation) of the event
Definition: compiler.h:74
SubroutinesBytecode subroutines
bytecode for routines
Definition: compiler.h:491
A bytecode element.
Definition: compiler.h:116
Definition: compiler.h:194
FunctionsMap getFunctionsMap() const
Get a FunctionsMap out of nativeFunctions.
Definition: compiler.cpp:84
A name - value pair.
Definition: compiler.h:215
An abstract node of syntax tree.
Definition: tree.h:47
std::map< unsigned, BytecodeVector > EventsBytecode
Map of events id to event bytecode.
Definition: compiler.h:486
Return error messages based on error ID (needed to translate messages for other applications) ...
Definition: compiler.h:169
unsigned maxStackDepth
maximum depth of the stack used by all the computations of the bytecode
Definition: compiler.h:134
Generic vector of name - value pairs.
Definition: compiler.h:231
unsigned size
size of variable in words
Definition: compiler.h:66
int value
value part of the pair
Definition: compiler.h:221
Typed parameter of native functions.
Definition: compiler.h:78
std::set< unsigned > ImplementedEvents
Lookup table to keep track of implemented events.
Definition: compiler.h:360
int iValue
int version of the value, 0 if not applicable
Definition: compiler.h:336
std::wstring message
message
Definition: compiler.h:184
NamedValuesVector EventsDescriptionsVector
Vector of events descriptions.
Definition: compiler.h:237
std::vector< SubroutineDescriptor > SubroutineTable
Lookup table for subroutines id => (name, address, line)
Definition: compiler.h:356
std::vector< NamedVariable > namedVariables
named variables
Definition: compiler.h:105
Description of target VM native function.
Definition: compiler.h:88
std::vector< std::wstring > VariablesNamesVector
Vector of names of variables.
Definition: compiler.h:212
VariablesMap variablesMap
variables lookup
Definition: compiler.h:466
Description of local event;.
Definition: compiler.h:71
A token is a parsed element of inputs.
Definition: compiler.h:262
uint16 crc() const
Compute the XModem CRC of the description, as defined in AS001 at https://aseba.wikidot.com/asebaspecifications.
Definition: compiler.cpp:42
std::deque< Token > tokens
parsed tokens
Definition: compiler.h:465
Definition: analysis.cpp:26
EventsMap globalEventsMap
global-events map
Definition: compiler.h:470
ImplementedEvents implementedEvents
list of implemented events
Definition: compiler.h:467
Node for L"callsub" no children.
Definition: tree.h:284
unsigned callDepth
for callable bytecode (i.e.
Definition: compiler.h:135
std::map< std::wstring, int > ConstantsMap
Lookup table for constant name => value.
Definition: compiler.h:362
NamedValuesVector ConstantsDefinitions
Vector of constants definitions.
Definition: compiler.h:240
std::wstring name
node name
Definition: compiler.h:98
std::map< std::wstring, unsigned > FunctionsMap
Lookup table for functions (name => id in target description)
Definition: compiler.h:55
Node for accessing a memory as a vector, in read or write operations If write == true, will expand to StoreNode or ArrayWriteNode If write == false, will expand to LoadNode or ArrayReadNode children[0] is an optional index If children[0] is a TupleVectorNode of one elements (int), it will be foo[x] If children[0] is a TupleVectorNode of two elements (int), it will be foo[x:y] If children[0] is another type of node, it will be foo[whatever] If children[0] doesn&#39;t exist, access to the full array is considered.
Definition: tree.h:552
unsigned column
column in source text
Definition: compiler.h:160
const TargetDescription * targetDescription
description of the target VM
Definition: compiler.h:476
NamedValue EventDescription
An event description is a name - value pair.
Definition: compiler.h:225
unsigned bytecodeSize
total amount of bytecode space
Definition: compiler.h:101
unsigned row
line in source text
Definition: compiler.h:159
Description of target VM named variable.
Definition: compiler.h:61
Compilation error.
Definition: compiler.h:181
BytecodeVector * current
pointer to bytecode being constructed
Definition: compiler.h:493
FunctionsMap functionsMap
functions lookup
Definition: compiler.h:468
Aseba Event Scripting Language compiler.
Definition: compiler.h:258
const std::wstring(* ErrorCallback)(ErrorCode error)
Type of the callback.
Definition: compiler.h:175
SubroutineReverseTable subroutineReverseTable
subroutine reverse lookup
Definition: compiler.h:473
bool valid
true if character, row and column hold valid values
Definition: compiler.h:161
Error()
Create an empty error.
Definition: compiler.h:188
unsigned variablesSize
total amount of variables space
Definition: compiler.h:102
Node for assignation.
Definition: tree.h:134
const CommonDefinitions * commonDefinitions
common definitions, such as events or some constants
Definition: compiler.h:477
unsigned short line
bytecode itself
Definition: compiler.h:125
std::wstring name
name of the parameter
Definition: compiler.h:84
NamedValue ConstantDefinition
An constant definition is a name - value pair.
Definition: compiler.h:228
unsigned character
position in source text
Definition: compiler.h:158
std::map< std::wstring, std::pair< unsigned, unsigned > > VariablesMap
Lookup table for variables name => (pos, size))
Definition: compiler.h:50
Description of target VM.
Definition: compiler.h:58
unsigned short uint16
16 bits unsigned integer
Definition: types.h:36
EventsMap allEventsMap
all-events map
Definition: compiler.h:471
std::wstring name
name part of the pair
Definition: compiler.h:220
Description of a subroutine.
Definition: compiler.h:347
std::map< std::wstring, unsigned > SubroutineReverseTable
Reverse Lookup table for subroutines name => id.
Definition: compiler.h:358
std::vector< NativeFunctionParameter > parameters
for each argument of the function, its size in words or, if negative, its template ID ...
Definition: compiler.h:95
ConstantsMap constantsMap
constants map
Definition: compiler.h:469
int size
if > 0 size of the parameter, if < 0 template id, if 0 any size
Definition: compiler.h:83
Bytecode array in the form of a dequeue, for construction.
Definition: compiler.h:129
EventsBytecode events
bytecode for events
Definition: compiler.h:487
std::wstring name
name of the variable
Definition: compiler.h:67
NamedValue(const std::wstring &name, int value)
Create a filled pair.
Definition: compiler.h:218
std::wstring name
name of the event
Definition: compiler.h:73
Node for assembling values into an array children[x] is the x-th Node to be assembled.
Definition: tree.h:524
Definitions common to several nodes, such as events or some constants.
Definition: compiler.h:243
unsigned endVariableIndex
(endMemory - endVariableIndex) is pointing to the first free variable at the end
Definition: compiler.h:475
unsigned lastLine
last line added, normally equal *this[this->size()-1].line, but may differ for instance on loops ...
Definition: compiler.h:136
unsigned protocolVersion
version of the aseba protocol
Definition: compiler.h:99
unsigned freeVariableIndex
index pointing to the first free variable
Definition: compiler.h:474
std::wstring description
description (some short documentation) of the function
Definition: compiler.h:94
SourcePos pos
position of error in source string
Definition: compiler.h:183
SubroutineTable subroutineTable
subroutine lookup
Definition: compiler.h:472
std::wstring sValue
string version of the value
Definition: compiler.h:335
std::map< unsigned, unsigned > EventAddressesToIdsMap
A map of event addresses to identifiers.
Definition: compiler.h:148
Bytecode use for compilation previous to linking.
Definition: compiler.h:483
SourcePos pos
position of token in source code
Definition: compiler.h:337
std::vector< short int > VariablesDataVector
Vector of data of variables.
Definition: compiler.h:255
std::map< std::wstring, unsigned > EventsMap
Lookup table for event name => id.
Definition: compiler.h:364
void clear()
Clear all the content.
Definition: compiler.h:251
EventsDescriptionsVector events
All defined events.
Definition: compiler.h:246
BytecodeVector()
Constructor.
Definition: compiler.h:132
Position in a source file or string. First is line, second is column.
Definition: compiler.h:156
VariablesMap getVariablesMap(unsigned &freeVariableIndex) const
Get a VariablesMap out of namedVariables, overwrite freeVariableIndex.
Definition: compiler.cpp:70
unsigned stackSize
depth of execution stack
Definition: compiler.h:103