addr.y
1.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
%{
/*
* addr.y -- RFC 822 address parser
*/
#include <stdlib.h>
#include <string.h>
#include "addr.h"
int yyerror(char *msg);
extern int yylex(void);
#define yyparse addrparse
#define yyerror addrerror
#define YYERROR_VERBOSE /* i want better error messages! */
%}
%token ATOM QTEXT DTEXT
%start sieve_address
%%
address: mailbox /* one addressee */
| group /* named list */
;
group: phrase ':' ';'
| phrase ':' mailboxes ';'
;
mailboxes: mailbox
| mailbox ',' mailboxes
;
mailbox: addrspec /* simple address */
| phrase routeaddr /* name & addr-spec */
;
routeaddr: '<' addrspec '>'
| '<' route ':' addrspec '>'
;
route: '@' domain /* path-relative */
| '@' domain ',' route
;
sieve_address: addrspec /* simple address */
| phrase '<' addrspec '>' /* name & addr-spec */
;
addrspec: localpart '@' domain /* global-address */
;
localpart: word /* uninterpreted, case-preserved */
| word '.' localpart
;
domain: subdomain
| subdomain '.' domain
;
subdomain: domainref
| domainlit
;
domainref: ATOM /* symbolic reference */
;
domainlit: '[' DTEXT ']'
;
phrase: word
| word phrase
;
word: ATOM
| qstring
;
qstring: '"' QTEXT '"'
;
%%
/* copy address error message into buffer provided by sieve parser */
int yyerror(char *s)
{
extern char addrerr[];
strcpy(addrerr, s);
return 0;
}