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
use crate::thin::Step;
use crate::thin::Value;

pub mod processor;

use self::processor::Processor;

struct Stack<T>
where
    T: Processor,
{
    items: Vec<T::Tree>,
    processor: T,
}

impl<T> Stack<T>
where
    T: Processor,
{
    fn new(processor: T) -> Stack<T> {
        let items = vec![Default::default(); 1];
        Stack { items, processor }
    }

    fn step(&mut self, value_step: Step) {
        match value_step {
            Step::Rule(rule, start, end) => {
                self.size_stack(end as usize);
                self.items[start as usize] = self.processor.proc_rule(rule, &self.items[start as usize..=end as usize]);
            }
            Step::Token(sym, res, val) => {
                self.size_stack(res as usize);
                self.items[res as usize] = self.processor.proc_token((sym, val).into());
            }
            Step::NullingSymbol(sym, res) => {
                self.size_stack(res as usize);
                self.items[res as usize] = self.processor.proc_null(sym);
            }
            s => panic!("Invalid step: {:?}", s),
        }
    }

    fn size_stack(&mut self, last: usize) {
        let size = last + 1;
        let len = self.items.len();
        if len < size {
            self.items.reserve(size - len);
            for _ in len..size {
                self.items.push(Default::default());
            }
        }
    }

    fn proc_value(&mut self, val: &mut Value) -> &T::Tree {
        for v in val {
            self.step(v);
        }
        &self.items[0]
    }
}

pub fn proc_value<T: Processor>(eng: T, mut val: Value) -> T::Tree {
    let mut stack = Stack::new(eng);
    stack.proc_value(&mut val).clone()
}