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");
}
};