diff --git a/src/executor/initializer.rs b/src/executor/initializer.rs index 1620cfe..60d8876 100644 --- a/src/executor/initializer.rs +++ b/src/executor/initializer.rs @@ -132,6 +132,7 @@ impl Executor { self.check_output_status(output) } + #[allow(dead_code)] async fn write_and_check_err( &self, base_path: PathBuf, diff --git a/src/lexer/test/select.rs b/src/lexer/test/select.rs index 51ba2c5..86a083a 100644 --- a/src/lexer/test/select.rs +++ b/src/lexer/test/select.rs @@ -188,6 +188,17 @@ pub fn test_operators() { Token::Integer(2), ], }, + TestCase { + name: "연산자: <=".to_owned(), + input: r#"SELECT 1 <= 2"#.to_owned(), + want_error: false, + expected: vec![ + Token::Select, + Token::Integer(1), + Token::Operator(OperatorToken::Lte), + Token::Integer(2), + ], + }, TestCase { name: "연산자: >".to_owned(), input: r#"SELECT 1 > 2"#.to_owned(), @@ -199,6 +210,17 @@ pub fn test_operators() { Token::Integer(2), ], }, + TestCase { + name: "연산자: >=".to_owned(), + input: r#"SELECT 1 >= 2"#.to_owned(), + want_error: false, + expected: vec![ + Token::Select, + Token::Integer(1), + Token::Operator(OperatorToken::Gte), + Token::Integer(2), + ], + }, TestCase { name: "연산자: -".to_owned(), input: r#"SELECT 1 - 2"#.to_owned(), @@ -243,6 +265,17 @@ pub fn test_operators() { Token::Integer(2), ], }, + TestCase { + name: "연산자: !=".to_owned(), + input: r#"SELECT 1 != 2"#.to_owned(), + want_error: false, + expected: vec![ + Token::Select, + Token::Integer(1), + Token::Operator(OperatorToken::Neq), + Token::Integer(2), + ], + }, TestCase { name: "연산자: !".to_owned(), input: r#"SELECT ! True"#.to_owned(), diff --git a/src/lexer/tokenizer.rs b/src/lexer/tokenizer.rs index a036d4f..42f2a89 100644 --- a/src/lexer/tokenizer.rs +++ b/src/lexer/tokenizer.rs @@ -284,10 +284,46 @@ impl Tokenizer { } '+' => Token::Operator(OperatorToken::Plus), '*' => Token::Operator(OperatorToken::Asterisk), - '!' => Token::Operator(OperatorToken::Not), // TODO: != 연산자 처리 + '!' => { + // 다음 문자가 =일 경우 != 연산자로 처리 + + self.read_char(); + + if self.last_char == '=' { + Token::Operator(OperatorToken::Neq) + } else { + self.unread_char(); + + Token::Operator(OperatorToken::Not) + } + } '=' => Token::Operator(OperatorToken::Eq), - '<' => Token::Operator(OperatorToken::Lt), // TODO: <= 연산자 처리 - '>' => Token::Operator(OperatorToken::Gt), // TODO: >= 연산자 처리 + '<' => { + // 다음 문자가 =일 경우 <= 연산자로 처리 + + self.read_char(); + + if self.last_char == '=' { + Token::Operator(OperatorToken::Lte) + } else { + self.unread_char(); + + Token::Operator(OperatorToken::Lt) + } + } + '>' => { + // 다음 문자가 =일 경우 >= 연산자로 처리 + + self.read_char(); + + if self.last_char == '=' { + Token::Operator(OperatorToken::Gte) + } else { + self.unread_char(); + + Token::Operator(OperatorToken::Gt) + } + } _ => { return Err(LexingError::wrap(format!( "unexpected operator: {:?}",