leo-input 1.5.3

Input parser of the Leo programming language
Documentation
/// Common

// Declared in common/identifier.rs
identifier = @{ ((!protected_name ~ ASCII_ALPHA) | (protected_name ~ (ASCII_ALPHANUMERIC | "_"))) ~ (ASCII_ALPHANUMERIC | "_")* }
protected_name = {
    "address"
    | "as"
    | "const"
    | "else"
    | "false"
    | type_field
    | type_char
    | "for"
    | "function"
    | type_group
    | "if"
    | "import"
    | "in"
    | "let"
    | main
    | "mut"
    | private
    | public
    | record
    | registers
    | "return"
    | state
    | state_leaf
    | "static"
    | "test"
    | "true"
 }

// Declared in common/line_end.rs
LINE_END = { ";" ~ NEWLINE* }
/// Types

// Declared in types/type_.rs
type_ = { type_tuple | type_array | type_data }

// Declared in types/integer_type.rs
type_integer = {
    type_integer_signed
    | type_integer_unsigned
}

// Declared in types/unsigned_integer_type.rs
type_u8 = { "u8" }
type_u16 = { "u16" }
type_u32 = { "u32" }
type_u64 = { "u64" }
type_u128 = { "u128" }

type_integer_unsigned = {
    type_u8
    | type_u16
    | type_u32
    | type_u64
    | type_u128
}

// Declared in types/signed_integer_type.rs
type_i8 = { "i8" }
type_i16 = { "i16" }
type_i32 = { "i32" }
type_i64 = { "i64" }
type_i128 = { "i128" }

type_integer_signed = {
    type_i8
    | type_i16
    | type_i32
    | type_i64
    | type_i128
}

// Declared in types/char_type.rs
type_char = { "char" }

// Declared in types/field_type.rs
type_field = { "field" }

// Declared in types/group_type.rs
type_group = { "group" }

// Declared in types/boolean_type.rs
type_boolean = { "bool" }

// Declared in types/address_type.rs
type_address = { "address" }

// Declared in types/data_type.rs
type_data = { type_field | type_group | type_boolean | type_address | type_integer | type_char }

// Declared in types/array_type.rs
type_array = { "[" ~ type_ ~ ";" ~ array_dimensions ~ "]" }

// Declared in types/array_dimensions.rs
array_dimensions = {
    dimension_single
    | dimension_multiple
}

// Declared in types/array_dimensions.rs
dimension_single = {
    number_positive
}

// Declared in types/array_dimensions.rs
dimension_multiple = { "(" ~ number_positive ~ ("," ~ number_positive)* ~ ")"}

type_tuple = { "(" ~ NEWLINE* ~ (type_ ~ ("," ~ NEWLINE* ~ type_)+ ~ ","?)? ~ NEWLINE* ~ ")" }

/// Values

// Declared in values/value.rs
value = {
    value_address
    | value_boolean
    | value_field
    | value_group
    | value_char
    | value_integer
    | value_number // must be last as a catch all
}

// Declared in values/number_value.rs
value_number = { number_negative | number_positive }

// Declared in values/number_negative.rs
number_negative = @{ "-" ~ ASCII_DIGIT+ }

// Declared in values/number_positive.rs
number_positive = @{ ASCII_DIGIT+ }

// Decalred in values/char_types.rs
// ANY is equivalent to '\u{00}'..'\u{10FFFF}'
basic_char = { ANY }
escaped_char = @{ "\\" ~ ("\"" | "\'" | "\\" | "/" | "b" | "f" | "n" | "r" | "t") }
hex_char = @{ "\\" ~ "x" ~ ASCII_HEX_DIGIT{2} }
unicode_char = @{ "\\" ~ "u" ~ "{" ~ ASCII_HEX_DIGIT{1, 6} ~ "}" }

char_types = {
    escaped_char
    | unicode_char
    | hex_char
    | basic_char
}

