file = { SOI ~ (ows ~ file_item)* ~ ows ~ EOI }
file_item = { import | module }
module = { "mod" ~ mws ~ identifier ~ ows ~ "{" ~ (ows ~ module_item)* ~ ows ~ "}" }
module_item = { structure | enumerator | function }
structure = { structure_header ~ mws ~ structure_fields }
structure_header = { (visibility ~ mws)? ~ path_struct }
structure_fields = { "{" ~ ows ~ (structure_field ~ ows ~ ("," ~ ows ~ structure_field)* ~ ows ~ ("," ~ ows)?)? ~ "}" }
structure_field = { (visibility ~ mws)? ~ identifier ~ ows ~ ":" ~ (ows ~ path_module)? ~ ows ~ path_type }
enumerator = { enumerator_header ~ mws ~ enumerator_variants }
enumerator_header = { (visibility ~ mws)? ~ path_enum }
enumerator_variants = { "{" ~ ows ~ (enumerator_variant ~ ows ~ ("," ~ ows ~ enumerator_variant)* ~ ows ~ ("," ~ ows)?)? ~ "}" }
enumerator_variant = { identifier ~ (ows ~ structure_fields)? }
function = { function_header ~ ows ~ function_parameters ~ ows ~ "->" ~ ows ~ function_parameters ~ ows ~ scope }
function_header = { (visibility ~ mws)? ~ (path_type ~ mws)? ~ path_function }
function_parameters = { "(" ~ ows ~ (function_parameter ~ ows ~ ("," ~ ows ~ function_parameter)* ~ ows ~ ("," ~ ows)?)? ~ ")" }
function_parameter = { identifier ~ ows ~ ":" ~ (ows ~ path_module)? ~ ows ~ path_type }
import = { "import" ~ mws ~ literal_string ~ ows ~ ";" }
scope = { "{" ~ (ows ~ operation)* ~ ows ~ "}" }
operation = { push_literal | stack_drop | make_register | drop_register | push_from_register | pop_to_register | call_function | branch_scope | loop_scope | scope | pop_scope }
push_literal = { "literal" ~ mws ~ literal ~ ows ~ ";" }
stack_drop = { "stack" ~ mws ~ "drop" ~ ows ~ ";" }
make_register = { "make" ~ mws ~ "register" ~ mws ~ (path_module ~ mws)? ~ path_type ~ ows ~ ";" }
drop_register = { "drop" ~ mws ~ "register" ~ mws ~ index ~ ows ~ ";" }
push_from_register = { "push" ~ mws ~ "register" ~ mws ~ index ~ ows ~ ";" }
pop_to_register = { "pop" ~ mws ~ "register" ~ mws ~ index ~ ows ~ ";" }
call_function = { "call" ~ mws ~ (visibility ~ mws)? ~ (path_module ~ mws)? ~ (path_type ~ mws)? ~ path_function ~ ows ~ ";" }
branch_scope = { "if" ~ ows ~ scope ~ (ows ~ "else" ~ ows ~ scope)? }
loop_scope = { "loop" ~ ows ~ scope }
pop_scope = { "pop" ~ ows ~ "scope" ~ ows ~ ";" }
visibility = { visibility_public | visibility_internal | visibility_private }
visibility_public = { "public" }
visibility_internal = { "internal" }
visibility_private = { "private" }
path_module = { "mod" ~ mws ~ identifier }
path_type = { path_struct | path_enum }
path_struct = { "struct" ~ mws ~ identifier }
path_enum = { "enum" ~ mws ~ identifier }
path_function = { "fn" ~ mws ~ identifier }
literal = { literal_unit | literal_bool_true | literal_bool_false | literal_i8 | literal_i16 | literal_i32 | literal_i64 | literal_i128 | literal_isize | literal_u8 | literal_u16 | literal_u32 | literal_u64 | literal_u128 | literal_usize | literal_f32 | literal_f64 | literal_char | literal_string }
literal_unit = { "unit" }
literal_bool_true = { "true" }
literal_bool_false = { "false" }
literal_i8 = { (hex | binary | integer) ~ ows ~ "i8" }
literal_i16 = { (hex | binary | integer) ~ ows ~ "i16" }
literal_i32 = { (hex | binary | integer) ~ ows ~ "i32" }
literal_i64 = { (hex | binary | integer) ~ ows ~ "i64" }
literal_i128 = { (hex | binary | integer) ~ ows ~ "i128" }
literal_isize = { (hex | binary | integer) ~ ows ~ "isize" }
literal_u8 = { (hex | binary | index) ~ ows ~ "u8" }
literal_u16 = { (hex | binary | index) ~ ows ~ "u16" }
literal_u32 = { (hex | binary | index) ~ ows ~ "u32" }
literal_u64 = { (hex | binary | index) ~ ows ~ "u64" }
literal_u128 = { (hex | binary | index) ~ ows ~ "u128" }
literal_usize = { (hex | binary | index) ~ ows ~ "usize" }
literal_f32 = { float ~ ows ~ "f32" }
literal_f64 = { float ~ ows ~ "f64" }
literal_char = { "\'" ~ char_character ~ "\'" }
char_character = { !("\'" | "\\") ~ character }
literal_string = { "\"" ~ string_inner ~ "\"" }
string_inner = @{ string_character* }
string_character = { !("\"" | "\\") ~ character }
character = { ANY | "\\" ~ ("\"" | "\\" | "/" | "b" | "f" | "n" | "r" | "t") | "\\" ~ ("u" ~ ASCII_HEX_DIGIT{4}) }
index = @{ ASCII_DIGIT+ }
integer = @{ ("+" | "-")? ~ ASCII_DIGIT+ }
float = @{ ("+" | "-")? ~ ASCII_DIGIT+ ~ ("." ~ ASCII_DIGIT+)? }
hex = _{ "0x" ~ hex_inner }
hex_inner = { (ASCII_HEX_DIGIT{2})+ }
binary = _{ "0b" ~ binary_inner }
binary_inner = { ASCII_BIN_DIGIT+ }
COMMENT = _{ comment_block | comment_line }
comment_block = _{ "/*" ~ (!"*/" ~ ANY)* ~ "*/" }
comment_line = _{ "//" ~ (!NEWLINE ~ ANY)* ~ NEWLINE+ }
identifier = @{ XID_START ~ XID_CONTINUE* }
ws = _{ " " | "\t" | "\r" | "\n" }
mws = _{ ws+ }
ows = _{ ws* }