diff options
author | RaindropsSys <raindrops@equestria.dev> | 2024-04-04 23:14:42 +0200 |
---|---|---|
committer | RaindropsSys <raindrops@equestria.dev> | 2024-04-04 23:14:42 +0200 |
commit | 70e8ff756b077bf37d13d14e70a0043c77900294 (patch) | |
tree | 97ccdf1499e877143ab6072555c8f7e986f5b39a /axisc | |
parent | a7ec5e71cbcc7a5ae11dab7114bd50a933caf18b (diff) | |
download | axis-70e8ff756b077bf37d13d14e70a0043c77900294.tar.gz axis-70e8ff756b077bf37d13d14e70a0043c77900294.tar.bz2 axis-70e8ff756b077bf37d13d14e70a0043c77900294.zip |
(Very) basic lexer
Diffstat (limited to 'axisc')
-rw-r--r-- | axisc/src/lexer.rs | 22 | ||||
-rw-r--r-- | axisc/src/main.rs | 8 | ||||
-rw-r--r-- | axisc/src/reader.rs | 4 |
3 files changed, 27 insertions, 7 deletions
diff --git a/axisc/src/lexer.rs b/axisc/src/lexer.rs index 3c6b30b..ae45497 100644 --- a/axisc/src/lexer.rs +++ b/axisc/src/lexer.rs @@ -1,3 +1,5 @@ +use crate::reader::TokenScanner; + #[derive(Debug)] pub enum Token { Identifier(String), @@ -16,9 +18,9 @@ pub enum Token { Add, Subtract, LineFeed, - Quote, } +#[derive(Debug)] pub enum Literal { String(String), Number(f64), @@ -26,9 +28,27 @@ pub enum Literal { Array(Array) } +#[derive(Debug)] pub enum Array { StringArray(Vec<String>), NumberArray(Vec<f64>), BooleanArray(Vec<bool>), MultiDimensionalArray(Vec<Array>) } + +impl Literal { + pub fn string_literal_from_scanner(token_scanner: &mut TokenScanner) -> Literal { + token_scanner.advance(1); + let mut string = String::new(); + + loop { + match token_scanner.advance(1) { + Some('"') => break, + Some(c) => string.push(c), + None => todo!("Reached EOF before end of string") + } + } + + Literal::String(string) + } +} diff --git a/axisc/src/main.rs b/axisc/src/main.rs index 9bf48cc..9d358e8 100644 --- a/axisc/src/main.rs +++ b/axisc/src/main.rs @@ -3,6 +3,7 @@ use clap::Parser; use reader::read_file; use reader::TokenScanner; use lexer::Token; +use crate::lexer::Literal; mod cli; mod reader; @@ -70,14 +71,13 @@ fn main() { scanner.advance(1); tokens.push(Token::Dollar) }, - Some('"') => { - scanner.advance(1); - tokens.push(Token::Quote) - }, Some('\n') => { scanner.advance(1); tokens.push(Token::LineFeed) }, + Some('"') => { + tokens.push(Token::Literal(Literal::string_literal_from_scanner(&mut scanner))) + } Some(_) => tokens.push(Token::Identifier(scanner.advance_word())) } } diff --git a/axisc/src/reader.rs b/axisc/src/reader.rs index 1764f2b..b75649a 100644 --- a/axisc/src/reader.rs +++ b/axisc/src/reader.rs @@ -30,12 +30,12 @@ pub fn read_file(source: &PathBuf) -> String { } pub struct TokenScanner<'a> { - chars: Peekable<Chars<'a>> + pub chars: Peekable<Chars<'a>> } impl <'a> TokenScanner<'a> { pub fn advance(&mut self, num: usize) -> Option<char> { - self.chars.nth(num) + self.chars.nth(num - 1) } pub fn peek(&mut self) -> Option<&char> { |