aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorZoffix Znet <cpan@zoffix.com>2015-12-05 14:52:45 -0500
committerZoffix Znet <cpan@zoffix.com>2015-12-05 14:52:45 -0500
commitccbd5ff10ce1fa1a2025a540635bc1c939484098 (patch)
treece8afe928d0241332f5c4470ca21a370a9061ad9 /lib
parentf4e9d98cee046fcd70bc3bcca4b2555f38254b28 (diff)
Barely-working grammar
Diffstat (limited to 'lib')
-rw-r--r--lib/IRC/Client.pm624
-rw-r--r--lib/IRC/Grammar.pm639
-rw-r--r--lib/IRC/Grammar/Actions.pm66
3 files changed, 57 insertions, 12 deletions
diff --git a/lib/IRC/Client.pm6 b/lib/IRC/Client.pm6
index ae8f245..4635301 100644
--- a/lib/IRC/Client.pm6
+++ b/lib/IRC/Client.pm6
@@ -1,16 +1,16 @@
use v6;
role IRC::Client::Plugin { ... }
class IRC::Client:ver<1.001001> {
- has Bool $.debug = False;
- has Str $.host = 'localhost';
- has Int $.port where 0 <= $_ <= 65535 = 6667;
- has Str $.nick where 1 <= .chars <= 9 = 'Perl6IRC';
- has Str $.username = 'Perl6IRC';
- has Str $.userhost = 'localhost';
- has Str $.userreal = 'Perl6 IRC Client';
- has Str @.channels = ['#perl6bot'];
- has @.plugins = [];
- has IO::Socket::Async $.sock;
+ has Bool:D $.debug = False;
+ has Str:D $.host = 'localhost';
+ has Int:D $.port where 0 <= $_ <= 65535 = 6667;
+ has Str:D $.nick = 'Perl6IRC';
+ has Str:D $.username = 'Perl6IRC';
+ has Str:D $.userhost = 'localhost';
+ has Str:D $.userreal = 'Perl6 IRC Client';
+ has Str:D @.channels = ['#perl6bot'];
+ has IRC::Client::Plugin @.plugins = [];
+ has IO::Socket::Async $.sock;
method run {
await IO::Socket::Async.connect( $!host, $!port ).then({
@@ -23,8 +23,8 @@ class IRC::Client:ver<1.001001> {
for @!plugins.grep(*.interval);
react {
- whenever $!sock.chars-supply -> $str is copy {
- $str.say;
+ whenever $!sock.Supply -> $str is copy {
+ "[$str]".perl.say;
.msg(self, $str) for @!plugins.grep(so *.msg);
}
}
diff --git a/lib/IRC/Grammar.pm6 b/lib/IRC/Grammar.pm6
new file mode 100644
index 0000000..2013b9b
--- /dev/null
+++ b/lib/IRC/Grammar.pm6
@@ -0,0 +1,39 @@
+# use Grammar::Debugger;
+unit grammar IRC::Grammar:ver<1.001001>;
+token ws { ' ' }
+token TOP { [ <message> \r\n ]* }
+token message { [':' <prefix> ' '+ ]? <command> <params> }
+token prefix { [<servername> | <nick>] [ '!' <user> ]? [ '@' <host> ]? }
+token command { <letter>+ | <number>**3 }
+token params { ' '+ [ ':' <trailing> | <middle> <params> ]? }
+token middle { <-[: \0\r\n]> <-[ \0\r\n]>+ }
+token trailing { <-[\0\r\n]>+ }
+token target { <to> [ ',' <target> ]? }
+token to { <channel> | <user> '@' <servername> | <nick> | <mask> }
+token channel { ['#' | '&'] <chstring> }
+token servername { \S+ } # see RFC 952 [DNS:4] for details on allowed hostnames
+token nick { <letter> [ <letter> | <number> | <special> ]+ }
+token mask { <[#$]> <chstring> }
+token chstring { <-[ \a\0\r\l,]> }
+token user { <-[ \0\r\l]>+ }
+token letter { <[a..zA..Z]> }
+token number { <[0..9]> }
+token special { <[-\[\]\\`^{}]> }
+
+# unit class IRC::Grammar::Actions:ver<1.001001>;
+# method TOP ($/) { $/.make: $<message>».made }
+# method message ($/) { $/.make:
+# prefix => $<prefix> .made,
+# command => $<command>.made,
+# params => $<params .made,
+# }
+# method prefix ($/) { [<servername> | <nick>] [ '!' <user> ]? [ '@' <host> ]? }
+# method command ($/) { <letter>+ | <number>**3 }
+# method params ($/) { ' '+ [ ':' <trailing> | <middle> <params> ]? }
+# method middle ($/) { <-[: \0\r\n]> <-[ \0\r\n]>+ }
+# method trailing ($/) { <-[\0\r\n]> }
+#
+# method class ($/) { $/.make: ~$/ }
+# method rules ($/) { $/.make: ~$/ }
+# method pair ($/) { $/.make: $<class>.made => $<rules>.made }
+# method TOP ($/) { $/.make: $<pair>».made }
diff --git a/lib/IRC/Grammar/Actions.pm6 b/lib/IRC/Grammar/Actions.pm6
new file mode 100644
index 0000000..039f11e
--- /dev/null
+++ b/lib/IRC/Grammar/Actions.pm6
@@ -0,0 +1,6 @@
+class IRC::Grammar::Actions {
+ method class ($/) { $/.make: ~$/ }
+ method rules ($/) { $/.make: ~$/ }
+ method pair ($/) { $/.make: $<class>.made => $<rules>.made }
+ method TOP ($/) { $/.make: $<pair>».made }
+}