diff --git a/examples/acme_parser.rs b/examples/acme_parser.rs index 5a9755ca..92d3bb8e 100644 --- a/examples/acme_parser.rs +++ b/examples/acme_parser.rs @@ -1,5 +1,6 @@ use std::str::Chars; use std::iter::Peekable; +use std::rc::Rc; extern crate datafusion_sql; @@ -62,43 +63,58 @@ impl SQLTokenizer for AcmeTokenizer { } } -struct AcmeParser<'a> { - chars: Peekable> +struct AcmeParser { + tokenizer: Rc> } +// +//impl<'a> AcmeParser<'a> { +// +// pub fn new(sql: &'a str) -> Self { +// AcmeParser { +// chars: sql.chars().peekable() +// } +// } +//} -impl<'a> AcmeParser<'a> { - - pub fn new(sql: &'a str) -> Self { - AcmeParser { - chars: sql.chars().peekable() - } - } -} - -impl<'a> SQLParser for AcmeParser<'a> { +impl SQLParser for AcmeParser { fn parse_prefix(&mut self) -> Result>, ParserError> { unimplemented!() } - fn parse_infix(&mut self, left: &SQLExpr, precedence: usize) -> Result>>, ParserError> { + fn parse_infix(&mut self, left: &SQLExpr, _precedence: usize) -> Result>>, ParserError> { unimplemented!() } } - fn main() { let sql = "1 + !! 5 * 2"; - let acme_parser = AcmeParser::new(sql); +// let acme_parser = AcmeParser::new(sql); //acme_parser -// let mut acme_tokenizer = AcmeTokenizer { -// generic: ANSISQLTokenizer { } -// }; + let mut acme_tokenizer: Rc> = Rc::new(AcmeTokenizer { + generic: ANSISQLTokenizer { } + }); + + let mut acme_parser: Rc> = Rc::new(AcmeParser { + tokenizer: acme_tokenizer.clone() + }); + +// let mut pratt_parser = Rc::new(PrattParser { +// chars: sql.chars().peekable(), +// tokenizer: acme_tokenizer.clone(), +// parser: acme_parser.clone() +// }); + + let mut chars = sql.chars().peekable(); + + let expr = parse_expr(acme_tokenizer, acme_parser, &mut chars); + + println!("Parsed: {:?}", expr); // // let tokens = tokenize(&sql, &mut acme_tokenizer).unwrap(); // diff --git a/src/ansi/parser.rs b/src/ansi/parser.rs index bf93dd20..3a81e7b4 100644 --- a/src/ansi/parser.rs +++ b/src/ansi/parser.rs @@ -29,7 +29,7 @@ impl<'a, TokenType, ExprType> SQLParser for ANSISQLParser<' } } - fn parse_infix(&mut self, left: &SQLExpr, precedence: usize) -> Result>>, ParserError> { + fn parse_infix(&mut self, _left: &SQLExpr, _precedence: usize) -> Result>>, ParserError> { unimplemented!() } } diff --git a/src/ansi/tokenizer.rs b/src/ansi/tokenizer.rs index b2144ff4..4ce44024 100644 --- a/src/ansi/tokenizer.rs +++ b/src/ansi/tokenizer.rs @@ -10,11 +10,11 @@ pub struct ANSISQLTokenizer {} impl SQLTokenizer for ANSISQLTokenizer where TokenType: Debug + PartialEq { - fn precedence(&self, token: &SQLToken) -> usize { + fn precedence(&self, _token: &SQLToken) -> usize { unimplemented!() } - fn peek_token(&self, chars: &mut Peekable) -> Result>, TokenizerError> { + fn peek_token(&self, _chars: &mut Peekable) -> Result>, TokenizerError> { unimplemented!() } diff --git a/src/parser.rs b/src/parser.rs index 260984c6..b08a8eba 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -117,37 +117,43 @@ pub trait SQLParser } - -struct PrattParser<'a, TokenType, ExprType> { - chars: Peekable>, - tokenizer: Rc>, - parser: SQLParser +pub fn parse_expr<'a, TokenType, ExprType>(_tokenizer: Rc>, _parser: Rc>, _chars: &mut Peekable>) + -> Result>, ParserError> where TokenType: Debug + PartialEq, ExprType: Debug { + unimplemented!() } -impl<'a, TokenType, ExprType> PrattParser<'a, TokenType, ExprType> - where TokenType: Debug + PartialEq, ExprType: Debug { - fn parse_expr(&mut self) -> Result>, ParserError> { - - let precedence: usize = 0; - - let mut expr = self.parser.parse_prefix()?; - - while let Some(token) = self.tokenizer.peek_token(&mut self.chars)? { - - let next_precedence = self.tokenizer.precedence(&token); - - if precedence >= next_precedence { - break; - } - - expr = self.parser.parse_infix(&expr, next_precedence)?.unwrap(); //TODO: fix me - } - - Ok(expr) - } - -} +//pub struct PrattParser<'a, TokenType, ExprType> { +// chars: Peekable>, +// tokenizer: Rc>, +// parser: Rc> +//} +// +//impl<'a, TokenType, ExprType> PrattParser<'a, TokenType, ExprType> +// where TokenType: Debug + PartialEq, ExprType: Debug { +// +// pub fn parse_expr(&mut self) -> Result>, ParserError> { +// +// let precedence: usize = 0; +// let parser_ref = self.parser.as_ref(); +// +// let mut expr = parser_ref.parse_prefix()?; +// +// while let Some(token) = self.tokenizer.peek_token(&mut self.chars)? { +// +// let next_precedence = self.tokenizer.precedence(&token); +// +// if precedence >= next_precedence { +// break; +// } +// +// expr = parser_ref.parse_infix(&expr, next_precedence)?.unwrap(); //TODO: fix me +// } +// +// Ok(expr) +// } +// +//} // fn parse_prefix(&mut self) -> Result, ParserError> { //