Siehe auch [[jail:lexer]], [[jail:parser]] ====== Interpreter ====== The parser has finally generated a rooted, structured AST tree. Token('CODE_BLOCK', 'CODE_BLOCK') Token('ASSIGN', '=') Token('VARIABLE', 'a') Token('INTEGER', '1') Token('ASSIGN', '=') Token('VARIABLE', 'b') Token('INTEGER', '2') The interpreter traverses the tree and visits each node. If its for example an ASSIGN token, there has to be 2 children – the variable name and the value which should be stored. This is the most important part. It is where variables get created and managed. class Interpreter { private: Parser parser; public: Interpreter(Parser _parser) { parser = _parser; } ~Interpreter() {}; Token interpret() { ASTNode tree = parser.parse(); return visit(tree); } Token visit(ASTNode node) { if(node._token()._type() == EMPTY) { return Token(INTEGER, "0"); } else if(node._token()._type() == CODE_BLOCK) { Token token; for(auto it = node.child.begin(); it != node.child.end(); it++) { token = visit(**it); } return token; } else if(node._token()._type() == INTEGER) { return node._token(); } else if (node._token()._type() == ASSIGN) { Token token = visit(*node.child[1]); if (token._type() == INTEGER) { int i = 0; try { i = stoi(token._value()); } catch(...) { return Token(INTEGER, "1"); // indicating error } printf("Assigning Integer %d\n", i ); } } return Token(INTEGER, "0"); } };