Parent

Journey::GTG::Builder

Constants

DUMMY

Attributes

root[R]
ast[R]
endpoints[R]

Public Class Methods

new(root) click to toggle source
    # File lib/journey/gtg/builder.rb, line 10
10:       def initialize root
11:         @root         = root
12:         @ast          = Nodes::Cat.new root, DUMMY
13:         @followpos    = nil
14:       end

Public Instance Methods

firstpos(node) click to toggle source
     # 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
followpos(node) click to toggle source
     # File lib/journey/gtg/builder.rb, line 123
123:       def followpos node
124:         followpos_table[node]
125:       end
lastpos(node) click to toggle source
     # 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
nullable?(node) click to toggle source
    # 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
transition_table() click to toggle source
    # 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

Private Instance Methods

build_followpos() click to toggle source
     # 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
followpos_table() click to toggle source
     # File lib/journey/gtg/builder.rb, line 128
128:       def followpos_table
129:         @followpos ||= build_followpos
130:       end
symbol(edge) click to toggle source
     # File lib/journey/gtg/builder.rb, line 149
149:       def symbol edge
150:         case edge
151:         when Journey::Nodes::Symbol
152:           edge.regexp
153:         else
154:           edge.left
155:         end
156:       end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.