more recursion added by andyjpb on Mon Jul 23 15:33:35 2012
(define (vcard-item) (let ((sequence (lambda (name value) (sequence (zero-or-more (sequence (groups) (is #\.))) name (zero-or-more params) (is #\:) value CRLF)))) (any-of (sequence name value) (sequence "ADR" addressparts) (sequence "ORG" orgparts) (sequence "N" nameparts) ;(sequence "AGENT" (vcard))))) ))) ;vcard = "BEGIN" [ws] ":" [ws] "VCARD" [ws] 1*CRLF ; items *CRLF "END" [ws] ":" [ws] "VCARD" (define (vcard) (sequence (char-seq "BEGIN") (zero-or-more ws) (is #\:) (zero-or-more ws) (char-seq "VCARD") (zero-or-more ws) (one-or-more CRLF) (items) (zero-or-more CRLF) (char-seq "END") (zero-or-more ws) (is #\:) (zero-or-more ws) (char-seq "VCARD"))) ;items = items *CRLF item ; / item ; ; these may be "folded" (define (items) (sequence (vcard-item) (zero-or-more CRLF) items)) ;vcard_file = [wsls] vcard [wsls] (define vcard-file (sequence (zero-or-more wsls) (vcard) (zero-or-more wsls)))