Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
jail:interpreter [2024/07/19 00:42] 127.0.0.1 Externe Bearbeitung |
jail:interpreter [2025/07/10 11:55] (aktuell) jango |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | Siehe auch [[jail: | ||
+ | [[https:// | ||
+ | |||
+ | ====== Interpreter ====== | ||
+ | |||
+ | The parser has finally generated a rooted, structured AST tree. | ||
+ | |||
+ | < | ||
+ | Token(' | ||
+ | Token(' | ||
+ | Token(' | ||
+ | Token(' | ||
+ | Token(' | ||
+ | Token(' | ||
+ | Token(' | ||
+ | </ | ||
+ | |||
+ | 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. | ||
+ | |||
+ | <code c++> | ||
+ | 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, | ||
+ | } | ||
+ | | ||
+ | else if(node._token()._type() == CODE_BLOCK) { | ||
+ | |||
+ | Token token; | ||
+ | | ||
+ | for(auto it = node.child.begin(); | ||
+ | |||
+ | 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, | ||
+ | } | ||
+ | printf(" | ||
+ | | ||
+ | } | ||
+ | |||
+ | } | ||
+ | | ||
+ | return Token(INTEGER, | ||
+ | |||
+ | } | ||
+ | |||
+ | }; | ||
+ | </ |