rack-mount 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -62,21 +62,21 @@ module Rack::Mount
62
62
  if part.is_a?(Reginald::Group)
63
63
  if index > 0
64
64
  previous = parts[index-1]
65
- if previous.is_a?(Reginald::Character)
66
- boundaries << previous.to_str
65
+ if previous.literal?
66
+ boundaries << previous.value
67
67
  end
68
68
  end
69
69
 
70
70
  if inside = part[0][0]
71
- if inside.is_a?(Reginald::Character)
72
- boundaries << inside.to_str
71
+ if inside.literal?
72
+ boundaries << inside.value
73
73
  end
74
74
  end
75
75
 
76
76
  if index < parts.length
77
77
  following = parts[index+1]
78
- if following.is_a?(Reginald::Character)
79
- boundaries << following.to_str
78
+ if following.literal?
79
+ boundaries << following.value
80
80
  end
81
81
  end
82
82
  end
@@ -99,11 +99,15 @@ module Rack::Mount
99
99
  buf = nil
100
100
  break
101
101
  end
102
+ when Reginald::CharacterClass
103
+ break if separators.any? { |s| part.include?(s) }
104
+ buf = nil
105
+ segments << part.to_regexp
102
106
  when Reginald::Character
103
107
  if separators.any? { |s| part.include?(s) }
104
108
  segments << join_buffer(buf, regexp) if buf
105
109
  peek = parts[index+1]
106
- if peek.is_a?(Reginald::Character) && separators.include?(peek)
110
+ if peek.is_a?(Reginald::Character) && separators.include?(peek.value)
107
111
  segments << ''
108
112
  end
109
113
  buf = nil
@@ -126,10 +130,6 @@ module Rack::Mount
126
130
  else
127
131
  break
128
132
  end
129
- when Reginald::CharacterClass
130
- break if separators.any? { |s| part.include?(s) }
131
- buf = nil
132
- segments << part.to_regexp
133
133
  else
134
134
  break
135
135
  end
@@ -68,10 +68,12 @@ module Rack::Mount
68
68
  when Reginald::Anchor
69
69
  # ignore
70
70
  when Reginald::Character
71
+ throw :halt unless part.literal?
72
+
71
73
  if s.last.is_a?(String)
72
- s.last << part.dup
74
+ s.last << part.value.dup
73
75
  else
74
- s << part.dup
76
+ s << part.value.dup
75
77
  end
76
78
  when Reginald::Group
77
79
  if part.name
@@ -126,7 +126,7 @@ module Rack::Mount
126
126
  end
127
127
 
128
128
  expression
129
- rescue Racc::ParseError
129
+ rescue Racc::ParseError, Reginald::Parser::ScanError
130
130
  []
131
131
  end
132
132
  module_function :parse_regexp
@@ -1,55 +1,58 @@
1
1
  module Reginald
2
2
  autoload :Alternation, 'reginald/alternation'
3
3
  autoload :Anchor, 'reginald/anchor'
4
+ autoload :Atom, 'reginald/atom'
4
5
  autoload :Character, 'reginald/character'
5
6
  autoload :CharacterClass, 'reginald/character_class'
6
7
  autoload :Expression, 'reginald/expression'
7
8
  autoload :Group, 'reginald/group'
8
9
  autoload :Parser, 'reginald/parser'
9
10
 
10
- begin
11
- eval('/(?<foo>.*)/').named_captures
11
+ class << self
12
+ begin
13
+ eval('/(?<foo>.*)/').named_captures
12
14
 
13
- def self.regexp_supports_named_captures?
14
- true
15
+ def regexp_supports_named_captures?
16
+ true
17
+ end
18
+ rescue SyntaxError, NoMethodError
19
+ def regexp_supports_named_captures?
20
+ false
21
+ end
15
22
  end
16
- rescue SyntaxError, NoMethodError
17
- def self.regexp_supports_named_captures?
18
- false
23
+
24
+ def parse(regexp)
25
+ regexp = strip_extended_whitespace_and_comments(regexp)
26
+
27
+ parser = Parser.new
28
+ parser.capture_index = 0
29
+ parser.capture_index_stack = []
30
+ expression = parser.scan_str(regexp.source)
31
+
32
+ expression.ignorecase = regexp.casefold?
33
+
34
+ expression
19
35
  end
20
- end
21
36
 
