reg 0.4.8 → 0.5.0a0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -0
  2. data/COPYING +0 -0
  3. data/History.txt +14 -0
  4. data/Makefile +59 -0
  5. data/README +87 -40
  6. data/article.txt +838 -0
  7. data/{assert.rb → lib/assert.rb} +3 -3
  8. data/{reg.rb → lib/reg.rb} +11 -4
  9. data/lib/reg/version.rb +21 -0
  10. data/lib/regarray.rb +455 -0
  11. data/{regarrayold.rb → lib/regarrayold.rb} +33 -7
  12. data/lib/regbackref.rb +73 -0
  13. data/lib/regbind.rb +230 -0
  14. data/{regcase.rb → lib/regcase.rb} +15 -5
  15. data/lib/regcompiler.rb +2341 -0
  16. data/{regcore.rb → lib/regcore.rb} +196 -85
  17. data/{regdeferred.rb → lib/regdeferred.rb} +35 -4
  18. data/{regposition.rb → lib/regevent.rb} +36 -38
  19. data/lib/reggraphpoint.rb +28 -0
  20. data/lib/reghash.rb +631 -0
  21. data/lib/reginstrumentation.rb +36 -0
  22. data/{regitem_that.rb → lib/regitem_that.rb} +32 -11
  23. data/{regknows.rb → lib/regknows.rb} +4 -2
  24. data/{reglogic.rb → lib/reglogic.rb} +76 -59
  25. data/{reglookab.rb → lib/reglookab.rb} +31 -21
  26. data/lib/regmatchset.rb +323 -0
  27. data/{regold.rb → lib/regold.rb} +27 -27
  28. data/{regpath.rb → lib/regpath.rb} +91 -1
  29. data/lib/regposition.rb +79 -0
  30. data/lib/regprogress.rb +1522 -0
  31. data/lib/regrepeat.rb +307 -0
  32. data/lib/regreplace.rb +254 -0
  33. data/lib/regslicing.rb +581 -0
  34. data/lib/regsubseq.rb +72 -0
  35. data/lib/regsugar.rb +361 -0
  36. data/lib/regvar.rb +180 -0
  37. data/lib/regxform.rb +212 -0
  38. data/{trace.rb → lib/trace_during.rb} +6 -4
  39. data/lib/warning.rb +37 -0
  40. data/parser.txt +26 -8
  41. data/philosophy.txt +18 -0
  42. data/reg.gemspec +58 -25
  43. data/regguide.txt +18 -0
  44. data/test/andtest.rb +46 -0
  45. data/test/regcompiler_test.rb +346 -0
  46. data/test/regdemo.rb +20 -0
  47. data/{item_thattest.rb → test/regitem_thattest.rb} +2 -2
  48. data/test/regtest.rb +2125 -0
  49. data/test/test_all.rb +32 -0
  50. data/test/test_reg.rb +19 -0
  51. metadata +108 -73
  52. data/calc.reg +0 -73
  53. data/forward_to.rb +0 -49
  54. data/numberset.rb +0 -200
  55. data/regarray.rb +0 -675
  56. data/regbackref.rb +0 -126
  57. data/regbind.rb +0 -74
  58. data/reggrid.csv +1 -2
  59. data/reghash.rb +0 -318
  60. data/regprogress.rb +0 -1054
  61. data/regreplace.rb +0 -114
  62. data/regsugar.rb +0 -230
  63. data/regtest.rb +0 -1078
  64. data/regvar.rb +0 -76
