Skip to content

Instantly share code, notes, and snippets.

@cognominal
Created January 14, 2021 00:02
Show Gist options
  • Save cognominal/116eace92637ba7cb752138d029b2bb5 to your computer and use it in GitHub Desktop.
Save cognominal/116eace92637ba7cb752138d029b2bb5 to your computer and use it in GitHub Desktop.
Parsing Sexpr #raku
# unit class Sexpr;
# use Grammar::Tracer;
grammar Sexpr-Grammar is export {
token ws { [ <comment> | \s ]* } #| <wb> }
rule TOP { <.ws>? <TOP-sexpr>+ }
rule TOP-sexpr { <sexpr> }
rule sexpr { '(' <declare>? <itemy> * ')' } # { say $/.Str } }
token itemy { <sexpr> | <wordy> }
token comment { \h* '#' \V* \v }
token declare { $<name>=\w+ ':' }
token wordy { [ | <arg> | <var> | <macro> | <opr> | <word>
| <wbang> | <string> | <method> | <number> | <comma> | <reg>
] }
token word { <.alpha> \w* }
token wbang { \w+ '!' }
token opr { '&' \w+ }
token arg { \\? '$' \d+ }
token macro { '^' \w+ '!'? }
token var { '$' <.alpha> \w* }
token method { <word> [ \. <word> ]+ }
token number { \d+ }
token comma { ',' \w+ }
token reg { \w+ ':' \w+ }
token string {
| \" [ \\ . | <-["]> ]* \"
| \' [ \\ . | <-[']> ]* \'
}
}
my $tile_head = q:to<END>;
/* FILE AUTOGENERATED BY tools/tiler-table-generator.pl. DO NOT EDIT. */
/* Tile function declarations */
END
my $tile_template = q:to<END>;
/* Tile template declarations */
static const MVMJitTileTemplate MVM_jit_tile_templates[] = {
END
my $tile_tables = q:to<END>;
/* Tiler tables */
static const MVMint32 MVM_jit_tile_select[][3] = {
END
my (@tiles, @tiles-templates);
class Sexpr-Tile {
method TOP($/) {
say "MVM_JIT_DECL($_);" for @tiles;
say $_ for @tiles-templates;
}
method TOP-sexpr($/) {
# say $/;
my $name = $<sexpr><itemy>[0];
given ~$<sexpr><declare><name> {
when 'tile' {
push @tiles, $name; # $<sexpr><itemy>[0]
}
when 'define' {
my $reg = ~$<sexpr><itemy>[1];
say $reg;
'reg:foo' ~~ / 'reg' \: (\w+)/;
$reg ~~ / 'reg' \: (\w+)/;
say $0;
exit;
$reg = uc $0;
push @tiles-templates,
qq:!c:to<END>;
\{ NULL, "",
"$name", -1, -1, 0, 0,
{ MVM_JIT_REGISTER_REQUIRE($reg) } },
"
END
}
push @tiles, $<sexpr><itemy>[0]
}
# say $name ~ ' ' ~ ($name eq 'tile');
# exit;
}
}
my $prefix = '/Users/cog/git/MoarVM/src/jit';
my @files = < core_templates.expr macro.expr >;
@files = < x64/tile_pattern.tile >;
@files = @files.map: { "$prefix/$_" };
my $m;
for @files {
say $_;
my $m = Sexpr-Grammar.parsefile: $_, :actions(Sexpr-Tile);
# say $m;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment