diff options
author | Daniel Friesel <derf@finalrewind.org> | 2017-04-03 15:04:15 +0200 |
---|---|---|
committer | Daniel Friesel <derf@finalrewind.org> | 2017-04-03 15:04:15 +0200 |
commit | 00e57331b1c7ef2b1f402f41e1223308e0d8ce61 (patch) | |
tree | 05e9b4223072582a5a6843de6d9845213a94f341 /lib/FLAT/CMD/DFTStrings.pm |
initial commit
Diffstat (limited to 'lib/FLAT/CMD/DFTStrings.pm')
-rw-r--r-- | lib/FLAT/CMD/DFTStrings.pm | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/lib/FLAT/CMD/DFTStrings.pm b/lib/FLAT/CMD/DFTStrings.pm new file mode 100644 index 0000000..9dc5a59 --- /dev/null +++ b/lib/FLAT/CMD/DFTStrings.pm @@ -0,0 +1,55 @@ +# all strings available via depth first traversal, including back edges that happen to land on an accepting state + +package FLAT::CMD::DFTStrings; +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_dft_strings(shift); +} + +1; |