From 375671e208b964ff6589eed6f505c88f369bca85 Mon Sep 17 00:00:00 2001 From: Andy Grove Date: Mon, 3 Sep 2018 08:04:20 -0600 Subject: [PATCH] Refactoring --- examples/acme_parser.rs | 2 +- src/parser.rs | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/examples/acme_parser.rs b/examples/acme_parser.rs index 32447bd3..a69cc6e0 100644 --- a/examples/acme_parser.rs +++ b/examples/acme_parser.rs @@ -107,7 +107,7 @@ fn main() { let mut pratt_parser = PrattParser { chars: CharSeq::new(sql), - parser: acme_parser + parsers: vec![acme_parser, ansi_parser] }; let expr = pratt_parser.parse_expr().unwrap(); diff --git a/src/parser.rs b/src/parser.rs index 89955ca9..d514692a 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -116,16 +116,26 @@ pub trait SQLParser pub struct PrattParser { pub chars: CharSeq, - pub parser: Arc>> + pub parsers: Vec>>> } impl PrattParser where TokenType: Debug + PartialEq, ExprType: Debug { pub fn parse_expr(&mut self) -> Result>>, ParserError> { - let mut p = self.parser.lock().unwrap(); + for i in 0..self.parsers.len() { + let mut p = self.parsers[i].lock().unwrap(); + let expr = p.parse_prefix(&mut self.chars)?; - p.parse_prefix(&mut self.chars) + // return as soon as we have a match + match expr { + Some(_) => return Ok(expr), + _ => {} + } + } + + // found no valid token + Ok(None) } }