-var constParser = gramRHS((x) => { return thenDo(toSome(x), orDo(orDo(orDo(tInt, tFlo), tStr), tBool)); }, [0]);
-let tree = constParser(commandTPair);
-console.log(util.inspect(tree, { showHidden: true, depth: null }));
+let midfix = (f, signal) => (x) => {
+ var a = f(x);
+ if (a._tag == "Some") {
+ let ast_head = slice(a.value.ast, 0, a.value.ast.length - 3);
+ let ast_tail = slice(a.value.ast, a.value.ast.length - 3);
+ let new_ast = [ast_tail];
+ a.value.ast = new_ast;
+ console.log("+" + signal + "+" + repr(a));
+ }
+ return a;
+};
+/**
+ *
+ * fac1 = int MUL int
+ */
+//let fac1 = midfix((x : TokenMatcheePair)=>
+// thenDo(thenDo(thenDo(tk.toSome(x), tInt), tMul), tInt));
+let fac1 = (x) => {
+ let a = midfix((x) => thenDo(thenDo(thenDo(tk.toSome(x), tInt), tMul), tInt), "fac1")(x);
+ return a;
+};
+/**
+ *
+ * fac2 = int MUL int
+ */
+let fac2 = tInt;
+/**
+ * fac = fac1 | fac2
+ */
+let fac = orDo(fac1, fac2);
+/**
+ *
+ * expr1 = fac ADD fac
+ */
+let expr1 = midfix((x) => thenDo(thenDo(thenDo(tk.toSome(x), fac), tAdd), fac), "expr1");
+/**
+ * expr2 = fac
+ */
+let expr2 = fac;
+/**
+ * expr = expr1 | expr2
+ */
+let expr = orDo(expr1, expr2);
+let tokens = tk.tokenize("2+3"); //tk.tokenize(argv[2]);
+let tokensFiltered = tokens.filter((x) => {
+ return (x.type != tk.TokenType.NL
+ && x.type != tk.TokenType.SP);
+});
+let wrappedTokens = tk.toSome({
+ matched: [],
+ remained: tokensFiltered,
+ ast: []
+});
+let beta = expr({
+ matched: [],
+ remained: tokensFiltered,
+ ast: []
+});
+console.log(repr(wrappedTokens));
+console.log(repr(beta));