This commit is contained in:
2026-04-08 23:28:50 -04:00
parent edabc22431
commit bdf08ce52c
11 changed files with 417 additions and 158 deletions
+31 -16
View File
@@ -1,9 +1,7 @@
use crate::parser::error::ParseError;
pub use span::*;
use crate::io::{CompilerMsg, Span, Spanned};
use std::iter::Peekable;
pub use token::*;
mod span;
mod token;
pub struct Cursor<'a> {
@@ -12,10 +10,14 @@ pub struct Cursor<'a> {
}
impl<'a> Cursor<'a> {
pub fn new(text: &'a str) -> Self {
pub fn new(text: &'a str, file: usize) -> Self {
Self {
span: Span { first: 0, last: 0 },
tokens: Tokens::new(text).peekable(),
span: Span {
start: 0,
end: 0,
file,
},
tokens: Tokens::new(text, file).peekable(),
}
}
@@ -30,14 +32,14 @@ impl<'a> Cursor<'a> {
self.tokens.peek().map(|inst| &inst.inner)
}
pub fn expect_next(&mut self) -> Result<Token, ParseError> {
self.next().ok_or_else(|| ParseError {
pub fn expect_next(&mut self) -> Result<Token, CompilerMsg> {
self.next().ok_or_else(|| CompilerMsg {
spans: Vec::new(),
msg: "unexpected end of file".to_string(),
})
}
pub fn expect(&mut self, token: Token) -> Result<Token, ParseError> {
pub fn expect(&mut self, token: Token) -> Result<Token, CompilerMsg> {
let next = self.expect_next()?;
if next == token {
Ok(next)
@@ -46,7 +48,7 @@ impl<'a> Cursor<'a> {
}
}
pub fn expect_ident(&mut self) -> Result<String, ParseError> {
pub fn expect_ident(&mut self) -> Result<String, CompilerMsg> {
let next = self.expect_next()?;
if let Token::Ident(s) = next {
Ok(s)
@@ -55,8 +57,8 @@ impl<'a> Cursor<'a> {
}
}
pub fn unexpected<T>(&self, token: Token, expected: &str) -> Result<T, ParseError> {
Err(ParseError::unexpected_token(
pub fn unexpected<T>(&self, token: Token, expected: &str) -> Result<T, CompilerMsg> {
Err(CompilerMsg::unexpected_token(
Spanned {
inner: token,
span: self.span,
@@ -65,11 +67,24 @@ impl<'a> Cursor<'a> {
))
}
pub fn peek_first(&mut self) -> usize {
self.tokens.peek().map(|i| i.span.first).unwrap_or(0)
pub fn peek_start(&mut self) -> usize {
self.tokens.peek().map(|i| i.span.start).unwrap_or(0)
}
pub fn cur_last(&mut self) -> usize {
self.span.last
pub fn cur_end(&mut self) -> usize {
self.span.end
}
pub fn file(&mut self) -> usize {
self.span.file
}
}
impl CompilerMsg {
pub fn unexpected_token(inst: TokenInst, expected: &str) -> Self {
Self {
spans: vec![inst.span],
msg: format!("Unexpected token '{}'; expected {expected}", inst.inner),
}
}
}