diff options
author | Ben Bridle <bridle.benjamin@gmail.com> | 2024-10-28 19:52:29 +1300 |
---|---|---|
committer | Ben Bridle <bridle.benjamin@gmail.com> | 2024-10-28 19:52:47 +1300 |
commit | f4027cae775e3c9c237675f9df35a744d54f3f2e (patch) | |
tree | 733fa3af9e1bd44d61dd83983a2da86cb75c53e9 /src/locators/source.rs | |
parent | 16ee0e9e8dce2c88acc88ba5ffd97e013624fa5e (diff) | |
download | bedrock-asm-f4027cae775e3c9c237675f9df35a744d54f3f2e.zip |
Rewrite assembler
This is an almost complete rewrite of the entire assembler from the
ground up, with a different parsing strategy and a whole new symbol
resolution mechanism for automatically including library files.
The assembly syntax has also been slightly modified, with padding
tokens now being prefixed with '#' instead of '$', and a block-style
anonymous-label syntax which uses the '{' and '}' characters.
Diffstat (limited to 'src/locators/source.rs')
-rw-r--r-- | src/locators/source.rs | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/locators/source.rs b/src/locators/source.rs new file mode 100644 index 0000000..2f10bd9 --- /dev/null +++ b/src/locators/source.rs @@ -0,0 +1,69 @@ +use std::path::PathBuf; + + +#[derive(Clone)] +pub struct SourceSpan { + /// The source characters which this span represents. + pub string: String, + /// The location of this span in the merged source file. + pub in_merged: SourceLocation, + /// The location of this span in the original source file. + pub in_source: Option<SourceLocation>, +} + + +#[derive(Clone)] +pub struct SourceLocation { + /// File path the source was loaded from. + pub path: Option<PathBuf>, + /// Position of the first character of the string. + pub start: Position, + /// Position of the final character of the string. + pub end: Position, +} + +impl std::fmt::Display for SourceLocation { + fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { + let y = self.start.line + 1; + let x = self.start.column + 1; + match &self.path { + Some(path) => write!(f, "{}:{y}:{x}", path.as_os_str().to_string_lossy()), + None => write!(f, "<unknown>:{y}:{x}"), + } + } +} + + +#[derive(Clone, Copy)] +pub struct Position { + /// The number of lines that precede this line in the file. + pub line: usize, + /// The number of characters that precede this character in the line. + pub column: usize, +} + +impl Position { + pub fn to_next_char(&mut self) { + self.column += 1; + } + + pub fn to_next_line(&mut self) { + self.line += 1; + self.column = 0; + } + + pub fn advance(&mut self, c: char) { + match c { + '\n' => self.to_next_line(), + _ => self.to_next_char(), + } + } +} + +impl std::fmt::Display for Position { + fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { + let y = self.line + 1; + let x = self.column + 1; + write!(f, "{y}:{x}") + } +} |