; Augmented Backus-Naur Form (RFC 5234, 7405)
; white spaces on the right side means concatenation

rulelist                = 1*( rule / (*c-wsp c-nl) )
                        ; a rule starts at the beginning of the line

rule                    = rulename defined-as elements c-nl
                        ; continues in following lines starting with white space

rulename                = ALPHA *(ALPHA / DIGIT / "-")

defined-as              = *c-wsp ("=" / "=/") *c-wsp
                        ; basic rules definition or incremental alternative

elements                = alternation *c-wsp

c-wsp                   = WSP / (c-nl WSP)

c-nl                    = comment / CRLF

comment                 = ";" *(WSP / VCHAR) CRLF

alternation             = concatenation *(*c-wsp "/" *c-wsp concatenation)

concatenation           = repetition *(1*c-wsp repetition)

repetition              = [repeat] element

repeat                  = 1*DIGIT / (*DIGIT "*" *DIGIT)
                        ; default lower limit is ZERO
                        ; default upper limit is INFINITY

element                 = rulename / group / option / char-val / num-val / prose-val

group                   = "(" *c-wsp alternation *c-wsp ")"

option                  = "[" *c-wsp alternation *c-wsp "]"

char-val                = case-insensitive-string / case-sensitive-string

case-insensitive-string = [ "%i" ] quoted-string

case-sensitive-string   = "%s" quoted-string

quoted-string           = DQUOTE *(%x20-21 / %x23-7E) DQUOTE
                        ; quoted string of SP and VCHAR without DQUOTE

num-val                 = "%" (bin-val / dec-val / hex-val)

bin-val                 = "b" 1*BIT [ 1*("." 1*BIT) / ("-" 1*BIT) ]
                        ; series of concatenated bit values
												; or single ONEOF range

dec-val                 = "d" 1*DIGIT [ 1*("." 1*DIGIT) / ("-" 1*DIGIT) ]

hex-val                 = "x" 1*HEXDIG [ 1*("." 1*HEXDIG) / ("-" 1*HEXDIG) ]

prose-val               = "<" *(%x20-3D / %x3F-7E) ">"
                        ; bracketed string of SP and VCHAR without angles
                        ; prose description, to be used as last resort

ALPHA                   = %x41-5A / %x61-7A   ; A-Z / a-z

BIT                     = "0" / "1"

CHAR                    = %x01-7F ; any 7-bit US-ASCII character, excluding NUL

CR                      = %x0D    ; carriage return

CRLF                    = CR LF   ; Internet standard newline

CTL                     = %x00-1F / %x7F      ; controls

DIGIT                   = %x30-39 ; 0-9

DQUOTE                  = %x22    ; " (Double Quote)

HEXDIG                  = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"

HTAB                    = %x09    ; horizontal tab

LF                      = %x0A    ; linefeed

LWSP                    = *(WSP / CRLF WSP)
                        ; Use of this linear-white-space rule permits lines
                        ; containing only white space that are no longer legal
                        ; in mail headers and have caused interoperability
                        ; problems in other contexts.
                        ; Do not use when defining mail headers
                        ; and use with caution in other contexts.

OCTET                   = %x00-FF ; 8 bits of data

SP                      = %x20

VCHAR                   = %x21-7E ; visible (printing) characters

WSP                     = SP / HTAB     ; white space
