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
use erl_tokenize::LexicalToken; use crate::traits::Preprocessor; use crate::{ErrorKind, Result}; pub trait TokenRead: Preprocessor { fn try_read_token(&mut self) -> Result<Option<LexicalToken>>; fn read_token(&mut self) -> Result<LexicalToken> { if let Some(token) = track!(self.try_read_token())? { Ok(token) } else { track_panic!(ErrorKind::UnexpectedEos); } } fn unread_token(&mut self, token: LexicalToken); } impl<'a> Preprocessor for &'a mut TokenRead { fn define_macro(&mut self, name: &str, replacement: Vec<LexicalToken>) { (*self).define_macro(name, replacement); } fn undef_macro(&mut self, name: &str) { (*self).undef_macro(name); } } impl<'a> TokenRead for &'a mut TokenRead { fn try_read_token(&mut self) -> Result<Option<LexicalToken>> { (*self).try_read_token() } fn unread_token(&mut self, token: LexicalToken) { (*self).unread_token(token); } }