//
// 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 }