-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patheval.dart
64 lines (53 loc) · 1.25 KB
/
eval.dart
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
import 'parser.dart';
import 'definition.dart';
import "lexer.dart";
class Context {
Map<String, String> variables;
Context() {
variables = Map<String, String>();
}
}
int execute(String code) {
Context ctx = Context();
Parser parser = Parser();
SourceCode ast = parser.parse(code);
return evaluate(ast, ctx);
}
int evaluate(SourceCode ast, Context ctx) {
if (ast.statements.isEmpty) {
return -1;
}
ast.statements.forEach((statement) {
int v = evalStatement(statement, ctx);
if (v != 0) {
return v;
}
});
return 0;
}
int evalStatement(Statement statement, Context ctx) {
if (statement is PrintStatement) {
return evalPrint(statement, ctx);
} else if (statement is Assignment) {
return evalAssignment(statement, ctx);
} else {
print('unknown statement $statement');
return -1;
}
}
int evalAssignment(Assignment statement, Context ctx) {
ctx.variables[statement.left.name] = statement.value;
return 0;
}
int evalPrint(PrintStatement statement, Context ctx) {
String varName = statement.variable.name;
if (varName.isEmpty) {
return -1;
}
if (!ctx.variables.containsKey(varName)) {
print('var \$$varName not exits');
return -1;
}
print(ctx.variables[varName]);
return 0;
}