class Gherkin::Parser::Parser::Machine
Public Class Methods
new(parser, name)
click to toggle source
# File lib/gherkin/parser/parser.rb, line 88 def initialize(parser, name) @parser = parser @name = name @transition_map = transition_map(name) @state = name end
Public Instance Methods
event(ev, line) { |state, expected| ... }
click to toggle source
# File lib/gherkin/parser/parser.rb, line 95 def event(ev, line) states = @transition_map[@state] raise "Unknown state: #{@state.inspect} for machine #{@name}" if states.nil? new_state = states[ev] case new_state when "E" yield @state, expected when /push\((.+)\)/ @parser.push_machine($1) @parser.event(ev, line) when "pop()" @parser.pop_machine() @parser.event(ev, line) else raise "Unknown transition: #{ev.inspect} among #{states.inspect} for machine #{@name}" if new_state.nil? @state = new_state end end
expected()
click to toggle source
# File lib/gherkin/parser/parser.rb, line 114 def expected allowed = @transition_map[@state].find_all { |_, action| action != "E" } allowed.collect { |state| state[0] }.sort - ['eof'] end
Private Instance Methods
build_transition_map(name)
click to toggle source
# File lib/gherkin/parser/parser.rb, line 127 def build_transition_map(name) table = transition_table(name) events = table.shift[1..-1] table.inject({}) do |machine, actions| state = actions.shift machine[state] = Hash[*events.zip(actions).flatten] machine end end
transition_map(name)
click to toggle source
# File lib/gherkin/parser/parser.rb, line 123 def transition_map(name) @@transition_maps[name] ||= build_transition_map(name) end
transition_table(name)
click to toggle source
# File lib/gherkin/parser/parser.rb, line 137 def transition_table(name) state_machine_reader = StateMachineReader.new lexer = Gherkin::I18n.new('en').lexer(state_machine_reader) machine = File.dirname(__FILE__) + "/#{name}.txt" lexer.scan(File.read(machine)) state_machine_reader.rows end