/*
* Nfa2Dfa
*
*/
function StateCmp(a, b) {
if (a.id == b.id) {
return true
}
return false
}
function NfaStackCmp(x, y) {
var ret = true;
if (x.length != y.length) { return false }
for (var i=0; i < x.length; i++) {
ret = ret && StateCmp(x.get(i), y.get(i));
}
return ret;
}
function Nfa2Dfa(nfa) {
this.startState = nfa.getStartState();
this.acceptingState = nfa.getAcceptingState();
}
Nfa2Dfa.prototype.getStartState = function() { return this.startState }
Nfa2Dfa.prototype.getAcceptingState = function() { return this.acceptingState }
ttable = new Object();
Nfa2Dfa.prototype.do = function() {
var dfaStates = new Stack();
var q = new Stack();
q.push(this.getStartState());
var p = this.epsclosure(q)
var q = p.copy();
dfaStates.push(p);
document.write('S '+p.str()+'
');
var done = new Array();
//var ttable = new Object();
var ds = null;
var j = 0;
while (!dfaStates.isEmpty()) {
ds = dfaStates.pop();
for (var i = 0; i < ALPHABET.length; i++) {
a = ALPHABET.substring(i, i+1);
var ds2 = ds.copy();
x = this.epsclosure(this.move(a, ds));
ds = ds2;
var adone = false;
for (var w=0; w < done.length; w++) {
if(NfaStackCmp(done[w], x)) {
adone = true;
break;
}
}
var q = ds.str().replace(/ /g, '_');
var qq = x.str().replace(/ /g, '_');
if (!ttable[q]) {
ttable[q] = new Object();
ttable[q].isFinal = true;
}
var isFinal = false;
for (var zz=0; zz < x.length; zz++) {
if (StateCmp(x.get(zz), this.acceptingState)) {
ttable[q].isFinal = false;
break;
}
}
ttable[q][a] = qq;
if (x.length > 0 && !adone) {
for (var h=0; h < j; h++) {
document.write("\t");
}
document.write(a+' '+x.str()+'
');
dfaStates.push(x);
}
}
done.push(ds);
j++;
}
}
Nfa2Dfa.prototype.epsclosure = function(q) {
var s = null;
var t = null;
var p = new Stack();
while(!q.isEmpty()) {
s = q.pop();
p.push(s);
if(s.symbol == EPSILON) {
for (var i = 0; i < 2; i++) {
t = s.getFollowUp(i);
if (t!=null) {
q.push(t);
}
}
}
}
return p;
}
Nfa2Dfa.prototype.move = function(str, p) {
var s = null;
var q = new Stack();
while(!p.isEmpty()) {
s = p.pop();
s.mark(false);
if (s.symbol == str) {
s.getFollowUp(0).mark(true);
q.push(s.getFollowUp(0));
}
}
return q;
}
/*
* DfaStates
*
*/
function DfaState(nfaStates) {
this.nfaStates = nfaStates;
this.marked = false;
}
DfaState.prototype.compare = function(b) {
}
DfaState.prototype.str = function() {
res = '';
for (var i=0; i < this.nfaStates.length; i++) {
res += this.nfaStates[i].id + ' '
}
return res
}