diff options
author | Ben Bridle <ben@derelict.engineering> | 2025-02-28 13:23:20 +1300 |
---|---|---|
committer | Ben Bridle <ben@derelict.engineering> | 2025-02-28 13:34:23 +1300 |
commit | dba769e13ca5029643c6068e53fa34ae0fea8421 (patch) | |
tree | 47b45ecddaf08bcef19de29ad65206c34af85f53 /src/tokens/assembler.rs | |
parent | 1a810d036195395c182f6cd6e011b8fb868d9872 (diff) | |
download | torque-asm-dba769e13ca5029643c6068e53fa34ae0fea8421.zip |
Implement string literals
String literals are treated as integers. If a string is passed as an
integer argument to a packed binary literal, a new instance of the
packed binary literal is invoked for every character in the string,
with each character being passed to the packed binary literal as a
Unicode character value.
Diffstat (limited to 'src/tokens/assembler.rs')
-rw-r--r-- | src/tokens/assembler.rs | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/src/tokens/assembler.rs b/src/tokens/assembler.rs index 04ecd38..048062b 100644 --- a/src/tokens/assembler.rs +++ b/src/tokens/assembler.rs @@ -18,6 +18,26 @@ pub struct AssembledWord { pub errors: Vec<AssemblerError>, } +impl AssembledWord { + pub fn count(&self) -> usize { + // If there is at least one field, and all fields have empty string + // values, then count will be zero. Else count will be at least one. + let mut count = 0; + let mut all_strings = !self.fields.is_empty(); + for field in &self.fields { + if let IntegerArgument::String(string) = &field.value { + count = std::cmp::max(count, string.chars.len()); + } else { + all_strings = false; + } + } + if !all_strings { + count = std::cmp::max(count, 1); + } + return count; + } +} + #[derive(Clone)] pub struct AssembledField { pub source: SourceSpan, @@ -53,6 +73,7 @@ pub enum IntegerArgument { LabelReference(Tracked<String>), Integer(TrackedInteger), Expression(AssembledExpression), + String(TrackedString), } #[derive(Clone)] @@ -67,6 +88,7 @@ pub enum AssemblerErrorVariant { NotAnInteger, NotABlock, IntegerInBlock, + StringInExpression, /// expected, received IncorrectArgumentCount(usize, usize), /// expected, received, index @@ -83,9 +105,6 @@ macro_rules! indent { } pub fn print_assembled_tokens(tokens: &[AssembledToken]) { - println!(); - println!("--------------------------------------------------------------"); - println!(); for token in tokens { match token { AssembledToken::LabelDefinition(definition) => { @@ -105,6 +124,9 @@ pub fn print_assembled_tokens(tokens: &[AssembledToken]) { IntegerArgument::Integer(integer) => { println!("INTEGER '{}'", integer.value); } + IntegerArgument::String(string) => { + println!("STRING {string}"); + } IntegerArgument::Expression(expr) => { println!("EXPRESSION"); print_assembled_expression(2, expr); |