open_pql/pql_parser/
mod.rs1#![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}