2024-09-15 21:34:46 +00:00
|
|
|
use crate::{error_handling::ErrorContainer, lexic::token::Token};
|
2024-06-02 02:32:16 +00:00
|
|
|
|
|
|
|
/// The result of a parsing operation.
|
|
|
|
/// On success, it contains the item and the position of the next token
|
|
|
|
/// On failure, it contains the error
|
|
|
|
pub type ParsingResult<'a, A> = Result<(A, usize), ParsingError<'a>>;
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
pub enum ParsingError<'a> {
|
|
|
|
/// The parsing didn't succeed, but it's not a fatal error
|
|
|
|
Unmatched,
|
|
|
|
/// Some other token was found than the expected one
|
|
|
|
Mismatch(&'a Token),
|
|
|
|
/// The parsing failed past a point of no return.
|
|
|
|
///
|
|
|
|
/// For example, when parsing a function declaration
|
|
|
|
/// the `fun` token is found, but then no identifier
|
2024-09-15 21:34:46 +00:00
|
|
|
Err(ErrorContainer),
|
2024-06-02 02:32:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Represents a type that can be parsed using Recursive Descent
|
|
|
|
pub trait Parseable<'a> {
|
|
|
|
type Item;
|
|
|
|
|
|
|
|
/// Try to parse the current production.
|
|
|
|
fn try_parse(tokens: &'a Vec<Token>, current_pos: usize) -> ParsingResult<'a, Self::Item>;
|
|
|
|
}
|