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
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
use crate::lexer::token::Token;
use crate::common::{ KeywordType, OperatorType };


pub fn ignore (t: &Token) -> bool {
  t.is_ignore()
}

pub fn nil (t: &Token) -> bool {
  t.is_nil()
}

pub fn ident (t: &Token) -> bool {
  t.is_ident()
}

pub fn ident_or_ignore (t: &Token) -> bool {
  t.is_ident_or_ignore()
}

pub fn boolean (t: &Token) -> bool {
  t.is_boolean()
}

pub fn number (t: &Token) -> bool {
  t.is_number()
}

pub fn string (t: &Token) -> bool {
  t.is_string()
}

pub fn literal (t: &Token) -> bool {
  t.is_literal()
}

pub fn literal_or_ignore (t: &Token) -> bool {
  t.is_literal_or_ignore()
}

pub fn primary (t: &Token) -> bool {
  t.is_primary()
}

pub fn primary_or_ignore (t: &Token) -> bool {
  t.is_primary_or_ignore()
}

pub fn any_op (t: &Token) -> bool {
  t.is_any_op()
}

pub fn any_kw (t: &Token) -> bool {
  t.is_any_kw()
}



pub fn specific_op (op: OperatorType) -> impl Fn (&Token) -> bool {
  move |t| t.is_specific_op(op)
}

pub fn specific_kw (kw: KeywordType) -> impl Fn (&Token) -> bool {
  move |t| t.is_specific_kw(kw)
}

pub fn or (mut a: impl FnMut (&Token) -> bool, mut b: impl FnMut (&Token) -> bool) -> impl FnMut (&Token) -> bool {
  move |t| a(t) || b(t)
}

pub fn and (mut a: impl FnMut (&Token) -> bool, mut b: impl FnMut (&Token) -> bool) -> impl FnMut (&Token) -> bool {
  move |t| a(t) && b(t)
}

pub fn not (mut b: impl FnMut (&Token) -> bool) -> impl FnMut (&Token) -> bool {
  move |t| !b(t)
}

pub fn any_op_of (ops: &'static [OperatorType]) -> impl Fn (&Token) -> bool {
  move |t| t.is_any_op_of(ops)
}

pub fn any_kw_of (kws: &'static [KeywordType]) -> impl Fn (&Token) -> bool {
  move |t| t.is_any_kw_of(kws)
}

pub fn or_many (preds: &'static mut [impl FnMut (&Token) -> bool]) -> impl FnMut (&Token) -> bool {
  move |t| {
    for pred in preds.iter_mut() {
      if pred(t) { return true }
    }

    false
  }
}

pub fn and_many (preds: &'static mut [impl FnMut (&Token) -> bool]) -> impl FnMut (&Token) -> bool {
  move |t| {
    for pred in preds.iter_mut() {
      if !pred(t) { return false }
    }

    true
  }
}


pub fn pair_counter (mut a: impl FnMut (&Token) -> bool, mut b: impl FnMut (&Token) -> bool) -> impl FnMut (&Token) -> bool {
  let mut counter = 1usize;

  move |t| {
    if a(t) { counter += 1; }
    else if b(t) { counter -= 1; }

    counter == 0
  }
}


pub fn contextual (mut a: impl FnMut (&Token) -> bool, mut b: impl FnMut (&Token) -> bool, mut ctx: impl FnMut (&Token) -> bool) -> impl FnMut (&Token) -> bool {
  let mut counter = 1usize;

  move |t| {
    if a(t) { counter += 1; }
    else if b(t) { counter -=1; }

    (counter == 1 && ctx(t)) || counter == 0
  }
}