#!/usr/bin/perl use Perl6::Slurp; use Data::Dumper; my $g = slurp $ARGV[0]; $g =~ s{\n\=begin.*?\n(.|\n)*?=end.*?\n}{}g; $g =~ s[#.*?$][]gm; $g =~ s[^((rule|token)\s+(\S+))][$1\n]mg; $g =~ s[\<[.?!]?([^<>]*?(\<.*?\>)?)\>][\nitem $1\n]g; my @a = split /\n/, $g; map { $_ =~ s/item before \<(.*)\>/item $1/; } @a; map { $_ =~ s/item (\S+): .*/item $1/; } @a; (my $grammar) = grep(/^grammar/, @a); $grammar =~ s/grammar\s+(\w+).*/$1/; @a = grep(/^(token|rule|item)/, @a); @a = grep(!/item \[/, @a); @a = grep(!/^item before/, @a); @a = grep(!/^item (?!\w+$)/, @a); my $curr_token; print "digraph $grammar {\n"; map { my $line = $_; if($line =~ m/^(token|rule) (.*)/) { $curr_token = $2; } elsif($line =~ m/^item (.*)/) { print "$curr_token -> $1;\n"; } } @a; print "}\n";