This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add, improve some debugging stmts for -DL (locales)
[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 */
23
24#include "EXTERN.h"
25#define PERL_IN_PERLY_C
26#include "perl.h"
27#include "feature.h"
28#include "keywords.h"
29
30typedef unsigned char yytype_uint8;
31typedef signed char yytype_int8;
32typedef unsigned short int yytype_uint16;
33typedef short int yytype_int16;
34typedef signed char yysigned_char;
35
36/* YYINITDEPTH -- initial size of the parser's stacks. */
37#define YYINITDEPTH 200
38
39#ifdef YYDEBUG
40# undef YYDEBUG
41#endif
42#ifdef DEBUGGING
43# define YYDEBUG 1
44#else
45# define YYDEBUG 0
46#endif
47
48#ifndef YY_NULL
49# define YY_NULL 0
50#endif
51
52#ifndef YY_NULLPTR
53# define YY_NULLPTR NULL
54#endif
55
56/* contains all the parser state tables; auto-generated from perly.y */
57#include "perly.tab"
58
59# define YYSIZE_T size_t
60
61#define YYEOF 0
62#define YYTERROR 1
63
64#define YYACCEPT goto yyacceptlab
65#define YYABORT goto yyabortlab
66#define YYERROR goto yyerrlab1
67
68/* Enable debugging if requested. */
69#ifdef DEBUGGING
70
71# define yydebug (DEBUG_p_TEST)
72
73# define YYFPRINTF PerlIO_printf
74
75# define YYDPRINTF(Args) \
76do { \
77 if (yydebug) \
78 YYFPRINTF Args; \
79} while (0)
80
81# define YYDSYMPRINTF(Title, Token, Value) \
82do { \
83 if (yydebug) { \
84 YYFPRINTF (Perl_debug_log, "%s ", Title); \
85 yysymprint (aTHX_ Perl_debug_log, Token, Value); \
86 YYFPRINTF (Perl_debug_log, "\n"); \
87 } \
88} while (0)
89
90/*--------------------------------.
91| Print this symbol on YYOUTPUT. |
92`--------------------------------*/
93
94static void
95yysymprint(pTHX_ PerlIO * const yyoutput, int yytype, const YYSTYPE * const yyvaluep)
96{
97 PERL_UNUSED_CONTEXT;
98 if (yytype < YYNTOKENS) {
99 YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
100# ifdef YYPRINT
101 YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
102# else
103 YYFPRINTF (yyoutput, "0x%" UVxf, (UV)yyvaluep->ival);
104# endif
105 }
106 else
107 YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
108
109 YYFPRINTF (yyoutput, ")");
110}
111
112
113/* yy_stack_print()
114 * print the top 8 items on the parse stack.
115 */
116
117static void
118yy_stack_print (pTHX_ const yy_parser *parser)
119{
120 const yy_stack_frame *ps, *min;
121
122 min = parser->ps - 8 + 1;
123 if (min <= parser->stack)
124 min = parser->stack + 1;
125
126 PerlIO_printf(Perl_debug_log, "\nindex:");
127 for (ps = min; ps <= parser->ps; ps++)
128 PerlIO_printf(Perl_debug_log, " %8d", (int)(ps - parser->stack));
129
130 PerlIO_printf(Perl_debug_log, "\nstate:");
131 for (ps = min; ps <= parser->ps; ps++)
132 PerlIO_printf(Perl_debug_log, " %8d", ps->state);
133
134 PerlIO_printf(Perl_debug_log, "\ntoken:");
135 for (ps = min; ps <= parser->ps; ps++)
136 PerlIO_printf(Perl_debug_log, " %8.8s", ps->name);
137
138 PerlIO_printf(Perl_debug_log, "\nvalue:");
139 for (ps = min; ps <= parser->ps; ps++) {
140 switch (yy_type_tab[yystos[ps->state]]) {
141 case toketype_opval:
142 PerlIO_printf(Perl_debug_log, " %8.8s",
143 ps->val.opval
144 ? PL_op_name[ps->val.opval->op_type]
145 : "(Nullop)"
146 );
147 break;
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#if PERL_BISON_VERSION >= 30000 /* 3.0+ */
178 for (yyi = 0; yyi < yyr2[yyrule]; yyi++)
179 YYFPRINTF (Perl_debug_log, "%s ",
180 yytname [yystos[(PL_parser->ps)[yyi + 1 - yyr2[yyrule]].state]]);
181#else
182 for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
183 YYFPRINTF (Perl_debug_log, "%s ", yytname [yyrhs[yyi]]);
184#endif
185 YYFPRINTF (Perl_debug_log, "-> %s\n", yytname [yyr1[yyrule]]);
186}
187
188# define YY_REDUCE_PRINT(Rule) \
189do { \
190 if (yydebug) \
191 yy_reduce_print (aTHX_ Rule); \
192} while (0)
193
194#else /* !DEBUGGING */
195# define YYDPRINTF(Args)
196# define YYDSYMPRINTF(Title, Token, Value)
197# define YY_STACK_PRINT(parser)
198# define YY_REDUCE_PRINT(Rule)
199#endif /* !DEBUGGING */
200
201/* called during cleanup (via SAVEDESTRUCTOR_X) to free any items on the
202 * parse stack, thus avoiding leaks if we die */
203
204static void
205S_clear_yystack(pTHX_ const yy_parser *parser)
206{
207 yy_stack_frame *ps = parser->ps;
208 int i = 0;
209
210 if (!parser->stack)
211 return;
212
213 YYDPRINTF ((Perl_debug_log, "clearing the parse stack\n"));
214
215 for (i=0; i< parser->yylen; i++) {
216 SvREFCNT_dec(ps[-i].compcv);
217 }
218 ps -= parser->yylen;
219
220 /* now free whole the stack, including the just-reduced ops */
221
222 while (ps > parser->stack) {
223 LEAVE_SCOPE(ps->savestack_ix);
224 if (yy_type_tab[yystos[ps->state]] == toketype_opval
225 && ps->val.opval)
226 {
227 if (ps->compcv && (ps->compcv != PL_compcv)) {
228 PL_compcv = ps->compcv;
229 PAD_SET_CUR_NOSAVE(CvPADLIST(PL_compcv), 1);
230 PL_comppad_name = PadlistNAMES(CvPADLIST(PL_compcv));
231 }
232 YYDPRINTF ((Perl_debug_log, "(freeing op)\n"));
233 op_free(ps->val.opval);
234 }
235 SvREFCNT_dec(ps->compcv);
236 ps--;
237 }
238
239 Safefree(parser->stack);
240}
241
242
243/*----------.
244| yyparse. |
245`----------*/
246
247int
248Perl_yyparse (pTHX_ int gramtype)
249{
250 dVAR;
251 int yystate;
252 int yyn;
253 int yyresult;
254
255 /* Lookahead token as an internal (translated) token number. */
256 int yytoken = 0;
257
258 yy_parser *parser; /* the parser object */
259 yy_stack_frame *ps; /* current parser stack frame */
260
261#define YYPOPSTACK parser->ps = --ps
262#define YYPUSHSTACK parser->ps = ++ps
263
264 /* The variable used to return semantic value and location from the
265 action routines: ie $$. */
266 YYSTYPE yyval;
267
268 YYDPRINTF ((Perl_debug_log, "Starting parse\n"));
269
270 parser = PL_parser;
271
272 ENTER; /* force parser state cleanup/restoration before we return */
273 SAVEPPTR(parser->yylval.pval);
274 SAVEINT(parser->yychar);
275 SAVEINT(parser->yyerrstatus);
276 SAVEINT(parser->yylen);
277 SAVEVPTR(parser->stack);
278 SAVEVPTR(parser->stack_max1);
279 SAVEVPTR(parser->ps);
280
281 /* initialise state for this parse */
282 parser->yychar = gramtype;
283 yytoken = YYTRANSLATE(NATIVE_TO_UNI(parser->yychar));
284
285 parser->yyerrstatus = 0;
286 parser->yylen = 0;
287 Newx(parser->stack, YYINITDEPTH, yy_stack_frame);
288 parser->stack_max1 = parser->stack + YYINITDEPTH - 1;
289 ps = parser->ps = parser->stack;
290 ps->state = 0;
291 SAVEDESTRUCTOR_X(S_clear_yystack, parser);
292
293 while (1) {
294 /* main loop: shift some tokens, then reduce when possible */
295
296 while (1) {
297 /* shift a token, or quit when it's possible to reduce */
298
299 yystate = ps->state;
300
301 YYDPRINTF ((Perl_debug_log, "Entering state %d\n", yystate));
302
303 parser->yylen = 0;
304
305 /* Grow the stack? We always leave 1 spare slot, in case of a
306 * '' -> 'foo' reduction.
307 * Note that stack_max1 points to the (top-1)th allocated stack
308 * element to make this check faster */
309
310 if (ps >= parser->stack_max1) {
311 Size_t pos = ps - parser->stack;
312 Size_t newsize = 2 * (parser->stack_max1 + 2 - parser->stack);
313 /* this will croak on insufficient memory */
314 Renew(parser->stack, newsize, yy_stack_frame);
315 ps = parser->ps = parser->stack + pos;
316 parser->stack_max1 = parser->stack + newsize - 1;
317
318 YYDPRINTF((Perl_debug_log,
319 "parser stack size increased to %lu frames\n",
320 (unsigned long int)newsize));
321 }
322
323 /* Do appropriate processing given the current state. Read a
324 * lookahead token if we need one and don't already have one.
325 * */
326
327 /* First try to decide what to do without reference to
328 * lookahead token. */
329
330 yyn = yypact[yystate];
331 if (yyn == YYPACT_NINF)
332 goto yydefault;
333
334 /* Not known => get a lookahead token if don't already have
335 * one. YYCHAR is either YYEMPTY or YYEOF or a valid
336 * lookahead symbol. */
337
338 if (parser->yychar == YYEMPTY) {
339 YYDPRINTF ((Perl_debug_log, "Reading a token:\n"));
340 parser->yychar = yylex();
341 assert(parser->yychar >= 0);
342 if (parser->yychar == YYEOF) {
343 YYDPRINTF ((Perl_debug_log, "Now at end of input.\n"));
344 }
345 /* perly.tab is shipped based on an ASCII system, so need
346 * to index it with characters translated to ASCII.
347 * Although it's not designed for this purpose, we can use
348 * NATIVE_TO_UNI here. It returns its argument on ASCII
349 * platforms, and on EBCDIC translates native to ascii in
350 * the 0-255 range, leaving every other possible input
351 * unchanged. This jibes with yylex() returning some bare
352 * characters in that range, but all tokens it returns are
353 * either 0, or above 255. There could be a problem if NULs
354 * weren't 0, or were ever returned as raw chars by yylex() */
355 yytoken = YYTRANSLATE(NATIVE_TO_UNI(parser->yychar));
356 }
357
358 /* make sure no-ones changed yychar since the last call to yylex */
359 assert(yytoken == YYTRANSLATE(NATIVE_TO_UNI(parser->yychar)));
360 YYDSYMPRINTF("lookahead token is", yytoken, &parser->yylval);
361
362
363 /* If the proper action on seeing token YYTOKEN is to reduce or to
364 * detect an error, take that action.
365 * Casting yyn to unsigned allows a >=0 test to be included as
366 * part of the <=YYLAST test for speed */
367 yyn += yytoken;
368 if ((unsigned int)yyn > YYLAST || yycheck[yyn] != yytoken) {
369 yydefault:
370 /* do the default action for the current state. */
371 yyn = yydefact[yystate];
372 if (yyn == 0)
373 goto yyerrlab;
374 break; /* time to reduce */
375 }
376
377 yyn = yytable[yyn];
378 if (yyn <= 0) {
379 if (yyn == 0 || yyn == YYTABLE_NINF)
380 goto yyerrlab;
381 yyn = -yyn;
382 break; /* time to reduce */
383 }
384
385 if (yyn == YYFINAL)
386 YYACCEPT;
387
388 /* Shift the lookahead token. */
389 YYDPRINTF ((Perl_debug_log, "Shifting token %s, ", yytname[yytoken]));
390
391 /* Discard the token being shifted unless it is eof. */
392 if (parser->yychar != YYEOF)
393 parser->yychar = YYEMPTY;
394
395 YYPUSHSTACK;
396 ps->state = yyn;
397 ps->val = parser->yylval;
398 ps->compcv = (CV*)SvREFCNT_inc(PL_compcv);
399 ps->savestack_ix = PL_savestack_ix;
400#ifdef DEBUGGING
401 ps->name = (const char *)(yytname[yytoken]);
402#endif
403
404 /* Count tokens shifted since error; after three, turn off error
405 status. */
406 if (parser->yyerrstatus)
407 parser->yyerrstatus--;
408
409 }
410
411 /* Do a reduction */
412
413 /* yyn is the number of a rule to reduce with. */
414 parser->yylen = yyr2[yyn];
415
416 /* If YYLEN is nonzero, implement the default value of the action:
417 "$$ = $1".
418
419 Otherwise, the following line sets YYVAL to garbage.
420 This behavior is undocumented and Bison
421 users should not rely upon it. Assigning to YYVAL
422 unconditionally makes the parser a bit smaller, and it avoids a
423 GCC warning that YYVAL may be used uninitialized. */
424 yyval = ps[1-parser->yylen].val;
425
426 YY_STACK_PRINT(parser);
427 YY_REDUCE_PRINT (yyn);
428
429 switch (yyn) {
430
431 /* contains all the rule actions; auto-generated from perly.y */
432#include "perly.act"
433
434 }
435
436 {
437 int i;
438 for (i=0; i< parser->yylen; i++) {
439 SvREFCNT_dec(ps[-i].compcv);
440 }
441 }
442
443 parser->ps = ps -= (parser->yylen-1);
444
445 /* Now shift the result of the reduction. Determine what state
446 that goes to, based on the state we popped back to and the rule
447 number reduced by. */
448
449 ps->val = yyval;
450 ps->compcv = (CV*)SvREFCNT_inc(PL_compcv);
451 ps->savestack_ix = PL_savestack_ix;
452#ifdef DEBUGGING
453 ps->name = (const char *)(yytname [yyr1[yyn]]);
454#endif
455
456 yyn = yyr1[yyn];
457
458 yystate = yypgoto[yyn - YYNTOKENS] + ps[-1].state;
459 if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == ps[-1].state)
460 yystate = yytable[yystate];
461 else
462 yystate = yydefgoto[yyn - YYNTOKENS];
463 ps->state = yystate;
464
465 continue;
466
467
468 /*------------------------------------.
469 | yyerrlab -- here on detecting error |
470 `------------------------------------*/
471 yyerrlab:
472 /* If not already recovering from an error, report this error. */
473 if (!parser->yyerrstatus) {
474 yyerror ("syntax error");
475 }
476
477
478 if (parser->yyerrstatus == 3) {
479 /* If just tried and failed to reuse lookahead token after an
480 error, discard it. */
481
482 /* Return failure if at end of input. */
483 if (parser->yychar == YYEOF) {
484 /* Pop the error token. */
485 SvREFCNT_dec(ps->compcv);
486 YYPOPSTACK;
487 /* Pop the rest of the stack. */
488 while (ps > parser->stack) {
489 YYDSYMPRINTF ("Error: popping", yystos[ps->state], &ps->val);
490 LEAVE_SCOPE(ps->savestack_ix);
491 if (yy_type_tab[yystos[ps->state]] == toketype_opval
492 && ps->val.opval)
493 {
494 YYDPRINTF ((Perl_debug_log, "(freeing op)\n"));
495 if (ps->compcv != PL_compcv) {
496 PL_compcv = ps->compcv;
497 PAD_SET_CUR_NOSAVE(CvPADLIST(PL_compcv), 1);
498 }
499 op_free(ps->val.opval);
500 }
501 SvREFCNT_dec(ps->compcv);
502 YYPOPSTACK;
503 }
504 YYABORT;
505 }
506
507 YYDSYMPRINTF ("Error: discarding", yytoken, &parser->yylval);
508 parser->yychar = YYEMPTY;
509
510 }
511
512 /* Else will try to reuse lookahead token after shifting the error
513 token. */
514 goto yyerrlab1;
515
516
517 /*----------------------------------------------------.
518 | yyerrlab1 -- error raised explicitly by an action. |
519 `----------------------------------------------------*/
520 yyerrlab1:
521 parser->yyerrstatus = 3; /* Each real token shifted decrements this. */
522
523 for (;;) {
524 yyn = yypact[yystate];
525 if (yyn != YYPACT_NINF) {
526 yyn += YYTERROR;
527 if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) {
528 yyn = yytable[yyn];
529 if (0 < yyn)
530 break;
531 }
532 }
533
534 /* Pop the current state because it cannot handle the error token. */
535 if (ps == parser->stack)
536 YYABORT;
537
538 YYDSYMPRINTF ("Error: popping", yystos[ps->state], &ps->val);
539 LEAVE_SCOPE(ps->savestack_ix);
540 if (yy_type_tab[yystos[ps->state]] == toketype_opval && ps->val.opval) {
541 YYDPRINTF ((Perl_debug_log, "(freeing op)\n"));
542 if (ps->compcv != PL_compcv) {
543 PL_compcv = ps->compcv;
544 PAD_SET_CUR_NOSAVE(CvPADLIST(PL_compcv), 1);
545 }
546 op_free(ps->val.opval);
547 }
548 SvREFCNT_dec(ps->compcv);
549 YYPOPSTACK;
550 yystate = ps->state;
551
552 YY_STACK_PRINT(parser);
553 }
554
555 if (yyn == YYFINAL)
556 YYACCEPT;
557
558 YYDPRINTF ((Perl_debug_log, "Shifting error token, "));
559
560 YYPUSHSTACK;
561 ps->state = yyn;
562 ps->val = parser->yylval;
563 ps->compcv = (CV*)SvREFCNT_inc(PL_compcv);
564 ps->savestack_ix = PL_savestack_ix;
565#ifdef DEBUGGING
566 ps->name ="<err>";
567#endif
568
569 } /* main loop */
570
571
572 /*-------------------------------------.
573 | yyacceptlab -- YYACCEPT comes here. |
574 `-------------------------------------*/
575 yyacceptlab:
576 yyresult = 0;
577 for (ps=parser->ps; ps > parser->stack; ps--) {
578 SvREFCNT_dec(ps->compcv);
579 }
580 parser->ps = parser->stack; /* disable cleanup */
581 goto yyreturn;
582
583 /*-----------------------------------.
584 | yyabortlab -- YYABORT comes here. |
585 `-----------------------------------*/
586 yyabortlab:
587 yyresult = 1;
588 goto yyreturn;
589
590 yyreturn:
591 LEAVE; /* force parser stack cleanup before we return */
592 return yyresult;
593}
594
595/*
596 * ex: set ts=8 sts=4 sw=4 et:
597 */