KickJava   Java API By Example, From Geeks To Geeks.

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


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

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 /**
17  * @author Ben Yu
18  *
19  * Dec 10, 2004
20  */

21 public final class AddressParser {
22   public Object JavaDoc runParser(CharSequence JavaDoc 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     //Parser String
37
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 JavaDoc.class);
45
46     public final Parser domain_ref = atom;
47     public final Parser sub_domain =
48       Parsers.plus(domain_ref, domain_literal);
49     //Parser String
50

51     
52     //Parser String[]
53
public final Parser domain =
54       Parsers.sepBy1(String JavaDoc.class, dot, sub_domain);
55     public final Parser local_part =
56       Parsers.sepBy1(String JavaDoc.class, dot, word);
57     //Parser String[]
58

59     //Parser AddrSpec;
60
public final Parser addr_spec =
61       local_part.and(at.seq(domain), new Map2(){
62       public Object JavaDoc map(final Object JavaDoc o1, final Object JavaDoc o2){
63         return new AddrSpec((String JavaDoc[])o1, (String JavaDoc[])o2);
64       }
65     });
66     //Parser String[][]
67

68     public final Parser route =
69       LexicalRules.list1(at.seq(domain), String JavaDoc[].class)
70       .followedBy(colon);
71     //Parser RouteAddr
72
public final Parser quoted_route_addr =
73       route.option(new String JavaDoc[0][]).and(addr_spec, new Map2(){
74         public Object JavaDoc map(final Object JavaDoc o1, final Object JavaDoc o2){
75           return new RouteAddr((String JavaDoc[][])o1, (AddrSpec)o2);
76         }
77       });
78     //Parser RouteAddr
79
public final Parser route_addr =
80       Parsers.between(lt, gt, quoted_route_addr);
81     //Parser Mailbox
82
public final Parser mailbox = Parsers.plus(
83         addr_spec.map(new Map(){
84           public Object JavaDoc map(final Object JavaDoc o){
85             return new Mailbox((AddrSpec)o, new String JavaDoc[0], new String JavaDoc[0][]);
86           }
87         }),
88         phrase.and(route_addr, new Map2(){
89           public Object JavaDoc map(final Object JavaDoc o1, final Object JavaDoc o2){
90             final RouteAddr ra = (RouteAddr)o2;
91             return new Mailbox(ra.getAddrSpec(), (String JavaDoc[])o1, ra.getRoute());
92           }
93         })
94     ).lookahead(2);
95     
96     //Parser Mailbox[]
97
public final Parser mailboxes =
98       LexicalRules.list(mailbox, Mailbox.class)
99       .followedBy(semicolon);
100     //Parser Address
101
public final Parser address = Parsers.plus(
102       phrase.followedBy(colon).atomize()
103         .and(mailboxes, new Map2(){
104           public Object JavaDoc map(final Object JavaDoc o1, final Object JavaDoc o2){
105             return new Address((String JavaDoc[])o1, (Mailbox[])o2);
106           }
107         }),
108       mailbox.map(new Map(){
109         public Object JavaDoc map(final Object JavaDoc o){
110           return new Address(new String JavaDoc[0], new Mailbox[]{(Mailbox)o});
111         }
112       })
113     );
114 }
115
Popular Tags