/FileGrammar.rakumod Secret
Last active
January 1, 2022 19:54
Star
You must be signed in to star a gist
File Grammar - answer to https://paste.rs/woZ.pl
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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> \v <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 { \h* [ <statement> | <payload> ] \v+ } | |
} | |
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 ~$/ } | |
} | |
my @parse = FileGrammar.parse(q:to/EOI/, actions => Actions.new).made; | |
BG foo.png | |
SPACING 2 2 | |
INPUTS | |
copper_ingot 7 | |
tin_ingot 1 | |
OUTPUTS | |
bronze_ingot 8 | |
EOI | |
for @parse -> %line { | |
dd %line | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment