#!/usr/local/bin/perl # -*- perl -*- sub usage { print < $#nextset) { push(@nextset, $state2); push(@stateset, $state2) if $symbol eq $lambda; } } } return @nextset; } usage() unless $#ARGV == 0 || $#ARGV == 1; $re = $ARGV[0]; $string = $ARGV[1]; # create NFA from $re $initial_state = newstate(); $final_state = newstate(); parse(0, $initial_state, $final_state); # initialize input and NFA for ($i = 0; $i < length($string); $i++) { $input[$i] = substr($string,$i,1); } @stateset = transition($lambda, $initial_state); if ($opt_v) { 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($lambda, @stateset); if ($opt_v) { printf " %s\t%s\n", $input[$position], join(", ", @stateset); } } $matched = 0; for ($i = 0; $i <= $#stateset; $i++) { $matched = 1 if (1 == $stateset[$i]); } printf "yes\n" if $matched == 1; printf "no\n" if $matched == 0;