From ae45a3c84859085c568c3ed23248670a8c31a0e2 Mon Sep 17 00:00:00 2001 From: Devin Bidwell Date: Thu, 21 Nov 2024 19:28:20 -0700 Subject: [PATCH] dyn trait for tokenizer buffer --- src/main.rs | 2 +- src/parser/mod.rs | 11 +++----- src/tokenizer/mod.rs | 61 ++++++++++++++++++-------------------------- 3 files changed, 30 insertions(+), 44 deletions(-) diff --git a/src/main.rs b/src/main.rs index 5f9f1da..86e6bea 100644 --- a/src/main.rs +++ b/src/main.rs @@ -35,7 +35,7 @@ fn run_logic() -> Result<(), StationlangError> { let args = Args::parse(); let input_file = args.input_file; - let tokenizer: Tokenizer<_> = match input_file { + let tokenizer: Tokenizer = match input_file { Some(input_file) => Tokenizer::from_path(&input_file)?, None => { let mut buf = String::new(); diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 09146c9..0daba7f 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -90,16 +90,13 @@ macro_rules! token_matches { }; } -pub struct Parser { - tokenizer: TokenizerBuffer, +pub struct Parser { + tokenizer: TokenizerBuffer, current_token: Option, } -impl Parser -where - R: Read + Seek, -{ - pub fn new(tokenizer: Tokenizer) -> Self { +impl Parser { + pub fn new(tokenizer: Tokenizer) -> Self { Parser { tokenizer: TokenizerBuffer::new(tokenizer), current_token: None, diff --git a/src/tokenizer/mod.rs b/src/tokenizer/mod.rs index 585ea8d..aee2838 100644 --- a/src/tokenizer/mod.rs +++ b/src/tokenizer/mod.rs @@ -23,36 +23,20 @@ pub enum TokenizerError { pub trait Tokenize: Read + Seek {} -pub(crate) struct Tokenizer -where - T: Read + Seek, -{ - reader: BufReader, +impl Tokenize for T where T: Read + Seek {} + +pub(crate) struct Tokenizer { + reader: BufReader>, char_buffer: [u8; 1], line: usize, column: usize, returned_eof: bool, } -impl From for Tokenizer>> { - fn from(input: String) -> Self { - let cursor = Cursor::new(input.into_bytes()); - let reader = BufReader::new(cursor); - - Self { - reader, - line: 1, - column: 1, - char_buffer: [0], - returned_eof: false, - } - } -} - -impl Tokenizer { +impl Tokenizer { pub fn from_path(input_file: impl Into) -> Result { let file = std::fs::File::open(input_file.into())?; - let reader = BufReader::new(file); + let reader = BufReader::new(Box::new(file) as Box); Ok(Self { reader, @@ -64,10 +48,21 @@ impl Tokenizer { } } -impl Tokenizer -where - T: Read + Seek, -{ +impl From for Tokenizer { + fn from(input: String) -> Self { + let reader = BufReader::new(Box::new(Cursor::new(input)) as Box); + + Self { + reader, + line: 1, + column: 1, + char_buffer: [0], + returned_eof: false, + } + } +} + +impl Tokenizer { /// Consumes the tokenizer and returns the next token in the stream /// If there are no more tokens in the stream, this function returns None /// If there is an error reading the stream, this function returns an error @@ -415,20 +410,14 @@ where } } -pub struct TokenizerBuffer -where - T: Read + Seek, -{ - tokenizer: Tokenizer, +pub struct TokenizerBuffer { + tokenizer: Tokenizer, buffer: VecDeque, history: VecDeque, } -impl TokenizerBuffer -where - T: Seek + Read, -{ - pub fn new(tokenizer: Tokenizer) -> Self { +impl TokenizerBuffer { + pub fn new(tokenizer: Tokenizer) -> Self { Self { tokenizer, buffer: VecDeque::new(),