require "parser.rb"
require "fa.rb"

# Some sample code showing how fa.rb is used

p = Parser.new
r1 = p.parse "abc"
puts r1
r2 = p.parse "abc"
puts (r1==r2)
puts (p.parse "")
puts (p.parse "()")

n = NFA.new
n.set_start 0
n.add_trans(0, "a", 1)
n.add_trans(0, "b", 1)
n.add_trans(1, "a", 1)
n.make_final 1

puts (n.accept? "baaaa")
puts (n.accept? "aba")
puts n

puts ""

def print_trans(e1, tran)
  tran.each { |arr|
    a, e2 = arr[0], arr[1]
    puts "#{e1} --#{a}--> #{e2}"
  }
  puts ""
end

r = [r1, p.parse("a*"), p.parse("(ab|ba)*"), p.parse("(a*b*)*")]
r.each { |e|
  print_trans(e, e.trans)
}

r.each { |e|
  nfa = NFA.of_re(e)
  puts nfa
  puts "is_dfa? #{nfa.is_dfa?}"
  puts ""
}

n1 = NFA.new
n1.set_start "s1"
n1.add_trans("s1","a","s2")
n1.add_trans("s1","a","s3")
n1.add_trans("s2","b","s3")
n1.make_final "s3"
puts n1
puts "is_dfa? #{n1.is_dfa?}"
puts n1.to_dfa
puts ""

n2 = NFA.new
n2.set_start "s0"
n2.add_trans("s0","a","s0")
n2.add_trans("s0","b","s0")
n2.add_trans("s0","a","s1")
n2.add_trans("s1","b","s2")
n2.make_final "s2"
puts n2
puts "is_dfa? #{n2.is_dfa?}"
puts n2.to_dfa
