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 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 ]] join = ":" nobang:sender "!" word:mask " JOIN " word:chan => [[ sender mask chan ]] part = ":" nobang:sender "!" word:mask " PART " word:chan " :" any:msg => [[ sender mask chan msg ]] kick = ":" nobang:sender "!" word:mask " KICK " word:chan " " word:nick " :" any:msg => [[ sender mask chan nick ]] invite = ":" nobang:sender "!" word:mask " INVITE " word:invitee " :" word:chan => [[ sender mask invitee chan ]] parse = pong | privmsg | join | part | kick | invitee ;EBNF