;item = [groups "."] name ; [params] ":" value CRLF ; / [groups "."] "ADR" ; [params] ":" addressparts CRLF ; / [groups "."] "ORG" ; [params] ":" orgparts CRLF ; / [groups "."] "N" ; [params] ":" nameparts CRLF ; / [groups "."] "AGENT" ; [params] ":" vcard CRLF ; ; these may be "folded" (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))))) ;items = items *CRLF item ; / item ; ; these may be "folded" (define items (letrec ((items (sequence items (zero-or-more CRLF) (vcard-item)))) items)) ;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"))) ;vcard_file = [wsls] vcard [wsls] (define vcard-file (sequence (zero-or-more wsls) (vcard) (zero-or-more wsls)))