A PDDL 3.1 parser, strongly typed

A PDDL 3.1 parser implementation in Rust based on nom.

GitHub Workflow Status docs.rs Crates.io Crates.io

Crate documentation is available on docs.rs/pddl.

toml [dependencies] pddl = "*"

The domain/problem types can be used independently of the parser; the parser is however enabled by default via the parser crate feature. To disable the parser and its dependencies, use

toml [dependencies] pddl = { version = "*", default-features = false }

Documentation comments are assembled from the PDDL papers and nergmada/planning-wiki.

Usage Example

See tests/briefcase_world.rs for the full example.

```rust use pddl::{Problem, Parser};

pub const BRIEFCASEWORLDPROBLEM: &'static str = r#" (define (problem get-paid) (:domain briefcase-world) (:init (place home) (place office) (object p) (object d) (object b) (at B home) (at P home) (at D home) (in P)) (:goal (and (at B office) (at D office) (at P home))) ) "#;

fn main() { let (, problem) = Problem::parse(BRIEFCASEWORLD_PROBLEM).unwrap();

assert_eq!(problem.name(), &"get-paid".into());
assert_eq!(problem.domain(), &"briefcase-world".into());
assert!(problem.requirements().is_empty());
assert_eq!(problem.init().len(), 9);
assert!(matches! { problem.goal(), pddl::PreGD::And(_) });

} ```

Caveat Emptor

At this point the parser supports all domain and problem definition elements required to fully describe a PDDL 3.1 environment. However, since types and enum variants are named closely to the underlying BNF descriptions (see below), they may be a bit unwieldy to use still.

Supported Elements

Parsers were implemented based on the BNF elements listed in the paper:

"Complete BNF description of PDDL 3.1 (completely corrected)", Daniel L. Kovacs

See ELEMENTS.md for a graph of BNF elements.