pa_rs/
parser.rs

1use std::fmt::Debug;
2
3#[derive(PartialEq, Debug)]
4pub enum Either<T, U> {
5    Left(T),
6    Right(U),
7}
8
9pub struct ParseOk<'a, T> {
10    result: T,
11    input: &'a str,
12}
13
14impl<'a, T> ParseOk<'a, T> {
15    fn new(result: T, input: &'a str) -> Self {
16        ParseOk { result, input }
17    }
18}
19
20pub type ParseResult<'a, T> = Result<ParseOk<'a, T>, String>;
21
22pub trait Parse
23where
24    Self: Sized,
25    Self::Result: PartialEq + Debug,
26{
27    type Result;
28
29    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result>;
30
31    fn run(&self, input: &str) -> Result<Self::Result, String> {
32        self.parse(input).map(|x| x.result)
33    }
34
35    fn and<U: Parse>(self, other: U) -> And<Self, U> {
36        And(self, other)
37    }
38
39    fn and_ref<'a, U: Parse>(&'a self, other: &'a U) -> AndRef<'a, Self, U> {
40        AndRef(self, other)
41    }
42
43    fn or<U: Parse>(self, other: U) -> Or<Self, U> {
44        Or(self, other)
45    }
46
47    fn or_ref<'a, U: Parse>(&'a self, other: &'a U) -> OrRef<'a, Self, U> {
48        OrRef(self, other)
49    }
50
51    fn map<U, F: Fn(Self::Result) -> U>(self, f: F) -> Map<Self, F, U> {
52        Map(self, f)
53    }
54
55    fn map_ref<'a, U, F: Fn(Self::Result) -> U>(&'a self, f: &'a F) -> MapRef<'a, Self, F, U> {
56        MapRef(self, f)
57    }
58
59    fn zero_or_more(self) -> ZeroOrMoreOf<Self> {
60        ZeroOrMoreOf(self)
61    }
62
63    fn zero_or_more_ref<'a>(&'a self) -> ZeroOrMoreOfRef<'a, Self> {
64        ZeroOrMoreOfRef(self)
65    }
66
67    fn one_or_more(self) -> OneOrMoreOf<Self> {
68        OneOrMoreOf(self)
69    }
70
71    fn one_or_more_ref<'a>(&'a self) -> OneOrMoreOfRef<'a, Self> {
72        OneOrMoreOfRef(self)
73    }
74
75    fn drop<U: Parse>(self, other: U) -> Drop<Self, U> {
76        Drop(self, other)
77    }
78
79    fn drop_ref<'a, U: Parse>(&'a self, other: &'a U) -> DropRef<'a, Self, U> {
80        DropRef(self, other)
81    }
82
83    fn keep<U: Parse>(self, other: U) -> Keep<Self, U> {
84        Keep(self, other)
85    }
86
87    fn keep_ref<'a, U: Parse>(&'a self, other: &'a U) -> KeepRef<'a, Self, U> {
88        KeepRef(self, other)
89    }
90
91    fn sbws(self) -> Sbws<Self> {
92        Sbws(self)
93    }
94
95    fn sbws_ref<'a>(&'a self) -> SbwsRef<'a, Self> {
96        SbwsRef(self)
97    }
98
99    fn sep_by(self, sep: char) -> SepBy<Self> {
100        SepBy(self, sep)
101    }
102
103    fn sep_by_ref<'a>(&'a self, sep: char) -> SepByRef<'a, Self> {
104        SepByRef(self, sep)
105    }
106
107    fn parse_while<F: Fn(&Self::Result) -> bool>(self, f: F) -> ParseWhile<Self, F> {
108        ParseWhile(self, f)
109    }
110
111    fn parse_while_ref<'a, F: Fn(&Self::Result) -> bool>(
112        &'a self,
113        f: &'a F,
114    ) -> ParseWhileRef<'a, Self, F> {
115        ParseWhileRef(self, f)
116    }
117}
118
119pub struct NullParser;
120
121impl Parse for NullParser {
122    type Result = ();
123
124    fn parse<'a>(&self, input: &'a str) -> ParseResult<'a, Self::Result> {
125        Ok(ParseOk::new((), input))
126    }
127}
128
129pub struct CharParser(char);
130
131impl Parse for CharParser {
132    type Result = char;
133
134    fn parse<'a>(&self, input: &'a str) -> ParseResult<'a, Self::Result> {
135        match input.as_bytes().get(0) {
136            Some(x) => {
137                let ch = *x as char;
138                if ch == self.0 {
139                    Ok(ParseOk {
140                        result: ch,
141                        input: &input[1..],
142                    })
143                } else {
144                    Err(format!("Expected {:?} but found {:?}", self.0, ch))
145                }
146            }
147            None => Err(format!("No Characters left to parse")),
148        }
149    }
150}
151
152pub struct AnyCharParser;
153
154impl Parse for AnyCharParser {
155    type Result = char;
156
157    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result> {
158        match input.as_bytes().get(0) {
159            Some(&ch) => Ok(ParseOk {
160                result: ch as char,
161                input: &input[1..],
162            }),
163            None => Err(format!("No Input left to parse")),
164        }
165    }
166}
167
168pub struct And<T: Parse, U: Parse>(T, U);
169
170impl<T: Parse, U: Parse> Parse for And<T, U> {
171    type Result = (<T as Parse>::Result, <U as Parse>::Result);
172
173    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result> {
174        AndRef(&self.0, &self.1).parse(input)
175    }
176}
177pub struct AndRef<'a, T: Parse, U: Parse>(&'a T, &'a U);
178
179impl<'a, T: Parse, U: Parse> Parse for AndRef<'a, T, U> {
180    type Result = (<T as Parse>::Result, <U as Parse>::Result);
181
182    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result> {
183        let ParseOk { result: lhs, input } = self.0.parse(input)?;
184        let ParseOk { result: rhs, input } = self.1.parse(input)?;
185        Ok(ParseOk::new((lhs, rhs), input))
186    }
187}
188
189pub struct Or<T: Parse, U: Parse>(T, U);
190
191impl<T: Parse, U: Parse> Parse for Or<T, U> {
192    type Result = Either<<T as Parse>::Result, <U as Parse>::Result>;
193
194    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result> {
195        OrRef(&self.0, &self.1).parse(input)
196    }
197}
198
199pub struct OrRef<'a, T: Parse, U: Parse>(&'a T, &'a U);
200
201impl<'a, T: Parse, U: Parse> Parse for OrRef<'a, T, U> {
202    type Result = Either<<T as Parse>::Result, <U as Parse>::Result>;
203
204    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result> {
205        match self.0.parse(input) {
206            Ok(ParseOk { result, input }) => Ok(ParseOk::new(Either::Left(result), input)),
207            _ => match self.1.parse(input) {
208                Ok(ParseOk { result, input }) => Ok(ParseOk::new(Either::Right(result), input)),
209                Err(err) => Err(err),
210            },
211        }
212    }
213}
214
215pub struct Map<T: Parse, F: Fn(<T as Parse>::Result) -> U, U>(T, F);
216
217impl<T: Parse, U: PartialEq + Debug, F: Fn(<T as Parse>::Result) -> U> Parse for Map<T, F, U> {
218    type Result = U;
219
220    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result> {
221        MapRef(&self.0, &self.1).parse(input)
222    }
223}
224
225pub struct MapRef<'a, T: Parse, F: Fn(<T as Parse>::Result) -> U, U>(&'a T, &'a F);
226
227impl<'a, T: Parse, U: PartialEq + Debug, F: Fn(<T as Parse>::Result) -> U> Parse
228    for MapRef<'a, T, F, U>
229{
230    type Result = U;
231
232    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result> {
233        let ParseOk { result, input } = self.0.parse(input)?;
234        Ok(ParseOk::new((self.1)(result), input))
235    }
236}
237
238pub struct AllOf<T: Parse>(Vec<T>);
239
240impl<T: Parse> Parse for AllOf<T> {
241    type Result = Vec<<T as Parse>::Result>;
242
243    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result> {
244        AllOfRef(&self.0).parse(input)
245    }
246}
247
248pub struct AllOfRef<'a, T: Parse>(&'a Vec<T>);
249
250impl<'a, T: Parse> Parse for AllOfRef<'a, T> {
251    type Result = Vec<<T as Parse>::Result>;
252
253    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result> {
254        let mut results = ParseOk::new(vec![], input);
255        for parser in self.0.iter() {
256            let ParseOk { result, input } = parser.parse(results.input)?;
257            results.result.push(result);
258            results.input = input;
259        }
260
261        Ok(results)
262    }
263}
264
265pub struct OneOf<T: Parse>(Vec<T>);
266
267impl<T: Parse> Parse for OneOf<T> {
268    type Result = <T as Parse>::Result;
269
270    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result> {
271        OneOfRef(&self.0).parse(input)
272    }
273}
274pub struct OneOfRef<'a, T: Parse>(&'a Vec<T>);
275
276impl<'a, T: Parse> Parse for OneOfRef<'a, T> {
277    type Result = <T as Parse>::Result;
278
279    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result> {
280        let mut error = "Nothing to parse".into();
281        for parser in self.0.iter() {
282            match parser.parse(input) {
283                Ok(result) => return Ok(result),
284                Err(err) => error = err,
285            }
286        }
287        Err(error)
288    }
289}
290
291pub struct ZeroOrMoreOf<T: Parse>(T);
292
293impl<T: Parse> Parse for ZeroOrMoreOf<T> {
294    type Result = Vec<<T as Parse>::Result>;
295
296    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result> {
297        ZeroOrMoreOfRef(&self.0).parse(input)
298    }
299}
300
301pub struct ZeroOrMoreOfRef<'a, T: Parse>(&'a T);
302
303impl<'a, T: Parse> Parse for ZeroOrMoreOfRef<'a, T> {
304    type Result = Vec<<T as Parse>::Result>;
305
306    fn parse<'b>(&self, mut input: &'b str) -> ParseResult<'b, Self::Result> {
307        let mut results = vec![];
308        while let Ok(ParseOk {
309            result,
310            input: input1,
311        }) = self.0.parse(input)
312        {
313            results.push(result);
314            input = input1;
315        }
316
317        Ok(ParseOk::new(results, input))
318    }
319}
320
321pub struct OneOrMoreOf<T: Parse>(T);
322
323impl<T: Parse> Parse for OneOrMoreOf<T> {
324    type Result = Vec<<T as Parse>::Result>;
325
326    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result> {
327        OneOrMoreOfRef(&self.0).parse(input)
328    }
329}
330
331pub struct OneOrMoreOfRef<'a, T: Parse>(&'a T);
332
333impl<'a, T: Parse> Parse for OneOrMoreOfRef<'a, T> {
334    type Result = Vec<<T as Parse>::Result>;
335
336    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result> {
337        let ParseOk { result, mut input } = self.0.parse(input)?;
338        let mut results = vec![result];
339
340        while let Ok(ParseOk {
341            result,
342            input: input1,
343        }) = self.0.parse(input)
344        {
345            results.push(result);
346            input = input1;
347        }
348
349        Ok(ParseOk::new(results, input))
350    }
351}
352
353pub struct Drop<T: Parse, U: Parse>(T, U);
354
355impl<T: Parse, U: Parse> Parse for Drop<T, U> {
356    type Result = <U as Parse>::Result;
357
358    fn parse<'a>(&self, input: &'a str) -> ParseResult<'a, Self::Result> {
359        DropRef(&self.0, &self.1).parse(input)
360    }
361}
362
363pub struct DropRef<'a, T: Parse, U: Parse>(&'a T, &'a U);
364
365impl<'a, T: Parse, U: Parse> Parse for DropRef<'a, T, U> {
366    type Result = <U as Parse>::Result;
367
368    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result> {
369        let ParseOk { input, .. } = self.0.parse(input)?;
370        self.1.parse(input)
371    }
372}
373
374pub struct Keep<T: Parse, U: Parse>(T, U);
375
376impl<T: Parse, U: Parse> Parse for Keep<T, U> {
377    type Result = <T as Parse>::Result;
378
379    fn parse<'a>(&self, input: &'a str) -> ParseResult<'a, Self::Result> {
380        KeepRef(&self.0, &self.1).parse(input)
381    }
382}
383
384pub struct KeepRef<'a, T: Parse, U: Parse>(&'a T, &'a U);
385
386impl<'a, T: Parse, U: Parse> Parse for KeepRef<'a, T, U> {
387    type Result = <T as Parse>::Result;
388
389    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result> {
390        let ParseOk { result, input } = self.0.parse(input)?;
391        let ParseOk { input, .. } = self.1.parse(input)?;
392        Ok(ParseOk { result, input })
393    }
394}
395
396pub struct WhitespaceParser;
397
398impl Parse for WhitespaceParser {
399    type Result = String;
400
401    fn parse<'a>(&self, mut input: &'a str) -> ParseResult<'a, Self::Result> {
402        let mut ws = String::new();
403        while let Ok(ParseOk {
404            result,
405            input: input1,
406        }) = one_of_p(" \n\t\r".chars().map(|ch| CharParser(ch))).parse(input)
407        {
408            ws.push(result);
409            input = input1;
410        }
411        Ok(ParseOk { result: ws, input })
412    }
413}
414
415pub struct Sbws<T: Parse>(T);
416
417impl<T: Parse> Parse for Sbws<T> {
418    type Result = <T as Parse>::Result;
419
420    fn parse<'a>(&self, input: &'a str) -> ParseResult<'a, Self::Result> {
421        SbwsRef(&self.0).parse(input)
422    }
423}
424
425pub struct SbwsRef<'a, T: Parse>(&'a T);
426
427impl<'a, T: Parse> Parse for SbwsRef<'a, T> {
428    type Result = <T as Parse>::Result;
429
430    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result> {
431        let ParseOk { input, .. } = WhitespaceParser.parse(input)?;
432        let ParseOk { result, input } = self.0.parse(input)?;
433        let ParseOk { input, .. } = WhitespaceParser.parse(input)?;
434        Ok(ParseOk { result, input })
435    }
436}
437
438pub struct SepBy<T: Parse>(T, char);
439
440impl<T: Parse> Parse for SepBy<T> {
441    type Result = Vec<<T as Parse>::Result>;
442
443    fn parse<'a>(&self, input: &'a str) -> ParseResult<'a, Self::Result> {
444        SepByRef(&self.0, self.1).parse(input)
445    }
446}
447
448pub struct SepByRef<'a, T: Parse>(&'a T, char);
449
450impl<'b, T: Parse> Parse for SepByRef<'b, T> {
451    type Result = Vec<<T as Parse>::Result>;
452
453    fn parse<'a>(&self, input: &'a str) -> ParseResult<'a, Self::Result> {
454        self.0
455            .sbws_ref()
456            .keep_ref(&CharParser(self.1).sbws())
457            .zero_or_more_ref()
458            .and(self.0.sbws_ref())
459            .map(|(mut v, e)| {
460                v.push(e);
461                v
462            })
463            .parse(input)
464    }
465}
466
467pub struct ParseSquareList<T: Parse>(T);
468
469impl<T: Parse> Parse for ParseSquareList<T> {
470    type Result = Vec<<T as Parse>::Result>;
471
472    fn parse<'a>(&self, input: &'a str) -> ParseResult<'a, Self::Result> {
473        ParseSquareListRef(&self.0).parse(input)
474    }
475}
476
477pub struct ParseSquareListRef<'a, T: Parse>(&'a T);
478
479impl<'a, T: Parse> Parse for ParseSquareListRef<'a, T> {
480    type Result = Vec<<T as Parse>::Result>;
481
482    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result> {
483        CharParser('[')
484            .drop(
485                self.0
486                    .sep_by_ref(',')
487                    .or(NullParser)
488                    .map(|either| match either {
489                        Either::Left(left) => left,
490                        Either::Right(_) => {
491                            vec![]
492                        }
493                    }),
494            )
495            .keep(CharParser(']'))
496            .parse(input)
497    }
498}
499
500pub struct ParseWhile<T: Parse, F: Fn(&'_ <T as Parse>::Result) -> bool>(T, F);
501
502impl<'a, T: Parse, F: Fn(&'_ <T as Parse>::Result) -> bool> Parse for ParseWhile<T, F> {
503    type Result = Vec<<T as Parse>::Result>;
504
505    fn parse<'b>(&self, input: &'b str) -> ParseResult<'b, Self::Result> {
506        ParseWhileRef(&self.0, &self.1).parse(input)
507    }
508}
509
510pub struct ParseWhileRef<'a, T: Parse, F: Fn(&'_ <T as Parse>::Result) -> bool>(&'a T, &'a F);
511
512impl<'a, T: Parse, F: Fn(&'_ <T as Parse>::Result) -> bool> Parse for ParseWhileRef<'a, T, F> {
513    type Result = Vec<<T as Parse>::Result>;
514
515    fn parse<'b>(&self, mut input: &'b str) -> ParseResult<'b, Self::Result> {
516        let mut results = vec![];
517
518        while let Ok(ParseOk {
519            result,
520            input: input1,
521        }) = self.0.parse(input)
522        {
523            let pred = self.1(&result);
524            if pred {
525                results.push(result);
526                input = input1;
527            } else {
528                break;
529            }
530        }
531
532        Ok(ParseOk::new(results, input))
533    }
534}
535
536pub struct StringParser(String);
537
538impl Parse for StringParser {
539    type Result = String;
540
541    fn parse<'b>(&self, mut input: &'b str) -> ParseResult<'b, Self::Result> {
542        for ch in self.0.chars() {
543            let ParseOk { input: input1, .. } = CharParser(ch).parse(input)?;
544            input = input1;
545        }
546
547        Ok(ParseOk::new(self.0.clone(), input))
548    }
549}
550
551pub fn char_p(ch: char) -> CharParser {
552    CharParser(ch)
553}
554
555pub fn any_char_p() -> AnyCharParser {
556    AnyCharParser
557}
558
559pub fn str_p(st: &str) -> StringParser {
560    StringParser(st.to_string())
561}
562
563pub fn one_of_p<I: IntoIterator<Item = T>, T: Parse>(iter: I) -> OneOf<T> {
564    OneOf(iter.into_iter().collect())
565}
566
567pub fn bool_p() -> impl Parse<Result = bool> {
568    one_of_p([str_p("true"), str_p("false")])
569        .map(|x| x.parse::<bool>().expect("Cannot convert to bool"))
570}
571
572pub fn digit() -> impl Parse<Result = char> {
573    one_of_p(('0'..='9').map(|ch| CharParser(ch)))
574}
575
576pub fn uint_p() -> impl Parse<Result = u64> {
577    digit().one_or_more().map(|x| {
578        x.into_iter()
579            .collect::<String>()
580            .parse()
581            .expect("This has to be an int")
582    })
583}
584
585pub fn int_p() -> impl Parse<Result = i64> {
586    CharParser('-').and(uint_p()).or(uint_p()).map(|x| match x {
587        Either::Left((_, x)) => -(x as i64),
588        Either::Right(x) => x as i64,
589    })
590}
591
592pub fn float_p() -> impl Parse<Result = f64> {
593    int_p()
594        .and(CharParser('.'))
595        .and(uint_p())
596        .map(|((l, _), r)| format!("{l}.{r}").parse().expect("Cannot convert to float"))
597        .or(uint_p().and(CharParser('.')).map(|(x, _)| x as f64))
598        .map(|x| match x {
599            Either::Left(l) => l,
600            Either::Right(r) => r,
601        })
602        .or(uint_p())
603        .map(|x| match x {
604            Either::Left(l) => l,
605            Either::Right(r) => r as f64,
606        })
607}
608
609pub fn whitespace() -> WhitespaceParser {
610    WhitespaceParser
611}
612
613pub fn list_square_p<T: Parse>(t: T) -> ParseSquareList<T> {
614    ParseSquareList(t)
615}
616
617pub fn dq_str_p() -> impl Parse<Result = String> {
618    char_p('"')
619        .drop(any_char_p().parse_while(|&x| x != '"'))
620        .keep(char_p('"'))
621        .map(|x| x.into_iter().collect())
622}
623
624pub fn sq_str_p() -> impl Parse<Result = String> {
625    char_p('\'')
626        .drop(any_char_p().parse_while(|&x| x != '\''))
627        .keep(char_p('\''))
628        .map(|x| x.into_iter().collect())
629}