summaryrefslogtreecommitdiff
path: root/nfa/src/desrec.rs
blob: c57d3136a4ce095138026a4397d3ed494eb03105 (plain)
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
//! This file defines the expected behaviours of a recursive descent
//! parser.

use super::Regex;
use graph::GraphLabel;

/// A thin wrapper of the parse output, to simplify the function
/// signature a little.
pub type ParseOutput<'a, T> = Option<(T, &'a str)>;

/// Types implementing this trait provide a method to be recursively
/// parsed.
pub trait DesRec {
    /// The type of labels of the resulting regular expression.
    type Label: GraphLabel;

    /// The type of the resulting regular expression.
    type Regex: Regex<Self::Label>;

    /// The type of errors encountered when parsing.
    type Error: std::error::Error;

    /// Auxiliary data when parsing
    type Aux;

    /// The type of a scanner that classifies inputs into tokens.
    ///
    /// The return type indicates the result of classification:
    ///
    /// - `Err(_)`: the classification fails
    ///
    /// - `Ok(None)`: the classification succeeds, and the parsing
    /// should stop here
    ///
    /// - `Ok(Some(_))`: the classification succeeds and the parsing
    /// should continue.
    type Scanner<'a>: FnMut(&'a str) -> Result<Option<(usize, Self::Label, Self::Aux)>, Self::Error>;

    /// Parse a string into a regular expression with the aid of this
    /// type.
    ///
    /// Accept a slice of string and return either a parsing error, or
    /// a pair of correctly parsed regular expression and the
    /// remaining slice.
    fn parse<'a>(
        input: &'a str,
        scanner: Self::Scanner<'a>,
        post_p: bool,
    ) -> Result<ParseOutput<'a, Self::Regex>, Self::Error>;
}