Skip to content

Instantly share code, notes, and snippets.

@sampersand
Created February 11, 2021 05:35
Show Gist options
  • Save sampersand/34cebd3fa59e7bb489b8b9fee2d3e3df to your computer and use it in GitHub Desktop.
Save sampersand/34cebd3fa59e7bb489b8b9fee2d3e3df to your computer and use it in GitHub Desktop.
grammar Syntax {
rule TOP { <expr> .* }
rule expr { <.ws> [<literal> | <function>] }
token ws { [ <[(){}[\]:\s\n]> | '#' \N* \n? ]* }
proto token literal {*}
token literal:sym<identifier> { <[a..z_]> <[a..z0..9_]>* }
token literal:sym<number> { \d+ }
token literal:sym<string> { '"' .*? '"' | "'" .*? "'" }
token literal:sym<null> { 'N' <.kw-rest> }
token literal:sym<boolean> { (<[TF]>) <.kw-rest> }
token kw-rest { <[A..Z]>* }
proto rule function {*}
rule function:<nullary> { <nullary> }
proto token nullary {*}
token nullary:sym<prompt> { 'P' <.kw-rest> }
token nullary:sym<random> { 'R' <.kw-rest> }
rule function:<unary> { <unary> <expr> }
proto token unary {*}
token unary:sym<eval> { 'E' <.kw-rest> }
token unary:sym<block> { 'B' <.kw-rest> }
token unary:sym<call> { 'C' <.kw-rest> }
token unary:sym<system> { '`' }
token unary:sym<quit> { 'Q' <.kw-rest> }
token unary:sym<not> { '!' }
token unary:sym<length> { 'L' <.kw-rest> }
token unary:sym<output> { 'O' <.kw-rest> }
rule function:<binary> { (<binary>) (<expr>) (<expr>) }
proto token binary {*}
token binary:sym<+> { <sym> }
token binary:sym<-> { <sym> }
token binary:sym<*> { <sym> }
token binary:sym</> { <sym> }
token binary:sym<%> { <sym> }
token binary:sym<^> { <sym> }
token binary:sym<?> { <sym> }
token binary:sym<&> { <sym> }
token binary:sym<|> { <sym> }
token binary:sym<;> { <sym> }
token binary:sym<=> { <sym> }
token binary:sym<< < >> { <sym> }
token binary:sym<< > >> { <sym> }
token binary:sym<while> { 'W' <.kw-rest> }
rule function:<ternary> { <ternary> <expr> <expr> <expr> }
proto token ternary {*}
token ternary:sym<if> { 'I' <.kw-rest> }
token ternary:sym<get> { 'G' <.kw-rest> }
rule function:<quatenary> { <quatenary> <expr> <expr> <expr> <expr> }
proto token quatenary {*}
token quatenary:sym<set> { 'S' <.kw-rest> }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment