summaryrefslogtreecommitdiff
path: root/src/parsers/assembler.rs
diff options
context:
space:
mode:
authorBen Bridle <ben@derelict.engineering>2025-02-28 13:23:20 +1300
committerBen Bridle <ben@derelict.engineering>2025-02-28 13:34:23 +1300
commitdba769e13ca5029643c6068e53fa34ae0fea8421 (patch)
tree47b45ecddaf08bcef19de29ad65206c34af85f53 /src/parsers/assembler.rs
parent1a810d036195395c182f6cd6e011b8fb868d9872 (diff)
downloadtorque-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/parsers/assembler.rs')
-rw-r--r--src/parsers/assembler.rs14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/parsers/assembler.rs b/src/parsers/assembler.rs
index eb180e3..61e1a84 100644
--- a/src/parsers/assembler.rs
+++ b/src/parsers/assembler.rs
@@ -115,7 +115,7 @@ impl<'a> Environment<'a> {
} else if let Some(definition) = self.macro_definitions.get(name) {
self.reify_value(&definition.value)
} else if let Some(label) = self.label_definitions.get(name) {
- let name = Tracked::from(self.tag_label_name(&label.name), &source);
+ let name = Tracked::from(self.tag_label_name(&label.name), source);
Ok(Argument::Integer(IntegerArgument::LabelReference(name)))
} else {
let variant = ErrVar::DefinitionNotFound(name.to_string());
@@ -142,9 +142,12 @@ impl<'a> Environment<'a> {
IntegerArgument::Expression(expr)
}
Integer::LabelReference(name) => {
- let name = Tracked::from(self.tag_label_name(name), &name.source);
+ let name = Tracked::from(self.tag_label_name(name), name.source.clone());
IntegerArgument::LabelReference(name)
}
+ Integer::String(string) => {
+ IntegerArgument::String(string.clone())
+ }
};
Ok(Argument::Integer(value))
}
@@ -238,7 +241,7 @@ impl<'a> Environment<'a> {
if received != expected {
return err!(ErrVar::IncorrectArgumentCount(expected, received));
}
- let name = Tracked::from(self.tag_label_name(&label.name), &label.source);
+ let name = Tracked::from(self.tag_label_name(&label.name), label.source.clone());
Ok(Argument::Integer(IntegerArgument::LabelReference(name)))
} else {
err!(ErrVar::DefinitionNotFound(invocation.name.to_string()))
@@ -270,6 +273,11 @@ impl<'a> Environment<'a> {
IntegerArgument::Expression(expr) => {
AssembledExpressionToken::Expression(Box::new(expr))
},
+ IntegerArgument::String(string) => {
+ let source = string.source.clone();
+ let variant = AssemblerErrorVariant::StringInExpression;
+ return Err(AssemblerError { source, variant })
+ }
}
}
ExprVar::Error(_) => continue,