22
- def self.parse(regexp)
23
- # TODO: The parser should be aware of extended expressions
24
- # instead of having to sanitize them before.
25
- if regexp.options & Regexp::EXTENDED != 0
26
- source = regexp.source
27
- source.gsub!(/#.+$/, '')
28
- source.gsub!(/\s+/, '')
29
- source.gsub!(/\\\//, '/')
37
+ def compile(source)
30
38
  regexp = Regexp.compile(source)
39
+ expression = parse(regexp)
40
+ Regexp.compile(expression.to_s_without_options, expression.options)
31
41
  end
32
42
 
33
- parser = Parser.new
34
- expression = parser.scan_str(regexp.source)
35
- expression.ignorecase = regexp.casefold?
36
-
37
- capture_index = 0
38
- tag_captures = Proc.new do |expr|
39
- expr.each do |atom|
40
- if atom.is_a?(Group)
41
- if atom.capture
42
- atom.index = capture_index
43
- capture_index += 1
44
- end
45
- tag_captures.call(atom)
46
- elsif atom.is_a?(Expression)
47
- tag_captures.call(atom)
43
+ private
44
+ # TODO: The parser should be aware of extended expressions
45
+ # instead of having to sanitize them before.
46
+ def strip_extended_whitespace_and_comments(regexp)
47
+ if regexp.options & Regexp::EXTENDED != 0
48
+ source = regexp.source
49
+ source.gsub!(/#.+$/, '')
50
+ source.gsub!(/\s+/, '')
51
+ source.gsub!(/\\\//, '/')
52
+ regexp = Regexp.compile(source)
53
+ else
54
+ regexp
48
55
  end
49
56
  end
50
- end
51
- tag_captures.call(expression)
52
-
53
- expression
54
57
  end
55
58
  end
@@ -11,7 +11,7 @@ module Reginald
11
11
  end
12
12
 
13
13
  def initialize(*args)
14
- if args.length == 1 && args.first.is_a?(Array)
14
+ if args.length == 1 && args.first.instance_of?(Array)
15
15
  super(args.first)
16
16
  else
17
17
  super(args)
@@ -1,20 +1,4 @@
1
1
  module Reginald
2
- class Anchor < Struct.new(:value)
3
- def to_s
4
- "#{value}"
5
- end
6
-
7
- def inspect
8
- to_s.inspect
9
- end
10
-
11
- def literal?
12
- false
13
- end
14
-
15
- def freeze
16
- value.freeze
17
- super
18
- end
2
+ class Anchor < Atom
19
3
  end
20
4
  end
@@ -0,0 +1,20 @@
1
+ module Reginald
2
+ class Atom < Struct.new(:value)
3
+ def literal?
4
+ false
5
+ end
6
+
7
+ def to_s
8
+ "#{value}"
9
+ end
10
+
11
+ def inspect
12
+ "#<#{self.class.to_s.sub('Reginald::', '')} #{to_s.inspect}>"
13
+ end
14
+
15
+ def freeze
16
+ value.freeze
17
+ super
18
+ end
19
+ end
20
+ end
@@ -1,34 +1,25 @@
1
1
  module Reginald
2
- class Character < String
2
+ class Character < Atom
3
3
  attr_accessor :quantifier
4
4
 
5
- def initialize(char)
6
- raise ArgumentError if char.length != 1
7
- super
8
- end
9
-
10
5
  def literal?
11
6
  quantifier.nil?
12
7
  end
13
8
 
14
9
  def to_s
15
- "#{super}#{quantifier}"
10
+ "#{value}#{quantifier}"
16
11
  end
17
12
 
18
13
  def to_regexp
19
14
  Regexp.compile("\\A#{to_s}\\Z")
20
15
  end
21
16
 
22
- def inspect
23
- to_s.inspect
24
- end
25
-
26
17
  def match(char)
27
18
  to_regexp.match(char)
28
19
  end
29
20
 
30
21
  def include?(char)
31
- to_str == char
22
+ value == char
32
23
  end
33
24
 
34
25
  def ==(other)
@@ -41,8 +32,9 @@ module Reginald
41
32
  end
42
33
 
43
34
  def eql?(other)
44
- other.is_a?(self.class) && super &&
45
- self.quantifier == other.quantifier
35
+ other.is_a?(self.class) &&
36
+ value.eql?(other.value) &&
37
+ quantifier.eql?(other.quantifier)
46
38
  end
47
39
 
48
40
  def freeze
@@ -1,6 +1,21 @@
1
1
  module Reginald
2
- class CharacterClass < Struct.new(:value)
3
- attr_accessor :negate, :quantifier
2
+ class CharacterClass < Character
3
+ ALNUM = new(':alnum:').freeze
4
+ ALPHA = new(':alpha:').freeze
5
+ ASCII = new(':ascii:').freeze
6
+ BLANK = new(':blank:').freeze
7
+ CNTRL = new(':cntrl:').freeze
8
+ DIGIT = new(':digit:').freeze
9
+ GRAPH = new(':graph:').freeze
10
+ LOWER = new(':lower:').freeze
11
+ PRINT = new(':print:').freeze
12
+ PUNCT = new(':punct:').freeze
13
+ SPACE = new(':space:').freeze
14
+ UPPER = new(':upper:').freeze
15
+ WORD = new(':word:').freeze
16
+ XDIGIT = new(':xdigit:').freeze
17
+
18
+ attr_accessor :negate
4
19
 
5
20
  def negated?
6
21
  negate ? true : false
@@ -11,50 +26,26 @@ module Reginald
11
26
  end
12
27
 
13
28
  def to_s
14
- if value == '.' || value == '\d'
15
- "#{value}#{quantifier}"
29
+ if value == '.' || value =~ /^\\[dDsSwW]$/
30
+ super
16
31
  else
17
32
  "[#{negate && '^'}#{value}]#{quantifier}"
18
33
  end
19
34
  end
20
35
 
21
- def to_regexp
22
- Regexp.compile("\\A#{to_s}\\Z")
23
- end
24
-
25
- def inspect
26
- to_s.inspect
27
- end
28
-
29
- def match(char)
30
- to_regexp.match(char)
31
- end
32
-
33
36
  def include?(char)
34
37
  re = quantifier ? to_s.sub(/#{Regexp.escape(quantifier)}$/, '') : to_s
35
38
  Regexp.compile("\\A#{re}\\Z").match(char)
36
39
  end
37
40
 
38
- def ==(other)
39
- case other
40
- when String
41
- other == to_s
42
- else
43
- eql?(other)
44
- end
45
- end
46
-
47
41
  def eql?(other)
48
42
  other.is_a?(self.class) &&
49
- self.value == other.value &&
50
- self.negate == other.negate &&
51
- self.quantifier == other.quantifier
43
+ negate == other.negate &&
44
+ super
52
45
  end
53
46
 
54
47
  def freeze
55
- value.freeze
56
48
  negate.freeze
57
- quantifier.freeze
58
49
  super
59
50
  end
60
51
  end
@@ -1,6 +1,6 @@
1
1
  module Reginald
2
2
  class Expression < Array
3
- attr_accessor :ignorecase
3
+ attr_accessor :multiline, :ignorecase, :extended
4
4
 
5
5
  def self.reduce(expression_or_atom, atom = nil)
6
6
  if expression_or_atom.is_a?(Expression)
@@ -14,11 +14,12 @@ module Reginald
14
14
  end
15
15
 
16
16
  def initialize(*args)
17
- @ignorecase = false
17
+ @multiline = @ignorecase = @extended = false
18
18
 
19
- if args.length == 1 && args.first.is_a?(Array)
19
+ if args.length == 1 && args.first.instance_of?(Array)
20
20
  super(args.first)
21
21
  else
22
+ args = args.map { |e| e.instance_of?(String) ? Character.new(e) : e }
22
23
  super(args)
23
24
  end
24
25
  end
@@ -27,12 +28,36 @@ module Reginald
27
28
  ignorecase == false && all? { |e| e.literal? }
28
29
  end
29
30
 
30
- def to_s
31
+ def options
32
+ flag = 0
33
+ flag |= Regexp::MULTILINE if multiline
34
+ flag |= Regexp::IGNORECASE if ignorecase
35
+ flag |= Regexp::EXTENDED if extended
36
+ flag
37
+ end
38
+
39
+ def to_s_without_options
31
40
  map { |e| e.to_s }.join
32
41
  end
33
42
 
43
+ def to_s
44
+ if options == 0
45
+ to_s_without_options
46
+ else
47
+ with, without = [], []
48
+ multiline ? (with << 'm') : (without << 'm')
49
+ ignorecase ? (with << 'i') : (without << 'i')
50
+ extended ? (with << 'x') : (without << 'x')
51
+
52
+ with = with.join
53
+ without = without.any? ? "-#{without.join}" : ''
54
+
55
+ "(?#{with}#{without}:#{to_s_without_options})"
56
+ end
57
+ end
58
+
34
59
  def to_regexp
35
- Regexp.compile("\\A#{to_s}\\Z")
60
+ Regexp.compile("\\A#{to_s_without_options}\\Z", options)
36
61
  end
37
62
 
38
63
  def inspect
@@ -64,7 +89,9 @@ module Reginald
64
89
 
65
90
  def eql?(other)
66
91
  other.is_a?(self.class) && super &&
67
- self.ignorecase == other.ignorecase
92
+ self.multiline == other.multiline &&
93
+ self.ignorecase == other.ignorecase &&
94
+ self.extended == other.extended
68
95
  end
69
96
 
70
97
  def freeze
@@ -12,7 +12,13 @@ module Reginald
12
12
  end
13
13
 
14
14
  def to_s
15
- "(#{capture ? '' : '?:'}#{expression.to_s})#{quantifier}"
15
+ if expression.options == 0
16
+ "(#{capture ? '' : '?:'}#{expression.to_s_without_options})#{quantifier}"
17
+ elsif capture == false
18
+ "#{expression.to_s}#{quantifier}"
19
+ else
20
+ "(#{expression.to_s})#{quantifier}"
21
+ end
16
22
  end
17
23
 
18
24
  def to_regexp
@@ -7,124 +7,153 @@
7
7
  require 'racc/parser.rb'
8
8
 
9
9
  require 'reginald/tokenizer'
10
+
10
11
  module Reginald
11
12
  class Parser < Racc::Parser
13
+
14
+ attr_accessor :capture_index
15
+ attr_accessor :capture_index_stack
12
16
  ##### State transition tables begin ###
13
17
 
14
18
  racc_action_table = [
15
- 5, 31, 11, 6, 7, 9, 40, 10, 45, 14,
16
- 5, 12, 11, 6, 7, 9, 41, 10, 37, 14,
17
- 5, 12, 11, 6, 7, 9, 28, 10, 47, 14,
18
- 5, 12, 11, 6, 7, 9, 48, 10, 46, nil,
19
- 5, 12, 11, 6, 7, 9, 13, 10, 14, nil,
20
- 5, 12, 11, 6, 7, 9, 27, 10, 38, 39,
21
- 5, 12, 11, 6, 7, 9, 19, 10, nil, 19,
22
- nil, 12, 17, 18, 20, 17, 18, 20, 32, nil,
23
- nil, 34, 33, 35, 42, nil, nil, 34, 33, 35,
24
- 22, nil, 24, 23, 25, 24, 23, 25 ]
19
+ 1, 17, 18, 18, 7, 8, 10, 11, 46, 18,
20
+ 1, 43, 2, 4, 7, 8, 10, 11, 58, 45,
21
+ 1, 53, 2, 4, 7, 8, 10, 11, 47, 18,
22
+ 1, 61, 2, 4, 7, 8, 10, 11, 59, 18,
23
+ 1, 27, 2, 4, 7, 8, 10, 11, 62, 15,
24
+ 1, 34, 2, 4, 7, 8, 10, 11, 31, 25,
25
+ 1, nil, 2, 4, 7, 8, 10, 11, nil, nil,
26
+ 1, nil, 2, 4, 7, 8, 10, 11, 40, 41,
27
+ 29, nil, 2, 4, 30, 20, 42, 35, 37, 39,
28
+ 21, 22, 24, 20, 49, 35, 37, 39, 21, 22,
29
+ 24, 13, nil, 14, 44, nil, 15, nil, 30, 56,
30
+ 35, 37, 39, 35, 37, 39, 35, 37, 39, 35,
31
+ 37, 39, 35, 37, 39, 35, 37, 39, 35, 37,
32
+ 39 ]
25
33
 
26
34
  racc_action_check = [
27
- 0, 20, 0, 0, 0, 0, 31, 0, 40, 26,
28
- 39, 0, 39, 39, 39, 39, 31, 39, 26, 44,
29
- 2, 39, 2, 2, 2, 2, 13, 2, 44, 43,
30
- 14, 2, 14, 14, 14, 14, 45, 14, 43, nil,
31
- 29, 14, 29, 29, 29, 29, 1, 29, 1, nil,
32
- 10, 29, 10, 10, 10, 10, 10, 10, 27, 27,
33
- 38, 10, 38, 38, 38, 38, 3, 38, nil, 15,
34
- nil, 38, 3, 3, 3, 15, 15, 15, 21, nil,
35
- nil, 21, 21, 21, 36, nil, nil, 36, 36, 36,
36
- 5, nil, 5, 5, 5, 22, 22, 22 ]
35
+ 0, 3, 26, 3, 0, 0, 0, 0, 34, 50,
36
+ 47, 26, 0, 0, 47, 47, 47, 47, 50, 34,
37
+ 41, 46, 47, 47, 41, 41, 41, 41, 36, 51,
38
+ 5, 53, 41, 41, 5, 5, 5, 5, 51, 54,
39
+ 32, 13, 5, 5, 32, 32, 32, 32, 54, 14,
40
+ 11, 24, 32, 32, 11, 11, 11, 11, 17, 11,
41
+ 18, nil, 11, 11, 18, 18, 18, 18, nil, nil,
42
+ 40, nil, 18, 18, 40, 40, 40, 40, 25, 25,
43
+ 16, nil, 40, 40, 16, 19, 25, 25, 25, 25,
44
+ 19, 19, 19, 6, 38, 38, 38, 38, 6, 6,
45
+ 6, 1, nil, 1, 28, nil, 1, nil, 28, 48,
46
+ 48, 48, 48, 52, 52, 52, 56, 56, 56, 57,
47
+ 57, 57, 60, 60, 60, 49, 49, 49, 42, 42,
48
+ 42 ]
37
49
 
38
50
  racc_action_pointer = [
39
- -3, 46, 17, 57, nil, 85, nil, nil, nil, nil,
40
- 47, nil, nil, 26, 27, 60, nil, nil, nil, nil,
41
- -7, 74, 88, nil, nil, nil, 7, 46, nil, 37,
42
- nil, -2, nil, nil, nil, nil, 80, nil, 57, 7,
43
- 0, nil, nil, 27, 17, 18, nil, nil, nil ]
51
+ -3, 97, nil, 1, nil, 27, 81, nil, nil, nil,
52
+ nil, 47, nil, 36, 40, nil, 75, 58, 57, 73,
53
+ nil, nil, nil, nil, 42, 65, 0, nil, 99, nil,
54
+ nil, nil, 37, nil, -1, nil, 15, nil, 73, nil,
55
+ 67, 17, 106, nil, nil, nil, 12, 7, 88, 103,
56
+ 7, 27, 91, 11, 37, nil, 94, 97, nil, nil,
57
+ 100, nil, nil, nil, nil, nil ]
44
58
 
45
59
  racc_action_default = [
46
- -30, -30, -2, -6, -7, -30, -10, -11, -12, -13,
47
- -30, -23, -24, -30, -30, -4, -5, -25, -26, -27,
48
- -30, -30, -30, -17, -18, -19, -30, -30, 49, -1,
49
- -3, -30, -8, -14, -15, -16, -30, -20, -30, -30,
50
- -30, -29, -9, -30, -30, -30, -21, -22, -28 ]
60
+ -35, -35, -21, -35, -22, -2, -6, -11, -12, -7,
61
+ -14, -35, -13, -35, -35, -16, -35, -35, -35, -4,
62
+ -25, -23, -24, -5, -35, -35, -35, -8, -35, -9,
63
+ -15, 66, -1, -3, -35, -32, -35, -33, -35, -34,
64
+ -35, -35, -35, -17, -10, -27, -35, -35, -35, -35,
65
+ -35, -35, -35, -35, -35, -31, -35, -35, -19, -20,
66
+ -35, -26, -18, -30, -29, -28 ]
51
67
 
52
68
  racc_goto_table = [
53
- 1, 15, 21, 16, 29, nil, nil, nil, nil, nil,
54
- 26, nil, nil, nil, nil, 30, nil, nil, nil, 36,
55
- nil, nil, nil, nil, nil, nil, nil, nil, 15, nil,
56
- nil, nil, nil, nil, nil, nil, nil, nil, 43, 44 ]
69
+ 3, 38, 19, 16, 23, 36, 32, nil, nil, nil,
70
+ nil, 26, nil, nil, 48, nil, 28, 33, 52, nil,
71
+ nil, nil, nil, nil, 55, 57, nil, nil, 60, 19,
72
+ nil, nil, 63, 64, nil, nil, 65, nil, nil, nil,
73
+ 50, 51, nil, nil, nil, nil, nil, 54 ]
57
74
 
