Expand description
Datalog query parser for Kermit.
Parses queries in the form Head :- Body1, Body2, ... . into a
JoinQuery AST. Built on the winnow parser
combinator library.
§Syntax
- Variables start with an uppercase letter:
X,Name - Atoms (constants) start with a lowercase letter:
alice,edge - Placeholders are the anonymous wildcard
_
path(X, Z) :- edge(X, Y), edge(Y, Z).§Example
use kermit_parser::{JoinQuery, Term};
let query: JoinQuery = "path(X, Z) :- edge(X, Y), edge(Y, Z)."
.parse()
.expect("valid Datalog");
assert_eq!(query.head.name, "path");
assert_eq!(query.head.terms, vec![
Term::Var("X".into()),
Term::Var("Z".into()),
]);
assert_eq!(query.body.len(), 2);
assert_eq!(query.body[0].name, "edge");Parsing returns an error if the input is not a well-formed rule:
use kermit_parser::JoinQuery;
assert!("not a valid query".parse::<JoinQuery>().is_err());Structs§
- Join
Query - A parsed Datalog join query of the form
Head :- Body1, Body2, ... . - Predicate
- A Datalog predicate application, e.g.
edge(X, Y).
Enums§
- Term
- A single term in a Datalog predicate.