crabwise_antlr_parser/
ast.rs1use combine_proc_macro::{Ident, Literal};
2
3#[derive(Debug)]
4pub struct Grammar {
5 pub name: Ident,
6 pub rules: Vec<Rule>,
7}
8
9#[derive(Debug)]
10pub struct Rule {
11 pub name: Ident,
12 pub pattern: Pattern,
13 pub attributes: Vec<Attribute>,
14}
15
16#[derive(Debug)]
17pub enum Attribute {
18 Word(Ident), Group(Ident, Vec<Attribute>), }
21
22#[derive(Debug)]
23pub enum Pattern {
24 Empty,
25
26 Ident(Ident),
28
29 Literal(Literal),
31
32 Series(Vec<Pattern>),
34
35 Choice(Vec<Pattern>),
37
38 Repeat { pattern: Box<Pattern>, repeat: Repeat },
40
41 Predicate { pred: Box<Pattern>, expr: Box<Pattern> },
50}
51
52impl Pattern {
53 pub fn is_empty(&self) -> bool {
54 std::mem::discriminant(self) == std::mem::discriminant(&Pattern::Empty)
55 }
56
57 pub fn flatten_once(mut self) -> Pattern {
59 match self {
60 Pattern::Choice(ref mut p) if p.len() == 0 => Pattern::Empty,
61 Pattern::Choice(ref mut p) if p.len() == 1 => p.drain(0..1).next().unwrap(),
62 Pattern::Series(ref mut p) if p.len() == 0 => Pattern::Empty,
63 Pattern::Series(ref mut p) if p.len() == 1 => p.drain(0..1).next().unwrap(),
64 Pattern::Repeat { ref pattern, .. } if pattern.is_empty() => Pattern::Empty,
65 Pattern::Predicate { pred, expr } => {
66 if pred.is_empty() {
67 *expr
68 } else {
69 Pattern::Predicate { pred, expr }
70 }
71 }
72 _ => self,
73 }
74 }
75
76 }
79
80#[derive(Copy, Clone, Debug)]
81pub enum Repeat {
82 ZeroOrOne,
83 ZeroOrMore,
84 OneOrMore,
85}