hphp/doc/generate-ir-opcodes.pl (45 lines of code) (raw):
#!/usr/bin/perl -w
use strict;
my $buffer = '';
my $output_buffer = '';
sub process_buffer {
$buffer =~ s/^\s*//g;
$buffer =~ s/\s+/ /g;
$buffer =~ s/^\s*([a-zA-Z0-9]+)<[^>]+>/$1/g;
$output_buffer .= 'O(';
$output_buffer .= $buffer.") \\\n";
$buffer = '';
}
while (<>) {
if ($buffer && !/^\|(.*)$/) {
process_buffer;
next;
}
if (/^\|(.*)/) {
$buffer .= $1;
}
}
######################################################################
# Print but insert some space so opcode names show up in a clear
# column.
sub print_pretty {
my @lines = split /\n/, $output_buffer;
my $max = 0;
foreach (@lines) {
if (/^(O[^,]*)/) {
$max = length $1 if length $1 > $max;
}
}
foreach (sort @lines) {
if (/^(O[^,]*)/) {
my $op = $1;
print $op . ", ";
s/^(O[^,]*),//;
print ' ' x ($max - length $op);
}
print;
print "\n";
}
}
print "// \@".
"generated\n";
print "#define IR_OPCODES \\\n";
print "\\\n";
print_pretty;
print "/**/\n";