58
75
  racc_goto_check = [
59
- 1, 3, 6, 4, 2, nil, nil, nil, nil, nil,
60
- 1, nil, nil, nil, nil, 4, nil, nil, nil, 6,
61
- nil, nil, nil, nil, nil, nil, nil, nil, 3, nil,
62
- nil, nil, nil, nil, nil, nil, nil, nil, 1, 1 ]
76
+ 1, 9, 3, 6, 4, 8, 2, nil, nil, nil,
77
+ nil, 1, nil, nil, 9, nil, 6, 4, 9, nil,
78
+ nil, nil, nil, nil, 9, 9, nil, nil, 9, 3,
79
+ nil, nil, 9, 9, nil, nil, 9, nil, nil, nil,
80
+ 1, 1, nil, nil, nil, nil, nil, 1 ]
63
81
 
64
82
  racc_goto_pointer = [
65
- nil, 0, -10, -1, 0, nil, -3, nil ]
83
+ nil, 0, -12, -3, -2, nil, 2, nil, -20, -24 ]
66
84
 
67
85
  racc_goto_default = [
68
- nil, nil, 2, 3, nil, 4, nil, 8 ]
86
+ nil, nil, 5, 6, nil, 9, nil, 12, nil, nil ]
69
87
 
70
88
  racc_reduce_table = [
71
89
  0, 0, :racc_error,
72
- 3, 20, :_reduce_1,
73
- 1, 20, :_reduce_2,
74
- 3, 21, :_reduce_3,
75
- 2, 21, :_reduce_4,
76
- 2, 21, :_reduce_5,
77
- 1, 21, :_reduce_none,
78
- 1, 22, :_reduce_none,
79
- 3, 22, :_reduce_8,
80
- 4, 22, :_reduce_9,
81
- 1, 22, :_reduce_10,
82
- 1, 22, :_reduce_11,
83
- 1, 22, :_reduce_12,
84
- 1, 22, :_reduce_13,
85
- 2, 25, :_reduce_14,
86
- 2, 25, :_reduce_15,
87
- 2, 25, :_reduce_16,
88
- 1, 25, :_reduce_none,
89
- 1, 25, :_reduce_none,
90
- 1, 25, :_reduce_none,
91
- 3, 24, :_reduce_20,
92
- 5, 24, :_reduce_21,
93
- 5, 24, :_reduce_22,
94
- 1, 26, :_reduce_none,
95
- 1, 26, :_reduce_none,
96
- 1, 23, :_reduce_none,
97
- 1, 23, :_reduce_none,
98
- 1, 23, :_reduce_none,
99
- 5, 23, :_reduce_28,
100
- 3, 23, :_reduce_29 ]
101
-
102
- racc_reduce_n = 30
103
-
104
- racc_shift_n = 49
90
+ 3, 26, :_reduce_1,
91
+ 1, 26, :_reduce_2,
92
+ 3, 27, :_reduce_3,
93
+ 2, 27, :_reduce_4,
94
+ 2, 27, :_reduce_5,
95
+ 1, 27, :_reduce_none,
96
+ 1, 28, :_reduce_none,
97
+ 3, 28, :_reduce_8,
98
+ 3, 28, :_reduce_9,
99
+ 4, 28, :_reduce_10,
100
+ 1, 28, :_reduce_11,
101
+ 1, 28, :_reduce_12,
102
+ 1, 28, :_reduce_13,
103
+ 1, 28, :_reduce_14,
104
+ 2, 31, :_reduce_15,
105
+ 1, 31, :_reduce_none,
106
+ 3, 30, :_reduce_17,
107
+ 6, 30, :_reduce_18,
108
+ 5, 30, :_reduce_19,
109
+ 5, 30, :_reduce_20,
110
+ 1, 32, :_reduce_none,
111
+ 1, 32, :_reduce_none,
112
+ 1, 29, :_reduce_none,
113
+ 1, 29, :_reduce_none,
114
+ 1, 29, :_reduce_none,
115
+ 5, 29, :_reduce_26,
116
+ 3, 29, :_reduce_27,
117
+ 4, 33, :_reduce_28,
118
+ 4, 33, :_reduce_29,
119
+ 4, 33, :_reduce_30,
120
+ 3, 33, :_reduce_31,
121
+ 1, 34, :_reduce_32,
122
+ 1, 34, :_reduce_33,
123
+ 1, 34, :_reduce_34 ]
124
+
125
+ racc_reduce_n = 35
126
+
127
+ racc_shift_n = 66
105
128
 
