⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lempar.c

📁 ethereal公司开发的aodv路由协议代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 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 + -