@@ -0,0 +1,36 @@
1
+ =begin copyright
2
+ reg - the ruby extended grammar
3
+ Copyright (C) 2016 Caleb Clausen
4
+
5
+ This library is free software; you can redistribute it and/or
6
+ modify it under the terms of the GNU Lesser General Public
7
+ License as published by the Free Software Foundation; either
8
+ version 2.1 of the License, or (at your option) any later version.
9
+
10
+ This library is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ Lesser General Public License for more details.
14
+
15
+ You should have received a copy of the GNU Lesser General Public
16
+ License along with this library; if not, write to the Free Software
17
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
+ =end
19
+ require 'instrument'
20
+ require 'reg'
21
+
22
+ Instrument.on_entry_to(Reg::Progress, :bt_match, "args[0]||matcher")
23
+ Instrument.on_exit_from(Reg::Progress, :bt_match)
24
+
25
+ Instrument.on_entry_to(Reg::Progress, :last_next_match,
26
+ "args[0].matcher", "args[0].regsidx", "args[0].cursor.pos", "(args[0]||context).position_inc_stack")
27
+ Instrument.on_exit_from(Reg::Progress, :last_next_match, "(args[0] || context).position_inc_stack")
28
+
29
+ Instrument.on_entry_to(Reg::RepeatMatchSet, :next_match, :@consumed, "@context.matcher", "@context.position_inc_stack")
30
+ Instrument.on_exit_from(Reg::RepeatMatchSet, :next_match, "@context.position_inc_stack")
31
+
32
+ Instrument.on_entry_to(Reg::SubseqMatchSet, :next_match)
33
+ Instrument.on_exit_from(Reg::SubseqMatchSet, :next_match)
34
+
35
+ Instrument.on_entry_to(Reg::Progress, :backtrack, :position_stack, :position_inc_stack, "(args[0] || context).regsidx", "(args[0] || context).matcher")
36
+ Instrument.on_exit_from(Reg::Progress, :backtrack)
@@ -1,6 +1,6 @@
1
1
  =begin copyright
2
2
  reg - the ruby extended grammar
3
- Copyright (C) 2005,2009 Caleb Clausen
3
+ Copyright (C) 2005, 2016 Caleb Clausen
4
4
 
5
5
  This library is free software; you can redistribute it and/or
6
6
  modify it under the terms of the GNU Lesser General Public
@@ -25,12 +25,12 @@ module Reg
25
25
  return ItemThat.new(klass) unless block
26
26
 
27
27
  class <<block
28
- #include arguments to include appear to be processed in a strange order... this is
28
+ # arguments to include appear to be processed in a strange order... this is
29
29
  #significant if order is important to you
30
30
  #the #included methods are perhaps not called when i think they should be....
31
31
  #(DON'T simplify the next line; it'll break.)
32
- [BlankSlate ,Formula, BlockLike].each{|mod| include mod}
33
- restore :inspect,:extend,:call
32
+ [BlankSlate ,];[Formula, BlockLike].each{|mod| include mod}
33
+ # restore :inspect,:extend,:call
34
34
 
35
35
  alias === eeee #workaround-- shouldn't be needed
36
36
  alias formula_value call
@@ -57,6 +57,11 @@ module Reg
57
57
  alias === eeee #does nothing in includers.... why?
58
58
  def formula_value *a,&b; call( *a,&b) end
59
59
 
60
+ def % name
61
+ super unless Symbol===name
62
+ Bound.new(name,self)
63
+ end
64
+
60
65
 
61
66
  def mixmod; ItemThatLike end
62
67
  def reg; dup.extend Reg end
@@ -64,20 +69,22 @@ module Reg
64
69
 
65
70
  #----------------------------------
66
71
  module DeferredQuery
67
- #just an ancestor for ItemThat and RegThat
72
+ #just an ancestor for ItemThatLike and RegThatLike
68
73
  def eee(item)
69
- begin formula_value item
70
- rescue; false
71
- end
74
+ formula_value item,{} rescue false
72
75
  end
73
76
  alias === eee #this doesn't work!!! WHY????
74
77
  #there's no way to define the method === in this
75
78
  #module and have it be defined in class ItemThat.
76
79
  #mixmod and reg don't have this problem. this must
77
- #be a bug. for now, I work around it with clever
80
+ #be a bug(??). for now, I work around it with clever
78
81
  #alias/undefing in places that include/extend ItemThatLike
79
82
  #(seemingly, this is only a problem when including, not extending... dunno why)
80
83
  #this bug may be gone now; need to try to get rid of weird eee stuff.
84
+
85
+ # def mmatch(pr)
86
+ # !pr.cursor.eof? and self===pr.cursor.readahead1 and [true,1]
87
+ # end
81
88
 
