diff --git a/examples/acme_parser.rs b/examples/acme_parser.rs index d86e5060..75389942 100644 --- a/examples/acme_parser.rs +++ b/examples/acme_parser.rs @@ -36,27 +36,33 @@ impl SQLTokenizer for AcmeTokenizer { } fn next_token(&mut self, chars: &mut CharSeq) -> Result>, TokenizerError> { -// let mut arc = self.ansi_tokenizer.lock().unwrap(); -// match arc.peek_char() { -// Some(&ch) => match ch { -// '!' => { -// arc.next_char(); // consume the first `!` -// match arc.peek_char() { -// Some(&ch) => match ch { -// '!' => { -// arc.next_char(); // consume the second `!` -// Ok(Some(SQLToken::Custom(AcmeToken::Factorial))) -// }, -// _ => Err(TokenizerError::UnexpectedChar(ch,Position::new(0,0))) -// }, -// None => Ok(Some(SQLToken::Not)) -// } -// } -// _ => arc.next_token() -// } -// _ => arc.next_token() -// } - unimplemented!() + let mut ansi = self.ansi_tokenizer.lock().unwrap(); + match chars.peek() { + Some(&ch) => match ch { + '!' => { + chars.mark(); + chars.next(); // consume the first `!` + match chars.peek() { + Some(&ch) => match ch { + '!' => { + chars.next(); // consume the second `!` + Ok(Some(SQLToken::Custom(AcmeToken::Factorial))) + }, + _ => { + chars.reset(); + ansi.next_token(chars) + } + }, + None => { + chars.reset(); + ansi.next_token(chars) + } + } + } + _ => ansi.next_token(chars) + } + _ => ansi.next_token(chars) + } } } @@ -99,7 +105,9 @@ fn main() { let ansi_parser = Arc::new(Mutex::new(ANSISQLParser::new(acme_tokenizer.clone()))); let acme_parser = Arc::new(Mutex::new(AcmeParser::new(acme_tokenizer.clone()))); - //let parser_list: Vec>>> = vec![acme_parser, ansi_parser]; + // ansi_parser.lock().unwrap().next_token(); + + //let parser_list = vec![acme_parser, ansi_parser]; // Custom ACME parser // let acme_parser: Arc>> = Arc::new(Mutex::new(AcmeParser { diff --git a/src/parser.rs b/src/parser.rs index 1d637451..c4c0e0c2 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -113,6 +113,12 @@ pub trait SQLParser fn parse_infix(&mut self, chars: &mut CharSeq, left: &SQLExpr, precedence: usize) -> Result>>, ParserError>; } +//struct PrattParser { +// +// ansi_parser: +// +//} + // //pub fn parse_expr<'a, TokenType, ExprType>(parser: Arc>>) // -> Result>, ParserError> where TokenType: Debug + PartialEq, ExprType: Debug {