bosh_compiler 0.0.0

Compiler backend for bosh, a Lisp that compiles to Scratch 3.0 project files
Documentation
file = _{ soi ~ list+ ~ eoi }
expr = _{
    ident |
    float |
    int |
    string |
    list
}

list = { "(" ~ expr+ ~ ")" }

ident_escape = _{ "\\" ~ any }
ident_char   = _{ ident_symbol | "-" | "+" | "." | "_" | digit }
ident_symbol = _{ 'A'..'Z' | 'a'..'z' | "?" | "!" | "*" | "/" | "<" | "=" |
                  ">" | ":" | "$" | "$" | "%" | "^" | "&" | "~" | ident_escape }
ident        =  {
    (ident_symbol ~ ident_char*) |
    "-" |
    "+"
}

hex            = _{ '0'..'9' | 'a'..'f' | 'A'..'F' }
predefined_esc =  { "b" | "f" | "n" | "O" | "r" | "t" | "v" | "'" | "\'" | "\\" }
octal_esc      =  { "d" ~ digit ~ digit ~ digit }
byte_esc       =  { "x" ~ hex ~ hex }
unicode_esc    =  { "u" ~ hex ~ hex ~ hex ~ hex }
escape         =  { "\\" ~ (predefined_esc | octal_esc | byte_esc | unicode_esc) }

string_char = _{ (!("\\" | "\"") ~ any)+ }
string      = @{ "\"" ~ (string_char | escape)* ~ "\"" }

sign  =  { "+" | "-" }
digit = _{ '0'..'9' }
exp   =  { ^"e" ~ sign? ~ int }
int   = @{ sign? ~ digit ~ (digit | "_")* }
float = @{
    sign? ~ int ~ "." ~ int? ~ exp? |
    sign? ~ int ~ exp
}

comment    = _{ ";" ~ (!"\n" ~ any)+ }
whitespace = _{ " " | "\t" | "\r" | "\n" }