1 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 ; 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 26 public final class DateTimeParser { 27 public Object runParser(CharSequence src, final Parser p){ 28 return LexicalRules.runParser(src, p); 29 } 30 private final String [] day_keywords = { 31 "mon","tue","wed","thu","fri","sat","sun" 32 }; 33 34 private final String [] month_keywords = { 35 "jan","feb","mar","apr","may","jun","jul", 36 "aug","sep","oct","nov","dec" 37 }; 38 private final String [] zone_keywords = { 39 "ut","gmt","est","edt","cst","cdt", 40 "mst","mdt","pst","pdt" 41 }; 42 private static java.util.Map toMap(final String [] keys){ 43 final HashMap dict = new HashMap (); 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 [] keys){ 50 final java.util.Map dict = toMap(keys); 51 return new ObjectPredicate(){ 52 public boolean isObject(Object v){ 53 final String k = (String )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 v){ 61 final String s = (String )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 v){ 70 final String s = (String )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 exp){ 83 return delimited(LexicalRules.s_atom) 84 .isReturn(isChar(cp), exp); 85 } 86 private static Parser getAtomParser(final Pattern pp, 87 final String exp){ 88 return delimited(LexicalRules.s_atom) 89 .isReturn(isPattern(pp), exp); 90 } 91 private static Parser getAtomParser(final String [] keys, 92 final String 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 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 map(final Object o){return ":" + o;} 131 }).option(""), 132 new Map3(){ 133 public Object map(Object o1, Object o2, Object o3){ 134 return ""+o1+":"+o2+o3; 135 } 136 } 137 ); 138 public final Parser ptime = phour.and(pzone, new Map2(){ 139 public Object map(Object o1, Object 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 map(Object o1, Object o2, Object 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 public final Parser pdatetime = Parsers.map3( 158 pweekday.followedBy(pcomma).option(null), 159 pdate, ptime, new Map3(){ 160 public Object map(Object o1, Object o2, Object o3){ 161 return new tests.jfun.parsec.rfc822.DateTime( 162 (String )o1, (Date)o2, (Time)o3); 163 } 164 } 165 ); 166 } 167 | Popular Tags |