root/misc/STD_red/gray_create.pl

Revision 20878, 4.3 kB (checked in by putter, 7 months ago)

[elf] Elf has had two variants, only very slightly different. The default one used Moose, the faster one not. The two have been merged, with the default one now not. elf_f_faster no longer exists - use the similar elf_f.
Motivation - the low startup latency is nice, and with a dearth of development resources, the time when Moose would most help is now distant, so supporting both doesn't currently seem worth the complexity cost.

  • Property svn:mime-type set to text/plain; charset=UTF-8
  • Property svn:eol-style set to native
  • Property svn:executable set to *
Line 
1#!/usr/bin/perl
2use strict; use warnings;
3my $gray = "";
4sub g ($) { $gray .= join("\n",@_)."\n"; }
5sub gs ($) { $gray .= join("",@_).""; }
6
7g <<'END';
8class PerlGray {
9  has $.ws_from;
10  has $.ws_to;
11
12END
13
14    def_precedence( hyper           => { transparent=>1                         });
15    def_precedence( term            => { prec=>"z="                             });
16    def_precedence( methodcall      => { prec=>"y="                             });
17    def_precedence( autoincrement   => { prec=>"x="                             });
18    def_precedence( exponentiation  => { prec=>"w=", assoc=>'right', assign=>1 });
19    def_precedence( symbolic_unary  => { prec=>"v="                             });
20    def_precedence( multiplicative  => { prec=>"u=", assoc=>'left',  assign=>1 });
21    def_precedence( additive        => { prec=>"t=", assoc=>'left',  assign=>1 });
22    def_precedence( replication     => { prec=>"s=", assoc=>'left',  assign=>1 });
23    def_precedence( concatenation   => { prec=>"r=", assoc=>'left',  assign=>1 });
24    def_precedence( junctive_and    => { prec=>"q=", assoc=>'list',  assign=>1 });
25    def_precedence( junctive_or     => { prec=>"p=", assoc=>'list',  assign=>1 });
26    def_precedence( named_unary     => { prec=>"o=",                            });
27    def_precedence( nonchaining     => { prec=>"n=", assoc=>'non'               });
28    def_precedence( chaining        => { prec=>"m=", assoc=>'chain', bool=>1   });
29    def_precedence( tight_and       => { prec=>"l=", assoc=>'left',  assign=>1 });
30    def_precedence( tight_or        => { prec=>"k=", assoc=>'left',  assign=>1 });
31    def_precedence( conditional     => { prec=>"j=", assoc=>'right',            });
32    def_precedence( item_assignment => { prec=>"i=", assoc=>'right'             });
33    def_precedence( loose_unary     => { prec=>"h=",                            });
34    def_precedence( comma           => { prec=>"g=", assoc=>'list',             });
35    def_precedence( list_infix      => { prec=>"f=", assoc=>'list',  assign=>1 });
36    def_precedence( list_assignment => { prec=>"i=", 'sub'=>"e=", assoc=>'right' });
37    def_precedence( list_prefix     => { prec=>"e=",                            });
38    def_precedence( loose_and       => { prec=>"d=", assoc=>'left',  assign=>1 });
39    def_precedence( loose_or        => { prec=>"c=", assoc=>'left',  assign=>1 });
40    def_precedence( LOOSEST         => { prec=>"a=!",                           });
41    def_precedence( terminator      => { prec=>"a=", assoc=>'list'              });
42sub def_precedence {
43  my($name,$info)=@_;
44}
45
46
47#    SLOOSEST = HLOOSEST[prec]
48
49g <<'END';
50END
51
52g <<'END';
53  method init($code) {
54  }
55}
56END
57
58sub STD_gray_run {
59  <<'END';
60
61class STDGrayRun {
62  method print_usage_and_exit () {
63    say '
64Usage: [-q] [--format=p5a] [--start RULE] [ FILENAME | -e CODE ]
65
66';
67    exit(1);
68  }
69  method main () {
70    if @*ARGS.elems == 0 {
71      $.print_usage_and_exit()
72    }
73    my $q = 0;
74    my $format;
75    my $start;
76    my $code;
77    my $filename;
78    while @*ARGS.elems > 0 {
79      my $arg = @*ARGS.shift;
80      if $arg eq '--help' {
81        $.print_usage_and_exit()
82      }
83      elsif $arg eq '-q' {
84        $q = 1;
85      }
86      elsif $arg eq '--format=p5a' {
87        $format = 'p5a';
88      }
89      elsif $arg eq '--start' {
90        $start = @*ARGS.shift || $.print_usage_and_exit();
91      }
92      elsif $arg eq '-e' {
93        $code = @*ARGS.shift || $.print_usage_and_exit();
94      }
95      else {
96        $filename = @*ARGS.shift;
97        $code = slurp($filename);
98      }
99    }
100    $code = $.remove_t_pod_hacks($code);
101
102    my $tree;
103    my $pn = PerlGray.new;
104    $pn.init($code);
105    my $^unitstopper = '_EOS';
106    my $^stop = 'if you see this dont stop';
107    if $start {
108      $tree = eval($pn~'.'~$start)
109    } else {
110      $tree = $pn._UNIT;
111    }
112    if not($format) {
113      say $tree.match_describe;
114    } else {
115      say $tree.to_dump0;
116    }
117  }
118  method remove_t_pod_hacks ($code) is p5 {'
119    my $whiteout = sub {my($s)=@_; $s =~ tr/ \n/ /c; $s };
120    $code =~ s/(\n=kwid.*?\n=cut[^\n]*)/$whiteout->($1)/seg;
121    $code =~ s/(\n=pod.*?\n=cut[^\n]*)/$whiteout->($1)/seg;
122    $code =~ s/(\n=head1.*?\n=cut[^\n]*)/$whiteout->($1)/seg;
123    $code;
124  '}
125}
126STDGrayRun.main()
127
128END
129}
130
131sub main {
132  open(F,">STD_gray_run") or die;
133  print F "#!/usr/bin/env elf_f\n";
134  print F  $gray.STD_gray_run();
135  close F;
136  system("./STD_gray_run",@ARGV);
137}
138main();
Note: See TracBrowser for help on using the browser.