Object
# File lib/journey/gtg/builder.rb, line 81 81: def firstpos node 82: case node 83: when Nodes::Star 84: firstpos(node.left) 85: when Nodes::Cat 86: if nullable? node.left 87: firstpos(node.left) | firstpos(node.right) 88: else 89: firstpos(node.left) 90: end 91: when Nodes::Or 92: node.children.map { |c| firstpos(c) }.flatten.uniq 93: when Nodes::Unary 94: firstpos(node.left) 95: when Nodes::Terminal 96: nullable?(node) ? [] : [node] 97: else 98: raise ArgumentError, 'unknown firstpos: %s' % node.class.name 99: end 100: end
# File lib/journey/gtg/builder.rb, line 123 123: def followpos node 124: followpos_table[node] 125: end
# File lib/journey/gtg/builder.rb, line 102 102: def lastpos node 103: case node 104: when Nodes::Star 105: firstpos(node.left) 106: when Nodes::Or 107: node.children.map { |c| lastpos(c) }.flatten.uniq 108: when Nodes::Cat 109: if nullable? node.right 110: lastpos(node.left) | lastpos(node.right) 111: else 112: lastpos(node.right) 113: end 114: when Nodes::Terminal 115: nullable?(node) ? [] : [node] 116: when Nodes::Unary 117: lastpos(node.left) 118: else 119: raise ArgumentError, 'unknown lastpos: %s' % node.class.name 120: end 121: end
# File lib/journey/gtg/builder.rb, line 62 62: def nullable? node 63: case node 64: when Nodes::Group 65: true 66: when Nodes::Star 67: true 68: when Nodes::Or 69: node.children.any? { |c| nullable?(c) } 70: when Nodes::Cat 71: nullable?(node.left) && nullable?(node.right) 72: when Nodes::Terminal 73: !node.left 74: when Nodes::Unary 75: nullable? node.left 76: else 77: raise ArgumentError, 'unknown nullable: %s' % node.class.name 78: end 79: end
# File lib/journey/gtg/builder.rb, line 16 16: def transition_table 17: dtrans = TransitionTable.new 18: marked = {} 19: state_id = Hash.new { |h,k| h[k] = h.length } 20: 21: start = firstpos(root) 22: dstates = [start] 23: until dstates.empty? 24: s = dstates.shift 25: next if marked[s] 26: marked[s] = true # mark s 27: 28: s.group_by { |state| symbol(state) }.each do |sym, ps| 29: u = ps.map { |l| followpos(l) }.flatten 30: next if u.empty? 31: 32: if u.uniq == [DUMMY] 33: from = state_id[s] 34: to = state_id[Object.new] 35: dtrans[from, to] = sym 36: 37: dtrans.add_accepting to 38: ps.each { |state| dtrans.add_memo to, state.memo } 39: else 40: dtrans[state_id[s], state_id[u]] = sym 41: 42: if u.include? DUMMY 43: to = state_id[u] 44: 45: accepting = ps.find_all { |l| followpos(l).include? DUMMY } 46: 47: accepting.each { |accepting_state| 48: dtrans.add_memo to, accepting_state.memo 49: } 50: 51: dtrans.add_accepting state_id[u] 52: end 53: end 54: 55: dstates << u 56: end 57: end 58: 59: dtrans 60: end
# File lib/journey/gtg/builder.rb, line 132 132: def build_followpos 133: table = Hash.new { |h,k| h[k] = [] } 134: @ast.each do |n| 135: case n 136: when Nodes::Cat 137: lastpos(n.left).each do |i| 138: table[i] += firstpos(n.right) 139: end 140: when Nodes::Star 141: lastpos(n).each do |i| 142: table[i] += firstpos(n) 143: end 144: end 145: end 146: table 147: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.