arithmetic-parser

Crates.ioarithmetic-parser
lib.rsarithmetic-parser
version0.4.0-beta.1
sourcesrc
created_at2020-06-01 20:08:55.458385
updated_at2024-09-22 19:19:01.788505
descriptionParser for arithmetic expressions with flexible literals and type annotations.
homepage
repositoryhttps://github.com/slowli/arithmetic-parser
max_upload_size
id248800
size241,410
Alex Ostrovski (slowli)

documentation

README

Flexible Arithmetic Parser

Build Status License: MIT OR Apache-2.0 rust 1.70+ required no_std supported

Links: Docs.rs crate docs (master)

A versatile parser for arithmetic expressions which allows customizing literal definitions, type annotations and several other aspects of parsing.

Usage

Add this to your Crate.toml:

[dependencies]
arithmetic-parser = "0.4.0-beta.1"

The parser is overall similar to Rust. It supports variables, literals, comments, arithmetic and boolean operations, parentheses, function calls, tuples and tuple destructuring, function definitions, blocks, methods, and type annotations. In other words, the parser forms a foundation of a minimalistic scripting language, while leaving certain aspects up to user (most of all, specification of literals).

See the crate docs for more details on the supported syntax features.

Code sample

Here is an example of code parsed with the grammar with real-valued literals and the only supported type Num:

// This is a comment.
x = 1 + 2.5 * 3 + sin(a^3 / b^2);

// Function declarations have syntax similar to Rust closures.
some_function = |x| {
    r = min(rand(), 0.5);
    r * x
};

// Objects are similar to JavaScript, except they require
// a preceding hash `#`, like in Rhai (https://rhai.rs/).
other_function = |a, b: Num| #{ sum: a + b, diff: a - b };

// Object destructuring is supported as well.
{ sum, diff: Num } = other_function(
    x,
    // Blocks are supported and have a similar syntax to Rust.
    some_function({ x = x - 0.5; x }),
);

// Tuples have syntax similar to Rust (besides spread syntax
// in destructuring, which is similar to one in JavaScript).
(x, ...tail) = (1, 2).map(some_function);

Implementation details

The parser is based on the nom crate. The core trait of the library, Grammar, is designed in such a way that switching optional features should not induce run-time overhead; the unused parsing code paths should be removed during compilation.

See also

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in arithmetic-parser by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Commit count: 790

cargo fmt