1 // pest. Elegant, efficient grammars
2 // Copyright (C) 2016 DragoČ™ Tiselice
4 // This Source Code Form is subject to the terms of the Mozilla Public
5 // License, v. 2.0. If a copy of the MPL was not distributed with this
6 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
15 expr
= _{ paren ~ expr? }
16 paren
= { ["("] ~ expr? ~ [")"] }
17 rep_zero
= { ["a"]* ~ eoi }
21 abs
= { !(["a"] | ["b"]) ~ any }
22 digit
= { ['0'..'9'] }
23 number
= { ['0'..'9']+ }
35 whitespace
= _{ [" "] }
41 let mut parser
= Rdp
::new(StringInput
::new("(())((())())()"));
43 assert
!(parser
.expr());
44 assert
!(parser
.end());
47 Token
::new(Rule
::paren
, 0, 4),
48 Token
::new(Rule
::paren
, 1, 3),
49 Token
::new(Rule
::paren
, 4, 12),
50 Token
::new(Rule
::paren
, 5, 9),
51 Token
::new(Rule
::paren
, 6, 8),
52 Token
::new(Rule
::paren
, 9, 11),
53 Token
::new(Rule
::paren
, 12, 14)
56 assert_eq
!(parser
.queue(), &queue
);
61 let mut parser
= Rdp
::new(StringInput
::new("(())((())())("));
63 assert
!(parser
.expr());
64 assert
!(!parser
.end());
67 Token
::new(Rule
::paren
, 0, 4),
68 Token
::new(Rule
::paren
, 1, 3),
69 Token
::new(Rule
::paren
, 4, 12),
70 Token
::new(Rule
::paren
, 5, 9),
71 Token
::new(Rule
::paren
, 6, 8),
72 Token
::new(Rule
::paren
, 9, 11)
75 assert_eq
!(parser
.queue(), &queue
);
77 assert_eq
!(parser
.expected(), (vec
![Rule
::paren
], 13));
82 let mut parser
= Rdp
::new(StringInput
::new(""));
84 assert
!(parser
.rep_zero());
87 Token
::new(Rule
::rep_zero
, 0, 0)
90 assert_eq
!(parser
.queue(), &queue
);
95 let mut parser
= Rdp
::new(StringInput
::new("aaaa"));
97 assert
!(parser
.rep_zero());
100 Token
::new(Rule
::rep_zero
, 0, 4)
103 assert_eq
!(parser
.queue(), &queue
);
107 fn rep_zero_wrong() {
108 let mut parser
= Rdp
::new(StringInput
::new("aaaab"));
110 assert
!(!parser
.rep_zero());
114 assert_eq
!(parser
.queue(), &queue
);
116 assert_eq
!(parser
.expected(), (vec
![Rule
::eoi
], 4));
121 let mut parser
= Rdp
::new(StringInput
::new(""));
123 assert
!(!parser
.rep_one());
127 assert_eq
!(parser
.queue(), &queue
);
129 assert_eq
!(parser
.expected(), (vec
![Rule
::rep_one
], 0));
134 let mut parser
= Rdp
::new(StringInput
::new("aaaa"));
136 assert
!(parser
.rep_one());
137 assert
!(parser
.end());
140 Token
::new(Rule
::rep_one
, 0, 4)
143 assert_eq
!(parser
.queue(), &queue
);
148 let mut parser
= Rdp
::new(StringInput
::new("b"));
150 assert
!(!parser
.rep_one());
151 assert
!(!parser
.end());
155 assert_eq
!(parser
.queue(), &queue
);
157 assert_eq
!(parser
.expected(), (vec
![Rule
::rep_one
], 0));
162 let mut parser
= Rdp
::new(StringInput
::new(""));
164 assert
!(parser
.opt());
165 assert
!(parser
.end());
168 Token
::new(Rule
::opt
, 0, 0)
171 assert_eq
!(parser
.queue(), &queue
);
176 let mut parser
= Rdp
::new(StringInput
::new("a"));
178 assert
!(parser
.opt());
179 assert
!(parser
.end());
182 Token
::new(Rule
::opt
, 0, 1)
185 assert_eq
!(parser
.queue(), &queue
);
190 let mut parser
= Rdp
::new(StringInput
::new("b"));
192 assert
!(parser
.opt());
193 assert
!(!parser
.end());
196 Token
::new(Rule
::opt
, 0, 0)
199 assert_eq
!(parser
.queue(), &queue
);
204 let mut parser
= Rdp
::new(StringInput
::new("a"));
206 assert
!(parser
.pres());
207 assert
!(!parser
.end());
210 Token
::new(Rule
::pres
, 0, 0)
213 assert_eq
!(parser
.queue(), &queue
);
218 let mut parser
= Rdp
::new(StringInput
::new("b"));
220 assert
!(!parser
.pres());
221 assert
!(!parser
.end());
225 assert_eq
!(parser
.queue(), &queue
);
227 assert_eq
!(parser
.expected(), (vec
![Rule
::pres
], 0));
232 let mut parser
= Rdp
::new(StringInput
::new("c"));
234 assert
!(parser
.abs());
235 assert
!(parser
.end());
238 Token
::new(Rule
::abs
, 0, 1)
241 assert_eq
!(parser
.queue(), &queue
);
246 let mut parser
= Rdp
::new(StringInput
::new("a"));
248 assert
!(!parser
.abs());
249 assert
!(!parser
.end());
253 assert_eq
!(parser
.queue(), &queue
);
255 assert_eq
!(parser
.expected(), (vec
![Rule
::abs
], 0));
260 let mut parser
= Rdp
::new(StringInput
::new("0"));
262 assert
!(parser
.digit());
263 assert
!(parser
.end());
266 Token
::new(Rule
::digit
, 0, 1)
269 assert_eq
!(parser
.queue(), &queue
);
274 let mut parser
= Rdp
::new(StringInput
::new("a"));
276 assert
!(!parser
.digit());
277 assert
!(!parser
.end());
281 assert_eq
!(parser
.queue(), &queue
);
283 assert_eq
!(parser
.expected(), (vec
![Rule
::digit
], 0));
288 let mut parser
= Rdp
::new(StringInput
::new("1+2+3*9^2^2+2"));
290 assert
!(parser
.expression());
291 assert
!(parser
.end());
294 Token
::new(Rule
::expression
, 0, 13),
295 Token
::new(Rule
::number
, 0, 1),
296 Token
::new(Rule
::plus
, 1, 2),
297 Token
::new(Rule
::number
, 2, 3),
298 Token
::new(Rule
::plus
, 3, 4),
299 Token
::new(Rule
::mul
, 4, 11),
300 Token
::new(Rule
::number
, 4, 5),
301 Token
::new(Rule
::times
, 5, 6),
302 Token
::new(Rule
::pow
, 6, 11),
303 Token
::new(Rule
::number
, 6, 7),
304 Token
::new(Rule
::power
, 7, 8),
305 Token
::new(Rule
::pow
, 8, 11),
306 Token
::new(Rule
::number
, 8, 9),
307 Token
::new(Rule
::power
, 9, 10),
308 Token
::new(Rule
::number
, 10, 11),
309 Token
::new(Rule
::plus
, 11, 12),
310 Token
::new(Rule
::number
, 12, 13)
313 assert_eq
!(parser
.queue(), &queue
);
317 fn expression_spaced() {
318 let mut parser
= Rdp
::new(StringInput
::new("1 + 2 + 3 * 9^2^2 + 2"));
320 assert
!(parser
.expression());
321 assert
!(parser
.end());
324 Token
::new(Rule
::expression
, 0, 21),
325 Token
::new(Rule
::number
, 0, 1),
326 Token
::new(Rule
::plus
, 2, 3),
327 Token
::new(Rule
::number
, 4, 5),
328 Token
::new(Rule
::plus
, 6, 7),
329 Token
::new(Rule
::mul
, 8, 17),
330 Token
::new(Rule
::number
, 8, 9),
331 Token
::new(Rule
::times
, 10, 11),
332 Token
::new(Rule
::pow
, 12, 17),
333 Token
::new(Rule
::number
, 12, 13),
334 Token
::new(Rule
::power
, 13, 14),
335 Token
::new(Rule
::pow
, 14, 17),
336 Token
::new(Rule
::number
, 14, 15),
337 Token
::new(Rule
::power
, 15, 16),
338 Token
::new(Rule
::number
, 16, 17),
339 Token
::new(Rule
::plus
, 18, 19),
340 Token
::new(Rule
::number
, 20, 21)
343 assert_eq
!(parser
.queue(), &queue
);
347 fn expression_space_after() {
348 let mut parser
= Rdp
::new(StringInput
::new("1 "));
350 assert
!(parser
.expression());
351 assert
!(!parser
.end());
354 Token
::new(Rule
::expression
, 0, 1),
355 Token
::new(Rule
::number
, 0, 1)
358 assert_eq
!(parser
.queue(), &queue
);