KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > kawa > lang > ListPat


1 package kawa.lang;
2 import gnu.lists.*;
3 import gnu.text.*;
4
5 /** Match a list whose length in in the range [min_length..max_length]. */
6
7 public class ListPat extends Pattern
8 {
9   /** Minimun length of list that will match. */
10   int min_length;
11   /** Maximum length of list that will match. */
12   int max_length;
13   Object JavaDoc 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 JavaDoc default_val)
18   { min_length = min; max_length = max; default_value = default_val; }
19
20   public static boolean match (int min, int max, Object JavaDoc default_val,
21                                Object JavaDoc obj, Object JavaDoc[] 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   /**
45    * Succeeds if obj is a list of length [min..max].
46    * @param obj the object to match against
47    * @return true iff the match succeeded
48    * On success, max_length values from the elements of the list are placed
49    * in vars (starting at start_vars); if obj is shorter, missing elements
50    * are set to default_value.
51    */

52   public static Object JavaDoc[] match(int min, int max, Object JavaDoc default_val,
53                                Object JavaDoc obj)
54   {
55     Object JavaDoc[] vars = new Object JavaDoc[max];
56     return match(min, max, default_val, obj, vars, 0) ? vars : null;
57   }
58
59   /**
60    * Succeeds if obj is a list of length [min_length..max_length].
61    * @param obj the object to match against
62    * @return null on failure, or an array of bound pattern variables:
63    * max_length values from the elements of the list are placed
64    * in the result; if obj is shorter, missing elements
65    * are set to default_value.
66    */

67   public boolean match (Object JavaDoc obj, Object JavaDoc[] 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