Skip to content

Instantly share code, notes, and snippets.

@softmoth
Created May 8, 2014 01:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save softmoth/3bc7bd31ca65a5f7b3df to your computer and use it in GitHub Desktop.
Save softmoth/3bc7bd31ca65a5f7b3df to your computer and use it in GitHub Desktop.
Practice w/ Grammar
#! /usr/bin/env perl6
#use Grammar::Tracer;
grammar PandaInfo {
regex TOP { <pkginfo>* { make [$<pkginfo>».made] } }
regex pkginfo { [
| <notfound> { make $<notfound>.made }
|
<name> <descr> <info>* {
my %h = name => ~$<name>.made, descr => ~$<descr>.made;
for $<info>».made {
#say "INFO ", $_.perl;
%h{.key} = .value;
}
make $%h;
}
] }
token notfound {
^^ "Project '" <modname> "' not found" \n
{
make { name => ~$<modname>, state => 'not found' }
}
}
token modname { <-[\s'",]>+ }
token name {
^^ <modname> [ \s+ \( version \s+ (\d+ % '.') \) ]? \n
{
make ~$<modname>
}
}
token descr { ^^ (\N+) \n { make ~$0 } }
token info { [ <x=.depends-on> | <x=.provides> | <x=.general-info> ] { make $<x>.made } }
token depends-on { :i 'depends on: ' <modname>* % ', ' \n { make 'depends on' => [$<modname>».Str] } }
token provides {
:i 'provides: '
(<modname> \t <.modname>)* % ' '
\n
{ make 'provides' => [$0.map: *.<modname>.Str] }
}
token general-info { <field> (\N*) \n { make lc(~$<field>) => ~$0 } }
token field { ^^ <( \N+? )> ':' \s }
}
sub MAIN(*@pkgs) {
@pkgs ||= <Web foo Web::App::Ballet v5 sake bar panda>;
my $info = qqx /panda info @pkgs[]/;
#my $info = slurp 'skr';
PandaInfo.parse($info);
#note $info;
for @($/.made) -> $p {
say "=== $p<name> ===";
for $p.kv { say "$^k: ".fmt('%-12s'), $^v.perl }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment