blob: 1ade6669166bf7a47fab844b052404f2faff4ca6 [file] [log] [blame]
drh82415f22015-11-09 19:33:42 +00001/*
2** 2000-05-29
drh75897232000-05-29 14:26:00 +00003**
drh82415f22015-11-09 19:33:42 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
6**
7** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
10**
11*************************************************************************
12** Driver template for the LEMON parser generator.
13**
14** The "lemon" program processes an LALR(1) input grammar file, then uses
15** this template to construct a parser. The "lemon" program inserts text
16** at each "%%" line. Also, any "P-a-r-s-e" identifer prefix (without the
17** interstitial "-" characters) contained in this template is changed into
18** the value of the %name directive from the grammar. Otherwise, the content
19** of this template is copied straight through into the generate parser
20** source file.
21**
22** The following is the concatenation of all %include directives from the
23** input grammar file:
drh75897232000-05-29 14:26:00 +000024*/
drh82415f22015-11-09 19:33:42 +000025#include <stdio.h>
26/************ Begin %include sections from the grammar ************************/
drh75897232000-05-29 14:26:00 +000027%%
drh82415f22015-11-09 19:33:42 +000028/**************** End of %include directives **********************************/
29/* These constants specify the various numeric values for terminal symbols
30** in a format understandable to "makeheaders". This section is blank unless
31** "lemon" is run with the "-m" command-line option.
32***************** Begin makeheaders token definitions *************************/
33%%
34/**************** End makeheaders token definitions ***************************/
drh822a62f2015-11-09 19:35:18 +000035
36/* The next sections is a series of control #defines.
drh75897232000-05-29 14:26:00 +000037** various aspects of the generated parser.
drh82415f22015-11-09 19:33:42 +000038** YYCODETYPE is the data type used to store the integer codes
39** that represent terminal and non-terminal symbols.
40** "unsigned char" is used if there are fewer than
41** 256 symbols. Larger types otherwise.
42** YYNOCODE is a number of type YYCODETYPE that is not used for
43** any terminal or nonterminal symbol.
drh0bd1f4e2002-06-06 18:54:39 +000044** YYFALLBACK If defined, this indicates that one or more tokens
drh82415f22015-11-09 19:33:42 +000045** (also known as: "terminal symbols") have fall-back
46** values which should be used if the original symbol
47** would not parse. This permits keywords to sometimes
48** be used as identifiers, for example.
49** YYACTIONTYPE is the data type used for "action codes" - numbers
50** that indicate what to do in response to the next
51** token.
52** ParseTOKENTYPE is the data type used for minor type for terminal
53** symbols. Background: A "minor type" is a semantic
54** value associated with a terminal or non-terminal
55** symbols. For example, for an "ID" terminal symbol,
56** the minor type might be the name of the identifier.
57** Each non-terminal can have a different minor type.
58** Terminal symbols all have the same minor type, though.
59** This macros defines the minor type for terminal
60** symbols.
61** YYMINORTYPE is the data type used for all minor types.
drh75897232000-05-29 14:26:00 +000062** This is typically a union of many types, one of
63** which is ParseTOKENTYPE. The entry in the union
drh82415f22015-11-09 19:33:42 +000064** for terminal symbols is called "yy0".
drhb19fd012007-03-29 01:44:45 +000065** YYSTACKDEPTH is the maximum depth of the parser's stack. If
66** zero the stack is dynamically sized using realloc()
drh1f245e42002-03-11 13:55:50 +000067** ParseARG_SDECL A static variable declaration for the %extra_argument
68** ParseARG_PDECL A parameter declaration for the %extra_argument
69** ParseARG_STORE Code to store %extra_argument into yypParser
70** ParseARG_FETCH Code to extract %extra_argument from yypParser
drh75897232000-05-29 14:26:00 +000071** YYERRORSYMBOL is the code number of the error symbol. If not
72** defined, then do no error processing.
drh3bd48ab2015-09-07 18:23:37 +000073** YYNSTATE the combined number of states.
74** YYNRULE the number of rules in the grammar
drh0d9de992017-12-26 18:04:23 +000075** YYNTOKEN Number of terminal symbols
drh3bd48ab2015-09-07 18:23:37 +000076** YY_MAX_SHIFT Maximum value for shift actions
77** YY_MIN_SHIFTREDUCE Minimum value for shift-reduce actions
78** YY_MAX_SHIFTREDUCE Maximum value for shift-reduce actions
drh3bd48ab2015-09-07 18:23:37 +000079** YY_ERROR_ACTION The yy_action[] code for syntax error
80** YY_ACCEPT_ACTION The yy_action[] code for accept
81** YY_NO_ACTION The yy_action[] code for no-op
drh5c8241b2017-12-24 23:38:10 +000082** YY_MIN_REDUCE Minimum value for reduce actions
83** YY_MAX_REDUCE Maximum value for reduce actions
drh75897232000-05-29 14:26:00 +000084*/
drh82415f22015-11-09 19:33:42 +000085#ifndef INTERFACE
86# define INTERFACE 1
87#endif
88/************* Begin control #defines *****************************************/
drh75897232000-05-29 14:26:00 +000089%%
drh82415f22015-11-09 19:33:42 +000090/************* End control #defines *******************************************/
drh75897232000-05-29 14:26:00 +000091
drh8a415d32009-06-12 13:53:51 +000092/* Define the yytestcase() macro to be a no-op if is not already defined
93** otherwise.
94**
95** Applications can choose to define yytestcase() in the %include section
96** to a macro that can assist in verifying code coverage. For production
97** code the yytestcase() macro should be turned off. But it is useful
98** for testing.
99*/
100#ifndef yytestcase
101# define yytestcase(X)
102#endif
103
drh26c9b5e2008-04-11 14:56:53 +0000104
drh34ff57b2008-07-14 12:27:51 +0000105/* Next are the tables used to determine what action to take based on the
drh8b582012003-10-21 13:16:03 +0000106** current state and lookahead token. These tables are used to implement
107** functions that take a state number and lookahead value and return an
108** action integer.
drh75897232000-05-29 14:26:00 +0000109**
drh8548a052003-10-22 22:15:27 +0000110** Suppose the action integer is N. Then the action is determined as
111** follows
drh75897232000-05-29 14:26:00 +0000112**
drh3bd48ab2015-09-07 18:23:37 +0000113** 0 <= N <= YY_MAX_SHIFT Shift N. That is, push the lookahead
drh8548a052003-10-22 22:15:27 +0000114** token onto the stack and goto state N.
115**
drh3bd48ab2015-09-07 18:23:37 +0000116** N between YY_MIN_SHIFTREDUCE Shift to an arbitrary state then
117** and YY_MAX_SHIFTREDUCE reduce by rule N-YY_MIN_SHIFTREDUCE.
drh8548a052003-10-22 22:15:27 +0000118**
drh3bd48ab2015-09-07 18:23:37 +0000119** N == YY_ERROR_ACTION A syntax error has occurred.
drh8548a052003-10-22 22:15:27 +0000120**
drh3bd48ab2015-09-07 18:23:37 +0000121** N == YY_ACCEPT_ACTION The parser accepts its input.
drh8548a052003-10-22 22:15:27 +0000122**
drh3bd48ab2015-09-07 18:23:37 +0000123** N == YY_NO_ACTION No such action. Denotes unused
drh8548a052003-10-22 22:15:27 +0000124** slots in the yy_action[] table.
125**
drh5c8241b2017-12-24 23:38:10 +0000126** N between YY_MIN_REDUCE Reduce by rule N-YY_MIN_REDUCE
127** and YY_MAX_REDUCE
128**
drh8548a052003-10-22 22:15:27 +0000129** The action table is constructed as a single large table named yy_action[].
drh701b6882016-08-10 13:30:43 +0000130** Given state S and lookahead X, the action is computed as either:
drh75897232000-05-29 14:26:00 +0000131**
drh701b6882016-08-10 13:30:43 +0000132** (A) N = yy_action[ yy_shift_ofst[S] + X ]
133** (B) N = yy_default[S]
drh8b582012003-10-21 13:16:03 +0000134**
drh3a9d6c72017-12-25 04:15:38 +0000135** The (A) formula is preferred. The B formula is used instead if
136** yy_lookahead[yy_shift_ofst[S]+X] is not equal to X.
drh8b582012003-10-21 13:16:03 +0000137**
drh701b6882016-08-10 13:30:43 +0000138** The formulas above are for computing the action when the lookahead is
drh8b582012003-10-21 13:16:03 +0000139** a terminal symbol. If the lookahead is a non-terminal (as occurs after
140** a reduce action) then the yy_reduce_ofst[] array is used in place of
drh3a9d6c72017-12-25 04:15:38 +0000141** the yy_shift_ofst[] array.
drh8b582012003-10-21 13:16:03 +0000142**
143** The following are the tables generated in this section:
144**
145** yy_action[] A single table containing all actions.
146** yy_lookahead[] A table containing the lookahead for each entry in
147** yy_action. Used to detect hash collisions.
148** yy_shift_ofst[] For each state, the offset into yy_action for
149** shifting terminals.
150** yy_reduce_ofst[] For each state, the offset into yy_action for
151** shifting non-terminals after a reduce.
152** yy_default[] Default action for each state.
drh82415f22015-11-09 19:33:42 +0000153**
154*********** Begin parsing tables **********************************************/
drh75897232000-05-29 14:26:00 +0000155%%
drh82415f22015-11-09 19:33:42 +0000156/********** End of lemon-generated parsing tables *****************************/
drh75897232000-05-29 14:26:00 +0000157
drh82415f22015-11-09 19:33:42 +0000158/* The next table maps tokens (terminal symbols) into fallback tokens.
159** If a construct like the following:
drh0bd1f4e2002-06-06 18:54:39 +0000160**
161** %fallback ID X Y Z.
162**
drh34ff57b2008-07-14 12:27:51 +0000163** appears in the grammar, then ID becomes a fallback token for X, Y,
drh0bd1f4e2002-06-06 18:54:39 +0000164** and Z. Whenever one of the tokens X, Y, or Z is input to the parser
165** but it does not parse, the type of the token is changed to ID and
166** the parse is retried before an error is thrown.
drh82415f22015-11-09 19:33:42 +0000167**
168** This feature can be used, for example, to cause some keywords in a language
169** to revert to identifiers if they keyword does not apply in the context where
170** it appears.
drh0bd1f4e2002-06-06 18:54:39 +0000171*/
172#ifdef YYFALLBACK
173static const YYCODETYPE yyFallback[] = {
174%%
175};
176#endif /* YYFALLBACK */
177
drh75897232000-05-29 14:26:00 +0000178/* The following structure represents a single element of the
179** parser's stack. Information stored includes:
180**
181** + The state number for the parser at this level of the stack.
182**
183** + The value of the token stored at this level of the stack.
184** (In other words, the "major" token.)
185**
186** + The semantic value stored at this level of the stack. This is
187** the information used by the action routines in the grammar.
188** It is sometimes called the "minor" token.
drha248a722015-09-07 19:52:55 +0000189**
190** After the "shift" half of a SHIFTREDUCE action, the stateno field
191** actually contains the reduce action for the second half of the
192** SHIFTREDUCE.
drh75897232000-05-29 14:26:00 +0000193*/
194struct yyStackEntry {
drha248a722015-09-07 19:52:55 +0000195 YYACTIONTYPE stateno; /* The state-number, or reduce action in SHIFTREDUCE */
drh2abcd582008-07-24 23:34:07 +0000196 YYCODETYPE major; /* The major token value. This is the code
197 ** number for the token at this stack level */
198 YYMINORTYPE minor; /* The user-supplied minor token value. This
199 ** is the value of the token */
drh75897232000-05-29 14:26:00 +0000200};
drh1f245e42002-03-11 13:55:50 +0000201typedef struct yyStackEntry yyStackEntry;
drh75897232000-05-29 14:26:00 +0000202
203/* The state of the parser is completely contained in an instance of
204** the following structure */
205struct yyParser {
drh118ab652016-05-23 21:56:24 +0000206 yyStackEntry *yytos; /* Pointer to top element of the stack */
drhec424a52008-07-25 15:39:03 +0000207#ifdef YYTRACKMAXSTACKDEPTH
drh118ab652016-05-23 21:56:24 +0000208 int yyhwm; /* High-water mark of the stack */
drhec424a52008-07-25 15:39:03 +0000209#endif
drhdab943c2016-02-16 01:01:43 +0000210#ifndef YYNOERRORRECOVERY
drh1f245e42002-03-11 13:55:50 +0000211 int yyerrcnt; /* Shifts left before out of the error */
drhdab943c2016-02-16 01:01:43 +0000212#endif
drh1f245e42002-03-11 13:55:50 +0000213 ParseARG_SDECL /* A place to hold %extra_argument */
drhb19fd012007-03-29 01:44:45 +0000214#if YYSTACKDEPTH<=0
215 int yystksz; /* Current side of the stack */
216 yyStackEntry *yystack; /* The parser's stack */
drh8dc82472016-05-27 04:10:47 +0000217 yyStackEntry yystk0; /* First stack entry */
drhb19fd012007-03-29 01:44:45 +0000218#else
drh1f245e42002-03-11 13:55:50 +0000219 yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */
drh8b471e72017-06-28 15:01:35 +0000220 yyStackEntry *yystackEnd; /* Last entry in the stack */
drhb19fd012007-03-29 01:44:45 +0000221#endif
drh75897232000-05-29 14:26:00 +0000222};
223typedef struct yyParser yyParser;
224
225#ifndef NDEBUG
226#include <stdio.h>
227static FILE *yyTraceFILE = 0;
228static char *yyTracePrompt = 0;
drh0bd1f4e2002-06-06 18:54:39 +0000229#endif /* NDEBUG */
drh75897232000-05-29 14:26:00 +0000230
drh0bd1f4e2002-06-06 18:54:39 +0000231#ifndef NDEBUG
drh75897232000-05-29 14:26:00 +0000232/*
233** Turn parser tracing on by giving a stream to which to write the trace
234** and a prompt to preface each trace message. Tracing is turned off
235** by making either argument NULL
236**
237** Inputs:
238** <ul>
239** <li> A FILE* to which trace output should be written.
240** If NULL, then tracing is turned off.
241** <li> A prefix string written at the beginning of every
242** line of trace output. If NULL, then tracing is
243** turned off.
244** </ul>
245**
246** Outputs:
247** None.
248*/
drh75897232000-05-29 14:26:00 +0000249void ParseTrace(FILE *TraceFILE, char *zTracePrompt){
250 yyTraceFILE = TraceFILE;
251 yyTracePrompt = zTracePrompt;
252 if( yyTraceFILE==0 ) yyTracePrompt = 0;
253 else if( yyTracePrompt==0 ) yyTraceFILE = 0;
254}
drh0bd1f4e2002-06-06 18:54:39 +0000255#endif /* NDEBUG */
drh75897232000-05-29 14:26:00 +0000256
drh0d9de992017-12-26 18:04:23 +0000257#if defined(YYCOVERAGE) || !defined(NDEBUG)
drh75897232000-05-29 14:26:00 +0000258/* For tracing shifts, the names of all terminals and nonterminals
259** are required. The following table supplies these names */
drh57196282004-10-06 15:41:16 +0000260static const char *const yyTokenName[] = {
drh75897232000-05-29 14:26:00 +0000261%%
262};
drh0d9de992017-12-26 18:04:23 +0000263#endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */
drh75897232000-05-29 14:26:00 +0000264
drh0bd1f4e2002-06-06 18:54:39 +0000265#ifndef NDEBUG
266/* For tracing reduce actions, the names of all rules are required.
267*/
drh57196282004-10-06 15:41:16 +0000268static const char *const yyRuleName[] = {
drh0bd1f4e2002-06-06 18:54:39 +0000269%%
270};
271#endif /* NDEBUG */
drha1b351a2001-09-14 16:42:12 +0000272
drh960e8c62001-04-03 16:53:21 +0000273
drhb19fd012007-03-29 01:44:45 +0000274#if YYSTACKDEPTH<=0
275/*
drh8dc82472016-05-27 04:10:47 +0000276** Try to increase the size of the parser stack. Return the number
277** of errors. Return 0 on success.
drhb19fd012007-03-29 01:44:45 +0000278*/
drh8dc82472016-05-27 04:10:47 +0000279static int yyGrowStack(yyParser *p){
drhb19fd012007-03-29 01:44:45 +0000280 int newSize;
drhabecc0b2016-05-24 00:40:54 +0000281 int idx;
drhb19fd012007-03-29 01:44:45 +0000282 yyStackEntry *pNew;
283
284 newSize = p->yystksz*2 + 100;
drhabecc0b2016-05-24 00:40:54 +0000285 idx = p->yytos ? (int)(p->yytos - p->yystack) : 0;
drh8dc82472016-05-27 04:10:47 +0000286 if( p->yystack==&p->yystk0 ){
287 pNew = malloc(newSize*sizeof(pNew[0]));
288 if( pNew ) pNew[0] = p->yystk0;
289 }else{
290 pNew = realloc(p->yystack, newSize*sizeof(pNew[0]));
291 }
drhb19fd012007-03-29 01:44:45 +0000292 if( pNew ){
293 p->yystack = pNew;
drhabecc0b2016-05-24 00:40:54 +0000294 p->yytos = &p->yystack[idx];
drhb19fd012007-03-29 01:44:45 +0000295#ifndef NDEBUG
296 if( yyTraceFILE ){
drh8dc82472016-05-27 04:10:47 +0000297 fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n",
298 yyTracePrompt, p->yystksz, newSize);
drhb19fd012007-03-29 01:44:45 +0000299 }
300#endif
drh8dc82472016-05-27 04:10:47 +0000301 p->yystksz = newSize;
drhb19fd012007-03-29 01:44:45 +0000302 }
drh8dc82472016-05-27 04:10:47 +0000303 return pNew==0;
drhb19fd012007-03-29 01:44:45 +0000304}
305#endif
306
drh82415f22015-11-09 19:33:42 +0000307/* Datatype of the argument to the memory allocated passed as the
308** second argument to ParseAlloc() below. This can be changed by
309** putting an appropriate #define in the %include section of the input
310** grammar.
311*/
312#ifndef YYMALLOCARGTYPE
313# define YYMALLOCARGTYPE size_t
314#endif
315
drhd26cc542017-01-28 20:46:37 +0000316/* Initialize a new parser that has already been allocated.
317*/
318void ParseInit(void *yypParser){
319 yyParser *pParser = (yyParser*)yypParser;
320#ifdef YYTRACKMAXSTACKDEPTH
321 pParser->yyhwm = 0;
322#endif
323#if YYSTACKDEPTH<=0
324 pParser->yytos = NULL;
325 pParser->yystack = NULL;
326 pParser->yystksz = 0;
327 if( yyGrowStack(pParser) ){
328 pParser->yystack = &pParser->yystk0;
329 pParser->yystksz = 1;
330 }
331#endif
332#ifndef YYNOERRORRECOVERY
333 pParser->yyerrcnt = -1;
334#endif
335 pParser->yytos = pParser->yystack;
336 pParser->yystack[0].stateno = 0;
337 pParser->yystack[0].major = 0;
drh92395c52017-07-04 12:50:00 +0000338#if YYSTACKDEPTH>0
drh8b471e72017-06-28 15:01:35 +0000339 pParser->yystackEnd = &pParser->yystack[YYSTACKDEPTH-1];
drh92395c52017-07-04 12:50:00 +0000340#endif
drhd26cc542017-01-28 20:46:37 +0000341}
342
343#ifndef Parse_ENGINEALWAYSONSTACK
drh75897232000-05-29 14:26:00 +0000344/*
345** This function allocates a new parser.
346** The only argument is a pointer to a function which works like
347** malloc.
348**
349** Inputs:
350** A pointer to the function used to allocate memory.
351**
352** Outputs:
353** A pointer to a parser. This pointer is used in subsequent calls
354** to Parse and ParseFree.
355*/
drh82415f22015-11-09 19:33:42 +0000356void *ParseAlloc(void *(*mallocProc)(YYMALLOCARGTYPE)){
drh75897232000-05-29 14:26:00 +0000357 yyParser *pParser;
drh82415f22015-11-09 19:33:42 +0000358 pParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) );
drhd26cc542017-01-28 20:46:37 +0000359 if( pParser ) ParseInit(pParser);
drh75897232000-05-29 14:26:00 +0000360 return pParser;
361}
drhd26cc542017-01-28 20:46:37 +0000362#endif /* Parse_ENGINEALWAYSONSTACK */
363
drh75897232000-05-29 14:26:00 +0000364
drh82415f22015-11-09 19:33:42 +0000365/* The following function deletes the "minor type" or semantic value
366** associated with a symbol. The symbol can be either a terminal
367** or nonterminal. "yymajor" is the symbol code, and "yypminor" is
368** a pointer to the value to be deleted. The code used to do the
369** deletions is derived from the %destructor and/or %token_destructor
370** directives of the input grammar.
drh75897232000-05-29 14:26:00 +0000371*/
drh633e6d52008-07-28 19:34:53 +0000372static void yy_destructor(
373 yyParser *yypParser, /* The parser */
374 YYCODETYPE yymajor, /* Type code for object to destroy */
375 YYMINORTYPE *yypminor /* The object to be destroyed */
376){
377 ParseARG_FETCH;
drh75897232000-05-29 14:26:00 +0000378 switch( yymajor ){
379 /* Here is inserted the actions which take place when a
380 ** terminal or non-terminal is destroyed. This can happen
381 ** when the symbol is popped from the stack during a
382 ** reduce or during error processing or when a parser is
383 ** being destroyed before it is finished parsing.
384 **
385 ** Note: during a reduce, the only symbols destroyed are those
drh82415f22015-11-09 19:33:42 +0000386 ** which appear on the RHS of the rule, but which are *not* used
drh75897232000-05-29 14:26:00 +0000387 ** inside the C code.
388 */
drh82415f22015-11-09 19:33:42 +0000389/********* Begin destructor definitions ***************************************/
drh75897232000-05-29 14:26:00 +0000390%%
drh82415f22015-11-09 19:33:42 +0000391/********* End destructor definitions *****************************************/
drh75897232000-05-29 14:26:00 +0000392 default: break; /* If no destructor action specified: do nothing */
393 }
394}
395
396/*
397** Pop the parser's stack once.
398**
399** If there is a destructor routine associated with the token which
400** is popped from the stack, then call it.
drh75897232000-05-29 14:26:00 +0000401*/
drh3781f012015-11-09 14:11:37 +0000402static void yy_pop_parser_stack(yyParser *pParser){
403 yyStackEntry *yytos;
drh118ab652016-05-23 21:56:24 +0000404 assert( pParser->yytos!=0 );
drh240c7fa2016-07-05 12:47:28 +0000405 assert( pParser->yytos > pParser->yystack );
drh118ab652016-05-23 21:56:24 +0000406 yytos = pParser->yytos--;
drh75897232000-05-29 14:26:00 +0000407#ifndef NDEBUG
drh3781f012015-11-09 14:11:37 +0000408 if( yyTraceFILE ){
drh75897232000-05-29 14:26:00 +0000409 fprintf(yyTraceFILE,"%sPopping %s\n",
410 yyTracePrompt,
drh3ddfdf72003-12-22 14:53:19 +0000411 yyTokenName[yytos->major]);
drh75897232000-05-29 14:26:00 +0000412 }
413#endif
drh3781f012015-11-09 14:11:37 +0000414 yy_destructor(pParser, yytos->major, &yytos->minor);
drh75897232000-05-29 14:26:00 +0000415}
416
drhd26cc542017-01-28 20:46:37 +0000417/*
418** Clear all secondary memory allocations from the parser
419*/
420void ParseFinalize(void *p){
421 yyParser *pParser = (yyParser*)p;
422 while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser);
423#if YYSTACKDEPTH<=0
424 if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack);
425#endif
426}
427
428#ifndef Parse_ENGINEALWAYSONSTACK
drh75897232000-05-29 14:26:00 +0000429/*
drh82415f22015-11-09 19:33:42 +0000430** Deallocate and destroy a parser. Destructors are called for
drh75897232000-05-29 14:26:00 +0000431** all stack elements before shutting the parser down.
432**
drh82415f22015-11-09 19:33:42 +0000433** If the YYPARSEFREENEVERNULL macro exists (for example because it
434** is defined in a %include section of the input grammar) then it is
435** assumed that the input pointer is never NULL.
drh75897232000-05-29 14:26:00 +0000436*/
drh75897232000-05-29 14:26:00 +0000437void ParseFree(
drh960e8c62001-04-03 16:53:21 +0000438 void *p, /* The parser to be deleted */
439 void (*freeProc)(void*) /* Function used to reclaim memory */
drh75897232000-05-29 14:26:00 +0000440){
drh82415f22015-11-09 19:33:42 +0000441#ifndef YYPARSEFREENEVERNULL
drhd26cc542017-01-28 20:46:37 +0000442 if( p==0 ) return;
drh82415f22015-11-09 19:33:42 +0000443#endif
drhd26cc542017-01-28 20:46:37 +0000444 ParseFinalize(p);
445 (*freeProc)(p);
drh75897232000-05-29 14:26:00 +0000446}
drhd26cc542017-01-28 20:46:37 +0000447#endif /* Parse_ENGINEALWAYSONSTACK */
drh75897232000-05-29 14:26:00 +0000448
449/*
drhec424a52008-07-25 15:39:03 +0000450** Return the peak depth of the stack for a parser.
451*/
452#ifdef YYTRACKMAXSTACKDEPTH
453int ParseStackPeak(void *p){
454 yyParser *pParser = (yyParser*)p;
drh118ab652016-05-23 21:56:24 +0000455 return pParser->yyhwm;
drhec424a52008-07-25 15:39:03 +0000456}
457#endif
458
drh0d9de992017-12-26 18:04:23 +0000459/* This array of booleans keeps track of the parser statement
460** coverage. The element yycoverage[X][Y] is set when the parser
461** is in state X and has a lookahead token Y. In a well-tested
462** systems, every element of this matrix should end up being set.
463*/
464#if defined(YYCOVERAGE)
465static unsigned char yycoverage[YYNSTATE][YYNTOKEN];
466#endif
467
468/*
469** Write into out a description of every state/lookahead combination that
drh7038a992017-12-27 17:14:50 +0000470**
471** (1) has not been used by the parser, and
472** (2) is not a syntax error.
473**
474** Return the number of missed state/lookahead combinations.
drh0d9de992017-12-26 18:04:23 +0000475*/
476#if defined(YYCOVERAGE)
477int ParseCoverage(FILE *out){
drh7038a992017-12-27 17:14:50 +0000478 int stateno, iLookAhead, i;
drh0d9de992017-12-26 18:04:23 +0000479 int nMissed = 0;
drh7038a992017-12-27 17:14:50 +0000480 for(stateno=0; stateno<YYNSTATE; stateno++){
481 i = yy_shift_ofst[stateno];
482 for(iLookAhead=0; iLookAhead<YYNTOKEN; iLookAhead++){
drhcf8e0e92017-12-27 17:36:58 +0000483 if( yy_lookahead[i+iLookAhead]!=iLookAhead ) continue;
drh7038a992017-12-27 17:14:50 +0000484 if( yycoverage[stateno][iLookAhead]==0 ) nMissed++;
drh22716cb2017-12-26 18:32:06 +0000485 if( out ){
drh7038a992017-12-27 17:14:50 +0000486 fprintf(out,"State %d lookahead %s %s\n", stateno,
487 yyTokenName[iLookAhead],
488 yycoverage[stateno][iLookAhead] ? "ok" : "missed");
drh22716cb2017-12-26 18:32:06 +0000489 }
drh0d9de992017-12-26 18:04:23 +0000490 }
491 }
492 return nMissed;
493}
494#endif
495
drhec424a52008-07-25 15:39:03 +0000496/*
drh8b582012003-10-21 13:16:03 +0000497** Find the appropriate action for a parser given the terminal
498** look-ahead token iLookAhead.
drh75897232000-05-29 14:26:00 +0000499*/
drh4ef07702016-03-16 19:45:54 +0000500static unsigned int yy_find_shift_action(
drh75897232000-05-29 14:26:00 +0000501 yyParser *pParser, /* The parser */
drhd9f291e2006-06-13 11:15:47 +0000502 YYCODETYPE iLookAhead /* The look-ahead token */
drh75897232000-05-29 14:26:00 +0000503){
drh8b582012003-10-21 13:16:03 +0000504 int i;
drh118ab652016-05-23 21:56:24 +0000505 int stateno = pParser->yytos->stateno;
drha4414042015-11-09 15:06:26 +0000506
drhef53a9f2017-12-25 00:10:05 +0000507 if( stateno>YY_MAX_SHIFT ) return stateno;
drhae2a4082015-09-07 20:02:39 +0000508 assert( stateno <= YY_SHIFT_COUNT );
drh0d9de992017-12-26 18:04:23 +0000509#if defined(YYCOVERAGE)
510 yycoverage[stateno][iLookAhead] = 1;
511#endif
drha4414042015-11-09 15:06:26 +0000512 do{
513 i = yy_shift_ofst[stateno];
drh54cfb492018-02-09 15:04:51 +0000514 assert( i>=0 );
515 assert( i+YYNTOKEN<=(int)sizeof(yy_lookahead)/sizeof(yy_lookahead[0]) );
drha4414042015-11-09 15:06:26 +0000516 assert( iLookAhead!=YYNOCODE );
drh7038a992017-12-27 17:14:50 +0000517 assert( iLookAhead < YYNTOKEN );
drha4414042015-11-09 15:06:26 +0000518 i += iLookAhead;
drh3a9d6c72017-12-25 04:15:38 +0000519 if( yy_lookahead[i]!=iLookAhead ){
drh4767d972006-06-14 15:03:49 +0000520#ifdef YYFALLBACK
drhc83db9e2016-08-10 01:43:30 +0000521 YYCODETYPE iFallback; /* Fallback token */
522 if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0])
523 && (iFallback = yyFallback[iLookAhead])!=0 ){
drh4767d972006-06-14 15:03:49 +0000524#ifndef NDEBUG
drhc83db9e2016-08-10 01:43:30 +0000525 if( yyTraceFILE ){
526 fprintf(yyTraceFILE, "%sFALLBACK %s => %s\n",
527 yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]);
drhe09daa92006-06-10 13:29:31 +0000528 }
drha4414042015-11-09 15:06:26 +0000529#endif
drhc83db9e2016-08-10 01:43:30 +0000530 assert( yyFallback[iFallback]==0 ); /* Fallback loop must terminate */
531 iLookAhead = iFallback;
532 continue;
533 }
534#endif
drha4414042015-11-09 15:06:26 +0000535#ifdef YYWILDCARD
drhc83db9e2016-08-10 01:43:30 +0000536 {
537 int j = i - iLookAhead + YYWILDCARD;
538 if(
drha4414042015-11-09 15:06:26 +0000539#if YY_SHIFT_MIN+YYWILDCARD<0
drhc83db9e2016-08-10 01:43:30 +0000540 j>=0 &&
drha4414042015-11-09 15:06:26 +0000541#endif
542#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT
drhc83db9e2016-08-10 01:43:30 +0000543 j<YY_ACTTAB_COUNT &&
drha4414042015-11-09 15:06:26 +0000544#endif
drhc83db9e2016-08-10 01:43:30 +0000545 yy_lookahead[j]==YYWILDCARD && iLookAhead>0
546 ){
drha4414042015-11-09 15:06:26 +0000547#ifndef NDEBUG
drhc83db9e2016-08-10 01:43:30 +0000548 if( yyTraceFILE ){
549 fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n",
550 yyTracePrompt, yyTokenName[iLookAhead],
551 yyTokenName[YYWILDCARD]);
drha4414042015-11-09 15:06:26 +0000552 }
drhc83db9e2016-08-10 01:43:30 +0000553#endif /* NDEBUG */
554 return yy_action[j];
drha4414042015-11-09 15:06:26 +0000555 }
drha4414042015-11-09 15:06:26 +0000556 }
drhc83db9e2016-08-10 01:43:30 +0000557#endif /* YYWILDCARD */
drha4414042015-11-09 15:06:26 +0000558 return yy_default[stateno];
559 }else{
560 return yy_action[i];
drh0bd1f4e2002-06-06 18:54:39 +0000561 }
drha4414042015-11-09 15:06:26 +0000562 }while(1);
drh8b582012003-10-21 13:16:03 +0000563}
564
565/*
566** Find the appropriate action for a parser given the non-terminal
567** look-ahead token iLookAhead.
drh8b582012003-10-21 13:16:03 +0000568*/
569static int yy_find_reduce_action(
drh161aba32005-02-01 04:09:36 +0000570 int stateno, /* Current state number */
drhd9f291e2006-06-13 11:15:47 +0000571 YYCODETYPE iLookAhead /* The look-ahead token */
drh8b582012003-10-21 13:16:03 +0000572){
573 int i;
drh7f7c2572008-04-27 18:45:10 +0000574#ifdef YYERRORSYMBOL
drhf16371d2009-11-03 19:18:31 +0000575 if( stateno>YY_REDUCE_COUNT ){
drh7f7c2572008-04-27 18:45:10 +0000576 return yy_default[stateno];
577 }
578#else
drhf16371d2009-11-03 19:18:31 +0000579 assert( stateno<=YY_REDUCE_COUNT );
drh7f7c2572008-04-27 18:45:10 +0000580#endif
drh01495b92008-01-23 12:52:40 +0000581 i = yy_reduce_ofst[stateno];
drh01495b92008-01-23 12:52:40 +0000582 assert( iLookAhead!=YYNOCODE );
drh8b582012003-10-21 13:16:03 +0000583 i += iLookAhead;
drh7f7c2572008-04-27 18:45:10 +0000584#ifdef YYERRORSYMBOL
drhf16371d2009-11-03 19:18:31 +0000585 if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){
drh7f7c2572008-04-27 18:45:10 +0000586 return yy_default[stateno];
587 }
588#else
drhf16371d2009-11-03 19:18:31 +0000589 assert( i>=0 && i<YY_ACTTAB_COUNT );
drh01495b92008-01-23 12:52:40 +0000590 assert( yy_lookahead[i]==iLookAhead );
drh7f7c2572008-04-27 18:45:10 +0000591#endif
drh01495b92008-01-23 12:52:40 +0000592 return yy_action[i];
drh75897232000-05-29 14:26:00 +0000593}
594
595/*
drhb19fd012007-03-29 01:44:45 +0000596** The following routine is called if the stack overflows.
597*/
drh45f31be2016-02-16 21:19:49 +0000598static void yyStackOverflow(yyParser *yypParser){
drhb19fd012007-03-29 01:44:45 +0000599 ParseARG_FETCH;
drhb19fd012007-03-29 01:44:45 +0000600#ifndef NDEBUG
601 if( yyTraceFILE ){
602 fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt);
603 }
604#endif
drhabecc0b2016-05-24 00:40:54 +0000605 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
drhb19fd012007-03-29 01:44:45 +0000606 /* Here code is inserted which will execute if the parser
607 ** stack every overflows */
drh82415f22015-11-09 19:33:42 +0000608/******** Begin %stack_overflow code ******************************************/
drhb19fd012007-03-29 01:44:45 +0000609%%
drh82415f22015-11-09 19:33:42 +0000610/******** End %stack_overflow code ********************************************/
drhb19fd012007-03-29 01:44:45 +0000611 ParseARG_STORE; /* Suppress warning about unused %extra_argument var */
612}
613
614/*
drha248a722015-09-07 19:52:55 +0000615** Print tracing information for a SHIFT action
616*/
617#ifndef NDEBUG
drhe58f74f2017-12-24 17:06:41 +0000618static void yyTraceShift(yyParser *yypParser, int yyNewState, const char *zTag){
drha248a722015-09-07 19:52:55 +0000619 if( yyTraceFILE ){
drha248a722015-09-07 19:52:55 +0000620 if( yyNewState<YYNSTATE ){
drhe58f74f2017-12-24 17:06:41 +0000621 fprintf(yyTraceFILE,"%s%s '%s', go to state %d\n",
622 yyTracePrompt, zTag, yyTokenName[yypParser->yytos->major],
drh0c4105e2015-11-10 14:51:22 +0000623 yyNewState);
drha248a722015-09-07 19:52:55 +0000624 }else{
drhe58f74f2017-12-24 17:06:41 +0000625 fprintf(yyTraceFILE,"%s%s '%s', pending reduce %d\n",
626 yyTracePrompt, zTag, yyTokenName[yypParser->yytos->major],
627 yyNewState - YY_MIN_REDUCE);
drha248a722015-09-07 19:52:55 +0000628 }
629 }
630}
631#else
drhe58f74f2017-12-24 17:06:41 +0000632# define yyTraceShift(X,Y,Z)
drha248a722015-09-07 19:52:55 +0000633#endif
634
635/*
drh82415f22015-11-09 19:33:42 +0000636** Perform a shift action.
drh75897232000-05-29 14:26:00 +0000637*/
drha248a722015-09-07 19:52:55 +0000638static void yy_shift(
drh75897232000-05-29 14:26:00 +0000639 yyParser *yypParser, /* The parser to be shifted */
640 int yyNewState, /* The new state to shift in */
641 int yyMajor, /* The major token to shift in */
drh45f31be2016-02-16 21:19:49 +0000642 ParseTOKENTYPE yyMinor /* The minor token to shift in */
drh75897232000-05-29 14:26:00 +0000643){
drh3ddfdf72003-12-22 14:53:19 +0000644 yyStackEntry *yytos;
drh118ab652016-05-23 21:56:24 +0000645 yypParser->yytos++;
drhec424a52008-07-25 15:39:03 +0000646#ifdef YYTRACKMAXSTACKDEPTH
drh118ab652016-05-23 21:56:24 +0000647 if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){
648 yypParser->yyhwm++;
649 assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) );
drhec424a52008-07-25 15:39:03 +0000650 }
651#endif
drhb19fd012007-03-29 01:44:45 +0000652#if YYSTACKDEPTH>0
drh8b471e72017-06-28 15:01:35 +0000653 if( yypParser->yytos>yypParser->yystackEnd ){
drh63413312016-12-06 17:59:05 +0000654 yypParser->yytos--;
drh45f31be2016-02-16 21:19:49 +0000655 yyStackOverflow(yypParser);
drha248a722015-09-07 19:52:55 +0000656 return;
drh75897232000-05-29 14:26:00 +0000657 }
drhb19fd012007-03-29 01:44:45 +0000658#else
drh118ab652016-05-23 21:56:24 +0000659 if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){
drh8dc82472016-05-27 04:10:47 +0000660 if( yyGrowStack(yypParser) ){
drh63413312016-12-06 17:59:05 +0000661 yypParser->yytos--;
drh45f31be2016-02-16 21:19:49 +0000662 yyStackOverflow(yypParser);
drha248a722015-09-07 19:52:55 +0000663 return;
drhb19fd012007-03-29 01:44:45 +0000664 }
665 }
666#endif
drh0efd37f2016-06-06 18:17:36 +0000667 if( yyNewState > YY_MAX_SHIFT ){
668 yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE;
669 }
drh118ab652016-05-23 21:56:24 +0000670 yytos = yypParser->yytos;
drhb27b7f52008-12-10 18:03:45 +0000671 yytos->stateno = (YYACTIONTYPE)yyNewState;
672 yytos->major = (YYCODETYPE)yyMajor;
drh45f31be2016-02-16 21:19:49 +0000673 yytos->minor.yy0 = yyMinor;
drhe58f74f2017-12-24 17:06:41 +0000674 yyTraceShift(yypParser, yyNewState, "Shift");
drh75897232000-05-29 14:26:00 +0000675}
676
677/* The following table contains information about every rule that
678** is used during the reduce.
679*/
drh57196282004-10-06 15:41:16 +0000680static const struct {
drh6be95362017-06-28 13:47:56 +0000681 YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */
682 signed char nrhs; /* Negative of the number of RHS symbols in the rule */
drh75897232000-05-29 14:26:00 +0000683} yyRuleInfo[] = {
684%%
685};
686
drh1f245e42002-03-11 13:55:50 +0000687static void yy_accept(yyParser*); /* Forward Declaration */
drh75897232000-05-29 14:26:00 +0000688
689/*
690** Perform a reduce action and the shift that must immediately
691** follow the reduce.
drh087316c2017-12-15 12:22:21 +0000692**
693** The yyLookahead and yyLookaheadToken parameters provide reduce actions
694** access to the lookahead token (if any). The yyLookahead will be YYNOCODE
695** if the lookahead token has already been consumed. As this procedure is
696** only called from one place, optimizing compilers will in-line it, which
697** means that the extra parameters have no performance impact.
drh75897232000-05-29 14:26:00 +0000698*/
699static void yy_reduce(
700 yyParser *yypParser, /* The parser */
drh087316c2017-12-15 12:22:21 +0000701 unsigned int yyruleno, /* Number of the rule by which to reduce */
702 int yyLookahead, /* Lookahead token, or YYNOCODE if none */
703 ParseTOKENTYPE yyLookaheadToken /* Value of the lookahead token */
drh75897232000-05-29 14:26:00 +0000704){
705 int yygoto; /* The next state */
706 int yyact; /* The next action */
drh1f245e42002-03-11 13:55:50 +0000707 yyStackEntry *yymsp; /* The top of the parser's stack */
drh75897232000-05-29 14:26:00 +0000708 int yysize; /* Amount to pop the stack */
drh1f245e42002-03-11 13:55:50 +0000709 ParseARG_FETCH;
drhb9685182018-01-17 13:15:23 +0000710 (void)yyLookahead;
711 (void)yyLookaheadToken;
drh118ab652016-05-23 21:56:24 +0000712 yymsp = yypParser->yytos;
drh0bd1f4e2002-06-06 18:54:39 +0000713#ifndef NDEBUG
drh4ef07702016-03-16 19:45:54 +0000714 if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){
drh3bd48ab2015-09-07 18:23:37 +0000715 yysize = yyRuleInfo[yyruleno].nrhs;
drhe58f74f2017-12-24 17:06:41 +0000716 if( yysize ){
717 fprintf(yyTraceFILE, "%sReduce %d [%s], go to state %d.\n",
718 yyTracePrompt,
719 yyruleno, yyRuleName[yyruleno], yymsp[yysize].stateno);
720 }else{
721 fprintf(yyTraceFILE, "%sReduce %d [%s].\n",
722 yyTracePrompt, yyruleno, yyRuleName[yyruleno]);
723 }
drh0bd1f4e2002-06-06 18:54:39 +0000724 }
725#endif /* NDEBUG */
drh45f31be2016-02-16 21:19:49 +0000726
727 /* Check that the stack is large enough to grow by a single entry
728 ** if the RHS of the rule is empty. This ensures that there is room
729 ** enough on the stack to push the LHS value */
730 if( yyRuleInfo[yyruleno].nrhs==0 ){
731#ifdef YYTRACKMAXSTACKDEPTH
drh118ab652016-05-23 21:56:24 +0000732 if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){
733 yypParser->yyhwm++;
734 assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack));
drh45f31be2016-02-16 21:19:49 +0000735 }
736#endif
737#if YYSTACKDEPTH>0
drh8b471e72017-06-28 15:01:35 +0000738 if( yypParser->yytos>=yypParser->yystackEnd ){
drh45f31be2016-02-16 21:19:49 +0000739 yyStackOverflow(yypParser);
740 return;
741 }
742#else
drh118ab652016-05-23 21:56:24 +0000743 if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){
drh8dc82472016-05-27 04:10:47 +0000744 if( yyGrowStack(yypParser) ){
drh45f31be2016-02-16 21:19:49 +0000745 yyStackOverflow(yypParser);
746 return;
747 }
drh8dc82472016-05-27 04:10:47 +0000748 yymsp = yypParser->yytos;
drh45f31be2016-02-16 21:19:49 +0000749 }
750#endif
751 }
drhcb6c5652007-01-16 18:19:12 +0000752
drh75897232000-05-29 14:26:00 +0000753 switch( yyruleno ){
754 /* Beginning here are the reduction cases. A typical example
755 ** follows:
756 ** case 0:
drh75897232000-05-29 14:26:00 +0000757 ** #line <lineno> <grammarfile>
758 ** { ... } // User supplied code
759 ** #line <lineno> <thisfile>
760 ** break;
761 */
drh82415f22015-11-09 19:33:42 +0000762/********** Begin reduce actions **********************************************/
drh75897232000-05-29 14:26:00 +0000763%%
drh82415f22015-11-09 19:33:42 +0000764/********** End reduce actions ************************************************/
drh75897232000-05-29 14:26:00 +0000765 };
drh4ef07702016-03-16 19:45:54 +0000766 assert( yyruleno<sizeof(yyRuleInfo)/sizeof(yyRuleInfo[0]) );
drh75897232000-05-29 14:26:00 +0000767 yygoto = yyRuleInfo[yyruleno].lhs;
768 yysize = yyRuleInfo[yyruleno].nrhs;
drh6be95362017-06-28 13:47:56 +0000769 yyact = yy_find_reduce_action(yymsp[yysize].stateno,(YYCODETYPE)yygoto);
drhbd8fcc12017-06-28 11:56:18 +0000770
771 /* There are no SHIFTREDUCE actions on nonterminals because the table
772 ** generator has simplified them to pure REDUCE actions. */
773 assert( !(yyact>YY_MAX_SHIFT && yyact<=YY_MAX_SHIFTREDUCE) );
774
775 /* It is not possible for a REDUCE to be followed by an error */
776 assert( yyact!=YY_ERROR_ACTION );
777
drhef53a9f2017-12-25 00:10:05 +0000778 yymsp += yysize+1;
779 yypParser->yytos = yymsp;
780 yymsp->stateno = (YYACTIONTYPE)yyact;
781 yymsp->major = (YYCODETYPE)yygoto;
782 yyTraceShift(yypParser, yyact, "... then shift");
drh75897232000-05-29 14:26:00 +0000783}
784
785/*
786** The following code executes when the parse fails
787*/
drhd3ec02d2009-06-12 02:27:14 +0000788#ifndef YYNOERRORRECOVERY
drh75897232000-05-29 14:26:00 +0000789static void yy_parse_failed(
790 yyParser *yypParser /* The parser */
drh75897232000-05-29 14:26:00 +0000791){
drh1f245e42002-03-11 13:55:50 +0000792 ParseARG_FETCH;
drh75897232000-05-29 14:26:00 +0000793#ifndef NDEBUG
794 if( yyTraceFILE ){
795 fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt);
796 }
797#endif
drhabecc0b2016-05-24 00:40:54 +0000798 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
drh75897232000-05-29 14:26:00 +0000799 /* Here code is inserted which will be executed whenever the
800 ** parser fails */
drh82415f22015-11-09 19:33:42 +0000801/************ Begin %parse_failure code ***************************************/
drh75897232000-05-29 14:26:00 +0000802%%
drh82415f22015-11-09 19:33:42 +0000803/************ End %parse_failure code *****************************************/
drh1f245e42002-03-11 13:55:50 +0000804 ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
drh75897232000-05-29 14:26:00 +0000805}
drhd3ec02d2009-06-12 02:27:14 +0000806#endif /* YYNOERRORRECOVERY */
drh75897232000-05-29 14:26:00 +0000807
808/*
809** The following code executes when a syntax error first occurs.
810*/
811static void yy_syntax_error(
812 yyParser *yypParser, /* The parser */
813 int yymajor, /* The major type of the error token */
drh45f31be2016-02-16 21:19:49 +0000814 ParseTOKENTYPE yyminor /* The minor type of the error token */
drh75897232000-05-29 14:26:00 +0000815){
drh1f245e42002-03-11 13:55:50 +0000816 ParseARG_FETCH;
drh45f31be2016-02-16 21:19:49 +0000817#define TOKEN yyminor
drh82415f22015-11-09 19:33:42 +0000818/************ Begin %syntax_error code ****************************************/
drh75897232000-05-29 14:26:00 +0000819%%
drh82415f22015-11-09 19:33:42 +0000820/************ End %syntax_error code ******************************************/
drh1f245e42002-03-11 13:55:50 +0000821 ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
drh75897232000-05-29 14:26:00 +0000822}
823
824/*
825** The following is executed when the parser accepts
826*/
827static void yy_accept(
828 yyParser *yypParser /* The parser */
drh75897232000-05-29 14:26:00 +0000829){
drh1f245e42002-03-11 13:55:50 +0000830 ParseARG_FETCH;
drh75897232000-05-29 14:26:00 +0000831#ifndef NDEBUG
832 if( yyTraceFILE ){
833 fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt);
834 }
835#endif
drhdd703e22016-07-12 19:54:49 +0000836#ifndef YYNOERRORRECOVERY
837 yypParser->yyerrcnt = -1;
838#endif
drh756b41e2016-05-24 18:55:08 +0000839 assert( yypParser->yytos==yypParser->yystack );
drh75897232000-05-29 14:26:00 +0000840 /* Here code is inserted which will be executed whenever the
841 ** parser accepts */
drh82415f22015-11-09 19:33:42 +0000842/*********** Begin %parse_accept code *****************************************/
drh75897232000-05-29 14:26:00 +0000843%%
drh82415f22015-11-09 19:33:42 +0000844/*********** End %parse_accept code *******************************************/
drh1f245e42002-03-11 13:55:50 +0000845 ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
drh75897232000-05-29 14:26:00 +0000846}
847
848/* The main parser program.
849** The first argument is a pointer to a structure obtained from
850** "ParseAlloc" which describes the current state of the parser.
851** The second argument is the major token number. The third is
852** the minor token. The fourth optional argument is whatever the
853** user wants (and specified in the grammar) and is available for
854** use by the action routines.
855**
856** Inputs:
857** <ul>
858** <li> A pointer to the parser (an opaque structure.)
859** <li> The major token number.
860** <li> The minor token number.
861** <li> An option argument of a grammar-specified type.
862** </ul>
863**
864** Outputs:
865** None.
866*/
drh75897232000-05-29 14:26:00 +0000867void Parse(
868 void *yyp, /* The parser */
869 int yymajor, /* The major token code number */
870 ParseTOKENTYPE yyminor /* The value for the token */
drh1f245e42002-03-11 13:55:50 +0000871 ParseARG_PDECL /* Optional %extra_argument parameter */
drh75897232000-05-29 14:26:00 +0000872){
873 YYMINORTYPE yyminorunion;
drh4ef07702016-03-16 19:45:54 +0000874 unsigned int yyact; /* The parser action. */
drha4414042015-11-09 15:06:26 +0000875#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY)
drh75897232000-05-29 14:26:00 +0000876 int yyendofinput; /* True if we are at the end of input */
drha4414042015-11-09 15:06:26 +0000877#endif
drhc4dd3fd2008-01-22 01:48:05 +0000878#ifdef YYERRORSYMBOL
drh75897232000-05-29 14:26:00 +0000879 int yyerrorhit = 0; /* True if yymajor has invoked an error */
drhc4dd3fd2008-01-22 01:48:05 +0000880#endif
drh75897232000-05-29 14:26:00 +0000881 yyParser *yypParser; /* The parser */
882
drh75897232000-05-29 14:26:00 +0000883 yypParser = (yyParser*)yyp;
drhabecc0b2016-05-24 00:40:54 +0000884 assert( yypParser->yytos!=0 );
drha4414042015-11-09 15:06:26 +0000885#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY)
drh75897232000-05-29 14:26:00 +0000886 yyendofinput = (yymajor==0);
drha4414042015-11-09 15:06:26 +0000887#endif
drh1f245e42002-03-11 13:55:50 +0000888 ParseARG_STORE;
drh75897232000-05-29 14:26:00 +0000889
890#ifndef NDEBUG
891 if( yyTraceFILE ){
drhe58f74f2017-12-24 17:06:41 +0000892 int stateno = yypParser->yytos->stateno;
893 if( stateno < YY_MIN_REDUCE ){
894 fprintf(yyTraceFILE,"%sInput '%s' in state %d\n",
895 yyTracePrompt,yyTokenName[yymajor],stateno);
896 }else{
897 fprintf(yyTraceFILE,"%sInput '%s' with pending reduce %d\n",
898 yyTracePrompt,yyTokenName[yymajor],stateno-YY_MIN_REDUCE);
899 }
drh75897232000-05-29 14:26:00 +0000900 }
901#endif
902
903 do{
drh3abbd392008-12-10 23:04:13 +0000904 yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor);
drh5c8241b2017-12-24 23:38:10 +0000905 if( yyact >= YY_MIN_REDUCE ){
906 yy_reduce(yypParser,yyact-YY_MIN_REDUCE,yymajor,yyminor);
907 }else if( yyact <= YY_MAX_SHIFTREDUCE ){
drh45f31be2016-02-16 21:19:49 +0000908 yy_shift(yypParser,yyact,yymajor,yyminor);
drhdab943c2016-02-16 01:01:43 +0000909#ifndef YYNOERRORRECOVERY
drha248a722015-09-07 19:52:55 +0000910 yypParser->yyerrcnt--;
drhdab943c2016-02-16 01:01:43 +0000911#endif
drha248a722015-09-07 19:52:55 +0000912 yymajor = YYNOCODE;
drhef53a9f2017-12-25 00:10:05 +0000913 }else if( yyact==YY_ACCEPT_ACTION ){
914 yypParser->yytos--;
915 yy_accept(yypParser);
916 return;
drhc4dd3fd2008-01-22 01:48:05 +0000917 }else{
918 assert( yyact == YY_ERROR_ACTION );
drh45f31be2016-02-16 21:19:49 +0000919 yyminorunion.yy0 = yyminor;
drhc4dd3fd2008-01-22 01:48:05 +0000920#ifdef YYERRORSYMBOL
drh3ddfdf72003-12-22 14:53:19 +0000921 int yymx;
drhc4dd3fd2008-01-22 01:48:05 +0000922#endif
drh75897232000-05-29 14:26:00 +0000923#ifndef NDEBUG
924 if( yyTraceFILE ){
925 fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt);
926 }
927#endif
928#ifdef YYERRORSYMBOL
929 /* A syntax error has occurred.
930 ** The response to an error depends upon whether or not the
931 ** grammar defines an error token "ERROR".
932 **
933 ** This is what we do if the grammar does define ERROR:
934 **
935 ** * Call the %syntax_error function.
936 **
937 ** * Begin popping the stack until we enter a state where
938 ** it is legal to shift the error symbol, then shift
939 ** the error symbol.
940 **
941 ** * Set the error count to three.
942 **
943 ** * Begin accepting and shifting new tokens. No new error
944 ** processing will occur until three tokens have been
945 ** shifted successfully.
946 **
947 */
drh1f245e42002-03-11 13:55:50 +0000948 if( yypParser->yyerrcnt<0 ){
drh45f31be2016-02-16 21:19:49 +0000949 yy_syntax_error(yypParser,yymajor,yyminor);
drh75897232000-05-29 14:26:00 +0000950 }
drh118ab652016-05-23 21:56:24 +0000951 yymx = yypParser->yytos->major;
drh3ddfdf72003-12-22 14:53:19 +0000952 if( yymx==YYERRORSYMBOL || yyerrorhit ){
drh75897232000-05-29 14:26:00 +0000953#ifndef NDEBUG
954 if( yyTraceFILE ){
955 fprintf(yyTraceFILE,"%sDiscard input token %s\n",
956 yyTracePrompt,yyTokenName[yymajor]);
957 }
958#endif
drh45f31be2016-02-16 21:19:49 +0000959 yy_destructor(yypParser, (YYCODETYPE)yymajor, &yyminorunion);
drh75897232000-05-29 14:26:00 +0000960 yymajor = YYNOCODE;
961 }else{
drh4eda15e2016-10-04 12:20:12 +0000962 while( yypParser->yytos >= yypParser->yystack
drh118ab652016-05-23 21:56:24 +0000963 && yymx != YYERRORSYMBOL
964 && (yyact = yy_find_reduce_action(
965 yypParser->yytos->stateno,
drh3bd48ab2015-09-07 18:23:37 +0000966 YYERRORSYMBOL)) >= YY_MIN_REDUCE
drh75897232000-05-29 14:26:00 +0000967 ){
968 yy_pop_parser_stack(yypParser);
969 }
drh118ab652016-05-23 21:56:24 +0000970 if( yypParser->yytos < yypParser->yystack || yymajor==0 ){
drhb27b7f52008-12-10 18:03:45 +0000971 yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
drh1f245e42002-03-11 13:55:50 +0000972 yy_parse_failed(yypParser);
drh240c7fa2016-07-05 12:47:28 +0000973#ifndef YYNOERRORRECOVERY
974 yypParser->yyerrcnt = -1;
975#endif
drh75897232000-05-29 14:26:00 +0000976 yymajor = YYNOCODE;
drh3ddfdf72003-12-22 14:53:19 +0000977 }else if( yymx!=YYERRORSYMBOL ){
drh45f31be2016-02-16 21:19:49 +0000978 yy_shift(yypParser,yyact,YYERRORSYMBOL,yyminor);
drh75897232000-05-29 14:26:00 +0000979 }
980 }
drh1f245e42002-03-11 13:55:50 +0000981 yypParser->yyerrcnt = 3;
drh75897232000-05-29 14:26:00 +0000982 yyerrorhit = 1;
drhd3ec02d2009-06-12 02:27:14 +0000983#elif defined(YYNOERRORRECOVERY)
984 /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to
985 ** do any kind of error recovery. Instead, simply invoke the syntax
986 ** error routine and continue going as if nothing had happened.
987 **
988 ** Applications can set this macro (for example inside %include) if
989 ** they intend to abandon the parse upon the first syntax error seen.
990 */
drh45f31be2016-02-16 21:19:49 +0000991 yy_syntax_error(yypParser,yymajor, yyminor);
drhd3ec02d2009-06-12 02:27:14 +0000992 yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
993 yymajor = YYNOCODE;
994
drh75897232000-05-29 14:26:00 +0000995#else /* YYERRORSYMBOL is not defined */
996 /* This is what we do if the grammar does not define ERROR:
997 **
998 ** * Report an error message, and throw away the input token.
999 **
1000 ** * If the input token is $, then fail the parse.
1001 **
1002 ** As before, subsequent error messages are suppressed until
1003 ** three input tokens have been successfully shifted.
1004 */
drh1f245e42002-03-11 13:55:50 +00001005 if( yypParser->yyerrcnt<=0 ){
drh45f31be2016-02-16 21:19:49 +00001006 yy_syntax_error(yypParser,yymajor, yyminor);
drh75897232000-05-29 14:26:00 +00001007 }
drh1f245e42002-03-11 13:55:50 +00001008 yypParser->yyerrcnt = 3;
drhb27b7f52008-12-10 18:03:45 +00001009 yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
drh75897232000-05-29 14:26:00 +00001010 if( yyendofinput ){
drh1f245e42002-03-11 13:55:50 +00001011 yy_parse_failed(yypParser);
drhd3d4b3c2016-07-08 19:54:38 +00001012#ifndef YYNOERRORRECOVERY
1013 yypParser->yyerrcnt = -1;
1014#endif
drh75897232000-05-29 14:26:00 +00001015 }
1016 yymajor = YYNOCODE;
1017#endif
drh75897232000-05-29 14:26:00 +00001018 }
drhabecc0b2016-05-24 00:40:54 +00001019 }while( yymajor!=YYNOCODE && yypParser->yytos>yypParser->yystack );
drh3bd48ab2015-09-07 18:23:37 +00001020#ifndef NDEBUG
1021 if( yyTraceFILE ){
drh118ab652016-05-23 21:56:24 +00001022 yyStackEntry *i;
1023 char cDiv = '[';
drh0c4105e2015-11-10 14:51:22 +00001024 fprintf(yyTraceFILE,"%sReturn. Stack=",yyTracePrompt);
drh118ab652016-05-23 21:56:24 +00001025 for(i=&yypParser->yystack[1]; i<=yypParser->yytos; i++){
1026 fprintf(yyTraceFILE,"%c%s", cDiv, yyTokenName[i->major]);
1027 cDiv = ' ';
1028 }
drh0c4105e2015-11-10 14:51:22 +00001029 fprintf(yyTraceFILE,"]\n");
drh3bd48ab2015-09-07 18:23:37 +00001030 }
1031#endif
drh75897232000-05-29 14:26:00 +00001032 return;
1033}