summaryrefslogtreecommitdiff
path: root/axisc
diff options
context:
space:
mode:
authorRaindropsSys <raindrops@equestria.dev>2024-04-04 23:14:42 +0200
committerRaindropsSys <raindrops@equestria.dev>2024-04-04 23:14:42 +0200
commit70e8ff756b077bf37d13d14e70a0043c77900294 (patch)
tree97ccdf1499e877143ab6072555c8f7e986f5b39a /axisc
parenta7ec5e71cbcc7a5ae11dab7114bd50a933caf18b (diff)
downloadaxis-70e8ff756b077bf37d13d14e70a0043c77900294.tar.gz
axis-70e8ff756b077bf37d13d14e70a0043c77900294.tar.bz2
axis-70e8ff756b077bf37d13d14e70a0043c77900294.zip
(Very) basic lexer
Diffstat (limited to 'axisc')
-rw-r--r--axisc/src/lexer.rs22
-rw-r--r--axisc/src/main.rs8
-rw-r--r--axisc/src/reader.rs4
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> {