- for t in s.outs do
- var sym = t.symbol
- if sym == null or ts.has(sym) then continue
- ts.add(sym)
- var nfa_dest = eclosure(trans(nfa_states, sym))
- #print "{nfa_states} -> {sym} -> {nfa_dest}"
- var dfa_dest
- if seen.has(nfa_dest) then
- #print "* reuse {nfa_dest.inspect}={nfa_dest}"
- dfa_dest = n2d[nfa_dest]
- else
- #print "* new {nfa_dest.inspect}={nfa_dest}"
- dfa_dest = new State
- dfa.states.add(dfa_dest)
- n2d[nfa_dest] = dfa_dest
- todo.add(nfa_dest)
- seen.add(nfa_dest)
- end
- dfa_state.add_trans(dfa_dest, sym)
+ end
+
+ # From the important values, build a sequence of TSymbols
+ var a = alphabet.to_a
+ (new ComparableSorter[Int]).sort(a)
+ var tsyms = new Array[TSymbol]
+ var last = 0
+ for i in a do
+ if last > 0 and last <= i-1 then
+ tsyms.add(new TSymbol(last,i-1))
+ end
+ tsyms.add(new TSymbol(i,i))
+ last = i+1
+ end
+ if last > 0 then
+ tsyms.add(new TSymbol(last,null))
+ end
+ #print "Alphabet: {tsyms.join(", ")}"
+
+ var lastst: nullable Transition = null
+ for sym in tsyms do
+ var nfa_dest = eclosure(trans(nfa_states, sym.first))
+ if nfa_dest.is_empty then
+ lastst = null
+ continue
+ end
+ #print "{nfa_states} -> {sym} -> {nfa_dest}"
+ var dfa_dest
+ if seen.has(nfa_dest) then
+ #print "* reuse {nfa_dest.inspect}={nfa_dest}"
+ dfa_dest = n2d[nfa_dest]
+ else
+ #print "* new {nfa_dest.inspect}={nfa_dest}"
+ dfa_dest = new State
+ dfa.states.add(dfa_dest)
+ n2d[nfa_dest] = dfa_dest
+ todo.add(nfa_dest)
+ seen.add(nfa_dest)
+ end
+ if lastst != null and lastst.to == dfa_dest then
+ lastst.symbol.last = sym.last
+ else
+ lastst = dfa_state.add_trans(dfa_dest, sym)