sipha-memo

Crates.iosipha-memo
lib.rssipha-memo
version0.3.0
created_at2025-11-19 17:47:59.865197+00
updated_at2025-11-22 09:50:04.828362+00
descriptionMemoization support for packrat parsing in sipha
homepage
repositoryhttps://github.com/NyalephTheCat/sipha
max_upload_size
id1940489
size23,271
Nyaleph (NyalephTheCat)

documentation

README

sipha-memo

License: MIT Repository Crates.io docs.rs

Memoization support for packrat parsing in sipha.

Overview

sipha-memo provides memoization tables for caching parse results at specific positions, enabling packrat parsing which can handle left-recursive grammars and improve performance for ambiguous grammars.

Features

  • MemoTable: Cache for parse results keyed by (rule_id, position) pairs
  • MemoEntry: Cached parse results (success or failure)
  • Enable/disable memoization at runtime
  • Efficient lookup and storage

Quick Start

Add sipha-memo to your Cargo.toml:

[dependencies]
sipha-memo = "0.1.1"

Example

use sipha_memo::{MemoTable, MemoEntry};
use sipha_core::traits::{TokenKind, RuleId};
use sipha_tree::RawNodeId;

#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
enum Token { A }
impl TokenKind for Token { fn is_trivia(&self) -> bool { false } }

#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
enum Rule { Expr }

let mut memo: MemoTable<Token, Rule, RawNodeId> = MemoTable::new();
memo.store_success(Rule::Expr, 0, RawNodeId(0), 5);

if let Some(entry) = memo.get(Rule::Expr, 0) {
    match entry {
        MemoEntry::Success { node, consumed } => {
            println!("Cached: node {:?}, consumed {} tokens", node, consumed);
        }
        _ => {}
    }
}

License

This project is licensed under the MIT License - see the LICENSE file for details.

Commit count: 0

cargo fmt