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))