Skip to content

Instantly share code, notes, and snippets.

Created April 6, 2017 19:28
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 anonymous/e1f7618e05d68a2ce242c445641ff789 to your computer and use it in GitHub Desktop.
Save anonymous/e1f7618e05d68a2ce242c445641ff789 to your computer and use it in GitHub Desktop.
#use Grammar::Debugger;
### Package : package-name-ver-arch-build-tag.ext
grammar Pkg {
token TOP { <ws> <name> ['-' <ver>]? ['-' <arch>]? ['-' <build>]? ['-' <tag>]? ['.' <ext>]? }
regex name { <alnum>+ [ '-' <alnum>+ ]* <!before '.'>} # using regex as name may contain "-"
token ver { <digit>+ ['.' <digit>+]* }
proto token arch { * } # look-around asssertions for "arch" token doesn't work, Why!
token arch:sym<x86_64> { <sym> }
token arch:sym<i386> { <sym> }
token build { <!after '-' <ver> '-'> <digit>+ }
token tag { <?after '-' <build> '-'> <alnum>+ } # "tag" is optional in the package name.
token ext { <?after [<build> | <tag>] '.'> 'pkg' } # "ext" should come after ("build" or "tag") only
}
# grammar should parse as follow:
# 'package-name' match name
# 'package-name-ver' match name, ver
# 'package-name-ver-arch' match name, ver, arch
# 'package-name-ver-arch-build' match name, ver, arch, build
# 'package-name-ver-build' should Not match "build" should come after "arch"
# 'package-name-ver-arch-build-tag' match name, ver, arch, build, tag
# 'package-name-ver-arch-build.ext' match name, ver, arch, build, ext
# 'package-name-ver-arch-build-tag.ext' match name, ver, arch, build, tag, ext
# 'package-name-arch-build' should Not match: "arch" must be after ver and before build
# 'package-name-ver-build' should Not "match": "build" must be after arch
### Issues ###
# grammar should fail to parse if token matched in wrong location (arch token showed before version token for example)
# package-name-ver-arch.ext should fail, however, grammar successfully parse it
# package-name-ver-arch-build-tag.pkg should match successfully, but grammar fails to parse it
#my $m = Pkg.parse('rakudo-5.3.2-x86_64-7.xyz');
my $m = Pkg.parse(@*ARGS);
exit unless $m;
say $m<name> ?? "name: $m<name>" !! "name:";
say $m<ver> ?? "ver: $m<ver>" !! "ver:";
say $m<arch> ?? "arch: $m<arch>" !! "arch:";
say $m<build> ?? "build: $m<build>" !! "build:";
say $m<tag> ?? "tag: $m<tag>" !! "tag:";
say $m<ext> ?? "ext: $m<ext>" !! "ext:";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment