1 package kawa.lang; 2 import gnu.lists.*; 3 import gnu.text.*; 4 5 6 7 public class ListPat extends Pattern 8 { 9 10 int min_length; 11 12 int max_length; 13 Object default_value; 14 15 public ListPat (int len) { min_length = len; max_length = len; } 16 public ListPat (int min, int max) { min_length = min; max_length = max; } 17 public ListPat (int min, int max, Object default_val) 18 { min_length = min; max_length = max; default_value = default_val; } 19 20 public static boolean match (int min, int max, Object default_val, 21 Object obj, Object [] vars, int start_vars) 22 { 23 int i; 24 for (i = 0; i < max; i++) 25 { 26 if (obj instanceof Pair) 27 { 28 Pair p = (Pair)obj; 29 vars[start_vars + i] = p.car; 30 obj = p.cdr; 31 } 32 else if (i < min) 33 return false; 34 else 35 break; 36 } 37 if (i == max && obj != LList.Empty) 38 return false; 39 for ( ; i < max; i++) 40 vars[start_vars + i] = default_val; 41 return true; 42 } 43 44 52 public static Object [] match(int min, int max, Object default_val, 53 Object obj) 54 { 55 Object [] vars = new Object [max]; 56 return match(min, max, default_val, obj, vars, 0) ? vars : null; 57 } 58 59 67 public boolean match (Object obj, Object [] vars, int start_vars) 68 { 69 return match(min_length, max_length, default_value, 70 obj, vars, start_vars); 71 } 72 73 public int varCount () { return max_length; } 74 75 public void print (Consumer out) 76 { 77 out.write("#<list-pattern min:"); 78 out.write(Integer.toString(min_length)); 79 out.write(" max:"); 80 out.write(Integer.toString(max_length)); 81 out.write(" default:"); 82 ReportFormat.print(default_value, out); 83 out.write('>'); 84 } 85 } 86 | Popular Tags |