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
data/regbackref.rb
DELETED
@@ -1,126 +0,0 @@
|
|
1
|
-
=begin copyright
|
2
|
-
reg - the ruby extended grammar
|
3
|
-
Copyright (C) 2005 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
|
-
=begin
|
25
|
-
#----------------------------------
|
26
|
-
module Block
|
27
|
-
# include Formula
|
28
|
-
|
29
|
-
attr_writer :klass #for internal use only
|
30
|
-
|
31
|
-
def eeee(val)
|
32
|
-
@klass and @klass===val || return
|
33
|
-
begin call(val)
|
34
|
-
rescue: false
|
35
|
-
end
|
36
|
-
end
|
37
|
-
alias === eeee #does nothing in includers.... why?
|
38
|
-
alias formula_value eeee
|
39
|
-
|
40
|
-
|
41
|
-
def mixmod; ItemThatLike end
|
42
|
-
def reg; extend Reg end
|
43
|
-
end
|
44
|
-
#----------------------------------
|
45
|
-
module ItemThatLike
|
46
|
-
def eee(item)
|
47
|
-
begin formula_value item
|
48
|
-
rescue: false
|
49
|
-
end
|
50
|
-
end
|
51
|
-
alias === eee #this doesn't work!!! WHY????
|
52
|
-
#there's no way to define the method === in this
|
53
|
-
#module and have it be defined in class ItemThat.
|
54
|
-
#mixmod and reg don't have this problem. this must
|
55
|
-
#be a bug. for now, I work around it with clever
|
56
|
-
#alias/undefing in places that include/extend ItemThatLike
|
57
|
-
#(seemingly, this is only a problem when including, not extending... dunno why)
|
58
|
-
#this bug may be gone now; need to try to get rid of weird eee stuff.
|
59
|
-
|
60
|
-
def mixmod; ItemThatLike end
|
61
|
-
def reg; extend Reg end
|
62
|
-
end
|
63
|
-
#----------------------------------
|
64
|
-
class ItemThat
|
65
|
-
include BlankSlate
|
66
|
-
restore :inspect,:extend
|
67
|
-
include Formula
|
68
|
-
include ItemThatLike
|
69
|
-
alias === eee
|
70
|
-
undef eee
|
71
|
-
def initialize(klass=nil)
|
72
|
-
@klass=klass
|
73
|
-
end
|
74
|
-
|
75
|
-
def formula_value(val,*rest)
|
76
|
-
#the exception raised here should be (eventually) caught by
|
77
|
-
#the handler in ItemThatLike#eee. calling ItemThat#formula_value isn't
|
78
|
-
#really legitimate otherwise.
|
79
|
-
@klass and @klass===val || fail("item_that constraint mismatch")
|
80
|
-
|
81
|
-
val
|
82
|
-
end
|
83
|
-
|
84
|
-
end
|
85
|
-
=end
|
86
|
-
#----------------------------------
|
87
|
-
module BackrefLike
|
88
|
-
def mmatch(ary,idx)
|
89
|
-
huh #need info thats not_in ary or idx
|
90
|
-
end
|
91
|
-
|
92
|
-
def mixmod; BackrefLike end
|
93
|
-
end
|
94
|
-
#----------------------------------
|
95
|
-
class Backref
|
96
|
-
include BlankSlate
|
97
|
-
restore :inspect,:extend
|
98
|
-
include Formula
|
99
|
-
include BackrefLike
|
100
|
-
def initialize(name,*path)
|
101
|
-
#complex paths not handled yet
|
102
|
-
raise ParameterError.new unless path.empty? and Reg|Symbol===name
|
103
|
-
@name=name
|
104
|
-
end
|
105
|
-
|
106
|
-
def formula_value(*ctx)
|
107
|
-
progress=ctx[1]
|
108
|
-
progress.variables[@name]
|
109
|
-
end
|
110
|
-
|
111
|
-
class<<self
|
112
|
-
alias [] new
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
|
117
|
-
#----------------------------------
|
118
|
-
module BRLike
|
119
|
-
include BackrefLike
|
120
|
-
include Reg
|
121
|
-
def mixmod; BRLike end
|
122
|
-
end
|
123
|
-
class BR < Backref
|
124
|
-
include BRLike
|
125
|
-
end
|
126
|
-
end
|
data/regbind.rb
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
=begin copyright
|
2
|
-
reg - the ruby extended grammar
|
3
|
-
Copyright (C) 2005 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
|
-
Bound.new(name,self)
|
23
|
-
end
|
24
|
-
alias << bind
|
25
|
-
|
26
|
-
def side_effect(&block); SideEffect.new(self,&block) end
|
27
|
-
def undo(&block); Undo.new(self,&block) end
|
28
|
-
end
|
29
|
-
|
30
|
-
#-------------------------------------
|
31
|
-
class Bound
|
32
|
-
include Reg
|
33
|
-
def initialize(name,reg)
|
34
|
-
@name,@reg=name,reg
|
35
|
-
end
|
36
|
-
|
37
|
-
|
38
|
-
def mmatch(progress)
|
39
|
-
result=@reg.mmatch(progress) and
|
40
|
-
progress.register_var(@name,@reg)
|
41
|
-
return result
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
#-------------------------------------
|
46
|
-
class SideEffect
|
47
|
-
include Reg
|
48
|
-
|
49
|
-
def initialize(reg,&block)
|
50
|
-
@reg,@block=reg,block
|
51
|
-
end
|
52
|
-
|
53
|
-
def mmatch(progress)
|
54
|
-
result=@reg.mmatch(progress) and
|
55
|
-
@block.call(progress)
|
56
|
-
return result
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
#------------------------------------
|
61
|
-
class Undo
|
62
|
-
include Reg
|
63
|
-
|
64
|
-
def initialize(reg,&block)
|
65
|
-
@reg,@block=reg,block
|
66
|
-
end
|
67
|
-
|
68
|
-
def mmatch(progress)
|
69
|
-
result=@reg.mmatch(progress) and
|
70
|
-
progress.register_undo(@block)
|
71
|
-
return result
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
data/reggrid.csv
DELETED
data/reghash.rb
DELETED
@@ -1,318 +0,0 @@
|
|
1
|
-
|
2
|
-
=begin copyright
|
3
|
-
reg - the ruby extended grammar
|
4
|
-
Copyright (C) 2005 Caleb Clausen
|
5
|
-
|
6
|
-
This library is free software; you can redistribute it and/or
|
7
|
-
modify it under the terms of the GNU Lesser General Public
|
8
|
-
License as published by the Free Software Foundation; either
|
9
|
-
version 2.1 of the License, or (at your option) any later version.
|
10
|
-
|
11
|
-
This library is distributed in the hope that it will be useful,
|
12
|
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
-
Lesser General Public License for more details.
|
15
|
-
|
16
|
-
You should have received a copy of the GNU Lesser General Public
|
17
|
-
License along with this library; if not, write to the Free Software
|
18
|
-
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
19
|
-
=end
|
20
|
-
|
21
|
-
|
22
|
-
require 'forward_to'
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
module Reg
|
27
|
-
|
28
|
-
class Hash
|
29
|
-
include Reg
|
30
|
-
attr :others
|
31
|
-
|
32
|
-
def initialize(hashdat=nil)
|
33
|
-
@matchers={}
|
34
|
-
@literals={}
|
35
|
-
@others=nil
|
36
|
-
hashdat or return
|
37
|
-
hashdat.key?(OB) and @others=hashdat.delete(OB)
|
38
|
-
hashdat.each {|key,val|
|
39
|
-
if Reg.interesting_matcher? key
|
40
|
-
Fixed===key and key=key.unwrap
|
41
|
-
@matchers[key]=val
|
42
|
-
else
|
43
|
-
Equals===key and key=key.unwrap
|
44
|
-
@literals[key]=val
|
45
|
-
end
|
46
|
-
}
|
47
|
-
end
|
48
|
-
|
49
|
-
def Hash.[](*args); new(*args); end
|
50
|
-
|
51
|
-
def matches_class; ::Hash end
|
52
|
-
|
53
|
-
def ordered
|
54
|
-
pairs=[]
|
55
|
-
@literals.each{|k,v| pairs<< Pair[k,v] }
|
56
|
-
@matchers.each{|k,v| pairs<< Pair[k,v] }
|
57
|
-
pairs<<Pair[OB,@others] if @others
|
58
|
-
return +pairs
|
59
|
-
end
|
60
|
-
|
61
|
-
def subregs;
|
62
|
-
@literals.keys + @literals.values +
|
63
|
-
@matchers.keys + @matchers.values +
|
64
|
-
(@others==nil ? [OB,@others] : [])
|
65
|
-
end
|
66
|
-
|
67
|
-
def inspect
|
68
|
-
result=[]
|
69
|
-
result<<@literals.inspect.sub(/.(.*)./, "\\1") unless @literals.empty?
|
70
|
-
result<<@matchers.inspect.sub(/.(.*)./, "\\1") unless @matchers.empty?
|
71
|
-
result<<"OB=>#{@others.inspect}" if defined? @others and @others!=nil
|
72
|
-
return "+{#{result.join(", ")}}"
|
73
|
-
end
|
74
|
-
|
75
|
-
def -@ #make object matcher
|
76
|
-
Rob(@literals.merge(@matchers).merge(OB=>@others))
|
77
|
-
end
|
78
|
-
|
79
|
-
def ===(other)
|
80
|
-
matchedliterals={}
|
81
|
-
matchedmatchers={}
|
82
|
-
other.each_pair{|key,val|
|
83
|
-
#literals get a chance first
|
84
|
-
@literals.key? key and
|
85
|
-
if (@literals[key]===val)
|
86
|
-
matchedliterals[key]=true
|
87
|
-
next
|
88
|
-
else
|
89
|
-
return
|
90
|
-
end
|
91
|
-
|
92
|
-
#now try more general matchers
|
93
|
-
saw_matcher=nil
|
94
|
-
@matchers.each_pair{|mkey,mval|
|
95
|
-
if mkey===key
|
96
|
-
return unless (mval===val)
|
97
|
-
saw_matcher=matchedmatchers[mkey]=true
|
98
|
-
break
|
99
|
-
end
|
100
|
-
}
|
101
|
-
|
102
|
-
|
103
|
-
#last of all, try the catchall
|
104
|
-
saw_matcher or @others===val or return
|
105
|
-
}
|
106
|
-
@literals.each_pair{|k,v| matchedliterals[k] or v==(other.default k) or return }
|
107
|
-
@matchers.each_pair{|k,v| matchedmatchers[k] or v===other.default or return }
|
108
|
-
other.empty? and @literals.empty? and @matchers.empty? and return @others===other.default
|
109
|
-
return true
|
110
|
-
end
|
111
|
-
|
112
|
-
#tla of +{}
|
113
|
-
assign_TLAs :Rah=>:Hash
|
114
|
-
|
115
|
-
end
|
116
|
-
|
117
|
-
#--------------------------
|
118
|
-
class OrderedHash
|
119
|
-
include Reg
|
120
|
-
def initialize(*args)
|
121
|
-
@keys=[]
|
122
|
-
@vals=[]
|
123
|
-
@others=nil
|
124
|
-
args.each{|a|
|
125
|
-
if Pair===a
|
126
|
-
l,r=a.left,a.right
|
127
|
-
Fixed===l and l=l.unwrap
|
128
|
-
if l==OB
|
129
|
-
@others=r
|
130
|
-
else
|
131
|
-
@keys<<l
|
132
|
-
@vals<<r
|
133
|
-
end
|
134
|
-
else
|
135
|
-
@keys<<a
|
136
|
-
@vals<<OB
|
137
|
-
end
|
138
|
-
}
|
139
|
-
end
|
140
|
-
|
141
|
-
def ===(other)
|
142
|
-
matched=0
|
143
|
-
saw1=nil
|
144
|
-
other.each_pair do |ko,vo|
|
145
|
-
saw1=nil
|
146
|
-
@vals.each_index do|i|
|
147
|
-
kr,vr=@keys[i],@vals[i]
|
148
|
-
if kr===ko
|
149
|
-
vr===vo or return
|
150
|
-
saw1=matched |= 1<<i
|
151
|
-
break
|
152
|
-
end
|
153
|
-
end
|
154
|
-
saw1 or (@others===vo or return)
|
155
|
-
end
|
156
|
-
@vals.each_index {|i|
|
157
|
-
unless (matched&(1<<i)).nonzero?
|
158
|
-
@vals[i]===other.default((@keys[i] unless Reg::interesting_matcher? @keys[i])) or return
|
159
|
-
end
|
160
|
-
}
|
161
|
-
other.empty? and @vals.empty? and return @others===other.default
|
162
|
-
# @subhashes.each do|subhash|
|
163
|
-
# subhash===other or return false
|
164
|
-
# end
|
165
|
-
return other||true #huh need more complex result?
|
166
|
-
end
|
167
|
-
|
168
|
-
def self.[](*args); new(*args); end
|
169
|
-
|
170
|
-
def matches_class; ::Hash end
|
171
|
-
|
172
|
-
def &; huh end
|
173
|
-
def inspect;
|
174
|
-
"+[#{
|
175
|
-
map{|k,v| k.inspect+ ((Reg===k)? "" : ".reg") +
|
176
|
-
"**"+v.inspect unless OB==k && nil==v
|
177
|
-
}.compact.join ", "
|
178
|
-
}]"
|
179
|
-
end
|
180
|
-
def subregs; huh end
|
181
|
-
|
182
|
-
def each
|
183
|
-
@keys.each_index{|i|
|
184
|
-
yield @keys[i],@vals[i]
|
185
|
-
}
|
186
|
-
yield OB,@others
|
187
|
-
end
|
188
|
-
include Enumerable
|
189
|
-
|
190
|
-
|
191
|
-
def to_ruby
|
192
|
-
result= "def self.===(a_hash)\n"
|
193
|
-
result<<" a_hash.each_pair{|k,v|\n"
|
194
|
-
result<<" case k\n"
|
195
|
-
@keys.each_index{|i|
|
196
|
-
result<<" when #{@keys[i]}: #{vals[i]}\n"
|
197
|
-
}
|
198
|
-
result<<" else #{@other}\n" +
|
199
|
-
" end===v or break\n" +
|
200
|
-
" }\n" +
|
201
|
-
"end\n"
|
202
|
-
|
203
|
-
return result
|
204
|
-
end
|
205
|
-
end
|
206
|
-
|
207
|
-
#--------------------------
|
208
|
-
class Object < Hash
|
209
|
-
#decending from Hash isn't particularly useful here
|
210
|
-
#it looks like everything (but &) is overridden, anyway
|
211
|
-
|
212
|
-
def initialize(*args)
|
213
|
-
hash= (::Hash===args.last ? args.pop : {})
|
214
|
-
@vars={}; @meths={}; @meth_matchers={}
|
215
|
-
hash.each_pair{|item,val|
|
216
|
-
if ::String===item or ::Symbol===item
|
217
|
-
item=item.to_s
|
218
|
-
(/^@@?/===item ? @vars : @meths)[item.to_sym]=val
|
219
|
-
else
|
220
|
-
@meth_matchers[item]=val
|
221
|
-
end
|
222
|
-
}
|
223
|
-
@meths[:class]=args.shift if (Module===args.first)
|
224
|
-
end
|
225
|
-
def self.[](*args) new(*args); end
|
226
|
-
|
227
|
-
|
228
|
-
def inspect
|
229
|
-
"-{"+@vars.inspect.sub( /^.(.*).$/, '\\1') +
|
230
|
-
@meths.inspect.sub(/^.(.*).$/, '\\1') +
|
231
|
-
@meth_matchers.inspect.sub(/^.(.*).$/, '\\1') + "}"
|
232
|
-
|
233
|
-
end
|
234
|
-
|
235
|
-
def matches_class
|
236
|
-
@meths[:class] or Object
|
237
|
-
end
|
238
|
-
|
239
|
-
def -@ #make object matcher
|
240
|
-
self
|
241
|
-
end
|
242
|
-
|
243
|
-
def ===(other)
|
244
|
-
seenmeths=[];seenvars=[];seenmats=[]
|
245
|
-
@meths.each_pair{|name,val|
|
246
|
-
val===other.send(name) or return
|
247
|
-
seenmeths<<name
|
248
|
-
}
|
249
|
-
@vars.each_pair{|name,val|
|
250
|
-
val===other.instance_eval(name.to_s) or return
|
251
|
-
seenvars<<name
|
252
|
-
}
|
253
|
-
@meth_matchers.empty? or other.public_methods.each {|meth|
|
254
|
-
@meth_matchers.each_pair{|name, val|
|
255
|
-
if name===meth
|
256
|
-
val===other.send(meth) || return
|
257
|
-
seenmats<< name
|
258
|
-
end
|
259
|
-
}
|
260
|
-
}
|
261
|
-
@meths.keys.-(seenmeths).empty? or return
|
262
|
-
@vars.keys.-(seenvars).empty? or return
|
263
|
-
@meth_matchers.keys.-(seenmats).empty? or return
|
264
|
-
|
265
|
-
|
266
|
-
return other || true
|
267
|
-
|
268
|
-
rescue
|
269
|
-
return false
|
270
|
-
end
|
271
|
-
|
272
|
-
#tla of -{}
|
273
|
-
assign_TLAs :Rob=>:Object
|
274
|
-
|
275
|
-
|
276
|
-
end
|
277
|
-
|
278
|
-
|
279
|
-
#OrderedObject not even attempted yet
|
280
|
-
|
281
|
-
module Reg
|
282
|
-
def **(other)
|
283
|
-
Pair[self,other]
|
284
|
-
end
|
285
|
-
alias has **
|
286
|
-
end
|
287
|
-
|
288
|
-
class Pair
|
289
|
-
include Reg
|
290
|
-
class<<self; alias [] new; end
|
291
|
-
|
292
|
-
attr_reader :left,:right
|
293
|
-
|
294
|
-
def initialize(l,r)
|
295
|
-
@left,@right=l,r
|
296
|
-
end
|
297
|
-
|
298
|
-
if false #not sure if i know what i want here...
|
299
|
-
def hash_cmp(hash,k,v)
|
300
|
-
@left
|
301
|
-
end
|
302
|
-
|
303
|
-
def obj_cmp
|
304
|
-
end
|
305
|
-
end
|
306
|
-
#tla of **
|
307
|
-
assign_TLAs :Rap=>:Pair
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
end
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
end
|
316
|
-
|
317
|
-
|
318
|
-
|