summaryrefslogtreecommitdiff
path: root/src/tokens/assembler.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tokens/assembler.rs')
-rw-r--r--src/tokens/assembler.rs28
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);