diff --git a/parser/Cargo.toml b/parser/Cargo.toml index 110049f..5475a2c 100644 --- a/parser/Cargo.toml +++ b/parser/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] +chumsky = "0.10.1" logos = "0.15.0" rowan = "0.16.1" thiserror = "2.0.12" diff --git a/parser/src/parser/ast.rs b/parser/src/parser/ast.rs index 424d95c..b3a3170 100644 --- a/parser/src/parser/ast.rs +++ b/parser/src/parser/ast.rs @@ -59,6 +59,9 @@ pub enum SyntaxKind { GROUP_BY, CREATE, + ALTER, + DROP, + TRUNCATE, TABLE, @@ -72,11 +75,21 @@ pub enum SyntaxKind { PARENTHESES_END, VALUES, DEFINITION, + EQUAL, GT, LT, + LEQT, + GEQT, + AND, OR, + NOT, + + TRUE, + FALSE, + BOOLEAN_OP, + GROUP, ORDER, BY, @@ -84,19 +97,22 @@ pub enum SyntaxKind { ASC, DISTINCT, - COMPARE, - GREATER, - LESS, + COMPARISON, EMPTY, ROOT, } impl SyntaxKind { pub fn is_dql(&self) -> bool { - (2..=3).contains(&(*self as u16)) + //(2..=3).contains(&(*self as u16)) + *self == SELECT } pub fn is_ddl(&self) -> bool { - (4..=4).contains(&(*self as u16)) + //(4..=4).contains(&(*self as u16)) + match *self { + CREATE | ALTER | DROP | TRUNCATE => true, + _ => false, + } } } diff --git a/parser/src/parser/ast/ast_trait.rs b/parser/src/parser/ast/ast_trait.rs new file mode 100644 index 0000000..bf6bb36 --- /dev/null +++ b/parser/src/parser/ast/ast_trait.rs @@ -0,0 +1,36 @@ +use crate::parser::ast::ast::SyntaxKind; +use crate::parser::ast::errors::AstErr; +use crate::parser::lexer::Token; +use std::fmt::Display; + +pub trait AstNode: Display + Eq { + fn add_child(&mut self, child: &A) -> Result<(), AstErr> + where + A: AstNode; + fn is_compatible(&self, child: &A) -> Result<(), AstErr> + where + A: AstNode; + fn get_parent(&self) -> Option + where + A: AstNode; + fn get_kind(&self) -> SyntaxKind; +} + +pub trait AstToken: AstNode { + fn get_token(&self) -> Token; +} + +pub trait AstNodeContainer: AstNode { + fn get_children(&self) -> Vec> + where + A: AstNode; +} + +pub trait Ast: Iterator +where + N: AstNode, +{ + fn diff(&self, other: &Self) -> Self; + fn as_node(&self) -> N; + fn from(root: &N) -> Self; +} diff --git a/parser/src/parser/ast/errors.rs b/parser/src/parser/ast/errors.rs new file mode 100644 index 0000000..b70f72f --- /dev/null +++ b/parser/src/parser/ast/errors.rs @@ -0,0 +1,4 @@ +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum AstErr {} diff --git a/parser/src/parser/ast/mod.rs b/parser/src/parser/ast/mod.rs new file mode 100644 index 0000000..aef3a4e --- /dev/null +++ b/parser/src/parser/ast/mod.rs @@ -0,0 +1,5 @@ +pub mod ast; +pub mod ast_trait; +pub mod errors; +pub mod nodes; +pub mod operators; diff --git a/parser/src/parser/lexer.rs b/parser/src/parser/lexer.rs index 06a4751..944308d 100644 --- a/parser/src/parser/lexer.rs +++ b/parser/src/parser/lexer.rs @@ -27,6 +27,9 @@ pub enum Token { #[regex("(?i)OR")] Or, + #[regex("(?i)NOT")] + Not, + #[regex("(?i)GROUP")] Group, @@ -66,6 +69,12 @@ pub enum Token { #[token("=")] Equal, + #[token(">=")] + GEQT, + + #[token("<=")] + LEQT, + #[token(">")] GT, @@ -104,8 +113,11 @@ impl Token { Token::Where => (SyntaxKind::WHERE, String::from("WHERE")), Token::LT => (SyntaxKind::LT, String::from("<")), Token::GT => (SyntaxKind::GT, String::from(">")), + Token::LEQT => (SyntaxKind::LT, String::from("<=")), + Token::GEQT => (SyntaxKind::GT, String::from(">=")), Token::And => (SyntaxKind::AND, String::from("AND")), Token::Or => (SyntaxKind::OR, String::from("OR")), + Token::Not => (SyntaxKind::NOT, String::from("NOT")), Token::Group => (SyntaxKind::GROUP, String::from("GROUP")), Token::By => (SyntaxKind::BY, String::from("BY")), Token::Desc => (SyntaxKind::DESC, String::from("DESC")), diff --git a/parser/src/parser/sql/group_by.rs b/parser/src/parser/sql/group_by.rs index 4feab9e..9c78e05 100644 --- a/parser/src/parser/sql/group_by.rs +++ b/parser/src/parser/sql/group_by.rs @@ -1,6 +1,4 @@ use crate::parser::ast::SyntaxKind::*; use crate::parser::grammar::Grammar::{self, *}; -use crate::parser::grammar::GrammarType::*; -pub const GROUP_BY_GRAMMAR: Grammar = - Children(&[GROUP, BY], GROUP_BY, &[List(&[IDENTIFIER])]); +pub const GROUP_BY_GRAMMAR: Grammar = Children(&[GROUP, BY], GROUP_BY, &[List(&[IDENTIFIER])]);