82
89
  end
83
90
 
@@ -87,6 +94,13 @@ module Reg
87
94
 
88
95
  def mixmod; ItemThatLike end
89
96
  def reg; dup.extend RegThatLike end
97
+
98
+
99
+ #I should really consider adding better definitions of to_str, to_ary, (maybe) to_proc here
100
+ #respond_to? would be a good one too.
101
+ #or even in Deferred, maybe
102
+ #as it is, all kinds of weird stuff happens if respond_to? and to_ary both return true values,
103
+ #(which they do currently)
90
104
  end
91
105
 
92
106
  #----------------------------------
@@ -118,10 +132,16 @@ module Reg
118
132
  include Reg
119
133
 
120
134
  def mixmod; RegThatLike end
135
+ def reg; self end
136
+ end
137
+
138
+ #----------------------------------
139
+ class RegThat < ItemThat
140
+ include RegThatLike
121
141
  end
122
142
 
123
143
  #----------------------------------
124
- class RegThat
144
+ nil&&class RegThat
125
145
  include BlankSlate
126
146
  restore :inspect,:extend
127
147
  include Formula
@@ -130,13 +150,14 @@ module Reg
130
150
  undef eee
131
151
  def initialize(klass=nil)
132
152
  @klass=klass
153
+ super
133
154
  end
134
155
 
135
156
  def formula_value(val,*rest)
136
157
  #the exception raised here should be (eventually) caught by
137
158
  #the handler in RegThatLike#eee. calling RegThat#formula_value isn't
138
159
  #really legitimate otherwise.
139
- @klass and @klass===val || fail("item_that constraint mismatch")
160
+ @klass and @klass===val || fail("reg_that constraint mismatch")
140
161
 
141
162
  val
142
163
  end
@@ -1,6 +1,6 @@
1
1
  =begin copyright
2
2
  reg - the ruby extended grammar
3
- Copyright (C) 2005 Caleb Clausen
3
+ Copyright (C) 2005, 2016 Caleb Clausen
4
4
 
5
5
  This library is free software; you can redistribute it and/or
6
6
  modify it under the terms of the GNU Lesser General Public
@@ -20,7 +20,9 @@ module Reg
20
20
  class Knows
21
21
  include Reg
22
22
  attr :sym
23
- def initialize(sym) @sym=sym end
23
+ def initialize(sym)
24
+ @sym=sym
25
+ end
24
26
 
25
27
  def === (obj)
26
28
  obj.respond_to? @sym
@@ -1,6 +1,6 @@
1
1
  =begin copyright
2
2
  reg - the ruby extended grammar
3
- Copyright (C) 2005 Caleb Clausen
3
+ Copyright (C) 2005, 2016 Caleb Clausen
4
4
 
5
5
  This library is free software; you can redistribute it and/or
6
6
  modify it under the terms of the GNU Lesser General Public
@@ -17,7 +17,7 @@
17
17
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
18
  =end
19
19
 
20
-
20
+ require 'warning'
21
21
 
22
22
  module Reg
23
23
 
@@ -81,10 +81,10 @@ module Reg
81
81
 
82
82
  #--------------------------
83
83
  class Not
84
- include Reg
84
+ include Reg,Composite
85
85
  def initialize(reg)
86
- @reg=reg
87
- maybe_multiples(reg)
86
+ @reg=Deferred.defang! reg
87
+ super
88
88
  end
89
89
  def ===(obj)
90
90
  !(@reg===obj)
@@ -92,6 +92,7 @@ module Reg
92
92
  def ~
93
93
  @reg
94
94
  end
95
+
95
96
 
96
97
  #deMorgan's methods...
97
98
  def &(reg)
@@ -108,8 +109,20 @@ module Reg
108
109
  super reg
109
110
  end
110
111
  end
112
+ def ^(reg)
113
+ if Not===reg
114
+ ~self ^ ~reg
115
+ else
116
+ super reg
117
+ end
118
+ end
119
+ #a|b|!a|!b|!a^!b|a^b
120
+ #0|0|1 |1 |0 |0
121
+ #0|1|1 |0 |1 |1
122
+ #1|0|0 |1 |1 |1
123
+ #1|1|1 |1 |0 |0
111
124
 
