Sha256: 2b456df3b30140f3ebe093cb2a7a255eed89ed0abf96bea47473145c42c5046e

Contents?: true

Size: 1.1 KB

Versions: 1

Compression:

Stored size: 1.1 KB

Contents

module Sexpr
  module Parser

    class << self

      def registered_parser_classes
        @registered_parser_classes ||= []
      end

      def register(parser_class)
        registered_parser_classes << parser_class
      end

      def find_parser_class(external_parser)
        registered_parser_classes.find{|cl|
          cl.recognizes?(external_parser)
        }
      end

      def factor(external_parser, options = {})
        return external_parser if Parser===external_parser
        if cl = find_parser_class(external_parser)
          cl.new(external_parser, options)
        else
          raise UnrecognizedParserError, "Parser not recognized: #{external_parser}"
        end
      end

    end # class methods

    private

    def input_text(input)
      case input
      when lambda{|x| x.respond_to?(:to_path)}
        input_text File.read(input.to_path)
      when IO
        input_text input.read
      when String
        input
      else
        raise InvalidParseSourceError, "Invalid parse source: #{input}"
      end
    end

  end # module Parser
end # module Sexpr
require_relative "parser/citrus"

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
sexpr-0.3.0 lib/sexpr/parser.rb