106
129
  racc_token_table = {
107
130
  false => 0,
108
131
  :error => 1,
109
132
  :BAR => 2,
110
133
  :LBRACK => 3,
111
- :RBRACK => 4,
112
- :L_ANCHOR => 5,
113
- :CHAR_CLASS => 6,
114
- :DOT => 7,
115
- :CHAR => 8,
116
- :QMARK => 9,
134
+ :LC_CTYPE => 4,
135
+ :RBRACK => 5,
136
+ :NEGATE => 6,
137
+ :CCLASS => 7,
138
+ :DOT => 8,
139
+ :CHAR => 9,
117
140
  :LPAREN => 10,
118
141
  :RPAREN => 11,
119
- :COLON => 12,
120
- :NAME => 13,
121
- :R_ANCHOR => 14,
122
- :STAR => 15,
123
- :PLUS => 16,
124
- :LCURLY => 17,
125
- :RCURLY => 18 }
126
-
127
- racc_nt_base = 19
142
+ :QMARK => 12,
143
+ :COLON => 13,
144
+ :NAME => 14,
145
+ :L_ANCHOR => 15,
146
+ :R_ANCHOR => 16,
147
+ :STAR => 17,
148
+ :PLUS => 18,
149
+ :LCURLY => 19,
150
+ :RCURLY => 20,
151
+ :MINUS => 21,
152
+ :MULTILINE => 22,
153
+ :IGNORECASE => 23,
154
+ :EXTENDED => 24 }
155
+
156
+ racc_nt_base = 25
128
157
 
129
158
  racc_use_result_var = true
130
159
 
@@ -149,21 +178,27 @@ Racc_token_to_s_table = [
149
178
  "error",
150
179
  "BAR",
151
180
  "LBRACK",
181
+ "LC_CTYPE",
152
182
  "RBRACK",
153
- "L_ANCHOR",
154
- "CHAR_CLASS",
183
+ "NEGATE",
184
+ "CCLASS",
155
185
  "DOT",
156
186
  "CHAR",
157
- "QMARK",
158
187
  "LPAREN",
159
188
  "RPAREN",
189
+ "QMARK",
160
190
  "COLON",
161
191
  "NAME",
192
+ "L_ANCHOR",
162
193
  "R_ANCHOR",
163
194
  "STAR",
164
195
  "PLUS",
165
196
  "LCURLY",
166
197
  "RCURLY",
198
+ "MINUS",
199
+ "MULTILINE",
200
+ "IGNORECASE",
201
+ "EXTENDED",
167
202
  "$start",
168
203
  "expression",
169
204
  "branch",
@@ -171,7 +206,9 @@ Racc_token_to_s_table = [
171
206
  "quantifier",
172
207
  "group",
173
208
  "bracket_expression",
174
- "anchor" ]
209
+ "anchor",
210
+ "options",
211
+ "modifier" ]
175
212
 
