Algorithm-ConstructDFA-XS
view release on metacpan or search on metacpan
ConstructDFA.xs view on Meta::CPAN
extern "C"
{
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
}
using namespace std;
// TODO: more error handling when Perl API functions fail
// TODO: use a vector for lookup tables like `successors`
// TODO: exploit that a list rather than a sub can be used
// to identify accepting configurations, the call_sv
// and the associated array copying is a bottleneck
typedef UV State;
typedef set<State> States;
typedef UV Label;
typedef size_t StatesId;
ConstructDFA.xs view on Meta::CPAN
if (s2id.find(v) == s2id.end()) {
s2id[v] = id2s.size();
id2s.push_back(v);
}
return s2id[v];
}
const vector<State>& id_to_states(StatesId id) {
if (id >= id2s.size()) {
warn("Programmer error looking up %u", id);
}
return id2s[id];
}
};
map<size_t, HV*>
build_dfa(SV* accept_sv, AV* args) {
typedef map<pair<StatesId, Label>, StatesId> Automaton;
StatesBimap m;
ConstructDFA.xs view on Meta::CPAN
if (av_len(current_av) < 3)
croak("Bad arguments");
SV** vertex_svp = av_fetch(current_av, 0, 0);
SV** label_svp = av_fetch(current_av, 1, 0);
SV** null_svp = av_fetch(current_av, 2, 0);
SV** start_svp = av_fetch(current_av, 3, 0);
if (!(vertex_svp && label_svp && null_svp && start_svp))
croak("Internal error");
nullable[SvUV(*vertex_svp)] = SvTRUE(*null_svp);
if (SvOK(*label_svp))
label[SvUV(*vertex_svp)] = SvUV(*label_svp);
if (!( SvROK(*start_svp) && SvTYPE(SvRV(*start_svp)) == SVt_PVAV))
croak("Bad arguments");
ConstructDFA.xs view on Meta::CPAN
}
start_states[SvUV(*item_svp)].insert(SvUV(*vertex_svp));
}
I32 current_av_len = av_len(current_av);
for (int k = 4; k <= current_av_len; ++k) {
SV** successor_svp = av_fetch(current_av, k, 0);
if (!successor_svp)
croak("Internal error");
successors[SvUV(*vertex_svp)].push_back(SvUV(*successor_svp));
}
}
VectorBasedSet<State> sub_temp;
set<StatesId> seen;
list<StatesId> todo;
set<StatesId> final_states;
Automaton automaton;
( run in 0.769 second using v1.01-cache-2.11-cpan-65fba6d93b7 )