TUPLE: msg sender mask chan msg ; C: msg TUPLE: join nick mask chan ; C: join TUPLE: part nick mask chan msg ; C: part TUPLE: kick sender mask chan victim msg ; C: kick TUPLE: invite sender mask invitee chan ; C: invite EBNF: parse nobang = (!("!").)+ => [[ >string ]] word = (!(" ").)+ => [[ >string ]] num = ([0-9])+ => [[ string>number ]] any = (.)* => [[ >string ]] pong = "PING " any:code => [[ "PONG " write code print ignore ]] privmsg = ":" nobang:sender "!" word:mask " PRIVMSG " word:chan " :" any:msg => [[ sender mask chan msg [ >string ] 4 napply ]] join = ":" nobang:sender "!" word:mask " JOIN " word:chan => [[ sender mask chan [ >string ] tri@ ]] part = ":" nobang:sender "!" word:mask " PART " word:chan " :" any:msg => [[ sender mask chan msg [ >string ] 4 napply ]] kick = ":" nobang:sender "!" word:mask " KICK " word:chan " " word:nick " :" any:msg => [[ sender mask chan victim msg [ >string ] 5 napply ]] invite = ":" nobang:sender "!" word:mask " INVITE " word:invitee " :" word:chan => [[ sender mask invitee chan [ >string ] 4 napply ]] parse = pong | privmsg | join | part | kick | invitee ;EBNF