diff options
| author | Ben Bridle <ben@derelict.engineering> | 2025-12-04 16:51:03 +1300 |
|---|---|---|
| committer | Ben Bridle <ben@derelict.engineering> | 2025-12-04 16:51:03 +1300 |
| commit | 938b40dd15f1d44f8881261a64e092fc0fd9165b (patch) | |
| tree | 737536010d19914325913b4703934a1be4829685 /src | |
| parent | 091938b459e9f6e7a9ed4e5427da535d0cb693f3 (diff) | |
| download | torque-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.rs | 7 | ||||
| -rw-r--r-- | src/stages/semantic.rs | 14 |
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 + } } } } |
