summaryrefslogtreecommitdiff
path: root/src/stages
Commit message (Collapse)AuthorAge
* Allow label references in pinned address calculationsBen Bridle2025-04-26
| | | | | | | | | | | | | | | | This is a relaxation of the rule where a label reference could not be used in any context that could change the length of an assembled program. We implement this in the bytecode stage by naively calculating an initial address for each label as before. If a pinned address is calculated from a label reference, some of the calculated addresses could be incorrect. We then attempt to run the bytecode stage, which will calculate a more accurate address for each label based on how pinned addresses are calculated. If the address of any label was changed by running this stage, we re-run the stage up to three more times until all labels stabilise. If the labels fail to stabilise, we return an error.
* Implement first-class string literalsBen Bridle2025-04-26
| | | | | | | | | | | This feature promotes strings to a first-class type in the language. If a string is passed to an invocation via the new string-type argument, the string will be passed as a whole value. String arguments can still be passed to an invocation via an integer-type argument, in which case they'll be broken apart into individual characters with the macro being invoked once per character. String-type macro arguments are declared like "name".
* Fix misleading error messageBen Bridle2025-04-26
| | | | | | The code here is really expecting a block value, but has received an integer value. This catches the case where an integer value is incorrectly included in a macro definition body alongside block tokens.
* Allow a macro to invoke itself safelyBen Bridle2025-04-18
| | | | | | | A macro can now invoke itself if the invocation is inside a conditional block that will eventually return false. The assembler stack can still overflow if the macro recurses too deeply, or if a macro calls itself without a conditional block.
* Allow a macro to invoke itselfBen Bridle2025-04-18
| | | | | This will currently cause the assembler to hang in all situations where it is used.
* Implement <len> operator for expressionsBen Bridle2025-04-18
| | | | | The <len> operator returns the width of an integer in bits, using the same calculation as for packing an integer into a bit field.
* Implement octal literalsBen Bridle2025-04-17
| | | | Octal literals use the prefix '0o'.
* Fix width checks for negative integersBen Bridle2025-04-12
| | | | | | | | | | | | The width of a negative integer was previously being counted in the same way as for a positive integer, by inverting the bits to make it a positive integer and then finding the placement of the highest-order 1 bit. The actual width of a negative integer will always be one greater than this value however, because the highest-order 1 bit of an inverted negative integer will always have directly above it a significant 0 bit used as the sign bit.
* Implement negative integer literalsBen Bridle2025-04-12
| | | | | Negative literals take the forms -29, -0x1D, and -0b11101 for decimal, hexadecimal, and binary.
* Report token without prefix in invalid literal errorsBen Bridle2025-03-23
| | | | | | | Previously, the token quoted in the error message for an invalid literal error included the radix prefix. This is already visible in the highlighted source report, and implied by the named radix in the error message.
* Update assembler dependencyBen Bridle2025-03-18
| | | | torque-asm now uses the Compiler type provided by the assembler library.
* Tidy codyBen Bridle2025-03-18
| | | | | | | - Rename tokens field on SyntacticMacroDefinition to body - Rename push_err! macro to err! - Create macros for character-matching logic in syntactic parsing - Replace .as_bytes().to_vec() pattern with .into_bytes()
* Rewrite entire assemblerBen Bridle2025-03-11
The language is now more general, the code is better structured, error reporting is more detailed, and many new language features have been implemented: - conditional blocks - first-class strings - more expression operators - binary literals - negative values - invocations in constant expressions