+let circumfix = (f, signal) => (x) => {
+ var a = f(x);
+ if (a._tag == "Some") {
+ let inner = a.value.ast[a.value.ast.length - 2];
+ console.log("AST====" + repr(a.value.ast));
+ let ast_middle = [inner];
+ let new_ast = [ast_middle];
+ a.value.ast = new_ast;
+ console.log("+" + signal + "+" + repr(a));
+ }
+ return a;
+};
+/** fac1 = "(" expr ")" */
+let fac1 = circumfix((x) => thenDo(thenDo(thenDo(tk.toSome(x), tLParen), expr), tRParen), "fac1");
+let fac2 = tInt;
+let fac = orDo(fac1, fac2);