glicol_parser 0.13.1

Parser for Glicol language.
Documentation
block = ${ SOI ~ ("\n"|WHITESPACE)* ~ ( (line|comment) ~ WHITESPACE* ~ ";"? ~ WHITESPACE* ~ ("\n" ~ WHITESPACE*)* )* ~ EOI}
comment = _{ "//" ~ (!NEWLINE ~ ANY)* ~ NEWLINE* ~ !NEWLINE}
line = ${ reference ~ WHITESPACE* ~ ":" ~ WHITESPACE* ~ chain}
chain = ${ node ~ (WHITESPACE* ~ "\n"? ~ WHITESPACE* ~ ">>" ~ WHITESPACE* ~ node)*  }

node = ${ (reverb|arrange|psampler|mix|seq|choose|mul|add|sin|saw|squ|tri|pan|speed|noise|onepole|
sp|constsig|lpf|rhpf|onepole|imp|delayn|delayms|envperc|apfmsgain|plate|sendpass|
get|bd|sn|hh|expr|eval|point_node|meta|sawsynth|squsynth|trisynth|balance|adc|pattern_synth|msgsynth|adsr) }

point_node = ${ points ~ws*~(math_expression)? ~ws*~(is_looping)? }
points = ${ "[" ~ ws*~ point* ~ ws* ~"]"  }
math_expression = ${  ("/"|"*") ~ ws*~ (number | ("("~bar~")")) }
is_looping = ${"!"}

point = ${(time~ws*~"=>"~ws*~number ~ws*) }
time = ${
	(bar | number ) ~ (ws*~ sign ~ ws* ~ (ms|second))?
}

bar = ${ integer ~ ws* ~ "/" ~ ws* ~ integer }
sign = ${("+"|"-")}
ms = ${number ~ "_" ~ "ms" }
second = ${number ~ "_" ~ "s" }

psampler = ${"psampler" ~ WHITESPACE+ ~ (pattern|event)}
msgsynth = ${("msgsynth"|"msg_synth") ~ (WHITESPACE+ ~ !node_name ~ symbol) ~ (WHITESPACE+ ~ !node_name ~ number) ~ (WHITESPACE+ ~ !node_name ~ number)}
pattern_synth = ${("psynth"|"p_synth"|"pattern_synth") ~ WHITESPACE+ ~ code ~ (WHITESPACE+ ~ !node_name ~ number)? }
adc = ${"adc" ~ WHITESPACE+ ~ !node_name ~ (number ) }

expr = ${ ("expr") ~ ws+ ~ code}

eval = ${ ("eval") ~ ws+ ~ "`" ~ eval_content ~ "`"}
eval_content = ${
    (ws* ~ eval_sentence~ ws*)* ~ return
}
return = @{ value_char* }
eval_sentence = ${ assign_to ~ ws* ~ ":=" ~ ws* ~ assign_value ~ ws* ~ ";" }
assign_to = ${ var }
assign_value = @{ value_char* }
value_char = { !(";"|"`") ~ valid_token }
valid_token = {var|" "|"\n"|"%"|"+"|"-"|"*"|"/"|"^"|"("|")"|"["|"]"|">="|"<="|"=="|"!="|">"|"<"|"true"|"false"|"&"|"."|ASCII_DIGIT }
var = _{ ASCII_ALPHA_LOWER+ ~ ("_" | ASCII_ALPHA_LOWER | ASCII_DIGIT )* }

