reg 0.4.8 → 0.5.0a0
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.
- checksums.yaml +4 -0
- data/COPYING +0 -0
- data/History.txt +14 -0
- data/Makefile +59 -0
- data/README +87 -40
- data/article.txt +838 -0
- data/{assert.rb → lib/assert.rb} +3 -3
- data/{reg.rb → lib/reg.rb} +11 -4
- data/lib/reg/version.rb +21 -0
- data/lib/regarray.rb +455 -0
- data/{regarrayold.rb → lib/regarrayold.rb} +33 -7
- data/lib/regbackref.rb +73 -0
- data/lib/regbind.rb +230 -0
- data/{regcase.rb → lib/regcase.rb} +15 -5
- data/lib/regcompiler.rb +2341 -0
- data/{regcore.rb → lib/regcore.rb} +196 -85
- data/{regdeferred.rb → lib/regdeferred.rb} +35 -4
- data/{regposition.rb → lib/regevent.rb} +36 -38
- data/lib/reggraphpoint.rb +28 -0
- data/lib/reghash.rb +631 -0
- data/lib/reginstrumentation.rb +36 -0
- data/{regitem_that.rb → lib/regitem_that.rb} +32 -11
- data/{regknows.rb → lib/regknows.rb} +4 -2
- data/{reglogic.rb → lib/reglogic.rb} +76 -59
- data/{reglookab.rb → lib/reglookab.rb} +31 -21
- data/lib/regmatchset.rb +323 -0
- data/{regold.rb → lib/regold.rb} +27 -27
- data/{regpath.rb → lib/regpath.rb} +91 -1
- data/lib/regposition.rb +79 -0
- data/lib/regprogress.rb +1522 -0
- data/lib/regrepeat.rb +307 -0
- data/lib/regreplace.rb +254 -0
- data/lib/regslicing.rb +581 -0
- data/lib/regsubseq.rb +72 -0
- data/lib/regsugar.rb +361 -0
- data/lib/regvar.rb +180 -0
- data/lib/regxform.rb +212 -0
- data/{trace.rb → lib/trace_during.rb} +6 -4
- data/lib/warning.rb +37 -0
- data/parser.txt +26 -8
- data/philosophy.txt +18 -0
- data/reg.gemspec +58 -25
- data/regguide.txt +18 -0
- data/test/andtest.rb +46 -0
- data/test/regcompiler_test.rb +346 -0
- data/test/regdemo.rb +20 -0
- data/{item_thattest.rb → test/regitem_thattest.rb} +2 -2
- data/test/regtest.rb +2125 -0
- data/test/test_all.rb +32 -0
- data/test/test_reg.rb +19 -0
- metadata +108 -73
- data/calc.reg +0 -73
- data/forward_to.rb +0 -49
- data/numberset.rb +0 -200
- data/regarray.rb +0 -675
- data/regbackref.rb +0 -126
- data/regbind.rb +0 -74
- data/reggrid.csv +1 -2
- data/reghash.rb +0 -318
- data/regprogress.rb +0 -1054
- data/regreplace.rb +0 -114
- data/regsugar.rb +0 -230
- data/regtest.rb +0 -1078
- data/regvar.rb +0 -76
@@ -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
|
@@ -18,6 +18,32 @@
|
|
18
18
|
=end
|
19
19
|
|
20
20
|
module Reg
|
21
|
+
module Reg
|
22
|
+
#--------------------------
|
23
|
+
#set a breakpoint when matches against a Reg
|
24
|
+
#are made. of dubious value to those unfamiliar
|
25
|
+
#with Reg::Array source code.
|
26
|
+
def bp #:nodoc: all
|
27
|
+
class <<self #:nodoc:
|
28
|
+
alias_method :unbroken___eee, :=== #:nodoc:
|
29
|
+
alias_method :unbroken___mmatch,
|
30
|
+
method_defined?(:mmatch) ? :mmatch : :fail #:nodoc:
|
31
|
+
def ===(other) #:nodoc:
|
32
|
+
(defined? DEBUGGER__ or defined? Debugger) and Process.kill("INT",0)
|
33
|
+
unbroken___eee other
|
34
|
+
rescue
|
35
|
+
false
|
36
|
+
end
|
37
|
+
|
38
|
+
def mmatch(*xx) #:nodoc:
|
39
|
+
(defined? DEBUGGER__ or defined? Debugger) and Process.kill("INT",0)
|
40
|
+
unbroken___mmatch(*xx)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
self
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
21
47
|
module Backtrace
|
22
48
|
#--------------------------
|
23
49
|
def Backtrace.clean_result(result,restype=RR)
|
@@ -142,7 +168,7 @@ module Reg
|
|
142
168
|
|
143
169
|
#--------------------------
|
144
170
|
def backtrace(arr,start,result,ri)
|
145
|
-
assert ri !=
|
171
|
+
assert ri != Infinity
|
146
172
|
assert(Backtrace.check_result result)
|
147
173
|
mat,matlen,di=nil
|
148
174
|
loop do #might have to bt multiple times if prev prelim set also fails
|
@@ -338,7 +364,7 @@ module Reg
|
|
338
364
|
return SingleRepeatMatchSet.new(i,-1,@times.begin)
|
339
365
|
end
|
340
366
|
|
341
|
-
def
|
367
|
+
def mmatch_full(arr,start)
|
342
368
|
assert start <= arr.size
|
343
369
|
r=[RR[]]
|
344
370
|
|
@@ -348,7 +374,7 @@ module Reg
|
|
348
374
|
ri=di=0
|
349
375
|
else
|
350
376
|
arr.size==start and return nil
|
351
|
-
assert @times.begin<
|
377
|
+
assert @times.begin<Infinity
|
352
378
|
r,di,ri=bt_match(arr,start,0,0,r,@times.begin) #matches @reg @times.begin times
|
353
379
|
r.nil? and return nil
|
354
380
|
end
|
@@ -398,7 +424,7 @@ module Reg
|
|
398
424
|
return [RR[arr[start,@regs.size]], @regs.size]
|
399
425
|
end
|
400
426
|
|
401
|
-
def
|
427
|
+
def mmatch_full(arr,start)
|
402
428
|
#in this version, at least one of @regs is a multiple reg
|
403
429
|
#start==arr.size and huh
|
404
430
|
assert( (0..arr.size).include?( start))
|
@@ -452,7 +478,7 @@ module Reg
|
|
452
478
|
return result
|
453
479
|
end
|
454
480
|
|
455
|
-
def subregs; @regs end
|
481
|
+
def subregs; @regs.dup end
|
456
482
|
end
|
457
483
|
|
458
484
|
#--------------------------
|
@@ -474,4 +500,4 @@ module Reg
|
|
474
500
|
end
|
475
501
|
end
|
476
502
|
|
477
|
-
end
|
503
|
+
end
|
data/lib/regbackref.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
=begin copyright
|
2
|
+
reg - the ruby extended grammar
|
3
|
+
Copyright (C) 2005, 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 'pp'
|
20
|
+
require 'regdeferred'
|
21
|
+
|
22
|
+
module Reg
|
23
|
+
|
24
|
+
|
25
|
+
#----------------------------------
|
26
|
+
module BackrefLike
|
27
|
+
def mmatch(pr)
|
28
|
+
huh #need info thats in Progress
|
29
|
+
end
|
30
|
+
|
31
|
+
def mixmod; BackrefLike end
|
32
|
+
end
|
33
|
+
#----------------------------------
|
34
|
+
class Backref
|
35
|
+
include BlankSlate
|
36
|
+
restore :inspect,:extend
|
37
|
+
restore :respond_to?
|
38
|
+
include Formula
|
39
|
+
include BackrefLike
|
40
|
+
def initialize(name,*path)
|
41
|
+
#complex paths not handled yet
|
42
|
+
raise ParameterError.new unless path.empty?
|
43
|
+
@name=normalize_bind_name name
|
44
|
+
#super
|
45
|
+
end
|
46
|
+
|
47
|
+
def formula_value(other,progress)
|
48
|
+
progress.lookup_var @name
|
49
|
+
end
|
50
|
+
|
51
|
+
class<<self
|
52
|
+
alias [] new
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
#----------------------------------
|
58
|
+
module BRLike
|
59
|
+
include BackrefLike
|
60
|
+
include Reg
|
61
|
+
def mixmod; BRLike end
|
62
|
+
end
|
63
|
+
class BR < Backref
|
64
|
+
include BRLike
|
65
|
+
restore :respond_to?
|
66
|
+
def inspect
|
67
|
+
'BR['+@name.inspect+']'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.BR(*args) BR.new(*args) end
|
72
|
+
def self.BackRef(*args) BackRef.new(*args) end
|
73
|
+
end
|
data/lib/regbind.rb
ADDED
@@ -0,0 +1,230 @@
|
|
1
|
+
=begin copyright
|
2
|
+
reg - the ruby extended grammar
|
3
|
+
Copyright (C) 2005, 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
|
+
module Reg
|
20
|
+
module Reg
|
21
|
+
def bind(name=self)
|
22
|
+
name=name.name if BoundRef===name
|
23
|
+
Bound.new(name,self)
|
24
|
+
end
|
25
|
+
alias % bind
|
26
|
+
|
27
|
+
def side_effect(&block); SideEffect.new(self,&block) end
|
28
|
+
def undo(&block); Undo.new(self,&block) end
|
29
|
+
def trace(&block); Trace.new(self,&block) end
|
30
|
+
|
31
|
+
def normalize_bind_name(name)
|
32
|
+
case name
|
33
|
+
when Reg; name=name.inspect
|
34
|
+
when Symbol
|
35
|
+
else name=name.to_s.to_sym
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
#-------------------------------------
|
42
|
+
class Bound
|
43
|
+
include Reg,Undoable,Composite
|
44
|
+
def initialize(name,reg)
|
45
|
+
@name,@reg=(normalize_bind_name name),reg
|
46
|
+
super
|
47
|
+
end
|
48
|
+
|
49
|
+
def mmatch(progress)
|
50
|
+
progress.register_var(@name,progress.get_index)
|
51
|
+
result=@reg.mmatch(progress)
|
52
|
+
#the variable needs to be unbound if the match failed
|
53
|
+
result or progress.delete_variable @name
|
54
|
+
result
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
def mmatch_full(progress)
|
59
|
+
huh "what if result is a matchset?"
|
60
|
+
if result=@reg.mmatch(progress)
|
61
|
+
idx=progress.get_index
|
62
|
+
range= if 1==result.last then idx else idx...idx+result.last end
|
63
|
+
progress.register_var(@name,range)
|
64
|
+
end
|
65
|
+
return result
|
66
|
+
end
|
67
|
+
|
68
|
+
def inspect
|
69
|
+
@reg.inspect+"%"+@name.inspect
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
#-------------------------------------
|
74
|
+
class BoundRef
|
75
|
+
include Formula
|
76
|
+
def initialize(name)
|
77
|
+
@name=name
|
78
|
+
end
|
79
|
+
attr :name
|
80
|
+
|
81
|
+
def formula_value(other,session)
|
82
|
+
session[@name]
|
83
|
+
end
|
84
|
+
|
85
|
+
def == other
|
86
|
+
BoundRef===other and other.name==name
|
87
|
+
end
|
88
|
+
|
89
|
+
def hash
|
90
|
+
"BoundRef of ".<<(name.to_s).hash
|
91
|
+
end
|
92
|
+
|
93
|
+
def unparse o
|
94
|
+
inspect
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
#-------------------------------------
|
100
|
+
class WithBoundRefValues
|
101
|
+
include Formula
|
102
|
+
def initialize(br,values)
|
103
|
+
@br,@values=br,values
|
104
|
+
end
|
105
|
+
attr_reader :br,:values
|
106
|
+
|
107
|
+
def formula_value(other,session)
|
108
|
+
saved_keys=@values.keys
|
109
|
+
saved=saved_keys.map{|k| session[k] }
|
110
|
+
result=@br.formula_value(other,session.merge!(@values))
|
111
|
+
saved_keys.each_with_index{|k,i|
|
112
|
+
session[k]=saved[i]
|
113
|
+
}
|
114
|
+
|
115
|
+
if $Reg_rtrace and $Reg_rtrace===other
|
116
|
+
if values.size>1
|
117
|
+
vals=@values.dup
|
118
|
+
vals.delete :self
|
119
|
+
vals_str="values=#{vals.inspect}"
|
120
|
+
end
|
121
|
+
with=@br
|
122
|
+
with=with.repldata if Replace::Form===with
|
123
|
+
puts "replacing \n#{other.inspect} with \n#{with.inspect} #{vals_str}"
|
124
|
+
end
|
125
|
+
|
126
|
+
return result
|
127
|
+
end
|
128
|
+
|
129
|
+
def == other
|
130
|
+
other.is_a? WithBoundRefValues and
|
131
|
+
@br==other.br and @values==other.values
|
132
|
+
end
|
133
|
+
|
134
|
+
def hash
|
135
|
+
#@value is a Hash, and Hash#hash doesn't work in ruby 1.8 (fixed in 1.9)
|
136
|
+
#I thought I had a good implementation of Hash#hash somewhere....
|
137
|
+
@br.hash^@values.to_a.sort_by{|(k,v)| k }.hash
|
138
|
+
end
|
139
|
+
|
140
|
+
def chain_to inner
|
141
|
+
::Ron::GraphWalk.graphcopy(self){|cntr,o,i,ty,useit|
|
142
|
+
if BoundRef===o and o.name==:self
|
143
|
+
useit[0]=true
|
144
|
+
inner
|
145
|
+
end
|
146
|
+
}
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
#-------------------------------------
|
151
|
+
class Trace
|
152
|
+
include Reg,Composite
|
153
|
+
|
154
|
+
def initialize(reg,&block)
|
155
|
+
block||=proc{|reg2,other,result|
|
156
|
+
print "not " unless result
|
157
|
+
print reg2.inspect, " === ", other.inspect, "\n"
|
158
|
+
}
|
159
|
+
@reg,@block=reg,block
|
160
|
+
super
|
161
|
+
# extend( HasCmatch===@reg ? HasCmatch : HasBmatch )
|
162
|
+
end
|
163
|
+
|
164
|
+
def === other
|
165
|
+
result= @reg===other
|
166
|
+
@block.call @reg,other,result
|
167
|
+
return result
|
168
|
+
end
|
169
|
+
|
170
|
+
def generate_bmatch
|
171
|
+
"
|
172
|
+
begin
|
173
|
+
item=progress.cursor.readahead1
|
174
|
+
result=@reg.bmatch progress
|
175
|
+
ensure
|
176
|
+
@block.call @reg,item,result
|
177
|
+
end
|
178
|
+
"
|
179
|
+
end
|
180
|
+
def generate_cmatch
|
181
|
+
"
|
182
|
+
begin
|
183
|
+
success=nil
|
184
|
+
item=progress.cursor.readahead1
|
185
|
+
@reg.cmatch(progress){
|
186
|
+
@block.call @reg,item,true
|
187
|
+
success=true
|
188
|
+
yield
|
189
|
+
}
|
190
|
+
ensure
|
191
|
+
@block.call @reg,item,false unless success
|
192
|
+
end
|
193
|
+
"
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
#-------------------------------------
|
198
|
+
class SideEffect
|
199
|
+
include Reg,Composite
|
200
|
+
|
201
|
+
def initialize(reg,&block)
|
202
|
+
@reg,@block=reg,block
|
203
|
+
super
|
204
|
+
end
|
205
|
+
|
206
|
+
def mmatch(progress)
|
207
|
+
huh "what if result is a matchset?"
|
208
|
+
result=@reg.mmatch(progress) and
|
209
|
+
@block.call(progress)
|
210
|
+
return result
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
#------------------------------------
|
215
|
+
class Undo
|
216
|
+
include Reg,Undoable,Composite
|
217
|
+
|
218
|
+
def initialize(reg,&block)
|
219
|
+
@reg,@block=reg,block
|
220
|
+
super
|
221
|
+
end
|
222
|
+
|
223
|
+
def mmatch(progress)
|
224
|
+
huh "what if result is a matchset?"
|
225
|
+
result=@reg.mmatch(progress) and
|
226
|
+
progress.register_undo(@block)
|
227
|
+
return result
|
228
|
+
end
|
229
|
+
end
|
230
|
+
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
|
@@ -18,6 +18,8 @@
|
|
18
18
|
=end
|
19
19
|
module Reg
|
20
20
|
class Case
|
21
|
+
include Reg
|
22
|
+
include Composite
|
21
23
|
def initialize(*args)
|
22
24
|
if args.size==1 and Hash===args.first
|
23
25
|
scalars=[]; sets=[]
|
@@ -35,7 +37,8 @@ module Reg
|
|
35
37
|
args=scalars+sets+matchers
|
36
38
|
end
|
37
39
|
|
38
|
-
@others=
|
40
|
+
@others=None
|
41
|
+
others_given=nil
|
39
42
|
@pairlist=args.delete_if{|a|
|
40
43
|
if !(Pair===a)
|
41
44
|
warn "ignoring non-Reg::Pair in Reg::Case: #{a}"
|
@@ -43,16 +46,17 @@ module Reg
|
|
43
46
|
elsif OB==a.left
|
44
47
|
others_given and warn 'more than one default specified'
|
45
48
|
others_given=true
|
46
|
-
@others=
|
49
|
+
@others=a.right
|
47
50
|
end
|
48
51
|
}
|
52
|
+
super
|
53
|
+
assert(!is_a? Multiple)
|
49
54
|
end
|
50
55
|
|
51
56
|
def ===(other)
|
52
57
|
@pairlist.each{|pair|
|
53
58
|
pair.left===other and pair.right===other || return
|
54
|
-
}
|
55
|
-
@others===other
|
59
|
+
} or @others===other
|
56
60
|
end
|
57
61
|
|
58
62
|
#hash-based optimization of scalars and sets is possible here
|
@@ -70,6 +74,12 @@ module Reg
|
|
70
74
|
}
|
71
75
|
|
72
76
|
end
|
77
|
+
|
78
|
+
def subregs
|
79
|
+
result=@pairlist.inject([]){|a,pair| a+pair.to_a}
|
80
|
+
result+=[OB,@others] if @others
|
81
|
+
return result
|
82
|
+
end
|
73
83
|
|
74
84
|
end
|
75
85
|
|