class Journey::GTG::TransitionTable
Attributes
memos[R]
Public Class Methods
new()
click to toggle source
# File lib/journey/gtg/transition_table.rb, line 10 def initialize @regexp_states = Hash.new { |h,k| h[k] = {} } @string_states = Hash.new { |h,k| h[k] = {} } @accepting = {} @memos = Hash.new { |h,k| h[k] = [] } end
Public Instance Methods
[]=(from, to, sym)
click to toggle source
# File lib/journey/gtg/transition_table.rb, line 112 def []= from, to, sym case sym when String @string_states[from][sym] = to when Regexp @regexp_states[from][sym] = to else raise ArgumentError, 'unknown symbol: %s' % sym.class end end
accepting?(state)
click to toggle source
# File lib/journey/gtg/transition_table.rb, line 25 def accepting? state @accepting[state] end
accepting_states()
click to toggle source
# File lib/journey/gtg/transition_table.rb, line 21 def accepting_states @accepting.keys end
add_accepting(state)
click to toggle source
# File lib/journey/gtg/transition_table.rb, line 17 def add_accepting state @accepting[state] = true end
add_memo(idx, memo)
click to toggle source
# File lib/journey/gtg/transition_table.rb, line 29 def add_memo idx, memo @memos[idx] << memo end
eclosure(t)
click to toggle source
# File lib/journey/gtg/transition_table.rb, line 37 def eclosure t Array(t) end
memo(idx)
click to toggle source
# File lib/journey/gtg/transition_table.rb, line 33 def memo idx @memos[idx] end
move(t, a)
click to toggle source
# File lib/journey/gtg/transition_table.rb, line 41 def move t, a move_string(t, a).concat move_regexp(t, a) end
states()
click to toggle source
# File lib/journey/gtg/transition_table.rb, line 123 def states ss = @string_states.keys + @string_states.values.map(&:values).flatten rs = @regexp_states.keys + @regexp_states.values.map(&:values).flatten (ss + rs).uniq end
to_json()
click to toggle source
# File lib/journey/gtg/transition_table.rb, line 45 def to_json require 'json' simple_regexp = Hash.new { |h,k| h[k] = {} } @regexp_states.each do |from, hash| hash.each do |re, to| simple_regexp[from][re.source] = to end end JSON.dump({ :regexp_states => simple_regexp, :string_states => @string_states, :accepting => @accepting }) end
to_svg()
click to toggle source
# File lib/journey/gtg/transition_table.rb, line 63 def to_svg svg = IO.popen("dot -Tsvg", 'w+') { |f| f.write to_dot f.close_write f.readlines } 3.times { svg.shift } svg.join.sub(/width="[^"]*"/, '').sub(/height="[^"]*"/, '') end
transitions()
click to toggle source
# File lib/journey/gtg/transition_table.rb, line 129 def transitions @string_states.map { |from, hash| hash.map { |s, to| [from, s, to] } }.flatten(1) + @regexp_states.map { |from, hash| hash.map { |s, to| [from, s, to] } }.flatten(1) end
visualizer(paths, title = 'FSM')
click to toggle source
# File lib/journey/gtg/transition_table.rb, line 73 def visualizer paths, title = 'FSM' viz_dir = File.join File.dirname(__FILE__), '..', 'visualizer' fsm_js = File.read File.join(viz_dir, 'fsm.js') fsm_css = File.read File.join(viz_dir, 'fsm.css') erb = File.read File.join(viz_dir, 'index.html.erb') states = "function tt() { return #{to_json}; }" fun_routes = paths.shuffle.first(3).map do |ast| ast.map { |n| case n when Nodes::Symbol case n.left when ':id' then rand(100).to_s when ':format' then %w{ xml json }.shuffle.first else 'omg' end when Nodes::Terminal then n.symbol else nil end }.compact.join end stylesheets = [fsm_css] svg = to_svg javascripts = [states, fsm_js] # Annoying hack for 1.9 warnings fun_routes = fun_routes stylesheets = stylesheets svg = svg javascripts = javascripts require 'erb' template = ERB.new erb template.result(binding) end
Private Instance Methods
move_regexp(t, a)
click to toggle source
# File lib/journey/gtg/transition_table.rb, line 138 def move_regexp t, a return [] if t.empty? t.map { |s| @regexp_states[s].map { |re,v| re === a ? v : nil } }.flatten.compact.uniq end
move_string(t, a)
click to toggle source
# File lib/journey/gtg/transition_table.rb, line 146 def move_string t, a return [] if t.empty? t.map { |s| @string_states[s][a] }.compact end