From 0f2bd09d269862105e603a9865201f521f49490b Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Mon, 8 Jun 2026 21:45:30 -0700 Subject: It works again! and more! About to change a few things: - symbols and errors will have a range not a position - remove view/output token type, those should just be View and Output structs - Figure out some formatting stuff? (add a dep? I dunno) - Move to non-quoted dot-delimeted variable references. - Add loops. - Add conditionals? - Add more! --- src/position.rs | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/position.rs (limited to 'src/position.rs') diff --git a/src/position.rs b/src/position.rs new file mode 100644 index 0000000..24f5309 --- /dev/null +++ b/src/position.rs @@ -0,0 +1,96 @@ +use std::fmt; +use std::cmp::Ordering; + +#[derive(Copy,Clone)] +pub struct Position { + pub line: u32, + pub column: u32, +} + +impl Position { + pub fn new( line: u32, column: u32 ) -> Self { + Self { + line, column, + } + } + + pub fn none() -> Self { + Self { + line: 0, + column: 0, + } + } + + pub fn is_none(&self) -> bool { + self.line == 0 || self.column == 0 + } +} + +impl fmt::Debug for Position { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + if self.is_none() { + write!(f, "none") + } else { + write!(f, "{}:{}", self.line, self.column ) + } + } +} + +impl PartialOrd for Position { + fn partial_cmp(&self, other: &Self) -> Option { + let ord = self.line.partial_cmp( &other.line ); + if Some(Ordering::Equal) == ord { + self.column.partial_cmp( &other.column ) + } else { + ord + } + } +} + +impl Ord for Position { + fn cmp(&self, other: &Self) -> Ordering { + let ord = self.line.cmp( &other.line ); + if Ordering::Equal == ord { + self.column.cmp( &other.column ) + } else { + ord + } + } +} + +impl PartialEq for Position { + fn eq(&self, other: &Self) -> bool { + self.line == other.line && self.column == other.column + } +} + +impl Eq for Position {} + +#[derive(Copy,Clone)] +pub struct Range { + start: Position, + end: Position, +} + +impl Range { + pub fn new( start: Position, end: Position ) -> Self { + Self { + start, end, + } + } + + pub fn include(&mut self, pos: &Position ) { + if *pos < self.start { + self.start = pos.clone(); + } + if *pos > self.end { + self.end = pos.clone(); + } + } +} + +impl fmt::Debug for Range { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{:?}-{:?}", self.start, self.end ) + } +} -- cgit v1.2.3