Advertisement
Guest User

Untitled

a guest
Jun 26th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.30 KB | None | 0 0
  1. use std::iter::{Iterator, Peekable};
  2. use std::result;
  3.  
  4. #[derive(Debug)]
  5. struct ParserError;
  6. #[derive(Debug)]
  7. struct Statement(SqlSetExpr);
  8. #[derive(Debug)]
  9. struct TableWithJoins;
  10.  
  11. type Result<T> = result::Result<T, ParserError>; type Tokens = Box<Iterator<Item = Token>>;
  12.  
  13. #[derive(Debug)]
  14. enum SqlSetExpr {
  15. Select,
  16. Query,
  17. Values,
  18. }
  19.  
  20. // Not meant to be exhaustive, this is a toy example.
  21. enum Token {
  22. Select,
  23. LParen,
  24. RParen,
  25. Values,
  26. Wildcard,
  27. From,
  28. Keyword(String),
  29. }
  30.  
  31. impl From<&str> for Token {
  32. fn from(s: &str) -> Token {
  33. match s {
  34. "(" => Token::LParen,
  35. ")" => Token::RParen,
  36. "*" => Token::Wildcard,
  37. "SELECT" => Token::Select,
  38. "VALUES" => Token::Values,
  39. "FROM" => Token::From,
  40. _ => Token::Keyword(s.to_string()),
  41. }
  42. }
  43. }
  44.  
  45.  
  46. trait Parser {
  47. fn parse_sql(&self, sql: Tokens) -> Result<Vec<Statement>> {
  48. let mut peekable = sql.peekable();
  49.  
  50. if let Some(token) = peekable.peek() {
  51. match token {
  52. Token::Select => return Ok(vec![self.parse_query(&mut peekable)?]),
  53. _ => unimplemented!(),
  54. };
  55. }
  56.  
  57. Err(ParserError)
  58. }
  59.  
  60. fn parse_query(&self, sql: &mut Peekable<Tokens>) -> Result<Statement> {
  61. let body = self.parse_select(sql)?;
  62.  
  63. Ok(Statement(body))
  64. }
  65.  
  66. fn parse_select(&self, sql: &mut Peekable<Tokens>) -> Result<SqlSetExpr> {
  67. if let Some(token) = sql.peek() {
  68. return match token {
  69. Token::Select => Ok(SqlSetExpr::Select),
  70. Token::LParen => Ok(SqlSetExpr::Query),
  71. Token::Values => Ok(SqlSetExpr::Values),
  72. _ => panic!()
  73. };
  74. }
  75.  
  76. Err(ParserError)
  77. }
  78. }
  79.  
  80. struct BaseParser;
  81. impl Parser for BaseParser {}
  82.  
  83. fn parse<S: Into<String>>(parser: Box<dyn Parser>, sql: S) -> Result<Vec<Statement>> {
  84. Ok(parser.parse_sql(tokenize(sql)?)?)
  85. }
  86.  
  87. fn tokenize<S: Into<String>>(sql: S) -> Result<Tokens> {
  88. // THIS IS A TOY EXAMPLE.
  89.  
  90. let tokens: Vec<Token> = sql
  91. .into()
  92. .as_str()
  93. .split(" ")
  94. .map(|s| s.into())
  95. .collect();
  96.  
  97. Ok(Box::new(tokens.into_iter()))
  98. }
  99.  
  100. fn main() {
  101. println!("{:?}", parse(Box::new(BaseParser), "SELECT * FROM BLAH"));
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement