modules/rpsl/ifaddr.y
/* [<][>][^][v][top][bottom][index][help] */
FUNCTIONS
This source file includes following functions.
- yyparse
- ifaddrerror
1 %{
2 /*
3 filename: ifaddr.y
4
5 description:
6 Defines the grammar for an RPSL ifaddr attribute. It was mostly
7 stolen from the IRRToolSet, simplified by removing ability to parse
8 things defined by a dictionary (we use XML for extensibility rather
9 than a dictionary).
10
11 notes:
12 Defines tokens for the associated lexer, ifaddr.l.
13 */
14 %}
15
16 %union {
17 char *sval;
18 }
19
20 %token OP_OR OP_EQUAL OP_APPEND OP_COMPARE
21 %token TKN_ASNO
22 %token TKN_IPV4
23 %token KEYW_ACTION
24 %token TKN_PREF TKN_MED TKN_DPA TKN_ASPATH TKN_COMMUNITY TKN_NEXT_HOP TKN_COST
25 %token TKN_COMM_NO
26 %token KEYW_IGP_COST KEYW_SELF KEYW_PREPEND
27 %token KEYW_APPEND KEYW_DELETE KEYW_CONTAINS
28 %token KEYW_INTERNET KEYW_NO_EXPORT KEYW_NO_ADVERTISE KEYW_MASKLEN
29 %token <sval> TKN_INT TKN_DNS
30
31 %{
32 #include <stdio.h>
33 #include <stdarg.h>
34 #include <stdlib.h>
35
36 int yyerror(const char *s);
37 void syntax_error(char *fmt, ...);
38
39 %}
40
41 %%
/* [<][>][^][v][top][bottom][index][help] */
42
43 ifaddr: TKN_IPV4 KEYW_MASKLEN masklen
44 | TKN_IPV4 KEYW_MASKLEN masklen KEYW_ACTION action
45 ;
46
47 masklen: TKN_INT {
48 long int val;
49 char *s, *p;
50 p = $1;
51 val = strtol(p, &s, 10);
52 if ((val < 0) || (val > 32) || (*s != '\0')) {
53 syntax_error("masklen \"%s\" is not between 0 and 32", p);
54 }
55 }
56 ;
57
58 action: rp_attribute ';'
59 | action rp_attribute ';'
60 ;
61
62 rp_attribute: pref
63 | med
64 | dpa
65 | aspath
66 | community
67 | next_hop
68 | cost
69 ;
70
71 pref: TKN_PREF OP_EQUAL TKN_INT {
72 long int val;
73 char *s, *p;
74 p = $3;
75 val = strtol(p, &s, 10);
76 if ((val < 0) || (val > 65535)) {
77 syntax_error("pref value \"%s\" is not between 0 and 65535", p);
78 }
79 }
80 ;
81
82 med: TKN_MED OP_EQUAL TKN_INT {
83 long int val;
84 char *s, *p;
85 p = $3;
86 val = strtol(p, &s, 10);
87 if ((val < 0) || (val > 65535)) {
88 syntax_error("med value \"%s\" is not between 0 and 65535", p);
89 }
90 }
91 | TKN_MED OP_EQUAL KEYW_IGP_COST
92 ;
93
94 dpa: TKN_DPA OP_EQUAL TKN_INT {
95 long int val;
96 char *s, *p;
97 p = $3;
98 val = strtol(p, &s, 10);
99 if ((val < 0) || (val > 65535)) {
100 syntax_error("dpa value \"%s\" is not between 0 and 65535", p);
101 }
102 }
103 ;
104
105 aspath: TKN_ASPATH '.' KEYW_PREPEND '(' asno_list ')'
106 ;
107
108 asno_list: TKN_ASNO
109 | asno_list ',' TKN_ASNO
110 ;
111
112 community: TKN_COMMUNITY OP_EQUAL community_list
113 | TKN_COMMUNITY OP_APPEND community_list
114 | TKN_COMMUNITY '.' KEYW_APPEND '(' community_elm_list ')'
115 | TKN_COMMUNITY '.' KEYW_DELETE '(' community_elm_list ')'
116 | TKN_COMMUNITY '.' KEYW_CONTAINS '(' community_elm_list ')'
117 | TKN_COMMUNITY '(' community_elm_list ')'
118 | TKN_COMMUNITY OP_COMPARE community_list
119 ;
120
121 community_list: '{' community_elm_list '}'
122 ;
123
124 community_elm_list: community_elm
125 | community_elm_list ',' community_elm
126 ;
127
128 community_elm: KEYW_INTERNET
129 | KEYW_NO_EXPORT
130 | KEYW_NO_ADVERTISE
131 | TKN_INT {
132 unsigned long int val;
133 char *s, *p;
134 p = $1;
135 val = strtoul(p, &s, 10);
136 if ((val < 1) || (val > 4294967295UL) || (*s != '\0')) {
137 syntax_error("community element \"%s\" is not between 1 and 4294967295",
138 p);
139 }
140 }
141 | TKN_COMM_NO
142 ;
143
144 next_hop: TKN_NEXT_HOP OP_EQUAL TKN_IPV4
145 | TKN_NEXT_HOP OP_EQUAL KEYW_SELF
146 ;
147
148 cost: TKN_COST OP_EQUAL TKN_INT {
149 long int val;
150 char *s, *p;
151 p = $3;
152 val = strtol(p, &s, 10);
153 if ((val < 0) || (val > 65535)) {
154 syntax_error("cost value \"%s\" is not between 0 and 65535", p);
155 }
156 }
157 ;
158
159 %%
160
161 #undef ifaddrerror
162 #undef yyerror
163
164 int
165 ifaddrerror (const char *s)
/* [<][>][^][v][top][bottom][index][help] */
166 {
167 yyerror(s);
168 return 0;
169 }
170