Class: Ibex::Equiv::Machine

Inherits:
Object
  • Object
show all
Defined in:
lib/ibex/equiv/machine.rb

Overview

Immutable, semantic-action-free LR state-stack machine.

Defined Under Namespace

Classes: BudgetExceeded, Configuration

Instance Method Summary collapse

Constructor Details

#initialize(automaton, max_actions:, max_stack:) ⇒ Machine

Returns a new instance of Machine.



28
29
30
31
32
33
34
# File 'lib/ibex/equiv/machine.rb', line 28

def initialize(automaton, max_actions:, max_stack:)
  @automaton = automaton
  @max_actions = max_actions
  @max_stack = max_stack
  @terminals = automaton.grammar.terminals.to_h { |symbol| [symbol.name, symbol.id] }
  @eof_id = @terminals.fetch("$eof")
end

Instance Method Details

#finish(configuration) ⇒ Object



63
64
65
66
67
# File 'lib/ibex/equiv/machine.rb', line 63

def finish(configuration)
  return configuration if configuration.status

  consume(configuration, @eof_id, eof: true)
end

#push(configuration, token) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/ibex/equiv/machine.rb', line 48

def push(configuration, token)
  return configuration if configuration.status

  token_id = @terminals[token]
  unless token_id
    return Configuration.new(
      stack: configuration.stack, status: :error, actions: configuration.actions,
      reductions: configuration.reductions
    )
  end

  consume(configuration, token_id, eof: false)
end

#run(tokens) ⇒ Object



43
44
45
# File 'lib/ibex/equiv/machine.rb', line 43

def run(tokens)
  tokens.reduce(start) { |configuration, token| push(configuration, token) }
end

#startObject



37
38
39
40
# File 'lib/ibex/equiv/machine.rb', line 37

def start
  entry = @automaton.entry_states.fetch(@automaton.grammar.start)
  Configuration.new(stack: [entry], status: nil, actions: 0, reductions: [])
end