Class: Journey::NFA::Visitor

Inherits:
Visitors::Visitor show all
Defined in:
lib/journey/nfa/builder.rb

Constant Summary

Constants inherited from Visitors::Visitor

Visitors::Visitor::DISPATCH_CACHE

Instance Method Summary collapse

Methods inherited from Visitors::Visitor

#accept

Constructor Details

#initialize(tt) ⇒ Visitor

Returns a new instance of Visitor.



7
8
9
10
# File 'lib/journey/nfa/builder.rb', line 7

def initialize tt
  @tt = tt
  @i  = -1
end

Instance Method Details

#terminal(node) ⇒ Object



50
51
52
53
54
55
56
57
58
59
# File 'lib/journey/nfa/builder.rb', line 50

def terminal node
  from_i = @i += 1 # new state
  to_i   = @i += 1 # new state

  @tt[from_i, to_i] = node
  @tt.accepting = to_i
  @tt.add_memo to_i, node.memo

  [from_i, to_i]
end

#visit_CAT(node) ⇒ Object



12
13
14
15
16
17
18
19
# File 'lib/journey/nfa/builder.rb', line 12

def visit_CAT node
  left  = visit node.left
  right = visit node.right

  @tt.merge left.last, right.first

  [left.first, right.last]
end

#visit_GROUP(node) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/journey/nfa/builder.rb', line 21

def visit_GROUP node
  from  = @i += 1
  left  = visit node.left
  to    = @i += 1

  @tt.accepting = to

  @tt[from, left.first] = nil
  @tt[left.last, to] = nil
  @tt[from, to] = nil

  [from, to]
end

#visit_OR(node) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/journey/nfa/builder.rb', line 35

def visit_OR node
  from  = @i += 1
  children = node.children.map { |c| visit c }
  to    = @i += 1

  children.each do |child|
    @tt[from, child.first]  = nil
    @tt[child.last, to]     = nil
  end

  @tt.accepting = to

  [from, to]
end