Class: Ibex::Equiv::Machine
- Inherits:
-
Object
- Object
- Ibex::Equiv::Machine
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
|
#start ⇒ Object
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
|