diff options
Diffstat (limited to 'lib/IRC/Client')
-rw-r--r-- | lib/IRC/Client/Grammar.pm6 | 21 | ||||
-rw-r--r-- | lib/IRC/Client/Grammar/Actions.pm6 | 31 |
2 files changed, 52 insertions, 0 deletions
diff --git a/lib/IRC/Client/Grammar.pm6 b/lib/IRC/Client/Grammar.pm6 new file mode 100644 index 0000000..255528a --- /dev/null +++ b/lib/IRC/Client/Grammar.pm6 @@ -0,0 +1,21 @@ +unit grammar IRC::Client::Grammar; +token TOP { <message>+ <leftovers> } +token leftovers { \N* } +token SPACE { ' '+ } +token message { [':' <prefix> <SPACE> ]? <command> <params> \n } + token prefix { + [ <servername> || <nick> ['!' <user>]? ['@' <host>]? ] + <before <SPACE>> + } + token servername { <host> } + token nick { <letter> [ <letter> | <number> | <special> ]* } + token user { <-[\ \x0\r\n]>+? <before [<SPACE> | '@']>} + token host { <-[\s!@]>+ } + token command { <letter>+ | <number>**3 } + token params { <SPACE>* [ ':' <trailing> | <middle> <params> ]? } + token middle { <-[:\ \x0\r\n]> <-[\ \x0\r\n]>* } + token trailing { <-[\x0\r\n]>* } + + token letter { <[a..zA..Z]> } + token number { <[0..9]> } + token special { <[-_\[\]\\`^{}]> } diff --git a/lib/IRC/Client/Grammar/Actions.pm6 b/lib/IRC/Client/Grammar/Actions.pm6 new file mode 100644 index 0000000..74ae4e8 --- /dev/null +++ b/lib/IRC/Client/Grammar/Actions.pm6 @@ -0,0 +1,31 @@ +unit class IRC::Client::Grammar::Actions; + +method TOP ($/) { $/.make: ($<message>ยป.made, $<left-overs>) } +method left-overs ($/) { + $/.made: $/.defined ?? !$/ !! ''; +} + +method message ($/) { + my $pref = $/<prefix>; + my %args = command => ~$/<command>; + for qw/nick user host/ { + $pref{$_}.defined or next; + %args<who>{$_} = $pref{$_}.Str; + } + %args<who><host> = ~$pref<servername> if $pref<servername>.defined; + + my $p = $/<params>; + + for ^100 { # bail out after 100 iterations; we're stuck + if ( $p<middle>.defined ) { + %args<params>.append: ~$p<middle>; + } + if ( $p<trailing>.defined ) { + %args<params>.append: ~$p<trailing>; + last; + } + $p = $p<params>; + } + + $/.make: %args; +} |