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
use crate::char_stream::CharStream;
use crate::common_token_factory::TokenFactory;
use crate::token::Token;

pub trait TokenSource {
    fn next_token(&mut self) -> Box<dyn Token>;
    fn get_line(&self) -> isize;
    fn get_char_position_in_line(&self) -> isize;
    fn get_input_stream(&mut self) -> &mut dyn CharStream;
    fn get_source_name(&self) -> String;
    //    fn set_token_factory<'c: 'b>(&mut self, f: &'c TokenFactory);
    fn get_token_factory(&self) -> &dyn TokenFactory;
}

// allows user to call parser with &mut reference to Lexer
impl<T> TokenSource for &mut T where T: TokenSource {
    fn next_token(&mut self) -> Box<dyn Token> {
        (**self).next_token()
    }

    fn get_line(&self) -> isize {
        (**self).get_line()
    }

    fn get_char_position_in_line(&self) -> isize {
        (**self).get_char_position_in_line()
    }

    fn get_input_stream(&mut self) -> &mut dyn CharStream {
        (**self).get_input_stream()
    }

    fn get_source_name(&self) -> String {
        (**self).get_source_name()
    }

    fn get_token_factory(&self) -> &dyn TokenFactory {
        (**self).get_token_factory()
    }
}