mirror of
https://github.com/dredozubov/polyrhythmix.git
synced 2024-11-22 11:57:43 +00:00
Trying to make nom compile
This commit is contained in:
commit
e7a933b837
7 changed files with 162 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/target
|
32
Cargo.lock
generated
Normal file
32
Cargo.lock
generated
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "memchr"
|
||||||
|
version = "2.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "minimal-lexical"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nom"
|
||||||
|
version = "7.1.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
"minimal-lexical",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "poly"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"nom",
|
||||||
|
]
|
13
Cargo.toml
Normal file
13
Cargo.toml
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
[package]
|
||||||
|
name = "poly"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "main"
|
||||||
|
path = "src/bin/main.rs"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
nom = "*"
|
5
src/bin/main.rs
Normal file
5
src/bin/main.rs
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
use dsl;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!("Hello, world!");
|
||||||
|
}
|
109
src/dsl/dsl.rs
Normal file
109
src/dsl/dsl.rs
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
use std::str;
|
||||||
|
use std::vec::Vec;
|
||||||
|
|
||||||
|
pub use nom::character::complete::{char, digit1};
|
||||||
|
use nom::{Err, IResult};
|
||||||
|
use nom::branch::alt;
|
||||||
|
use nom::bytes::complete::tag;
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
pub enum BasicLength {
|
||||||
|
Whole,
|
||||||
|
Half,
|
||||||
|
Fourth,
|
||||||
|
Eighth,
|
||||||
|
Sixteenth,
|
||||||
|
ThirtySecond,
|
||||||
|
SixtyFourth
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
pub enum ModdedLength {
|
||||||
|
Plain(BasicLength),
|
||||||
|
Dotted(BasicLength),
|
||||||
|
Triplet(BasicLength)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
pub enum Length {
|
||||||
|
Simple(ModdedLength),
|
||||||
|
Tied(ModdedLength, ModdedLength)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
pub enum Note {
|
||||||
|
Hit(Length),
|
||||||
|
Rest(Length)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
pub struct Group { notes: Vec<Note> }
|
||||||
|
|
||||||
|
fn hit(len: Length, input: &str) -> IResult<&str, Note> {
|
||||||
|
// note that this is really creating a function, the parser for abc
|
||||||
|
// vvvvv
|
||||||
|
// which is then called here, returning an IResult<&str, &str>
|
||||||
|
// vvvvv
|
||||||
|
let (rem, c) = char('x')(input)?;
|
||||||
|
Ok((rem, Note::Hit(len)))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn rest( len: Length, input: &str) -> IResult<&str, Note> {
|
||||||
|
let (rem, c) = char('-')(input)?;
|
||||||
|
Ok((rem, Note::Rest(len)))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn note(input: &str, len: Length) -> IResult<&str, Note> {
|
||||||
|
alt((hit(len), rest(len)))(input)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn length_basic(input: &str) -> IResult<&str, Length> {
|
||||||
|
match map_res(digit1, str::parse)(input) {
|
||||||
|
Ok(r,1) => Ok(r, Whole),
|
||||||
|
Ok(r,2) => Ok(r, Half),
|
||||||
|
Ok(r,4) => Ok(r, Fourth),
|
||||||
|
Ok(r,8) => Ok(r, Eighth),
|
||||||
|
Ok(r,16) => Ok(r, Sixteenth),
|
||||||
|
Ok(r,32) => Ok(r, ThirtySecond),
|
||||||
|
Ok(r, 64) => Ok(r, SixtyFourth),
|
||||||
|
e => e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn tie_length(input: &str) -> IResult<&str, Length> {
|
||||||
|
let (rem, (l1,l2)) = separated_pair(length_basic, char('+'), length_basic)?;
|
||||||
|
Ok(rem, Tie(l1, l2))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn length(input: &str) -> IResult<&str, Length> {
|
||||||
|
let (rem, len) = alt(tie_length, length_basic)(input)?;
|
||||||
|
let (rem2, is_triplet) = char('t')(rem)?;
|
||||||
|
if is_triplet {
|
||||||
|
Triplet(len)
|
||||||
|
} else {
|
||||||
|
leṇ
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_basic_length() {
|
||||||
|
assert_eq!(
|
||||||
|
length("16"),
|
||||||
|
Ok((
|
||||||
|
"",
|
||||||
|
Sixteenth
|
||||||
|
))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
length("8+16"),
|
||||||
|
Ok("", Tie(Eighth, Sixteenth))
|
||||||
|
);
|
||||||
|
assert_eq!(length("8t"), Triplet(Eighth))
|
||||||
|
}
|
||||||
|
|
||||||
|
// “x” hit
|
||||||
|
// “-“ rest
|
||||||
|
// 16x-- => 16th hit and 16th rests
|
||||||
|
|
||||||
|
// - 16x-xx-x-8txxx(3,16+32x-xx)4x-x- => x-xx-x- of 16th, then three hits of 8th triplets, repeat a group of tied 16+32th x-xx three times, then 4th x-x
|
1
src/dsl/mod.rs
Normal file
1
src/dsl/mod.rs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
pub mod dsl;
|
1
src/lib.rs
Normal file
1
src/lib.rs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
pub mod dsl;
|
Loading…
Reference in a new issue