+let term1 = midfix((x : TokenMatcheePair)=>
+ thenDo(thenDo(thenDo(tk.toSome(x), fac), orDo(tMul,tDiv)), fac), "term1");
+
+
+/**
+ *
+ * term2 = int MUL int
+ */
+let term2 = fac;
+
+/**
+ * term = term1 | term2
+ */
+let term = orDo(term1, term2);
+
+
+/**
+ *
+ * expr1 = term ADD term
+ */
+let expr1 = midfix((x : TokenMatcheePair)=>
+ thenDo(thenDo(thenDo(tk.toSome(x), term), orDo(tAdd,tSub)), term), "expr1");
+/**
+ * expr2 = term
+ */
+let expr2 = term;
+
+/**
+ * expr = expr1 | expr2
+ */
+let expr = orDo(expr1, expr2);
+
+
+
+let tokens = tk.tokenize("1");
+let tokens2 = tk.tokenize("1(2)");
+let tokens3 = tk.tokenize("1(2)(3)");
+let tokens4 = tk.tokenize("(3(2))*2+1");
+
+//let tokens = tk.tokenize("(4-(3/4))");
+//tk.tokenize(argv[2]);
+
+let tokensFiltered = tokens4.filter(
+ (x)=>{return (x.type != tk.TokenType.NL
+ && x.type != tk.TokenType.SP)});
+
+
+
+let beta = expr({
+ matched : [] ,
+ remained : tokensFiltered,
+ ast : []});
+
+if (beta._tag == "Some"){
+ console.log(tkTreeToSExp(beta.value.ast));