#!/usr/bin/perl -w # Michael S. Branicky, 02/18/2001 $separator = ','; $delimiter = "[$separator \t]"; $comment = '%'; @Q = (); @F = (); @Sigma = (); # load an FA in Kozen's format while (<>) { next if /^$comment/; next if /^\w*$/; chop; if(/^\s*&\s*(.*)/) { @Sigma = split(/$delimiter+/, $1); next; } ($q, $string) = /^\s*>?F?\s*(\w+)\s*(.*)$/; push(@Q, $q); $s = $q if />/; push(@F, $q) if /F/; @next = split(/$delimiter+/, $string); foreach $i (@Sigma) { $delta{$q}{$i} = shift(@next); } } # BEGIN program body print_fa(); print_fa_kozen(); # END program body # print out DFA, using 5-tuple format sub print_fa { print "Q = @Q\n"; print "Sigma = @Sigma\n"; print "s = $s\n"; print "F = @F\n"; print "delta = \n"; foreach $q (@Q) { foreach $a (@Sigma) { print " $q, $a: $delta{$q}{$a}\n"; } } print "\n"; } # print out DFA, using Kozen-like format sub print_fa_kozen { print "&"; foreach $a (@Sigma) { print "\t$a"; } print "\n"; foreach $q (@Q) { if ($q eq $s) { print ">"; } else { print " "; } if (inlist($q, @F)) { print "F"; } else { print " "; } print " $q"; foreach $a (@Sigma) { print "\t$delta{$q}{$a}"; } print "\n"; } print "\n"; } # SUBROUTINE for checking if an element is in a list # Call: inlist($elt, @list) sub inlist { $target = shift @_; foreach $elt (@_) { return 1 if ($target eq $elt); } return 0; }