176
213
  Racc_debug_parser = false
177
214
 
@@ -180,7 +217,7 @@ Racc_debug_parser = false
180
217
  # reduce 0 omitted
181
218
 
182
219
  def _reduce_1(val, _values, result)
183
- result = Expression.new([Alternation.reduce(val[0], val[2])])
220
+ result = Expression.new(Alternation.reduce(val[0], val[2]))
184
221
  result
185
222
  end
186
223
 
@@ -213,37 +250,37 @@ end
213
250
  # reduce 7 omitted
214
251
 
215
252
  def _reduce_8(val, _values, result)
216
- result = CharacterClass.new(val[1])
253
+ result = val[1]
217
254
  result
218
255
  end
219
256
 
220
257
  def _reduce_9(val, _values, result)
221
- result = CharacterClass.new(val[2]); result.negate = true
258
+ result = CharacterClass.new(val[1])
222
259
  result
223
260
  end
224
261
 
225
262
  def _reduce_10(val, _values, result)
226
- result = CharacterClass.new(val[0])
263
+ result = CharacterClass.new(val[2]); result.negate = true
227
264
  result
228
265
  end
229
266
 
230
267
  def _reduce_11(val, _values, result)
231
- result = CharacterClass.new(val[0])
268
+ result = val[0]
232
269
  result
233
270
  end
234
271
 
235
272
  def _reduce_12(val, _values, result)
236
- result = Anchor.new(val[0])
273
+ result = CharacterClass.new('.')
237
274
  result
238
275
  end
239
276
 
240
277
  def _reduce_13(val, _values, result)
241
- result = Character.new(val[0])
278
+ result = Anchor.new(val[0])
242
279
  result
243
280
  end
244
281
 
245
282
  def _reduce_14(val, _values, result)
246
- result = val.join
283
+ result = Character.new(val[0])
247
284
  result
248
285
  end
249
286
 
@@ -252,49 +289,93 @@ def _reduce_15(val, _values, result)
252
289
  result
253
290
  end
254
291
 
255
- def _reduce_16(val, _values, result)
256
- result = val.join
292
+ # reduce 16 omitted
293
+
294
+ def _reduce_17(val, _values, result)
295
+ result = Group.new(val[1])
296
+ result.index = @capture_index_stack.pop
297
+
257
298
  result
258
299
  end
259
300
 
