📄 lempar.c
字号:
/* Driver template for the LEMON parser generator.** Copyright 1991-1995 by D. Richard Hipp.**** This library is free software; you can redistribute it and/or** modify it under the terms of the GNU Library General Public** License as published by the Free Software Foundation; either** version 2 of the License, or (at your option) any later version.** ** This library is distributed in the hope that it will be useful,** but WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU** Library General Public License for more details.** ** You should have received a copy of the GNU Library General Public** License along with this library; if not, write to the** Free Software Foundation, Inc., 59 Temple Place - Suite 330,** Boston, MA 02111-1307, USA.**** Modified 1997 to make it suitable for use with makeheaders.*//* First off, code is include which follows the "include" declaration** in the input file. */#include <stdio.h>%%/* Next is all token values, in a form suitable for use by makeheaders.** This section will be null unless lemon is run with the -m switch.*//* ** These constants (all generated automatically by the parser generator)** specify the various kinds of tokens (terminals) that the parser** understands. **** Each symbol here is a terminal symbol in the grammar.*/%%/* Make sure the INTERFACE macro is defined.*/#ifndef INTERFACE# define INTERFACE 1#endif/* The next thing included is series of defines which control** various aspects of the generated parser.** YYCODETYPE is the data type used for storing terminal** and nonterminal numbers. "unsigned char" is** used if there are fewer than 250 terminals** and nonterminals. "int" is used otherwise.** YYNOCODE is a number of type YYCODETYPE which corresponds** to no legal terminal or nonterminal number. This** number is used to fill in empty slots of the hash ** table.** YYACTIONTYPE is the data type used for storing terminal** and nonterminal numbers. "unsigned char" is** used if there are fewer than 250 rules and** states combined. "int" is used otherwise.** ParseTOKENTYPE is the data type used for minor tokens given ** directly to the parser from the tokenizer.** YYMINORTYPE is the data type used for all minor tokens.** This is typically a union of many types, one of** which is ParseTOKENTYPE. The entry in the union** for base tokens is called "yy0".** YYSTACKDEPTH is the maximum depth of the parser's stack.** ParseARGDECL is a declaration of a 3rd argument to the** parser, or null if there is no extra argument.** ParseKRARGDECL A version of ParseARGDECL for K&R C.** ParseANSIARGDECL A version of ParseARGDECL for ANSI C.** YYNSTATE the combined number of states.** YYNRULE the number of rules in the grammar** YYERRORSYMBOL is the code number of the error symbol. If not** defined, then do no error processing.*/%%#define YY_NO_ACTION (YYNSTATE+YYNRULE+2)#define YY_ACCEPT_ACTION (YYNSTATE+YYNRULE+1)#define YY_ERROR_ACTION (YYNSTATE+YYNRULE)/* Next is the action table. Each entry in this table contains**** + An integer which is the number representing the look-ahead** token**** + An integer indicating what action to take. Number (N) between** 0 and YYNSTATE-1 mean shift the look-ahead and go to state N.** Numbers between YYNSTATE and YYNSTATE+YYNRULE-1 mean reduce by** rule N-YYNSTATE. Number YYNSTATE+YYNRULE means that a syntax** error has occurred. Number YYNSTATE+YYNRULE+1 means the parser** accepts its input.**** + A pointer to the next entry with the same hash value.**** The action table is really a series of hash tables. Each hash** table contains a number of entries which is a power of two. The** "state" table (which follows) contains information about the starting** point and size of each hash table.*/struct yyActionEntry { YYCODETYPE lookahead; /* The value of the look-ahead token */ YYACTIONTYPE action; /* Action to take for this look-ahead */ struct yyActionEntry *next; /* Next look-ahead with the same hash, or NULL */};static struct yyActionEntry yyActionTable[] = {%%};/* The state table contains information needed to look up the correct** action in the action table, given the current state of the parser.** Information needed includes:**** + A pointer to the start of the action hash table in yyActionTable.**** + A mask used to hash the look-ahead token. The mask is an integer** which is one less than the size of the hash table. **** + The default action. This is the action to take if no entry for** the given look-ahead is found in the action hash table.*/struct yyStateEntry { struct yyActionEntry *hashtbl; /* Start of the hash table in yyActionTable */ int mask; /* Mask used for hashing the look-ahead */ YYACTIONTYPE actionDefault; /* Default action if look-ahead not found */};static struct yyStateEntry yyStateTable[] = {%%};/* The following structure represents a single element of the** parser's stack. Information stored includes:**** + The state number for the parser at this level of the stack.**** + The value of the token stored at this level of the stack.** (In other words, the "major" token.)**** + The semantic value stored at this level of the stack. This is** the information used by the action routines in the grammar.** It is sometimes called the "minor" token.*/struct yyStackEntry { int stateno; /* The state-number */ int major; /* The major token value. This is the code ** number for the token at this stack level */ YYMINORTYPE minor; /* The user-supplied minor token value. This ** is the value of the token */};/* The state of the parser is completely contained in an instance of** the following structure */struct yyParser { int idx; /* Index of top element in stack */ int errcnt; /* Shifts left before out of the error */ struct yyStackEntry *top; /* Pointer to the top stack element */ struct yyStackEntry stack[YYSTACKDEPTH]; /* The parser's stack */};typedef struct yyParser yyParser;#ifndef NDEBUG#include <stdio.h>static FILE *yyTraceFILE = 0;static char *yyTracePrompt = 0;/* ** Turn parser tracing on by giving a stream to which to write the trace** and a prompt to preface each trace message. Tracing is turned off** by making either argument NULL **** Inputs:** <ul>** <li> A FILE* to which trace output should be written.** If NULL, then tracing is turned off.** <li> A prefix string written at the beginning of every** line of trace output. If NULL, then tracing is** turned off.** </ul>**** Outputs:** None.*/void ParseTrace(FILE *TraceFILE, char *zTracePrompt){ yyTraceFILE = TraceFILE; yyTracePrompt = zTracePrompt; if( yyTraceFILE==0 ) yyTracePrompt = 0; else if( yyTracePrompt==0 ) yyTraceFILE = 0;}/* For tracing shifts, the names of all terminals and nonterminals** are required. The following table supplies these names */static char *yyTokenName[] = { %%};#define YYTRACE(X) if( yyTraceFILE ) fprintf(yyTraceFILE,"%sReduce [%s].\n",yyTracePrompt,X);#else#define YYTRACE(X)#endif/* ** This function allocates a new parser.** The only argument is a pointer to a function which works like** malloc.**** Inputs:** A pointer to the function used to allocate memory.**** Outputs:** A pointer to a parser. This pointer is used in subsequent calls** to Parse and ParseFree.*/void *ParseAlloc(void *(*mallocProc)(gulong)){ yyParser *pParser; pParser = (yyParser*)(*mallocProc)( sizeof(yyParser) ); if( pParser ){ pParser->idx = -1; } return pParser;}/* The following function deletes the value associated with a** symbol. The symbol can be either a terminal or nonterminal.** "yymajor" is the symbol code, and "yypminor" is a pointer to** the value.*/static void yy_destructor(YYCODETYPE yymajor, YYMINORTYPE *yypminor){ switch( yymajor ){ /* Here is inserted the actions which take place when a ** terminal or non-terminal is destroyed. This can happen ** when the symbol is popped from the stack during a ** reduce or during error processing or when a parser is ** being destroyed before it is finished parsing. ** ** Note: during a reduce, the only symbols destroyed are those ** which appear on the RHS of the rule, but which are not used ** inside the C code. */%% default: break; /* If no destructor action specified: do nothing */ }}/*** Pop the parser's stack once.**** If there is a destructor routine associated with the token which** is popped from the stack, then call it.**** Return the major token number for the symbol popped.*/static int yy_pop_parser_stack(yyParser *pParser){ YYCODETYPE yymajor; if( pParser->idx<0 ) return 0;#ifndef NDEBUG if( yyTraceFILE && pParser->idx>=0 ){ fprintf(yyTraceFILE,"%sPopping %s\n", yyTracePrompt, yyTokenName[pParser->top->major]); }#endif yymajor = pParser->top->major; yy_destructor( yymajor, &pParser->top->minor); pParser->idx--; pParser->top--; return yymajor;}/* ** Deallocate and destroy a parser. Destructors are all called for** all stack elements before shutting the parser down.**** Inputs:** <ul>** <li> A pointer to the parser. This should be a pointer** obtained from ParseAlloc.** <li> A pointer to a function used to reclaim memory obtained** from malloc.** </ul>*/void ParseFree( void *p, /* The parser to be deleted */ void (*freeProc)(void *) /* Function used to reclaim memory */){ yyParser *pParser = (yyParser*)p; if( pParser==0 ) return; while( pParser->idx>=0 ) yy_pop_parser_stack(pParser); (*freeProc)(pParser);}/*** Find the appropriate action for a parser given the look-ahead token.**** If the look-ahead token is YYNOCODE, then check to see if the action is** independent of the look-ahead. If it is, return the action, otherwise** return YY_NO_ACTION.*/static int yy_find_parser_action( yyParser *pParser, /* The parser */ int iLookAhead /* The look-ahead token */){ struct yyStateEntry *pState; /* Appropriate entry in the state table */ struct yyActionEntry *pAction; /* Action appropriate for the look-ahead */ /* if( pParser->idx<0 ) return YY_NO_ACTION; */ pState = &yyStateTable[pParser->top->stateno]; if( iLookAhead!=YYNOCODE ){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -