#![deny(missing_docs)]
mod lexer;
mod parser;
mod token;
#[derive(Copy, Clone, Debug)]
pub struct Span {
pub line: u32,
pub column: u32,
}
impl std::fmt::Display for Span {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(formatter, "{}:{}", self.line, self.column)
}
}
#[derive(Debug)]
pub struct Error {
pub message: String,
pub span: Option<Span>,
}
impl std::fmt::Display for Error {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if let Some(span) = self.span {
write!(formatter, "{span}: {}", self.message)
} else {
write!(formatter, "{}", self.message)
}
}
}
impl std::error::Error for Error {}
type Result<T> = std::result::Result<T, Error>;
pub fn parse(source: &str) -> Result<ty_ree::declaration::Module> {
let mut lexer = lexer::Lexer::new(source);
let tokens = lexer.tokenize()?;
let mut parser = parser::Parser::new(tokens);
parser.parse_module()
}