summaryrefslogtreecommitdiff
path: root/src/parsers/packed_binary_literal.rs
diff options
context:
space:
mode:
authorBen Bridle <ben@derelict.engineering>2025-03-06 20:33:27 +1300
committerBen Bridle <ben@derelict.engineering>2025-03-11 16:59:26 +1300
commit1ecee352f5844b0809d7ae66df52e34f42b44c8e (patch)
tree472b6fd57ff7f64ac3f8cd676cbe7a113ba01f05 /src/parsers/packed_binary_literal.rs
parentf2ed89083f5326a7a6f0a1720033d3388aa431fb (diff)
downloadtorque-asm-1ecee352f5844b0809d7ae66df52e34f42b44c8e.zip
Rewrite entire assembler
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
Diffstat (limited to 'src/parsers/packed_binary_literal.rs')
-rw-r--r--src/parsers/packed_binary_literal.rs85
1 files changed, 0 insertions, 85 deletions
diff --git a/src/parsers/packed_binary_literal.rs b/src/parsers/packed_binary_literal.rs
deleted file mode 100644
index 18f8da7..0000000
--- a/src/parsers/packed_binary_literal.rs
+++ /dev/null
@@ -1,85 +0,0 @@
-use crate::*;
-
-
-/// t is a Tokeniser over the characters of the PBL, excluding the leading hash.
-pub fn parse_packed_binary_literal(mut t: Tokeniser, source: SourceSpan) -> PackedBinaryLiteral {
- use PackedBinaryLiteralParseError as ParseError;
- use PackedBinaryLiteralParseErrorVariant as ParseErrorVar;
-
- let mut value = 0;
- let mut bits = 0;
- let mut field_bits = 0;
- let mut name = '\0';
- let mut fields: Vec<BitField> = Vec::new();
- let mut errors: Vec<ParseError> = Vec::new();
-
- macro_rules! push_field {
- () => {
- if fields.iter().any(|f| f.name == name) {
- let variant = ParseErrorVar::DuplicateFieldName(name);
- errors.push(ParseError { source: t.get_source(), variant });
- } else {
- fields.push(BitField { name, source: t.get_source(), bits: field_bits, shift: 0 });
- }
- };
- }
-
- while let Some(c) = t.eat_char() {
- // Ignore underscores.
- if c == '_' {
- t.mark.undo();
- continue;
- }
-
- // Add a bit to the value;
- value <<= 1;
- bits += 1;
- for field in &mut fields {
- field.shift += 1;
- }
-
- // Extend the current field.
- if c == name {
- field_bits += 1;
- continue;
- }
-
- // Commit the current field.
- if field_bits > 0 {
- t.mark_end_prev();
- push_field!();
- field_bits = 0;
- name = '\0';
- }
-
- // Parse bit literals.
- if c == '0' {
- continue;
- }
- if c == '1' {
- value |= 1;
- continue;
- }
-
- t.mark_start_prev();
- if c.is_alphabetic() {
- name = c;
- field_bits = 1;
- continue;
- } else {
- let source = t.get_source();
- let variant = ParseErrorVar::InvalidCharacter(c);
- errors.push(ParseError { source, variant });
- }
- }
-
- // Commit the final field.
- for field in &mut fields {
- field.shift += 1;
- }
- if field_bits > 0 {
- push_field!();
- }
-
- PackedBinaryLiteral { source, bits, value, fields, errors }
-}