summaryrefslogtreecommitdiff
path: root/src/tokens
diff options
context:
space:
mode:
Diffstat (limited to 'src/tokens')
-rw-r--r--src/tokens/assembler.rs28
-rw-r--r--src/tokens/semantic.rs3
-rw-r--r--src/tokens/syntactic.rs18
-rw-r--r--src/tokens/tracked.rs4
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 }
}
}