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
|
use core:lang;
use core:io;
use lang:bs:macro;
class NoVariable extends Exception {
Str variable;
init(Str variable) {
init { variable = variable; }
}
void message(StrBuf out) : override {
out << "No variable named " << variable << " is defined.";
}
}
class VarList {
Str->Int values;
void put(Str name, Int value) {
values.put(name, value);
}
Int get(Str name) {
if (x = values.at(name)) {
x;
} else {
throw NoVariable(name);
}
}
}
void eval(Str expr) on Compiler {
Parser<SStmtList> parser;
parser.parse(expr, Url());
if (parser.hasError())
throw parser.error();
SStmtList tree = parser.tree();
VarList variables;
Array<Int> results = tree.transform(variables);
print("Results: ${results}");
}
void main() on Compiler {
eval("a = 20, b = a - 10, a + b, a - b");
}
|