mod ast;
mod builder;
mod event;
mod grammar;
mod input;
mod parser;
pub use ast::*;
pub use sql_dialect_fmt_syntax::{Dialect, SyntaxKind, SyntaxNode};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ParseError {
pub message: String,
pub offset: usize,
pub len: usize,
}
impl ParseError {
pub fn range(&self) -> std::ops::Range<usize> {
self.offset..self.offset + self.len
}
}
impl std::fmt::Display for ParseError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{} at byte {}", self.message, self.offset)
}
}
impl std::error::Error for ParseError {}
#[derive(Clone)]
pub struct Parse {
green: rowan::GreenNode,
errors: Vec<ParseError>,
}
impl Parse {
pub fn syntax(&self) -> SyntaxNode {
SyntaxNode::new_root(self.green.clone())
}
pub fn errors(&self) -> &[ParseError] {
&self.errors
}
}
pub fn parse(text: &str) -> Parse {
parse_with_dialect(text, Dialect::Snowflake)
}
pub fn parse_with_dialect(text: &str, dialect: Dialect) -> Parse {
let lexed = sql_dialect_fmt_lexer::tokenize_for_dialect(text, dialect);
let input = input::Input::new(lexed);
let (events, errors) = parser::Parser::new(&input, dialect).parse();
let green = builder::build_tree(input.all(), events);
Parse { green, errors }
}