Skip to main content

ll_sparql_parser/
lib.rs

1pub mod ast;
2mod parser;
3mod rules;
4pub mod syntax_kind;
5mod syntax_node;
6mod utils;
7
8pub use parser::{guess_operation_type, ParseError, TopEntryPoint};
9use syntax_kind::SyntaxKind;
10pub use syntax_node::*;
11pub use utils::*;
12
13use crate::parser::lex;
14
15pub fn parse_query(input: &str) -> (SyntaxNode, Vec<ParseError>) {
16    let (root, errors) = parser::parse_text(input, parser::TopEntryPoint::QueryUnit);
17    (SyntaxNode::new_root(root), errors)
18}
19
20pub fn parse_update(input: &str) -> (SyntaxNode, Vec<ParseError>) {
21    let (root, errors) = parser::parse_text(input, parser::TopEntryPoint::UpdateUnit);
22    (SyntaxNode::new_root(root), errors)
23}
24
25pub fn parse(input: &str) -> (SyntaxNode, Vec<ParseError>) {
26    match guess_operation_type(input) {
27        Some(TopEntryPoint::QueryUnit) | None => parse_query(input),
28        Some(TopEntryPoint::UpdateUnit) => parse_update(input),
29    }
30}
31
32pub enum QueryType {
33    SelectQuery,
34    ConstructQuery,
35    DescribeQuery,
36    AskQuery,
37}
38
39pub fn guess_query_type(input: &str) -> Option<QueryType> {
40    let tokens = lex(input);
41    tokens.iter().find_map(|(token, _)| match token.kind() {
42        SyntaxKind::SELECT => Some(QueryType::SelectQuery),
43        SyntaxKind::CONSTRUCT => Some(QueryType::ConstructQuery),
44        SyntaxKind::ASK => Some(QueryType::AskQuery),
45        SyntaxKind::DESCRIBE => Some(QueryType::DescribeQuery),
46        _ => None,
47    })
48}
49
50#[cfg(test)]
51mod tests;