1%%{ 2machine common; 3 4# whitespace 5sp = ' '; 6 7# closing square bracket 8csb = ']'; 9 10# double quote 11dq = '"'; 12 13# backslash 14bs = 0x5C; 15 16# ", ], \ 17toescape = (dq | csb | bs); 18 19# 1..9 20nonzerodigit = '1'..'9'; 21 22# 0..59 23sexagesimal = '0'..'5' . '0'..'9'; 24 25# 01..31 26datemday_2digit = ('0' . nonzerodigit | '1'..'2' . '0'..'9' | '3' . '0'..'1'); 27 28# 1 .. 9, 10..31 29datemday = (sp . nonzerodigit | '1'..'2' . '0'..'9' | '3' . '0'..'1'); 30 31# 01..12 32datemonth = ('0' . nonzerodigit | '1' . '0'..'2'); 33 34datemmm = ('Jan' | 'Feb' | 'Mar' | 'Apr' | 'May' | 'Jun' | 'Jul' | 'Aug' | 'Sep' | 'Oct' | 'Nov' | 'Dec'); 35 36datefullyear = digit{4}; 37 38fulldate = datefullyear '-' datemonth '-' datemday_2digit; 39 40# 01..23 41timehour = ('0'..'1' . '0'..'9' | '2' . '0'..'3'); 42 43timeminute = sexagesimal; 44 45timesecond = sexagesimal; 46 47timesecfrac = '.' digit{1,6}; 48 49timenumoffset = ('+' | '-') timehour ':' timeminute; 50 51timeoffset = 'Z' | timenumoffset; 52 53hhmmss = timehour ':' timeminute ':' timesecond; 54 55partialtime = hhmmss . timesecfrac?; 56 57fulltime = partialtime . timeoffset; 58 59# 1..191 60privalrange = (('1' ('9' ('0'..'1'){,1} | '0'..'8' ('0'..'9'){,1}){,1}) | ('2'..'9' ('0'..'9'){,1})); 61 62# 1..191 or 0 63prival = (privalrange | '0'); 64 65hostnamerange = graph{1,255}; 66 67appnamerange = graph{1,48}; 68 69procidrange = graph{1,128}; 70 71msgidrange = graph{1,32}; 72 73sdname = (graph - ('=' | sp | csb | dq)){1,32}; 74 75# rfc 3629 76utf8tail = 0x80..0xBF; 77 78utf81 = 0x00..0x7F; 79 80utf82 = 0xC2..0xDF utf8tail; 81 82utf83 = 0xE0 0xA0..0xBF utf8tail | 0xE1..0xEC utf8tail{2} | 0xED 0x80..0x9F utf8tail | 0xEE..0xEF utf8tail{2}; 83 84utf84 = 0xF0 0x90..0xBF utf8tail{2} | 0xF1..0xF3 utf8tail{3} | 0xF4 0x80..0x8F utf8tail{2}; 85 86utf8char = utf81 | utf82 | utf83 | utf84; 87 88utf8octets = utf8char*; 89 90bom = 0xEF 0xBB 0xBF; 91 92# utf8char except ", ], \ 93utf8charwodelims = utf8char - toescape; 94 95}%%