aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZoffix Znet <cpan@zoffix.com>2015-12-05 15:42:25 -0500
committerZoffix Znet <cpan@zoffix.com>2015-12-05 15:42:25 -0500
commit976aaa5e7caa5506ead757bb511207462526cb26 (patch)
tree73ec88aea8cfdab7ed830c950052fba3c90a2fc9
parentccbd5ff10ce1fa1a2025a540635bc1c939484098 (diff)
Wrote working grammar
-rw-r--r--lib/IRC/Grammar.pm638
-rw-r--r--test.p661
2 files changed, 48 insertions, 51 deletions
diff --git a/lib/IRC/Grammar.pm6 b/lib/IRC/Grammar.pm6
index 2013b9b..46d71cc 100644
--- a/lib/IRC/Grammar.pm6
+++ b/lib/IRC/Grammar.pm6
@@ -1,24 +1,24 @@
# 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 { <[-\[\]\\`^{}]> }
+token TOP { <message> }
+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 { <-[\ \0\r\n]>+? <before [<SPACE> | '@']>}
+ token host { <-[\s!@]>+ }
+ token command { <letter>+ | <number>**3 }
+ token params { <SPACE>* [ ':' <trailing> | <middle> <params> ]? }
+ token middle { <-[:\ \0\r\n]> <-[\ \0\r\n]>* }
+ token trailing { <-[\0\r\n]>* }
+
+ token letter { <[a..zA..Z]> }
+ token number { <[0..9]> }
+ token special { <[-\[\]\\`^{}]> }
# unit class IRC::Grammar::Actions:ver<1.001001>;
# method TOP ($/) { $/.make: $<message>».made }
diff --git a/test.p6 b/test.p6
index a1f5062..4da2d44 100644
--- a/test.p6
+++ b/test.p6
@@ -1,37 +1,34 @@
use v6;
-# use Grammar::Tracer;
grammar IRC::Grammar:ver<1.001001> {
- token TOP { [ <message> \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 { <host> }
- token host { \S+ }# see RFC 952 [DNS:4] for 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 { <[-\[\]\\`^{}]> }
-}
+ token TOP { <message> }
+ 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 { <-[\ \0\r\n]>+? <before [<SPACE> | '@']>}
+ token host { <-[\s!@]>+ }
+ token command { <letter>+ | <number>**3 }
+ token params { <SPACE>* [ ':' <trailing> | <middle> <params> ]? }
+ token middle { <-[:\ \0\r\n]> <-[\ \0\r\n]>* }
+ token trailing { <-[\0\r\n]>* }
-class IRC::Grammar::Actions {
- # method class ($/) { $/.make: ~$/ }
- # method rules ($/) { $/.make: ~$/ }
- # method pair ($/) { $/.make: $<class>.made => $<rules>.made }
- # method command ($/) { $/.make: $<command> }
- method message ($/) { $/.make: 42 }
- method TOP ($/) { $/.make: $<message>».made; } #$<message>».made }
- # }
+ token letter { <[a..zA..Z]> }
+ token number { <[0..9]> }
+ token special { <[-\[\]\\`^{}]> }
}
-my $res = IRC::Grammar.parse(":verne.freenode.net 372 Perl6IRC :- running for their sustained support.\r\n", :actions(IRC::Grammar::Actions)).made;
-say $res;
-# say $res<command>;
+my @messages = (
+ ":verne.freenode.net 372 Perl6IRC :- running for their sustained support.\r\n",
+ ":Perl6IRC MODE Perl6IRC :+i\r\n",
+ ":Perl6IRC!~Perl6IRC@static-67-226-172-41.ptr.terago.net JOIN #perl6bot\r\n",
+ ":verne.freenode.net MODE #perl6bot +ns\r\n",
+ ":verne.freenode.net 353 Perl6IRC @ #perl6bot :@Perl6IRC\r\n",
+ ":ZoffixW!~ZoffixW@unaffiliated/zoffix JOIN #perl6bot\r\n",
+ ":ZoffixW!~ZoffixW@unaffiliated/zoffix PRIVMSG #perl6bot :test\r\n",
+);
+say so IRC::Grammar.parse(@messages[$_]) for 0..@messages.elems-1;
+# say IRC::Grammar.parse(":verne.freenode.net 372 Perl6IRC :- running for their sustained support.\r\n");