WHITESPACE = _{ " " | "\t" | NEWLINE}
COMMENT = _{ "/"{2} ~ (LETTER | NUMBER | SPACE_SEPARATOR | PUNCTUATION | SYMBOL | " " | "\t" )+ ~ NEWLINE }
state = @{ASCII_ALPHA+ ~ ASCII_DIGIT*}
value = { "0" | "1" }
movement = { "R" | "L" | "H" | "N" | "D" | "I" }
description = @{ SOI ~ ("/" ~ COMMENT)? }
tape = { "{" ~ value* ~ "}" ~ ";" }
final_state = { "F" ~ "=" ~ "{" ~ state ~ ("," ~ state)* ~ "}" ~ ";" }
initial_state = { "I" ~ "=" ~ "{" ~ state ~ "}" ~ ";" }
function_name = @{ ASCII_ALPHA_LOWER ~ (ASCII_ALPHANUMERIC | "_")* }
composition = { "compose" ~ "=" ~ "{" ~ ((function_name ~ ",")* ~ function_name) ~ "}" ~ ";"}
instruction = { "(" ~ state ~ "," ~ value ~ "," ~ value ~ "," ~ movement ~ "," ~ state ~ ")" ~ ";" }
instructions = { instruction+ }
file = { description ~ tape ~ initial_state ~ final_state ~ composition? ~ instruction+ ~ EOI }