diff --git a/generator/stdlib_js/stdlib.js b/generator/stdlib_js/stdlib.js index c59d8e5fd5c4832aa7b4f518f8ee04386ee2147b..5ff1b68415011586d8d38d085e431a9185289457 100644 --- a/generator/stdlib_js/stdlib.js +++ b/generator/stdlib_js/stdlib.js @@ -19,9 +19,13 @@ var to_string = function (x) { return String(x) } var parse = function (source) { var ast = require('esprima').parse(source).body[0].expression; + // Esprima does it's little thing. To be handled by auto generated code we need to + // reshape the tree structure to match the labels and expected content. + function transform (tree) { if (tree === undefined) { } else { + // Javascript style instructions are well handled with no additional creation. switch (tree.operator) { case '+': tree.type = "Add"; tree.operator = undefined; break; @@ -34,14 +38,40 @@ var parse = function (source) { default: break; } - switch (tree.type) { - case "Literal": - tree.type = "Const"; break; - default: break; + if (tree.type === "Literal") { + tree.type = "Const"; } + // tree.left and tree.right from parser interpretation if (tree.left !== undefined) tree.left = transform(tree.left); if (tree.right !== undefined) tree.right = transform(tree.right); + + // Esprima sees these standalone type instructions as Identifiers + if (tree.type === "Identifier") { + switch (tree.name) { + case "Emp": + tree.type = "Emp"; break; + default: console.log("Unknown ident"); break; + } + } + + // Esprima generates a function type structure that needs reshaping to the + // automatically generated structure, respecting label names! + if (tree.type === "CallExpression") { + switch (tree.callee.name) { + case "Push": + tree.type = "Push"; + tree.value = transform(tree.arguments[0]); + tree.stack = transform(tree.arguments[1]); + break; + case "Pop": + tree.type = "Pop"; + tree.stack = transform(tree.arguments[0]); + break; + default: console.log("Unknown callexpr"); break; + } + } + return tree; } } diff --git a/generator/tests/calc.ml b/generator/tests/calc.ml index 6fb690ba35aa9596d93cd44ebdd2b69e3f6d41df..62caab4aa974018ba3b4ba025efd322d49de1b3e 100644 --- a/generator/tests/calc.ml +++ b/generator/tests/calc.ml @@ -37,5 +37,5 @@ and print_sexpr sexpr = match sexpr with let f = (*let bli = Stack.C(1, Stack.N) in let blii = (Stack.push 2 bli) in*) - let source = parse "Pop(Emp)" in + let source = parse "Pop(Push(1, Push(5, Emp))) - 7" in print ((print_expr source) + " = " + to_string (eval_ source))