1use std::sync::Arc;
3use serde::{Serialize, Deserialize};
4
5#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
8pub enum MatchType {
9 Literal,
10 AnyOr
11}
12
13#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
16pub enum State {
17 Accepting,
18 Expecting,
19 Accepted,
20 Rejected,
21 Beyond,
22 Failure(String),
23}
24
25#[derive(Debug, Clone, Copy)]
26pub enum Event {
27 CharIn(char),
28 EndOfStream
29}
30
31#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
32pub struct StateSequence {
33 pub match_type: MatchType,
34 pub sequence: Vec<char>
35}
36
37pub trait PushdownStateMachine {
40 fn new() -> Self;
41
42 fn step_in(&mut self, key: &Vec<Arc<StateSequence>>);
43 fn step_out(&mut self);
44
45 fn accepts_more(&self) -> bool;
46 fn feed(&mut self, ev: Event);
47
48 fn state(&self) -> State;
49 fn is_sink(&self) -> bool;
50}
51
52pub enum Ahead {
53 Exactly(char),
54 AnyOr(char),
55 Any,
56}
57
58#[cfg(test)]
59mod tests {
60 use super::*;
61
62 #[test]
63 fn matcher_test() {
64 let ev1 = Event::CharIn(12 as char);
65 let ev2 = Event::EndOfStream;
66 let ev3 = ev2;
67 println!("states = {:?}, {:?} {:?}", ev1.clone(), ev2, ev3);
68 }
69}