open_pql/pql_parser/
mod.rs1use std::{collections::hash_map::Entry, string::String};
2
3use derive_more::derive::{Display, From};
4use lalrpop_util::{lalrpop_mod, lexer::Token, ParseError};
5use rustc_hash::{FxHashMap, FxHashSet};
6
7use crate::{Loc, LocInfo};
8
9pub mod ast;
10mod error;
11
12pub use error::Error;
13use error::{user_err, ResultE};
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_attr(coverage_nightly, coverage(off))]
37#[cfg(test)]
38pub mod tests {
39 use super::*;
40
41 #[test]
42 fn test_error_invalid_token() {
43 assert_eq!(Error::InvalidToken((0, 1)), parse("?").unwrap_err());
44 }
45
46 #[test]
47 fn test_error_unrecognized_eof() {
48 let res = parse("select").unwrap_err();
49
50 if let Error::UnrecognizedEof(loc, expected) = res {
51 assert_eq!(loc, (6, 7));
52 assert_eq!(expected.len(), 1);
53 } else {
54 panic!("Expected: UnrecognizedEof. Got: {res:?}")
55 }
56 }
57
58 #[test]
59 fn test_error_unrecognized_token() {
60 let res = parse("select ()").unwrap_err();
61
62 if let Error::UnrecognizedToken(loc, expected) = res {
63 assert_eq!(loc, (7, 8));
64 assert_eq!(expected.len(), 1);
65 } else {
66 panic!("Expected: UnrecognizedToken. Got: {res:?}")
67 }
68 }
69}