open_pql/pql_parser/
mod.rs

1use std::{collections::hash_map::Entry, string::String};
2
3use derive_more::derive::{Display, From};
4use lalrpop_util::{ParseError, lalrpop_mod, lexer::Token};
5use rustc_hash::{FxHashMap, FxHashSet};
6
7use crate::{Loc, LocInfo};
8
9pub mod ast;
10mod error;
11
12pub use error::Error;
13use error::{ResultE, user_err};
14
15type Expected = Vec<String>;
16
17lalrpop_mod!(
18    #[allow(clippy::empty_line_after_outer_attr)]
19    #[allow(clippy::iter_nth_zero)]
20    #[allow(clippy::nursery)]
21    #[allow(clippy::pedantic)]
22    #[allow(clippy::restriction)]
23    #[allow(clippy::useless_conversion)]
24    pub(crate) parser,
25    "/pql_parser/pql.rs"
26);
27
28pub fn parse(src: &str) -> Result<Vec<ast::Stmt<'_>>, Error> {
29    Ok(parser::PQLParser::new().parse(src)?)
30}
31
32pub(super) fn strip_str(s: &str) -> &str {
33    &s[1..s.len() - 1]
34}
35
36#[cfg(test)]
37pub mod tests {
38    use super::*;
39
40    #[test]
41    fn test_error_invalid_token() {
42        assert_eq!(Error::InvalidToken((0, 1)), parse("?").unwrap_err());
43    }
44
45    #[test]
46    fn test_error_unrecognized_eof() {
47        let res = parse("select").unwrap_err();
48
49        if let Error::UnrecognizedEof(loc, expected) = res {
50            assert_eq!(loc, (6, 7));
51            assert_eq!(expected.len(), 1);
52        } else {
53            panic!("Expected: UnrecognizedEof. Got: {res:?}")
54        }
55    }
56
57    #[test]
58    fn test_error_unrecognized_token() {
59        let res = parse("select ()").unwrap_err();
60
61        if let Error::UnrecognizedToken(loc, expected) = res {
62            assert_eq!(loc, (7, 8));
63            assert_eq!(expected.len(), 1);
64        } else {
65            panic!("Expected: UnrecognizedToken. Got: {res:?}")
66        }
67    }
68}