open_pql/pql_parser/
mod.rs

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