intuicio-frontend-assembler 0.53.1

Assembly frontend module for Intuicio scripting platform
Documentation
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* }