112
- #mmatch_multiple implementation needed
125
+ #mmatch_full implementation needed
113
126
 
114
127
  def inspect
115
128
  "~("+@reg.inspect+")"
@@ -117,79 +130,83 @@ module Reg
117
130
 
118
131
  def subregs; [@reg] end
119
132
  end
120
-
133
+
121
134
  #--------------------------
122
- class Or
123
- include Reg
135
+ #only subclasses should be created
136
+ class Logical
137
+ include Reg,Composite
124
138
  attr :regs
139
+ class<<self
140
+ def new(*regs)
141
+ #"optimization of Logicals over a single sub-expression disabled"
142
+ #regs.size==1 and return regs.first
143
+ regs=regs.map{|r| Deferred.defang! r }
144
+ super
145
+ end
146
+ alias [] new
147
+ end
125
148
  def initialize(*regs)
126
149
  @regs=regs
150
+ (@regs.size-1).downto(0){|i|
151
+ @regs[i,1]=*@regs[i].subregs if self.class==@regs[i].class
152
+ }
127
153
 
128
- maybe_multiples(*regs)
129
- end
130
- def ===(obj)
131
- @regs.each {|reg| reg===obj and return obj||true }
132
- return false
154
+ super
133
155
  end
134
-
135
- def |(reg)
136
- newregs=@regs + ((self.class===reg )? reg.regs : [reg])
156
+ def subregs; @regs.dup end
157
+
158
+
159
+ def op(reg)
160
+ newregs=@regs + ((self.class===reg )? reg.subregs : [reg])
137
161
  self.class.new(*newregs)
138
162
  end
139
163
 
140
-
141
- def inspect
142
- @regs.collect{|r| r.inspect}.join' | '
164
+ def mmatch(progress)
165
+ progress.cursor.eof? and return
166
+ other=progress.cursor.readahead1
167
+ self.eee other and [true,1]
143
168
  end
169
+
170
+ def max_matches; @regs.size end
144
171
 
145
- def subregs; @regs end
172
+ def self.specialize_with_operator oper
173
+ %{
174
+ alias_method :#{oper}, :op
175
+ def inspect
176
+ @regs.size==0 and return "::#{name}[]"
177
+ @regs.size==1 and return "::#{name}[\#{@regs.first.inspect}]"
178
+ @regs.collect{|r| r.inspect}.join' #{oper} '
179
+ end
180
+ }
181
+ end
146
182
  end
147
183
 
148
184
  #--------------------------
149
- class And
150
- include Reg
151
- attr :regs
152
- def initialize(*regs)
153
- @regs=regs
154
- maybe_multiples(*regs)
155
- end
185
+ class Or < Logical
156
186
  def ===(obj)
157
- @regs.each {|reg| reg===obj or return false }
158
- return obj||true
159
- end
160
- def &(reg)
161
- newregs=@regs + ((self.class===reg)? reg.regs : [reg])
162
- self.class.new(*newregs)
163
- end
164
-
165
- def inspect
166
- @regs.collect{|r| r.inspect}.join' & '
187
+ @regs.each {|reg| reg===obj and return obj || true }
188
+ return false
167
189
  end
168
-
169
- def subregs; @regs end
190
+ alias eee ===
191
+ eval specialize_with_operator(:|)
170
192
  end
171
-
172
193
  #--------------------------
173
- class Xor
174
- include Reg
175
- attr :regs
176
- def initialize(*regs)
177
- @regs=regs
178
- maybe_multiples(*regs)
179
- end
194
+ class And < Logical
180
195
  def ===(obj)
181
- @regs.find_all {|reg| reg===obj }.size==1
196
+ @regs.each {|reg| reg===obj or return false }
197
+ return obj || true
182
198
  end
