#!/usr/bin/perl
# This is a demonstration perl script on how to parse a
# sablecc xml parser file using xpath.
# This script generates input for the graphviz's dot tool
#
# You have to install XML::LibXML and XML::LibXML::XPathContext.

use XML::LibXML;
use XML::LibXML::XPathContext;

my $parser = new XML::LibXML;
my $xml = $parser->parse_file("parser.xml");
my $xpath = XML::LibXML::XPathContext->new($xml);

print "digraph mygraph {\n";

foreach my $prod ($xpath->findnodes('/parser/productions/production')) {
  print $prod->findvalue('@ename').' [shape=diamond,label="'.$prod->findvalue('@name')."\"]\n";

  foreach my $alt ($prod->findnodes('alt')) {
    print $alt->findvalue('@ename') . ' [shape=box,label="' . $alt->findvalue('../@name') . '.' . $alt->findvalue('@name') . "\"]\n";
    print $alt->findvalue('../@ename') . ' -> ' . $alt->findvalue('@ename') . "\n";

    foreach my $elem ($alt->findnodes('elem')) {
      print $elem->findvalue('../@ename') . ' -> ' . $elem->findvalue('@etype') . ' [label="' . $elem->findvalue('@name') . $elem->findvalue('@modifier') . "\"]\n";
      if ( $elem->findvalue('@is_token') ) {
        print $elem->findvalue('@etype') . '[shape=ellipse,label="' . $elem->findvalue('@type') . "\"]\n";
      }
    }
  }
}

print "}\n";

