sipha-pratt

Crates.iosipha-pratt
lib.rssipha-pratt
version0.3.0
created_at2025-11-19 17:57:10.542604+00
updated_at2025-11-22 09:50:47.262825+00
descriptionPratt parser for operator precedence parsing in sipha
homepage
repositoryhttps://github.com/NyalephTheCat/sipha
max_upload_size
id1940500
size29,649
Nyaleph (NyalephTheCat)

documentation

README

sipha-pratt

License: MIT Repository Crates.io docs.rs

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.

Commit count: 0

cargo fmt