1 6 package tests.jfun.parsec.rfc822; 7 8 9 import jfun.parsec.Map; 10 import jfun.parsec.Map2; 11 import jfun.parsec.Parser; 12 import jfun.parsec.Parsers; 13 import jfun.parsec.Scanners; 14 import jfun.parsec.pattern.Patterns; 15 16 21 public final class AddressParser { 22 public Object runParser(CharSequence src, final Parser p){ 23 return LexicalRules.runParser(src, p); 24 } 25 26 private static Parser lexeme(final Parser p){ 27 return LexicalRules.lexeme(p); 28 } 29 public final Parser dot = LexicalRules.isChar('.'); 30 public final Parser at = LexicalRules.isChar('@'); 31 public final Parser lt = LexicalRules.isChar('<'); 32 public final Parser gt = LexicalRules.isChar('>'); 33 public final Parser colon = LexicalRules.isChar(':'); 34 public final Parser semicolon = LexicalRules.isChar(';'); 35 36 public final Parser atom = lexeme(LexicalRules.s_atom); 38 public final Parser domain_literal = 39 lexeme(LexicalRules.s_domain_literal); 40 public final Parser quoted_string = 41 lexeme(LexicalRules.s_quoted_string); 42 public final Parser word = Parsers.plus(atom, quoted_string); 43 44 public final Parser phrase = word.many1(String .class); 45 46 public final Parser domain_ref = atom; 47 public final Parser sub_domain = 48 Parsers.plus(domain_ref, domain_literal); 49 51 52 public final Parser domain = 54 Parsers.sepBy1(String .class, dot, sub_domain); 55 public final Parser local_part = 56 Parsers.sepBy1(String .class, dot, word); 57 59 public final Parser addr_spec = 61 local_part.and(at.seq(domain), new Map2(){ 62 public Object map(final Object o1, final Object o2){ 63 return new AddrSpec((String [])o1, (String [])o2); 64 } 65 }); 66 68 public final Parser route = 69 LexicalRules.list1(at.seq(domain), String [].class) 70 .followedBy(colon); 71 public final Parser quoted_route_addr = 73 route.option(new String [0][]).and(addr_spec, new Map2(){ 74 public Object map(final Object o1, final Object o2){ 75 return new RouteAddr((String [][])o1, (AddrSpec)o2); 76 } 77 }); 78 public final Parser route_addr = 80 Parsers.between(lt, gt, quoted_route_addr); 81 public final Parser mailbox = Parsers.plus( 83 addr_spec.map(new Map(){ 84 public Object map(final Object o){ 85 return new Mailbox((AddrSpec)o, new String [0], new String [0][]); 86 } 87 }), 88 phrase.and(route_addr, new Map2(){ 89 public Object map(final Object o1, final Object o2){ 90 final RouteAddr ra = (RouteAddr)o2; 91 return new Mailbox(ra.getAddrSpec(), (String [])o1, ra.getRoute()); 92 } 93 }) 94 ).lookahead(2); 95 96 public final Parser mailboxes = 98 LexicalRules.list(mailbox, Mailbox.class) 99 .followedBy(semicolon); 100 public final Parser address = Parsers.plus( 102 phrase.followedBy(colon).atomize() 103 .and(mailboxes, new Map2(){ 104 public Object map(final Object o1, final Object o2){ 105 return new Address((String [])o1, (Mailbox[])o2); 106 } 107 }), 108 mailbox.map(new Map(){ 109 public Object map(final Object o){ 110 return new Address(new String [0], new Mailbox[]{(Mailbox)o}); 111 } 112 }) 113 ); 114 } 115 | Popular Tags |