sipha-pratt

Pratt parser implementation for operator precedence in sipha.
Overview
sipha-pratt provides the core logic for Pratt parsing, which is used to handle operator precedence and associativity in expressions.
Features
- PrattParser: Trait for parsers that can evaluate Pratt expressions
- Precedence: Type for defining operator precedence levels
- Associativity: Enum for operator associativity (Left, Right, None)
- PrattRuleKind: Enum for different types of Pratt rules
- Rule types: BinaryRule, PrefixRule, PostfixRule, TernaryRule
Quick Start
Add sipha-pratt to your Cargo.toml:
[dependencies]
sipha-pratt = "0.1.1"
Example
use sipha_pratt::{PrattParser, Precedence, Associativity, BinaryRule, PrattRuleKind};
use sipha_core::traits::{TokenKind, RuleId};
use std::collections::HashMap;
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
enum Token { Plus, Star }
impl TokenKind for Token { fn is_trivia(&self) -> bool { false } }
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
enum Rule { Add, Mul }
impl RuleId for Rule {}
struct MyParser {
pratt_rules: HashMap<Token, PrattRuleKind<Token, Rule>>,
}
impl PrattParser<Token, Rule> for MyParser {
fn get_rule(&self, kind: &Token) -> Option<&PrattRuleKind<Token, Rule>> {
self.pratt_rules.get(kind)
}
}
let mut parser = MyParser {
pratt_rules: HashMap::new(),
};
parser.pratt_rules.insert(
Token::Plus,
PrattRuleKind::Binary(BinaryRule::create(Rule::Add, Precedence(10), Associativity::Left)),
);
parser.pratt_rules.insert(
Token::Star,
PrattRuleKind::Binary(BinaryRule::create(Rule::Mul, Precedence(20), Associativity::Left)),
);
License
This project is licensed under the MIT License - see the LICENSE file for details.