Here's my alternate take: make the ABNF a lot simpler to reflect the actual loose syntax.
dmarc-record = dmarc-version *(*WSP ";" *WSP dmarc-tag) *WSP *%x3b dmarc-tag = 1*ALPHA %WSP '=' *WSP 1*dmarc-value dmarc-value = %x20-3a | %x3c-7e ; any printing chars but semicolon dmarc-version = "v" *WSP "=" *WSP %x44 %x4d %x41 %x52 %x43 %x31 Don't waste ABNF defining the tag names. Just define the values for the various tags: > dmarc-request = ( "none" / "quarantine" / "reject" ) > > dmarc-test = ( "y" / "n" ) > > dmarc-psd = ( "y" / "n" ) > > dmarc-sprequest = ( "none" / "quarantine" / "reject" ) > > dmarc-nprequest = ( "none" / "quarantine" / "reject" ) > > dmarc-adkim = ( "r" / "s" ) > > dmarc-aspf = ( "r" / "s" ) > dmarc-uri = URI ; "URI" is imported from [RFC3986]; commas (ASCII ; 0x2C) and exclamation points (ASCII 0x21) ; MUST be encoded > dmarc-auri = dmarc-uri *(*WSP "," *WSP dmarc-uri) > > dmarc-furi = dmarc-uri *(*WSP "," *WSP dmarc-uri) > > dmarc-fo = ( "0" / "1" / ( "d" / "s" / "d:s" / "s:d" ) ) > > dmarc-rfmt = Keyword *(*WSP ":" Keyword) > ; registered reporting formats only > > "Keyword" is imported from Section 4.1.2 of [RFC5321]. > > dmarc-test = ( "y" / "n" ) _______________________________________________ dmarc mailing list dmarc@ietf.org https://www.ietf.org/mailman/listinfo/dmarc