Skip to content

Commit a86bd30

Browse files
committed
Refactoring
1 parent 375671e commit a86bd30

File tree

6 files changed

+101
-338
lines changed

6 files changed

+101
-338
lines changed

examples/acme_parser.rs

-115
This file was deleted.

examples/parse_sql.rs

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
use std::sync::{Arc, Mutex};
2+
3+
extern crate datafusion_sql;
4+
5+
use datafusion_sql::ansi::tokenizer::ANSISQLTokenizer;
6+
use datafusion_sql::ansi::parser::ANSISQLParser;
7+
use datafusion_sql::tokenizer::*;
8+
use datafusion_sql::parser::*;
9+
10+
11+
fn main() {
12+
13+
let sql = "SELECT 1 + 1";
14+
15+
// Create parsers
16+
match ANSISQLParser::parse(sql).unwrap() {
17+
Some(ast) => println!("{:?}", ast),
18+
_ => {}
19+
}
20+
}

src/ansi/parser.rs

+40-14
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,56 @@
11
use std::cmp::PartialEq;
22
use std::fmt::Debug;
3-
//use std::iter::Peekable;
4-
//use std::str::Chars;
5-
6-
use std::sync::{Arc, Mutex};
3+
//use std::rc::Rc;
4+
//use std::sync::{Arc, Mutex};
75

6+
use super::tokenizer::ANSISQLTokenizer;
87
use super::super::tokenizer::*;
98
use super::super::parser::*;
109

11-
pub struct ANSISQLParser<TokenType> {
12-
tokenizer: Arc<Mutex<SQLTokenizer<TokenType>>>
10+
pub struct ANSISQLParser {
11+
tokenizer: Box<SQLTokenizer>
1312
}
1413

15-
impl<TokenType> ANSISQLParser<TokenType> where TokenType: Debug + PartialEq {
14+
impl ANSISQLParser where {
1615

17-
pub fn new(tokenizer: Arc<Mutex<SQLTokenizer<TokenType>>>) -> Self {
18-
ANSISQLParser { tokenizer: tokenizer.clone() }
16+
pub fn parse(sql: &str) -> Result<Option<Box<SQLExpr>>, ParserError> {
17+
let mut parser = ANSISQLParser { tokenizer: Box::new(ANSISQLTokenizer::new(sql)) };
18+
parser.parse_expr()
1919
}
2020
}
2121

22-
impl<TokenType, ExprType> SQLParser<TokenType, ExprType> for ANSISQLParser<TokenType>
23-
where TokenType: Debug + PartialEq, ExprType: Debug {
22+
impl SQLParser for ANSISQLParser {
23+
24+
fn parse_expr(&mut self) -> Result<Option<Box<SQLExpr>>, ParserError> {
25+
26+
let precedence: usize = 0;
27+
28+
let mut e = self.parse_prefix()?;
29+
30+
match e {
31+
Some(mut expr) => {
32+
while let Some(token) = self.tokenizer.peek_token()? {
33+
let next_precedence = self.tokenizer.precedence(&token);
34+
35+
if precedence >= next_precedence {
36+
break;
37+
}
38+
39+
expr = self.parse_infix(&expr, next_precedence)?.unwrap(); //TODO: fix me
40+
}
41+
42+
Ok(Some(expr))
43+
}
44+
_ => {
45+
Ok(None)
46+
}
47+
}
48+
49+
}
2450

25-
fn parse_prefix(&mut self, chars: &mut CharSeq) -> Result<Option<Box<SQLExpr<ExprType>>>, ParserError<TokenType>> {
51+
fn parse_prefix(&mut self) -> Result<Option<Box<SQLExpr>>, ParserError> {
2652

27-
match self.tokenizer.lock().unwrap().next_token(chars)? {
53+
match self.tokenizer.next_token()? {
2854
Some(SQLToken::Keyword(ref k)) => match k.to_uppercase().as_ref() {
2955
"INSERT" => unimplemented!(),
3056
"UPDATE" => unimplemented!(),
@@ -37,7 +63,7 @@ impl<TokenType, ExprType> SQLParser<TokenType, ExprType> for ANSISQLParser<Token
3763
}
3864
}
3965

40-
fn parse_infix(&mut self, _chars: &mut CharSeq, _left: &SQLExpr<ExprType>, _precedence: usize) -> Result<Option<Box<SQLExpr<ExprType>>>, ParserError<TokenType>> {
66+
fn parse_infix(&mut self, _left: &SQLExpr, _precedence: usize) -> Result<Option<Box<SQLExpr>>, ParserError> {
4167
unimplemented!()
4268
}
4369
}

src/ansi/tokenizer.rs

+18-7
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,37 @@ use std::fmt::Debug;
44
use super::super::tokenizer::*;
55

66
pub struct ANSISQLTokenizer {
7+
chars: CharSeq
78
}
89

9-
impl<TokenType> SQLTokenizer<TokenType> for ANSISQLTokenizer
10-
where TokenType: Debug + PartialEq {
10+
impl ANSISQLTokenizer {
11+
pub fn new(sql: &str) -> Self {
12+
ANSISQLTokenizer { chars: CharSeq::new(sql) }
13+
}
14+
}
1115

12-
fn precedence(&self, _token: &SQLToken<TokenType>) -> usize {
16+
impl SQLTokenizer for ANSISQLTokenizer {
17+
18+
fn precedence(&self, _token: &SQLToken) -> usize {
1319
unimplemented!()
1420
}
1521

16-
fn next_token(&mut self, chars: &mut CharSeq) -> Result<Option<SQLToken<TokenType>>, TokenizerError> {
17-
match chars.next() {
22+
fn peek_token(&mut self) -> Result<Option<SQLToken>, TokenizerError> {
23+
unimplemented!()
24+
}
25+
26+
27+
fn next_token(&mut self) -> Result<Option<SQLToken>, TokenizerError> {
28+
match self.chars.next() {
1829
Some(ch) => match ch {
1930
' ' | '\t' | '\n' => Ok(Some(SQLToken::Whitespace(ch))),
2031
'0' ... '9' => {
2132
let mut s = String::new();
2233
s.push(ch);
23-
while let Some(&ch) = chars.peek() {
34+
while let Some(&ch) = self.chars.peek() {
2435
match ch {
2536
'0' ... '9' => {
26-
chars.next(); // consume
37+
self.chars.next(); // consume
2738
s.push(ch);
2839
},
2940
_ => break

0 commit comments

Comments
 (0)