// Declared in values/char_value.rs
value_char = ${ "\'" ~ char_types ~ "\'" }

// Declared in values/integer_value.rs
value_integer = { value_integer_signed | value_integer_unsigned}

// Declared in values/signed_integer_value.rs
value_integer_signed = ${ value_number ~ type_integer_signed }

// Declared in values/unsigned_integer_value.rs
value_integer_unsigned = ${ number_positive ~ type_integer_unsigned }

// Declared in values/boolean_value.rs
value_boolean = { "true" | "false" }

// Declared in values/field_value.rs
value_field = ${ value_number ~ type_field }

// Declared in values/group_value.rs
value_group = ${ group_single_or_tuple ~ type_group }
group_single_or_tuple = {value_number | group_tuple}
group_tuple = !{"(" ~ group_coordinate ~ "," ~ group_coordinate ~ ")"}

// Declared in values/group_coordinate.rs
group_coordinate = {
    value_number
    | sign_high
    | sign_low
    | inferred
}

sign_high = @{"+"}
sign_low = @{"-"}
inferred = @{"_"}

// Declared in values/address.rs
address = @{ "aleo" ~ ASCII_DIGIT ~ (LOWERCASE_LETTER | ASCII_DIGIT){58} }

// Declared in values/address_typed.rs
address_typed = ${ type_address ~ "(" ~ address ~ ")" }

// Declared in values/address_value.rs
value_address = {address | address_typed}

/// Expressions

// Declared in expressions/array_initializer_expression.rs
expression_array_initializer = { "[" ~ expression ~ ";" ~ array_dimensions ~ "]" }

// Declared in expressions/array_inline_expression.rs
expression_array_inline = { "[" ~ NEWLINE* ~ inline_array_inner ~ NEWLINE* ~ "]"}
inline_array_inner = _{ (expression ~ ("," ~ NEWLINE* ~ expression)*)? }

// Declared in expressions/string_expression.rs
expression_string = ${ "\"" ~ (!"\"" ~ char_types)+ ~ "\"" }

// Declared in expressions/expression.rs
expression = {
    value
    | expression_tuple
    | expression_array_inline
    | expression_array_initializer
    | expression_string
}
expression_tuple = { "(" ~ expression ~ ("," ~ expression)+ ~")" }

/// Parameters

// Declared in parameters/parameters.rs
parameter = { identifier ~ ":" ~ type_ }

/// Section

// Declared in sections/section.rs
section = { "["  ~ header ~ "]" ~ NEWLINE+ ~ (definition ~ NEWLINE*)* }

// Declared in sections/main_.rs
main = { "main" }

// Declared in sections/record.rs
record = { "record" }

// Declared in sections/registers.rs
registers = { "registers" }

// Declared in sections/state.rs
state = { "state" }

// Declared in sections/constants.rs
constants = { "constants" }

// Declared in sections/state_leaf.rs
state_leaf = { "state_leaf" }

// Declared in sections/header.rs
header = { main | constants | record | registers | state_leaf | state | identifier }

/// Definitions

// Declared in definition/definition.rs
definition = { parameter ~ "=" ~ expression ~ LINE_END }

/// Table

// Declared in tables/public.rs
public = { "public" }

// Declared in tables/private.rs
private = { "private" }

// Declared in tables/visibility.rs
visibility = { public | private }

// Declared in sections/table.rs
table = {"[[" ~ visibility ~ "]]" ~ NEWLINE+ ~ section*}

/// Utilities

COMMENT = _{ ("/*" ~ (!"*/" ~ ANY)* ~ "*/") | ("//" ~ (!NEWLINE ~ ANY)*) }
WHITESPACE = _{ " " | "\t" ~ (NEWLINE)* }

/// Files

// Declared in files/table_or_section.rs
table_or_section = { table | section }

// Declared in files/file.rs
file = { SOI ~ NEWLINE* ~ table_or_section* ~ NEWLINE* ~ EOI }