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) ~ "}" ~ ";"}
initial_params = _{
tape | initial_state | final_state | composition?
}
// Silent rule to accept the initial parameters in any order
// The composition rule is optional
definition = _{
PUSH(initial_params)
~ (
!PEEK_ALL
~ PUSH(initial_params)
){3}
}
instruction = { "(" ~ state ~ "," ~ value ~ "," ~ value ~ "," ~ movement ~ "," ~ state ~ ")" ~ ";" }
instructions = { instruction+ }
file = { description ~ definition ~ instruction* ~ EOI }