aboutsummaryrefslogtreecommitdiff
path: root/lib/statements.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/statements.js')
-rw-r--r--lib/statements.js74
1 files changed, 74 insertions, 0 deletions
diff --git a/lib/statements.js b/lib/statements.js
new file mode 100644
index 0000000..b59c08f
--- /dev/null
+++ b/lib/statements.js
@@ -0,0 +1,74 @@
+var getStatementEvaluators = function(evaluate) {
+ return {
+ 'statement-sequence': function(dataset, children, context) {
+ var retval = null;
+ children.forEach(function(child) {
+ retval = evaluate(child, context);
+ });
+ return retval;
+ },
+
+ 'while': function(dataset, children, context) {
+ var condition = children[0];
+ var body = children[1];
+ while (evaluate(condition, context)) {
+ evaluate(body, context);
+ }
+ },
+
+ 'compare': function(dataset, children, context) {
+ var operator = binaryOperators[dataset.op];
+ var lhs = evaluate(children[0], context);
+ var rhs = evaluate(children[1], context);
+ var result = operator(lhs, rhs);
+ return result;
+ },
+
+ 'variable': function(dataset, children, context) {
+ return context[dataset.name];
+ },
+
+ 'constant': function(dataset, children, context) {
+ return stringToType(dataset.val, dataset.type);
+ },
+
+ 'branch': function(dataset, children, context) {
+ var condition = children[0];
+ var ifBody = children[1];
+
+ // else is optional
+ if (children.length > 2) {
+ var elseBody = children[2];
+ }
+
+ if (evaluate(condition, context)) {
+ return evaluate(ifBody, context);
+ } else if (elseBody) {
+ return evaluate(elseBody, context);
+ }
+ },
+
+ 'assign': function(dataset, children, context) {
+ context[dataset.name] = evaluate(children[0], context);
+ return context[dataset.name];
+ },
+
+ 'bin-op': function(dataset, children, context) {
+ var operator = binaryOperators[dataset.op];
+ var lhs = evaluate(children[0], context);
+ var rhs = evaluate(children[1], context);
+ return operator(lhs, rhs);
+ },
+
+ 'return': function(dataset, children, context) {
+ return evaluate(children[0], context);
+ },
+
+ 'print': function(dataset, children, context) {
+ var args = children.map(function(child) {
+ return evaluate(child, context);
+ });
+ console.log.apply(this, args);
+ }
+ };
+};