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;
|