bng syntax rules & poc
This commit is contained in:
parent
903e3ebc64
commit
9ed583e4e4
4 changed files with 138 additions and 0 deletions
|
@ -0,0 +1,42 @@
|
|||
use fasteval::Instruction;
|
||||
|
||||
mod lex;
|
||||
|
||||
pub(super) enum Atom {
|
||||
Note(u8),
|
||||
Rest,
|
||||
StartHere,
|
||||
Modifier(Modifier),
|
||||
QuickModifier(QuickModifier),
|
||||
Wrapper(WrapperKind, Vec<Atom>),
|
||||
EmptyWrapper(WrapperKind),
|
||||
}
|
||||
|
||||
pub(super) enum Modifier {
|
||||
Volume(u8),
|
||||
Octave(u8),
|
||||
Length(u8),
|
||||
Tempo(u16),
|
||||
}
|
||||
|
||||
pub(super) enum QuickModifier {
|
||||
Volume(bool),
|
||||
Octave(bool),
|
||||
Length(bool),
|
||||
Pizz(bool),
|
||||
}
|
||||
|
||||
pub(super) enum WrapperKind {
|
||||
Loop(u8),
|
||||
Tuple,
|
||||
Slope(SlopeModifier, Instruction),
|
||||
Comment,
|
||||
}
|
||||
|
||||
pub(super) enum SlopeModifier {
|
||||
Note,
|
||||
Volume,
|
||||
Octave,
|
||||
Length,
|
||||
Tempo,
|
||||
}
|
50
src/bng/score/lex.rs
Normal file
50
src/bng/score/lex.rs
Normal file
|
@ -0,0 +1,50 @@
|
|||
use super::{Atom, Modifier, WrapperKind};
|
||||
const MORE: bool = true;
|
||||
const LESS: bool = false;
|
||||
const ON: bool = true;
|
||||
const OFF: bool = false;
|
||||
|
||||
struct WrappingTokens;
|
||||
impl WrappingTokens {
|
||||
const PARENTHESES: (char, char) = ('(', ')');
|
||||
const SQUARE_BRACKETS: (char, char) = ('[', ']');
|
||||
const BRACKETS: (char, char) = ('{', '}');
|
||||
const SEMICOLON_COMMA: (char, char) = (';', ',');
|
||||
}
|
||||
|
||||
trait Token<T> {
|
||||
fn token(self) -> T;
|
||||
}
|
||||
|
||||
impl Token<(char, char)> for WrapperKind {
|
||||
fn token(self) -> (char, char) {
|
||||
match self {
|
||||
Self::Loop(_) => WrappingTokens::PARENTHESES,
|
||||
Self::Tuple => WrappingTokens::SQUARE_BRACKETS,
|
||||
Self::Slope(_, _) => WrappingTokens::BRACKETS,
|
||||
WrapperKind::Comment => WrappingTokens::SEMICOLON_COMMA,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Token<char> for Modifier {
|
||||
fn token(self) -> char {
|
||||
match self {
|
||||
Self::Volume(_) => 'v',
|
||||
Self::Octave(_) => 'o',
|
||||
Self::Length(_) => 'l',
|
||||
Self::Tempo(_) => 't',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Token<char> for Atom {
|
||||
fn token(self) -> char {
|
||||
match self {
|
||||
Atom::Rest => '.',
|
||||
Atom::StartHere => ':',
|
||||
Atom::Modifier(_) => '!',
|
||||
_ => unimplemented!("not a singleton"),
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,9 +1,11 @@
|
|||
#![feature(unsize)]
|
||||
use clap::Parser;
|
||||
|
||||
mod bng;
|
||||
mod cli;
|
||||
|
||||
fn main() {
|
||||
// println!("{}", option_env!("TEST").unwrap_or("ok"));
|
||||
let args = cli::BngCli::parse();
|
||||
#[cfg(debug_assertions)]
|
||||
println!("{:?}", args);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue