This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perl.h: Add comments
[perl5.git] / perly.c
... / ...
CommitLineData
1/* perly.c
2 *
3 * Copyright (c) 2004, 2005, 2006, 2007, 2008,
4 * 2009, 2010, 2011 by Larry Wall and others
5 *
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
8 *
9 * Note that this file was originally generated as an output from
10 * GNU bison version 1.875, but now the code is statically maintained
11 * and edited; the bits that are dependent on perly.y are now
12 * #included from the files perly.tab and perly.act.
13 *
14 * Here is an important copyright statement from the original, generated
15 * file:
16 *
17 * As a special exception, when this file is copied by Bison into a
18 * Bison output file, you may use that output file without
19 * restriction. This special exception was added by the Free
20 * Software Foundation in version 1.24 of Bison.
21 *
22 * Note that this file is also #included in madly.c, to allow compilation
23 * of a second parser, Perl_madparse, that is identical to Perl_yyparse,
24 * but which includes extra code for dumping the parse tree.
25 * This is controlled by the PERL_IN_MADLY_C define.
26 */
27
28#include "EXTERN.h"
29#define PERL_IN_PERLY_C
30#include "perl.h"
31
32typedef unsigned char yytype_uint8;
33typedef signed char yytype_int8;
34typedef unsigned short int yytype_uint16;
35typedef short int yytype_int16;
36typedef signed char yysigned_char;
37
38/* YYINITDEPTH -- initial size of the parser's stacks. */
39#define YYINITDEPTH 200
40
41#ifdef YYDEBUG
42# undef YYDEBUG
43#endif
44#ifdef DEBUGGING
45# define YYDEBUG 1
46#else
47# define YYDEBUG 0
48#endif
49
50#ifndef YY_NULL
51# define YY_NULL 0
52#endif
53
54/* contains all the parser state tables; auto-generated from perly.y */
55#include "perly.tab"
56
57# define YYSIZE_T size_t
58
59#define YYEOF 0
60#define YYTERROR 1
61
62#define YYACCEPT goto yyacceptlab
63#define YYABORT goto yyabortlab
64#define YYERROR goto yyerrlab1
65
66/* Enable debugging if requested. */
67#ifdef DEBUGGING
68
69# define yydebug (DEBUG_p_TEST)
70
71# define YYFPRINTF PerlIO_printf
72
73# define YYDPRINTF(Args) \
74do { \
75 if (yydebug) \
76 YYFPRINTF Args; \
77} while (0)
78
79# define YYDSYMPRINTF(Title, Token, Value) \
80do { \
81 if (yydebug) { \
82 YYFPRINTF (Perl_debug_log, "%s ", Title); \
83 yysymprint (aTHX_ Perl_debug_log, Token, Value); \
84 YYFPRINTF (Perl_debug_log, "\n"); \
85 } \
86} while (0)
87
88/*--------------------------------.
89| Print this symbol on YYOUTPUT. |
90`--------------------------------*/
91
92static void
93yysymprint(pTHX_ PerlIO * const yyoutput, int yytype, const YYSTYPE * const yyvaluep)
94{
95 if (yytype < YYNTOKENS) {
96 YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
97# ifdef YYPRINT
98 YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
99# else
100 YYFPRINTF (yyoutput, "0x%"UVxf, (UV)yyvaluep->ival);
101# endif
102 }
103 else
104 YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
105
106 YYFPRINTF (yyoutput, ")");
107}
108
109
110/* yy_stack_print()
111 * print the top 8 items on the parse stack.
112 */
113
114static void
115yy_stack_print (pTHX_ const yy_parser *parser)
116{
117 const yy_stack_frame *ps, *min;
118
119 min = parser->ps - 8 + 1;
120 if (min <= parser->stack)
121 min = parser->stack + 1;
122
123 PerlIO_printf(Perl_debug_log, "\nindex:");
124 for (ps = min; ps <= parser->ps; ps++)
125 PerlIO_printf(Perl_debug_log, " %8d", (int)(ps - parser->stack));
126
127 PerlIO_printf(Perl_debug_log, "\nstate:");
128 for (ps = min; ps <= parser->ps; ps++)
129 PerlIO_printf(Perl_debug_log, " %8d", ps->state);
130
131 PerlIO_printf(Perl_debug_log, "\ntoken:");
132 for (ps = min; ps <= parser->ps; ps++)
133 PerlIO_printf(Perl_debug_log, " %8.8s", ps->name);
134
135 PerlIO_printf(Perl_debug_log, "\nvalue:");
136 for (ps = min; ps <= parser->ps; ps++) {
137 switch (yy_type_tab[yystos[ps->state]]) {
138 case toketype_opval:
139 PerlIO_printf(Perl_debug_log, " %8.8s",
140 ps->val.opval
141 ? PL_op_name[ps->val.opval->op_type]
142 : "(Nullop)"
143 );
144 break;
145#ifndef PERL_IN_MADLY_C
146 case toketype_i_tkval:
147#endif
148 case toketype_ival:
149 PerlIO_printf(Perl_debug_log, " %8"IVdf, (IV)ps->val.ival);
150 break;
151 default:
152 PerlIO_printf(Perl_debug_log, " %8"UVxf, (UV)ps->val.ival);
153 }
154 }
155 PerlIO_printf(Perl_debug_log, "\n\n");
156}
157
158# define YY_STACK_PRINT(parser) \
159do { \
160 if (yydebug && DEBUG_v_TEST) \
161 yy_stack_print (aTHX_ parser); \
162} while (0)
163
164
165/*------------------------------------------------.
166| Report that the YYRULE is going to be reduced. |
167`------------------------------------------------*/
168
169static void
170yy_reduce_print (pTHX_ int yyrule)
171{
172 int yyi;
173 const unsigned int yylineno = yyrline[yyrule];
174 YYFPRINTF (Perl_debug_log, "Reducing stack by rule %d (line %u), ",
175 yyrule - 1, yylineno);
176 /* Print the symbols being reduced, and their result. */
177 for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
178 YYFPRINTF (Perl_debug_log, "%s ", yytname [yyrhs[yyi]]);
179 YYFPRINTF (Perl_debug_log, "-> %s\n", yytname [yyr1[yyrule]]);
180}
181
182# define YY_REDUCE_PRINT(Rule) \
183do { \
184 if (yydebug) \
185 yy_reduce_print (aTHX_ Rule); \
186} while (0)
187
188#else /* !DEBUGGING */
189# define YYDPRINTF(Args)
190# define YYDSYMPRINTF(Title, Token, Value)
191# define YY_STACK_PRINT(parser)
192# define YY_REDUCE_PRINT(Rule)
193#endif /* !DEBUGGING */
194
195/* called during cleanup (via SAVEDESTRUCTOR_X) to free any items on the
196 * parse stack, thus avoiding leaks if we die */
197
198static void
199S_clear_yystack(pTHX_ const yy_parser *parser)
200{
201 yy_stack_frame *ps = parser->ps;
202 int i = 0;
203
204 if (!parser->stack)
205 return;
206
207 YYDPRINTF ((Perl_debug_log, "clearing the parse stack\n"));
208
209 for (i=0; i< parser->yylen; i++) {
210 SvREFCNT_dec(ps[-i].compcv);
211 }
212 ps -= parser->yylen;
213
214 /* now free whole the stack, including the just-reduced ops */
215
216 while (ps > parser->stack) {
217 LEAVE_SCOPE(ps->savestack_ix);
218 if (yy_type_tab[yystos[ps->state]] == toketype_opval
219 && ps->val.opval)
220 {
221 if (ps->compcv != PL_compcv) {
222 PL_compcv = ps->compcv;
223 PAD_SET_CUR_NOSAVE(CvPADLIST(PL_compcv), 1);
224 }
225 YYDPRINTF ((Perl_debug_log, "(freeing op)\n"));
226 op_free(ps->val.opval);
227 }
228 SvREFCNT_dec(ps->compcv);
229 ps--;
230 }
231
232 Safefree(parser->stack);
233}
234
235
236/*----------.
237| yyparse. |
238`----------*/
239
240int
241#ifdef PERL_IN_MADLY_C
242Perl_madparse (pTHX_ int gramtype)
243#else
244Perl_yyparse (pTHX_ int gramtype)
245#endif
246{
247 dVAR;
248 int yystate;
249 int yyn;
250 int yyresult;
251
252 /* Lookahead token as an internal (translated) token number. */
253 int yytoken = 0;
254
255 yy_parser *parser; /* the parser object */
256 yy_stack_frame *ps; /* current parser stack frame */
257
258#define YYPOPSTACK parser->ps = --ps
259#define YYPUSHSTACK parser->ps = ++ps
260
261 /* The variable used to return semantic value and location from the
262 action routines: ie $$. */
263 YYSTYPE yyval;
264
265#ifndef PERL_IN_MADLY_C
266# ifdef PERL_MAD
267 if (PL_madskills)
268 return madparse(gramtype);
269# endif
270#endif
271
272 YYDPRINTF ((Perl_debug_log, "Starting parse\n"));
273
274 parser = PL_parser;
275
276 ENTER; /* force parser state cleanup/restoration before we return */
277 SAVEPPTR(parser->yylval.pval);
278 SAVEINT(parser->yychar);
279 SAVEINT(parser->yyerrstatus);
280 SAVEINT(parser->stack_size);
281 SAVEINT(parser->yylen);
282 SAVEVPTR(parser->stack);
283 SAVEVPTR(parser->ps);
284
285 /* initialise state for this parse */
286 parser->yychar = gramtype;
287 parser->yyerrstatus = 0;
288 parser->stack_size = YYINITDEPTH;
289 parser->yylen = 0;
290 Newx(parser->stack, YYINITDEPTH, yy_stack_frame);
291 ps = parser->ps = parser->stack;
292 ps->state = 0;
293 SAVEDESTRUCTOR_X(S_clear_yystack, parser);
294
295/*------------------------------------------------------------.
296| yynewstate -- Push a new state, which is found in yystate. |
297`------------------------------------------------------------*/
298 yynewstate:
299
300 yystate = ps->state;
301
302 YYDPRINTF ((Perl_debug_log, "Entering state %d\n", yystate));
303
304 parser->yylen = 0;
305
306 {
307 size_t size = ps - parser->stack + 1;
308
309 /* grow the stack? We always leave 1 spare slot,
310 * in case of a '' -> 'foo' reduction */
311
312 if (size >= (size_t)parser->stack_size - 1) {
313 /* this will croak on insufficient memory */
314 parser->stack_size *= 2;
315 Renew(parser->stack, parser->stack_size, yy_stack_frame);
316 ps = parser->ps = parser->stack + size -1;
317
318 YYDPRINTF((Perl_debug_log,
319 "parser stack size increased to %lu frames\n",
320 (unsigned long int)parser->stack_size));
321 }
322 }
323
324/* Do appropriate processing given the current state. */
325/* Read a lookahead token if we need one and don't already have one. */
326
327 /* First try to decide what to do without reference to lookahead token. */
328
329 yyn = yypact[yystate];
330 if (yyn == YYPACT_NINF)
331 goto yydefault;
332
333 /* Not known => get a lookahead token if don't already have one. */
334
335 /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
336 if (parser->yychar == YYEMPTY) {
337 YYDPRINTF ((Perl_debug_log, "Reading a token: "));
338#ifdef PERL_IN_MADLY_C
339 parser->yychar = PL_madskills ? madlex() : yylex();
340#else
341 parser->yychar = yylex();
342#endif
343
344# ifdef EBCDIC
345 if (parser->yychar >= 0 && parser->yychar < 255) {
346 parser->yychar = NATIVE_TO_ASCII(parser->yychar);
347 }
348# endif
349 }
350
351 if (parser->yychar <= YYEOF) {
352 parser->yychar = yytoken = YYEOF;
353 YYDPRINTF ((Perl_debug_log, "Now at end of input.\n"));
354 }
355 else {
356 yytoken = YYTRANSLATE (parser->yychar);
357 YYDSYMPRINTF ("Next token is", yytoken, &parser->yylval);
358 }
359
360 /* If the proper action on seeing token YYTOKEN is to reduce or to
361 detect an error, take that action. */
362 yyn += yytoken;
363 if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
364 goto yydefault;
365 yyn = yytable[yyn];
366 if (yyn <= 0) {
367 if (yyn == 0 || yyn == YYTABLE_NINF)
368 goto yyerrlab;
369 yyn = -yyn;
370 goto yyreduce;
371 }
372
373 if (yyn == YYFINAL)
374 YYACCEPT;
375
376 /* Shift the lookahead token. */
377 YYDPRINTF ((Perl_debug_log, "Shifting token %s, ", yytname[yytoken]));
378
379 /* Discard the token being shifted unless it is eof. */
380 if (parser->yychar != YYEOF)
381 parser->yychar = YYEMPTY;
382
383 YYPUSHSTACK;
384 ps->state = yyn;
385 ps->val = parser->yylval;
386 ps->compcv = (CV*)SvREFCNT_inc(PL_compcv);
387 ps->savestack_ix = PL_savestack_ix;
388#ifdef DEBUGGING
389 ps->name = (const char *)(yytname[yytoken]);
390#endif
391
392 /* Count tokens shifted since error; after three, turn off error
393 status. */
394 if (parser->yyerrstatus)
395 parser->yyerrstatus--;
396
397 goto yynewstate;
398
399
400 /*-----------------------------------------------------------.
401 | yydefault -- do the default action for the current state. |
402 `-----------------------------------------------------------*/
403 yydefault:
404 yyn = yydefact[yystate];
405 if (yyn == 0)
406 goto yyerrlab;
407 goto yyreduce;
408
409
410 /*-----------------------------.
411 | yyreduce -- Do a reduction. |
412 `-----------------------------*/
413 yyreduce:
414 /* yyn is the number of a rule to reduce with. */
415 parser->yylen = yyr2[yyn];
416
417 /* If YYLEN is nonzero, implement the default value of the action:
418 "$$ = $1".
419
420 Otherwise, the following line sets YYVAL to garbage.
421 This behavior is undocumented and Bison
422 users should not rely upon it. Assigning to YYVAL
423 unconditionally makes the parser a bit smaller, and it avoids a
424 GCC warning that YYVAL may be used uninitialized. */
425 yyval = ps[1-parser->yylen].val;
426
427 YY_STACK_PRINT(parser);
428 YY_REDUCE_PRINT (yyn);
429
430 switch (yyn) {
431
432
433#define dep() deprecate("\"do\" to call subroutines")
434
435#ifdef PERL_IN_MADLY_C
436# define IVAL(i) (i)->tk_lval.ival
437# define PVAL(p) (p)->tk_lval.pval
438# define TOKEN_GETMAD(a,b,c) token_getmad((a),(b),(c))
439# define TOKEN_FREE(a) token_free(a)
440# define OP_GETMAD(a,b,c) op_getmad((a),(b),(c))
441# define IF_MAD(a,b) (a)
442# define DO_MAD(a) a
443# define MAD
444#else
445# define IVAL(i) (i)
446# define PVAL(p) (p)
447# define TOKEN_GETMAD(a,b,c)
448# define TOKEN_FREE(a)
449# define OP_GETMAD(a,b,c)
450# define IF_MAD(a,b) (b)
451# define DO_MAD(a)
452# undef MAD
453#endif
454
455/* contains all the rule actions; auto-generated from perly.y */
456#include "perly.act"
457
458 }
459
460 {
461 int i;
462 for (i=0; i< parser->yylen; i++) {
463 SvREFCNT_dec(ps[-i].compcv);
464 }
465 }
466
467 parser->ps = ps -= (parser->yylen-1);
468
469 /* Now shift the result of the reduction. Determine what state
470 that goes to, based on the state we popped back to and the rule
471 number reduced by. */
472
473 ps->val = yyval;
474 ps->compcv = (CV*)SvREFCNT_inc(PL_compcv);
475 ps->savestack_ix = PL_savestack_ix;
476#ifdef DEBUGGING
477 ps->name = (const char *)(yytname [yyr1[yyn]]);
478#endif
479
480 yyn = yyr1[yyn];
481
482 yystate = yypgoto[yyn - YYNTOKENS] + ps[-1].state;
483 if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == ps[-1].state)
484 yystate = yytable[yystate];
485 else
486 yystate = yydefgoto[yyn - YYNTOKENS];
487 ps->state = yystate;
488
489 goto yynewstate;
490
491
492 /*------------------------------------.
493 | yyerrlab -- here on detecting error |
494 `------------------------------------*/
495 yyerrlab:
496 /* If not already recovering from an error, report this error. */
497 if (!parser->yyerrstatus) {
498 yyerror ("syntax error");
499 }
500
501
502 if (parser->yyerrstatus == 3) {
503 /* If just tried and failed to reuse lookahead token after an
504 error, discard it. */
505
506 /* Return failure if at end of input. */
507 if (parser->yychar == YYEOF) {
508 /* Pop the error token. */
509 SvREFCNT_dec(ps->compcv);
510 YYPOPSTACK;
511 /* Pop the rest of the stack. */
512 while (ps > parser->stack) {
513 YYDSYMPRINTF ("Error: popping", yystos[ps->state], &ps->val);
514 LEAVE_SCOPE(ps->savestack_ix);
515 if (yy_type_tab[yystos[ps->state]] == toketype_opval
516 && ps->val.opval)
517 {
518 YYDPRINTF ((Perl_debug_log, "(freeing op)\n"));
519 if (ps->compcv != PL_compcv) {
520 PL_compcv = ps->compcv;
521 PAD_SET_CUR_NOSAVE(CvPADLIST(PL_compcv), 1);
522 }
523 op_free(ps->val.opval);
524 }
525 SvREFCNT_dec(ps->compcv);
526 YYPOPSTACK;
527 }
528 YYABORT;
529 }
530
531 YYDSYMPRINTF ("Error: discarding", yytoken, &parser->yylval);
532 parser->yychar = YYEMPTY;
533
534 }
535
536 /* Else will try to reuse lookahead token after shifting the error
537 token. */
538 goto yyerrlab1;
539
540
541 /*----------------------------------------------------.
542 | yyerrlab1 -- error raised explicitly by an action. |
543 `----------------------------------------------------*/
544 yyerrlab1:
545 parser->yyerrstatus = 3; /* Each real token shifted decrements this. */
546
547 for (;;) {
548 yyn = yypact[yystate];
549 if (yyn != YYPACT_NINF) {
550 yyn += YYTERROR;
551 if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) {
552 yyn = yytable[yyn];
553 if (0 < yyn)
554 break;
555 }
556 }
557
558 /* Pop the current state because it cannot handle the error token. */
559 if (ps == parser->stack)
560 YYABORT;
561
562 YYDSYMPRINTF ("Error: popping", yystos[ps->state], &ps->val);
563 LEAVE_SCOPE(ps->savestack_ix);
564 if (yy_type_tab[yystos[ps->state]] == toketype_opval && ps->val.opval) {
565 YYDPRINTF ((Perl_debug_log, "(freeing op)\n"));
566 if (ps->compcv != PL_compcv) {
567 PL_compcv = ps->compcv;
568 PAD_SET_CUR_NOSAVE(CvPADLIST(PL_compcv), 1);
569 }
570 op_free(ps->val.opval);
571 }
572 SvREFCNT_dec(ps->compcv);
573 YYPOPSTACK;
574 yystate = ps->state;
575
576 YY_STACK_PRINT(parser);
577 }
578
579 if (yyn == YYFINAL)
580 YYACCEPT;
581
582 YYDPRINTF ((Perl_debug_log, "Shifting error token, "));
583
584 YYPUSHSTACK;
585 ps->state = yyn;
586 ps->val = parser->yylval;
587 ps->compcv = (CV*)SvREFCNT_inc(PL_compcv);
588 ps->savestack_ix = PL_savestack_ix;
589#ifdef DEBUGGING
590 ps->name ="<err>";
591#endif
592
593 goto yynewstate;
594
595
596 /*-------------------------------------.
597 | yyacceptlab -- YYACCEPT comes here. |
598 `-------------------------------------*/
599 yyacceptlab:
600 yyresult = 0;
601 for (ps=parser->ps; ps > parser->stack; ps--) {
602 SvREFCNT_dec(ps->compcv);
603 }
604 parser->ps = parser->stack; /* disable cleanup */
605 goto yyreturn;
606
607 /*-----------------------------------.
608 | yyabortlab -- YYABORT comes here. |
609 `-----------------------------------*/
610 yyabortlab:
611 yyresult = 1;
612 goto yyreturn;
613
614 yyreturn:
615 LEAVE; /* force parser stack cleanup before we return */
616 return yyresult;
617}
618
619/*
620 * Local variables:
621 * c-indentation-style: bsd
622 * c-basic-offset: 4
623 * indent-tabs-mode: nil
624 * End:
625 *
626 * ex: set ts=8 sts=4 sw=4 et:
627 */