1#![deny(missing_docs)]
2
3mod lexer;
6mod parser;
7mod token;
8
9#[derive(Copy, Clone, Debug)]
11pub struct Span {
12 pub line: u32,
14 pub column: u32,
16}
17
18impl std::fmt::Display for Span {
19 fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
20 write!(formatter, "{}:{}", self.line, self.column)
21 }
22}
23
24#[derive(Debug)]
26pub struct Error {
27 pub message: String,
29 pub span: Option<Span>,
31}
32
33impl std::fmt::Display for Error {
34 fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
35 if let Some(span) = self.span {
36 write!(formatter, "{span}: {}", self.message)
37 } else {
38 write!(formatter, "{}", self.message)
39 }
40 }
41}
42
43impl std::error::Error for Error {}
44
45type Result<T> = std::result::Result<T, Error>;
46
47pub fn parse(source: &str) -> Result<ty_ree::declaration::Module> {
49 let mut lexer = lexer::Lexer::new(source);
50 let tokens = lexer.tokenize()?;
51 let mut parser = parser::Parser::new(tokens);
52 parser.parse_module()
53}