summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBen Bridle <ben@derelict.engineering>2025-12-04 16:51:03 +1300
committerBen Bridle <ben@derelict.engineering>2025-12-04 16:51:03 +1300
commit938b40dd15f1d44f8881261a64e092fc0fd9165b (patch)
tree737536010d19914325913b4703934a1be4829685 /src
parent091938b459e9f6e7a9ed4e5427da535d0cb693f3 (diff)
downloadtorque-asm-938b40dd15f1d44f8881261a64e092fc0fd9165b.zip
Convert single-element lists to integers when an integer is required
This allows an integer invocation with arguments to be wrapped in `[]` square brackets so that it can be passed to another invocation as an argument.
Diffstat (limited to 'src')
-rw-r--r--src/stages/intermediate.rs7
-rw-r--r--src/stages/semantic.rs14
2 files changed, 15 insertions, 6 deletions
diff --git a/src/stages/intermediate.rs b/src/stages/intermediate.rs
index d630cc2..c5be44f 100644
--- a/src/stages/intermediate.rs
+++ b/src/stages/intermediate.rs
@@ -321,8 +321,11 @@ impl IntermediateParser {
let result = self.parse_invocation(invocation, source)?;
match result.value {
IntermediateValue::Integer(integer) => {
- let source = integer.source.clone();
- Some(Tracked::from(integer, source))
+ Some(Tracked::from(integer, source.clone()))
+ }
+ IntermediateValue::List(mut integers) if integers.len() == 1 => {
+ let integer = integers.pop().unwrap();
+ Some(Tracked::from(integer, source.clone()))
}
IntermediateValue::Block(_) | IntermediateValue::List(_) => {
let error = IntermediateError::ExpectedInteger;
diff --git a/src/stages/semantic.rs b/src/stages/semantic.rs
index 96cf7af..f96a0c5 100644
--- a/src/stages/semantic.rs
+++ b/src/stages/semantic.rs
@@ -272,10 +272,16 @@ impl SemanticParser {
self.errors.push(Tracked::from(error, token.source));
None
}
- MacroDefinitionBody::List(list) => {
- let error = SemanticError::ExpectedInteger(location);
- self.errors.push(Tracked::from(error, list.source));
- None
+ MacroDefinitionBody::List(list) => match list.value {
+ // Convert a one-element list to an integer.
+ ListToken::ListLiteral(mut integers) if integers.len() == 1 => {
+ Some(integers.pop().unwrap())
+ }
+ _ => {
+ let error = SemanticError::ExpectedInteger(location);
+ self.errors.push(Tracked::from(error, list.source));
+ None
+ }
}
}
}