Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def createLR0DFA()
- l = Set.new()
- l.add(Compiler_LR::LR0Item.new("S'", [@startProd], 0))
- l = computeClosure(l)
- dfa = Compiler_DFA::DFA.new()
- dfa.addState(l)
- dfa.setStartState(l)
- to_do = [l]
- while not to_do.empty?()
- q = to_do.pop()
- a = {}
- q.each{|item|
- if item.dpos < item.rhs.length
- sym = item.rhs[item.dpos]
- if sym != "" #No lambda transitions here
- item2 = Compiler_LR::LR0Item.new(item.lhs, item.rhs, item.dpos + 1)
- if not a.has_key?(sym)
- a[sym] = Set.new()
- end #End if
- a[sym].add(item2)
- end #End if
- end #End if
- }
- a.each(){ |k,v|
- v = computeClosure(v)
- if not dfa.hasState(v)
- to_do.push(v)
- dfa.addState(v)
- end
- dfa.addTransition(q, k, v)
- }
- end #End while
- return dfa
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement