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

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

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.

RBS:

  • () -> void



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_openingToken? (readonly)

Signature:

  • Token?

Returns:



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

def group_opening
  @group_opening
end

#open_kinddelimiter_kind? (readonly)

Signature:

  • delimiter_kind?

Returns:

  • (delimiter_kind, nil)


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

RBS:

  • () -> bool

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) ⇒ void

This method returns an undefined value.

RBS:

  • (Token token, external_token external, external_token? previous_external) -> void

Parameters:

  • token (Token)
  • external (external_token)
  • previous_external (external_token, nil)


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