load_compiler = {
  include 'parser/parser'
  include 'parser/compiler'
  include 'parser/var_assigner'
}

interactive = object.new
interactive.init = {
  load_compiler
  my.assigner = var_assigner.new([:program], :interactive)
  my.c = compiler.new([:program])
}

interactive.prototype.run = { str |
  parsed = brat_parser.parse(str, "program", true)

  false? parsed
    { :"" }
    {
      my.assigner.ast = parsed.ast
      my.c.ast = assigner.assign
      my.c.interactive
    }
}

brat2lua = object.new
brat2lua.compile_string = { str |
  load_compiler
  parsed = brat_parser.parse(str, "program", true)

  false? parsed
    {
      false
    }
    {
      ast = parsed.ast
      ast = var_assigner.new(ast).assign
      compiler.new(ast).compile
    }
}

brat2lua.compile_file = { file_name |
  load_compiler
  include 'file'
  src = file.read "#{file_name}.brat"
  out = brat2lua.compile_string src

  true? out
    { file.open "#{file_name}.lua", :w, { f | f.write out } }
    { throw "Syntax error in #{file_name}.brat" }
}

brat2lua.start_interactive = {
  interactive.new
}

brat2lua.ast_from_string = { str |
  load_compiler
  parsed = brat_parser.parse(str, "program", true)

  false? parsed
    {
      throw "Failed to parse."
    }
    {
      ast = parsed.ast
      ast = var_assigner.new(ast).assign
    }
}

export brat2lua, :brat2lua