diff options
Diffstat (limited to 'src/tokens')
-rw-r--r-- | src/tokens/assembler.rs | 28 | ||||
-rw-r--r-- | src/tokens/semantic.rs | 3 | ||||
-rw-r--r-- | src/tokens/syntactic.rs | 18 | ||||
-rw-r--r-- | src/tokens/tracked.rs | 4 |
4 files changed, 48 insertions, 5 deletions
diff --git a/src/tokens/assembler.rs b/src/tokens/assembler.rs index 04ecd38..048062b 100644 --- a/src/tokens/assembler.rs +++ b/src/tokens/assembler.rs @@ -18,6 +18,26 @@ pub struct AssembledWord { pub errors: Vec<AssemblerError>, } +impl AssembledWord { + pub fn count(&self) -> usize { + // If there is at least one field, and all fields have empty string + // values, then count will be zero. Else count will be at least one. + let mut count = 0; + let mut all_strings = !self.fields.is_empty(); + for field in &self.fields { + if let IntegerArgument::String(string) = &field.value { + count = std::cmp::max(count, string.chars.len()); + } else { + all_strings = false; + } + } + if !all_strings { + count = std::cmp::max(count, 1); + } + return count; + } +} + #[derive(Clone)] pub struct AssembledField { pub source: SourceSpan, @@ -53,6 +73,7 @@ pub enum IntegerArgument { LabelReference(Tracked<String>), Integer(TrackedInteger), Expression(AssembledExpression), + String(TrackedString), } #[derive(Clone)] @@ -67,6 +88,7 @@ pub enum AssemblerErrorVariant { NotAnInteger, NotABlock, IntegerInBlock, + StringInExpression, /// expected, received IncorrectArgumentCount(usize, usize), /// expected, received, index @@ -83,9 +105,6 @@ macro_rules! indent { } pub fn print_assembled_tokens(tokens: &[AssembledToken]) { - println!(); - println!("--------------------------------------------------------------"); - println!(); for token in tokens { match token { AssembledToken::LabelDefinition(definition) => { @@ -105,6 +124,9 @@ pub fn print_assembled_tokens(tokens: &[AssembledToken]) { IntegerArgument::Integer(integer) => { println!("INTEGER '{}'", integer.value); } + IntegerArgument::String(string) => { + println!("STRING {string}"); + } IntegerArgument::Expression(expr) => { println!("EXPRESSION"); print_assembled_expression(2, expr); diff --git a/src/tokens/semantic.rs b/src/tokens/semantic.rs index d61ad8e..225cd6b 100644 --- a/src/tokens/semantic.rs +++ b/src/tokens/semantic.rs @@ -43,6 +43,7 @@ pub enum Value { pub enum Integer { Literal(TrackedInteger), + String(TrackedString), Expression(Expression), LabelReference(Tracked<String>), } @@ -150,6 +151,8 @@ impl SemanticProgram { indent!(indent => "LITERAL {value}"), Integer::Expression(expr) => indent!(indent => "EXPRESSION [{expr:?}]"), + Integer::String(string) => + indent!(indent => "STRING '{string}'"), Integer::LabelReference(name) => indent!(indent => "LABEL REFERENCE '{name}'"), } diff --git a/src/tokens/syntactic.rs b/src/tokens/syntactic.rs index eb33806..780c950 100644 --- a/src/tokens/syntactic.rs +++ b/src/tokens/syntactic.rs @@ -17,6 +17,8 @@ pub enum SyntacticTokenVariant { Expression(Expression), + String(TrackedString), + BlockOpen, BlockClose, Separator, @@ -26,12 +28,26 @@ pub enum SyntacticTokenVariant { Error(SyntacticParseError), } +#[derive(Clone)] +pub struct TrackedString { + pub source: SourceSpan, + pub string: String, + pub chars: Vec<Tracked<char>>, +} + +impl std::fmt::Display for TrackedString { + fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { + self.string.fmt(f) + } +} + #[derive(Debug)] pub enum SyntacticParseError { InvalidHexadecimalLiteral(String), InvalidDecimalLiteral(String), InvalidSymbolIdentifier(String), UnterminatedComment, + UnterminatedString, UnterminatedExpression, LabelInMacroDefinition, } @@ -52,6 +68,8 @@ impl std::fmt::Debug for SyntacticToken { Expression(expr) => format!("Expression({expr:?})"), + String(string) => format!("String('{string}')"), + BlockOpen => format!("BlockOpen"), BlockClose => format!("BlockClose"), Separator => format!("Separator"), diff --git a/src/tokens/tracked.rs b/src/tokens/tracked.rs index 049c8f8..ea37047 100644 --- a/src/tokens/tracked.rs +++ b/src/tokens/tracked.rs @@ -8,8 +8,8 @@ pub struct Tracked<T> { } impl<T> Tracked<T> { - pub fn from(value: T, source: &SourceSpan) -> Self { - Self { source: source.clone(), value } + pub fn from(value: T, source: SourceSpan) -> Self { + Self { source, value } } } |