You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.6 KiB
64 lines
1.6 KiB
#!/usr/bin/env raku
|
|
|
|
grammar FileGrammar {
|
|
# The top-level file is a list of statements
|
|
token TOP { ^ <line>* %% \v* $ }
|
|
|
|
# A line is either a list of keyword-payload or scope
|
|
token line { <statement> | <scope> }
|
|
|
|
# A statement is a simple keyword-payload mapping
|
|
token statement { <keyword> \s <payload> }
|
|
|
|
# The set of simple key-value keywords
|
|
token keyword { < ANCHOR BG COUNT ENV MODE SPACING > }
|
|
|
|
# A simple payload
|
|
token payload { \S+ %% \h* }
|
|
|
|
# A scope is a scope-word + list of scope-lines
|
|
token scope { <scope-word> <scope-line>* }
|
|
|
|
# The set of scope-opening keywords
|
|
token scope-word { < INPUTS OUTPUTS > }
|
|
|
|
# A scope line is either a simple payload or a full statement
|
|
token scope-line { \v+ \h \h [ <statement> | <payload> ] }
|
|
}
|
|
|
|
class Actions {
|
|
method TOP($/) {
|
|
make $<line>>>.made
|
|
}
|
|
|
|
method line($/) {
|
|
make .made with $<statement> || $<scope>;
|
|
}
|
|
|
|
method statement($/) {
|
|
make { Keyword => $<keyword>.made, Payload => $<payload>.made }
|
|
}
|
|
|
|
method scope($/) {
|
|
make { Keyword => $<scope-word>.made, Payload => $<scope-line>>>.made }
|
|
}
|
|
|
|
method scope-line($/) {
|
|
make $<statement> ?? $<statement>.made !! { Payload => $<payload>.made }
|
|
}
|
|
|
|
method keyword($/) { make ~$/ }
|
|
method payload($/) { make ~$/ }
|
|
method scope-word($/) { make ~$/ }
|
|
}
|
|
|
|
sub MAIN($file, Bool :$verbose) {
|
|
my $input = slurp $file;
|
|
say "Parsing input: $input" if $verbose;
|
|
|
|
my @parse = FileGrammar.parse($input, actions => Actions.new).made;
|
|
|
|
for @parse -> %line {
|
|
say %line
|
|
}
|
|
}
|
|
|