This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
porting/diag.t: Add comments
[perl5.git] / mad / P5AST.pm
1 package P5AST;
2
3 $::herequeue = '';
4
5 1;
6
7 {
8     my %newkey = qw(
9     );
10
11     sub translate {
12         my $class = shift;
13         my $key = shift;
14         $key = $newkey{$key} || "op_$key";
15         return "P5AST::$key";
16     }
17 }
18
19 sub new {
20     my $class = shift;
21     bless {@_}, $class;
22 }
23
24 sub AUTOLOAD {
25     warn "AUTOLOAD $P5AST::AUTOLOAD(" . join(',', @_) . ")\n";
26 }
27
28 sub DESTROY { }
29
30 sub p5arraytext {
31     my $kid = shift;
32     my $text = "";
33     for my $subkid (@$kid) {
34         my $type = ref $subkid;
35         if ($type eq 'ARRAY') {
36             if ($dowarn) {
37                 warn "Extra array\n";
38                 $text .= '〔 '. p5arraytext($subkid) . ' 〕';
39             }
40             else {
41                 $text .= p5arraytext($subkid);
42             }
43         }
44         elsif ($type =~ /^p5::/) {
45             my $newtext = $subkid->enc();
46             if ($::herequeue && $newtext =~ s/\n/\n$::herequeue/) {
47                 $::herequeue = '';
48             }
49             $text .= $newtext;
50         }
51         elsif ($type) {
52             $text .= $subkid->text(@_);
53         }
54         else {
55             $text .= $subkid;
56         }
57     }
58     return $text;
59 }
60
61 sub p5text {
62     my $self = shift;
63 #    my $pre = $self->pretext();
64 #    my $post = $self->posttext();
65     my $text = "";
66     foreach my $kid (@{$$self{Kids}}) {
67         my $type = ref $kid;
68         if ($type eq 'ARRAY') {
69             $text .= p5arraytext($kid);
70         }
71         elsif ($type =~ /^p5::/) {
72             my $newtext = $kid->enc();
73             if ($::herequeue && $newtext =~ s/\n/\n$::herequeue/) {
74                 $::herequeue = '';
75             }
76             $text .= $newtext;
77         }
78         elsif ($type eq "chomp") {
79             $text =~ s/\n$//g;
80         }
81         elsif ($type) {
82             $text .= $kid->p5text(@_);
83         }
84         elsif (defined $kid) {
85             $text .= $kid;
86         }
87         else {
88             $text .= '[[[ UNDEF ]]]';
89         }
90     }
91     return $text;
92 }
93
94 sub p5subtext {
95     my $self = shift;
96     my @text;
97     foreach my $kid (@{$$self{Kids}}) {
98         my $text = $kid->p5text(@_);
99         push @text, $text if defined $text;
100     }
101     return @text;
102 }
103
104 sub p6text {
105     return $_[0]->p5text();     # assume it's the same
106 }
107
108 package P5AST::heredoc; @ISA = 'P5AST';
109
110 sub p5text {
111     my $self = shift;
112     my $newdoc;
113     {
114         local $::herequeue;                     # don't interpolate outer heredoc yet
115         $newdoc = $self->{doc}->p5text(@_) .  $self->{end}->enc();
116         if ($::herequeue) {                     # heredoc within the heredoc?
117             $newdoc .= $::herequeue;
118             $::herequeue = '';
119         }
120     }
121     $::herequeue .= $newdoc;
122     my $start = $self->{start};
123     my $type = ref $start;
124     if ($type =~ /^p5::/) {             # XXX too much cut-n-paste here...
125         return $start->enc();
126     }
127     elsif ($type) {
128         return $start->p5text(@_);
129     }
130     else {
131         return $start;
132     }
133 }
134
135 package P5AST::BAD;
136
137 sub p5text {
138     my $self = shift;
139     my $t = ref $t;
140     warn "Shouldn't have a node of type $t";
141 }
142
143 package P5AST::baseop;          @ISA = 'P5AST';
144 package P5AST::baseop_unop;     @ISA = 'P5AST::baseop';
145 package P5AST::binop;           @ISA = 'P5AST::baseop';
146 package P5AST::cop;             @ISA = 'P5AST::baseop';
147 package P5AST::filestatop;      @ISA = 'P5AST::baseop';
148 package P5AST::listop;          @ISA = 'P5AST::baseop';
149 package P5AST::logop;           @ISA = 'P5AST::baseop';
150 package P5AST::loop;            @ISA = 'P5AST::baseop';
151 package P5AST::loopexop;        @ISA = 'P5AST::baseop';
152 package P5AST::padop;           @ISA = 'P5AST::baseop';
153 package P5AST::padop_svop;      @ISA = 'P5AST::baseop';
154 package P5AST::pmop;            @ISA = 'P5AST::baseop';
155 package P5AST::pvop_svop;       @ISA = 'P5AST::baseop';
156 package P5AST::unop;            @ISA = 'P5AST::baseop';
157
158 # Nothing.
159
160 package P5AST::op_null;         @ISA = 'P5AST::baseop';
161 package P5AST::op_stub;         @ISA = 'P5AST::baseop';
162 package P5AST::op_scalar;       @ISA = 'P5AST::baseop_unop';
163
164 # Pushy stuff.
165
166 package P5AST::op_pushmark;     @ISA = 'P5AST::baseop';
167 package P5AST::op_wantarray;    @ISA = 'P5AST::baseop';
168 package P5AST::op_const;        @ISA = 'P5AST::padop_svop';
169 package P5AST::op_gvsv;         @ISA = 'P5AST::padop_svop';
170 package P5AST::op_gv;           @ISA = 'P5AST::padop_svop';
171 package P5AST::op_gelem;        @ISA = 'P5AST::binop';
172 package P5AST::op_padsv;        @ISA = 'P5AST::baseop';
173 package P5AST::op_padav;        @ISA = 'P5AST::baseop';
174 package P5AST::op_padhv;        @ISA = 'P5AST::baseop';
175 package P5AST::op_padany;       @ISA = 'P5AST::baseop';
176 package P5AST::op_pushre;       @ISA = 'P5AST::pmop';
177 package P5AST::op_rv2gv;        @ISA = 'P5AST::unop';
178 package P5AST::op_rv2sv;        @ISA = 'P5AST::unop';
179 package P5AST::op_av2arylen;    @ISA = 'P5AST::unop';
180 package P5AST::op_rv2cv;        @ISA = 'P5AST::unop';
181 package P5AST::op_anoncode;     @ISA = 'P5AST::padop_svop';
182 package P5AST::op_prototype;    @ISA = 'P5AST::baseop_unop';
183 package P5AST::op_refgen;       @ISA = 'P5AST::unop';
184 package P5AST::op_srefgen;      @ISA = 'P5AST::unop';
185 package P5AST::op_ref;          @ISA = 'P5AST::baseop_unop';
186 package P5AST::op_bless;        @ISA = 'P5AST::listop';
187 package P5AST::op_backtick;     @ISA = 'P5AST::baseop_unop';
188 package P5AST::op_glob;         @ISA = 'P5AST::listop';
189 package P5AST::op_readline;     @ISA = 'P5AST::baseop_unop';
190 package P5AST::op_rcatline;     @ISA = 'P5AST::padop_svop';
191 package P5AST::op_regcmaybe;    @ISA = 'P5AST::unop';
192 package P5AST::op_regcreset;    @ISA = 'P5AST::unop';
193 package P5AST::op_regcomp;      @ISA = 'P5AST::logop';
194 package P5AST::op_match;        @ISA = 'P5AST::pmop';
195 package P5AST::op_qr;           @ISA = 'P5AST::pmop';
196 package P5AST::op_subst;        @ISA = 'P5AST::pmop';
197 package P5AST::op_substcont;    @ISA = 'P5AST::logop';
198 package P5AST::op_trans;        @ISA = 'P5AST::pvop_svop';
199 package P5AST::op_sassign;      @ISA = 'P5AST::baseop';
200 package P5AST::op_aassign;      @ISA = 'P5AST::binop';
201 package P5AST::op_chop;         @ISA = 'P5AST::baseop_unop';
202 package P5AST::op_schop;        @ISA = 'P5AST::baseop_unop';
203 package P5AST::op_chomp;        @ISA = 'P5AST::baseop_unop';
204 package P5AST::op_schomp;       @ISA = 'P5AST::baseop_unop';
205 package P5AST::op_defined;      @ISA = 'P5AST::baseop_unop';
206 package P5AST::op_undef;        @ISA = 'P5AST::baseop_unop';
207 package P5AST::op_study;        @ISA = 'P5AST::baseop_unop';
208 package P5AST::op_pos;          @ISA = 'P5AST::baseop_unop';
209 package P5AST::op_preinc;       @ISA = 'P5AST::unop';
210 package P5AST::op_i_preinc;     @ISA = 'P5AST::unop';
211 package P5AST::op_predec;       @ISA = 'P5AST::unop';
212 package P5AST::op_i_predec;     @ISA = 'P5AST::unop';
213 package P5AST::op_postinc;      @ISA = 'P5AST::unop';
214 package P5AST::op_i_postinc;    @ISA = 'P5AST::unop';
215 package P5AST::op_postdec;      @ISA = 'P5AST::unop';
216 package P5AST::op_i_postdec;    @ISA = 'P5AST::unop';
217 package P5AST::op_pow;          @ISA = 'P5AST::binop';
218 package P5AST::op_multiply;     @ISA = 'P5AST::binop';
219 package P5AST::op_i_multiply;   @ISA = 'P5AST::binop';
220 package P5AST::op_divide;       @ISA = 'P5AST::binop';
221 package P5AST::op_i_divide;     @ISA = 'P5AST::binop';
222 package P5AST::op_modulo;       @ISA = 'P5AST::binop';
223 package P5AST::op_i_modulo;     @ISA = 'P5AST::binop';
224 package P5AST::op_repeat;       @ISA = 'P5AST::binop';
225 package P5AST::op_add;          @ISA = 'P5AST::binop';
226 package P5AST::op_i_add;        @ISA = 'P5AST::binop';
227 package P5AST::op_subtract;     @ISA = 'P5AST::binop';
228 package P5AST::op_i_subtract;   @ISA = 'P5AST::binop';
229 package P5AST::op_concat;       @ISA = 'P5AST::binop';
230 package P5AST::op_stringify;    @ISA = 'P5AST::listop';
231 package P5AST::op_left_shift;   @ISA = 'P5AST::binop';
232 package P5AST::op_right_shift;  @ISA = 'P5AST::binop';
233 package P5AST::op_lt;           @ISA = 'P5AST::binop';
234 package P5AST::op_i_lt;         @ISA = 'P5AST::binop';
235 package P5AST::op_gt;           @ISA = 'P5AST::binop';
236 package P5AST::op_i_gt;         @ISA = 'P5AST::binop';
237 package P5AST::op_le;           @ISA = 'P5AST::binop';
238 package P5AST::op_i_le;         @ISA = 'P5AST::binop';
239 package P5AST::op_ge;           @ISA = 'P5AST::binop';
240 package P5AST::op_i_ge;         @ISA = 'P5AST::binop';
241 package P5AST::op_eq;           @ISA = 'P5AST::binop';
242 package P5AST::op_i_eq;         @ISA = 'P5AST::binop';
243 package P5AST::op_ne;           @ISA = 'P5AST::binop';
244 package P5AST::op_i_ne;         @ISA = 'P5AST::binop';
245 package P5AST::op_ncmp;         @ISA = 'P5AST::binop';
246 package P5AST::op_i_ncmp;       @ISA = 'P5AST::binop';
247 package P5AST::op_slt;          @ISA = 'P5AST::binop';
248 package P5AST::op_sgt;          @ISA = 'P5AST::binop';
249 package P5AST::op_sle;          @ISA = 'P5AST::binop';
250 package P5AST::op_sge;          @ISA = 'P5AST::binop';
251 package P5AST::op_seq;          @ISA = 'P5AST::binop';
252 package P5AST::op_sne;          @ISA = 'P5AST::binop';
253 package P5AST::op_scmp;         @ISA = 'P5AST::binop';
254 package P5AST::op_bit_and;      @ISA = 'P5AST::binop';
255 package P5AST::op_bit_xor;      @ISA = 'P5AST::binop';
256 package P5AST::op_bit_or;       @ISA = 'P5AST::binop';
257 package P5AST::op_negate;       @ISA = 'P5AST::unop';
258 package P5AST::op_i_negate;     @ISA = 'P5AST::unop';
259 package P5AST::op_not;          @ISA = 'P5AST::unop';
260 package P5AST::op_complement;   @ISA = 'P5AST::unop';
261 package P5AST::op_atan2;        @ISA = 'P5AST::listop';
262 package P5AST::op_sin;          @ISA = 'P5AST::baseop_unop';
263 package P5AST::op_cos;          @ISA = 'P5AST::baseop_unop';
264 package P5AST::op_rand;         @ISA = 'P5AST::baseop_unop';
265 package P5AST::op_srand;        @ISA = 'P5AST::baseop_unop';
266 package P5AST::op_exp;          @ISA = 'P5AST::baseop_unop';
267 package P5AST::op_log;          @ISA = 'P5AST::baseop_unop';
268 package P5AST::op_sqrt;         @ISA = 'P5AST::baseop_unop';
269 package P5AST::op_int;          @ISA = 'P5AST::baseop_unop';
270 package P5AST::op_hex;          @ISA = 'P5AST::baseop_unop';
271 package P5AST::op_oct;          @ISA = 'P5AST::baseop_unop';
272 package P5AST::op_abs;          @ISA = 'P5AST::baseop_unop';
273 package P5AST::op_length;       @ISA = 'P5AST::baseop_unop';
274 package P5AST::op_substr;       @ISA = 'P5AST::listop';
275 package P5AST::op_vec;          @ISA = 'P5AST::listop';
276 package P5AST::op_index;        @ISA = 'P5AST::listop';
277 package P5AST::op_rindex;       @ISA = 'P5AST::listop';
278 package P5AST::op_sprintf;      @ISA = 'P5AST::listop';
279 package P5AST::op_formline;     @ISA = 'P5AST::listop';
280 package P5AST::op_ord;          @ISA = 'P5AST::baseop_unop';
281 package P5AST::op_chr;          @ISA = 'P5AST::baseop_unop';
282 package P5AST::op_crypt;        @ISA = 'P5AST::listop';
283 package P5AST::op_ucfirst;      @ISA = 'P5AST::baseop_unop';
284 package P5AST::op_lcfirst;      @ISA = 'P5AST::baseop_unop';
285 package P5AST::op_uc;           @ISA = 'P5AST::baseop_unop';
286 package P5AST::op_lc;           @ISA = 'P5AST::baseop_unop';
287 package P5AST::op_quotemeta;    @ISA = 'P5AST::baseop_unop';
288 package P5AST::op_rv2av;        @ISA = 'P5AST::unop';
289 package P5AST::op_aelemfast;    @ISA = 'P5AST::padop_svop';
290 package P5AST::op_aelem;        @ISA = 'P5AST::binop';
291 package P5AST::op_aslice;       @ISA = 'P5AST::listop';
292 package P5AST::op_each;         @ISA = 'P5AST::baseop_unop';
293 package P5AST::op_values;       @ISA = 'P5AST::baseop_unop';
294 package P5AST::op_keys;         @ISA = 'P5AST::baseop_unop';
295 package P5AST::op_delete;       @ISA = 'P5AST::baseop_unop';
296 package P5AST::op_exists;       @ISA = 'P5AST::baseop_unop';
297 package P5AST::op_rv2hv;        @ISA = 'P5AST::unop';
298 package P5AST::op_helem;        @ISA = 'P5AST::listop';
299 package P5AST::op_hslice;       @ISA = 'P5AST::listop';
300 package P5AST::op_unpack;       @ISA = 'P5AST::listop';
301 package P5AST::op_pack;         @ISA = 'P5AST::listop';
302 package P5AST::op_split;        @ISA = 'P5AST::listop';
303 package P5AST::op_join;         @ISA = 'P5AST::listop';
304 package P5AST::op_list;         @ISA = 'P5AST::listop';
305 package P5AST::op_lslice;       @ISA = 'P5AST::binop';
306 package P5AST::op_anonlist;     @ISA = 'P5AST::listop';
307 package P5AST::op_anonhash;     @ISA = 'P5AST::listop';
308 package P5AST::op_splice;       @ISA = 'P5AST::listop';
309 package P5AST::op_push;         @ISA = 'P5AST::listop';
310 package P5AST::op_pop;          @ISA = 'P5AST::baseop_unop';
311 package P5AST::op_shift;        @ISA = 'P5AST::baseop_unop';
312 package P5AST::op_unshift;      @ISA = 'P5AST::listop';
313 package P5AST::op_sort;         @ISA = 'P5AST::listop';
314 package P5AST::op_reverse;      @ISA = 'P5AST::listop';
315 package P5AST::op_grepstart;    @ISA = 'P5AST::listop';
316 package P5AST::op_grepwhile;    @ISA = 'P5AST::logop';
317 package P5AST::op_mapstart;     @ISA = 'P5AST::listop';
318 package P5AST::op_mapwhile;     @ISA = 'P5AST::logop';
319 package P5AST::op_range;        @ISA = 'P5AST::logop';
320 package P5AST::op_flip;         @ISA = 'P5AST::unop';
321 package P5AST::op_flop;         @ISA = 'P5AST::unop';
322 package P5AST::op_and;          @ISA = 'P5AST::logop';
323 package P5AST::op_or;           @ISA = 'P5AST::logop';
324 package P5AST::op_xor;          @ISA = 'P5AST::binop';
325 package P5AST::op_cond_expr;    @ISA = 'P5AST::logop';
326 package P5AST::op_andassign;    @ISA = 'P5AST::logop';
327 package P5AST::op_orassign;     @ISA = 'P5AST::logop';
328 package P5AST::op_method;       @ISA = 'P5AST::unop';
329 package P5AST::op_entersub;     @ISA = 'P5AST::unop';
330 package P5AST::op_leavesub;     @ISA = 'P5AST::unop';
331 package P5AST::op_leavesublv;   @ISA = 'P5AST::unop';
332 package P5AST::op_caller;       @ISA = 'P5AST::baseop_unop';
333 package P5AST::op_warn;         @ISA = 'P5AST::listop';
334 package P5AST::op_die;          @ISA = 'P5AST::listop';
335 package P5AST::op_reset;        @ISA = 'P5AST::baseop_unop';
336 package P5AST::op_lineseq;      @ISA = 'P5AST::listop';
337 package P5AST::op_nextstate;    @ISA = 'P5AST::BAD';
338 package P5AST::op_dbstate;      @ISA = 'P5AST::cop';
339 package P5AST::op_unstack;      @ISA = 'P5AST::baseop';
340 package P5AST::op_enter;        @ISA = 'P5AST::baseop';
341 package P5AST::op_leave;        @ISA = 'P5AST::listop';
342 package P5AST::op_scope;        @ISA = 'P5AST::listop';
343 package P5AST::op_enteriter;    @ISA = 'P5AST::loop';
344 package P5AST::op_iter;         @ISA = 'P5AST::baseop';
345 package P5AST::op_enterloop;    @ISA = 'P5AST::loop';
346 package P5AST::op_leaveloop;    @ISA = 'P5AST::binop';
347 package P5AST::op_return;       @ISA = 'P5AST::listop';
348 package P5AST::op_last;         @ISA = 'P5AST::loopexop';
349 package P5AST::op_next;         @ISA = 'P5AST::loopexop';
350 package P5AST::op_redo;         @ISA = 'P5AST::loopexop';
351 package P5AST::op_dump;         @ISA = 'P5AST::loopexop';
352 package P5AST::op_goto;         @ISA = 'P5AST::loopexop';
353 package P5AST::op_exit;         @ISA = 'P5AST::baseop_unop';
354 package P5AST::op_open;         @ISA = 'P5AST::listop';
355 package P5AST::op_close;        @ISA = 'P5AST::baseop_unop';
356 package P5AST::op_pipe_op;      @ISA = 'P5AST::listop';
357 package P5AST::op_fileno;       @ISA = 'P5AST::baseop_unop';
358 package P5AST::op_umask;        @ISA = 'P5AST::baseop_unop';
359 package P5AST::op_binmode;      @ISA = 'P5AST::listop';
360 package P5AST::op_tie;          @ISA = 'P5AST::listop';
361 package P5AST::op_untie;        @ISA = 'P5AST::baseop_unop';
362 package P5AST::op_tied;         @ISA = 'P5AST::baseop_unop';
363 package P5AST::op_dbmopen;      @ISA = 'P5AST::listop';
364 package P5AST::op_dbmclose;     @ISA = 'P5AST::baseop_unop';
365 package P5AST::op_sselect;      @ISA = 'P5AST::listop';
366 package P5AST::op_select;       @ISA = 'P5AST::listop';
367 package P5AST::op_getc;         @ISA = 'P5AST::baseop_unop';
368 package P5AST::op_read;         @ISA = 'P5AST::listop';
369 package P5AST::op_enterwrite;   @ISA = 'P5AST::baseop_unop';
370 package P5AST::op_leavewrite;   @ISA = 'P5AST::unop';
371 package P5AST::op_prtf;         @ISA = 'P5AST::listop';
372 package P5AST::op_print;        @ISA = 'P5AST::listop';
373 package P5AST::op_say;          @ISA = 'P5AST::listop';
374 package P5AST::op_sysopen;      @ISA = 'P5AST::listop';
375 package P5AST::op_sysseek;      @ISA = 'P5AST::listop';
376 package P5AST::op_sysread;      @ISA = 'P5AST::listop';
377 package P5AST::op_syswrite;     @ISA = 'P5AST::listop';
378 package P5AST::op_send;         @ISA = 'P5AST::listop';
379 package P5AST::op_recv;         @ISA = 'P5AST::listop';
380 package P5AST::op_eof;          @ISA = 'P5AST::baseop_unop';
381 package P5AST::op_tell;         @ISA = 'P5AST::baseop_unop';
382 package P5AST::op_seek;         @ISA = 'P5AST::listop';
383 package P5AST::op_truncate;     @ISA = 'P5AST::listop';
384 package P5AST::op_fcntl;        @ISA = 'P5AST::listop';
385 package P5AST::op_ioctl;        @ISA = 'P5AST::listop';
386 package P5AST::op_flock;        @ISA = 'P5AST::listop';
387 package P5AST::op_socket;       @ISA = 'P5AST::listop';
388 package P5AST::op_sockpair;     @ISA = 'P5AST::listop';
389 package P5AST::op_bind;         @ISA = 'P5AST::listop';
390 package P5AST::op_connect;      @ISA = 'P5AST::listop';
391 package P5AST::op_listen;       @ISA = 'P5AST::listop';
392 package P5AST::op_accept;       @ISA = 'P5AST::listop';
393 package P5AST::op_shutdown;     @ISA = 'P5AST::listop';
394 package P5AST::op_gsockopt;     @ISA = 'P5AST::listop';
395 package P5AST::op_ssockopt;     @ISA = 'P5AST::listop';
396 package P5AST::op_getsockname;  @ISA = 'P5AST::baseop_unop';
397 package P5AST::op_getpeername;  @ISA = 'P5AST::baseop_unop';
398 package P5AST::op_lstat;        @ISA = 'P5AST::filestatop';
399 package P5AST::op_stat;         @ISA = 'P5AST::filestatop';
400 package P5AST::op_ftrread;      @ISA = 'P5AST::filestatop';
401 package P5AST::op_ftrwrite;     @ISA = 'P5AST::filestatop';
402 package P5AST::op_ftrexec;      @ISA = 'P5AST::filestatop';
403 package P5AST::op_fteread;      @ISA = 'P5AST::filestatop';
404 package P5AST::op_ftewrite;     @ISA = 'P5AST::filestatop';
405 package P5AST::op_fteexec;      @ISA = 'P5AST::filestatop';
406 package P5AST::op_ftis;         @ISA = 'P5AST::filestatop';
407 package P5AST::op_fteowned;     @ISA = 'P5AST::filestatop';
408 package P5AST::op_ftrowned;     @ISA = 'P5AST::filestatop';
409 package P5AST::op_ftzero;       @ISA = 'P5AST::filestatop';
410 package P5AST::op_ftsize;       @ISA = 'P5AST::filestatop';
411 package P5AST::op_ftmtime;      @ISA = 'P5AST::filestatop';
412 package P5AST::op_ftatime;      @ISA = 'P5AST::filestatop';
413 package P5AST::op_ftctime;      @ISA = 'P5AST::filestatop';
414 package P5AST::op_ftsock;       @ISA = 'P5AST::filestatop';
415 package P5AST::op_ftchr;        @ISA = 'P5AST::filestatop';
416 package P5AST::op_ftblk;        @ISA = 'P5AST::filestatop';
417 package P5AST::op_ftfile;       @ISA = 'P5AST::filestatop';
418 package P5AST::op_ftdir;        @ISA = 'P5AST::filestatop';
419 package P5AST::op_ftpipe;       @ISA = 'P5AST::filestatop';
420 package P5AST::op_ftlink;       @ISA = 'P5AST::filestatop';
421 package P5AST::op_ftsuid;       @ISA = 'P5AST::filestatop';
422 package P5AST::op_ftsgid;       @ISA = 'P5AST::filestatop';
423 package P5AST::op_ftsvtx;       @ISA = 'P5AST::filestatop';
424 package P5AST::op_fttty;        @ISA = 'P5AST::filestatop';
425 package P5AST::op_fttext;       @ISA = 'P5AST::filestatop';
426 package P5AST::op_ftbinary;     @ISA = 'P5AST::filestatop';
427 package P5AST::op_chdir;        @ISA = 'P5AST::baseop_unop';
428 package P5AST::op_chown;        @ISA = 'P5AST::listop';
429 package P5AST::op_chroot;       @ISA = 'P5AST::baseop_unop';
430 package P5AST::op_unlink;       @ISA = 'P5AST::listop';
431 package P5AST::op_chmod;        @ISA = 'P5AST::listop';
432 package P5AST::op_utime;        @ISA = 'P5AST::listop';
433 package P5AST::op_rename;       @ISA = 'P5AST::listop';
434 package P5AST::op_link;         @ISA = 'P5AST::listop';
435 package P5AST::op_symlink;      @ISA = 'P5AST::listop';
436 package P5AST::op_readlink;     @ISA = 'P5AST::baseop_unop';
437 package P5AST::op_mkdir;        @ISA = 'P5AST::listop';
438 package P5AST::op_rmdir;        @ISA = 'P5AST::baseop_unop';
439 package P5AST::op_open_dir;     @ISA = 'P5AST::listop';
440 package P5AST::op_readdir;      @ISA = 'P5AST::baseop_unop';
441 package P5AST::op_telldir;      @ISA = 'P5AST::baseop_unop';
442 package P5AST::op_seekdir;      @ISA = 'P5AST::listop';
443 package P5AST::op_rewinddir;    @ISA = 'P5AST::baseop_unop';
444 package P5AST::op_closedir;     @ISA = 'P5AST::baseop_unop';
445 package P5AST::op_fork;         @ISA = 'P5AST::baseop';
446 package P5AST::op_wait;         @ISA = 'P5AST::baseop';
447 package P5AST::op_waitpid;      @ISA = 'P5AST::listop';
448 package P5AST::op_system;       @ISA = 'P5AST::listop';
449 package P5AST::op_exec;         @ISA = 'P5AST::listop';
450 package P5AST::op_kill;         @ISA = 'P5AST::listop';
451 package P5AST::op_getppid;      @ISA = 'P5AST::baseop';
452 package P5AST::op_getpgrp;      @ISA = 'P5AST::baseop_unop';
453 package P5AST::op_setpgrp;      @ISA = 'P5AST::listop';
454 package P5AST::op_getpriority;  @ISA = 'P5AST::listop';
455 package P5AST::op_setpriority;  @ISA = 'P5AST::listop';
456 package P5AST::op_time;         @ISA = 'P5AST::baseop';
457 package P5AST::op_tms;          @ISA = 'P5AST::baseop';
458 package P5AST::op_localtime;    @ISA = 'P5AST::baseop_unop';
459 package P5AST::op_gmtime;       @ISA = 'P5AST::baseop_unop';
460 package P5AST::op_alarm;        @ISA = 'P5AST::baseop_unop';
461 package P5AST::op_sleep;        @ISA = 'P5AST::baseop_unop';
462 package P5AST::op_shmget;       @ISA = 'P5AST::listop';
463 package P5AST::op_shmctl;       @ISA = 'P5AST::listop';
464 package P5AST::op_shmread;      @ISA = 'P5AST::listop';
465 package P5AST::op_shmwrite;     @ISA = 'P5AST::listop';
466 package P5AST::op_msgget;       @ISA = 'P5AST::listop';
467 package P5AST::op_msgctl;       @ISA = 'P5AST::listop';
468 package P5AST::op_msgsnd;       @ISA = 'P5AST::listop';
469 package P5AST::op_msgrcv;       @ISA = 'P5AST::listop';
470 package P5AST::op_semget;       @ISA = 'P5AST::listop';
471 package P5AST::op_semctl;       @ISA = 'P5AST::listop';
472 package P5AST::op_semop;        @ISA = 'P5AST::listop';
473 package P5AST::op_require;      @ISA = 'P5AST::baseop_unop';
474 package P5AST::op_dofile;       @ISA = 'P5AST::unop';
475 package P5AST::op_entereval;    @ISA = 'P5AST::baseop_unop';
476 package P5AST::op_leaveeval;    @ISA = 'P5AST::unop';
477 package P5AST::op_entertry;     @ISA = 'P5AST::logop';
478 package P5AST::op_leavetry;     @ISA = 'P5AST::listop';
479 package P5AST::op_ghbyname;     @ISA = 'P5AST::baseop_unop';
480 package P5AST::op_ghbyaddr;     @ISA = 'P5AST::listop';
481 package P5AST::op_ghostent;     @ISA = 'P5AST::baseop';
482 package P5AST::op_gnbyname;     @ISA = 'P5AST::baseop_unop';
483 package P5AST::op_gnbyaddr;     @ISA = 'P5AST::listop';
484 package P5AST::op_gnetent;      @ISA = 'P5AST::baseop';
485 package P5AST::op_gpbyname;     @ISA = 'P5AST::baseop_unop';
486 package P5AST::op_gpbynumber;   @ISA = 'P5AST::listop';
487 package P5AST::op_gprotoent;    @ISA = 'P5AST::baseop';
488 package P5AST::op_gsbyname;     @ISA = 'P5AST::listop';
489 package P5AST::op_gsbyport;     @ISA = 'P5AST::listop';
490 package P5AST::op_gservent;     @ISA = 'P5AST::baseop';
491 package P5AST::op_shostent;     @ISA = 'P5AST::baseop_unop';
492 package P5AST::op_snetent;      @ISA = 'P5AST::baseop_unop';
493 package P5AST::op_sprotoent;    @ISA = 'P5AST::baseop_unop';
494 package P5AST::op_sservent;     @ISA = 'P5AST::baseop_unop';
495 package P5AST::op_ehostent;     @ISA = 'P5AST::baseop';
496 package P5AST::op_enetent;      @ISA = 'P5AST::baseop';
497 package P5AST::op_eprotoent;    @ISA = 'P5AST::baseop';
498 package P5AST::op_eservent;     @ISA = 'P5AST::baseop';
499 package P5AST::op_gpwnam;       @ISA = 'P5AST::baseop_unop';
500 package P5AST::op_gpwuid;       @ISA = 'P5AST::baseop_unop';
501 package P5AST::op_gpwent;       @ISA = 'P5AST::baseop';
502 package P5AST::op_spwent;       @ISA = 'P5AST::baseop';
503 package P5AST::op_epwent;       @ISA = 'P5AST::baseop';
504 package P5AST::op_ggrnam;       @ISA = 'P5AST::baseop_unop';
505 package P5AST::op_ggrgid;       @ISA = 'P5AST::baseop_unop';
506 package P5AST::op_ggrent;       @ISA = 'P5AST::baseop';
507 package P5AST::op_sgrent;       @ISA = 'P5AST::baseop';
508 package P5AST::op_egrent;       @ISA = 'P5AST::baseop';
509 package P5AST::op_getlogin;     @ISA = 'P5AST::baseop';
510 package P5AST::op_syscall;      @ISA = 'P5AST::listop';
511 package P5AST::op_lock;         @ISA = 'P5AST::baseop_unop';
512 package P5AST::op_threadsv;     @ISA = 'P5AST::baseop';
513 package P5AST::op_setstate;     @ISA = 'P5AST::cop';
514 package P5AST::op_method_named; @ISA = 'P5AST::padop_svop';
515 package P5AST::op_dor;          @ISA = 'P5AST::logop';
516 package P5AST::op_dorassign;    @ISA = 'P5AST::logop';
517 package P5AST::op_custom;       @ISA = 'P5AST::baseop';
518
519 # New node types (implicit types within perl)
520
521 package P5AST::statement;       @ISA = 'P5AST::cop';
522 package P5AST::peg;             @ISA = 'P5AST::baseop';
523 package P5AST::parens;          @ISA = 'P5AST::baseop';
524 package P5AST::bindop;          @ISA = 'P5AST::baseop';
525 package P5AST::nothing;         @ISA = 'P5AST::baseop';
526 package P5AST::condstate;       @ISA = 'P5AST::logop';
527 package P5AST::use;             @ISA = 'P5AST::baseop';
528 package P5AST::ternary;         @ISA = 'P5AST::baseop';
529 package P5AST::sub;             @ISA = 'P5AST::baseop';
530 package P5AST::condmod;         @ISA = 'P5AST::logop';
531 package P5AST::package;         @ISA = 'P5AST::baseop';
532 package P5AST::format;          @ISA = 'P5AST::baseop';
533 package P5AST::qwliteral;       @ISA = 'P5AST::baseop';
534 package P5AST::quote;           @ISA = 'P5AST::baseop';
535 package P5AST::token;           @ISA = 'P5AST::baseop';
536 package P5AST::attrlist;        @ISA = 'P5AST::baseop';
537 package P5AST::listelem;        @ISA = 'P5AST::baseop';
538 package P5AST::preplus;         @ISA = 'P5AST::baseop';
539 package P5AST::doblock;         @ISA = 'P5AST::baseop';
540 package P5AST::cfor;            @ISA = 'P5AST::baseop';
541 package P5AST::pmop;            @ISA = 'P5AST::baseop';