diff options
| Commit | 1395b9eac37187227874c2bf4e768680c7dffd32 (patch) | |
|---|---|---|
| Author | 2025-02-13 21:53:10 +0200 | |
| Committer | 2025-02-13 21:53:10 +0200 | |
| Files | 50ad9f0c614e1ff07e20964a170b1f27116069ea /assembler/src/lexer | |
| tonkobali-1395b9eac37187227874c2bf4e768680c7dffd32.tar tonkobali-1395b9eac37187227874c2bf4e768680c7dffd32.tar.gz tonkobali-1395b9eac37187227874c2bf4e768680c7dffd32.zip | ||
| Parent | 3ea01bbd75cc252453cd21074f56eb9cc6cff317 (diff) | |
feat(assembler): Implement first step of parser
1 files changed, 24 insertions, 8 deletions
| -rw-r--r-- | assembler/src/lexer/mod.rs | 32 |
diff --git a/assembler/src/lexer/mod.rs b/assembler/src/lexer/mod.rs index 617aca1..679df0f 100644 --- a/assembler/src/lexer/mod.rs +++ b/assembler/src/lexer/mod.rs @@ -1,9 +1,13 @@ +use crate::Word; + #[derive(Debug, Clone, PartialEq, Eq)] pub(crate) enum Token { Label(String), Operator(String), Symbol(String), - Number(i64), + SymbolDef(String), + Number(Word), + Address(Word), String(String), } @@ -16,6 +20,7 @@ pub fn split(mut line: String) -> Vec<Token> { let mut has_label = false; let mut string_started = false; let mut skip_next = false; + let mut address = false; for c in line.chars() { buffer.push(c); @@ -52,31 +57,42 @@ pub fn split(mut line: String) -> Vec<Token> { } string_started = !string_started; }, - ',' | '\n' => { + ',' | '\n' | ';' => { buffer.pop(); if buffer.is_empty() { continue; } - if let Some(num) = buffer.parse::<i64>().ok() { - res.push(Token::Number(num)); + if let Some(num) = buffer.parse::<Word>().ok() { + if address { + address = false; + res.push(Token::Address(num)); + } + else { + res.push(Token::Number(num)); + } } else { res.push(Token::Symbol(buffer.clone())); } buffer.clear(); + + if c == ';' { break; } }, - '\\' => skip_next = true, - ';' => break, '=' => if buffer.is_empty() { panic!("Cannot begin the line with an =") } else if let Token::Operator(name) = &res[0] { - res[0] = Token::Symbol(name.clone()); + res[0] = Token::SymbolDef(name.clone()); buffer.clear(); } else { panic!("Before an = you may only have a symbol name!"); }, - 'A'..='Z' | 'a'..='z' | '0'..='9' | '_' | '-' | '.' | '$' | '?' + '\\' => skip_next = true, + '%' => address = true, + '-' => if address { + panic!("Addresses cannot be negative!"); + }, + 'A'..='Z' | 'a'..='z' | '0'..='9' | '_' | '.' | '$' | '?' => {}, _ => panic!("Found invalid character '{}'", c), } |
