Created
January 14, 2021 00:02
-
-
Save cognominal/116eace92637ba7cb752138d029b2bb5 to your computer and use it in GitHub Desktop.
Parsing Sexpr #raku
This file contains hidden or 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
| # 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