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
use crate::sources::character_class::CharacterClass;
use crate::sources::span::Span;
use std::collections::HashMap;

#[derive(Debug, Clone)]
pub enum CoreExpression<'src> {
    Name(&'src str),
    Sequence(Vec<CoreExpression<'src>>),
    Repeat {
        subexpr: Box<CoreExpression<'src>>,
        min: u64,
        max: Option<u64>,
    },
    CharacterClass(CharacterClass),
    Choice(Vec<CoreExpression<'src>>),
    FlagNoLayout(Box<CoreExpression<'src>>),
    FlagNoErrors(Box<CoreExpression<'src>>, String),
}

#[derive(Debug, Clone)]
pub struct CoreAst<'src> {
    pub sorts: HashMap<&'src str, CoreExpression<'src>>,
    pub starting_sort: &'src str,
}

#[derive(Debug, Clone)]
pub enum ParsePairRaw {
    Name(Span, Box<ParsePairRaw>),
    List(Span, Vec<ParsePairRaw>),
    Choice(Span, usize, Box<ParsePairRaw>),
    Empty(Span),
    Error(Span),
}

impl ParsePairRaw {
    /// What span does this parse pair occupy?
    pub fn span(&self) -> Span {
        match self {
            ParsePairRaw::Name(span, _) => span,
            ParsePairRaw::List(span, _) => span,
            ParsePairRaw::Choice(span, _, _) => span,
            ParsePairRaw::Empty(span) => span,
            ParsePairRaw::Error(span) => span,
        }
        .clone()
    }
}