Skip to content

Instantly share code, notes, and snippets.

@JRaspass
Created October 29, 2019 12:26
Show Gist options
  • Save JRaspass/55a0ac1982cbe8ebf6c93b16275fbe29 to your computer and use it in GitHub Desktop.
Save JRaspass/55a0ac1982cbe8ebf6c93b16275fbe29 to your computer and use it in GitHub Desktop.
grammar Grammar {
rule TOP { <table>+ }
rule table { '[' '"'? <key> '"'? ']' <key-val>+ }
rule key-val { <key> '=' <val> }
token key { <[ A .. Z a .. z 0 .. 9 . _ + - ]>+ }
proto token val {*}
token val:sym<bool> { 'true' | 'false' }
token val:sym<int> { \d+ }
token val:sym<str> { '"' <(.+?)> '"' }
}
class Actions {
method TOP ($/) { make %( $<table>».made.flat ) }
method table ($/) { make $<key>.made => %( $<key-val>».made ) }
method key-val ($/) { make $<key>.made => $<val>.made }
method key ($/) { make ~$/ }
method val:sym<bool> ($/) { make $/ eq 'true' }
method val:sym<int> ($/) { make +$/ }
method val:sym<str> ($/) { make ~$/ }
}
my %dists = Grammar.parse(slurp('dists.toml'), :actions(Actions)).made;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment