15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Driver template for the LEMON parser generator. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This version of "lempar.c" is modified, slightly, for use by SQLite. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The only modifications are the addition of a couple of NEVER() 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** macros to disable tests that are needed in the case of a general 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** LALR(1) grammar but which are always false in the 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** specific grammar used by SQLite. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* First off, code is included that follows the "include" declaration 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the input grammar file. */ 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%% 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Next is all token values, in a form suitable for use by makeheaders. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This section will be null unless lemon is run with the -m switch. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** These constants (all generated automatically by the parser generator) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** specify the various kinds of tokens (terminals) that the parser 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** understands. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Each symbol here is a terminal symbol in the grammar. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%% 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Make sure the INTERFACE macro is defined. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef INTERFACE 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define INTERFACE 1 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The next thing included is series of defines which control 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** various aspects of the generated parser. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** YYCODETYPE is the data type used for storing terminal 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and nonterminal numbers. "unsigned char" is 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** used if there are fewer than 250 terminals 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and nonterminals. "int" is used otherwise. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** YYNOCODE is a number of type YYCODETYPE which corresponds 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to no legal terminal or nonterminal number. This 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** number is used to fill in empty slots of the hash 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** table. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** YYFALLBACK If defined, this indicates that one or more tokens 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** have fall-back values which should be used if the 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** original value of the token will not parse. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** YYACTIONTYPE is the data type used for storing terminal 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and nonterminal numbers. "unsigned char" is 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** used if there are fewer than 250 rules and 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** states combined. "int" is used otherwise. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ParseTOKENTYPE is the data type used for minor tokens given 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** directly to the parser from the tokenizer. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** YYMINORTYPE is the data type used for all minor tokens. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This is typically a union of many types, one of 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** which is ParseTOKENTYPE. The entry in the union 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for base tokens is called "yy0". 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** YYSTACKDEPTH is the maximum depth of the parser's stack. If 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** zero the stack is dynamically sized using realloc() 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ParseARG_SDECL A static variable declaration for the %extra_argument 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ParseARG_PDECL A parameter declaration for the %extra_argument 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ParseARG_STORE Code to store %extra_argument into yypParser 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ParseARG_FETCH Code to extract %extra_argument from yypParser 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** YYNSTATE the combined number of states. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** YYNRULE the number of rules in the grammar 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** YYERRORSYMBOL is the code number of the error symbol. If not 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** defined, then do no error processing. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%% 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define YY_NO_ACTION (YYNSTATE+YYNRULE+2) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define YY_ACCEPT_ACTION (YYNSTATE+YYNRULE+1) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define YY_ERROR_ACTION (YYNSTATE+YYNRULE) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The yyzerominor constant is used to initialize instances of 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** YYMINORTYPE objects to zero. */ 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const YYMINORTYPE yyzerominor = { 0 }; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Define the yytestcase() macro to be a no-op if is not already defined 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** otherwise. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Applications can choose to define yytestcase() in the %include section 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to a macro that can assist in verifying code coverage. For production 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** code the yytestcase() macro should be turned off. But it is useful 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for testing. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef yytestcase 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define yytestcase(X) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Next are the tables used to determine what action to take based on the 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** current state and lookahead token. These tables are used to implement 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** functions that take a state number and lookahead value and return an 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** action integer. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Suppose the action integer is N. Then the action is determined as 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** follows 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 0 <= N < YYNSTATE Shift N. That is, push the lookahead 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** token onto the stack and goto state N. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** YYNSTATE <= N < YYNSTATE+YYNRULE Reduce by rule N-YYNSTATE. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** N == YYNSTATE+YYNRULE A syntax error has occurred. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** N == YYNSTATE+YYNRULE+1 The parser accepts its input. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** N == YYNSTATE+YYNRULE+2 No such action. Denotes unused 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** slots in the yy_action[] table. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The action table is constructed as a single large table named yy_action[]. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Given state S and lookahead X, the action is computed as 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** yy_action[ yy_shift_ofst[S] + X ] 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the index value yy_shift_ofst[S]+X is out of range or if the value 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** yy_lookahead[yy_shift_ofst[S]+X] is not equal to X or if yy_shift_ofst[S] 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is equal to YY_SHIFT_USE_DFLT, it means that the action is not in the table 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and that yy_default[S] should be used instead. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The formula above is for computing the action when the lookahead is 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a terminal symbol. If the lookahead is a non-terminal (as occurs after 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a reduce action) then the yy_reduce_ofst[] array is used in place of 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** YY_SHIFT_USE_DFLT. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following are the tables generated in this section: 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** yy_action[] A single table containing all actions. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** yy_lookahead[] A table containing the lookahead for each entry in 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** yy_action. Used to detect hash collisions. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** yy_shift_ofst[] For each state, the offset into yy_action for 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** shifting terminals. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** yy_reduce_ofst[] For each state, the offset into yy_action for 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** shifting non-terminals after a reduce. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** yy_default[] Default action for each state. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%% 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The next table maps tokens into fallback tokens. If a construct 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** like the following: 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** %fallback ID X Y Z. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** appears in the grammar, then ID becomes a fallback token for X, Y, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and Z. Whenever one of the tokens X, Y, or Z is input to the parser 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** but it does not parse, the type of the token is changed to ID and 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the parse is retried before an error is thrown. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef YYFALLBACK 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const YYCODETYPE yyFallback[] = { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%% 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* YYFALLBACK */ 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The following structure represents a single element of the 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** parser's stack. Information stored includes: 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** + The state number for the parser at this level of the stack. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** + The value of the token stored at this level of the stack. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (In other words, the "major" token.) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** + The semantic value stored at this level of the stack. This is 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the information used by the action routines in the grammar. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** It is sometimes called the "minor" token. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct yyStackEntry { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YYACTIONTYPE stateno; /* The state-number */ 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YYCODETYPE major; /* The major token value. This is the code 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** number for the token at this stack level */ 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YYMINORTYPE minor; /* The user-supplied minor token value. This 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is the value of the token */ 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct yyStackEntry yyStackEntry; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The state of the parser is completely contained in an instance of 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the following structure */ 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct yyParser { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int yyidx; /* Index of top element in stack */ 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef YYTRACKMAXSTACKDEPTH 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int yyidxMax; /* Maximum value of yyidx */ 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int yyerrcnt; /* Shifts left before out of the error */ 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseARG_SDECL /* A place to hold %extra_argument */ 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if YYSTACKDEPTH<=0 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int yystksz; /* Current side of the stack */ 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyStackEntry *yystack; /* The parser's stack */ 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */ 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct yyParser yyParser; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static FILE *yyTraceFILE = 0; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char *yyTracePrompt = 0; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* NDEBUG */ 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Turn parser tracing on by giving a stream to which to write the trace 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and a prompt to preface each trace message. Tracing is turned off 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** by making either argument NULL 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Inputs: 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** <ul> 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** <li> A FILE* to which trace output should be written. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If NULL, then tracing is turned off. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** <li> A prefix string written at the beginning of every 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** line of trace output. If NULL, then tracing is 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** turned off. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** </ul> 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Outputs: 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** None. 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParseTrace(FILE *TraceFILE, char *zTracePrompt){ 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyTraceFILE = TraceFILE; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyTracePrompt = zTracePrompt; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yyTraceFILE==0 ) yyTracePrompt = 0; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if( yyTracePrompt==0 ) yyTraceFILE = 0; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* NDEBUG */ 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* For tracing shifts, the names of all terminals and nonterminals 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are required. The following table supplies these names */ 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char *const yyTokenName[] = { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%% 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* NDEBUG */ 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* For tracing reduce actions, the names of all rules are required. 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char *const yyRuleName[] = { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%% 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* NDEBUG */ 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if YYSTACKDEPTH<=0 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Try to increase the size of the parser stack. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void yyGrowStack(yyParser *p){ 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int newSize; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyStackEntry *pNew; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newSize = p->yystksz*2 + 100; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew = realloc(p->yystack, newSize*sizeof(pNew[0])); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNew ){ 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->yystack = pNew; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->yystksz = newSize; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yyTraceFILE ){ 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(yyTraceFILE,"%sStack grows to %d entries!\n", 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyTracePrompt, p->yystksz); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function allocates a new parser. 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The only argument is a pointer to a function which works like 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** malloc. 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Inputs: 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A pointer to the function used to allocate memory. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Outputs: 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A pointer to a parser. This pointer is used in subsequent calls 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to Parse and ParseFree. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void *ParseAlloc(void *(*mallocProc)(size_t)){ 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyParser *pParser; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParser = (yyParser*)(*mallocProc)( (size_t)sizeof(yyParser) ); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParser ){ 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParser->yyidx = -1; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef YYTRACKMAXSTACKDEPTH 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParser->yyidxMax = 0; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if YYSTACKDEPTH<=0 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParser->yystack = NULL; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParser->yystksz = 0; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyGrowStack(pParser); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pParser; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The following function deletes the value associated with a 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** symbol. The symbol can be either a terminal or nonterminal. 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "yymajor" is the symbol code, and "yypminor" is a pointer to 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the value. 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void yy_destructor( 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyParser *yypParser, /* The parser */ 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YYCODETYPE yymajor, /* Type code for object to destroy */ 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YYMINORTYPE *yypminor /* The object to be destroyed */ 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseARG_FETCH; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( yymajor ){ 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Here is inserted the actions which take place when a 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** terminal or non-terminal is destroyed. This can happen 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** when the symbol is popped from the stack during a 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** reduce or during error processing or when a parser is 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** being destroyed before it is finished parsing. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Note: during a reduce, the only symbols destroyed are those 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** which appear on the RHS of the rule, but which are not used 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** inside the C code. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%% 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: break; /* If no destructor action specified: do nothing */ 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Pop the parser's stack once. 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If there is a destructor routine associated with the token which 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is popped from the stack, then call it. 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the major token number for the symbol popped. 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int yy_pop_parser_stack(yyParser *pParser){ 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YYCODETYPE yymajor; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyStackEntry *yytos = &pParser->yystack[pParser->yyidx]; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* There is no mechanism by which the parser stack can be popped below 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** empty in SQLite. */ 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(pParser->yyidx<0) ) return 0; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yyTraceFILE && pParser->yyidx>=0 ){ 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(yyTraceFILE,"%sPopping %s\n", 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyTracePrompt, 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyTokenName[yytos->major]); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yymajor = yytos->major; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yy_destructor(pParser, yymajor, &yytos->minor); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParser->yyidx--; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return yymajor; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Deallocate and destroy a parser. Destructors are all called for 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** all stack elements before shutting the parser down. 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Inputs: 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** <ul> 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** <li> A pointer to the parser. This should be a pointer 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** obtained from ParseAlloc. 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** <li> A pointer to a function used to reclaim memory obtained 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** from malloc. 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** </ul> 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParseFree( 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *p, /* The parser to be deleted */ 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void (*freeProc)(void*) /* Function used to reclaim memory */ 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyParser *pParser = (yyParser*)p; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* In SQLite, we never try to destroy a parser that was not successfully 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** created in the first place. */ 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(pParser==0) ) return; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( pParser->yyidx>=0 ) yy_pop_parser_stack(pParser); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if YYSTACKDEPTH<=0 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) free(pParser->yystack); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*freeProc)((void*)pParser); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the peak depth of the stack for a parser. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef YYTRACKMAXSTACKDEPTH 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ParseStackPeak(void *p){ 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyParser *pParser = (yyParser*)p; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pParser->yyidxMax; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Find the appropriate action for a parser given the terminal 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** look-ahead token iLookAhead. 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the look-ahead token is YYNOCODE, then check to see if the action is 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** independent of the look-ahead. If it is, return the action, otherwise 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** return YY_NO_ACTION. 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int yy_find_shift_action( 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyParser *pParser, /* The parser */ 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YYCODETYPE iLookAhead /* The look-ahead token */ 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int stateno = pParser->yystack[pParser->yyidx].stateno; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( stateno>YY_SHIFT_COUNT 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || (i = yy_shift_ofst[stateno])==YY_SHIFT_USE_DFLT ){ 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return yy_default[stateno]; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( iLookAhead!=YYNOCODE ); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i += iLookAhead; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iLookAhead>0 ){ 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef YYFALLBACK 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YYCODETYPE iFallback; /* Fallback token */ 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0]) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && (iFallback = yyFallback[iLookAhead])!=0 ){ 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yyTraceFILE ){ 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(yyTraceFILE, "%sFALLBACK %s => %s\n", 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return yy_find_shift_action(pParser, iFallback); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef YYWILDCARD 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j = i - iLookAhead + YYWILDCARD; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if YY_SHIFT_MIN+YYWILDCARD<0 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j>=0 && 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j<YY_ACTTAB_COUNT && 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yy_lookahead[j]==YYWILDCARD 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yyTraceFILE ){ 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[YYWILDCARD]); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* NDEBUG */ 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return yy_action[j]; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* YYWILDCARD */ 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return yy_default[stateno]; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return yy_action[i]; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Find the appropriate action for a parser given the non-terminal 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** look-ahead token iLookAhead. 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the look-ahead token is YYNOCODE, then check to see if the action is 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** independent of the look-ahead. If it is, return the action, otherwise 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** return YY_NO_ACTION. 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int yy_find_reduce_action( 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int stateno, /* Current state number */ 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YYCODETYPE iLookAhead /* The look-ahead token */ 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef YYERRORSYMBOL 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( stateno>YY_REDUCE_COUNT ){ 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return yy_default[stateno]; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( stateno<=YY_REDUCE_COUNT ); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = yy_reduce_ofst[stateno]; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( i!=YY_REDUCE_USE_DFLT ); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( iLookAhead!=YYNOCODE ); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i += iLookAhead; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef YYERRORSYMBOL 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return yy_default[stateno]; 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( i>=0 && i<YY_ACTTAB_COUNT ); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( yy_lookahead[i]==iLookAhead ); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return yy_action[i]; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following routine is called if the stack overflows. 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void yyStackOverflow(yyParser *yypParser, YYMINORTYPE *yypMinor){ 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseARG_FETCH; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yypParser->yyidx--; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yyTraceFILE ){ 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Here code is inserted which will execute if the parser 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** stack every overflows */ 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%% 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseARG_STORE; /* Suppress warning about unused %extra_argument var */ 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Perform a shift action. 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void yy_shift( 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyParser *yypParser, /* The parser to be shifted */ 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int yyNewState, /* The new state to shift in */ 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int yyMajor, /* The major token to shift in */ 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YYMINORTYPE *yypMinor /* Pointer to the minor token to shift in */ 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyStackEntry *yytos; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yypParser->yyidx++; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef YYTRACKMAXSTACKDEPTH 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yypParser->yyidx>yypParser->yyidxMax ){ 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yypParser->yyidxMax = yypParser->yyidx; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if YYSTACKDEPTH>0 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yypParser->yyidx>=YYSTACKDEPTH ){ 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyStackOverflow(yypParser, yypMinor); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yypParser->yyidx>=yypParser->yystksz ){ 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyGrowStack(yypParser); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yypParser->yyidx>=yypParser->yystksz ){ 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyStackOverflow(yypParser, yypMinor); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yytos = &yypParser->yystack[yypParser->yyidx]; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yytos->stateno = (YYACTIONTYPE)yyNewState; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yytos->major = (YYCODETYPE)yyMajor; 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yytos->minor = *yypMinor; 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yyTraceFILE && yypParser->yyidx>0 ){ 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(yyTraceFILE,"%sShift %d\n",yyTracePrompt,yyNewState); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(yyTraceFILE,"%sStack:",yyTracePrompt); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=1; i<=yypParser->yyidx; i++) 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(yyTraceFILE," %s",yyTokenName[yypParser->yystack[i].major]); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(yyTraceFILE,"\n"); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The following table contains information about every rule that 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is used during the reduce. 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const struct { 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char nrhs; /* Number of right-hand side symbols in the rule */ 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} yyRuleInfo[] = { 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%% 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void yy_accept(yyParser*); /* Forward Declaration */ 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Perform a reduce action and the shift that must immediately 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** follow the reduce. 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void yy_reduce( 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyParser *yypParser, /* The parser */ 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int yyruleno /* Number of the rule by which to reduce */ 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int yygoto; /* The next state */ 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int yyact; /* The next action */ 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YYMINORTYPE yygotominor; /* The LHS of the rule reduced */ 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyStackEntry *yymsp; /* The top of the parser's stack */ 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int yysize; /* Amount to pop the stack */ 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseARG_FETCH; 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yymsp = &yypParser->yystack[yypParser->yyidx]; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yyTraceFILE && yyruleno>=0 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(yyTraceFILE, "%sReduce [%s].\n", yyTracePrompt, 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyRuleName[yyruleno]); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* NDEBUG */ 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Silence complaints from purify about yygotominor being uninitialized 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** in some cases when it is copied into the stack after the following 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** switch. yygotominor is uninitialized when a rule reduces that does 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** not set the value of its left-hand side nonterminal. Leaving the 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** value of the nonterminal uninitialized is utterly harmless as long 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** as the value is never used. So really the only thing this code 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** accomplishes is to quieten purify. 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 2007-01-16: The wireshark project (www.wireshark.org) reports that 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** without this code, their parser segfaults. I'm not sure what there 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** parser is doing to make this happen. This is the second bug report 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** from wireshark this week. Clearly they are stressing Lemon in ways 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** that it has not been previously stressed... (SQLite ticket #2172) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /*memset(&yygotominor, 0, sizeof(yygotominor));*/ 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yygotominor = yyzerominor; 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( yyruleno ){ 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Beginning here are the reduction cases. A typical example 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** follows: 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** case 0: 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** #line <lineno> <grammarfile> 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** { ... } // User supplied code 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** #line <lineno> <thisfile> 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** break; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%% 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yygoto = yyRuleInfo[yyruleno].lhs; 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yysize = yyRuleInfo[yyruleno].nrhs; 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yypParser->yyidx -= yysize; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyact = yy_find_reduce_action(yymsp[-yysize].stateno,(YYCODETYPE)yygoto); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yyact < YYNSTATE ){ 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef NDEBUG 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If we are not debugging and the reduce action popped at least 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** one element off the stack, then we can push the new element back 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** onto the stack here, and skip the stack overflow test in yy_shift(). 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** That gives a significant speed improvement. */ 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yysize ){ 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yypParser->yyidx++; 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yymsp -= yysize-1; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yymsp->stateno = (YYACTIONTYPE)yyact; 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yymsp->major = (YYCODETYPE)yygoto; 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yymsp->minor = yygotominor; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yy_shift(yypParser,yyact,yygoto,&yygotominor); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( yyact == YYNSTATE + YYNRULE + 1 ); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yy_accept(yypParser); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following code executes when the parse fails 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef YYNOERRORRECOVERY 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void yy_parse_failed( 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyParser *yypParser /* The parser */ 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseARG_FETCH; 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yyTraceFILE ){ 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Here code is inserted which will be executed whenever the 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** parser fails */ 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%% 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* YYNOERRORRECOVERY */ 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following code executes when a syntax error first occurs. 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void yy_syntax_error( 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyParser *yypParser, /* The parser */ 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int yymajor, /* The major type of the error token */ 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YYMINORTYPE yyminor /* The minor type of the error token */ 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseARG_FETCH; 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TOKEN (yyminor.yy0) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%% 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following is executed when the parser accepts 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void yy_accept( 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyParser *yypParser /* The parser */ 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseARG_FETCH; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yyTraceFILE ){ 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Here code is inserted which will be executed whenever the 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** parser accepts */ 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%% 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The main parser program. 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The first argument is a pointer to a structure obtained from 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "ParseAlloc" which describes the current state of the parser. 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The second argument is the major token number. The third is 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the minor token. The fourth optional argument is whatever the 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** user wants (and specified in the grammar) and is available for 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** use by the action routines. 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Inputs: 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** <ul> 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** <li> A pointer to the parser (an opaque structure.) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** <li> The major token number. 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** <li> The minor token number. 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** <li> An option argument of a grammar-specified type. 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** </ul> 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Outputs: 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** None. 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Parse( 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *yyp, /* The parser */ 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int yymajor, /* The major token code number */ 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseTOKENTYPE yyminor /* The value for the token */ 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseARG_PDECL /* Optional %extra_argument parameter */ 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YYMINORTYPE yyminorunion; 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int yyact; /* The parser action. */ 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int yyendofinput; /* True if we are at the end of input */ 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef YYERRORSYMBOL 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int yyerrorhit = 0; /* True if yymajor has invoked an error */ 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyParser *yypParser; /* The parser */ 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* (re)initialize the parser, if necessary */ 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yypParser = (yyParser*)yyp; 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yypParser->yyidx<0 ){ 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if YYSTACKDEPTH<=0 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yypParser->yystksz <=0 ){ 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /*memset(&yyminorunion, 0, sizeof(yyminorunion));*/ 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyminorunion = yyzerominor; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyStackOverflow(yypParser, &yyminorunion); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yypParser->yyidx = 0; 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yypParser->yyerrcnt = -1; 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yypParser->yystack[0].stateno = 0; 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yypParser->yystack[0].major = 0; 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyminorunion.yy0 = yyminor; 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyendofinput = (yymajor==0); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseARG_STORE; 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yyTraceFILE ){ 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(yyTraceFILE,"%sInput %s\n",yyTracePrompt,yyTokenName[yymajor]); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do{ 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yyact<YYNSTATE ){ 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !yyendofinput ); /* Impossible to shift the $ token */ 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yy_shift(yypParser,yyact,yymajor,&yyminorunion); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yypParser->yyerrcnt--; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yymajor = YYNOCODE; 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( yyact < YYNSTATE + YYNRULE ){ 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yy_reduce(yypParser,yyact-YYNSTATE); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( yyact == YY_ERROR_ACTION ); 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef YYERRORSYMBOL 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int yymx; 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yyTraceFILE ){ 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt); 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef YYERRORSYMBOL 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* A syntax error has occurred. 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The response to an error depends upon whether or not the 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** grammar defines an error token "ERROR". 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** This is what we do if the grammar does define ERROR: 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** * Call the %syntax_error function. 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** * Begin popping the stack until we enter a state where 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** it is legal to shift the error symbol, then shift 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the error symbol. 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** * Set the error count to three. 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** * Begin accepting and shifting new tokens. No new error 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** processing will occur until three tokens have been 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** shifted successfully. 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yypParser->yyerrcnt<0 ){ 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yy_syntax_error(yypParser,yymajor,yyminorunion); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yymx = yypParser->yystack[yypParser->yyidx].major; 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yymx==YYERRORSYMBOL || yyerrorhit ){ 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yyTraceFILE ){ 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(yyTraceFILE,"%sDiscard input token %s\n", 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyTracePrompt,yyTokenName[yymajor]); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yy_destructor(yypParser, (YYCODETYPE)yymajor,&yyminorunion); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yymajor = YYNOCODE; 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yypParser->yyidx >= 0 && 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yymx != YYERRORSYMBOL && 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (yyact = yy_find_reduce_action( 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yypParser->yystack[yypParser->yyidx].stateno, 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YYERRORSYMBOL)) >= YYNSTATE 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yy_pop_parser_stack(yypParser); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yypParser->yyidx < 0 || yymajor==0 ){ 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yy_parse_failed(yypParser); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yymajor = YYNOCODE; 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( yymx!=YYERRORSYMBOL ){ 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YYMINORTYPE u2; 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u2.YYERRSYMDT = 0; 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yy_shift(yypParser,yyact,YYERRORSYMBOL,&u2); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yypParser->yyerrcnt = 3; 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yyerrorhit = 1; 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(YYNOERRORRECOVERY) 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** do any kind of error recovery. Instead, simply invoke the syntax 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** error routine and continue going as if nothing had happened. 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Applications can set this macro (for example inside %include) if 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** they intend to abandon the parse upon the first syntax error seen. 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yy_syntax_error(yypParser,yymajor,yyminorunion); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yymajor = YYNOCODE; 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else /* YYERRORSYMBOL is not defined */ 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This is what we do if the grammar does not define ERROR: 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** * Report an error message, and throw away the input token. 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** * If the input token is $, then fail the parse. 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** As before, subsequent error messages are suppressed until 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** three input tokens have been successfully shifted. 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yypParser->yyerrcnt<=0 ){ 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yy_syntax_error(yypParser,yymajor,yyminorunion); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yypParser->yyerrcnt = 3; 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( yyendofinput ){ 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yy_parse_failed(yypParser); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) yymajor = YYNOCODE; 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }while( yymajor!=YYNOCODE && yypParser->yyidx>=0 ); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 861