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}%%