xref: /openbsd/gnu/usr.bin/perl/parser.h (revision 8932bfb7)
1 /*    parser.h
2  *
3  *    Copyright (c) 2006, 2007, Larry Wall and others
4  *
5  *    You may distribute under the terms of either the GNU General Public
6  *    License or the Artistic License, as specified in the README file.
7  *
8  * This file defines the layout of the parser object used by the parser
9  * and lexer (perly.c, toke,c).
10  */
11 
12 #define YYEMPTY		(-2)
13 
14 typedef struct {
15     YYSTYPE val;    /* semantic value */
16     short   state;
17     I32     savestack_ix;	/* size of savestack at this state */
18     CV	    *compcv; /* value of PL_compcv when this value was created */
19 #ifdef DEBUGGING
20     const char  *name; /* token/rule name for -Dpv */
21 #endif
22 } yy_stack_frame;
23 
24 typedef struct yy_parser {
25 
26     /* parser state */
27 
28     struct yy_parser *old_parser; /* previous value of PL_parser */
29     YYSTYPE	    yylval;	/* value of lookahead symbol, set by yylex() */
30     int		    yychar;	/* The lookahead symbol.  */
31 
32     /* Number of tokens to shift before error messages enabled.  */
33     int		    yyerrstatus;
34 
35     int		    stack_size;
36     int		    yylen;	/* length of active reduction */
37     yy_stack_frame  *stack;	/* base of stack */
38     yy_stack_frame  *ps;	/* current stack frame */
39 
40     /* lexer state */
41 
42     I32		lex_brackets;	/* bracket count */
43     I32		lex_casemods;	/* casemod count */
44     char	*lex_brackstack;/* what kind of brackets to pop */
45     char	*lex_casestack;	/* what kind of case mods in effect */
46     U8		lex_defer;	/* state after determined token */
47     bool	lex_dojoin;	/* doing an array interpolation */
48     U8		lex_expect;	/* expect after determined token */
49     U8		expect;		/* how to interpret ambiguous tokens */
50     I32		lex_formbrack;	/* bracket count at outer format level */
51     OP		*lex_inpat;	/* in pattern $) and $| are special */
52     OP		*lex_op;	/* extra info to pass back on op */
53     SV		*lex_repl;	/* runtime replacement from s/// */
54     U16		lex_inwhat;	/* what kind of quoting are we in */
55     OPCODE	last_lop_op;	/* last list operator */
56     I32		lex_starts;	/* how many interps done on level */
57     SV		*lex_stuff;	/* runtime pattern from m// or s/// */
58     I32		multi_start;	/* 1st line of multi-line string */
59     I32		multi_end;	/* last line of multi-line string */
60     char	multi_open;	/* delimiter of said string */
61     char	multi_close;	/* delimiter of said string */
62     char	pending_ident;	/* pending identifier lookup */
63     bool	preambled;
64     /* XXX I32 space */
65     SUBLEXINFO	sublex_info;
66     SV		*linestr;	/* current chunk of src text */
67     char	*bufptr;
68     char	*oldbufptr;
69     char	*oldoldbufptr;
70     char	*bufend;
71     char	*linestart;	/* beginning of most recently read line */
72     char	*last_uni;	/* position of last named-unary op */
73     char	*last_lop;	/* position of last list operator */
74     line_t	copline;	/* current line number */
75     U16		in_my;		/* we're compiling a "my"/"our" declaration */
76     U8		lex_state;	/* next token is determined */
77     U8		error_count;	/* how many compile errors so far, max 10 */
78     HV		*in_my_stash;	/* declared class of this "my" declaration */
79     PerlIO	*rsfp;		/* current source file pointer */
80     AV		*rsfp_filters;	/* holds chain of active source filters */
81 
82 #ifdef PERL_MAD
83     SV		*endwhite;
84     I32		faketokens;
85     I32		lasttoke;
86     SV		*nextwhite;
87     I32		realtokenstart;
88     SV		*skipwhite;
89     SV		*thisclose;
90     MADPROP *	thismad;
91     SV		*thisopen;
92     SV		*thisstuff;
93     SV		*thistoken;
94     SV		*thiswhite;
95 
96 /* What we know when we're in LEX_KNOWNEXT state. */
97     NEXTTOKE	nexttoke[5];	/* value of next token, if any */
98     I32		curforce;
99 #else
100     YYSTYPE	nextval[5];	/* value of next token, if any */
101     I32		nexttype[5];	/* type of next token */
102     I32		nexttoke;
103 #endif
104 
105     COP		*saved_curcop;	/* the previous PL_curcop */
106     char	tokenbuf[256];
107 
108 } yy_parser;
109 
110 /* flags for lexer API */
111 #define LEX_STUFF_UTF8		0x00000001
112 #define LEX_KEEP_PREVIOUS	0x00000002
113 
114 /*
115  * Local variables:
116  * c-indentation-style: bsd
117  * c-basic-offset: 4
118  * indent-tabs-mode: t
119  * End:
120  *
121  * ex: set ts=8 sts=4 sw=4 noet:
122  */
123