260
- # reduce 17 omitted
261
-
262
- # reduce 18 omitted
263
-
264
- # reduce 19 omitted
265
-
266
- def _reduce_20(val, _values, result)
267
- result = Group.new(val[1])
301
+ def _reduce_18(val, _values, result)
302
+ result = Group.new(val[4]);
303
+ result.capture = false;
304
+ options = val[2];
305
+ result.expression.multiline = options[:multiline];
306
+ result.expression.ignorecase = options[:ignorecase];
307
+ result.expression.extended = options[:extended];
308
+
268
309
  result
269
310
  end
270
311
 
271
- def _reduce_21(val, _values, result)
272
- result = Group.new(val[3]); result.capture = false
312
+ def _reduce_19(val, _values, result)
313
+ result = Group.new(val[3]);
314
+ result.capture = false;
315
+
273
316
  result
274
317
  end
275
318
 
276
- def _reduce_22(val, _values, result)
277
- result = Group.new(val[3]); result.name = val[2]
319
+ def _reduce_20(val, _values, result)
320
+ result = Group.new(val[3]);
321
+ result.name = val[2];
322
+ result.index = @capture_index_stack.pop
323
+
278
324
  result
279
325
  end
280
326
 
327
+ # reduce 21 omitted
328
+
329
+ # reduce 22 omitted
330
+
281
331
  # reduce 23 omitted
282
332
 
283
333
  # reduce 24 omitted
284
334
 
285
335
  # reduce 25 omitted
286
336
 
287
- # reduce 26 omitted
337
+ def _reduce_26(val, _values, result)
338
+ result = val.join
339
+ result
340
+ end
288
341
 
289
- # reduce 27 omitted
342
+ def _reduce_27(val, _values, result)
343
+ result = val.join
344
+ result
345
+ end
290
346
 
291
347
  def _reduce_28(val, _values, result)
292
- result = val.join
348
+ result = { val[1] => false, val[2] => false, val[3] => false }
293
349
  result
294
350
  end
295
351
 
296
352
  def _reduce_29(val, _values, result)
297
- result = val.join
353
+ result = { val[0] => true, val[2] => false, val[3] => false }
354
+ result
355
+ end
356
+
357
+ def _reduce_30(val, _values, result)
358
+ result = { val[0] => true, val[1] => true, val[3] => false }
359
+ result
360
+ end
361
+
362
+ def _reduce_31(val, _values, result)
363
+ result = { val[0] => true, val[1] => true, val[2] => true }
364
+ result
365
+ end
366
+
367
+ def _reduce_32(val, _values, result)
368
+ result = :multiline
369
+ result
370
+ end
371
+
372
+ def _reduce_33(val, _values, result)
373
+ result = :ignorecase
374
+ result
375
+ end
376
+
377
+ def _reduce_34(val, _values, result)
378
+ result = :extended
298
379
  result
299
380
  end
300
381
 
@@ -51,23 +51,23 @@ class Parser < Racc::Parser
51
51
  token = case @state
52
52
  when nil
53
53
  case
54
- when (text = @ss.scan(/\\c/))
55
- action { [:CHAR_CLASS, text] }
54
+ when (text = @ss.scan(/\\d/))
55
+ action { [:CCLASS, CharacterClass.new('\d')] }
56
+
57
+ when (text = @ss.scan(/\\D/))
58
+ action { [:CCLASS, CharacterClass.new('\D')] }
56
59
 
57
60
  when (text = @ss.scan(/\\s/))
58
- action { [:CHAR_CLASS, text] }
61
+ action { [:CCLASS, CharacterClass.new('\s')] }
59
62
 
60
63
  when (text = @ss.scan(/\\S/))
61
- action { [:CHAR_CLASS, text] }
62
-
63
- when (text = @ss.scan(/\\d/))
64
- action { [:CHAR_CLASS, text] }
64
+ action { [:CCLASS, CharacterClass.new('\S')] }
65
65
 
66
66
  when (text = @ss.scan(/\\w/))
67
- action { [:CHAR_CLASS, text] }
67
+ action { [:CCLASS, CharacterClass.new('\w')] }
68
68
 
69
69
  when (text = @ss.scan(/\\W/))
70
- action { [:CHAR_CLASS, text] }
70
+ action { [:CCLASS, CharacterClass.new('\W')] }
71
71
 
72
72
  when (text = @ss.scan(/\^/))
73
73
  action { [:L_ANCHOR, text] }
@@ -85,16 +85,19 @@ class Parser < Racc::Parser
85
85
  action { [:NAME, @ss[1]] }
86
86
 
87
87
  when (text = @ss.scan(/\(/))
88
- action { [:LPAREN, text] }
88
+ action {
89
+ @capture_index_stack << @capture_index
90
+ @capture_index += 1
91
+ @state = :OPTIONS if @ss.peek(1) == '?';
92
+ [:LPAREN, text]
93
+ }
94
+
89
95
 
90
96
  when (text = @ss.scan(/\)/))
91
97
  action { [:RPAREN, text] }
92
98
 
93
99
  when (text = @ss.scan(/\[/))
94
- action { [:LBRACK, text] }
95
-
96
- when (text = @ss.scan(/\]/))
97
- action { [:RBRACK, text] }
100
+ action { @state = :CCLASS; [:LBRACK, text] }
98
101
 
