1*3f982cf4SFabien Sanglardcddl = S 1*(rule S) 2*3f982cf4SFabien Sanglardrule = typename [genericparm] S assignt S type 3*3f982cf4SFabien Sanglard / groupname [genericparm] S assigng S grpent 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglardtypename = id 6*3f982cf4SFabien Sanglardgroupname = id 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglardassignt = "=" / "/=" 9*3f982cf4SFabien Sanglardassigng = "=" / "//=" 10*3f982cf4SFabien Sanglard 11*3f982cf4SFabien Sanglardgenericparm = "<" S id S *("," S id S ) ">" 12*3f982cf4SFabien Sanglardgenericarg = "<" S type1 S *("," S type1 S ) ">" 13*3f982cf4SFabien Sanglard 14*3f982cf4SFabien Sanglardtype = type1 *(S "/" S type1) 15*3f982cf4SFabien Sanglard 16*3f982cf4SFabien Sanglardtype1 = type2 [S (rangeop / ctlop) S type2] 17*3f982cf4SFabien Sanglard 18*3f982cf4SFabien Sanglardtype2 = value 19*3f982cf4SFabien Sanglard / typename [genericarg] 20*3f982cf4SFabien Sanglard / "(" S type S ")" 21*3f982cf4SFabien Sanglard / "{" S group S "}" 22*3f982cf4SFabien Sanglard / "[" S group S "]" 23*3f982cf4SFabien Sanglard / "~" S typename [genericarg] 24*3f982cf4SFabien Sanglard / "&" S "(" S group S ")" 25*3f982cf4SFabien Sanglard / "&" S groupname [genericarg] 26*3f982cf4SFabien Sanglard / "#" "6" ["." uint] "(" S type S ")" ; note no space! 27*3f982cf4SFabien Sanglard / "#" DIGIT ["." uint] ; major/ai 28*3f982cf4SFabien Sanglard / "#" ; any 29*3f982cf4SFabien Sanglard 30*3f982cf4SFabien Sanglardrangeop = "..." / ".." 31*3f982cf4SFabien Sanglard 32*3f982cf4SFabien Sanglardctlop = "." id 33*3f982cf4SFabien Sanglard 34*3f982cf4SFabien Sanglardgroup = grpchoice *(S "//" S grpchoice) 35*3f982cf4SFabien Sanglard 36*3f982cf4SFabien Sanglardgrpchoice = *(grpent optcom) 37*3f982cf4SFabien Sanglard 38*3f982cf4SFabien Sanglardgrpent = [occur S] [memberkey S] type 39*3f982cf4SFabien Sanglard / [occur S] groupname [genericarg] ; preempted by above 40*3f982cf4SFabien Sanglard / [occur S] "(" S group S ")" 41*3f982cf4SFabien Sanglard 42*3f982cf4SFabien Sanglardmemberkey = type1 S ["^" S] "=>" 43*3f982cf4SFabien Sanglard / bareword S ":" 44*3f982cf4SFabien Sanglard / value S ":" 45*3f982cf4SFabien Sanglard 46*3f982cf4SFabien Sanglardbareword = id 47*3f982cf4SFabien Sanglard 48*3f982cf4SFabien Sanglardoptcom = S ["," S] 49*3f982cf4SFabien Sanglard 50*3f982cf4SFabien Sanglardoccur = [uint] "*" [uint] 51*3f982cf4SFabien Sanglard / "+" 52*3f982cf4SFabien Sanglard / "?" 53*3f982cf4SFabien Sanglard 54*3f982cf4SFabien Sanglarduint = DIGIT1 *DIGIT 55*3f982cf4SFabien Sanglard / "0x" 1*HEXDIG 56*3f982cf4SFabien Sanglard / "0b" 1*BINDIG 57*3f982cf4SFabien Sanglard / "0" 58*3f982cf4SFabien Sanglard 59*3f982cf4SFabien Sanglardvalue = number 60*3f982cf4SFabien Sanglard / text 61*3f982cf4SFabien Sanglard / bytes 62*3f982cf4SFabien Sanglard 63*3f982cf4SFabien Sanglardint = ["-"] uint 64*3f982cf4SFabien Sanglard 65*3f982cf4SFabien Sanglard; This is a float if it has fraction or exponent; int otherwise 66*3f982cf4SFabien Sanglardnumber = hexfloat / (int ["." fraction] ["e" exponent ]) 67*3f982cf4SFabien Sanglardhexfloat = "0x" 1*HEXDIG ["." 1*HEXDIG] "p" exponent 68*3f982cf4SFabien Sanglardfraction = 1*DIGIT 69*3f982cf4SFabien Sanglardexponent = ["+"/"-"] 1*DIGIT 70*3f982cf4SFabien Sanglard 71*3f982cf4SFabien Sanglardtext = %x22 *SCHAR %x22 72*3f982cf4SFabien SanglardSCHAR = %x20-21 / %x23-5B / %x5D-10FFFD / SESC 73*3f982cf4SFabien SanglardSESC = "\" %x20-10FFFD 74*3f982cf4SFabien Sanglard 75*3f982cf4SFabien Sanglardbytes = [bsqual] %x27 *BCHAR %x27 76*3f982cf4SFabien SanglardBCHAR = %x20-26 / %x28-5B / %x5D-10FFFD / SESC / CRLF 77*3f982cf4SFabien Sanglardbsqual = "h" / "b64" 78*3f982cf4SFabien Sanglard 79*3f982cf4SFabien Sanglardid = EALPHA *(*("-" / ".") (EALPHA / DIGIT)) 80*3f982cf4SFabien SanglardALPHA = %x41-5A / %x61-7A 81*3f982cf4SFabien SanglardEALPHA = ALPHA / "@" / "_" / "$" 82*3f982cf4SFabien SanglardDIGIT = %x30-39 83*3f982cf4SFabien SanglardDIGIT1 = %x31-39 84*3f982cf4SFabien SanglardHEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F" 85*3f982cf4SFabien SanglardBINDIG = %x30-31 86*3f982cf4SFabien Sanglard 87*3f982cf4SFabien SanglardS = *WS 88*3f982cf4SFabien SanglardWS = SP / NL 89*3f982cf4SFabien SanglardSP = %x20 90*3f982cf4SFabien SanglardNL = COMMENT / CRLF 91*3f982cf4SFabien SanglardCOMMENT = ";" *PCHAR CRLF 92*3f982cf4SFabien SanglardPCHAR = %x20-10FFFD 93*3f982cf4SFabien SanglardCRLF = %x0A / %x0D.0A 94