summaryrefslogtreecommitdiff
path: root/lib/FLAT/CMD/AcyclicStrings.pm
blob: ebc88409cf396b0d41b29ca72c39d82d6c4cf26b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# all strings available via acyclic path from the DFA start state to any all of the final states

package FLAT::CMD::AcyclicStrings;
use base 'FLAT::CMD';
use FLAT;
use FLAT::Regex::WithExtraOps;
use FLAT::PFA;
use FLAT::NFA;
use FLAT::DFA;
use Storable;
use Carp;

# Support for perl one liners - like what CPAN.pm uses #<- should move all to another file
use base 'Exporter'; #instead of: use Exporter (); @ISA = 'Exporter';
use vars qw(@EXPORT $AUTOLOAD);

@EXPORT = qw(as_strings);

sub AUTOLOAD {
    my($l) = $AUTOLOAD;
    $l =~ s/.*:://;
    my(%EXPORT);
    @EXPORT{@EXPORT} = '';
    if (exists $EXPORT{$l}){
	FLAT::CMD->$l(@_);
    }
}

use vars qw(%nodes %dflabel %backtracked %low $lastDFLabel @string $dfa);
# acyclic - no cycles
sub as_strings {
    my $PRE = shift;
    # neat a better way to get input via stdin
    if (!$PRE) {
      while (<>) {
        chomp;
        $PRE = $_;
        last;
      }
    } 
    # caches results, loads them in if detexted
    my $RE = FLAT::Regex::WithExtraOps->new($PRE);
    printf("%s\n",$RE->as_string());
    if (!-e "$PRE.dat") {
      $dfa = $RE->as_pfa->as_nfa->as_dfa->as_min_dfa->trim_sinks;
      #store $dfa, "$PRE.dat";
    } else {
      print STDERR "$PRE.dat found..";
      $dfa = retrieve "$PRE.dat";
    }
    $dfa->as_acyclic_strings();
}

1;