module Path::Parser

Constants

ENCODINGS
R_ENCODINGS

Public Instance Methods

bend(i) click to toggle source
# File lib/dense/parser.rb, line 42
def bend(i); str(nil, i, ']'); end
bindex(i) click to toggle source
# File lib/dense/parser.rb, line 66
def bindex(i)
  alt(:index, i, :dqname, :sqname, :star, :ses, :rxnames, :name, :blank)
end
bindexes(i) click to toggle source
# File lib/dense/parser.rb, line 69
def bindexes(i)
  jseq(:bindexes, i, :bindex, :comma_or_semicolon)
end
blank(i) click to toggle source
# File lib/dense/parser.rb, line 44
def blank(i); str(:blank, i, ''); end
bracket_index(i) click to toggle source
# File lib/dense/parser.rb, line 79
def bracket_index(i); seq(nil, i, :bstart, :bindexes, :bend); end
bstart(i) click to toggle source
# File lib/dense/parser.rb, line 43
def bstart(i); str(nil, i, '['); end
comma_or_semicolon(i) click to toggle source
# File lib/dense/parser.rb, line 40
def comma_or_semicolon(i); rex(nil, i, / *[,;] */); end
dot(i) click to toggle source
# File lib/dense/parser.rb, line 39
def dot(i); str(nil, i, '.'); end
dot_then_index(i) click to toggle source
# File lib/dense/parser.rb, line 80
def dot_then_index(i); seq(nil, i, :dot, :simple_index); end
dotdot(i) click to toggle source
# File lib/dense/parser.rb, line 77
def dotdot(i); str(:dotdot, i, '.'); end
dotdotstar(i) click to toggle source
# File lib/dense/parser.rb, line 78
def dotdotstar(i); rex(:dotdotstar, i, /(\.\.\*|\.\[\*\])/); end
dqname(i) click to toggle source
# File lib/dense/parser.rb, line 17
def dqname(i)

  rex(:qname, i, %r{
    "(
      \\["\\\/bfnrt] |
      \\u[0-9a-fA-F]{4} |
      [^"\\\b\f\n\r\t]
    )*"
  }x)
end
escape(i) click to toggle source
# File lib/dense/parser.rb, line 64
def escape(i); rex(:esc, i, /\\[.*]/); end
index(i) click to toggle source
# File lib/dense/parser.rb, line 82
def index(i)
  alt(nil, i, :dot_then_index, :bracket_index, :dotdotstar, :dotdot)
end
name(i) click to toggle source
# File lib/dense/parser.rb, line 46
def name(i); rex(:name, i, /[-+%^<>a-zA-Z0-9_\/\\=?!]+/); end
off(i) click to toggle source
# File lib/dense/parser.rb, line 47
def off(i); rex(:off, i, /-?\d+(?=(\.|\[|\z))/); end
path(i) click to toggle source
# File lib/dense/parser.rb, line 86
def path(i); rep(:path, i, :index, 1); end
rewrite_bindexes(t) click to toggle source
# File lib/dense/parser.rb, line 112
def rewrite_bindexes(t);
  indexes = t.subgather.collect { |tt| rewrite(tt) }
  indexes.length == 1 ? indexes[0] : indexes.compact
end
rewrite_blank(t) click to toggle source
# File lib/dense/parser.rb, line 117
def rewrite_blank(t); nil; end
rewrite_dotdot(t) click to toggle source
# File lib/dense/parser.rb, line 108
def rewrite_dotdot(t); :dot; end
rewrite_dotdotstar(t) click to toggle source
# File lib/dense/parser.rb, line 109
def rewrite_dotdotstar(t); :dotstar; end
rewrite_esc(t) click to toggle source
# File lib/dense/parser.rb, line 106
def rewrite_esc(t); t.string[1, 1]; end
rewrite_index(t) click to toggle source
# File lib/dense/parser.rb, line 111
def rewrite_index(t); rewrite(t.sublookup); end
rewrite_name(t) click to toggle source
# File lib/dense/parser.rb, line 144
def rewrite_name(t); t.string; end
rewrite_off(t) click to toggle source
# File lib/dense/parser.rb, line 110
def rewrite_off(t); t.string.to_i; end
rewrite_path(t) click to toggle source
# File lib/dense/parser.rb, line 146
def rewrite_path(t)

  t.subgather
    .collect { |tt|
      rewrite(tt) }
    .inject([]) { |a, e| # remove double :dot
      next (a << e) unless a.last == :dot
      a.pop if e == :dotstar
      a << e unless e == :dot
      a }
end
rewrite_qname(t) click to toggle source
# File lib/dense/parser.rb, line 143
def rewrite_qname(t); t.string[1..-2]; end
rewrite_rxnames(t) click to toggle source
# File lib/dense/parser.rb, line 124
def rewrite_rxnames(t)

  m = t.string.match(/\A\/(.+)\/([imxuesn]*)\z/)

  s = m[1]

  e = ENCODINGS[(m[2].match(/[uesn]/) || [])[0]]
  #s = s.force_encoding(e) if e
  s = s.encode(e) if e

  flags = 0
  flags = flags | Regexp::EXTENDED if m[2].index('x')
  flags = flags | Regexp::IGNORECASE if m[2].index('i')
  #flags = flags | Regexp::MULTILINE if m[2].index('m')
  flags = flags | Regexp::FIXEDENCODING if e

  Regexp.new(s, flags)
end
rewrite_ses(t) click to toggle source

rewrite parsed tree

# File lib/dense/parser.rb, line 90
def rewrite_ses(t)

  s = t.string

  if (a = s.split(',')).length == 2
    { start: a[0].to_i, count: a[1].to_i }
  else
    a = s.split(':').collect { |e| e.empty? ? nil : e.to_i }
    if a[1] == nil && a[2] == nil
      a[0]
    else
      { start: a[0], end: a[1], step: a[2] }
    end
  end
end
rewrite_star(t) click to toggle source
# File lib/dense/parser.rb, line 107
def rewrite_star(t); :star; end
rxnames(i) click to toggle source

piece parsers bottom to top

# File lib/dense/parser.rb, line 6
def rxnames(i)

  rex(:rxnames, i, %r{
    /(
      \\[\/bfnrt] |
      \\u[0-9a-fA-F]{4} |
      [^/\b\f\n\r\t]
    )*/[imxouesn]*
  }x)
end
ses(i) click to toggle source
# File lib/dense/parser.rb, line 52
def ses(i) # start:end:step
  rex(
    :ses,
    i,
    /(
      (-?\d+)?:(-?\d+)?:(-?\d+)? |
      (-?\d+)?:(-?\d+)? |
      (-?\d+)?,(\d+)? |
      -?\d+
    )/x)
end
simple_index(i) click to toggle source
# File lib/dense/parser.rb, line 73
def simple_index(i)
  alt(:index, i, :off, :escape, :star, :rxnames, :name)
end
sqname(i) click to toggle source
# File lib/dense/parser.rb, line 28
def sqname(i)

  rex(:qname, i, %r{
    '(
      \\['\\\/bfnrt] |
      \\u[0-9a-fA-F]{4} |
      [^'\\\b\f\n\r\t]
    )*'
  }x)
end
star(i) click to toggle source

positive lookahead so that “0_1_2” is not parsed as “0” and whatever…

# File lib/dense/parser.rb, line 50
def star(i); str(:star, i, '*'); end