fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / compilers / pge / PGE / Match.pir
blob56b3473dba51020ee2f4fd2d3adb46dc3b181f31
1 # Copyright (C) 2005-2009, Parrot Foundation.
2 # $Id$
4 =head1 NAME
6 PGE::Match - implementation of PGE match objects
8 =head1 DESCRIPTION
10 This file implements match objects returned by the Parrot Grammar Engine.
12 =cut
14 .namespace [ 'PGE';'Match' ]
16 .sub '' :load
17     load_bytecode 'P6object.pbc'
18     load_bytecode 'PGE/Dumper.pir'                 # FIXME, XXX, etc.
19     .local pmc p6meta
20     p6meta = new 'P6metaclass'
21     $P0 = p6meta.'new_class'('PGE::Match', 'parent'=>'Capture', 'attr'=>'$.target $.from $.pos &!corou $!ast')
22     set_hll_global ['PGE'], '$!MATCH', $P0
23     .return ()
24 .end
26 =head2 Methods
28 =over 4
30 =item C<new(PMC src, [ PMC adverbs :slurpy :named ])>
32 Creates a new Match object based on C<src>.  If the C<grammar>
33 adverb is specified, then the new Match object is of the given
34 grammar class, otherwise if C<src> is an instance of C<Match>
35 (or a subclass) then that class is used to create the object,
36 otherwise it uses the class of the invocant.
38 The C<pos>, C<p>, C<continue>, or C<c> adverbs specify where
39 the match object should begin.  If no starting position is
40 given, the current position of C<src> is used if it has one,
41 otherwise the start position is at offset zero.  The C<from>
42 adverb can be used to initialize the Match's C<$.from>
43 attribute to a value other than the starting position.
45 The C<rw> adverb causes the invocant to be modified and
46 returned instead of creating a new Match object.
48 The C<new> method returns several values to the caller: the
49 initialized match object, the target the object is matching against,
50 a reference to its $.from attribute, a reference to its $.pos
51 attribute, the value of C<pos/p/continue/c> used to
52 initialize the object, and whether or not a continue flag
53 is set or implied.
55 =cut
57 .sub 'new' :method
58     .param pmc src
59     .param pmc adverbs         :slurpy :named
61     ##   set values based on src param
62     .local int issrcmatch, pos, iscont
63     .local pmc grammar
64     .local pmc target, grammar_class
65     issrcmatch = isa src, ['PGE';'Match']
66     if issrcmatch goto target_from_src
67     target = new 'CodeString'
68     assign target, src
69     pos = 0
70     iscont = 1
71     $P0 = self.'HOW'()
72     grammar_class = getattribute $P0, 'parrotclass'
73     goto adverb_pos
74   target_from_src:
75     target = getattribute src, '$.target'
76     $P0 = getattribute src, '$.pos'
77     pos = $P0
78     iscont = 0
79     grammar_class = typeof src
80     if pos >= 0 goto adverb_pos
81     pos = 0
83   adverb_pos:
84     unless adverbs goto with_adverbs
85     ##   determine the value of pos
86     $I0 = exists adverbs['pos']
87     unless $I0 goto adverb_p
88     pos = adverbs['pos']
89     iscont = 0
90     goto with_pos
91   adverb_p:
92     $I0 = exists adverbs['p']
93     unless $I0 goto adverb_continue
94     pos = adverbs['p']
95     iscont = 0
96     goto with_pos
97   adverb_continue:
98     $I0 = exists adverbs['continue']
99     unless $I0 goto adverb_c
100     pos = adverbs['continue']
101     iscont = 1
102     goto with_pos
103   adverb_c:
104     $I0 = exists adverbs['c']
105     unless $I0 goto with_pos
106     pos = adverbs['c']
107     iscont = 1
108   with_pos:
110     ##   figure out the class of the new object
111     $I0 = exists adverbs['grammar']
112     unless $I0 goto with_grammar
113     grammar = adverbs['grammar']
114     $S0 = typeof grammar
115     eq $S0, 'NameSpace', grammar_namespace
116     ne $S0, 'String', have_grammar
117     $S0 = grammar
118     $P0 = split '::', $S0
119     grammar_class = get_class $P0
120     goto with_grammar
121   have_grammar:
122     grammar_class = grammar
123   grammar_namespace:
124     grammar_class = get_class grammar
125   with_grammar:
126   with_adverbs:
128     ##   create the new match object
129     .local pmc mob, mfrom, mpos
130     mob = new grammar_class
131     setattribute mob, '$.target', target
132     mfrom = box pos
133     setattribute mob, '$.from', mfrom
134     mpos = box -1
135     setattribute mob, '$.pos', mpos
137     .return (mob, pos, target, mfrom, mpos, iscont)
138 .end
141 =item C<next()>
143 Tell a Match object to continue the previous match from where
144 it left off.
146 =cut
148 .sub 'next' :method
149     .local pmc corou
151     corou = getattribute self, '&!corou'
152     if_null corou, next_1
153     goto next_2
154   next_1:
155     $P0 = getattribute self, '$.pos'
156     $P0 = -1
157     goto end
158   next_2:
159     corou()
160   end:
161     .return ()
162 .end
165 =item C<from([int pos])>
167 Returns or sets the offset in the target string of the first item
168 this object matched.
170 =cut
172 .sub 'from' :method
173     .param int from            :optional
174     .param int has_from        :opt_flag
175     $P0 = getattribute self, '$.from'
176     if has_from == 0 goto get
177     $P0 = from
178   get:
179     .return ($P0)
180 .end
183 =item C<to([int pos])>
185 Returns or sets the offset at the end of this match.
187 =cut
189 .sub 'to' :method
190     .param int to              :optional
191     .param int has_to          :opt_flag
192     $P0 = getattribute self, '$.pos'
193     if has_to == 0 goto get
194     $P0 = to
195   get:
196     .return ($P0)
197 .end
200 =item C<chars()>
202 Returns C<.to()> - C<.from()>.
204 =cut
206 .sub 'chars' :method
207     $I0 = self.'to'()
208     $I1 = self.'from'()
209     $I2 = $I0 - $I1
210     unless $I2 < 0 goto done
211     $I2 = 0
212   done:
213     .return ($I2)
214 .end
217 =item C<Str()>
219 Returns the portion of the target string matched by this object.
221 =cut
223 .sub 'Str' :method
224     $P0 = getattribute self, '$.target'
225     $P1 = getattribute self, '$.from'
226     $P2 = getattribute self, '$.pos'
227     if $P2 < 0 goto false
228     if $P2 <= $P1 goto false
229     $I1 = $P1
230     $I2 = $P2
231     $I2 -= $I1
232     $S1 = substr $P0, $I1, $I2
233     .return ($S1)
234   false:
235     .return ('')
236 .end
239 =item C<orig()>
241 Return the original item being matched.
243 =cut
245 .sub 'orig' :method
246     $P0 = getattribute self, '$.target'
247     .return ($P0)
248 .end
251 =item C<!make(pmc obj)>
253 Sets the "ast object" for the Match invocant.
255 =cut
257 .sub '!make' :method
258     .param pmc obj
259     setattribute self, '$!ast', obj
260     .return (obj)
261 .end
264 =item C<ast([pmc obj])>
266 Returns the "ast object" for the match object.  If no ast object
267 has been set, then it returns the string between C<.from> and C<.to>.
269 =cut
271 .sub 'ast' :method
272     .local pmc obj
273     obj = getattribute self, '$!ast'
274     if null obj goto ret_null
275     .return (obj)
276   ret_null:
277     .tailcall self.'Str'()
278 .end
281 =item C<_failcut(int cutvalue)>
283 Immediately "fail" this Match object, removing any
284 captured entities and coroutine continuation.  Set
285 the position of the match object to C<cutvalue>.
287 =cut
289 .sub '_failcut' :method
290     .param int cutvalue
291     $P0 = getattribute self, '$.pos'
292     $P0 = cutvalue
293     null $P0
294     setattribute self, '$.target', $P0
295     setattribute self, '&!corou', $P0
296     setattribute self, '$!ast', $P0
297     setref self, $P0
298     .return ()
299 .end
302 =item C<get_bool()>
304 Returns 1 if this object successfully matched the target string,
305 0 otherwise.
307 =cut
309 .sub 'get_bool' :vtable :method
310     $P1 = getattribute self, '$.pos'
311     $I0 = $P1
312     $I1 = isge $I0, 0
313     .return ($I1)
314 .end
316 =item C<get_integer()>
318 Returns the integer value of this match.
320 =cut
322 .sub '' :vtable('get_integer') :method
323     $I0 = self.'Str'()
324     .return ($I0)
325 .end
327 =item C<get_number()>
329 Returns the numeric value of this match.
331 =cut
333 .sub '' :vtable('get_number') :method
334     $N0 = self.'Str'()
335     .return ($N0)
336 .end
338 =item C<get_string()>
340 Returns the portion of the target string matched by this object.
342 =cut
344 .sub '' :vtable('get_string') :method
345     $S0 = self.'Str'()
346     .return ($S0)
347 .end
349 =back
351 =head1 AUTHOR
353 Patrick Michaud (pmichaud@pobox.com) is the author and maintainer.
354 Patches and suggestions should be sent to the Perl 6 compiler list
355 (perl6-compiler@perl.org).
357 =cut
359 # Local Variables:
360 #   mode: pir
361 #   fill-column: 100
362 # End:
363 # vim: expandtab shiftwidth=4 ft=pir: