From f603f4b2de80669c052adf151ad02a6141d3843a Mon Sep 17 00:00:00 2001 From: wupeng <1399094187@qq.com> Date: Tue, 17 Oct 2023 11:44:39 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=88=20perf(parser):=20remove=20the=20r?= =?UTF-8?q?eturn=20value=20option?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/parser/mod.rs | 251 +++++++++------------------------------------- 1 file changed, 47 insertions(+), 204 deletions(-) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 3479786..830ef12 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -460,7 +460,7 @@ impl Parser { loop { self.next_token(); - exprs.push(self.parse_expression(Precedence::Lowest)?); + exprs.push(Some(self.parse_expression(Precedence::Lowest)?)); match self.next_token() { Token::RightParen => break, Token::Comma => {} @@ -683,7 +683,7 @@ impl Parser { Keyword::Default => { self.next_token(); self.next_token(); - column.default = self.parse_expression(Precedence::Lowest)? + column.default = Some(self.parse_expression(Precedence::Lowest)?); } Keyword::Unique => { self.next_token(); @@ -752,14 +752,7 @@ impl Parser { match &self.pre_token { Token::KeyWord(Keyword::Offset) => { self.next_token(); - Some(match self.parse_expression(Precedence::Lowest)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!( - "OFFSET exp should't be none" - ))); - } - }) + Some(self.parse_expression(Precedence::Lowest)?) } _ => None, } @@ -769,14 +762,7 @@ impl Parser { Token::KeyWord(Keyword::Limit) => { self.next_token(); self.next_token(); - Some(match self.parse_expression(Precedence::Lowest)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!( - "LIMIT exp should't be none" - ))); - } - }) + Some(self.parse_expression(Precedence::Lowest)?) } _ => None, } @@ -793,11 +779,7 @@ impl Parser { self.next_token(); break; } - - let expr = match self.parse_expression(Precedence::Lowest)? { - Some(e) => e, - None => return Err(Error::ParseErr(fmt_err!("SELECT expression is not valid!"))), - }; + let expr = self.parse_expression(Precedence::Lowest)?; // SELECT 1 + 2 AS c1; 1 + 2 是一个表达式, c1 是 alias 的一个名字 // Keyword::As 是一个可选项 @@ -864,14 +846,7 @@ impl Parser { self.next_expected_keyword(Keyword::On)?; self.next_token(); - Some(match self.parse_expression(Precedence::Lowest)? { - Some(expr) => expr, - None => { - return Err(Error::ParseErr(fmt_err!( - "ON Predicate expression is not valid!" - ))); - } - }) + Some(self.parse_expression(Precedence::Lowest)?) } }; @@ -1025,12 +1000,7 @@ impl Parser { self.next_token(); loop { - exprs.push(match self.parse_expression(Precedence::Lowest)? { - Some(e) => e, - None => { - return Err(Error::ParseErr("GROUP BY exp should't be none".to_owned())); - } - }); + exprs.push(self.parse_expression(Precedence::Lowest)?); self.next_token(); match self.peek_token { @@ -1051,14 +1021,10 @@ impl Parser { } self.next_token(); - return Ok(Some(match self.parse_expression(Precedence::Lowest)? { - Some(exp) => { - self.next_token(); - exp - } - None => { - return Err(Error::ParseErr(fmt_err!("WHERE exp should't be none"))); - } + return Ok(Some({ + let exp = self.parse_expression(Precedence::Lowest)?; + self.next_token(); + exp })); } @@ -1066,14 +1032,11 @@ impl Parser { match self.pre_token { Token::KeyWord(Keyword::Having) => { self.next_token(); - Ok(Some(match self.parse_expression(Precedence::Lowest)? { - Some(exp) => { - self.next_token(); - exp - } - None => { - return Err(Error::ParseErr("HAVING exp should't be none".to_owned())); - } + Ok(Some({ + let exp = self.parse_expression(Precedence::Lowest)?; + + self.next_token(); + exp })) } _ => Ok(None), @@ -1093,14 +1056,11 @@ impl Parser { loop { orders.push(( - match self.parse_expression(Precedence::Lowest)? { - Some(exp) => { - self.next_token(); - exp - } - None => { - return Err(Error::ParseErr(fmt_err!("ORDER BY exp should't be none"))); - } + { + let exp = self.parse_expression(Precedence::Lowest)?; + + self.next_token(); + exp }, match self.pre_token { Token::KeyWord(Keyword::Asc) => OrderByType::Asc, @@ -1127,10 +1087,7 @@ impl Parser { let column = self.next_ident()?; self.next_expected_token(Token::Equal)?; self.next_token(); - let expr = match self.parse_expression(Precedence::Lowest)? { - Some(e) => e, - None => return Err(Error::ParseErr(fmt_err!("expr can not be none"))), - }; + let expr = self.parse_expression(Precedence::Lowest)?; if set.contains_key(&column) { return Err(Error::OtherErr(fmt_err!( @@ -1223,10 +1180,10 @@ impl Parser { } // (1 + 2) - fn parse_expression(&mut self, precedence: Precedence) -> Result> { + fn parse_expression(&mut self, precedence: Precedence) -> Result { if !is_prefix_oper(&self.pre_token) { return Err(Error::ParseErr(fmt_err!( - "No prefixOperatorFunc for: {:?}", + "No prefix Operator Func for: {}", &self.pre_token ))); } @@ -1242,13 +1199,13 @@ impl Parser { while self.pre_token != Token::Semicolon && precedence < self.peek_token_predence() { if !is_infix_oper(&self.peek_token) { - return Ok(Some(lhs)); + return Ok(lhs); } self.next_token(); lhs = self.parse_infix_expr(lhs)?; } - Ok(Some(lhs)) + Ok(lhs) } fn parse_prefix_expr(&mut self) -> Result> { @@ -1258,34 +1215,19 @@ impl Parser { self.next_token(); Ok(Some(Expression::Operation(Operation::Not(Box::new( - match self.parse_expression(Precedence::Prefix)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!("Operation::Not exp is None"))); - } - }, + self.parse_expression(Precedence::Prefix)?, ))))) } Token::Add => { self.next_token(); Ok(Some(Expression::Operation(Operation::Assert(Box::new( - match self.parse_expression(Precedence::Prefix)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!("Operation::Assert exp is None"))); - } - }, + self.parse_expression(Precedence::Prefix)?, ))))) } Token::Minus => { self.next_token(); Ok(Some(Expression::Operation(Operation::Negate(Box::new( - match self.parse_expression(Precedence::Prefix)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!("Operation::Negate exp is None"))); - } - }, + self.parse_expression(Precedence::Prefix)?, ))))) } Token::Number(n) => { @@ -1312,12 +1254,11 @@ impl Parser { } Token::LeftParen => { self.next_token(); - let exp = self.parse_expression(Precedence::Lowest); + let exp = self.parse_expression(Precedence::Lowest)?; if !self.peek_if_token(Token::RightParen) { return Ok(None); } - - exp + Ok(Some(exp)) } Token::Ident(i) => match &self.peek_token { Token::LeftParen => Ok(Some(Expression::Literal(Literal::String(i)))), @@ -1363,12 +1304,7 @@ impl Parser { self.next_token(); Ok(Expression::Operation(Operation::Add( Box::new(exp), - Box::new(match self.parse_expression(precedence)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!("Operation::Add exp is None"))); - } - }), + Box::new(self.parse_expression(precedence)?), ))) } Token::Equal => { @@ -1377,12 +1313,7 @@ impl Parser { Ok(Expression::Operation(Operation::Equal( Box::new(exp), - Box::new(match self.parse_expression(precedence)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!("Operation::Equal exp is None"))); - } - }), + Box::new(self.parse_expression(precedence)?), ))) } Token::GreaterThan => { @@ -1391,14 +1322,7 @@ impl Parser { Ok(Expression::Operation(Operation::GreaterThan( Box::new(exp), - Box::new(match self.parse_expression(precedence)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!( - "Operation::GreaterThan exp is None" - ))); - } - }), + Box::new(self.parse_expression(precedence)?), ))) } Token::GreaterThanOrEqual => { @@ -1407,14 +1331,7 @@ impl Parser { Ok(Expression::Operation(Operation::GreaterThanOrEqual( Box::new(exp), - Box::new(match self.parse_expression(precedence)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!( - "Operation::GreaterThanOrEqual is None" - ))); - } - }), + Box::new(self.parse_expression(precedence)?), ))) } Token::LessThan => { @@ -1423,14 +1340,7 @@ impl Parser { Ok(Expression::Operation(Operation::LessThan( Box::new(exp), - Box::new(match self.parse_expression(precedence)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!( - "Operation::LessThan exp is None" - ))); - } - }), + Box::new(self.parse_expression(precedence)?), ))) } Token::LessThanOrEqual => { @@ -1439,14 +1349,7 @@ impl Parser { Ok(Expression::Operation(Operation::LessThanOrEqual( Box::new(exp), - Box::new(match self.parse_expression(precedence)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!( - "Operation::LessThanOrEqual exp is None" - ))); - } - }), + Box::new(self.parse_expression(precedence)?), ))) } Token::Minus => { @@ -1455,12 +1358,7 @@ impl Parser { Ok(Expression::Operation(Operation::Subtract( Box::new(exp), - Box::new(match self.parse_expression(precedence)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!("Operation::Minus exp is None"))); - } - }), + Box::new(self.parse_expression(precedence)?), ))) } Token::NotEqual => { @@ -1469,14 +1367,7 @@ impl Parser { Ok(Expression::Operation(Operation::NotEqual( Box::new(exp), - Box::new(match self.parse_expression(precedence)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!( - "Operation::NotEqual exp is None" - ))); - } - }), + Box::new(self.parse_expression(precedence)?), ))) } Token::KeyWord(Keyword::And) => { @@ -1485,12 +1376,7 @@ impl Parser { Ok(Expression::Operation(Operation::And( Box::new(exp), - Box::new(match self.parse_expression(precedence)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!("Operation::And exp is None"))); - } - }), + Box::new(self.parse_expression(precedence)?), ))) } Token::KeyWord(Keyword::Or) => { @@ -1499,12 +1385,7 @@ impl Parser { Ok(Expression::Operation(Operation::Or( Box::new(exp), - Box::new(match self.parse_expression(precedence)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!("Operation::Or exp is None"))); - } - }), + Box::new(self.parse_expression(precedence)?), ))) } Token::KeyWord(Keyword::Like) => { @@ -1513,12 +1394,7 @@ impl Parser { Ok(Expression::Operation(Operation::Like( Box::new(exp), - Box::new(match self.parse_expression(precedence)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!("Operation::Like exp is None"))); - } - }), + Box::new(self.parse_expression(precedence)?), ))) } Token::Percent => { @@ -1526,14 +1402,7 @@ impl Parser { self.next_token(); Ok(Expression::Operation(Operation::Modulo( Box::new(exp), - Box::new(match self.parse_expression(precedence)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!( - "Operation::Percent exp is None" - ))); - } - }), + Box::new(self.parse_expression(precedence)?), ))) } Token::Asterisk => { @@ -1541,14 +1410,7 @@ impl Parser { self.next_token(); Ok(Expression::Operation(Operation::Multiply( Box::new(exp), - Box::new(match self.parse_expression(precedence)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!( - "Operation::Asterisk exp is None" - ))); - } - }), + Box::new(self.parse_expression(precedence)?), ))) } Token::Slash => { @@ -1556,12 +1418,7 @@ impl Parser { self.next_token(); Ok(Expression::Operation(Operation::Divide( Box::new(exp), - Box::new(match self.parse_expression(precedence)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!("Operation::Slash exp is None"))); - } - }), + Box::new(self.parse_expression(precedence)?), ))) } // 如果 ( 是一个中缀运算符, 则是一个函数 @@ -1622,26 +1479,12 @@ impl Parser { } self.next_token(); - exprs.push(match self.parse_expression(Precedence::Lowest)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!( - "Operation::LeftParen exp is None" - ))); - } - }); + exprs.push(self.parse_expression(Precedence::Lowest)?); while self.peek_if_token(Token::Comma) { self.next_token(); - exprs.push(match self.parse_expression(Precedence::Lowest)? { - Some(exp) => exp, - None => { - return Err(Error::ParseErr(fmt_err!( - "parse_expression_list exp is None" - ))); - } - }); + exprs.push(self.parse_expression(Precedence::Lowest)?); } if !self.peek_if_token(Token::RightParen) {