cypress 0.1.0

Build simple yet expressive parsers
Documentation
  • Coverage
  • 89.9%
    89 out of 99 items documented12 out of 68 items with examples
  • Size
  • Source code size: 81.18 kB This is the summed size of all the files inside the crates.io package for this release.
  • Documentation size: 9.98 MB This is the summed size of all files generated by rustdoc for all configured targets
  • Ø build duration
  • this release: 18s Average build duration of successful builds.
  • all releases: 23s Average build duration of successful builds in releases after 2024-10-23.
  • Links
  • noahcape/cypress
    0 0 0
  • crates.io
  • Dependencies
  • Versions
  • Owners
  • noahcape

Cypress

A parser library inspired by a scaled down derivative of the FParsec combinator library in F#.

I was also inspired by chumsky a very elegant parser combinator library which I have enjoyed using!

The goal of this project was to develop a simple parser combinator library with which people can write and parse expressive languages with ease. It is still a work in progress and there are areas that still need to be cleaned up but I believe that I have achieved my goal.

Example

I have populated /examples with a parser of certain simple languages, along with an evaluator for a select few, to show using this library by example. I hope to populate one or two more sophisticated implementations soon. Below is a simple parser for BrainFuck which seems to be the go to simple language parser that libraries refer to, so here it is.

use cypress::prelude::*;

#[derive(Debug, Clone, PartialEq)]
enum Instruction {
    Left,
    Right,
    Increment,
    Decrement,
    Read,
    Write,
    Loop(Vec<Self>),
}

fn bf_parser<'a>() -> impl Parser<'a, u8, Vec<Instruction>> {
    recursive(|expr| {
        Box::new(
            choice!(
                select! {
                    '<' => Instruction::Left,
                    '>' => Instruction::Right,
                    '+' => Instruction::Increment,
                    '-' => Instruction::Decrement,
                    ',' => Instruction::Read,
                    '.' => Instruction::Write,
                },
                expr.between(just('['), just(']'))
                    .map(|expr| Instruction::Loop(expr))
            )
            .many(),
        )
    })
    // Current way to go until the end of file
    .then(any().not())
    .map(|(bf, _)| bf);
}

let input = b"+++++[>>+<<-]".into_input();

// parse bf input
bf_parser.parse(input);

Note

This is my first published project so if you have thoughts please feel free to open an issue a PR with ideas and fixes!

License

cypress is licensed under the BSD 3 license (see LICENSE in the main repository).