KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > tests > jfun > parsec > rfc822 > DateTimeParser


1 /*
2  * Created on Dec 10, 2004
3  *
4  * Author Ben Yu
5  */

6 package tests.jfun.parsec.rfc822;
7
8 import jfun.parsec.Map;
9 import jfun.parsec.Map2;
10 import jfun.parsec.Map3;
11 import jfun.parsec.Parser;
12 import jfun.parsec.Parsers;
13 import java.util.HashMap JavaDoc;
14 import jfun.parsec.pattern.CharPredicate;
15 import jfun.parsec.pattern.CharPredicates;
16 import jfun.parsec.ObjectPredicate;
17 import jfun.parsec.pattern.Patterns;
18 import jfun.parsec.pattern.Pattern;
19
20
21 /**
22  * @author Ben Yu
23  *
24  * Dec 10, 2004
25  */

26 public final class DateTimeParser {
27   public Object JavaDoc runParser(CharSequence JavaDoc src, final Parser p){
28     return LexicalRules.runParser(src, p);
29   }
30   private final String JavaDoc[] day_keywords = {
31       "mon","tue","wed","thu","fri","sat","sun"
32   };
33   
34   private final String JavaDoc[] month_keywords = {
35       "jan","feb","mar","apr","may","jun","jul",
36       "aug","sep","oct","nov","dec"
37   };
38   private final String JavaDoc[] zone_keywords = {
39       "ut","gmt","est","edt","cst","cdt",
40       "mst","mdt","pst","pdt"
41   };
42   private static java.util.Map JavaDoc toMap(final String JavaDoc[] keys){
43     final HashMap JavaDoc dict = new HashMap JavaDoc();
44     for(int i=0; i<keys.length; i++){
45       dict.put(keys[i].toLowerCase(), keys[i]);
46     }
47     return dict;
48   }
49   private static ObjectPredicate fromKeys(final String JavaDoc[] keys){
50     final java.util.Map JavaDoc dict = toMap(keys);
51     return new ObjectPredicate(){
52       public boolean isObject(Object JavaDoc v){
53         final String JavaDoc k = (String JavaDoc)v;
54         return dict.containsKey(k.toLowerCase());
55       }
56     };
57   }
58   private static ObjectPredicate isChar(final CharPredicate cp){
59     return new ObjectPredicate(){
60       public boolean isObject(final Object JavaDoc v){
61         final String JavaDoc s = (String JavaDoc)v;
62         if(s.length()!=1) return false;
63         return cp.isChar(s.charAt(0));
64       }
65     };
66   }
67   private static ObjectPredicate isPattern(final Pattern pp){
68     return new ObjectPredicate(){
69       public boolean isObject(final Object JavaDoc v){
70         final String JavaDoc s = (String JavaDoc)v;
71         final int len = s.length();
72         return pp.match(s, len, 0) == len;
73       }
74     };
75   }
76
77
78   private static Parser delimited(final Parser p){
79     return LexicalRules.lexeme(p);
80   }
81   private static Parser getAtomParser(final CharPredicate cp,
82       final String JavaDoc exp){
83     return delimited(LexicalRules.s_atom)
84     .isReturn(isChar(cp), exp);
85   }
86   private static Parser getAtomParser(final Pattern pp,
87       final String JavaDoc exp){
88     return delimited(LexicalRules.s_atom)
89     .isReturn(isPattern(pp), exp);
90   }
91   private static Parser getAtomParser(final String JavaDoc[] keys,
92       final String JavaDoc exp){
93     return delimited(LexicalRules.s_atom)
94     .isReturn(fromKeys(keys), exp);
95   }
96   public final Parser palpha1 =
97     getAtomParser(CharPredicates.isAlpha(), "alpha");
98   public final Parser pdigit1 =
99     getAtomParser(CharPredicates.isDigit(), "digit");
100   private static final Pattern _isdigit =
101     Patterns.isChar(CharPredicates.isDigit());
102   public final Parser pdigit2 =
103     getAtomParser(_isdigit.repeat(2), "2 digits");
104   public final Parser pdigit4 =
105     getAtomParser(_isdigit.repeat(4), "4 digits");
106   private static final CharPredicate cp_sign =
107     CharPredicates.among(new char[]{'+','-'});
108   private final Parser psign =
109     LexicalRules.toStringLexer(LexicalRules.isChar(cp_sign, "[+,-]"));
110   private final Parser pcolon = LexicalRules.isChar(':');
111   private final Parser pcomma = LexicalRules.isChar(',');
112
113   //Parser String
114
public final Parser pzone = Parsers.plus(
115       getAtomParser(zone_keywords, "zone name"),
116       palpha1,
117       Parsers.plus(psign.and(pdigit4, Utils.concat),
118           getAtomParser(
119               Patterns.isChar(cp_sign)
120                 .seq(Patterns.isChar(
121                     CharPredicates.isDigit()).repeat(4)
122                 ), "military zone")
123       )
124   );
125
126
127   public final Parser phour = Parsers.map3(
128       pdigit2, pcolon.seq(pdigit2),
129       pcolon.seq(pdigit2).map(new Map(){
130         public Object JavaDoc map(final Object JavaDoc o){return ":" + o;}
131       }).option(""),
132       new Map3(){
133         public Object JavaDoc map(Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3){
134           return ""+o1+":"+o2+o3;
135         }
136       }
137   );
138     public final Parser ptime = phour.and(pzone, new Map2(){
139       public Object JavaDoc map(Object JavaDoc o1, Object JavaDoc o2){
140         return new Time(o1.toString(), o2.toString());
141       }
142     });
143     public final Parser pmonth =
144       getAtomParser(month_keywords, "month");
145     public final Parser pdate = Parsers.map3(
146         Parsers.plus(pdigit1, pdigit2),
147         pmonth, pdigit2, new Map3(){
148           public Object JavaDoc map(Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3){
149             return new Date(o1.toString(),
150                 o2.toString(), o3.toString());
151           }
152         }
153     );
154     public final Parser pweekday =
155       getAtomParser(day_keywords, "weekday");
156     //Parser DateTime
157
public final Parser pdatetime = Parsers.map3(
158         pweekday.followedBy(pcomma).option(null),
159         pdate, ptime, new Map3(){
160           public Object JavaDoc map(Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3){
161             return new tests.jfun.parsec.rfc822.DateTime(
162                 (String JavaDoc)o1, (Date)o2, (Time)o3);
163           }
164         }
165     );
166 }
167
Popular Tags