stuff
This commit is contained in:
+31
-16
@@ -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),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user