An enum_dispatch based pest parser
A procedural macro for generating pest-based parsers with integrated enum_dispatch support, enabling type-safe static dispatch of parsing rules.
Features
- 🚀 Automatic Parser Generation - Convert pest grammar files into executable parsers
- 🧩 Rule-specific Structs - Generate zero-sized types for each grammar rule
- ⚡ Static Dispatch - Leverage
enum_dispatchfor efficient method resolution - 🔧 Trait-based Interface - Unified API across all parsing rules
Usage
-
Add dependencies to
Cargo.toml:[] = { = "2.5", = ["derive"] } = "0.3" = { = "0.1" } # This crate -
Define a trait interface for parser rules
-
Apply the
#[pest_parser]attribute to a struct
Example
use Result;
use enum_dispatch;
use pest_parser;
use Parser;
// Define parser trait interface
// Generate parser implementation
;
// Implement trait for individual rules
;
// Usage example
Implementation Notes
Code Generation Phases
- Base Parser Generation: Uses
pest_generatorto create initial parsing code - Struct Generation:
- Extracts
enum Ruledefinition from generated code - Creates unit structs for each variant (e.g.,
struct Statement;)
- Extracts
- Dispatch Integration:
- Inserts
#[enum_dispatch]attribute onenum Rule - Modifies pattern matching to handle struct wrappers
- Adjusts rule instantiation syntax
- Inserts
Safety & Compatibility
- pest Version Locking:
- Tightly coupled with pest's code generation output
- Tested with pest 2.5.7 - may break with newer versions
- Fragile Regex Modifications:
- Uses regular expressions for code transformation
- May fail with unusual formatting or comments
- Trait Implementation:
- Users MUST manually implement the trait for generated structs
- Structs are public and reside in root module
Debugging Tips
- Inspect generated code in
pest_parserusing:println!; // Add temporary debug output - Verify
enum Ruleextraction boundaries - Check regex replacements for rule wrapping