]> git.kianting.info Git - clo/blobdiff - src/index.ts
add callee multi arguments
[clo] / src / index.ts
index 90cdad4698b3734aeda9cb9582e57e42daade80a..3bf281fddc0d462beb6ab89500def42091181a13 100644 (file)
@@ -129,7 +129,7 @@ let tMul  = m1TType(tk.TokenType.I_MUL);
 let tDiv = m1TType(tk.TokenType.I_DIV);
 let tLParen = m1TType(tk.TokenType.L_PAREN);
 let tRParen = m1TType(tk.TokenType.R_PAREN);
-
+let tComma = m1TType(tk.TokenType.COMMA);
 let toSome = tk.toSome;
 
 
@@ -219,7 +219,6 @@ export function OnceOrMoreDo(f: Function): (x: TokenMatcheePair) =>
 
         };
 
-
         if (counter <= 0){
             return { _tag: "None"};
         }
@@ -253,8 +252,15 @@ let midfix = (f : Function, signal? : string) => (x : TokenMatcheePair)=>{
 let circumfix = (f : Function, signal? : string) => (x : TokenMatcheePair)=>{
     var a = f(x);
     if (a._tag == "Some"){
+        console.log("$$$"+repr(a.value.ast));
         let inner = a.value.ast[a.value.ast.length-2];
-        let ast_middle : tkTree[] = [inner];
+        var ast_middle : tkTree[];
+        if (Array.isArray(inner)){
+            ast_middle = inner;
+        }
+        else{
+            ast_middle = [inner];
+        }
         let new_ast = [ast_middle];
         a.value.ast = new_ast;
     }
@@ -263,24 +269,33 @@ let circumfix = (f : Function, signal? : string) => (x : TokenMatcheePair)=>{
 
 /** single1 = tInt | "(" expr ")"*/
 let single1 = circumfix((x : TokenMatcheePair) =>
-    thenDo(thenDo(thenDo(tk.toSome(x), tLParen), expr), tRParen), "fac1");
+    thenDo(thenDo(thenDo(toSome(x), tLParen), expr), tRParen), "fac1");
 let single2= tInt;
 let single = orDo(single1, single2);
 
-/** func = single | single "(" single ")" 
- * i.e.
- * 
- * func = single |  func_aux ( int )
- * 
-*/
+/** args = single "," args | single */
+let args1 = (x: TokenMatcheePair)=>{
+    var ret = thenDo(thenDo(thenDo(toSome(x), single), tComma), args);
+    if (ret._tag == "Some"){
+        let retLength = ret.value.ast.length;
+        ret.value.ast = [[ret.value.ast[retLength-3]].concat(ret.value.ast[retLength-1])];
+        console.log("$$"+repr(ret.value.ast));
+    }
+    return ret;
+};
+
+let args2 = single;
+
+let args = orDo(args1, args2);
+
 
 /** callees = "(" args ")" | "(" ")" */
 
 
 let callees1 = circumfix((x : TokenMatcheePair) =>
-    thenDo(thenDo(thenDo(tk.toSome(x), tLParen), tInt), tRParen), "callees1");
+    thenDo(thenDo(thenDo(toSome(x), tLParen), args), tRParen), "callees1");
 let callees2 = (x: TokenMatcheePair)=>{
-    let ret = thenDo(thenDo(tk.toSome(x), tLParen), tRParen);
+    let ret = thenDo(thenDo(toSome(x), tLParen), tRParen);
     if (ret._tag == "Some"){
         let new_ast : tkTree[] = [[]];
         ret.value.ast = new_ast;
@@ -302,7 +317,7 @@ let applyToken = {
 
 /** facAux = callees facAux |  callees */
 let facAux1 = (x: TokenMatcheePair)=>{
-    var ret = thenDo(thenDo(tk.toSome(x), callees), facAux);
+    var ret = thenDo(thenDo(toSome(x), callees), facAux);
     if (ret._tag == "Some"){
         console.log("1232345"+repr(tkTreeToSExp(ret.value.ast[ret.value.ast.length-1])));
     let last1  = ret.value.ast[ret.value.ast.length-1];
@@ -325,7 +340,7 @@ let facAux =  orDo(facAux1, facAux2);
  * Issue1 to be fixed.
  */
 let fac1 = (x: TokenMatcheePair)=>{
-    var ret = thenDo(thenDo(tk.toSome(x), single),facAux);
+    var ret = thenDo(thenDo(toSome(x), single),facAux);
     if(ret._tag == "Some"){
         console.log("777"+repr(tkTreeToSExp(ret.value.ast)));
         ret.value.ast = [applyToken, ret.value.ast[ret.value.ast.length-2],
@@ -391,7 +406,7 @@ function rearrangeTree(x: any) : any {
  */
 
 let term1 = midfix((x : TokenMatcheePair)=>
-            thenDo(thenDo(thenDo(tk.toSome(x), fac), orDo(tMul,tDiv)), fac), "term1");
+            thenDo(thenDo(thenDo(toSome(x), fac), orDo(tMul,tDiv)), fac), "term1");
 
             
 /**
@@ -411,7 +426,7 @@ 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");
+                thenDo(thenDo(thenDo(toSome(x), term), orDo(tAdd,tSub)), term), "expr1");
 /**
  * expr2 = term
  */
@@ -427,7 +442,7 @@ 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("2()");
+let tokens4 = tk.tokenize("2()(4)");
 
 //let tokens = tk.tokenize("(4-(3/4))");
 //tk.tokenize(argv[2]);