WHITESPACE = _{ " " | "\t" | "\n" }
file = { SOI ~ (k_fn | k_macro | k_const | k_import)* ~ EOI }
endl = { ";" }
ident = @{ char_alpha ~ (char_alphanumeric)* }
char_alpha = @{ ASCII_ALPHA | "_" }
char_alphanumeric = @{ ASCII_ALPHANUMERIC | "_" }
number = @{ (ASCII_DIGIT | "_")* }
string = @{ "\"" ~ string_char* ~ "\"" }
string_char = {
!("\"" | "\\") ~ ANY
| "\\" ~ ("\"" | "\\" | "/" | "b" | "f" | "n" | "r" | "t")
| "\\" ~ ("u" ~ ASCII_HEX_DIGIT{4})
}
block = { "{" ~ (code)* ~ "}" }
code = _{ fn_call | macro_call | block | variable_definition }
variable_definition = _{ k_const }
variable = { macro_variable | ident }
// CALLS
fn_call = { ident ~ fn_call_args ~ endl }
fn_call_args = { "(" ~ (fn_call_arg ~ ",")* ~ fn_call_arg? ~ ")" }
fn_call_arg = _{ variable | number }
macro_call = { ident ~ "!" ~ macro_call_args ~ endl }
macro_call_args = { "(" ~ (macro_call_arg ~ ",")* ~ macro_call_arg? ~ ")" }
macro_call_arg = _{ ident | string | block | number }
// KEYWORDS
k_import = { "import" ~ string ~ endl }
k_const = { "const" ~ ident ~ number ~ endl }
k_fn = { "fn" ~ ident ~ fn_args ~ block }
fn_args = { "(" ~ (fn_arg ~ ",")* ~ fn_arg? ~ ")" }
fn_arg = _{ ident }
k_macro = { "macro" ~ ident ~ macro_args ~ block }
macro_args = { "(" ~ (macro_arg ~ ",")* ~ macro_arg? ~ ")" }
macro_arg = _{ ident ~ ":" ~ macro_arg_type }
macro_arg_type = { "ident" | "text" | "number" | "block" }
macro_variable = { "${" ~ ident ~ "}" }