open_pql/pql_parser/
mod.rs1use 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}