From 5d8aa86abd718a5f5fc0d2660d114a305d06944b Mon Sep 17 00:00:00 2001 From: El-PowerPtr Date: Wed, 9 Jul 2025 15:20:59 -0400 Subject: [PATCH 1/4] feature: 'NOT' operator added --- parser/src/parser/ast.rs | 3 +++ parser/src/parser/lexer.rs | 4 ++++ parser/src/parser/sql/group_by.rs | 4 +--- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/parser/src/parser/ast.rs b/parser/src/parser/ast.rs index 424d95c..5c21141 100644 --- a/parser/src/parser/ast.rs +++ b/parser/src/parser/ast.rs @@ -75,8 +75,11 @@ pub enum SyntaxKind { EQUAL, GT, LT, + AND, OR, + NOT, + GROUP, ORDER, BY, diff --git a/parser/src/parser/lexer.rs b/parser/src/parser/lexer.rs index 06a4751..0d4ca13 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, @@ -106,6 +109,7 @@ impl Token { Token::GT => (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])]); From 05432494e7242e77bc7395b3966bd37871c1203d Mon Sep 17 00:00:00 2001 From: El-PowerPtr Date: Fri, 18 Jul 2025 04:47:54 -0400 Subject: [PATCH 2/4] small changes in is_ddl and is_dql + some keywords added --- parser/src/parser/ast.rs | 23 ++++++++++++++++++----- parser/src/parser/lexer.rs | 8 ++++++++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/parser/src/parser/ast.rs b/parser/src/parser/ast.rs index 5c21141..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,14 +75,21 @@ pub enum SyntaxKind { PARENTHESES_END, VALUES, DEFINITION, + EQUAL, GT, LT, + LEQT, + GEQT, AND, OR, NOT, + TRUE, + FALSE, + BOOLEAN_OP, + GROUP, ORDER, BY, @@ -87,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/lexer.rs b/parser/src/parser/lexer.rs index 0d4ca13..944308d 100644 --- a/parser/src/parser/lexer.rs +++ b/parser/src/parser/lexer.rs @@ -69,6 +69,12 @@ pub enum Token { #[token("=")] Equal, + #[token(">=")] + GEQT, + + #[token("<=")] + LEQT, + #[token(">")] GT, @@ -107,6 +113,8 @@ 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")), From 46934a00e1c98693f79764acad89f095d20b1eac Mon Sep 17 00:00:00 2001 From: El-PowerPtr Date: Wed, 30 Jul 2025 20:17:11 -0400 Subject: [PATCH 3/4] feat: chumsky and thiserror added as dependencies --- parser/Cargo.toml | 1 + 1 file changed, 1 insertion(+) 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" From 849f4def2fc48add23fe464fa6a4a3acbbcd0471 Mon Sep 17 00:00:00 2001 From: El-PowerPtr Date: Wed, 30 Jul 2025 20:41:20 -0400 Subject: [PATCH 4/4] feature: ast trait added --- parser/src/parser/ast/ast_trait.rs | 36 ++++++++++++++++++++++++++++++ parser/src/parser/ast/errors.rs | 4 ++++ parser/src/parser/ast/mod.rs | 5 +++++ 3 files changed, 45 insertions(+) create mode 100644 parser/src/parser/ast/ast_trait.rs create mode 100644 parser/src/parser/ast/errors.rs create mode 100644 parser/src/parser/ast/mod.rs 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;