reg 0.4.6
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.
- data/COPYING +510 -0
- data/README +404 -0
- data/assert.rb +31 -0
- data/calc.reg +73 -0
- data/forward_to.rb +49 -0
- data/item_thattest.rb +47 -0
- data/numberset.rb +200 -0
- data/parser.txt +188 -0
- data/philosophy.txt +72 -0
- data/reg.gemspec +27 -0
- data/reg.rb +33 -0
- data/regarray.rb +675 -0
- data/regarrayold.rb +477 -0
- data/regbackref.rb +126 -0
- data/regbind.rb +74 -0
- data/regcase.rb +78 -0
- data/regcore.rb +379 -0
- data/regdeferred.rb +134 -0
- data/reggrid.csv +2 -1
- data/regguide.txt +416 -0
- data/reghash.rb +318 -0
- data/regitem_that.rb +146 -0
- data/regknows.rb +63 -0
- data/reglogic.rb +195 -0
- data/reglookab.rb +94 -0
- data/regold.rb +75 -0
- data/regpath.rb +74 -0
- data/regposition.rb +68 -0
- data/regprogress.rb +1067 -0
- data/regreplace.rb +114 -0
- data/regsugar.rb +230 -0
- data/regtest.rb +1075 -0
- data/regvar.rb +76 -0
- data/trace.rb +45 -0
- metadata +83 -0
data/regknows.rb
ADDED
@@ -0,0 +1,63 @@
|
|
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
|
+
class Knows
|
21
|
+
include Reg
|
22
|
+
attr :sym
|
23
|
+
def initialize(sym) @sym=sym end
|
24
|
+
|
25
|
+
def === (obj)
|
26
|
+
obj.respond_to? @sym
|
27
|
+
end
|
28
|
+
|
29
|
+
def [] *args
|
30
|
+
Args.new(sym,*args)
|
31
|
+
end
|
32
|
+
|
33
|
+
def -@; self end
|
34
|
+
|
35
|
+
def inspect
|
36
|
+
"-:#{sym}"
|
37
|
+
end
|
38
|
+
|
39
|
+
#(also, the usual [] => new alias)
|
40
|
+
class<< self
|
41
|
+
alias[]new
|
42
|
+
end
|
43
|
+
|
44
|
+
class Args < Knows
|
45
|
+
attr :argsreg
|
46
|
+
|
47
|
+
def initialize(sym,*argsreg)
|
48
|
+
super sym
|
49
|
+
@argsreg=::Reg[*argsreg]
|
50
|
+
end
|
51
|
+
|
52
|
+
def inspect
|
53
|
+
":#{sym}"+@argsreg.inspect[1..-1]
|
54
|
+
end
|
55
|
+
def ===(obj)
|
56
|
+
super and huh "need some more help here"
|
57
|
+
end
|
58
|
+
def -@; self end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
data/reglogic.rb
ADDED
@@ -0,0 +1,195 @@
|
|
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
|
+
|
20
|
+
|
21
|
+
|
22
|
+
module Reg
|
23
|
+
|
24
|
+
#--------------------------
|
25
|
+
module Reg
|
26
|
+
|
27
|
+
#logical negation - returns a new reg that matches everything
|
28
|
+
#that the receiver doesn't.
|
29
|
+
def ~
|
30
|
+
Not.new(self)
|
31
|
+
end
|
32
|
+
alias not ~
|
33
|
+
|
34
|
+
#create a Reg matching either self or other (or both).
|
35
|
+
#(creates a Reg::Or.)
|
36
|
+
#Reg#|'s may be chained; the result is a single large
|
37
|
+
#Reg::Or containing all the subexpressions directly,
|
38
|
+
#rather than a linked list of Reg::Or's.
|
39
|
+
#
|
40
|
+
#if any subRegs of | are vector Regs, the larger | Reg
|
41
|
+
#is considered a vector as well. eats as much
|
42
|
+
#input as the subexpression which matched. unlike other
|
43
|
+
#vector Reg expressions, | is not greedy; instead, the
|
44
|
+
#first alternative which matches is accepted. (subject
|
45
|
+
#to later backtracking, of course.)
|
46
|
+
def |(other)
|
47
|
+
Or.new(self,other)
|
48
|
+
end
|
49
|
+
|
50
|
+
#create a Reg matching self and other. (creates a Reg::And).
|
51
|
+
#Reg#&'s may be chained; the result is a single large
|
52
|
+
#Reg::And containing all the subexpressions directly,
|
53
|
+
#rather than a linked list of Reg::And's.
|
54
|
+
#
|
55
|
+
#if any subRegs of & are vector Regs, the larger & Reg
|
56
|
+
#is considered a vector as well. eats as much
|
57
|
+
#input as the longest subexpression.
|
58
|
+
def &(other)
|
59
|
+
And.new(self,other)
|
60
|
+
end
|
61
|
+
|
62
|
+
#create a Reg matching either self or other, but not both.
|
63
|
+
#(creates a Reg::Xor).
|
64
|
+
#Reg#^'s may be chained; the result is a single large
|
65
|
+
#Reg::Xor containing all the subexpressions directly,
|
66
|
+
#rather than a linked list of Reg::Xor's. (believe it or not,
|
67
|
+
#this has the same semantics.) in an xor chain created this
|
68
|
+
#way, only one of the several alternatives may match. if
|
69
|
+
#2 or more alternatives both match, the larger xor
|
70
|
+
#expression will fail.
|
71
|
+
#
|
72
|
+
#if any subRegs of ^ are vector Regs, the larger ^ Reg
|
73
|
+
#is considered a vector as well. eats as much input as
|
74
|
+
#the (only) subReg which matches.
|
75
|
+
def ^(other)
|
76
|
+
Xor.new(self,other)
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
#--------------------------
|
83
|
+
class Not
|
84
|
+
include Reg
|
85
|
+
def initialize(reg)
|
86
|
+
@reg=reg
|
87
|
+
maybe_multiples(reg)
|
88
|
+
end
|
89
|
+
def ===(obj)
|
90
|
+
!(@reg===obj)
|
91
|
+
end
|
92
|
+
def ~
|
93
|
+
@reg
|
94
|
+
end
|
95
|
+
|
96
|
+
#deMorgan's methods...
|
97
|
+
def &(reg)
|
98
|
+
if Not===reg
|
99
|
+
~( ~self | ~reg )
|
100
|
+
else
|
101
|
+
super reg
|
102
|
+
end
|
103
|
+
end
|
104
|
+
def |(reg)
|
105
|
+
if Not===reg
|
106
|
+
~( ~self & ~reg )
|
107
|
+
else
|
108
|
+
super reg
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
#mmatch_multiple implementation needed
|
113
|
+
|
114
|
+
def inspect
|
115
|
+
"~("+@reg.inspect+")"
|
116
|
+
end
|
117
|
+
|
118
|
+
def subregs; [@reg] end
|
119
|
+
end
|
120
|
+
|
121
|
+
#--------------------------
|
122
|
+
class Or
|
123
|
+
include Reg
|
124
|
+
attr :regs
|
125
|
+
def initialize(*regs)
|
126
|
+
@regs=regs
|
127
|
+
|
128
|
+
maybe_multiples(*regs)
|
129
|
+
end
|
130
|
+
def ===(obj)
|
131
|
+
@regs.each {|reg| reg===obj and return obj }
|
132
|
+
return false
|
133
|
+
end
|
134
|
+
|
135
|
+
def |(reg)
|
136
|
+
newregs=@regs + ((self.class===reg )? reg.regs : [reg])
|
137
|
+
self.class.new(*newregs)
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
def inspect
|
142
|
+
@regs.collect{|r| r.inspect}.join' | '
|
143
|
+
end
|
144
|
+
|
145
|
+
def subregs; @regs end
|
146
|
+
end
|
147
|
+
|
148
|
+
#--------------------------
|
149
|
+
class And
|
150
|
+
include Reg
|
151
|
+
attr :regs
|
152
|
+
def initialize(*regs)
|
153
|
+
@regs=regs
|
154
|
+
maybe_multiples(*regs)
|
155
|
+
end
|
156
|
+
def ===(obj)
|
157
|
+
@regs.each {|reg| @reg===obj or return false }
|
158
|
+
return obj
|
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' & '
|
167
|
+
end
|
168
|
+
|
169
|
+
def subregs; @regs end
|
170
|
+
end
|
171
|
+
|
172
|
+
#--------------------------
|
173
|
+
class Xor
|
174
|
+
include Reg
|
175
|
+
attr :regs
|
176
|
+
def initialize(*regs)
|
177
|
+
@regs=regs
|
178
|
+
maybe_multiples(*regs)
|
179
|
+
end
|
180
|
+
def ===(obj)
|
181
|
+
@regs.find_all {|reg| reg===obj }.size==1
|
182
|
+
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' ^ '
|
191
|
+
end
|
192
|
+
|
193
|
+
def subregs; @regs end
|
194
|
+
end
|
195
|
+
end
|
data/reglookab.rb
ADDED
@@ -0,0 +1,94 @@
|
|
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 la; LookAhead.new self end
|
22
|
+
def lb; LookBack.new self end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
class LookAhead
|
27
|
+
include Reg
|
28
|
+
include Multiple
|
29
|
+
def initialize(reg)
|
30
|
+
@reg=reg
|
31
|
+
end
|
32
|
+
|
33
|
+
def mmatch(pr)
|
34
|
+
@reg.mmatch(pr.subprogress pr.cursor.position,@reg)
|
35
|
+
end
|
36
|
+
|
37
|
+
def itemrange; 0..0 end
|
38
|
+
|
39
|
+
#most methods should be forwarded to @reg... tbd
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
class LookBack
|
45
|
+
include Reg
|
46
|
+
include Multiple
|
47
|
+
|
48
|
+
def initialize(reg)
|
49
|
+
|
50
|
+
r=reg.itemrange
|
51
|
+
@r=r.last-r.first
|
52
|
+
@reg=reg
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
def itemrange; 0..0 end
|
57
|
+
|
58
|
+
def regs
|
59
|
+
[*regs_ary(huh)]
|
60
|
+
end
|
61
|
+
|
62
|
+
def regs_ary(pos,r=@r)
|
63
|
+
[ (OB-r).l, @reg, Position[pos] ] #require unimplemented lazy operator....
|
64
|
+
end
|
65
|
+
|
66
|
+
def mmatch(pr)
|
67
|
+
cu=pr.cursor
|
68
|
+
ra=@reg.itemrange
|
69
|
+
pos=cu.pos
|
70
|
+
startpos=pos-ra.last
|
71
|
+
r=if startpos<0
|
72
|
+
huh 'dunno what to do here'
|
73
|
+
foo=ra.first+startpos
|
74
|
+
startpos=0
|
75
|
+
pos-ra.first
|
76
|
+
else
|
77
|
+
@r
|
78
|
+
end
|
79
|
+
reg= +regs_ary(pos,r)
|
80
|
+
cu=cu.position
|
81
|
+
cu.pos=startpos
|
82
|
+
reg.mmatch pr.subprogress(cu,reg)
|
83
|
+
|
84
|
+
#original pr.cursor position should be unchanged
|
85
|
+
assert pos==cu.pos
|
86
|
+
|
87
|
+
huh #result should be fixed up to remove evidence of
|
88
|
+
#the subsequence and all but it's middle element.
|
89
|
+
end
|
90
|
+
|
91
|
+
#most methods should be forwarded to @reg... tbd
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
data/regold.rb
ADDED
@@ -0,0 +1,75 @@
|
|
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
|
+
|
20
|
+
|
21
|
+
#the names defined here are considered obsolete, and will not be supported
|
22
|
+
#anymore at some point in the future.
|
23
|
+
|
24
|
+
for name in ["And", "Array","Equals", "Fixed", "Hash", "Literal",
|
25
|
+
"Multiple", "Not", "Object", "Or", "Repeat",
|
26
|
+
"String", "Subseq", "Symbol", "Xor"] do
|
27
|
+
|
28
|
+
if Class===::Reg.const_get(name)
|
29
|
+
eval <<-endeval
|
30
|
+
class ::Reg#{name} < Reg::#{name}
|
31
|
+
|
32
|
+
def initialize(*args,&block)
|
33
|
+
@@warned_already ||= !warn("Reg#{name} is obsolete; use Reg::#{name} instead")
|
34
|
+
super
|
35
|
+
end
|
36
|
+
end
|
37
|
+
endeval
|
38
|
+
else
|
39
|
+
eval <<-endeval
|
40
|
+
module ::Reg#{name}; include Reg::#{name}
|
41
|
+
def self.included(*args,&block)
|
42
|
+
@@warned_already ||= !warn("Reg#{name} is obsolete; use Reg::#{name} instead")
|
43
|
+
super
|
44
|
+
end
|
45
|
+
end
|
46
|
+
endeval
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
# Object.const_set "Reg"+name, (Reg.const_get name)
|
51
|
+
end
|
52
|
+
|
53
|
+
#need a way to obsolete these...
|
54
|
+
Reg::Number=Range
|
55
|
+
Reg::Const=Reg::Deferred::Const
|
56
|
+
|
57
|
+
#--------------------------
|
58
|
+
#an executable Reg... a Proc that responds to ===
|
59
|
+
#obsolete: please use item_that instead.
|
60
|
+
def proceq(klass=Object,&block)
|
61
|
+
@@proceqWarnedAlready ||= !warn( "proceq is obsolete; please use item_that instead")
|
62
|
+
|
63
|
+
block.arity.abs==1 or raise ArgumentError.new( "must be 1 arg")
|
64
|
+
class <<block
|
65
|
+
include Reg::Reg
|
66
|
+
def klass=(k) @@klass=k end
|
67
|
+
alias === call
|
68
|
+
#eventually pass (more) params to call
|
69
|
+
def matches_class; @@klass end
|
70
|
+
alias starts_with matches_class
|
71
|
+
alias ends_with matches_class
|
72
|
+
end
|
73
|
+
block.klass=klass
|
74
|
+
block
|
75
|
+
end
|
data/regpath.rb
ADDED
@@ -0,0 +1,74 @@
|
|
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
|
+
|
20
|
+
=begin
|
21
|
+
path specification:
|
22
|
+
each path is relative to the reg it references into.
|
23
|
+
|
24
|
+
in order to support named subexpressions, most reg classes that participate
|
25
|
+
in paths (the ones listed below) will also take a subreg of the reg as a path
|
26
|
+
component. regs that cannot accept a subreg are marked with stars
|
27
|
+
|
28
|
+
reg classes participating in paths: and their respective path component:
|
29
|
+
RegString (=Regexp) backref integer index **
|
30
|
+
RegSymbol ditto **
|
31
|
+
RegArray integer index
|
32
|
+
RegSubseq ditto
|
33
|
+
RegHash hash key (of something that matched) ...value?
|
34
|
+
RegObject name (as sym) ...return value?
|
35
|
+
RegOr integer index
|
36
|
+
RegAnd ditto
|
37
|
+
RegXor ditto
|
38
|
+
RegNot nil only *
|
39
|
+
RegRepeat integer index *
|
40
|
+
(not really named) RegProc 1 of above, depending on what it returned
|
41
|
+
|
42
|
+
* doesn't take a subreg of the reg as index
|
43
|
+
** doesn't take a subreg and must be end of path (or before -1)
|
44
|
+
|
45
|
+
special components:
|
46
|
+
-1 means go up one level (like .. in directory paths)
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
single ________fixed
|
52
|
+
_____multiple--------
|
53
|
+
vector-----variable
|
54
|
+
|
55
|
+
|
56
|
+
dataclasses
|
57
|
+
matchers--v String Array
|
58
|
+
Integer single single
|
59
|
+
String multiple single
|
60
|
+
Regexp variable single
|
61
|
+
Reg::Subseq var(=>any) var(=>any)
|
62
|
+
Reg::Array n/a? single
|
63
|
+
Reg::Hash n/a single
|
64
|
+
Reg::Repeat var(=>any) var(=>any)
|
65
|
+
Lookahead/back multiple multiple (0 really)
|
66
|
+
~single single single
|
67
|
+
~multiple multiple multiple
|
68
|
+
~vector multiple multiple (0 really; lookahead automatic)
|
69
|
+
|
70
|
+
|
71
|
+
others n/a single
|
72
|
+
|
73
|
+
|
74
|
+
=end
|