Website Summary Files Commits Branches @commit @diff @stats
path: root / assembler / src / lexer
diff options
context:
space:
mode:
1 files changed, 24 insertions, 8 deletions
-rw-r--r--assembler/src/lexer/mod.rs32
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),
}