class Uga_Uga

Constants

NEW_LINE_REGEXP
NOTHING
ONE_OR_MORE_SPACES
REX
REX_CACHE
ZERO_OR_MORE_SPACES

Attributes

captures[R]
line_num[R]
parent[R]
stack[R]

Public Class Methods

clean(arg) click to toggle source

This method is used mainly used in tests/specs to remove the “noise” (whitespace, empty lines, etc) during parsing.

# File lib/uga_uga.rb, line 27
def clean arg
  case arg

  when String
    str = arg.strip
    return nil if str.empty?
    str

  when Array
    arg.map { |unknown| clean unknown }.compact

  else
    arg

  end
end
new(str_or_arr = nil, *args) click to toggle source
# File lib/uga_uga.rb, line 106
def initialize str_or_arr = nil, *args
  @origin   = str_or_arr
  @instruct = block_given? ? Proc.new : nil
  @stack    = []

  @captures      = nil
  @parent        = nil
  file_or_number = nil

  args.each { |o|
    case o
    when Uga_Uga
      @parent = o
      file_or_number ||= o.line_num

    when Numeric
      file_or_number = o

    when String
      file_or_number = o

    else
      fail ArgumentError, "Unknown argument: #{o.inspect}"
    end
  }

  return unless @origin

  if str_or_arr.is_a?(String)
    str    = str_or_arr
    @lines = str_or_arr.split(NEW_LINE_REGEXP)
  else
    str    = nil
    @lines = str_or_arr
  end

  @origin   = str_or_arr
  @old      = []
  @line_num = if file_or_number.is_a? Numeric
                file_or_number
              else
                contents = File.read(file_or_number || __FILE__ )
                index    = contents.index(str || @lines.join("\n"))
                if index
                  contents[0,index + 1].split("\n").size
                else
                  1
                end
              end
  run
end
reg_exp(str, *custom) click to toggle source
# File lib/uga_uga.rb, line 44
def reg_exp str, *custom
  i = -1
  base = str.scan(REX).map { |arr|
    case
    when arr[0]
      ONE_OR_MORE_SPACES

    when arr[1]
      key = arr[1].strip

      case key
      when '...'
        /\ *([^\)]+?)\ */

      when '_'
        i += 1
        fail ArgumentError, "NO value set for #{i.inspect} -> #{str.inspect}" unless custom[i]
        '(' + custom[i].to_s + ')'

      when 'word'
        /\ *([^\ \)]+)\ */

      when 'white*'
        /([\ ]*)/

      when 'white'
        /([\ ]+)/

      when 'num'
        /\ *([0-9\.\_\-]+)\ */

      when /\A![^\!]+/
        /\ *([^#{Regexp.escape key.sub('!', '')}]+)\ */

      else
        fail ArgumentError, "Unknown value for Regexp: #{arr[1].inspect} in #{str.inspect}"
      end # === case key

    when arr[2]
      Regexp.escape arr[2]

    else
      fail ArgumentError, "#{str.inspect} -> #{REG_EXP.inspect}"
    end # === case
  }

  if base.first == ONE_OR_MORE_SPACES
    base.shift
    base.unshift ZERO_OR_MORE_SPACES
  end

  if base.last == ONE_OR_MORE_SPACES
    base.pop
    base.push ZERO_OR_MORE_SPACES
  end

  /\A#{base.join}\Z/
end

Public Instance Methods

l!() click to toggle source
# File lib/uga_uga.rb, line 168
def l!
  @lines.first
end
rex?(str, *args) click to toggle source
# File lib/uga_uga.rb, line 158
def rex? str, *args
  key     = [str,args].to_s
  reg_exp = ( REX_CACHE[key] ||= Uga_Uga.reg_exp(str, *args) )
  match = l!.match reg_exp
  @captures = match ?
                match.captures :
                nil
  !!match
end