-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinterpreter.hpp
77 lines (66 loc) · 1.5 KB
/
interpreter.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <string>
#include <cctype>
#include <stdexcept>
#include <iostream>
#include <sstream>
#include <map>
namespace lsbasi {
class Interpreter: public VisitorInterpreter {
AST *ast;
std::map<std::string, int> symbols;
int dispatcher(AST *node){
return node->handler(this);
}
int visit(Assign * node){
std::string var = (static_cast<Id *>(node->id))->value;
int value = dispatcher(node->expr);
symbols[var] = value;
return value;
}
int visit(Id * node){
std::string var = node->value;
if (symbols.count(var))
return symbols[var];
else
throw std::runtime_error("Invalid Variable");
}
int visit(Num *node){
return node->value;
}
int visit(BinOp *node){
int ret = 0;
switch(node->token->type){
case Token::_PLUS:
ret = dispatcher(node->left) + dispatcher(node->right);
break;
case Token::_MINUS:
ret = dispatcher(node->left) - dispatcher(node->right);
break;
case Token::_MUL:
ret = dispatcher(node->left) * dispatcher(node->right);
break;
case Token::_DIV:
ret = dispatcher(node->left) / dispatcher(node->right);
break;
}
return ret;
}
int visit(UnaryOp *node){
int ret = 0;
switch(node->token->type){
case Token::_PLUS:
ret = (+1) * dispatcher(node->fact);
break;
case Token::_MINUS:
ret = (-1) * dispatcher(node->fact);
break;
}
return ret;
}
public:
Interpreter(AST * ast): ast(ast){}
int interpret (){
return dispatcher(ast);
}
};
};