kodept-parse 0.3.0

Simple compiler with dependent types support in mind
Documentation
//
// Created by intellij-pest on 2024-07-08
//! Full grammar for the Kodept programming language using PEG
// Author: ITesserakt
//

// FIXME: Do not consume the last newline char
comment = { "//" ~ (!NEWLINE ~ ANY)* ~ NEWLINE? }
multiline_comment = { "/*" ~ (!"*/" ~ ANY)* ~ "*/" }
newline = { "\r\n" | "\n" }
whitespace = { " " | "\t" }
ignore = ${ comment | multiline_comment | newline | whitespace+ }

keyword = ${
    "fun"       |
    "val"       |
    "var"       |
    "match"     |
    "while"     |
    "module"    |
    "extend"    |
    "return"    |
    "\\"        |
    "if"        |
    "elif"      |
    "else"      |
    "abstract"  |
    "trait"     |
    "struct"    |
    "class"     |
    "enum"      |
    "foreign"   |
    "type"      |
    "with"
}

symbol = ${
    ","  |
    ";"  |
    "{"  |
    "}"  |
    "["  |
    "]"  |
    "("  |
    ")"  |
    "_"  |
    "::" |
    ":"
}

identifier = ${ "_"? ~ ('a'..'z' | 'A'..'Z') ~ ("_" | 'a'..'z' | 'A'..'Z' | '0'..'9')* }

bin_lit = ${ ^"0b" ~ (!("0" | "_") ~ ('0'..'1' | "_")+ | '0'..'1') }
oct_lit = ${ ^"0c" ~ (!("0" | "_") ~ ('0'..'7' | "_")+ | '0'..'7') }
hex_lit = ${ ^"0x" ~ (!("0" | "_") ~ ('0'..'9' | 'a'..'f' | 'A'..'F' | "_")+ | '0'..'9' | 'a'..'f' | 'A'..'F') }
flt_lit = ${ ("+" | "-")? ~ whitespace* ~ (
                 (ASCII_DIGIT+ ~ ("." ~ ASCII_DIGIT*)?) |
                 ("." ~ ASCII_DIGIT+)
             ) ~ (^"e" ~ ("+" | "-")? ~ ASCII_DIGIT)? }
chr_lit = ${ "'" ~ (!"'" ~ ANY) ~ "'" }
str_lit = ${ "\"" ~ (!"\"" ~ ANY)* ~ "\"" }

literal = ${
    bin_lit |
    oct_lit |
    hex_lit |
    flt_lit |
    chr_lit |
    str_lit
}

operator = ${
    // Basic
    "."     |
    "=>"    |
    // Math
    "+"     |
    "-"     |
    "**"    |
    "*"     |
    "/"     |
    "%"     |
    // Comparison
    "<=>"       |
    "=="        |
    "="         |
    "!="        |
    ">="        |
    ">"         |
    "<="        |
    "<"         |
    // Logic
    "||"    |
    "&&"    |
    "!"     |
    // Bit
    "|" |
    "&" |
    "^" |
    "~"
}

unknown = ${ ANY }

token = { ignore | keyword | symbol | identifier | literal | operator | unknown }

tokens = { SOI ~ token* ~ EOI }