grammar ChitChat::Grammar is PCT::Grammar;
token TOP { <.ws> [ | <exprs> | <methods> | '!' ]+ <.ws> [ $ || <.panic: 'Syntax error'> ] {*} }
token whitespace { \h | \v | <comment> }
token ws { <.whitespace>* }
token comment { '"' <-["]>* '"' }
rule methods { '!' <id> 'class'? 'methodsFor:' <string> '!' [<method> '!']? '!' }
rule method { <message> <pragma>? <temps>? <exprs> {*} }
token message { | <id> {*} #= id | <binsel> <.ws> <id> {*} #= binsel | [<keysel> <.ws> <id>]+ {*} #= keysel }
token pragma { '<' <keymsg> '>' }
rule temps { '|' [<id> ]* '|' {*} }
token unit { | <id> {*} #= id | <literal> {*} #= literal | <block> {*} #= block | <arrayconstructor> {*} #= arrayconstructor | '(' <expr> ')' {*} #= expr }
rule unaryexpr { <unit> [<!keysel><id> ]+ {*} }
token primary { | <!unaryexpr> <unit> {*} #= unit | <unaryexpr> {*} #= unaryexpr }
rule exprs { [ | <expr> [ '.' <expr>]* ['.' '^' <expr>]? '.'? | '^' <expr> '.'? ] {*} }
rule expr { [<id> [':='|'_']]* <expr2> {*} }
rule expr2 { | <msgexpr> [ ';' <cascade> ]* {*} #= msgexpr | <primary> {*} #= primary }
token msgexpr { | <binexpr> {*} #= binexpr | <keyexpr> {*} #= keyexpr | <unaryexpr> {*} #= unaryexpr }
token cascade { | <id> {*} #= id | <binmsg> {*} #= binmsg | <keymsg> {*} #= keymsg }
rule binexpr { <primary> <binmsg>+ {*} }
rule binmsg { <binsel> <primary> {*} }
token binsel { <binchar>**{1..2} }
rule keyexpr { <keyexpr2> <keymsg> {*} }
token keyexpr2 { | <!binexpr> <primary> {*} #= primary | <binexpr> {*} #= binexpr }
rule keymsg { [<keysel> <keyexpr2> ]+ {*} }
token keysel { <id> ':' }
rule block { '[' [[':' <id>]* '|']? <temps>? <exprs> ']' {*} }
token arrayconstructor { '{' <exprs> '}' }
token literal { | <number> {*} #= number | <string> {*} #= string | <charconst> {*} #= charconst | <symconst> {*} #= symconst | <arrayconst> {*} #= arrayconst | <binding> {*} #= binding | <eval> {*} #= eval }
token arrayconst { | '#' <array> | '#' <bytearray> }
token bytearray { '[' <number>* ']' }
rule array { '(' <arrayelem>* ')' }
rule arrayelem { | <literal> {*} #= literal | <array> {*} #= array | <bytearray> {*} #= bytearray | <arraysym> {*} #= arraysym }
token number { [<.digit>+ 'r']? '-'? <.alnum>+ ['.' <.alnum>+]? [<exp> '-'? <dig>+]? {*} }
token string { \' $<text>:=<-[']>* \' {*} }
token charconst { '$' . }
token symconst { | '#'<symbol> | '#'<string> }
token arraysym { [<id> | ':']* }
token exp { <[deqs]> }
token binding { '#{' [<id> '.']* <id> '}' }
token symbol { | <id> | <binsel> | <keysel>**{1..2} }
rule eval { '##(' <temps>? <exprs> ')' }
token id { <alpha> [ <alpha> | <digit> ]* {*} }
token binchar { <[+\-*/~,<>=&´?\\%]> }