require 'h-ety-h/syntax/common'

module HH::Syntax

  # A default tokenizer for handling syntaxes that are not explicitly handled
  # elsewhere. It simply yields the given text as a single token.
  class Default
    
    # Yield the given text as a single token.
    def tokenize( text )
      yield Token.new( text, :normal )
    end

  end

  # A hash for registering syntax implementations.
  SYNTAX = Hash.new( Default )

  # Load the implementation of the requested syntax. If the syntax cannot be
  # found, or if it cannot be loaded for whatever reason, the Default syntax
  # handler will be returned.
  def load( syntax )
    begin
      require "h-ety-h/syntax/lang/#{syntax}"
    rescue LoadError
    end
    SYNTAX[ syntax ].new
  end
  module_function :load

  # Return an array of the names of supported syntaxes.
  def all
    lang_dir = File.join(File.dirname(__FILE__), "syntax", "lang")
    Dir["#{lang_dir}/*.rb"].map { |path| File.basename(path, ".rb") }
  end
  module_function :all

end
