diff --git a/src/cli/mod.rs b/src/cli/mod.rs new file mode 100644 index 0000000..f35b028 --- /dev/null +++ b/src/cli/mod.rs @@ -0,0 +1,39 @@ +use std::io; +use std::io::Write; + +use crate::types::TokenType; +use crate::lexer::def; + +pub fn start() { + const PROMPT: &'static str = ">> "; + + greet(); + + loop { + print!("{}", PROMPT); + + let _ = io::stdout().flush(); + + let mut input = String::new(); + + io::stdin() + .read_line(&mut input) + .expect("Failed to read line"); + + + let mut lex = def::new_lexer(&input); + loop { + let tok = lex.next(); + match tok.ttype { + TokenType::EOF => break, + _ => { + println!("{:?}", tok); + } + } + } + } +} + +fn greet() { + println!("Hello there! This is the Hi Repl"); +} diff --git a/src/lib.rs b/src/lib.rs index 1f8cfd2..1cea5ce 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,2 +1,3 @@ pub mod lexer; pub mod types; +pub mod cli; diff --git a/src/main.rs b/src/main.rs index d62c16b..739af33 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,5 @@ -use hi::lexer; +use hi::cli; fn main() { - lexer::sanket(); + cli::start(); } diff --git a/src/types/mod.rs b/src/types/mod.rs index 981c0bb..3a31dd3 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -51,6 +51,7 @@ pub struct Lexer <'a> { pub ch: u8 } +#[derive(Debug)] pub struct Token { pub ttype: TokenType, pub literal: String @@ -79,12 +80,8 @@ impl Lexer <'_> { _ => new_token(TokenType::ASSIGN, tok) } }, - b'+' => new_token( - TokenType::PLUS, - tok), - b'-' => new_token( - TokenType::MINUS, - tok), + b'+' => new_token(TokenType::PLUS, tok), + b'-' => new_token(TokenType::MINUS, tok), b'!' => { match self.peek() { b'=' => { @@ -94,39 +91,17 @@ impl Lexer <'_> { _ => new_token(TokenType::BANG, tok) } }, - b'/' => new_token( - TokenType::SLASH, - tok), - b'*' => new_token( - TokenType::ASTERISK, - tok), - b'<' => new_token( - TokenType::LT, - tok), - b'>' => new_token( - TokenType::GT, - tok), - b';' => new_token( - TokenType::SEMICOLON, - tok), - b'(' => new_token( - TokenType::LPAREN, - tok), - b')' => new_token( - TokenType::RPAREN, - tok), - b',' => new_token( - TokenType::COMMA, - tok), - b'{' => new_token( - TokenType::LBRACE, - tok), - b'}' => new_token( - TokenType::RBRACE, - tok), - 0 => new_token( - TokenType::EOF, - String::from("")), + b'/' => new_token(TokenType::SLASH, tok), + b'*' => new_token(TokenType::ASTERISK, tok), + b'<' => new_token(TokenType::LT, tok), + b'>' => new_token(TokenType::GT, tok), + b';' => new_token(TokenType::SEMICOLON, tok), + b'(' => new_token(TokenType::LPAREN, tok), + b')' => new_token(TokenType::RPAREN, tok), + b',' => new_token(TokenType::COMMA, tok), + b'{' => new_token(TokenType::LBRACE, tok), + b'}' => new_token(TokenType::RBRACE, tok), + 0 => new_token(TokenType::EOF, String::from("")), _ => { if helpers::is_letter(self.ch) { let ident = self.read_identifier(); @@ -138,7 +113,8 @@ impl Lexer <'_> { } - return new_token(TokenType::ILLEGAL, self.ch.to_string()); + self.read_char(); + return new_token(TokenType::ILLEGAL, tok); } };