183
- def ^(reg)
184
- newregs=@regs + ((self.class===reg )? reg.regs : [reg])
185
- self.class.new(*newregs)
186
- end
187
-
188
-
189
- def inspect
190
- @regs.collect{|r| r.inspect}.join' ^ '
199
+ alias eee ===
200
+ eval specialize_with_operator(:&)
201
+ end
202
+ #--------------------------
203
+ class Xor < Logical
204
+ def ===(obj)
205
+ @regs.find_all {|reg| reg===obj }.size==1 or return
206
+ return obj || true
191
207
  end
192
-
193
- def subregs; @regs end
208
+ alias eee ===
209
+ eval specialize_with_operator(:^)
194
210
  end
211
+
195
212
  end
@@ -1,6 +1,6 @@
1
1
  =begin copyright
2
2
  reg - the ruby extended grammar
3
- Copyright (C) 2005 Caleb Clausen
3
+ Copyright (C) 2005, 2016 Caleb Clausen
4
4
 
5
5
  This library is free software; you can redistribute it and/or
6
6
  modify it under the terms of the GNU Lesser General Public
@@ -26,73 +26,83 @@ module Reg
26
26
  class LookAhead
27
27
  include Reg
28
28
  include Multiple
29
+ include Composite
29
30
  def initialize(reg)
30
31
  @reg=reg
32
+ super
31
33
  end
32
34
 
33
35
  def mmatch(pr)
34
- @reg.mmatch(pr.subprogress( pr.cursor.position,@reg ))
36
+ @reg.mmatch(pr)
37
+ return [true,0]
38
+ end
39
+
40
+ def mmatch_full
41
+ huh
35
42
  end
36
43
 
37
44
  def itemrange; 0..0 end
38
45
 
39
- def subregs; [@reg] end
40
-
41
46
  #most methods should be forwarded to @reg... tbd
42
-
47
+
43
48
  end
44
49
 
45
50
 
46
51
  class LookBack
47
52
  include Reg
48
53
  include Multiple
54
+ include Composite
55
+
49
56
 
50
57
  def initialize(reg)
51
58
 
52
59
  r=reg.itemrange
53
60
  @r=r.last-r.first
54
61
  @reg=reg
55
-
62
+ super
56
63
  end
57
64
 
58
65
  def itemrange; 0..0 end
59
-
60
- def regs
61
- [*regs_ary(huh)]
66
+
67
+ def mmatch(pr)
68
+ warn "look at prev item, not next_"
69
+ @reg.mmatch(pr)
70
+ return [true,0]
62
71
  end
63
-
72
+
64
73
  def regs_ary(pos,r=@r)
65
74
  [ (OB-r).l, @reg, Position[pos] ] #require unimplemented lazy operator....
66
75
  end
67
76
 
68
- def mmatch(pr)
77
+ def mmatch_full(pr)
78
+ huh
79
+
69
80
  cu=pr.cursor
70
81
  ra=@reg.itemrange
71
82
  pos=cu.pos
72
83
  startpos=pos-ra.last
84
+ pos>=ra.first or return
73
85
  r=if startpos<0
74
86
  huh 'dunno what to do here'
75
- foo=ra.first+startpos
87
+ newlast=ra.last+startpos
88
+ assert newlast>=ra.first #???
76
89
  startpos=0
77
- pos-ra.first
90
+ ra=ra.first..ra.last+startpos
91
+ ra.last-ra.first
78
92
  else
79
93
  @r
80
94
  end
81
95
  reg= +regs_ary(pos,r)
82
- cu=cu.position
83
- cu.pos=startpos
84
- reg.mmatch pr.subprogress(cu,reg)
96
+ reg.mmatch pr.subprogress(cu.position(startpos))
85
97
 
86
98
  #original pr.cursor position should be unchanged
87
99
  assert pos==cu.pos
88
100
 
89
- huh #result should be fixed up to remove evidence of
101
+ #huh #result should be fixed up to remove evidence of
90
102
  #the subsequence and all but it's middle element.
103
+ return [true,0]
91
104
  end
92
-
93
- def subregs; [@reg] end
94
-
105
+
95
106
  #most methods should be forwarded to @reg... tbd
96
107
  end
97
-
98
108
  end