mutually recursive define pasted by andyjpb on Mon Jul 23 00:19:50 2012

;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)))

csi infinite loop added by andyjpb on Mon Jul 23 00:25:50 2012


;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)))))


;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) (letrec ((items (sequence items (zero-or-more CRLF) (vcard-item))))
		items))


;vcard_file     = [wsls] vcard [wsls]
(define vcard-file (sequence (zero-or-more wsls) (vcard) (zero-or-more wsls)))