diff options
Diffstat (limited to 'src/stages/bytecode_tokens.rs')
| -rw-r--r-- | src/stages/bytecode_tokens.rs | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/stages/bytecode_tokens.rs b/src/stages/bytecode_tokens.rs new file mode 100644 index 0000000..5020827 --- /dev/null +++ b/src/stages/bytecode_tokens.rs @@ -0,0 +1,42 @@ +use crate::*; + +pub struct Segment { + pub address: usize, + /// Source of the address value. + pub source: Option<SourceSpan>, + pub words: Vec<Tracked<Word>>, +} + +pub fn print_segment(segment: &Segment) { + println!("SEGMENT: 0x{:>04x}", segment.address); + // Find maximum width of all words in the segment. + let width = segment.words.iter().map(|w| w.to_string().chars().count()).max().unwrap_or(0); + for word in &segment.words { + let string = word.to_string(); + println!(" {string:>w$}", w=width as usize); + } + +} + +pub enum BytecodeError { + // (expected, received) + IncorrectWidth(u32, u32) +} + +pub fn report_bytecode_errors(errors: &[Tracked<BytecodeError>], source_code: &str) { + for error in errors { + report_bytecode_error(error, source_code); + } +} + +fn report_bytecode_error(error: &Tracked<BytecodeError>, source_code: &str) { + let context = Context { source_code: &source_code, source: &error.source }; + let message = match &error.value { + BytecodeError::IncorrectWidth(expected, received) => + &format!("Word is {received} bits wide, but should be exactly {expected} bits wide"), + }; + + report_source_issue(LogLevel::Error, &context, message); +} + + |