meta = ${ ("meta"|"script") ~ WHITESPACE+ ~ code}
code = ${ "`" ~ inner ~ "`" }
inner = @{ char* }
char = {
    !("`" | "\\") ~ ANY
    | "\\" ~ ("\"" | "\\" | "/" | "b" | "f" | "n" | "r" | "t")
    | "\\" ~ ("u" ~ ASCII_HEX_DIGIT{4})
}
arrange = ${ "arrange" ~ WHITESPACE+ ~ reference ~ WHITESPACE+ ~ number ~ (WHITESPACE+ ~ reference ~ WHITESPACE+ ~ number)*}
// arrangement = ${ reference ~ WHITESPACE+ ~ number }
reverb = ${"reverb" ~ WHITESPACE+ ~ !(node_name | reference) ~ number ~ WHITESPACE+ ~ !(node_name | reference ) ~ number  ~ WHITESPACE+ ~ !(node_name | reference ) ~ number  ~ WHITESPACE+ ~ !(node_name | reference ) ~ number  ~ WHITESPACE+ ~ !(node_name | reference ) ~ number  }
balance = ${ "balance" ~ WHITESPACE+ ~ reference ~ WHITESPACE+ ~ reference}
get = ${ ("get" ~ WHITESPACE+)? ~ !(node_name) ~ reference}
sendpass = ${ "sendpass" ~ WHITESPACE+ ~ reference ~ (WHITESPACE+ ~ reference)*}
plate = ${"plate" ~ WHITESPACE+ ~ !(node_name | reference) ~ number}
envperc = ${"envperc" ~ WHITESPACE+ ~ !(node_name | reference) ~ number ~ WHITESPACE+ ~ !(node_name | reference ) ~ number  }
delayn = ${"delayn" ~ WHITESPACE+ ~ !node_name ~ (number | reference) }
delayms = ${"delayms" ~ WHITESPACE+ ~ !node_name ~ (number | reference) }
seq = ${ "seq" ~ WHITESPACE+ ~ compound_notes }
adsr = ${"adsr" ~ WHITESPACE+ ~ !node_name ~ (number ) ~ WHITESPACE+ ~ !node_name ~ (number ) ~ WHITESPACE+ ~ !node_name ~ (number ) ~ WHITESPACE+ ~ !node_name ~ (number )  }
choose = ${ "choose" ~ WHITESPACE+ ~ integer ~ (WHITESPACE+ ~ integer)*}
mix = ${ "mix" ~ WHITESPACE+ ~ reference ~ (WHITESPACE+ ~ reference)*}
apfmsgain = ${ ("apfgain" | "apfmsgain") ~ WHITESPACE+ ~ !node_name ~ (number | reference) ~ WHITESPACE+ ~ !(node_name | reference ) ~ number  }
lpf = ${"lpf" ~ WHITESPACE+ ~ !node_name ~ (number | reference | pattern | event ) ~ WHITESPACE+ ~ !(node_name | reference ) ~ number  }
rhpf = ${("rhpf"|"hpf") ~ WHITESPACE+ ~ !node_name ~ (number | reference) ~ WHITESPACE+ ~ !(node_name | reference ) ~ number  }
mul = ${"mul" ~ WHITESPACE+ ~ !node_name ~ (number | reference ) }
imp = ${"imp" ~ WHITESPACE+ ~ !node_name ~ (number ) }
bd = ${"bd" ~ WHITESPACE+ ~ !node_name ~ (number ) }
sn = ${"sn" ~ WHITESPACE+ ~ !node_name ~ (number ) }
hh = ${"hh" ~ WHITESPACE+ ~ !node_name ~ (number ) }
sawsynth = ${"sawsynth" ~ WHITESPACE+ ~ !(node_name | reference) ~ number ~ WHITESPACE+ ~ !(node_name | reference) ~ number }
squsynth = ${"squsynth" ~ WHITESPACE+ ~ !(node_name | reference) ~ number ~ WHITESPACE+ ~ !(node_name | reference) ~ number }
trisynth = ${"trisynth" ~ WHITESPACE+ ~ !(node_name | reference) ~ number ~ WHITESPACE+ ~ !(node_name | reference) ~ number }
add = ${"add" ~ WHITESPACE+ ~ !node_name ~ (number | reference) }
sin = ${"sin" ~ WHITESPACE+ ~ !node_name ~ ( number | reference) }
saw = ${"saw" ~ WHITESPACE+ ~ !node_name ~ (number | reference) }
squ = ${"squ" ~ WHITESPACE+ ~ !node_name ~ (number | reference) }
tri = ${"tri" ~ WHITESPACE+ ~ !node_name ~ (number | reference) }
pan = ${"pan" ~ WHITESPACE+ ~ !node_name ~ (number | reference) }
constsig = ${(("sig"|"constsig") ~ WHITESPACE+ ) ~ !node_name ~ ( number | pattern | event ) }
onepole = ${"onepole" ~ WHITESPACE+ ~ !node_name ~ ( number | reference) }

// single float
speed = ${"speed" ~ WHITESPACE+ ~ number}
noise = ${("noiz"|"noise") ~ WHITESPACE+ ~ number}
sp = ${("sp"|"sampler") ~ WHITESPACE+ ~ !( node_name | reference | number ) ~ symbol }
// paras = ${  float | symbol | seq | reference}

event = ${ "\"" ~ pattern_event_body ~ "\""}
pattern = ${ "\"" ~ pattern_event_body ~ "\"" ~ "(" ~ number? ~ ")"}
pattern_event_body = ${ WHITESPACE* ~value_time ~ (WHITESPACE+ ~ value_time)* }
value_time = ${(number|symbol) ~ "@" ~ (number)}

number = ${ float | integer}
float = ${ (("+" | "-")? ~ ASCII_DIGIT+) ~ "." ~ ASCII_DIGIT* ~ (^"e" ~ integer)? }
symbol = ${ ("'"~ (ASCII_ALPHANUMERIC | "_" | "-")+ ~ "'") | ("\\" ~ (ASCII_ALPHANUMERIC | "_"|"-")+)  }

compound_notes = @{ compound ~ (WHITESPACE+ ~ compound)*}
compound = ${ note+ }
note = ${ integer | rest | note_ref }
note_ref = ${ "~" ~  ASCII_ALPHA_LOWER }
reference = ${ ("~"|"_")? ~ ASCII_ALPHA_LOWER+ ~ ("_" | ASCII_ALPHA_LOWER | ASCII_DIGIT )* ~ loose_match? }
loose_match = ${".."}
rest = ${ "_" }
integer = ${ ("+" | "-")? ~(ASCII_DIGIT)+ ~ !"." }
WHITESPACE = _{" "|","|"|"|"\t"}
ws = _{" "|","|"|"|"\t"|"\n"}

node_name = ${"reverb"|"arrange"|"adsr"|"sig"|"psampler"|"synth"|"msgsynth"|"psynth"|"p_synth"|"pattern_synth"|
"bd"|"sn"|"hh"|"squsynth"|"trisynth"|"seq"|"speed"|"choose"|"mul"|"add"|
"linrange"|"apfdecay"|"delayn"|"delaymod"|"expr"|"eval"|
"sin"|"squ"|"imp"|"envperc"|"sampler"|"noiz"|"lpf"|"plate"|"onepole"|
"hpf"|"pha"|"buf"|"state"|"freeverb"|"pan"|"delay"|"apfgain"|"comb"|"mix"|"monosum"|
"const_sig"|"constsig"|"*"|"sp"|"spd"|"tri"|"noise"|"amplfo"|"balance"|"rlpf"|"rhpf"|"kick"|"ks"|
"pha"|"shape"|"sawsynth"|"saw"|"script"|"closure"| "r" | "apfmsgain" |"sendpass"|"mix"|"sum"|"meta"}