1 // pest. The Elegant Parser
2 // Copyright (c) 2018 DragoČ™ Tiselice
4 // Licensed under the Apache License, Version 2.0
5 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT
6 // license <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
7 // option. All files in the project carrying such notice may not be copied,
8 // modified, or distributed except according to those terms.
11 use std
::iter
::Peekable
;
13 use pest
::error
::{Error, ErrorVariant}
;
14 use pest
::iterators
::{Pair, Pairs}
;
15 use pest
::prec_climber
::{Assoc, Operator, PrecClimber}
;
16 use pest
::{Parser, Span}
;
18 use ast
::{Expr, Rule as AstRule, RuleType}
;
21 include
!("grammar.rs");
23 pub fn parse(rule
: Rule
, data
: &str) -> Result
<Pairs
<Rule
>, Error
<Rule
>> {
24 PestParser
::parse(rule
, data
)
27 #[derive(Clone, Debug, Eq, PartialEq)]
28 pub struct ParserRule
<'i
> {
32 pub node
: ParserNode
<'i
>,
35 #[derive(Clone, Debug, Eq, PartialEq)]
36 pub struct ParserNode
<'i
> {
37 pub expr
: ParserExpr
<'i
>,
41 impl<'i
> ParserNode
<'i
> {
42 pub fn filter_map_top_down
<F
, T
>(self, mut f
: F
) -> Vec
<T
>
44 F
: FnMut(ParserNode
<'i
>) -> Option
<T
>,
46 pub fn filter_internal
<'i
, F
, T
>(node
: ParserNode
<'i
>, f
: &mut F
, result
: &mut Vec
<T
>)
48 F
: FnMut(ParserNode
<'i
>) -> Option
<T
>,
50 if let Some(value
) = f(node
.clone()) {
55 // TODO: Use box syntax when it gets stabilized.
56 ParserExpr
::PosPred(node
) => {
57 filter_internal(*node
, f
, result
);
59 ParserExpr
::NegPred(node
) => {
60 filter_internal(*node
, f
, result
);
62 ParserExpr
::Seq(lhs
, rhs
) => {
63 filter_internal(*lhs
, f
, result
);
64 filter_internal(*rhs
, f
, result
);
66 ParserExpr
::Choice(lhs
, rhs
) => {
67 filter_internal(*lhs
, f
, result
);
68 filter_internal(*rhs
, f
, result
);
70 ParserExpr
::Rep(node
) => {
71 filter_internal(*node
, f
, result
);
73 ParserExpr
::RepOnce(node
) => {
74 filter_internal(*node
, f
, result
);
76 ParserExpr
::RepExact(node
, _
) => {
77 filter_internal(*node
, f
, result
);
79 ParserExpr
::RepMin(node
, _
) => {
80 filter_internal(*node
, f
, result
);
82 ParserExpr
::RepMax(node
, _
) => {
83 filter_internal(*node
, f
, result
);
85 ParserExpr
::RepMinMax(node
, ..) => {
86 filter_internal(*node
, f
, result
);
88 ParserExpr
::Opt(node
) => {
89 filter_internal(*node
, f
, result
);
91 ParserExpr
::Push(node
) => {
92 filter_internal(*node
, f
, result
);
98 let mut result
= vec
![];
100 filter_internal(self, &mut f
, &mut result
);
106 #[derive(Clone, Debug, Eq, PartialEq)]
107 pub enum ParserExpr
<'i
> {
110 Range(String
, String
),
112 PeekSlice(i32, Option
<i32>),
113 PosPred(Box
<ParserNode
<'i
>>),
114 NegPred(Box
<ParserNode
<'i
>>),
115 Seq(Box
<ParserNode
<'i
>>, Box
<ParserNode
<'i
>>),
116 Choice(Box
<ParserNode
<'i
>>, Box
<ParserNode
<'i
>>),
117 Opt(Box
<ParserNode
<'i
>>),
118 Rep(Box
<ParserNode
<'i
>>),
119 RepOnce(Box
<ParserNode
<'i
>>),
120 RepExact(Box
<ParserNode
<'i
>>, u32),
121 RepMin(Box
<ParserNode
<'i
>>, u32),
122 RepMax(Box
<ParserNode
<'i
>>, u32),
123 RepMinMax(Box
<ParserNode
<'i
>>, u32, u32),
124 Push(Box
<ParserNode
<'i
>>),
127 fn convert_rule(rule
: ParserRule
) -> AstRule
{
129 ParserRule { name, ty, node, .. }
=> {
130 let expr
= convert_node(node
);
132 AstRule { name, ty, expr }
137 fn convert_node(node
: ParserNode
) -> Expr
{
139 ParserExpr
::Str(string
) => Expr
::Str(string
),
140 ParserExpr
::Insens(string
) => Expr
::Insens(string
),
141 ParserExpr
::Range(start
, end
) => Expr
::Range(start
, end
),
142 ParserExpr
::Ident(ident
) => Expr
::Ident(ident
),
143 ParserExpr
::PeekSlice(start
, end
) => Expr
::PeekSlice(start
, end
),
144 ParserExpr
::PosPred(node
) => Expr
::PosPred(Box
::new(convert_node(*node
))),
145 ParserExpr
::NegPred(node
) => Expr
::NegPred(Box
::new(convert_node(*node
))),
146 ParserExpr
::Seq(node1
, node2
) => Expr
::Seq(
147 Box
::new(convert_node(*node1
)),
148 Box
::new(convert_node(*node2
)),
150 ParserExpr
::Choice(node1
, node2
) => Expr
::Choice(
151 Box
::new(convert_node(*node1
)),
152 Box
::new(convert_node(*node2
)),
154 ParserExpr
::Opt(node
) => Expr
::Opt(Box
::new(convert_node(*node
))),
155 ParserExpr
::Rep(node
) => Expr
::Rep(Box
::new(convert_node(*node
))),
156 ParserExpr
::RepOnce(node
) => Expr
::RepOnce(Box
::new(convert_node(*node
))),
157 ParserExpr
::RepExact(node
, num
) => Expr
::RepExact(Box
::new(convert_node(*node
)), num
),
158 ParserExpr
::RepMin(node
, max
) => Expr
::RepMin(Box
::new(convert_node(*node
)), max
),
159 ParserExpr
::RepMax(node
, max
) => Expr
::RepMax(Box
::new(convert_node(*node
)), max
),
160 ParserExpr
::RepMinMax(node
, min
, max
) => {
161 Expr
::RepMinMax(Box
::new(convert_node(*node
)), min
, max
)
163 ParserExpr
::Push(node
) => Expr
::Push(Box
::new(convert_node(*node
))),
167 pub fn consume_rules(pairs
: Pairs
<Rule
>) -> Result
<Vec
<AstRule
>, Vec
<Error
<Rule
>>> {
168 let rules
= consume_rules_with_spans(pairs
)?
;
169 let errors
= validator
::validate_ast(&rules
);
170 if errors
.is_empty() {
171 Ok(rules
.into_iter().map(convert_rule
).collect())
177 fn consume_rules_with_spans
<'i
>(
178 pairs
: Pairs
<'i
, Rule
>,
179 ) -> Result
<Vec
<ParserRule
<'i
>>, Vec
<Error
<Rule
>>> {
180 let climber
= PrecClimber
::new(vec
![
181 Operator
::new(Rule
::choice_operator
, Assoc
::Left
),
182 Operator
::new(Rule
::sequence_operator
, Assoc
::Left
),
186 .filter(|pair
| pair
.as_rule() == Rule
::grammar_rule
)
188 let mut pairs
= pair
.into_inner().peekable();
190 let span
= pairs
.next().unwrap().as_span();
191 let name
= span
.as_str().to_owned();
193 pairs
.next().unwrap(); // assignment_operator
195 let ty
= if pairs
.peek().unwrap().as_rule() != Rule
::opening_brace
{
196 match pairs
.next().unwrap().as_rule() {
197 Rule
::silent_modifier
=> RuleType
::Silent
,
198 Rule
::atomic_modifier
=> RuleType
::Atomic
,
199 Rule
::compound_atomic_modifier
=> RuleType
::CompoundAtomic
,
200 Rule
::non_atomic_modifier
=> RuleType
::NonAtomic
,
207 pairs
.next().unwrap(); // opening_brace
209 let node
= consume_expr(pairs
.next().unwrap().into_inner().peekable(), &climber
)?
;
222 pairs
: Peekable
<Pairs
<'i
, Rule
>>,
223 climber
: &PrecClimber
<Rule
>,
224 ) -> Result
<ParserNode
<'i
>, Vec
<Error
<Rule
>>> {
226 mut pairs
: Peekable
<Pairs
<'i
, Rule
>>,
227 climber
: &PrecClimber
<Rule
>,
228 ) -> Result
<ParserNode
<'i
>, Vec
<Error
<Rule
>>> {
229 let pair
= pairs
.next().unwrap();
231 let node
= match pair
.as_rule() {
232 Rule
::opening_paren
=> {
233 let node
= unaries(pairs
, climber
)?
;
234 let end
= node
.span
.end_pos();
238 span
: pair
.as_span().start_pos().span(&end
),
241 Rule
::positive_predicate_operator
=> {
242 let node
= unaries(pairs
, climber
)?
;
243 let end
= node
.span
.end_pos();
246 expr
: ParserExpr
::PosPred(Box
::new(node
)),
247 span
: pair
.as_span().start_pos().span(&end
),
250 Rule
::negative_predicate_operator
=> {
251 let node
= unaries(pairs
, climber
)?
;
252 let end
= node
.span
.end_pos();
255 expr
: ParserExpr
::NegPred(Box
::new(node
)),
256 span
: pair
.as_span().start_pos().span(&end
),
260 let node
= match other_rule
{
261 Rule
::expression
=> consume_expr(pair
.into_inner().peekable(), climber
)?
,
263 let start
= pair
.clone().as_span().start_pos();
264 let mut pairs
= pair
.into_inner();
265 pairs
.next().unwrap(); // opening_paren
266 let pair
= pairs
.next().unwrap();
268 let node
= consume_expr(pair
.into_inner().peekable(), climber
)?
;
269 let end
= node
.span
.end_pos();
272 expr
: ParserExpr
::Push(Box
::new(node
)),
273 span
: start
.span(&end
),
276 Rule
::peek_slice
=> {
277 let mut pairs
= pair
.clone().into_inner();
278 pairs
.next().unwrap(); // opening_brack
279 let pair_start
= pairs
.next().unwrap(); // .. or integer
280 let start
: i32 = match pair_start
.as_rule() {
281 Rule
::range_operator
=> 0,
283 pairs
.next().unwrap(); // ..
284 pair_start
.as_str().parse().unwrap()
288 let pair_end
= pairs
.next().unwrap(); // integer or }
289 let end
: Option
<i32> = match pair_end
.as_rule() {
290 Rule
::closing_brack
=> None
,
292 pairs
.next().unwrap(); // }
293 Some(pair_end
.as_str().parse().unwrap())
298 expr
: ParserExpr
::PeekSlice(start
, end
),
299 span
: pair
.as_span(),
302 Rule
::identifier
=> ParserNode
{
303 expr
: ParserExpr
::Ident(pair
.as_str().to_owned()),
304 span
: pair
.clone().as_span(),
307 let string
= unescape(pair
.as_str()).expect("incorrect string literal");
309 expr
: ParserExpr
::Str(string
[1..string
.len() - 1].to_owned()),
310 span
: pair
.clone().as_span(),
313 Rule
::insensitive_string
=> {
314 let string
= unescape(pair
.as_str()).expect("incorrect string literal");
316 expr
: ParserExpr
::Insens(string
[2..string
.len() - 1].to_owned()),
317 span
: pair
.clone().as_span(),
321 let mut pairs
= pair
.into_inner();
322 let pair
= pairs
.next().unwrap();
323 let start
= unescape(pair
.as_str()).expect("incorrect char literal");
324 let start_pos
= pair
.clone().as_span().start_pos();
326 let pair
= pairs
.next().unwrap();
327 let end
= unescape(pair
.as_str()).expect("incorrect char literal");
328 let end_pos
= pair
.clone().as_span().end_pos();
331 expr
: ParserExpr
::Range(
332 start
[1..start
.len() - 1].to_owned(),
333 end
[1..end
.len() - 1].to_owned(),
335 span
: start_pos
.span(&end_pos
),
343 |node
: Result
<ParserNode
<'i
>, Vec
<Error
<Rule
>>>, pair
| {
346 let node
= match pair
.as_rule() {
347 Rule
::optional_operator
=> {
348 let start
= node
.span
.start_pos();
350 expr
: ParserExpr
::Opt(Box
::new(node
)),
351 span
: start
.span(&pair
.as_span().end_pos()),
354 Rule
::repeat_operator
=> {
355 let start
= node
.span
.start_pos();
357 expr
: ParserExpr
::Rep(Box
::new(node
)),
358 span
: start
.span(&pair
.as_span().end_pos()),
361 Rule
::repeat_once_operator
=> {
362 let start
= node
.span
.start_pos();
364 expr
: ParserExpr
::RepOnce(Box
::new(node
)),
365 span
: start
.span(&pair
.as_span().end_pos()),
368 Rule
::repeat_exact
=> {
369 let mut inner
= pair
.clone().into_inner();
371 inner
.next().unwrap(); // opening_brace
373 let number
= inner
.next().unwrap();
374 let num
= if let Ok(num
) = number
.as_str().parse
::<u32>() {
377 return Err(vec
![Error
::new_from_span(
378 ErrorVariant
::CustomError
{
379 message
: "number cannot overflow u32".to_owned(),
386 let error
: Error
<Rule
> = Error
::new_from_span(
387 ErrorVariant
::CustomError
{
388 message
: "cannot repeat 0 times".to_owned(),
393 return Err(vec
![error
]);
396 let start
= node
.span
.start_pos();
398 expr
: ParserExpr
::RepExact(Box
::new(node
), num
),
399 span
: start
.span(&pair
.as_span().end_pos()),
402 Rule
::repeat_min
=> {
403 let mut inner
= pair
.clone().into_inner();
405 inner
.next().unwrap(); // opening_brace
407 let min_number
= inner
.next().unwrap();
408 let min
= if let Ok(min
) = min_number
.as_str().parse
::<u32>() {
411 return Err(vec
![Error
::new_from_span(
412 ErrorVariant
::CustomError
{
413 message
: "number cannot overflow u32".to_owned(),
415 min_number
.as_span(),
419 let start
= node
.span
.start_pos();
421 expr
: ParserExpr
::RepMin(Box
::new(node
), min
),
422 span
: start
.span(&pair
.as_span().end_pos()),
425 Rule
::repeat_max
=> {
426 let mut inner
= pair
.clone().into_inner();
428 inner
.next().unwrap(); // opening_brace
429 inner
.next().unwrap(); // comma
431 let max_number
= inner
.next().unwrap();
432 let max
= if let Ok(max
) = max_number
.as_str().parse
::<u32>() {
435 return Err(vec
![Error
::new_from_span(
436 ErrorVariant
::CustomError
{
437 message
: "number cannot overflow u32".to_owned(),
439 max_number
.as_span(),
444 let error
: Error
<Rule
> = Error
::new_from_span(
445 ErrorVariant
::CustomError
{
446 message
: "cannot repeat 0 times".to_owned(),
448 max_number
.as_span(),
451 return Err(vec
![error
]);
454 let start
= node
.span
.start_pos();
456 expr
: ParserExpr
::RepMax(Box
::new(node
), max
),
457 span
: start
.span(&pair
.as_span().end_pos()),
460 Rule
::repeat_min_max
=> {
461 let mut inner
= pair
.clone().into_inner();
463 inner
.next().unwrap(); // opening_brace
465 let min_number
= inner
.next().unwrap();
466 let min
= if let Ok(min
) = min_number
.as_str().parse
::<u32>() {
469 return Err(vec
![Error
::new_from_span(
470 ErrorVariant
::CustomError
{
471 message
: "number cannot overflow u32".to_owned(),
473 min_number
.as_span(),
477 inner
.next().unwrap(); // comma
479 let max_number
= inner
.next().unwrap();
480 let max
= if let Ok(max
) = max_number
.as_str().parse
::<u32>() {
483 return Err(vec
![Error
::new_from_span(
484 ErrorVariant
::CustomError
{
485 message
: "number cannot overflow u32".to_owned(),
487 max_number
.as_span(),
492 let error
: Error
<Rule
> = Error
::new_from_span(
493 ErrorVariant
::CustomError
{
494 message
: "cannot repeat 0 times".to_owned(),
496 max_number
.as_span(),
499 return Err(vec
![error
]);
502 let start
= node
.span
.start_pos();
504 expr
: ParserExpr
::RepMinMax(Box
::new(node
), min
, max
),
505 span
: start
.span(&pair
.as_span().end_pos()),
508 Rule
::closing_paren
=> {
509 let start
= node
.span
.start_pos();
513 span
: start
.span(&pair
.as_span().end_pos()),
528 let term
= |pair
: Pair
<'i
, Rule
>| unaries(pair
.into_inner().peekable(), climber
);
529 let infix
= |lhs
: Result
<ParserNode
<'i
>, Vec
<Error
<Rule
>>>,
531 rhs
: Result
<ParserNode
<'i
>, Vec
<Error
<Rule
>>>| match op
.as_rule() {
532 Rule
::sequence_operator
=> {
536 let start
= lhs
.span
.start_pos();
537 let end
= rhs
.span
.end_pos();
540 expr
: ParserExpr
::Seq(Box
::new(lhs
), Box
::new(rhs
)),
541 span
: start
.span(&end
),
544 Rule
::choice_operator
=> {
548 let start
= lhs
.span
.start_pos();
549 let end
= rhs
.span
.end_pos();
552 expr
: ParserExpr
::Choice(Box
::new(lhs
), Box
::new(rhs
)),
553 span
: start
.span(&end
),
559 climber
.climb(pairs
, term
, infix
)
562 fn unescape(string
: &str) -> Option
<String
> {
563 let mut result
= String
::new();
564 let mut chars
= string
.chars();
568 Some('
\\'
) => match chars
.next()?
{
569 '
"' => result.push('"'
),
570 '
\\'
=> result
.push('
\\'
),
571 'r'
=> result
.push('
\r'
),
572 'n'
=> result
.push('
\n'
),
573 't'
=> result
.push('
\t'
),
574 '
0'
=> result
.push('
\0'
),
575 '
\''
=> result
.push('
\''
),
577 let string
: String
= chars
.clone().take(2).collect();
579 if string
.len() != 2 {
583 for _
in 0..string
.len() {
587 let value
= u8::from_str_radix(&string
, 16).ok()?
;
589 result
.push(char::from(value
));
592 if chars
.next()?
!= '
{'
{
596 let string
: String
= chars
.clone().take_while(|c
| *c
!= '
}'
).collect();
598 if string
.len() < 2 || 6 < string
.len() {
602 for _
in 0..string
.len() + 1 {
606 let value
= u32::from_str_radix(&string
, 16).ok()?
;
608 result
.push(char::from_u32(value
)?
);
612 Some(c
) => result
.push(c
),
613 None
=> return Some(result
),
620 use super::super::unwrap_or_report
;
627 input
: "a = { b } c = { d }",
628 rule
: Rule
::grammar_rules
,
632 assignment_operator(2, 3),
641 grammar_rule(10, 19, [
643 assignment_operator(12, 13),
644 opening_brace(14, 15),
650 closing_brace(18, 19)
660 input
: "a = ! { b ~ c }",
661 rule
: Rule
::grammar_rule
,
663 grammar_rule(0, 15, [
665 assignment_operator(2, 3),
666 non_atomic_modifier(4, 5),
672 sequence_operator(10, 11),
677 closing_brace(14, 15)
687 input
: "_a | 'a'..'b' ~ !^\"abc\" ~ (d | e)*?",
688 rule
: Rule
::expression
,
694 choice_operator(3, 4),
702 range_operator(8, 10),
704 single_quote(10, 11),
710 sequence_operator(14, 15),
712 negative_predicate_operator(16, 17),
713 insensitive_string(17, 23, [
721 sequence_operator(24, 25),
723 opening_paren(26, 27),
728 choice_operator(29, 30),
733 closing_paren(32, 33),
734 repeat_operator(33, 34),
735 optional_operator(34, 35)
747 rule
: Rule
::repeat_exact
,
763 rule
: Rule
::repeat_min
,
780 rule
: Rule
::repeat_max
,
793 fn repeat_min_max() {
797 rule
: Rule
::repeat_min_max
,
799 repeat_min_max(0, 6, [
831 fn peek_slice_all() {
835 rule
: Rule
::peek_slice
,
839 range_operator(5, 7),
847 fn peek_slice_start() {
851 rule
: Rule
::peek_slice
,
856 range_operator(6, 8),
864 fn peek_slice_end() {
867 input
: "PEEK[ ..-1]",
868 rule
: Rule
::peek_slice
,
872 range_operator(6, 8),
874 closing_brack(10, 11)
881 fn peek_slice_start_end() {
884 input
: "PEEK[-5..10]",
885 rule
: Rule
::peek_slice
,
890 range_operator(7, 9),
892 closing_brack(11, 12)
903 rule
: Rule
::identifier
,
914 input
: "\"aaaaa\\n\\r\\t\\\\\\0\\'\\\"\\x0F\\u{123abC}\\u{12}aaaaa\"",
927 fn insensitive_string() {
930 input
: "^ \"\\\"hi\"",
931 rule
: Rule
::insensitive_string
,
933 insensitive_string(0, 9, [
948 input
: "'\\n' .. '\\x1a'",
957 range_operator(5, 7),
972 input
: "'\\u{123abC}'",
973 rule
: Rule
::character
,
1000 input
: "a ~ // asda\n b",
1001 rule
: Rule
::expression
,
1007 sequence_operator(2, 3),
1017 fn wrong_identifier() {
1021 rule
: Rule
::grammar_rules
,
1022 positives
: vec
![Rule
::identifier
],
1029 fn missing_assignment_operator() {
1033 rule
: Rule
::grammar_rules
,
1034 positives
: vec
![Rule
::assignment_operator
],
1041 fn wrong_modifier() {
1045 rule
: Rule
::grammar_rules
,
1047 Rule
::opening_brace
,
1048 Rule
::silent_modifier
,
1049 Rule
::atomic_modifier
,
1050 Rule
::compound_atomic_modifier
,
1051 Rule
::non_atomic_modifier
1059 fn missing_opening_brace() {
1063 rule
: Rule
::grammar_rules
,
1064 positives
: vec
![Rule
::opening_brace
],
1075 rule
: Rule
::grammar_rules
,
1076 positives
: vec
![Rule
::term
],
1086 input
: "a = { b ~ }",
1087 rule
: Rule
::grammar_rules
,
1088 positives
: vec
![Rule
::term
],
1098 input
: "a = { b % }",
1099 rule
: Rule
::grammar_rules
,
1101 Rule
::opening_brace
,
1102 Rule
::closing_brace
,
1103 Rule
::sequence_operator
,
1104 Rule
::choice_operator
,
1105 Rule
::optional_operator
,
1106 Rule
::repeat_operator
,
1107 Rule
::repeat_once_operator
1115 fn missing_closing_paren() {
1118 input
: "a = { (b }",
1119 rule
: Rule
::grammar_rules
,
1121 Rule
::opening_brace
,
1122 Rule
::closing_paren
,
1123 Rule
::sequence_operator
,
1124 Rule
::choice_operator
,
1125 Rule
::optional_operator
,
1126 Rule
::repeat_operator
,
1127 Rule
::repeat_once_operator
1139 rule
: Rule
::grammar_rules
,
1141 Rule
::opening_paren
,
1142 Rule
::positive_predicate_operator
,
1143 Rule
::negative_predicate_operator
,
1147 Rule
::insensitive_string
,
1157 fn string_missing_ending_quote() {
1160 input
: "a = { \" }",
1161 rule
: Rule
::grammar_rules
,
1162 positives
: vec
![Rule
::quote
],
1169 fn insensitive_missing_string() {
1173 rule
: Rule
::grammar_rules
,
1174 positives
: vec
![Rule
::quote
],
1181 fn char_missing_ending_single_quote() {
1184 input
: "a = { \' }",
1185 rule
: Rule
::grammar_rules
,
1186 positives
: vec
![Rule
::single_quote
],
1193 fn range_missing_range_operator() {
1196 input
: "a = { \'a\' }",
1197 rule
: Rule
::grammar_rules
,
1198 positives
: vec
![Rule
::range_operator
],
1205 fn wrong_postfix() {
1208 input
: "a = { a& }",
1209 rule
: Rule
::grammar_rules
,
1211 Rule
::opening_brace
,
1212 Rule
::closing_brace
,
1213 Rule
::sequence_operator
,
1214 Rule
::choice_operator
,
1215 Rule
::optional_operator
,
1216 Rule
::repeat_operator
,
1217 Rule
::repeat_once_operator
1227 "rule = _{ a{1} ~ \"a\"{3,} ~ b{, 2} ~ \"b\"{1, 2} | !(^\"c\" | PUSH('d'..'e'))?* }";
1229 let pairs
= PestParser
::parse(Rule
::grammar_rules
, input
).unwrap();
1230 let ast
= consume_rules_with_spans(pairs
).unwrap();
1231 let ast
: Vec
<_
> = ast
.into_iter().map(|rule
| convert_rule(rule
)).collect();
1236 name
: "rule".to_owned(),
1237 ty
: RuleType
::Silent
,
1242 Box
::new(Expr
::RepExact(Box
::new(Expr
::Ident("a".to_owned())), 1)),
1243 Box
::new(Expr
::RepMin(Box
::new(Expr
::Str("a".to_owned())), 3))
1245 Box
::new(Expr
::RepMax(Box
::new(Expr
::Ident("b".to_owned())), 2))
1247 Box
::new(Expr
::RepMinMax(Box
::new(Expr
::Str("b".to_owned())), 1, 2))
1249 Box
::new(Expr
::NegPred(Box
::new(Expr
::Rep(Box
::new(Expr
::Opt(
1250 Box
::new(Expr
::Choice(
1251 Box
::new(Expr
::Insens("c".to_owned())),
1252 Box
::new(Expr
::Push(Box
::new(Expr
::Range(
1264 fn ast_peek_slice() {
1265 let input
= "rule = _{ PEEK[-04..] ~ PEEK[..3] }";
1267 let pairs
= PestParser
::parse(Rule
::grammar_rules
, input
).unwrap();
1268 let ast
= consume_rules_with_spans(pairs
).unwrap();
1269 let ast
: Vec
<_
> = ast
.into_iter().map(|rule
| convert_rule(rule
)).collect();
1274 name
: "rule".to_owned(),
1275 ty
: RuleType
::Silent
,
1277 Box
::new(Expr
::PeekSlice(-4, None
)),
1278 Box
::new(Expr
::PeekSlice(0, Some(3))),
1285 #[should_panic(expected = "grammar error
1289 1 | rule = { \"\"{4294967297} }
1292 = number cannot overflow u32")]
1293 fn repeat_exact_overflow() {
1294 let input
= "rule = { \"\"{4294967297} }";
1296 let pairs
= PestParser
::parse(Rule
::grammar_rules
, input
).unwrap();
1297 unwrap_or_report(consume_rules_with_spans(pairs
));
1301 #[should_panic(expected = "grammar error
1305 1 | rule = { \"\"{0} }
1308 = cannot repeat 0 times")]
1309 fn repeat_exact_zero() {
1310 let input
= "rule = { \"\"{0} }";
1312 let pairs
= PestParser
::parse(Rule
::grammar_rules
, input
).unwrap();
1313 unwrap_or_report(consume_rules_with_spans(pairs
));
1317 #[should_panic(expected = "grammar error
1321 1 | rule = { \"\"{4294967297,} }
1324 = number cannot overflow u32")]
1325 fn repeat_min_overflow() {
1326 let input
= "rule = { \"\"{4294967297,} }";
1328 let pairs
= PestParser
::parse(Rule
::grammar_rules
, input
).unwrap();
1329 unwrap_or_report(consume_rules_with_spans(pairs
));
1333 #[should_panic(expected = "grammar error
1337 1 | rule = { \"\"{,4294967297} }
1340 = number cannot overflow u32")]
1341 fn repeat_max_overflow() {
1342 let input
= "rule = { \"\"{,4294967297} }";
1344 let pairs
= PestParser
::parse(Rule
::grammar_rules
, input
).unwrap();
1345 unwrap_or_report(consume_rules_with_spans(pairs
));
1349 #[should_panic(expected = "grammar error
1353 1 | rule = { \"\"{,0} }
1356 = cannot repeat 0 times")]
1357 fn repeat_max_zero() {
1358 let input
= "rule = { \"\"{,0} }";
1360 let pairs
= PestParser
::parse(Rule
::grammar_rules
, input
).unwrap();
1361 unwrap_or_report(consume_rules_with_spans(pairs
));
1365 #[should_panic(expected = "grammar error
1369 1 | rule = { \"\"{4294967297,4294967298} }
1372 = number cannot overflow u32")]
1373 fn repeat_min_max_overflow() {
1374 let input
= "rule = { \"\"{4294967297,4294967298} }";
1376 let pairs
= PestParser
::parse(Rule
::grammar_rules
, input
).unwrap();
1377 unwrap_or_report(consume_rules_with_spans(pairs
));
1381 #[should_panic(expected = "grammar error
1385 1 | rule = { \"\"{0,0} }
1388 = cannot repeat 0 times")]
1389 fn repeat_min_max_zero() {
1390 let input
= "rule = { \"\"{0,0} }";
1392 let pairs
= PestParser
::parse(Rule
::grammar_rules
, input
).unwrap();
1393 unwrap_or_report(consume_rules_with_spans(pairs
));
1398 let string
= r
"a\nb\x55c\u{111}d";
1400 assert_eq
!(unescape(string
), Some("a\nb\x55c\u{111}d".to_owned()));
1404 fn unescape_empty_escape() {
1407 assert_eq
!(unescape(string
), None
);
1411 fn unescape_wrong_escape() {
1414 assert_eq
!(unescape(string
), None
);
1418 fn unescape_backslash() {
1419 let string
= "\\\\";
1420 assert_eq
!(unescape(string
), Some("\\".to_owned()));
1424 fn unescape_return() {
1426 assert_eq
!(unescape(string
), Some("\r".to_owned()));
1432 assert_eq
!(unescape(string
), Some("\t".to_owned()));
1436 fn unescape_null() {
1438 assert_eq
!(unescape(string
), Some("\0".to_owned()));
1442 fn unescape_single_quote() {
1444 assert_eq
!(unescape(string
), Some("\'".to_owned()));
1448 fn unescape_wrong_byte() {
1449 let string
= r
"\xfg";
1451 assert_eq
!(unescape(string
), None
);
1455 fn unescape_short_byte() {
1456 let string
= r
"\xf";
1458 assert_eq
!(unescape(string
), None
);
1462 fn unescape_no_open_brace_unicode() {
1463 let string
= r
"\u11";
1465 assert_eq
!(unescape(string
), None
);
1469 fn unescape_no_close_brace_unicode() {
1470 let string
= r
"\u{11";
1472 assert_eq
!(unescape(string
), None
);
1476 fn unescape_short_unicode() {
1477 let string
= r
"\u{1}";
1479 assert_eq
!(unescape(string
), None
);
1483 fn unescape_long_unicode() {
1484 let string
= r
"\u{1111111}";
1486 assert_eq
!(unescape(string
), None
);