Sha256: fe8b10ddf8aad81c1ccf4eb9576dd7135a5ac46fc75fed6c00fb67e1738b7be2

Contents?: true

Size: 1.44 KB

Versions: 6

Compression:

Stored size: 1.44 KB

Contents

module Jkf::Parser
  class Base
    def parse(input)
      @input = input.clone

      @current_pos        = 0
      @reported_pos       = 0
      @cached_pos         = 0
      @cached_pos_details = { line: 1, column: 1, seenCR: false }
      @max_fail_pos       = 0
      @max_fail_expected  = []
      @silent_fails       = 0

      @result = parse_root

      if @result != :failded && @current_pos == @input.length
        return @result
      else
        fail({ type: "end", description: "end of input" }) if @result != :failed && @current_pos < input.length
        raise ParseError
      end
    end

    protected

    def match_regexp(reg)
      ret = nil
      if matched = reg.match(@input[@current_pos])
        ret = matched.to_s
        @current_pos += ret.size
      else
        ret = :failed
        fail({ type: "class", value: reg.inspect, description: reg.inspect }) if @silent_fails == 0
      end
      ret
    end

    def match_str(str)
      ret = nil
      if @input[@current_pos, str.size] == str
        ret = str
        @current_pos += str.size
      else
        ret = :failed
        fail({ type: "literal", value: str, description: "\"#{str}\"" }) if @slient_fails == 0
      end
      ret
    end

    def fail(expected)
      return if @current_pos < @max_fail_pos

      if @current_pos > @max_fail_pos
        @max_fail_pos = @current_pos
        @max_fail_expected = []
      end

      @max_fail_expected << expected
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
jkf-0.4.0 lib/jkf/parser/base.rb
jkf-0.3.3 lib/jkf/parser/base.rb
jkf-0.3.2 lib/jkf/parser/base.rb
jkf-0.3.1 lib/jkf/parser/base.rb
jkf-0.3.0 lib/jkf/parser/base.rb
jkf-0.2.2 lib/jkf/parser/base.rb