class Regextest::Front::BackRefer::BackRefer

Attributes

length[R]
offset[R]

Public Class Methods

new(type, value) click to toggle source

Constructor

# File lib/regextest/front/back-refer.rb, line 14
def initialize(type, value)
  TstLog("BackRefer: #{type} #{value}")
  @type = type
  @value = value[0]
  @offset = value[1]
  @length = value[2]
  @options = @@parse_options
  @paren_obj = nil
  @relative_num = nil
end

Public Instance Methods

get_paren(type, value) click to toggle source

get corresponding parenthesis object

# File lib/regextest/front/back-refer.rb, line 28
def get_paren(type, value)
  case type
  when :LEX_BACK_REFER    #  a pattern like \[1-9]
    if(md = value.match(/^\\(\d+)$/))
      @paren_obj = @options[:parens].get_paren(md[1].to_i)
    else
      raise "Error: Internal error, invalid back reference"
    end
  when :LEX_NAMED_REFER   # a pattern like \k<foo>, \k<1>, \k<-1>
    if(md = value.match(/(?u:^\\k[<']((\-\d+)|(\d+)|(\w+))(?:([\+\-]\d+))?[>']$)/))
      if md[2]       # \k<-1>
        @paren_obj = @options[:parens].get_paren(md[1], @offset)
      elsif md[3]    # \k<1>
        @paren_obj = @options[:parens].get_paren(md[1].to_i)
      elsif md[4]    # \k<foo>
        @paren_obj = @options[:parens].get_paren(md[1])
      else
        raise "internal error: unexpected refer #{value}"
      end
      if md[5]
        @relative_num = md[5].to_i
      end
    else
      raise "Error: Internal error, invalid named reference"
    end
  when :LEX_NAMED_GENERATE # a pattern like \g<foo>
    if(md = value.match(/(?u:^\\g[<'](([\-\+]\d+)|(\d+)|(\w+))[>']$)/))
      if md[2]       # \k<-1>
        @paren_obj = @options[:parens].get_paren(md[1], @offset)
      elsif md[3]    # \k<1>
        @paren_obj = @options[:parens].get_paren(md[1].to_i)
      elsif md[4]    # \k<foo>
        @paren_obj = @options[:parens].get_paren(md[1])
      else
        raise "internal error: unexpected refer #{value}"
      end
      
      if(!@paren_obj && md[1].match(/^\d+$/))
        paren_offset = md[1].to_i
        if paren_offset == 0
          @paren_obj = :WHOLE_REG_EXPRESSION
        else
          @paren_obj = @options[:parens].get_paren(paren_offset)
        end
      end
    else
      raise "Error: Internal error, invalid named reference"
    end
  else
    raise "Error: internal error. unexpected refer type"
  end
  @paren_obj
end
json() click to toggle source

transform to json format

# File lib/regextest/front/back-refer.rb, line 90
def json
  @paren_obj = get_paren(@type, @value)
  case @paren_obj
  when Regextest::Front::Parenthesis::Paren
    name = @paren_obj.name
    refer_name = @paren_obj.refer_name
  when :WHOLE_REG_EXPRESSION
    name = ""
    refer_name = "$$_0"
  else
    raise "Error: parenthesis not found: type: #{@type}, value: #{@value}"
  end
  
  @@id += 1
  "{\"type\": \"#{@type}\", " +
   "\"value\": \"#{@value}\", " +
   "\"offset\": \"#{@offset}\", " +
   "\"length\": \"#{@length}\", " +
   "\"name\": \"#{name}\", " +
  " \"id\": \"c#{@@id}\", " +
   "\"refer_name\": \"#{refer_name}\", " +
   "\"relative_num\": \"#{@relative_num}\" " +
   "}"
end
set_options(options) click to toggle source

set options

# File lib/regextest/front/back-refer.rb, line 83
def set_options(options)
  TstLog("BackRefer set_options: #{options[:reg_options].inspect}");
  # nothing to do
  self
end