99
102
  when (text = @ss.scan(/\{/))
100
103
  action { [:LCURLY, text] }
@@ -117,9 +120,6 @@ class Parser < Racc::Parser
117
120
  when (text = @ss.scan(/\*/))
118
121
  action { [:STAR, text] }
119
122
 
120
- when (text = @ss.scan(/\:/))
121
- action { [:COLON, text] }
122
-
123
123
  when (text = @ss.scan(/\\(.)/))
124
124
  action { [:CHAR, @ss[1]] }
125
125
 
@@ -131,6 +131,102 @@ class Parser < Racc::Parser
131
131
  raise ScanError, "can not match: '" + text + "'"
132
132
  end # if
133
133
 
134
+ when :CCLASS
135
+ case
136
+ when (text = @ss.scan(/\]/))
137
+ action { @state = nil; [:RBRACK, text] }
138
+
139
+ when (text = @ss.scan(/\^/))
140
+ action { [:NEGATE, text] }
141
+
142
+ when (text = @ss.scan(/:alnum:/))
143
+ action { [:LC_CTYPE, CharacterClass::ALNUM] }
144
+
145
+ when (text = @ss.scan(/:alpha:/))
146
+ action { [:LC_CTYPE, CharacterClass::ALPHA] }
147
+
148
+ when (text = @ss.scan(/:ascii:/))
149
+ action { [:LC_CTYPE, CharacterClass::ASCII] }
150
+
151
+ when (text = @ss.scan(/:blank:/))
152
+ action { [:LC_CTYPE, CharacterClass::BLANK] }
153
+
154
+ when (text = @ss.scan(/:cntrl:/))
155
+ action { [:LC_CTYPE, CharacterClass::CNTRL] }
156
+
157
+ when (text = @ss.scan(/:digit:/))
158
+ action { [:LC_CTYPE, CharacterClass::DIGIT] }
159
+
160
+ when (text = @ss.scan(/:graph:/))
161
+ action { [:LC_CTYPE, CharacterClass::GRAPH] }
162
+
163
+ when (text = @ss.scan(/:lower:/))
164
+ action { [:LC_CTYPE, CharacterClass::LOWER] }
165
+
166
+ when (text = @ss.scan(/:print:/))
167
+ action { [:LC_CTYPE, CharacterClass::PRINT] }
168
+
169
+ when (text = @ss.scan(/:punct:/))
170
+ action { [:LC_CTYPE, CharacterClass::PUNCT] }
171
+
172
+ when (text = @ss.scan(/:space:/))
173
+ action { [:LC_CTYPE, CharacterClass::SPACE] }
174
+
175
+ when (text = @ss.scan(/:upper:/))
176
+ action { [:LC_CTYPE, CharacterClass::UPPER] }
177
+
178
+ when (text = @ss.scan(/:word;/))
179
+ action { [:LC_CTYPE, CharacterClass::WORD] }
180
+
181
+ when (text = @ss.scan(/:xdigit:/))
182
+ action { [:LC_CTYPE, CharacterClass::XDIGIT] }
183
+
184
+ when (text = @ss.scan(/\\(.)/))
185
+ action { [:CHAR, @ss[1]] }
186
+
187
+ when (text = @ss.scan(/./))
188
+ action { [:CHAR, text] }
189
+
190
+ else
191
+ text = @ss.string[@ss.pos .. -1]
192
+ raise ScanError, "can not match: '" + text + "'"
193
+ end # if
194
+
195
+ when :OPTIONS
196
+ case
197
+ when (text = @ss.scan(/\?/))
198
+ action {
199
+ @state = nil unless @ss.peek(1) =~ /-|m|i|x|:/
200
+ [:QMARK, text]
201
+ }
202
+
203
+
204
+ when (text = @ss.scan(/\-/))
205
+ action { [:MINUS, text] }
206
+
207
+ when (text = @ss.scan(/m/))
208
+ action { [:MULTILINE, text] }
209
+
210
+ when (text = @ss.scan(/i/))
211
+ action { [:IGNORECASE, text] }
212
+
213
+ when (text = @ss.scan(/x/))
214
+ action { [:EXTENDED, text] }
215
+
216
+ when (text = @ss.scan(/\:/))
217
+ action {
218
+ @capture_index_stack.pop
219
+ @capture_index -= 1
220
+ @state = nil;
221
+ [:COLON, text]
222
+ }
223
+
224
+
225
+ else
226
+ text = @ss.string[@ss.pos .. -1]
227
+ raise ScanError, "can not match: '" + text + "'"
228
+ end # if
229
+
134
230
  else
135
231
  raise ScanError, "undefined state: '" + state.to_s + "'"
136
232
  end # case state
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-mount
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Peek
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-19 00:00:00 -08:00
12
+ date: 2009-11-22 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -57,6 +57,7 @@ files:
57
57
  - lib/rack/mount/vendor/multimap/nested_multimap.rb
58
58
  - lib/rack/mount/vendor/reginald/reginald/alternation.rb
59
59
  - lib/rack/mount/vendor/reginald/reginald/anchor.rb
60
+ - lib/rack/mount/vendor/reginald/reginald/atom.rb
60
61
  - lib/rack/mount/vendor/reginald/reginald/character.rb
61
62
  - lib/rack/mount/vendor/reginald/reginald/character_class.rb
62
63
  - lib/rack/mount/vendor/reginald/reginald/expression.rb