Class: Ibex::Frontend::TokenAdapter::DelimiterTracker

Inherits:
Object
  • Object
show all
Defined in:
lib/ibex/frontend/token_adapter/delimiter_tracker.rb

Overview

Tracks ordinary EBNF groups separately from separated-list calls.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeDelimiterTracker

Returns a new instance of DelimiterTracker.



14
15
16
# File 'lib/ibex/frontend/token_adapter/delimiter_tracker.rb', line 14

def initialize
  @stack = [] #: Array[[delimiter_kind, Token]]
end

Instance Attribute Details

#group_openingObject (readonly)

: Token?



8
9
10
# File 'lib/ibex/frontend/token_adapter/delimiter_tracker.rb', line 8

def group_opening
  @group_opening
end

#open_kindObject (readonly)

: delimiter_kind?



9
10
11
# File 'lib/ibex/frontend/token_adapter/delimiter_tracker.rb', line 9

def open_kind
  @open_kind
end

Instance Method Details

#empty?Boolean

Returns:

  • (Boolean)


19
20
21
# File 'lib/ibex/frontend/token_adapter/delimiter_tracker.rb', line 19

def empty?
  @stack.empty?
end

#observe(token, external, previous_external) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/ibex/frontend/token_adapter/delimiter_tracker.rb', line 24

def observe(token, external, previous_external)
  if external == "("
    kind = if %i[SEPARATED_LIST SEPARATED_NONEMPTY_LIST].include?(previous_external)
             :separated
           elsif %i[LHS PARAMETERIZED_REFERENCE].include?(previous_external)
             :parameter
           else
             :group
           end #: delimiter_kind
    @stack << [kind, token] #: [delimiter_kind, Token]
  elsif external == ")"
    @stack.pop
  end
  @open_kind = @stack.last&.first
  @group_opening = @stack.reverse.find { |kind, _opening| kind == :group }&.last
end