#!/usr/local/bin/perl # -*- perl -*- sub usage { print < $#nextset) { push(@nextset, $state2); push(@stateset, $state2) if $symbol eq "."; } } } return @nextset; } usage() unless $#ARGV == 0 || $#ARGV == 1; $file = $ARGV[0]; $string = $ARGV[1]; # input NFA open(NFA, $file); while ($line = ) { @states = split(/\s+/,$line); $state1 = shift(@states); $state1 = shift(@states) if $state1 eq ""; $symbol = shift(@states); foreach $state2 (@states) { push(@{$next_state{$state1}{$symbol}}, $state2); } $initial_state = $state1 unless defined($initial_state); } close(NFA); usage() unless defined($initial_state); # initialize input and NFA for ($i = 0; $i < length($string); $i++) { $input[$i] = substr($string,$i,1); } @stateset = transition(".", $initial_state); print("Input\tState(s)\n"); print("-----\t--------\n"); printf "\t%s\n", join(", ", @stateset); for ($position = 0; $position <= $#input; $position++) { # perform transition @stateset = transition($input[$position], @stateset); @stateset = transition(".", @stateset); printf " %s\t%s\n", $input[$position], join(", ", @stateset); }