/ Hex Artifact Content
Login

Artifact ae5f61e3b164d35955777b20d6febcbaf0950702:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
0010: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 6f 75  contains all sou
0020: 72 63 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  rces (including 
0030: 68 65 61 64 65 72 73 29 20 74 6f 20 74 68 65 20  headers) to the 
0040: 4c 45 4d 4f 4e 0a 2a 2a 20 4c 41 4c 52 28 31 29  LEMON.** LALR(1)
0050: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0060: 72 2e 20 20 54 68 65 20 73 6f 75 72 63 65 73 20  r.  The sources 
0070: 68 61 76 65 20 62 65 65 6e 20 63 6f 6d 62 69 6e  have been combin
0080: 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ed into a.** sin
0090: 67 6c 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b 65  gle file to make
00a0: 20 69 74 20 65 61 73 79 20 74 6f 20 69 6e 63 6c   it easy to incl
00b0: 75 64 65 20 4c 45 4d 4f 4e 20 69 6e 20 74 68 65  ude LEMON in the
00c0: 20 73 6f 75 72 63 65 20 74 72 65 65 0a 2a 2a 20   source tree.** 
00d0: 61 6e 64 20 4d 61 6b 65 66 69 6c 65 20 6f 66 20  and Makefile of 
00e0: 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 2e  another program.
00f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0100: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61  r of this progra
0110: 6d 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  m disclaims copy
0120: 72 69 67 68 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  right..*/.#inclu
0130: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
0140: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0150: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0160: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  g.h>.#include <c
0170: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
0180: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0190: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
01a0: 0a 23 69 66 6e 64 65 66 20 5f 5f 57 49 4e 33 32  .#ifndef __WIN32
01b0: 5f 5f 0a 23 20 20 20 69 66 20 64 65 66 69 6e 65  __.#   if define
01c0: 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
01d0: 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 20 20  ined(WIN32).#   
01e0: 20 20 20 20 64 65 66 69 6e 65 20 5f 5f 57 49 4e      define __WIN
01f0: 33 32 5f 5f 0a 23 20 20 20 65 6e 64 69 66 0a 23  32__.#   endif.#
0200: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 5f 5f  endif..#ifdef __
0210: 57 49 4e 33 32 5f 5f 0a 23 69 66 64 65 66 20 5f  WIN32__.#ifdef _
0220: 5f 63 70 6c 75 73 70 6c 75 73 0a 65 78 74 65 72  _cplusplus.exter
0230: 6e 20 22 43 22 20 7b 0a 23 65 6e 64 69 66 0a 65  n "C" {.#endif.e
0240: 78 74 65 72 6e 20 69 6e 74 20 61 63 63 65 73 73  xtern int access
0250: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74  (const char *pat
0260: 68 2c 20 69 6e 74 20 6d 6f 64 65 29 3b 0a 23 69  h, int mode);.#i
0270: 66 64 65 66 20 5f 5f 63 70 6c 75 73 70 6c 75 73  fdef __cplusplus
0280: 0a 7d 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a  .}.#endif.#else.
0290: 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64  #include <unistd
02a0: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 23  .h>.#endif../* #
02b0: 64 65 66 69 6e 65 20 50 52 49 56 41 54 45 20 73  define PRIVATE s
02c0: 74 61 74 69 63 20 2a 2f 0a 23 64 65 66 69 6e 65  tatic */.#define
02d0: 20 50 52 49 56 41 54 45 0a 0a 23 69 66 64 65 66   PRIVATE..#ifdef
02e0: 20 54 45 53 54 0a 23 64 65 66 69 6e 65 20 4d 41   TEST.#define MA
02f0: 58 52 48 53 20 35 20 20 20 20 20 20 20 2f 2a 20  XRHS 5       /* 
0300: 53 65 74 20 6c 6f 77 20 74 6f 20 65 78 65 72 63  Set low to exerc
0310: 69 73 65 20 65 78 63 65 70 74 69 6f 6e 20 63 6f  ise exception co
0320: 64 65 20 2a 2f 0a 23 65 6c 73 65 0a 23 64 65 66  de */.#else.#def
0330: 69 6e 65 20 4d 41 58 52 48 53 20 31 30 30 30 0a  ine MAXRHS 1000.
0340: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69  #endif..static i
0350: 6e 74 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63  nt showPrecedenc
0360: 65 43 6f 6e 66 6c 69 63 74 20 3d 20 30 3b 0a 73  eConflict = 0;.s
0370: 74 61 74 69 63 20 63 68 61 72 20 2a 6d 73 6f 72  tatic char *msor
0380: 74 28 63 68 61 72 2a 2c 63 68 61 72 2a 2a 2c 69  t(char*,char**,i
0390: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
03a0: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b  *,const char*));
03b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 72  ../*.** Compiler
03c0: 73 20 61 72 65 20 67 65 74 74 69 6e 67 20 69 6e  s are getting in
03d0: 63 72 65 61 73 69 6e 67 6c 79 20 70 65 64 61 6e  creasingly pedan
03e0: 74 69 63 20 61 62 6f 75 74 20 74 79 70 65 20 63  tic about type c
03f0: 6f 6e 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 61 73  onversions.** as
0400: 20 43 20 65 76 6f 6c 76 65 73 20 65 76 65 72 20   C evolves ever 
0410: 63 6c 6f 73 65 72 20 74 6f 20 41 64 61 2e 2e 2e  closer to Ada...
0420: 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
0430: 64 20 74 68 65 20 6c 61 74 65 73 74 20 70 72 6f  d the latest pro
0440: 62 6c 65 6d 73 0a 2a 2a 20 77 65 20 68 61 76 65  blems.** we have
0450: 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 66   to define the f
0460: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 6e 74  ollowing variant
0470: 20 6f 66 20 73 74 72 6c 65 6e 28 29 2e 0a 2a 2f   of strlen()..*/
0480: 0a 23 64 65 66 69 6e 65 20 6c 65 6d 6f 6e 53 74  .#define lemonSt
0490: 72 6c 65 6e 28 58 29 20 20 20 28 28 69 6e 74 29  rlen(X)   ((int)
04a0: 73 74 72 6c 65 6e 28 58 29 29 0a 0a 2f 2a 0a 2a  strlen(X))../*.*
04b0: 2a 20 43 6f 6d 70 69 6c 65 72 73 20 61 72 65 20  * Compilers are 
04c0: 73 74 61 72 74 69 6e 67 20 74 6f 20 63 6f 6d 70  starting to comp
04d0: 6c 61 69 6e 20 61 62 6f 75 74 20 74 68 65 20 75  lain about the u
04e0: 73 65 20 6f 66 20 73 70 72 69 6e 74 66 28 29 20  se of sprintf() 
04f0: 61 6e 64 20 73 74 72 63 70 79 28 29 2c 0a 2a 2a  and strcpy(),.**
0500: 20 73 61 79 69 6e 67 20 74 68 65 79 20 61 72 65   saying they are
0510: 20 75 6e 73 61 66 65 2e 20 20 53 6f 20 77 65 20   unsafe.  So we 
0520: 64 65 66 69 6e 65 20 6f 75 72 20 6f 77 6e 20 76  define our own v
0530: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 6f 73 65  ersions of those
0540: 20 72 6f 75 74 69 6e 65 73 20 74 6f 6f 2e 0a 2a   routines too..*
0550: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74  *.** There are t
0560: 68 72 65 65 20 72 6f 75 74 69 6e 65 73 20 68 65  hree routines he
0570: 72 65 3a 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e  re:  lemon_sprin
0580: 74 66 28 29 2c 20 6c 65 6d 6f 6e 5f 76 73 70 72  tf(), lemon_vspr
0590: 69 6e 74 66 28 29 2c 20 61 6e 64 0a 2a 2a 20 6c  intf(), and.** l
05a0: 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 29 2e 20  emon_addtext(). 
05b0: 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 61   The first two a
05c0: 72 65 20 72 65 70 6c 61 63 65 6d 65 6e 74 73 20  re replacements 
05d0: 66 6f 72 20 73 70 72 69 6e 74 66 28 29 20 61 6e  for sprintf() an
05e0: 64 20 76 73 70 72 69 6e 74 66 28 29 2e 0a 2a 2a  d vsprintf()..**
05f0: 20 54 68 65 20 74 68 69 72 64 20 69 73 20 61 20   The third is a 
0600: 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 66  helper routine f
0610: 6f 72 20 76 73 6e 70 72 69 6e 74 66 28 29 20 74  or vsnprintf() t
0620: 68 61 74 20 61 64 64 73 20 74 65 78 74 73 20 74  hat adds texts t
0630: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 0a 2a  o the end of a.*
0640: 2a 20 62 75 66 66 65 72 2c 20 6d 61 6b 69 6e 67  * buffer, making
0650: 20 73 75 72 65 20 74 68 65 20 62 75 66 66 65 72   sure the buffer
0660: 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 2d   is always zero-
0670: 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2a 0a 2a  terminated..**.*
0680: 2a 20 54 68 65 20 73 74 72 69 6e 67 20 66 6f 72  * The string for
0690: 6d 61 74 74 65 72 20 69 73 20 61 20 6d 69 6e 69  matter is a mini
06a0: 6d 61 6c 20 73 75 62 73 65 74 20 6f 66 20 73 74  mal subset of st
06b0: 64 6c 69 62 20 73 70 72 69 6e 74 66 28 29 20 73  dlib sprintf() s
06c0: 75 70 70 6f 72 74 69 6e 67 20 6f 6e 6c 79 0a 2a  upporting only.*
06d0: 2a 20 61 20 66 65 77 20 73 69 6d 70 6c 79 20 63  * a few simply c
06e0: 6f 6e 76 65 72 73 69 6f 6e 73 3a 0a 2a 2a 0a 2a  onversions:.**.*
06f0: 2a 20 20 20 25 64 0a 2a 2a 20 20 20 25 73 0a 2a  *   %d.**   %s.*
0700: 2a 20 20 20 25 2e 2a 73 0a 2a 2a 0a 2a 2f 0a 73  *   %.*s.**.*/.s
0710: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 6d 6f 6e  tatic void lemon
0720: 5f 61 64 64 74 65 78 74 28 0a 20 20 63 68 61 72  _addtext(.  char
0730: 20 2a 7a 42 75 66 2c 20 20 20 20 20 20 20 20 20   *zBuf,         
0740: 20 20 2f 2a 20 54 68 65 20 62 75 66 66 65 72 20    /* The buffer 
0750: 74 6f 20 77 68 69 63 68 20 74 65 78 74 20 69 73  to which text is
0760: 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   added */.  int 
0770: 2a 70 6e 55 73 65 64 2c 20 20 20 20 20 20 20 20  *pnUsed,        
0780: 20 20 2f 2a 20 53 6c 6f 74 73 20 6f 66 20 74 68    /* Slots of th
0790: 65 20 62 75 66 66 65 72 20 75 73 65 64 20 73 6f  e buffer used so
07a0: 20 66 61 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   far */.  const 
07b0: 63 68 61 72 20 2a 7a 49 6e 2c 20 20 20 20 20 20  char *zIn,      
07c0: 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 2a  /* Text to add *
07d0: 2f 0a 20 20 69 6e 74 20 6e 49 6e 2c 20 20 20 20  /.  int nIn,    
07e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
07f0: 65 73 20 6f 66 20 74 65 78 74 20 74 6f 20 61 64  es of text to ad
0800: 64 2e 20 20 2d 31 20 74 6f 20 75 73 65 20 73 74  d.  -1 to use st
0810: 72 6c 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  rlen() */.  int 
0820: 69 57 69 64 74 68 20 20 20 20 20 20 20 20 20 20  iWidth          
0830: 20 20 2f 2a 20 46 69 65 6c 64 20 77 69 64 74 68    /* Field width
0840: 2e 20 20 4e 65 67 61 74 69 76 65 20 74 6f 20 6c  .  Negative to l
0850: 65 66 74 20 6a 75 73 74 69 66 79 20 2a 2f 0a 29  eft justify */.)
0860: 7b 0a 20 20 69 66 28 20 6e 49 6e 3c 30 20 29 20  {.  if( nIn<0 ) 
0870: 66 6f 72 28 6e 49 6e 3d 30 3b 20 7a 49 6e 5b 6e  for(nIn=0; zIn[n
0880: 49 6e 5d 3b 20 6e 49 6e 2b 2b 29 7b 7d 0a 20 20  In]; nIn++){}.  
0890: 77 68 69 6c 65 28 20 69 57 69 64 74 68 3e 6e 49  while( iWidth>nI
08a0: 6e 20 29 7b 20 7a 42 75 66 5b 28 2a 70 6e 55 73  n ){ zBuf[(*pnUs
08b0: 65 64 29 2b 2b 5d 20 3d 20 27 20 27 3b 20 69 57  ed)++] = ' '; iW
08c0: 69 64 74 68 2d 2d 3b 20 7d 0a 20 20 69 66 28 20  idth--; }.  if( 
08d0: 6e 49 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  nIn==0 ) return;
08e0: 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b  .  memcpy(&zBuf[
08f0: 2a 70 6e 55 73 65 64 5d 2c 20 7a 49 6e 2c 20 6e  *pnUsed], zIn, n
0900: 49 6e 29 3b 0a 20 20 2a 70 6e 55 73 65 64 20 2b  In);.  *pnUsed +
0910: 3d 20 6e 49 6e 3b 0a 20 20 77 68 69 6c 65 28 20  = nIn;.  while( 
0920: 28 2d 69 57 69 64 74 68 29 3e 6e 49 6e 20 29 7b  (-iWidth)>nIn ){
0930: 20 7a 42 75 66 5b 28 2a 70 6e 55 73 65 64 29 2b   zBuf[(*pnUsed)+
0940: 2b 5d 20 3d 20 27 20 27 3b 20 69 57 69 64 74 68  +] = ' '; iWidth
0950: 2b 2b 3b 20 7d 0a 20 20 7a 42 75 66 5b 2a 70 6e  ++; }.  zBuf[*pn
0960: 55 73 65 64 5d 20 3d 20 30 3b 0a 7d 0a 73 74 61  Used] = 0;.}.sta
0970: 74 69 63 20 69 6e 74 20 6c 65 6d 6f 6e 5f 76 73  tic int lemon_vs
0980: 70 72 69 6e 74 66 28 63 68 61 72 20 2a 73 74 72  printf(char *str
0990: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
09a0: 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61  ormat, va_list a
09b0: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  p){.  int i, j, 
09c0: 6b 2c 20 63 3b 0a 20 20 69 6e 74 20 6e 55 73 65  k, c;.  int nUse
09d0: 64 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63  d = 0;.  const c
09e0: 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 7a  har *z;.  char z
09f0: 54 65 6d 70 5b 35 30 5d 3b 0a 20 20 73 74 72 5b  Temp[50];.  str[
0a00: 30 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  0] = 0;.  for(i=
0a10: 6a 3d 30 3b 20 28 63 20 3d 20 7a 46 6f 72 6d 61  j=0; (c = zForma
0a20: 74 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  t[i])!=0; i++){.
0a30: 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 29      if( c=='%' )
0a40: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 57 69 64  {.      int iWid
0a50: 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c 65  th = 0;.      le
0a60: 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c  mon_addtext(str,
0a70: 20 26 6e 55 73 65 64 2c 20 26 7a 46 6f 72 6d 61   &nUsed, &zForma
0a80: 74 5b 6a 5d 2c 20 69 2d 6a 2c 20 30 29 3b 0a 20  t[j], i-j, 0);. 
0a90: 20 20 20 20 20 63 20 3d 20 7a 46 6f 72 6d 61 74       c = zFormat
0aa0: 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  [++i];.      if(
0ab0: 20 69 73 64 69 67 69 74 28 63 29 20 7c 7c 20 28   isdigit(c) || (
0ac0: 63 3d 3d 27 2d 27 20 26 26 20 69 73 64 69 67 69  c=='-' && isdigi
0ad0: 74 28 7a 46 6f 72 6d 61 74 5b 69 2b 31 5d 29 29  t(zFormat[i+1]))
0ae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
0af0: 63 3d 3d 27 2d 27 20 29 20 69 2b 2b 3b 0a 20 20  c=='-' ) i++;.  
0b00: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64        while( isd
0b10: 69 67 69 74 28 7a 46 6f 72 6d 61 74 5b 69 5d 29  igit(zFormat[i])
0b20: 20 29 20 69 57 69 64 74 68 20 3d 20 69 57 69 64   ) iWidth = iWid
0b30: 74 68 2a 31 30 20 2b 20 7a 46 6f 72 6d 61 74 5b  th*10 + zFormat[
0b40: 69 2b 2b 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20  i++] - '0';.    
0b50: 20 20 20 20 69 66 28 20 63 3d 3d 27 2d 27 20 29      if( c=='-' )
0b60: 20 69 57 69 64 74 68 20 3d 20 2d 69 57 69 64 74   iWidth = -iWidt
0b70: 68 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  h;.        c = z
0b80: 46 6f 72 6d 61 74 5b 69 5d 3b 0a 20 20 20 20 20  Format[i];.     
0b90: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
0ba0: 27 64 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  'd' ){.        i
0bb0: 6e 74 20 76 20 3d 20 76 61 5f 61 72 67 28 61 70  nt v = va_arg(ap
0bc0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  , int);.        
0bd0: 69 66 28 20 76 3c 30 20 29 7b 0a 20 20 20 20 20  if( v<0 ){.     
0be0: 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65       lemon_addte
0bf0: 78 74 28 73 74 72 2c 20 26 6e 55 73 65 64 2c 20  xt(str, &nUsed, 
0c00: 22 2d 22 2c 20 31 2c 20 69 57 69 64 74 68 29 3b  "-", 1, iWidth);
0c10: 0a 20 20 20 20 20 20 20 20 20 20 76 20 3d 20 2d  .          v = -
0c20: 76 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  v;.        }else
0c30: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
0c40: 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64 64         lemon_add
0c50: 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65 64  text(str, &nUsed
0c60: 2c 20 22 30 22 2c 20 31 2c 20 69 57 69 64 74 68  , "0", 1, iWidth
0c70: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
0c80: 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20       k = 0;.    
0c90: 20 20 20 20 77 68 69 6c 65 28 20 76 3e 30 20 29      while( v>0 )
0ca0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 2b 2b 3b  {.          k++;
0cb0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70  .          zTemp
0cc0: 5b 73 69 7a 65 6f 66 28 7a 54 65 6d 70 29 2d 6b  [sizeof(zTemp)-k
0cd0: 5d 20 3d 20 28 76 25 31 30 29 20 2b 20 27 30 27  ] = (v%10) + '0'
0ce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 76 20 2f 3d  ;.          v /=
0cf0: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   10;.        }. 
0d00: 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64 64         lemon_add
0d10: 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65 64  text(str, &nUsed
0d20: 2c 20 26 7a 54 65 6d 70 5b 73 69 7a 65 6f 66 28  , &zTemp[sizeof(
0d30: 7a 54 65 6d 70 29 2d 6b 5d 2c 20 6b 2c 20 69 57  zTemp)-k], k, iW
0d40: 69 64 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c  idth);.      }el
0d50: 73 65 20 69 66 28 20 63 3d 3d 27 73 27 20 29 7b  se if( c=='s' ){
0d60: 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 76 61 5f  .        z = va_
0d70: 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68  arg(ap, const ch
0d80: 61 72 2a 29 3b 0a 20 20 20 20 20 20 20 20 6c 65  ar*);.        le
0d90: 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c  mon_addtext(str,
0da0: 20 26 6e 55 73 65 64 2c 20 7a 2c 20 2d 31 2c 20   &nUsed, z, -1, 
0db0: 69 57 69 64 74 68 29 3b 0a 20 20 20 20 20 20 7d  iWidth);.      }
0dc0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2e 27 20  else if( c=='.' 
0dd0: 26 26 20 6d 65 6d 63 6d 70 28 26 7a 46 6f 72 6d  && memcmp(&zForm
0de0: 61 74 5b 69 5d 2c 20 22 2e 2a 73 22 2c 20 33 29  at[i], ".*s", 3)
0df0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
0e00: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 6b   += 2;.        k
0e10: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
0e20: 74 29 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20  t);.        z = 
0e30: 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74  va_arg(ap, const
0e40: 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 20   char*);.       
0e50: 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73   lemon_addtext(s
0e60: 74 72 2c 20 26 6e 55 73 65 64 2c 20 7a 2c 20 6b  tr, &nUsed, z, k
0e70: 2c 20 69 57 69 64 74 68 29 3b 0a 20 20 20 20 20  , iWidth);.     
0e80: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 25   }else if( c=='%
0e90: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6d  ' ){.        lem
0ea0: 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20  on_addtext(str, 
0eb0: 26 6e 55 73 65 64 2c 20 22 25 22 2c 20 31 2c 20  &nUsed, "%", 1, 
0ec0: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
0ed0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
0ee0: 28 73 74 64 65 72 72 2c 20 22 69 6c 6c 65 67 61  (stderr, "illega
0ef0: 6c 20 66 6f 72 6d 61 74 5c 6e 22 29 3b 0a 20 20  l format\n");.  
0f00: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
0f10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d       }.      j =
0f20: 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   i+1;.    }.  }.
0f30: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0f40: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 26 7a 46  str, &nUsed, &zF
0f50: 6f 72 6d 61 74 5b 6a 5d 2c 20 69 2d 6a 2c 20 30  ormat[j], i-j, 0
0f60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 55 73 65  );.  return nUse
0f70: 64 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  d;.}.static int 
0f80: 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 63 68  lemon_sprintf(ch
0f90: 61 72 20 2a 73 74 72 2c 20 63 6f 6e 73 74 20 63  ar *str, const c
0fa0: 68 61 72 20 2a 66 6f 72 6d 61 74 2c 20 2e 2e 2e  har *format, ...
0fb0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
0fc0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f  .  int rc;.  va_
0fd0: 73 74 61 72 74 28 61 70 2c 20 66 6f 72 6d 61 74  start(ap, format
0fe0: 29 3b 0a 20 20 72 63 20 3d 20 6c 65 6d 6f 6e 5f  );.  rc = lemon_
0ff0: 76 73 70 72 69 6e 74 66 28 73 74 72 2c 20 66 6f  vsprintf(str, fo
1000: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
1010: 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72  end(ap);.  retur
1020: 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76  n rc;.}.static v
1030: 6f 69 64 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79  oid lemon_strcpy
1040: 28 63 68 61 72 20 2a 64 65 73 74 2c 20 63 6f 6e  (char *dest, con
1050: 73 74 20 63 68 61 72 20 2a 73 72 63 29 7b 0a 20  st char *src){. 
1060: 20 77 68 69 6c 65 28 20 28 2a 28 64 65 73 74 2b   while( (*(dest+
1070: 2b 29 20 3d 20 2a 28 73 72 63 2b 2b 29 29 21 3d  +) = *(src++))!=
1080: 30 20 29 7b 7d 0a 7d 0a 73 74 61 74 69 63 20 76  0 ){}.}.static v
1090: 6f 69 64 20 6c 65 6d 6f 6e 5f 73 74 72 63 61 74  oid lemon_strcat
10a0: 28 63 68 61 72 20 2a 64 65 73 74 2c 20 63 6f 6e  (char *dest, con
10b0: 73 74 20 63 68 61 72 20 2a 73 72 63 29 7b 0a 20  st char *src){. 
10c0: 20 77 68 69 6c 65 28 20 2a 64 65 73 74 20 29 20   while( *dest ) 
10d0: 64 65 73 74 2b 2b 3b 0a 20 20 6c 65 6d 6f 6e 5f  dest++;.  lemon_
10e0: 73 74 72 63 70 79 28 64 65 73 74 2c 20 73 72 63  strcpy(dest, src
10f0: 29 3b 0a 7d 0a 0a 0a 2f 2a 20 61 20 66 65 77 20  );.}.../* a few 
1100: 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  forward declarat
1110: 69 6f 6e 73 2e 2e 2e 20 2a 2f 0a 73 74 72 75 63  ions... */.struc
1120: 74 20 72 75 6c 65 3b 0a 73 74 72 75 63 74 20 6c  t rule;.struct l
1130: 65 6d 6f 6e 3b 0a 73 74 72 75 63 74 20 61 63 74  emon;.struct act
1140: 69 6f 6e 3b 0a 0a 73 74 61 74 69 63 20 73 74 72  ion;..static str
1150: 75 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74 69  uct action *Acti
1160: 6f 6e 5f 6e 65 77 28 76 6f 69 64 29 3b 0a 73 74  on_new(void);.st
1170: 61 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69  atic struct acti
1180: 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28  on *Action_sort(
1190: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29  struct action *)
11a0: 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ;../********** F
11b0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 62 75  rom the file "bu
11c0: 69 6c 64 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ild.h" *********
11d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69  ***********/.voi
11f0: 64 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64  d FindRulePreced
1200: 65 6e 63 65 73 28 29 3b 0a 76 6f 69 64 20 46 69  ences();.void Fi
1210: 6e 64 46 69 72 73 74 53 65 74 73 28 29 3b 0a 76  ndFirstSets();.v
1220: 6f 69 64 20 46 69 6e 64 53 74 61 74 65 73 28 29  oid FindStates()
1230: 3b 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73  ;.void FindLinks
1240: 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c  ();.void FindFol
1250: 6c 6f 77 53 65 74 73 28 29 3b 0a 76 6f 69 64 20  lowSets();.void 
1260: 46 69 6e 64 41 63 74 69 6f 6e 73 28 29 3b 0a 0a  FindActions();..
1270: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  /********* From 
1280: 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66 69 67  the file "config
1290: 6c 69 73 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  list.h" ********
12a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20  *********/.void 
12c0: 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28  Configlist_init(
12d0: 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20 63 6f  void);.struct co
12e0: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
12f0: 5f 61 64 64 28 73 74 72 75 63 74 20 72 75 6c 65  _add(struct rule
1300: 20 2a 2c 20 69 6e 74 29 3b 0a 73 74 72 75 63 74   *, int);.struct
1310: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
1320: 69 73 74 5f 61 64 64 62 61 73 69 73 28 73 74 72  ist_addbasis(str
1330: 75 63 74 20 72 75 6c 65 20 2a 2c 20 69 6e 74 29  uct rule *, int)
1340: 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  ;.void Configlis
1350: 74 5f 63 6c 6f 73 75 72 65 28 73 74 72 75 63 74  t_closure(struct
1360: 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20   lemon *);.void 
1370: 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28  Configlist_sort(
1380: 76 6f 69 64 29 3b 0a 76 6f 69 64 20 43 6f 6e 66  void);.void Conf
1390: 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73  iglist_sortbasis
13a0: 28 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20 63  (void);.struct c
13b0: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73  onfig *Configlis
13c0: 74 5f 72 65 74 75 72 6e 28 76 6f 69 64 29 3b 0a  t_return(void);.
13d0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
13e0: 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28  onfiglist_basis(
13f0: 76 6f 69 64 29 3b 0a 76 6f 69 64 20 43 6f 6e 66  void);.void Conf
1400: 69 67 6c 69 73 74 5f 65 61 74 28 73 74 72 75 63  iglist_eat(struc
1410: 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69  t config *);.voi
1420: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73  d Configlist_res
1430: 65 74 28 76 6f 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a  et(void);../****
1440: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
1450: 69 6c 65 20 22 65 72 72 6f 72 2e 68 22 20 2a 2a  ile "error.h" **
1460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1480: 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 45 72 72 6f  *****/.void Erro
1490: 72 4d 73 67 28 63 6f 6e 73 74 20 63 68 61 72 20  rMsg(const char 
14a0: 2a 2c 20 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  *, int,const cha
14b0: 72 20 2a 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a  r *, ...);../***
14c0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
14d0: 65 20 22 6f 70 74 69 6f 6e 2e 68 22 20 2a 2a 2a  e "option.h" ***
14e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1500: 2a 2a 2a 2a 2a 2a 2a 2f 0a 65 6e 75 6d 20 6f 70  *******/.enum op
1510: 74 69 6f 6e 5f 74 79 70 65 20 7b 20 4f 50 54 5f  tion_type { OPT_
1520: 46 4c 41 47 3d 31 2c 20 20 4f 50 54 5f 49 4e 54  FLAG=1,  OPT_INT
1530: 2c 20 20 4f 50 54 5f 44 42 4c 2c 20 20 4f 50 54  ,  OPT_DBL,  OPT
1540: 5f 53 54 52 2c 0a 20 20 20 20 20 20 20 20 20 4f  _STR,.         O
1550: 50 54 5f 46 46 4c 41 47 2c 20 4f 50 54 5f 46 49  PT_FFLAG, OPT_FI
1560: 4e 54 2c 20 4f 50 54 5f 46 44 42 4c 2c 20 4f 50  NT, OPT_FDBL, OP
1570: 54 5f 46 53 54 52 7d 3b 0a 73 74 72 75 63 74 20  T_FSTR};.struct 
1580: 73 5f 6f 70 74 69 6f 6e 73 20 7b 0a 20 20 65 6e  s_options {.  en
1590: 75 6d 20 6f 70 74 69 6f 6e 5f 74 79 70 65 20 74  um option_type t
15a0: 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ype;.  const cha
15b0: 72 20 2a 6c 61 62 65 6c 3b 0a 20 20 63 68 61 72  r *label;.  char
15c0: 20 2a 61 72 67 3b 0a 20 20 63 6f 6e 73 74 20 63   *arg;.  const c
15d0: 68 61 72 20 2a 6d 65 73 73 61 67 65 3b 0a 7d 3b  har *message;.};
15e0: 0a 69 6e 74 20 20 20 20 4f 70 74 49 6e 69 74 28  .int    OptInit(
15f0: 63 68 61 72 2a 2a 2c 73 74 72 75 63 74 20 73 5f  char**,struct s_
1600: 6f 70 74 69 6f 6e 73 2a 2c 46 49 4c 45 2a 29 3b  options*,FILE*);
1610: 0a 69 6e 74 20 20 20 20 4f 70 74 4e 41 72 67 73  .int    OptNArgs
1620: 28 76 6f 69 64 29 3b 0a 63 68 61 72 20 20 2a 4f  (void);.char  *O
1630: 70 74 41 72 67 28 69 6e 74 29 3b 0a 76 6f 69 64  ptArg(int);.void
1640: 20 20 20 4f 70 74 45 72 72 28 69 6e 74 29 3b 0a     OptErr(int);.
1650: 76 6f 69 64 20 20 20 4f 70 74 50 72 69 6e 74 28  void   OptPrint(
1660: 76 6f 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  void);../*******
1670: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
1680: 22 70 61 72 73 65 2e 68 22 20 2a 2a 2a 2a 2a 2a  "parse.h" ******
1690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16b0: 2a 2a 2a 2f 0a 76 6f 69 64 20 50 61 72 73 65 28  ***/.void Parse(
16c0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
16d0: 6d 70 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  mp);../*********
16e0: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
16f0: 70 6c 69 6e 6b 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  plink.h" *******
1700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1720: 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  /.struct plink *
1730: 50 6c 69 6e 6b 5f 6e 65 77 28 76 6f 69 64 29 3b  Plink_new(void);
1740: 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28  .void Plink_add(
1750: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c  struct plink **,
1760: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
1770: 29 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f  );.void Plink_co
1780: 70 79 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  py(struct plink 
1790: 2a 2a 2c 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  **, struct plink
17a0: 20 2a 29 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f   *);.void Plink_
17b0: 64 65 6c 65 74 65 28 73 74 72 75 63 74 20 70 6c  delete(struct pl
17c0: 69 6e 6b 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  ink *);../******
17d0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
17e0: 6c 65 20 22 72 65 70 6f 72 74 2e 68 22 20 2a 2a  le "report.h" **
17f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1810: 2a 2a 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e  ***/.void Reprin
1820: 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  t(struct lemon *
1830: 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f 75  );.void ReportOu
1840: 74 70 75 74 28 73 74 72 75 63 74 20 6c 65 6d 6f  tput(struct lemo
1850: 6e 20 2a 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72  n *);.void Repor
1860: 74 54 61 62 6c 65 28 73 74 72 75 63 74 20 6c 65  tTable(struct le
1870: 6d 6f 6e 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69  mon *, int);.voi
1880: 64 20 52 65 70 6f 72 74 48 65 61 64 65 72 28 73  d ReportHeader(s
1890: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a  truct lemon *);.
18a0: 76 6f 69 64 20 43 6f 6d 70 72 65 73 73 54 61 62  void CompressTab
18b0: 6c 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  les(struct lemon
18c0: 20 2a 29 3b 0a 76 6f 69 64 20 52 65 73 6f 72 74   *);.void Resort
18d0: 53 74 61 74 65 73 28 73 74 72 75 63 74 20 6c 65  States(struct le
18e0: 6d 6f 6e 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  mon *);../******
18f0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
1900: 6c 65 20 22 73 65 74 2e 68 22 20 2a 2a 2a 2a 2a  le "set.h" *****
1910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1930: 2a 2a 2a 2f 0a 76 6f 69 64 20 20 53 65 74 53 69  ***/.void  SetSi
1940: 7a 65 28 69 6e 74 29 3b 20 20 20 20 20 20 20 20  ze(int);        
1950: 20 20 20 20 20 2f 2a 20 41 6c 6c 20 73 65 74 73       /* All sets
1960: 20 77 69 6c 6c 20 62 65 20 6f 66 20 73 69 7a 65   will be of size
1970: 20 4e 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e   N */.char *SetN
1980: 65 77 28 76 6f 69 64 29 3b 20 20 20 20 20 20 20  ew(void);       
1990: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77          /* A new
19a0: 20 73 65 74 20 66 6f 72 20 65 6c 65 6d 65 6e 74   set for element
19b0: 20 30 2e 2e 4e 20 2a 2f 0a 76 6f 69 64 20 20 53   0..N */.void  S
19c0: 65 74 46 72 65 65 28 63 68 61 72 2a 29 3b 20 20  etFree(char*);  
19d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
19e0: 61 6c 6c 6f 63 61 74 65 20 61 20 73 65 74 20 2a  allocate a set *
19f0: 2f 0a 69 6e 74 20 53 65 74 41 64 64 28 63 68 61  /.int SetAdd(cha
1a00: 72 2a 2c 69 6e 74 29 3b 20 20 20 20 20 20 20 20  r*,int);        
1a10: 20 20 20 20 2f 2a 20 41 64 64 20 65 6c 65 6d 65      /* Add eleme
1a20: 6e 74 20 74 6f 20 61 20 73 65 74 20 2a 2f 0a 69  nt to a set */.i
1a30: 6e 74 20 53 65 74 55 6e 69 6f 6e 28 63 68 61 72  nt SetUnion(char
1a40: 20 2a 2c 63 68 61 72 20 2a 29 3b 20 20 20 20 2f   *,char *);    /
1a50: 2a 20 41 20 3c 2d 20 41 20 55 20 42 2c 20 74 68  * A <- A U B, th
1a60: 72 75 20 65 6c 65 6d 65 6e 74 20 4e 20 2a 2f 0a  ru element N */.
1a70: 23 64 65 66 69 6e 65 20 53 65 74 46 69 6e 64 28  #define SetFind(
1a80: 58 2c 59 29 20 28 58 5b 59 5d 29 20 20 20 20 20  X,Y) (X[Y])     
1a90: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 59 20 69    /* True if Y i
1aa0: 73 20 69 6e 20 73 65 74 20 58 20 2a 2f 0a 0a 2f  s in set X */../
1ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
1ac0: 74 68 65 20 66 69 6c 65 20 22 73 74 72 75 63 74  the file "struct
1ad0: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
1ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
1b00: 20 50 72 69 6e 63 69 70 61 6c 20 64 61 74 61 20   Principal data 
1b10: 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74  structures for t
1b20: 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20  he LEMON parser 
1b30: 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 74  generator..*/..t
1b40: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 4c 45 4d  ypedef enum {LEM
1b50: 4f 4e 5f 46 41 4c 53 45 3d 30 2c 20 4c 45 4d 4f  ON_FALSE=0, LEMO
1b60: 4e 5f 54 52 55 45 7d 20 42 6f 6f 6c 65 61 6e 3b  N_TRUE} Boolean;
1b70: 0a 0a 2f 2a 20 53 79 6d 62 6f 6c 73 20 28 74 65  ../* Symbols (te
1b80: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74  rminals and nont
1b90: 65 72 6d 69 6e 61 6c 73 29 20 6f 66 20 74 68 65  erminals) of the
1ba0: 20 67 72 61 6d 6d 61 72 20 61 72 65 20 73 74 6f   grammar are sto
1bb0: 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f  red.** in the fo
1bc0: 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 65 6e 75 6d  llowing: */.enum
1bd0: 20 73 79 6d 62 6f 6c 5f 74 79 70 65 20 7b 0a 20   symbol_type {. 
1be0: 20 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 4e 4f 4e   TERMINAL,.  NON
1bf0: 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 4d 55 4c 54  TERMINAL,.  MULT
1c00: 49 54 45 52 4d 49 4e 41 4c 0a 7d 3b 0a 65 6e 75  ITERMINAL.};.enu
1c10: 6d 20 65 5f 61 73 73 6f 63 20 7b 0a 20 20 20 20  m e_assoc {.    
1c20: 4c 45 46 54 2c 0a 20 20 20 20 52 49 47 48 54 2c  LEFT,.    RIGHT,
1c30: 0a 20 20 20 20 4e 4f 4e 45 2c 0a 20 20 20 20 55  .    NONE,.    U
1c40: 4e 4b 0a 7d 3b 0a 73 74 72 75 63 74 20 73 79 6d  NK.};.struct sym
1c50: 62 6f 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  bol {.  const ch
1c60: 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20  ar *name;       
1c70: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1c80: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 6e 74 20  symbol */.  int 
1c90: 69 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  index;          
1ca0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75       /* Index nu
1cb0: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 73 79  mber for this sy
1cc0: 6d 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 73  mbol */.  enum s
1cd0: 79 6d 62 6f 6c 5f 74 79 70 65 20 74 79 70 65 3b  ymbol_type type;
1ce0: 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 73 20 61 72     /* Symbols ar
1cf0: 65 20 61 6c 6c 20 65 69 74 68 65 72 20 54 45 52  e all either TER
1d00: 4d 49 4e 41 4c 53 20 6f 72 20 4e 54 73 20 2a 2f  MINALS or NTs */
1d10: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
1d20: 72 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 4c  rule;       /* L
1d30: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 72 75  inked list of ru
1d40: 6c 65 73 20 6f 66 20 74 68 69 73 20 28 69 66 20  les of this (if 
1d50: 61 6e 20 4e 54 29 20 2a 2f 0a 20 20 73 74 72 75  an NT) */.  stru
1d60: 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62  ct symbol *fallb
1d70: 61 63 6b 3b 20 2f 2a 20 66 61 6c 6c 62 61 63 6b  ack; /* fallback
1d80: 20 74 6f 6b 65 6e 20 69 6e 20 63 61 73 65 20 74   token in case t
1d90: 68 69 73 20 74 6f 6b 65 6e 20 64 6f 65 73 6e 27  his token doesn'
1da0: 74 20 70 61 72 73 65 20 2a 2f 0a 20 20 69 6e 74  t parse */.  int
1db0: 20 70 72 65 63 3b 20 20 20 20 20 20 20 20 20 20   prec;          
1dc0: 20 20 20 20 20 20 2f 2a 20 50 72 65 63 65 64 65        /* Precede
1dd0: 6e 63 65 20 69 66 20 64 65 66 69 6e 65 64 20 28  nce if defined (
1de0: 2d 31 20 6f 74 68 65 72 77 69 73 65 29 20 2a 2f  -1 otherwise) */
1df0: 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20  .  enum e_assoc 
1e00: 61 73 73 6f 63 3b 20 20 20 20 20 20 2f 2a 20 41  assoc;      /* A
1e10: 73 73 6f 63 69 61 74 69 76 69 74 79 20 69 66 20  ssociativity if 
1e20: 70 72 65 63 65 64 65 6e 63 65 20 69 73 20 64 65  precedence is de
1e30: 66 69 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  fined */.  char 
1e40: 2a 66 69 72 73 74 73 65 74 3b 20 20 20 20 20 20  *firstset;      
1e50: 20 20 20 20 2f 2a 20 46 69 72 73 74 2d 73 65 74      /* First-set
1e60: 20 66 6f 72 20 61 6c 6c 20 72 75 6c 65 73 20 6f   for all rules o
1e70: 66 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f  f this symbol */
1e80: 0a 20 20 42 6f 6f 6c 65 61 6e 20 6c 61 6d 62 64  .  Boolean lambd
1e90: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  a;          /* T
1ea0: 72 75 65 20 69 66 20 4e 54 20 61 6e 64 20 63 61  rue if NT and ca
1eb0: 6e 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 6d  n generate an em
1ec0: 70 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  pty string */.  
1ed0: 69 6e 74 20 75 73 65 43 6e 74 3b 20 20 20 20 20  int useCnt;     
1ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ef0: 65 72 20 6f 66 20 74 69 6d 65 73 20 75 73 65 64  er of times used
1f00: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65 73 74   */.  char *dest
1f10: 72 75 63 74 6f 72 3b 20 20 20 20 20 20 20 20 2f  ructor;        /
1f20: 2a 20 43 6f 64 65 20 77 68 69 63 68 20 65 78 65  * Code which exe
1f30: 63 75 74 65 73 20 77 68 65 6e 65 76 65 72 20 74  cutes whenever t
1f40: 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 0a 20 20  his symbol is.  
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 70 70           ** popp
1f70: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ed from the stac
1f80: 6b 20 64 75 72 69 6e 67 20 65 72 72 6f 72 20 70  k during error p
1f90: 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69  rocessing */.  i
1fa0: 6e 74 20 64 65 73 74 4c 69 6e 65 6e 6f 3b 20 20  nt destLineno;  
1fb0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
1fc0: 6e 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72 74  number for start
1fd0: 20 6f 66 20 64 65 73 74 72 75 63 74 6f 72 20 2a   of destructor *
1fe0: 2f 0a 20 20 63 68 61 72 20 2a 64 61 74 61 74 79  /.  char *dataty
1ff0: 70 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pe;          /* 
2000: 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6f 66  The data type of
2010: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c   information hel
2020: 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 20 20  d by this.      
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20       ** object. 
2050: 4f 6e 6c 79 20 75 73 65 64 20 69 66 20 74 79 70  Only used if typ
2060: 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a  e==NONTERMINAL *
2070: 2f 0a 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20  /.  int dtnum;  
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2090: 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6e 75  The data type nu
20a0: 6d 62 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61  mber.  In the pa
20b0: 72 73 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a  rser, the value.
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74             ** st
20e0: 61 63 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20  ack is a union. 
20f0: 20 54 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65   The .yy%d eleme
2100: 6e 74 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20  nt of this.     
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20 69        ** union i
2130: 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 64 61  s the correct da
2140: 74 61 20 74 79 70 65 20 66 6f 72 20 74 68 69 73  ta type for this
2150: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 2f 2a 20   object */.  /* 
2160: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
2170: 65 6c 64 73 20 61 72 65 20 75 73 65 64 20 62 79  elds are used by
2180: 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 73 20   MULTITERMINALs 
2190: 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 73  only */.  int ns
21a0: 75 62 73 79 6d 3b 20 20 20 20 20 20 20 20 20 20  ubsym;          
21b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21c0: 63 6f 6e 73 74 69 74 75 65 6e 74 20 73 79 6d 62  constituent symb
21d0: 6f 6c 73 20 69 6e 20 74 68 65 20 4d 55 4c 54 49  ols in the MULTI
21e0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
21f0: 62 6f 6c 20 2a 2a 73 75 62 73 79 6d 3b 20 20 2f  bol **subsym;  /
2200: 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6e 73 74  * Array of const
2210: 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 2a  ituent symbols *
2220: 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70 72  /.};../* Each pr
2230: 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 69 6e  oduction rule in
2240: 20 74 68 65 20 67 72 61 6d 6d 61 72 20 69 73 20   the grammar is 
2250: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 66 6f  stored in the fo
2260: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63  llowing.** struc
2270: 74 75 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63 74  ture.  */.struct
2280: 20 72 75 6c 65 20 7b 0a 20 20 73 74 72 75 63 74   rule {.  struct
2290: 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20   symbol *lhs;   
22a0: 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20     /* Left-hand 
22b0: 73 69 64 65 20 6f 66 20 74 68 65 20 72 75 6c 65  side of the rule
22c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
22d0: 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 2f   *lhsalias;    /
22e0: 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20  * Alias for the 
22f0: 4c 48 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e  LHS (NULL if non
2300: 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 68 73 53  e) */.  int lhsS
2310: 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20  tart;           
2320: 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 65 66 74   /* True if left
2330: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 74 68  -hand side is th
2340: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a  e start symbol *
2350: 2f 0a 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e 65  /.  int ruleline
2360: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2370: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Line number for 
2380: 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e  the rule */.  in
2390: 74 20 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20  t nrhs;         
23a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23b0: 20 6f 66 20 52 48 53 20 73 79 6d 62 6f 6c 73 20   of RHS symbols 
23c0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
23d0: 6f 6c 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f 2a  ol **rhs;     /*
23e0: 20 54 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 73   The RHS symbols
23f0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2400: 20 2a 2a 72 68 73 61 6c 69 61 73 3b 20 20 20 2f   **rhsalias;   /
2410: 2a 20 41 6e 20 61 6c 69 61 73 20 66 6f 72 20 65  * An alias for e
2420: 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28  ach RHS symbol (
2430: 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f  NULL if none) */
2440: 0a 20 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20 20  .  int line;    
2450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2460: 69 6e 65 20 6e 75 6d 62 65 72 20 61 74 20 77 68  ine number at wh
2470: 69 63 68 20 63 6f 64 65 20 62 65 67 69 6e 73 20  ich code begins 
2480: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2490: 2a 63 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a  *code;        /*
24a0: 20 54 68 65 20 63 6f 64 65 20 65 78 65 63 75 74   The code execut
24b0: 65 64 20 77 68 65 6e 20 74 68 69 73 20 72 75 6c  ed when this rul
24c0: 65 20 69 73 20 72 65 64 75 63 65 64 20 2a 2f 0a  e is reduced */.
24d0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
24e0: 2a 70 72 65 63 73 79 6d 3b 20 20 2f 2a 20 50 72  *precsym;  /* Pr
24f0: 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20  ecedence symbol 
2500: 66 6f 72 20 74 68 69 73 20 72 75 6c 65 20 2a 2f  for this rule */
2510: 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20 20 20  .  int index;   
2520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2530: 6e 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 66  n index number f
2540: 6f 72 20 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a  or this rule */.
2550: 20 20 42 6f 6f 6c 65 61 6e 20 63 61 6e 52 65 64    Boolean canRed
2560: 75 63 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  uce;       /* Tr
2570: 75 65 20 69 66 20 74 68 69 73 20 72 75 6c 65 20  ue if this rule 
2580: 69 73 20 65 76 65 72 20 72 65 64 75 63 65 64 20  is ever reduced 
2590: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
25a0: 20 2a 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f 2a   *nextlhs;    /*
25b0: 20 4e 65 78 74 20 72 75 6c 65 20 77 69 74 68 20   Next rule with 
25c0: 74 68 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f 0a  the same LHS */.
25d0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e    struct rule *n
25e0: 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  ext;       /* Ne
25f0: 78 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67  xt rule in the g
2600: 6c 6f 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b  lobal list */.};
2610: 0a 0a 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72 61  ../* A configura
2620: 74 69 6f 6e 20 69 73 20 61 20 70 72 6f 64 75 63  tion is a produc
2630: 74 69 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68 65  tion rule of the
2640: 20 67 72 61 6d 6d 61 72 20 74 6f 67 65 74 68 65   grammar togethe
2650: 72 20 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72 6b  r with.** a mark
2660: 20 28 64 6f 74 29 20 73 68 6f 77 69 6e 67 20 68   (dot) showing h
2670: 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 61 74 20  ow much of that 
2680: 72 75 6c 65 20 68 61 73 20 62 65 65 6e 20 70 72  rule has been pr
2690: 6f 63 65 73 73 65 64 20 73 6f 20 66 61 72 2e 0a  ocessed so far..
26a0: 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ** Configuration
26b0: 73 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 61  s also contain a
26c0: 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69 63   follow-set whic
26d0: 68 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  h is a list of t
26e0: 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f  erminal.** symbo
26f0: 6c 73 20 77 68 69 63 68 20 61 72 65 20 61 6c 6c  ls which are all
2700: 6f 77 65 64 20 74 6f 20 69 6d 6d 65 64 69 61 74  owed to immediat
2710: 65 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 65  ely follow the e
2720: 6e 64 20 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a  nd of the rule..
2730: 2a 2a 20 45 76 65 72 79 20 63 6f 6e 66 69 67 75  ** Every configu
2740: 72 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64  ration is record
2750: 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63  ed as an instanc
2760: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2770: 6e 67 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66 67 73  ng: */.enum cfgs
2780: 74 61 74 75 73 20 7b 0a 20 20 43 4f 4d 50 4c 45  tatus {.  COMPLE
2790: 54 45 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45 54 45  TE,.  INCOMPLETE
27a0: 0a 7d 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  .};.struct confi
27b0: 67 20 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  g {.  struct rul
27c0: 65 20 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f  e *rp;         /
27d0: 2a 20 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20  * The rule upon 
27e0: 77 68 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67  which the config
27f0: 75 72 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64  uration is based
2800: 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20   */.  int dot;  
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2820: 2a 20 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e  * The parse poin
2830: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73  t */.  char *fws
2840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2850: 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f  /* Follow-set fo
2860: 72 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61  r this configura
2870: 74 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73  tion only */.  s
2880: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c  truct plink *fpl
2890: 70 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f  p;      /* Follo
28a0: 77 2d 73 65 74 20 66 6f 72 77 61 72 64 20 70 72  w-set forward pr
28b0: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20  opagation links 
28c0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  */.  struct plin
28d0: 6b 20 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a  k *bplp;      /*
28e0: 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b   Follow-set back
28f0: 77 61 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f  wards propagatio
2900: 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72  n links */.  str
2910: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20  uct state *stp; 
2920: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2930: 20 74 6f 20 73 74 61 74 65 20 77 68 69 63 68 20   to state which 
2940: 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f  contains this */
2950: 0a 20 20 65 6e 75 6d 20 63 66 67 73 74 61 74 75  .  enum cfgstatu
2960: 73 20 73 74 61 74 75 73 3b 20 20 20 2f 2a 20 75  s status;   /* u
2970: 73 65 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c 6f  sed during follo
2980: 77 73 65 74 20 61 6e 64 20 73 68 69 66 74 20 63  wset and shift c
2990: 6f 6d 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a 20  omputations */. 
29a0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
29b0: 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78  next;     /* Nex
29c0: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  t configuration 
29d0: 69 6e 20 74 68 65 20 73 74 61 74 65 20 2a 2f 0a  in the state */.
29e0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
29f0: 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *bp;       /* Th
2a00: 65 20 6e 65 78 74 20 62 61 73 69 73 20 63 6f 6e  e next basis con
2a10: 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b  figuration */.};
2a20: 0a 0a 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20  ..enum e_action 
2a30: 7b 0a 20 20 53 48 49 46 54 2c 0a 20 20 41 43 43  {.  SHIFT,.  ACC
2a40: 45 50 54 2c 0a 20 20 52 45 44 55 43 45 2c 0a 20  EPT,.  REDUCE,. 
2a50: 20 45 52 52 4f 52 2c 0a 20 20 53 53 43 4f 4e 46   ERROR,.  SSCONF
2a60: 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20  LICT,           
2a70: 20 20 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68     /* A shift/sh
2a80: 69 66 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ift conflict */.
2a90: 20 20 53 52 43 4f 4e 46 4c 49 43 54 2c 20 20 20    SRCONFLICT,   
2aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
2ab0: 73 20 61 20 72 65 64 75 63 65 2c 20 62 75 74 20  s a reduce, but 
2ac0: 70 61 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c 69  part of a confli
2ad0: 63 74 20 2a 2f 0a 20 20 52 52 43 4f 4e 46 4c 49  ct */.  RRCONFLI
2ae0: 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CT,             
2af0: 20 2f 2a 20 57 61 73 20 61 20 72 65 64 75 63 65   /* Was a reduce
2b00: 2c 20 62 75 74 20 70 61 72 74 20 6f 66 20 61 20  , but part of a 
2b10: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53 48  conflict */.  SH
2b20: 5f 52 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20  _RESOLVED,      
2b30: 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20         /* Was a 
2b40: 73 68 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e  shift.  Preceden
2b50: 63 65 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66  ce resolved conf
2b60: 6c 69 63 74 20 2a 2f 0a 20 20 52 44 5f 52 45 53  lict */.  RD_RES
2b70: 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20 20 20  OLVED,          
2b80: 20 20 20 2f 2a 20 57 61 73 20 72 65 64 75 63 65     /* Was reduce
2b90: 2e 20 20 50 72 65 63 65 64 65 6e 63 65 20 72 65  .  Precedence re
2ba0: 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20  solved conflict 
2bb0: 2a 2f 0a 20 20 4e 4f 54 5f 55 53 45 44 20 20 20  */.  NOT_USED   
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bd0: 20 44 65 6c 65 74 65 64 20 62 79 20 63 6f 6d 70   Deleted by comp
2be0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 2f  ression */.};../
2bf0: 2a 20 45 76 65 72 79 20 73 68 69 66 74 20 6f 72  * Every shift or
2c00: 20 72 65 64 75 63 65 20 6f 70 65 72 61 74 69 6f   reduce operatio
2c10: 6e 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 6f  n is stored as o
2c20: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
2c30: 69 6e 67 20 2a 2f 0a 73 74 72 75 63 74 20 61 63  ing */.struct ac
2c40: 74 69 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74 20  tion {.  struct 
2c50: 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20 20 20  symbol *sp;     
2c60: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 2d 61 68    /* The look-ah
2c70: 65 61 64 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20  ead symbol */.  
2c80: 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79  enum e_action ty
2c90: 70 65 3b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  pe;.  union {.  
2ca0: 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
2cb0: 73 74 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  stp;     /* The 
2cc0: 6e 65 77 20 73 74 61 74 65 2c 20 69 66 20 61 20  new state, if a 
2cd0: 73 68 69 66 74 20 2a 2f 0a 20 20 20 20 73 74 72  shift */.    str
2ce0: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 20 20 20  uct rule *rp;   
2cf0: 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 2c      /* The rule,
2d00: 20 69 66 20 61 20 72 65 64 75 63 65 20 2a 2f 0a   if a reduce */.
2d10: 20 20 7d 20 78 3b 0a 20 20 73 74 72 75 63 74 20    } x;.  struct 
2d20: 61 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20 20 20  action *next;   
2d30: 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e    /* Next action
2d40: 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20   for this state 
2d50: 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  */.  struct acti
2d60: 6f 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 2f 2a  on *collide;  /*
2d70: 20 4e 65 78 74 20 61 63 74 69 6f 6e 20 77 69 74   Next action wit
2d80: 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20  h the same hash 
2d90: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 73  */.};../* Each s
2da0: 74 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e 65  tate of the gene
2db0: 72 61 74 65 64 20 70 61 72 73 65 72 27 73 20 66  rated parser's f
2dc0: 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68  inite state mach
2dd0: 69 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f 64 65  ine.** is encode
2de0: 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  d as an instance
2df0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2e00: 67 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  g structure. */.
2e10: 73 74 72 75 63 74 20 73 74 61 74 65 20 7b 0a 20  struct state {. 
2e20: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
2e30: 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  bp;       /* The
2e40: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
2e50: 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73  tions for this s
2e60: 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  tate */.  struct
2e70: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 20   config *cfp;   
2e80: 20 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66 69 67     /* All config
2e90: 75 72 61 74 69 6f 6e 73 20 69 6e 20 74 68 69 73  urations in this
2ea0: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 73 74   set */.  int st
2eb0: 61 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  atenum;         
2ec0: 20 20 20 2f 2a 20 53 65 71 75 65 6e 74 69 61 6c     /* Sequential
2ed0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
2ee0: 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75   state */.  stru
2ef0: 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 20 20  ct action *ap;  
2f00: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
2f10: 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 69   actions for thi
2f20: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74  s state */.  int
2f30: 20 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74 41 63 74   nTknAct, nNtAct
2f40: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
2f50: 6f 66 20 61 63 74 69 6f 6e 73 20 6f 6e 20 74 65  of actions on te
2f60: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74  rminals and nont
2f70: 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e  erminals */.  in
2f80: 74 20 69 54 6b 6e 4f 66 73 74 2c 20 69 4e 74 4f  t iTknOfst, iNtO
2f90: 66 73 74 3b 20 20 20 2f 2a 20 79 79 5f 61 63 74  fst;   /* yy_act
2fa0: 69 6f 6e 5b 5d 20 6f 66 66 73 65 74 20 66 6f 72  ion[] offset for
2fb0: 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e   terminals and n
2fc0: 6f 6e 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  onterms */.  int
2fd0: 20 69 44 66 6c 74 3b 20 20 20 20 20 20 20 20 20   iDflt;         
2fe0: 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74        /* Default
2ff0: 20 61 63 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 64   action */.};.#d
3000: 65 66 69 6e 65 20 4e 4f 5f 4f 46 46 53 45 54 20  efine NO_OFFSET 
3010: 28 2d 32 31 34 37 34 38 33 36 34 37 29 0a 0a 2f  (-2147483647)../
3020: 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 70 72  * A followset pr
3030: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 20 69  opagation link i
3040: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
3050: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6f 6e  e contents of on
3060: 65 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61 74 69  e.** configurati
3070: 6f 6e 20 66 6f 6c 6c 6f 77 73 65 74 20 73 68 6f  on followset sho
3080: 75 6c 64 20 62 65 20 70 72 6f 70 61 67 61 74 65  uld be propagate
3090: 64 20 74 6f 20 61 6e 6f 74 68 65 72 20 77 68 65  d to another whe
30a0: 6e 65 76 65 72 0a 2a 2a 20 74 68 65 20 66 69 72  never.** the fir
30b0: 73 74 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 73  st changes. */.s
30c0: 74 72 75 63 74 20 70 6c 69 6e 6b 20 7b 0a 20 20  truct plink {.  
30d0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
30e0: 66 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  fp;      /* The 
30f0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f  configuration to
3100: 20 77 68 69 63 68 20 6c 69 6e 6b 65 64 20 2a 2f   which linked */
3110: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
3120: 2a 6e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 54  *next;      /* T
3130: 68 65 20 6e 65 78 74 20 70 72 6f 70 61 67 61 74  he next propagat
3140: 65 20 6c 69 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  e link */.};../*
3150: 20 54 68 65 20 73 74 61 74 65 20 76 65 63 74 6f   The state vecto
3160: 72 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  r for the entire
3170: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
3180: 72 20 69 73 20 72 65 63 6f 72 64 65 64 20 61 73  r is recorded as
3190: 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 2e 20 20 28 4c  .** follows.  (L
31a0: 45 4d 4f 4e 20 75 73 65 73 20 6e 6f 20 67 6c 6f  EMON uses no glo
31b0: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 6e  bal variables an
31c0: 64 20 6d 61 6b 65 73 20 6c 69 74 74 6c 65 20 75  d makes little u
31d0: 73 65 20 6f 66 0a 2a 2a 20 73 74 61 74 69 63 20  se of.** static 
31e0: 76 61 72 69 61 62 6c 65 73 2e 20 20 46 69 65 6c  variables.  Fiel
31f0: 64 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ds in the follow
3200: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 61  ing structure ca
3210: 6e 20 62 65 20 74 68 6f 75 67 68 74 0a 2a 2a 20  n be thought.** 
3220: 6f 66 20 61 73 20 62 65 67 69 6e 20 67 6c 6f 62  of as begin glob
3230: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  al variables in 
3240: 74 68 65 20 70 72 6f 67 72 61 6d 2e 29 20 2a 2f  the program.) */
3250: 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 7b 0a  .struct lemon {.
3260: 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
3270: 2a 73 6f 72 74 65 64 3b 20 20 20 2f 2a 20 54 61  *sorted;   /* Ta
3280: 62 6c 65 20 6f 66 20 73 74 61 74 65 73 20 73 6f  ble of states so
3290: 72 74 65 64 20 62 79 20 73 74 61 74 65 20 6e 75  rted by state nu
32a0: 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74  mber */.  struct
32b0: 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20 20 20   rule *rule;    
32c0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
32d0: 6c 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74  l rules */.  int
32e0: 20 6e 73 74 61 74 65 3b 20 20 20 20 20 20 20 20   nstate;        
32f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3300: 6f 66 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 69  of states */.  i
3310: 6e 74 20 6e 72 75 6c 65 3b 20 20 20 20 20 20 20  nt nrule;       
3320: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3330: 72 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a 20 20  r of rules */.  
3340: 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20 20 20  int nsymbol;    
3350: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3360: 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 61  er of terminal a
3370: 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 73  nd nonterminal s
3380: 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  ymbols */.  int 
3390: 6e 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20 20  nterminal;      
33a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
33b0: 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f  f terminal symbo
33c0: 6c 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ls */.  struct s
33d0: 79 6d 62 6f 6c 20 2a 2a 73 79 6d 62 6f 6c 73 3b  ymbol **symbols;
33e0: 20 2f 2a 20 53 6f 72 74 65 64 20 61 72 72 61 79   /* Sorted array
33f0: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
3400: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74  symbols */.  int
3410: 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20 20 20   errorcnt;      
3420: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3430: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73  of errors */.  s
3440: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65 72  truct symbol *er
3450: 72 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65 20 65  rsym;   /* The e
3460: 72 72 6f 72 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20  rror symbol */. 
3470: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
3480: 77 69 6c 64 63 61 72 64 3b 20 2f 2a 20 54 6f 6b  wildcard; /* Tok
3490: 65 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  en that matches 
34a0: 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 63 68  anything */.  ch
34b0: 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20  ar *name;       
34c0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
34d0: 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
34e0: 70 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61 72  parser */.  char
34f0: 20 2a 61 72 67 3b 20 20 20 20 20 20 20 20 20 20   *arg;          
3500: 20 20 20 20 20 2f 2a 20 44 65 63 6c 61 72 61 74       /* Declarat
3510: 69 6f 6e 20 6f 66 20 74 68 65 20 33 74 68 20 61  ion of the 3th a
3520: 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 72 73 65  rgument to parse
3530: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  r */.  char *tok
3540: 65 6e 74 79 70 65 3b 20 20 20 20 20 20 20 20 20  entype;         
3550: 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 72 6d 69  /* Type of termi
3560: 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74  nal symbols in t
3570: 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20  he parser stack 
3580: 2a 2f 0a 20 20 63 68 61 72 20 2a 76 61 72 74 79  */.  char *varty
3590: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pe;           /*
35a0: 20 54 68 65 20 64 65 66 61 75 6c 74 20 74 79 70   The default typ
35b0: 65 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  e of non-termina
35c0: 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63  l symbols */.  c
35d0: 68 61 72 20 2a 73 74 61 72 74 3b 20 20 20 20 20  har *start;     
35e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
35f0: 6f 66 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  of the start sym
3600: 62 6f 6c 20 66 6f 72 20 74 68 65 20 67 72 61 6d  bol for the gram
3610: 6d 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73  mar */.  char *s
3620: 74 61 63 6b 73 69 7a 65 3b 20 20 20 20 20 20 20  tacksize;       
3630: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
3640: 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a 2f   parser stack */
3650: 0a 20 20 63 68 61 72 20 2a 69 6e 63 6c 75 64 65  .  char *include
3660: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
3670: 6f 64 65 20 74 6f 20 70 75 74 20 61 74 20 74 68  ode to put at th
3680: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 43  e start of the C
3690: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
36a0: 2a 65 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  *error;         
36b0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65      /* Code to e
36c0: 78 65 63 75 74 65 20 77 68 65 6e 20 61 6e 20 65  xecute when an e
36d0: 72 72 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a  rror is seen */.
36e0: 20 20 63 68 61 72 20 2a 6f 76 65 72 66 6c 6f 77    char *overflow
36f0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;          /* Co
3700: 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e  de to execute on
3710: 20 61 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f   a stack overflo
3720: 77 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 61 69  w */.  char *fai
3730: 6c 75 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  lure;           
3740: 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75  /* Code to execu
3750: 74 65 20 6f 6e 20 70 61 72 73 65 72 20 66 61 69  te on parser fai
3760: 6c 75 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lure */.  char *
3770: 61 63 63 65 70 74 3b 20 20 20 20 20 20 20 20 20  accept;         
3780: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
3790: 65 63 75 74 65 20 77 68 65 6e 20 74 68 65 20 70  ecute when the p
37a0: 61 72 73 65 72 20 65 78 63 65 70 74 73 20 2a 2f  arser excepts */
37b0: 0a 20 20 63 68 61 72 20 2a 65 78 74 72 61 63 6f  .  char *extraco
37c0: 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  de;         /* C
37d0: 6f 64 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ode appended to 
37e0: 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 66 69  the generated fi
37f0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f  le */.  char *to
3800: 6b 65 6e 64 65 73 74 3b 20 20 20 20 20 20 20 20  kendest;        
3810: 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63   /* Code to exec
3820: 75 74 65 20 74 6f 20 64 65 73 74 72 6f 79 20 74  ute to destroy t
3830: 6f 6b 65 6e 20 64 61 74 61 20 2a 2f 0a 20 20 63  oken data */.  c
3840: 68 61 72 20 2a 76 61 72 64 65 73 74 3b 20 20 20  har *vardest;   
3850: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
3860: 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20  for the default 
3870: 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 64 65 73  non-terminal des
3880: 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63 68 61  tructor */.  cha
3890: 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20  r *filename;    
38a0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
38b0: 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
38c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e 61  */.  char *outna
38d0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
38e0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72   Name of the cur
38f0: 72 65 6e 74 20 6f 75 74 70 75 74 20 66 69 6c 65  rent output file
3900: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65   */.  char *toke
3910: 6e 70 72 65 66 69 78 3b 20 20 20 20 20 20 20 2f  nprefix;       /
3920: 2a 20 41 20 70 72 65 66 69 78 20 61 64 64 65 64  * A prefix added
3930: 20 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73 20   to token names 
3940: 69 6e 20 74 68 65 20 2e 68 20 66 69 6c 65 20 2a  in the .h file *
3950: 2f 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69 63  /.  int nconflic
3960: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
3970: 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 73 69 6e  Number of parsin
3980: 67 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20  g conflicts */. 
3990: 20 69 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b 20   int tablesize; 
39a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
39b0: 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 20 74  e of the parse t
39c0: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62  ables */.  int b
39d0: 61 73 69 73 66 6c 61 67 3b 20 20 20 20 20 20 20  asisflag;       
39e0: 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 6f 6e 6c      /* Print onl
39f0: 79 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  y basis configur
3a00: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ations */.  int 
3a10: 68 61 73 5f 66 61 6c 6c 62 61 63 6b 3b 20 20 20  has_fallback;   
3a20: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3a30: 61 6e 79 20 25 66 61 6c 6c 62 61 63 6b 20 69 73  any %fallback is
3a40: 20 73 65 65 6e 20 69 6e 20 74 68 65 20 67 72 61   seen in the gra
3a50: 6d 6d 61 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  mmar */.  int no
3a60: 6c 69 6e 65 6e 6f 73 66 6c 61 67 3b 20 20 20 20  linenosflag;    
3a70: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 23 6c     /* True if #l
3a80: 69 6e 65 20 73 74 61 74 65 6d 65 6e 74 73 20 73  ine statements s
3a90: 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 72 69  hould not be pri
3aa0: 6e 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  nted */.  char *
3ab0: 61 72 67 76 30 3b 20 20 20 20 20 20 20 20 20 20  argv0;          
3ac0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3ad0: 65 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b 0a  e program */.};.
3ae0: 0a 23 64 65 66 69 6e 65 20 4d 65 6d 6f 72 79 43  .#define MemoryC
3af0: 68 65 63 6b 28 58 29 20 69 66 28 28 58 29 3d 3d  heck(X) if((X)==
3b00: 30 29 7b 20 5c 0a 20 20 65 78 74 65 72 6e 20 76  0){ \.  extern v
3b10: 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72  oid memory_error
3b20: 28 29 3b 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f 65  (); \.  memory_e
3b30: 72 72 6f 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a  rror(); \.}../**
3b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
3b50: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74 61  rom the file "ta
3b60: 62 6c 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ble.h" *********
3b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b80: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
3b90: 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73  All code in this
3ba0: 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61   file has been a
3bb0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
3bc0: 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61  erated.** from a
3bd0: 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69   specification i
3be0: 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  n the file.**   
3bf0: 20 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c             "tabl
3c00: 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61  e.q".** by the a
3c10: 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
3c20: 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70   code building p
3c30: 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a  rogram "aagen"..
3c40: 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74  ** Do not edit t
3c50: 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65  his file!  Inste
3c60: 61 64 2c 20 65 64 69 74 20 74 68 65 20 73 70 65  ad, edit the spe
3c70: 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69  cification.** fi
3c80: 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61  le, then rerun a
3c90: 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43  agen..*/./*.** C
3ca0: 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ode for processi
3cb0: 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ng tables in the
3cc0: 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
3cd0: 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 2f 2a 20 52  nerator..*/./* R
3ce0: 6f 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64  outines for hand
3cf0: 6c 69 6e 67 20 61 20 73 74 72 69 6e 67 73 20 2a  ling a strings *
3d00: 2f 0a 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53  /..const char *S
3d10: 74 72 73 61 66 65 28 63 6f 6e 73 74 20 63 68 61  trsafe(const cha
3d20: 72 20 2a 29 3b 0a 0a 76 6f 69 64 20 53 74 72 73  r *);..void Strs
3d30: 61 66 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a  afe_init(void);.
3d40: 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65  int Strsafe_inse
3d50: 72 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  rt(const char *)
3d60: 3b 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74  ;.const char *St
3d70: 72 73 61 66 65 5f 66 69 6e 64 28 63 6f 6e 73 74  rsafe_find(const
3d80: 20 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 20 52 6f   char *);../* Ro
3d90: 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c  utines for handl
3da0: 69 6e 67 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74  ing symbols of t
3db0: 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a 73  he grammar */..s
3dc0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
3dd0: 6d 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73 74 20 63  mbol_new(const c
3de0: 68 61 72 20 2a 29 3b 0a 69 6e 74 20 53 79 6d 62  har *);.int Symb
3df0: 6f 6c 63 6d 70 70 28 63 6f 6e 73 74 20 76 6f 69  olcmpp(const voi
3e00: 64 20 2a 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  d *, const void 
3e10: 2a 29 3b 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f  *);.void Symbol_
3e20: 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20  init(void);.int 
3e30: 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 74  Symbol_insert(st
3e40: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2c 20 63  ruct symbol *, c
3e50: 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 73 74  onst char *);.st
3e60: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d  ruct symbol *Sym
3e70: 62 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63  bol_find(const c
3e80: 68 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20 73  har *);.struct s
3e90: 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74  ymbol *Symbol_Nt
3ea0: 68 28 69 6e 74 29 3b 0a 69 6e 74 20 53 79 6d 62  h(int);.int Symb
3eb0: 6f 6c 5f 63 6f 75 6e 74 28 76 6f 69 64 29 3b 0a  ol_count(void);.
3ec0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
3ed0: 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 76  Symbol_arrayof(v
3ee0: 6f 69 64 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e  oid);../* Routin
3ef0: 65 73 20 74 6f 20 6d 61 6e 61 67 65 20 74 68 65  es to manage the
3f00: 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a   state table */.
3f10: 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 63  .int Configcmp(c
3f20: 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 63 6f 6e  onst char *, con
3f30: 73 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72 75  st char *);.stru
3f40: 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f  ct state *State_
3f50: 6e 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20  new(void);.void 
3f60: 53 74 61 74 65 5f 69 6e 69 74 28 76 6f 69 64 29  State_init(void)
3f70: 3b 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65  ;.int State_inse
3f80: 72 74 28 73 74 72 75 63 74 20 73 74 61 74 65 20  rt(struct state 
3f90: 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  *, struct config
3fa0: 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74   *);.struct stat
3fb0: 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 73 74  e *State_find(st
3fc0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a  ruct config *);.
3fd0: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53  struct state **S
3fe0: 74 61 74 65 5f 61 72 72 61 79 6f 66 28 2f 2a 20  tate_arrayof(/* 
3ff0: 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e   */);../* Routin
4000: 65 73 20 75 73 65 64 20 66 6f 72 20 65 66 66 69  es used for effi
4010: 63 69 65 6e 63 79 20 69 6e 20 43 6f 6e 66 69 67  ciency in Config
4020: 6c 69 73 74 5f 61 64 64 20 2a 2f 0a 0a 76 6f 69  list_add */..voi
4030: 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e  d Configtable_in
4040: 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 43 6f  it(void);.int Co
4050: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74  nfigtable_insert
4060: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
4070: 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  );.struct config
4080: 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69   *Configtable_fi
4090: 6e 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  nd(struct config
40a0: 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67   *);.void Config
40b0: 74 61 62 6c 65 5f 63 6c 65 61 72 28 69 6e 74 28  table_clear(int(
40c0: 2a 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  *)(struct config
40d0: 20 2a 29 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   *));../********
40e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
40f0: 74 68 65 20 66 69 6c 65 20 22 61 63 74 69 6f 6e  the file "action
4100: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
4110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4120: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ***/./*.** Routi
4130: 6e 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20 70  nes processing p
4140: 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20 69 6e  arser actions in
4150: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
4160: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
4170: 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
4180: 65 77 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e  ew parser action
4190: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
41a0: 74 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e  t action *Action
41b0: 5f 6e 65 77 28 76 6f 69 64 29 7b 0a 20 20 73 74  _new(void){.  st
41c0: 61 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69  atic struct acti
41d0: 6f 6e 20 2a 66 72 65 65 6c 69 73 74 20 3d 20 30  on *freelist = 0
41e0: 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
41f0: 6e 20 2a 6e 65 77 61 63 74 69 6f 6e 3b 0a 0a 20  n *newaction;.. 
4200: 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30   if( freelist==0
4210: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4220: 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30 30     int amt = 100
4230: 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d  ;.    freelist =
4240: 20 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20   (struct action 
4250: 2a 29 63 61 6c 6c 6f 63 28 61 6d 74 2c 20 73 69  *)calloc(amt, si
4260: 7a 65 6f 66 28 73 74 72 75 63 74 20 61 63 74 69  zeof(struct acti
4270: 6f 6e 29 29 3b 0a 20 20 20 20 69 66 28 20 66 72  on));.    if( fr
4280: 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
4290: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
42a0: 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  r,"Unable to all
42b0: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
42c0: 20 61 20 6e 65 77 20 70 61 72 73 65 72 20 61 63   a new parser ac
42d0: 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65  tion.");.      e
42e0: 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(1);.    }.  
42f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74    for(i=0; i<amt
4300: 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69 73  -1; i++) freelis
4310: 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65  t[i].next = &fre
4320: 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20  elist[i+1];.    
4330: 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e  freelist[amt-1].
4340: 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  next = 0;.  }.  
4350: 6e 65 77 61 63 74 69 6f 6e 20 3d 20 66 72 65 65  newaction = free
4360: 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74  list;.  freelist
4370: 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78   = freelist->nex
4380: 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 61  t;.  return newa
4390: 63 74 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  ction;.}../* Com
43a0: 70 61 72 65 20 74 77 6f 20 61 63 74 69 6f 6e 73  pare two actions
43b0: 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72   for sorting pur
43c0: 70 6f 73 65 73 2e 20 20 52 65 74 75 72 6e 20 6e  poses.  Return n
43d0: 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
43e0: 72 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 69 66  r.** positive if
43f0: 20 74 68 65 20 66 69 72 73 74 20 61 63 74 69 6f   the first actio
4400: 6e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  n is less than, 
4410: 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
4420: 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  ater than.** the
4430: 20 66 69 72 73 74 0a 2a 2f 0a 73 74 61 74 69 63   first.*/.static
4440: 20 69 6e 74 20 61 63 74 69 6f 6e 63 6d 70 28 0a   int actioncmp(.
4450: 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
4460: 2a 61 70 31 2c 0a 20 20 73 74 72 75 63 74 20 61  *ap1,.  struct a
4470: 63 74 69 6f 6e 20 2a 61 70 32 0a 29 7b 0a 20 20  ction *ap2.){.  
4480: 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 61  int rc;.  rc = a
4490: 70 31 2d 3e 73 70 2d 3e 69 6e 64 65 78 20 2d 20  p1->sp->index - 
44a0: 61 70 32 2d 3e 73 70 2d 3e 69 6e 64 65 78 3b 0a  ap2->sp->index;.
44b0: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
44c0: 20 20 20 72 63 20 3d 20 28 69 6e 74 29 61 70 31     rc = (int)ap1
44d0: 2d 3e 74 79 70 65 20 2d 20 28 69 6e 74 29 61 70  ->type - (int)ap
44e0: 32 2d 3e 74 79 70 65 3b 0a 20 20 7d 0a 20 20 69  2->type;.  }.  i
44f0: 66 28 20 72 63 3d 3d 30 20 26 26 20 61 70 31 2d  f( rc==0 && ap1-
4500: 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b  >type==REDUCE ){
4510: 0a 20 20 20 20 72 63 20 3d 20 61 70 31 2d 3e 78  .    rc = ap1->x
4520: 2e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70 32  .rp->index - ap2
4530: 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20  ->x.rp->index;. 
4540: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29   }.  if( rc==0 )
4550: 7b 0a 20 20 20 20 72 63 20 3d 20 28 69 6e 74 29  {.    rc = (int)
4560: 20 28 61 70 32 20 2d 20 61 70 31 29 3b 0a 20 20   (ap2 - ap1);.  
4570: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4580: 0a 0a 2f 2a 20 53 6f 72 74 20 70 61 72 73 65 72  ../* Sort parser
4590: 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74   actions */.stat
45a0: 69 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  ic struct action
45b0: 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 0a 20   *Action_sort(. 
45c0: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
45d0: 61 70 0a 29 7b 0a 20 20 61 70 20 3d 20 28 73 74  ap.){.  ap = (st
45e0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 6d 73  ruct action *)ms
45f0: 6f 72 74 28 28 63 68 61 72 20 2a 29 61 70 2c 28  ort((char *)ap,(
4600: 63 68 61 72 20 2a 2a 29 26 61 70 2d 3e 6e 65 78  char **)&ap->nex
4610: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63   (int(*)(const c
4640: 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  har*,const char*
4650: 29 29 61 63 74 69 6f 6e 63 6d 70 29 3b 0a 20 20  ))actioncmp);.  
4660: 72 65 74 75 72 6e 20 61 70 3b 0a 7d 0a 0a 76 6f  return ap;.}..vo
4670: 69 64 20 41 63 74 69 6f 6e 5f 61 64 64 28 0a 20  id Action_add(. 
4680: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
4690: 2a 61 70 70 2c 0a 20 20 65 6e 75 6d 20 65 5f 61  *app,.  enum e_a
46a0: 63 74 69 6f 6e 20 74 79 70 65 2c 0a 20 20 73 74  ction type,.  st
46b0: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c  ruct symbol *sp,
46c0: 0a 20 20 63 68 61 72 20 2a 61 72 67 0a 29 7b 0a  .  char *arg.){.
46d0: 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
46e0: 2a 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e 65  *newaction;.  ne
46f0: 77 61 63 74 69 6f 6e 20 3d 20 41 63 74 69 6f 6e  waction = Action
4700: 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77 61 63 74  _new();.  newact
4710: 69 6f 6e 2d 3e 6e 65 78 74 20 3d 20 2a 61 70 70  ion->next = *app
4720: 3b 0a 20 20 2a 61 70 70 20 3d 20 6e 65 77 61 63  ;.  *app = newac
4730: 74 69 6f 6e 3b 0a 20 20 6e 65 77 61 63 74 69 6f  tion;.  newactio
4740: 6e 2d 3e 74 79 70 65 20 3d 20 74 79 70 65 3b 0a  n->type = type;.
4750: 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 73 70 20    newaction->sp 
4760: 3d 20 73 70 3b 0a 20 20 69 66 28 20 74 79 70 65  = sp;.  if( type
4770: 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 6e  ==SHIFT ){.    n
4780: 65 77 61 63 74 69 6f 6e 2d 3e 78 2e 73 74 70 20  ewaction->x.stp 
4790: 3d 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20  = (struct state 
47a0: 2a 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a  *)arg;.  }else{.
47b0: 20 20 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78      newaction->x
47c0: 2e 72 70 20 3d 20 28 73 74 72 75 63 74 20 72 75  .rp = (struct ru
47d0: 6c 65 20 2a 29 61 72 67 3b 0a 20 20 7d 0a 7d 0a  le *)arg;.  }.}.
47e0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
47f0: 2a 2a 2a 2a 2a 2a 2a 20 4e 65 77 20 63 6f 64 65  ******* New code
4800: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
4810: 65 20 22 61 63 74 74 61 62 22 20 6d 6f 64 75 6c  e "acttab" modul
4820: 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  e ***********/./
4830: 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65  *.** This module
4840: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 6f 75 74   implements rout
4850: 69 6e 65 73 20 75 73 65 20 74 6f 20 63 6f 6e 73  ines use to cons
4860: 74 72 75 63 74 20 74 68 65 20 79 79 5f 61 63 74  truct the yy_act
4870: 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a  ion[] table..*/.
4880: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65  ./*.** The state
4890: 20 6f 66 20 74 68 65 20 79 79 5f 61 63 74 69 6f   of the yy_actio
48a0: 6e 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  n table under co
48b0: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6e  nstruction is an
48c0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20   instance of.** 
48d0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
48e0: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54  ructure..**.** T
48f0: 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62  he yy_action tab
4900: 6c 65 20 6d 61 70 73 20 74 68 65 20 70 61 69 72  le maps the pair
4910: 20 28 73 74 61 74 65 5f 6e 75 6d 62 65 72 2c 20   (state_number, 
4920: 6c 6f 6f 6b 61 68 65 61 64 29 20 69 6e 74 6f 20  lookahead) into 
4930: 61 6e 0a 2a 2a 20 61 63 74 69 6f 6e 5f 6e 75 6d  an.** action_num
4940: 62 65 72 2e 20 20 54 68 65 20 74 61 62 6c 65 20  ber.  The table 
4950: 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69  is an array of i
4960: 6e 74 65 67 65 72 73 20 70 61 69 72 73 2e 20 20  ntegers pairs.  
4970: 54 68 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72  The state_number
4980: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 61  .** determines a
4990: 6e 20 69 6e 69 74 69 61 6c 20 6f 66 66 73 65 74  n initial offset
49a0: 20 69 6e 74 6f 20 74 68 65 20 79 79 5f 61 63 74   into the yy_act
49b0: 69 6f 6e 20 61 72 72 61 79 2e 20 20 54 68 65 20  ion array.  The 
49c0: 6c 6f 6f 6b 61 68 65 61 64 0a 2a 2a 20 76 61 6c  lookahead.** val
49d0: 75 65 20 69 73 20 74 68 65 6e 20 61 64 64 65 64  ue is then added
49e0: 20 74 6f 20 74 68 69 73 20 69 6e 69 74 69 61 6c   to this initial
49f0: 20 6f 66 66 73 65 74 20 74 6f 20 67 65 74 20 61   offset to get a
4a00: 6e 20 69 6e 64 65 78 20 58 20 69 6e 74 6f 20 74  n index X into t
4a10: 68 65 0a 2a 2a 20 79 79 5f 61 63 74 69 6f 6e 20  he.** yy_action 
4a20: 61 72 72 61 79 2e 20 49 66 20 74 68 65 20 61 41  array. If the aA
4a30: 63 74 69 6f 6e 5b 58 5d 2e 6c 6f 6f 6b 61 68 65  ction[X].lookahe
4a40: 61 64 20 65 71 75 61 6c 73 20 74 68 65 20 76 61  ad equals the va
4a50: 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 66  lue of the.** of
4a60: 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69   the lookahead i
4a70: 6e 70 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76  nput, then the v
4a80: 61 6c 75 65 20 6f 66 20 74 68 65 20 61 63 74 69  alue of the acti
4a90: 6f 6e 5f 6e 75 6d 62 65 72 20 6f 75 74 70 75 74  on_number output
4aa0: 20 69 73 0a 2a 2a 20 61 41 63 74 69 6f 6e 5b 58   is.** aAction[X
4ab0: 5d 2e 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  ].action.  If th
4ac0: 65 20 6c 6f 6f 6b 61 68 65 61 64 73 20 64 6f 20  e lookaheads do 
4ad0: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 6e 20 74  not match then t
4ae0: 68 65 0a 2a 2a 20 64 65 66 61 75 6c 74 20 61 63  he.** default ac
4af0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 73 74 61  tion for the sta
4b00: 74 65 5f 6e 75 6d 62 65 72 20 69 73 20 72 65 74  te_number is ret
4b10: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  urned..**.** All
4b20: 20 61 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61   actions associa
4b30: 74 65 64 20 77 69 74 68 20 61 20 73 69 6e 67 6c  ted with a singl
4b40: 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 61  e state_number a
4b50: 72 65 20 66 69 72 73 74 20 65 6e 74 65 72 65 64  re first entered
4b60: 0a 2a 2a 20 69 6e 74 6f 20 61 4c 6f 6f 6b 61 68  .** into aLookah
4b70: 65 61 64 5b 5d 20 75 73 69 6e 67 20 6d 75 6c 74  ead[] using mult
4b80: 69 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20 61 63  iple calls to ac
4b90: 74 74 61 62 5f 61 63 74 69 6f 6e 28 29 2e 20 20  ttab_action().  
4ba0: 54 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 63 74  Then the .** act
4bb0: 69 6f 6e 73 20 66 6f 72 20 74 68 61 74 20 73 69  ions for that si
4bc0: 6e 67 6c 65 20 73 74 61 74 65 5f 6e 75 6d 62 65  ngle state_numbe
4bd0: 72 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 74  r are placed int
4be0: 6f 20 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20  o the aAction[] 
4bf0: 0a 2a 2a 20 61 72 72 61 79 20 77 69 74 68 20 61  .** array with a
4c00: 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20   single call to 
4c10: 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 29 2e  acttab_insert().
4c20: 20 20 54 68 65 20 61 63 74 74 61 62 5f 69 6e 73    The acttab_ins
4c30: 65 72 74 28 29 20 63 61 6c 6c 0a 2a 2a 20 61 6c  ert() call.** al
4c40: 73 6f 20 72 65 73 65 74 73 20 74 68 65 20 61 4c  so resets the aL
4c50: 6f 6f 6b 61 68 65 61 64 5b 5d 20 61 72 72 61 79  ookahead[] array
4c60: 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20   in preparation 
4c70: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
4c80: 73 74 61 74 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f  state number..*/
4c90: 0a 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61  .struct lookahea
4ca0: 64 5f 61 63 74 69 6f 6e 20 7b 0a 20 20 69 6e 74  d_action {.  int
4cb0: 20 6c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20   lookahead;     
4cc0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
4cd0: 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   of the lookahea
4ce0: 64 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74  d token */.  int
4cf0: 20 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20   action;        
4d00: 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69 6f          /* Actio
4d10: 6e 20 74 6f 20 74 61 6b 65 20 6f 6e 20 74 68 65  n to take on the
4d20: 20 67 69 76 65 6e 20 6c 6f 6f 6b 61 68 65 61 64   given lookahead
4d30: 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73   */.};.typedef s
4d40: 74 72 75 63 74 20 61 63 74 74 61 62 20 61 63 74  truct acttab act
4d50: 74 61 62 3b 0a 73 74 72 75 63 74 20 61 63 74 74  tab;.struct actt
4d60: 61 62 20 7b 0a 20 20 69 6e 74 20 6e 41 63 74 69  ab {.  int nActi
4d70: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
4d80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4d90: 20 75 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61   used slots in a
4da0: 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 69 6e  Action[] */.  in
4db0: 74 20 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20  t nActionAlloc; 
4dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c             /* Sl
4dd0: 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ots allocated fo
4de0: 72 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20  r aAction[] */. 
4df0: 20 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61   struct lookahea
4e00: 64 5f 61 63 74 69 6f 6e 0a 20 20 20 20 2a 61 41  d_action.    *aA
4e10: 63 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  ction,          
4e20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 79          /* The y
4e30: 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65  y_action[] table
4e40: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
4e50: 69 6f 6e 20 2a 2f 0a 20 20 20 20 2a 61 4c 6f 6f  ion */.    *aLoo
4e60: 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20  kahead;         
4e70: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
4e80: 65 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  e new transactio
4e90: 6e 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6d  n set */.  int m
4ea0: 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20  nLookahead;     
4eb0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d          /* Minim
4ec0: 75 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e  um aLookahead[].
4ed0: 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69  lookahead */.  i
4ee0: 6e 74 20 6d 6e 41 63 74 69 6f 6e 3b 20 20 20 20  nt mnAction;    
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4f00: 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64  ction associated
4f10: 20 77 69 74 68 20 6d 6e 4c 6f 6f 6b 61 68 65 61   with mnLookahea
4f20: 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 4c 6f 6f  d */.  int mxLoo
4f30: 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20  kahead;         
4f40: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
4f50: 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b  Lookahead[].look
4f60: 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ahead */.  int n
4f70: 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  Lookahead;      
4f80: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
4f90: 73 6c 6f 74 73 20 69 6e 20 61 4c 6f 6f 6b 61 68  slots in aLookah
4fa0: 65 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ead[] */.  int n
4fb0: 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 3b 20  LookaheadAlloc; 
4fc0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73          /* Slots
4fd0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61 4c   allocated in aL
4fe0: 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 7d 3b  ookahead[] */.};
4ff0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ../* Return the 
5000: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
5010: 73 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74 69  s in the yy_acti
5020: 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66  on table */.#def
5030: 69 6e 65 20 61 63 74 74 61 62 5f 73 69 7a 65 28  ine acttab_size(
5040: 58 29 20 28 28 58 29 2d 3e 6e 41 63 74 69 6f 6e  X) ((X)->nAction
5050: 29 0a 0a 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  )../* The value 
5060: 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 65 6e 74  for the N-th ent
5070: 72 79 20 69 6e 20 79 79 5f 61 63 74 69 6f 6e 20  ry in yy_action 
5080: 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61  */.#define actta
5090: 62 5f 79 79 61 63 74 69 6f 6e 28 58 2c 4e 29 20  b_yyaction(X,N) 
50a0: 20 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e   ((X)->aAction[N
50b0: 5d 2e 61 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68  ].action)../* Th
50c0: 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
50d0: 4e 2d 74 68 20 65 6e 74 72 79 20 69 6e 20 79 79  N-th entry in yy
50e0: 5f 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 23 64  _lookahead */.#d
50f0: 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79 79 6c  efine acttab_yyl
5100: 6f 6f 6b 61 68 65 61 64 28 58 2c 4e 29 20 20 28  ookahead(X,N)  (
5110: 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e  (X)->aAction[N].
5120: 6c 6f 6f 6b 61 68 65 61 64 29 0a 0a 2f 2a 20 46  lookahead)../* F
5130: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
5140: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
5150: 68 65 20 67 69 76 65 6e 20 61 63 74 74 61 62 20  he given acttab 
5160: 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 66  */.void acttab_f
5170: 72 65 65 28 61 63 74 74 61 62 20 2a 70 29 7b 0a  ree(acttab *p){.
5180: 20 20 66 72 65 65 28 20 70 2d 3e 61 41 63 74 69    free( p->aActi
5190: 6f 6e 20 29 3b 0a 20 20 66 72 65 65 28 20 70 2d  on );.  free( p-
51a0: 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 29 3b 0a 20  >aLookahead );. 
51b0: 20 66 72 65 65 28 20 70 20 29 3b 0a 7d 0a 0a 2f   free( p );.}../
51c0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
51d0: 20 61 63 74 74 61 62 20 73 74 72 75 63 74 75 72   acttab structur
51e0: 65 20 2a 2f 0a 61 63 74 74 61 62 20 2a 61 63 74  e */.acttab *act
51f0: 74 61 62 5f 61 6c 6c 6f 63 28 76 6f 69 64 29 7b  tab_alloc(void){
5200: 0a 20 20 61 63 74 74 61 62 20 2a 70 20 3d 20 28  .  acttab *p = (
5210: 61 63 74 74 61 62 20 2a 29 20 63 61 6c 6c 6f 63  acttab *) calloc
5220: 28 20 31 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20  ( 1, sizeof(*p) 
5230: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
5240: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
5250: 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61  err,"Unable to a
5260: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
5270: 6f 72 20 61 20 6e 65 77 20 61 63 74 74 61 62 2e  or a new acttab.
5280: 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
5290: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c  .  }.  memset(p,
52a0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
52b0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
52c0: 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 61 63 74  /* Add a new act
52d0: 69 6f 6e 20 74 6f 20 74 68 65 20 63 75 72 72 65  ion to the curre
52e0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
52f0: 65 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  et.  .**.** This
5300: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5310: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
5320: 20 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 61   lookahead for a
5330: 20 70 61 72 74 69 63 75 6c 61 72 0a 2a 2a 20 73   particular.** s
5340: 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 61 63  tate..*/.void ac
5350: 74 74 61 62 5f 61 63 74 69 6f 6e 28 61 63 74 74  ttab_action(actt
5360: 61 62 20 2a 70 2c 20 69 6e 74 20 6c 6f 6f 6b 61  ab *p, int looka
5370: 68 65 61 64 2c 20 69 6e 74 20 61 63 74 69 6f 6e  head, int action
5380: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f  ){.  if( p->nLoo
5390: 6b 61 68 65 61 64 3e 3d 70 2d 3e 6e 4c 6f 6f 6b  kahead>=p->nLook
53a0: 61 68 65 61 64 41 6c 6c 6f 63 20 29 7b 0a 20 20  aheadAlloc ){.  
53b0: 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41    p->nLookaheadA
53c0: 6c 6c 6f 63 20 2b 3d 20 32 35 3b 0a 20 20 20 20  lloc += 25;.    
53d0: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 3d 20  p->aLookahead = 
53e0: 28 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61  (struct lookahea
53f0: 64 5f 61 63 74 69 6f 6e 20 2a 29 20 72 65 61 6c  d_action *) real
5400: 6c 6f 63 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65  loc( p->aLookahe
5410: 61 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ad,.            
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5430: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 6f 6f 6b   sizeof(p->aLook
5440: 61 68 65 61 64 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f  ahead[0])*p->nLo
5450: 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29 3b 0a  okaheadAlloc );.
5460: 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b      if( p->aLook
5470: 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ahead==0 ){.    
5480: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
5490: 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c  ,"malloc failed\
54a0: 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  n");.      exit(
54b0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
54c0: 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  if( p->nLookahea
54d0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6d  d==0 ){.    p->m
54e0: 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f  xLookahead = loo
54f0: 6b 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d  kahead;.    p->m
5500: 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f  nLookahead = loo
5510: 6b 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d  kahead;.    p->m
5520: 6e 41 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e  nAction = action
5530: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
5540: 66 28 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61  f( p->mxLookahea
5550: 64 3c 6c 6f 6f 6b 61 68 65 61 64 20 29 20 70 2d  d<lookahead ) p-
5560: 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c  >mxLookahead = l
5570: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 69 66  ookahead;.    if
5580: 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  ( p->mnLookahead
5590: 3e 6c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20  >lookahead ){.  
55a0: 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65      p->mnLookahe
55b0: 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a  ad = lookahead;.
55c0: 20 20 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69 6f        p->mnActio
55d0: 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20  n = action;.    
55e0: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c 6f 6f 6b  }.  }.  p->aLook
55f0: 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68  ahead[p->nLookah
5600: 65 61 64 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d  ead].lookahead =
5610: 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 70 2d   lookahead;.  p-
5620: 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e  >aLookahead[p->n
5630: 4c 6f 6f 6b 61 68 65 61 64 5d 2e 61 63 74 69 6f  Lookahead].actio
5640: 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 70 2d  n = action;.  p-
5650: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 2b 2b 3b 0a 7d  >nLookahead++;.}
5660: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20  ../*.** Add the 
5670: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20  transaction set 
5680: 62 75 69 6c 74 20 75 70 20 77 69 74 68 20 70 72  built up with pr
5690: 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 61 63 74  ior calls to act
56a0: 74 61 62 5f 61 63 74 69 6f 6e 28 29 0a 2a 2a 20  tab_action().** 
56b0: 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
56c0: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20   action table.  
56d0: 54 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 74  Then reset the t
56e0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62  ransaction set b
56f0: 61 63 6b 0a 2a 2a 20 74 6f 20 61 6e 20 65 6d 70  ack.** to an emp
5700: 74 79 20 73 65 74 20 69 6e 20 70 72 65 70 61 72  ty set in prepar
5710: 61 74 69 6f 6e 20 66 6f 72 20 61 20 6e 65 77 20  ation for a new 
5720: 72 6f 75 6e 64 20 6f 66 20 61 63 74 74 61 62 5f  round of acttab_
5730: 61 63 74 69 6f 6e 28 29 20 63 61 6c 6c 73 2e 0a  action() calls..
5740: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
5750: 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65   offset into the
5760: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66   action table of
5770: 20 74 68 65 20 6e 65 77 20 74 72 61 6e 73 61 63   the new transac
5780: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74  tion..*/.int act
5790: 74 61 62 5f 69 6e 73 65 72 74 28 61 63 74 74 61  tab_insert(actta
57a0: 62 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  b *p){.  int i, 
57b0: 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 61 73 73 65 72  j, k, n;.  asser
57c0: 74 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  t( p->nLookahead
57d0: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  >0 );..  /* Make
57e0: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 65 6e   sure we have en
57f0: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 68 6f  ough space to ho
5800: 6c 64 20 74 68 65 20 65 78 70 61 6e 64 65 64 20  ld the expanded 
5810: 61 63 74 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a  action table.  *
5820: 2a 20 69 6e 20 74 68 65 20 77 6f 72 73 74 20 63  * in the worst c
5830: 61 73 65 2e 20 20 54 68 65 20 77 6f 72 73 74 20  ase.  The worst 
5840: 63 61 73 65 20 6f 63 63 75 72 73 20 69 66 20 74  case occurs if t
5850: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
5860: 65 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  et.  ** must be 
5870: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
5880: 63 75 72 72 65 6e 74 20 61 63 74 69 6f 6e 20 74  current action t
5890: 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20  able.  */.  n = 
58a0: 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 2b  p->mxLookahead +
58b0: 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 41 63   1;.  if( p->nAc
58c0: 74 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d 3e 6e  tion + n >= p->n
58d0: 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ActionAlloc ){. 
58e0: 20 20 20 69 6e 74 20 6f 6c 64 41 6c 6c 6f 63 20     int oldAlloc 
58f0: 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  = p->nActionAllo
5900: 63 3b 0a 20 20 20 20 70 2d 3e 6e 41 63 74 69 6f  c;.    p->nActio
5910: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74  nAlloc = p->nAct
5920: 69 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e 6e 41 63  ion + n + p->nAc
5930: 74 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32 30 3b 0a  tionAlloc + 20;.
5940: 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 20 3d      p->aAction =
5950: 20 28 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65   (struct lookahe
5960: 61 64 5f 61 63 74 69 6f 6e 20 2a 29 20 72 65 61  ad_action *) rea
5970: 6c 6c 6f 63 28 20 70 2d 3e 61 41 63 74 69 6f 6e  lloc( p->aAction
5980: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5990: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
59a0: 6f 66 28 70 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d  of(p->aAction[0]
59b0: 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  )*p->nActionAllo
59c0: 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  c);.    if( p->a
59d0: 41 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20  Action==0 ){.   
59e0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
59f0: 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  r,"malloc failed
5a00: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74  \n");.      exit
5a10: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  (1);.    }.    f
5a20: 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63 3b 20 69  or(i=oldAlloc; i
5a30: 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63  <p->nActionAlloc
5a40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; i++){.      p-
5a50: 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b  >aAction[i].look
5a60: 61 68 65 61 64 20 3d 20 2d 31 3b 0a 20 20 20 20  ahead = -1;.    
5a70: 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e    p->aAction[i].
5a80: 61 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a 20 20 20  action = -1;.   
5a90: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61   }.  }..  /* Sca
5aa0: 6e 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 61  n the existing a
5ab0: 63 74 69 6f 6e 20 74 61 62 6c 65 20 6c 6f 6f 6b  ction table look
5ac0: 69 6e 67 20 66 6f 72 20 61 6e 20 6f 66 66 73 65  ing for an offse
5ad0: 74 20 74 68 61 74 20 69 73 20 61 20 0a 20 20 2a  t that is a .  *
5ae0: 2a 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74  * duplicate of t
5af0: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
5b00: 61 63 74 69 6f 6e 20 73 65 74 2e 20 20 46 61 6c  action set.  Fal
5b10: 6c 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  l out of the loo
5b20: 70 0a 20 20 2a 2a 20 69 66 20 61 6e 64 20 77 68  p.  ** if and wh
5b30: 65 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74 65  en the duplicate
5b40: 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a   is found..  **.
5b50: 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e    ** i is the in
5b60: 64 65 78 20 69 6e 20 70 2d 3e 61 41 63 74 69 6f  dex in p->aActio
5b70: 6e 5b 5d 20 77 68 65 72 65 20 70 2d 3e 6d 6e 4c  n[] where p->mnL
5b80: 6f 6f 6b 61 68 65 61 64 20 69 73 20 69 6e 73 65  ookahead is inse
5b90: 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  rted..  */.  for
5ba0: 28 69 3d 70 2d 3e 6e 41 63 74 69 6f 6e 2d 31 3b  (i=p->nAction-1;
5bb0: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
5bc0: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
5bd0: 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 70 2d  i].lookahead==p-
5be0: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a  >mnLookahead ){.
5bf0: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6c 6f 6f        /* All loo
5c00: 6b 61 68 65 61 64 73 20 61 6e 64 20 61 63 74 69  kaheads and acti
5c10: 6f 6e 73 20 69 6e 20 74 68 65 20 61 4c 6f 6f 6b  ons in the aLook
5c20: 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74  ahead[] transact
5c30: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73  ion.      ** mus
5c40: 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  t match against 
5c50: 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 61 41  the candidate aA
5c60: 63 74 69 6f 6e 5b 69 5d 20 65 6e 74 72 79 2e 20  ction[i] entry. 
5c70: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
5c80: 61 41 63 74 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f  aAction[i].actio
5c90: 6e 21 3d 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 29  n!=p->mnAction )
5ca0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
5cb0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
5cc0: 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29 7b  Lookahead; j++){
5cd0: 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 70 2d 3e  .        k = p->
5ce0: 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f  aLookahead[j].lo
5cf0: 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c  okahead - p->mnL
5d00: 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20  ookahead + i;.  
5d10: 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20 7c 7c        if( k<0 ||
5d20: 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29   k>=p->nAction )
5d30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5d40: 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  if( p->aLookahea
5d50: 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 21 3d  d[j].lookahead!=
5d60: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f  p->aAction[k].lo
5d70: 6f 6b 61 68 65 61 64 20 29 20 62 72 65 61 6b 3b  okahead ) break;
5d80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
5d90: 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 61 63  aLookahead[j].ac
5da0: 74 69 6f 6e 21 3d 70 2d 3e 61 41 63 74 69 6f 6e  tion!=p->aAction
5db0: 5b 6b 5d 2e 61 63 74 69 6f 6e 20 29 20 62 72 65  [k].action ) bre
5dc0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5dd0: 20 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b    if( j<p->nLook
5de0: 61 68 65 61 64 20 29 20 63 6f 6e 74 69 6e 75 65  ahead ) continue
5df0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 70  ;..      /* No p
5e00: 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b 61 68 65 61  ossible lookahea
5e10: 64 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 20  d value that is 
5e20: 6e 6f 74 20 69 6e 20 74 68 65 20 61 4c 6f 6f 6b  not in the aLook
5e30: 61 68 65 61 64 5b 5d 0a 20 20 20 20 20 20 2a 2a  ahead[].      **
5e40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5e50: 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68  allowed to match
5e60: 20 61 41 63 74 69 6f 6e 5b 69 5d 20 2a 2f 0a 20   aAction[i] */. 
5e70: 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20       n = 0;.    
5e80: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
5e90: 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20  nAction; j++){. 
5ea0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41         if( p->aA
5eb0: 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65  ction[j].lookahe
5ec0: 61 64 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ad<0 ) continue;
5ed0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
5ee0: 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61  aAction[j].looka
5ef0: 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f  head==j+p->mnLoo
5f00: 6b 61 68 65 61 64 2d 69 20 29 20 6e 2b 2b 3b 0a  kahead-i ) n++;.
5f10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5f20: 28 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  ( n==p->nLookahe
5f30: 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ad ){.        br
5f40: 65 61 6b 3b 20 20 2f 2a 20 41 6e 20 65 78 61 63  eak;  /* An exac
5f50: 74 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  t match is found
5f60: 20 61 74 20 6f 66 66 73 65 74 20 69 20 2a 2f 0a   at offset i */.
5f70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5f80: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 78  }..  /* If no ex
5f90: 69 73 74 69 6e 67 20 6f 66 66 73 65 74 73 20 65  isting offsets e
5fa0: 78 61 63 74 6c 79 20 6d 61 74 63 68 20 74 68 65  xactly match the
5fb0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
5fc0: 74 69 6f 6e 2c 20 66 69 6e 64 20 61 6e 0a 20 20  tion, find an.  
5fd0: 2a 2a 20 61 6e 20 65 6d 70 74 79 20 6f 66 66 73  ** an empty offs
5fe0: 65 74 20 69 6e 20 74 68 65 20 61 41 63 74 69 6f  et in the aActio
5ff0: 6e 5b 5d 20 74 61 62 6c 65 20 69 6e 20 77 68 69  n[] table in whi
6000: 63 68 20 77 65 20 63 61 6e 20 61 64 64 20 74 68  ch we can add th
6010: 65 0a 20 20 2a 2a 20 61 4c 6f 6f 6b 61 68 65 61  e.  ** aLookahea
6020: 64 5b 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  d[] transaction.
6030: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 3c 30 20  .  */.  if( i<0 
6040: 29 7b 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66  ){.    /* Look f
6050: 6f 72 20 68 6f 6c 65 73 20 69 6e 20 74 68 65 20  or holes in the 
6060: 61 41 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20  aAction[] table 
6070: 74 68 61 74 20 66 69 74 20 74 68 65 20 63 75 72  that fit the cur
6080: 72 65 6e 74 0a 20 20 20 20 2a 2a 20 61 4c 6f 6f  rent.    ** aLoo
6090: 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63  kahead[] transac
60a0: 74 69 6f 6e 2e 20 20 4c 65 61 76 65 20 69 20 73  tion.  Leave i s
60b0: 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  et to the offset
60c0: 20 6f 66 20 74 68 65 20 68 6f 6c 65 2e 0a 20 20   of the hole..  
60d0: 20 20 2a 2a 20 49 66 20 6e 6f 20 68 6f 6c 65 73    ** If no holes
60e0: 20 61 72 65 20 66 6f 75 6e 64 2c 20 69 20 69 73   are found, i is
60f0: 20 6c 65 66 74 20 61 74 20 70 2d 3e 6e 41 63 74   left at p->nAct
6100: 69 6f 6e 2c 20 77 68 69 63 68 20 6d 65 61 6e 73  ion, which means
6110: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
6120: 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
6130: 61 70 70 65 6e 64 65 64 2e 20 2a 2f 0a 20 20 20  appended. */.   
6140: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
6150: 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2d 20 70 2d  ActionAlloc - p-
6160: 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b 20 69 2b  >mxLookahead; i+
6170: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
6180: 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b  >aAction[i].look
6190: 61 68 65 61 64 3c 30 20 29 7b 0a 20 20 20 20 20  ahead<0 ){.     
61a0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
61b0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b  >nLookahead; j++
61c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d  ){.          k =
61d0: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a   p->aLookahead[j
61e0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d  ].lookahead - p-
61f0: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69  >mnLookahead + i
6200: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
6210: 6b 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  k<0 ) break;.   
6220: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41         if( p->aA
6230: 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65  ction[k].lookahe
6240: 61 64 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ad>=0 ) break;. 
6250: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6260: 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61   if( j<p->nLooka
6270: 68 65 61 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  head ) continue;
6280: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
6290: 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f 6e 3b 20  ; j<p->nAction; 
62a0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
62b0: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a  if( p->aAction[j
62c0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b 70  ].lookahead==j+p
62d0: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69 20  ->mnLookahead-i 
62e0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
62f0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
6300: 3d 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 7b 0a  ==p->nAction ){.
6310: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6320: 20 20 2f 2a 20 46 69 74 73 20 69 6e 20 65 6d 70    /* Fits in emp
6330: 74 79 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 20 20  ty slots */.    
6340: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6350: 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73    }.  }.  /* Ins
6360: 65 72 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ert transaction 
6370: 73 65 74 20 61 74 20 69 6e 64 65 78 20 69 2e 20  set at index i. 
6380: 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  */.  for(j=0; j<
6390: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a  p->nLookahead; j
63a0: 2b 2b 29 7b 0a 20 20 20 20 6b 20 3d 20 70 2d 3e  ++){.    k = p->
63b0: 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f  aLookahead[j].lo
63c0: 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c  okahead - p->mnL
63d0: 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20  ookahead + i;.  
63e0: 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 20    p->aAction[k] 
63f0: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
6400: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70  j];.    if( k>=p
6410: 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 70 2d 3e 6e  ->nAction ) p->n
6420: 41 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b 0a 20 20  Action = k+1;.  
6430: 7d 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  }.  p->nLookahea
6440: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 74  d = 0;..  /* Ret
6450: 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 74  urn the offset t
6460: 68 61 74 20 69 73 20 61 64 64 65 64 20 74 6f 20  hat is added to 
6470: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e  the lookahead in
6480: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
6490: 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 6e 74  e.  ** index int
64a0: 6f 20 79 79 5f 61 63 74 69 6f 6e 20 6f 66 20 74  o yy_action of t
64b0: 68 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72  he action */.  r
64c0: 65 74 75 72 6e 20 69 20 2d 20 70 2d 3e 6d 6e 4c  eturn i - p->mnL
64d0: 6f 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 2a  ookahead;.}../**
64e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64f0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
6500: 6c 65 20 22 62 75 69 6c 64 2e 63 22 20 2a 2a 2a  le "build.c" ***
6510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
6530: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 63 6f  * Routines to co
6540: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20 66  nstruction the f
6550: 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68  inite state mach
6560: 69 6e 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f  ine for the LEMO
6570: 4e 0a 2a 2a 20 70 61 72 73 65 72 20 67 65 6e 65  N.** parser gene
6580: 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69  rator..*/../* Fi
6590: 6e 64 20 61 20 70 72 65 63 65 64 65 6e 63 65 20  nd a precedence 
65a0: 73 79 6d 62 6f 6c 20 6f 66 20 65 76 65 72 79 20  symbol of every 
65b0: 72 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d  rule in the gram
65c0: 6d 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 6f 73  mar..** .** Thos
65d0: 65 20 72 75 6c 65 73 20 77 68 69 63 68 20 68 61  e rules which ha
65e0: 76 65 20 61 20 70 72 65 63 65 64 65 6e 63 65 20  ve a precedence 
65f0: 73 79 6d 62 6f 6c 20 63 6f 64 65 64 20 69 6e 20  symbol coded in 
6600: 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 67 72 61  the input.** gra
6610: 6d 6d 61 72 20 75 73 69 6e 67 20 74 68 65 20 22  mmar using the "
6620: 5b 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74 72  [symbol]" constr
6630: 75 63 74 20 77 69 6c 6c 20 61 6c 72 65 61 64 79  uct will already
6640: 20 68 61 76 65 20 74 68 65 0a 2a 2a 20 72 70 2d   have the.** rp-
6650: 3e 70 72 65 63 73 79 6d 20 66 69 65 6c 64 20 66  >precsym field f
6660: 69 6c 6c 65 64 2e 20 20 4f 74 68 65 72 20 72 75  illed.  Other ru
6670: 6c 65 73 20 74 61 6b 65 20 61 73 20 74 68 65 69  les take as thei
6680: 72 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20  r precedence.** 
6690: 73 79 6d 62 6f 6c 20 74 68 65 20 66 69 72 73 74  symbol the first
66a0: 20 52 48 53 20 73 79 6d 62 6f 6c 20 77 69 74 68   RHS symbol with
66b0: 20 61 20 64 65 66 69 6e 65 64 20 70 72 65 63 65   a defined prece
66c0: 64 65 6e 63 65 2e 20 20 49 66 20 74 68 65 72 65  dence.  If there
66d0: 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 52 48 53 20  .** are not RHS 
66e0: 73 79 6d 62 6f 6c 73 20 77 69 74 68 20 61 20 64  symbols with a d
66f0: 65 66 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63  efined precedenc
6700: 65 2c 20 74 68 65 20 70 72 65 63 65 64 65 6e 63  e, the precedenc
6710: 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66 69 65 6c  e.** symbol fiel
6720: 64 20 69 73 20 6c 65 66 74 20 62 6c 61 6e 6b 2e  d is left blank.
6730: 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c  .*/.void FindRul
6740: 65 50 72 65 63 65 64 65 6e 63 65 73 28 73 74 72  ePrecedences(str
6750: 75 63 74 20 6c 65 6d 6f 6e 20 2a 78 70 29 0a 7b  uct lemon *xp).{
6760: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
6770: 72 70 3b 0a 20 20 66 6f 72 28 72 70 3d 78 70 2d  rp;.  for(rp=xp-
6780: 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
6790: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  ->next){.    if(
67a0: 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30 20   rp->precsym==0 
67b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20  ){.      int i, 
67c0: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  j;.      for(i=0
67d0: 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 20 26 26 20  ; i<rp->nrhs && 
67e0: 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30 3b 20  rp->precsym==0; 
67f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74  i++){.        st
6800: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
6810: 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20  = rp->rhs[i];.  
6820: 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79        if( sp->ty
6830: 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
6840: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  L ){.          f
6850: 6f 72 28 6a 3d 30 3b 20 6a 3c 73 70 2d 3e 6e 73  or(j=0; j<sp->ns
6860: 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ubsym; j++){.   
6870: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d           if( sp-
6880: 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 70 72 65 63  >subsym[j]->prec
6890: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
68a0: 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d       rp->precsym
68b0: 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d   = sp->subsym[j]
68c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
68d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
68e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
68f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
6900: 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20 29  f( sp->prec>=0 )
6910: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  {.          rp->
6920: 70 72 65 63 73 79 6d 20 3d 20 72 70 2d 3e 72 68  precsym = rp->rh
6930: 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  s[i];.        }.
6940: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6950: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
6960: 2a 20 46 69 6e 64 20 61 6c 6c 20 6e 6f 6e 74 65  * Find all nonte
6970: 72 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 77 69  rminals which wi
6980: 6c 6c 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  ll generate the 
6990: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a  empty string..**
69a0: 20 54 68 65 6e 20 67 6f 20 62 61 63 6b 20 61 6e   Then go back an
69b0: 64 20 63 6f 6d 70 75 74 65 20 74 68 65 20 66 69  d compute the fi
69c0: 72 73 74 20 73 65 74 73 20 6f 66 20 65 76 65 72  rst sets of ever
69d0: 79 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a  y nonterminal..*
69e0: 2a 20 54 68 65 20 66 69 72 73 74 20 73 65 74 20  * The first set 
69f0: 69 73 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c  is the set of al
6a00: 6c 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f  l terminal symbo
6a10: 6c 73 20 77 68 69 63 68 20 63 61 6e 20 62 65 67  ls which can beg
6a20: 69 6e 0a 2a 2a 20 61 20 73 74 72 69 6e 67 20 67  in.** a string g
6a30: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 61 74  enerated by that
6a40: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2f   nonterminal..*/
6a50: 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53  .void FindFirstS
6a60: 65 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ets(struct lemon
6a70: 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20   *lemp).{.  int 
6a80: 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74 20 72  i, j;.  struct r
6a90: 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74 20 70  ule *rp;.  int p
6aa0: 72 6f 67 72 65 73 73 3b 0a 0a 20 20 66 6f 72 28  rogress;..  for(
6ab0: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
6ac0: 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
6ad0: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
6ae0: 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e  ->lambda = LEMON
6af0: 5f 46 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 66 6f  _FALSE;.  }.  fo
6b00: 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  r(i=lemp->ntermi
6b10: 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  nal; i<lemp->nsy
6b20: 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
6b30: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
6b40: 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 53 65 74  ->firstset = Set
6b50: 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  New();.  }..  /*
6b60: 20 46 69 72 73 74 20 63 6f 6d 70 75 74 65 20 61   First compute a
6b70: 6c 6c 20 6c 61 6d 62 64 61 73 20 2a 2f 0a 20 20  ll lambdas */.  
6b80: 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73  do{.    progress
6b90: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 72 70   = 0;.    for(rp
6ba0: 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
6bb0: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
6bc0: 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73       if( rp->lhs
6bd0: 2d 3e 6c 61 6d 62 64 61 20 29 20 63 6f 6e 74 69  ->lambda ) conti
6be0: 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  nue;.      for(i
6bf0: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
6c00: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74  i++){.        st
6c10: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
6c20: 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20  = rp->rhs[i];.  
6c30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 70        assert( sp
6c40: 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49  ->type==NONTERMI
6c50: 4e 41 4c 20 7c 7c 20 73 70 2d 3e 6c 61 6d 62 64  NAL || sp->lambd
6c60: 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29  a==LEMON_FALSE )
6c70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 70  ;.        if( sp
6c80: 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f  ->lambda==LEMON_
6c90: 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 20  FALSE ) break;. 
6ca0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6cb0: 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 7b 0a   i==rp->nrhs ){.
6cc0: 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d          rp->lhs-
6cd0: 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f  >lambda = LEMON_
6ce0: 54 52 55 45 3b 0a 20 20 20 20 20 20 20 20 70 72  TRUE;.        pr
6cf0: 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20  ogress = 1;.    
6d00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69    }.    }.  }whi
6d10: 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a  le( progress );.
6d20: 0a 20 20 2f 2a 20 4e 6f 77 20 63 6f 6d 70 75 74  .  /* Now comput
6d30: 65 20 61 6c 6c 20 66 69 72 73 74 20 73 65 74 73  e all first sets
6d40: 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 73 74   */.  do{.    st
6d50: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 31 2c  ruct symbol *s1,
6d60: 20 2a 73 32 3b 0a 20 20 20 20 70 72 6f 67 72 65   *s2;.    progre
6d70: 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ss = 0;.    for(
6d80: 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
6d90: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
6da0: 0a 20 20 20 20 20 20 73 31 20 3d 20 72 70 2d 3e  .      s1 = rp->
6db0: 6c 68 73 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  lhs;.      for(i
6dc0: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
6dd0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 32  i++){.        s2
6de0: 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
6df0: 20 20 20 20 20 20 20 69 66 28 20 73 32 2d 3e 74         if( s2->t
6e00: 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b  ype==TERMINAL ){
6e10: 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72  .          progr
6e20: 65 73 73 20 2b 3d 20 53 65 74 41 64 64 28 73 31  ess += SetAdd(s1
6e30: 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 69  ->firstset,s2->i
6e40: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  ndex);.         
6e50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6e60: 7d 65 6c 73 65 20 69 66 28 20 73 32 2d 3e 74 79  }else if( s2->ty
6e70: 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
6e80: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  L ){.          f
6e90: 6f 72 28 6a 3d 30 3b 20 6a 3c 73 32 2d 3e 6e 73  or(j=0; j<s2->ns
6ea0: 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ubsym; j++){.   
6eb0: 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73           progres
6ec0: 73 20 2b 3d 20 53 65 74 41 64 64 28 73 31 2d 3e  s += SetAdd(s1->
6ed0: 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 73 75 62  firstset,s2->sub
6ee0: 73 79 6d 5b 6a 5d 2d 3e 69 6e 64 65 78 29 3b 0a  sym[j]->index);.
6ef0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6f00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6f10: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
6f20: 31 3d 3d 73 32 20 29 7b 0a 20 20 20 20 20 20 20  1==s2 ){.       
6f30: 20 20 20 69 66 28 20 73 31 2d 3e 6c 61 6d 62 64     if( s1->lambd
6f40: 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29  a==LEMON_FALSE )
6f50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6f60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6f70: 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74   progress += Set
6f80: 55 6e 69 6f 6e 28 73 31 2d 3e 66 69 72 73 74 73  Union(s1->firsts
6f90: 65 74 2c 73 32 2d 3e 66 69 72 73 74 73 65 74 29  et,s2->firstset)
6fa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
6fb0: 73 32 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f  s2->lambda==LEMO
6fc0: 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b  N_FALSE ) break;
6fd0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6fe0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
6ff0: 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 20  e( progress );. 
7000: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43   return;.}../* C
7010: 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29  ompute all LR(0)
7020: 20 73 74 61 74 65 73 20 66 6f 72 20 74 68 65 20   states for the 
7030: 67 72 61 6d 6d 61 72 2e 20 20 4c 69 6e 6b 73 0a  grammar.  Links.
7040: 2a 2a 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ** are added to 
7050: 62 65 74 77 65 65 6e 20 73 6f 6d 65 20 73 74 61  between some sta
7060: 74 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  tes so that the 
7070: 4c 52 28 31 29 20 66 6f 6c 6c 6f 77 20 73 65 74  LR(1) follow set
7080: 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 6f 6d 70  s.** can be comp
7090: 75 74 65 64 20 6c 61 74 65 72 2e 0a 2a 2f 0a 50  uted later..*/.P
70a0: 52 49 56 41 54 45 20 73 74 72 75 63 74 20 73 74  RIVATE struct st
70b0: 61 74 65 20 2a 67 65 74 73 74 61 74 65 28 73 74  ate *getstate(st
70c0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 20 20  ruct lemon *);  
70d0: 2f 2a 20 66 6f 72 77 61 72 64 20 72 65 66 65 72  /* forward refer
70e0: 65 6e 63 65 20 2a 2f 0a 76 6f 69 64 20 46 69 6e  ence */.void Fin
70f0: 64 53 74 61 74 65 73 28 73 74 72 75 63 74 20 6c  dStates(struct l
7100: 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
7110: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
7120: 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  p;.  struct rule
7130: 20 2a 72 70 3b 0a 0a 20 20 43 6f 6e 66 69 67 6c   *rp;..  Configl
7140: 69 73 74 5f 69 6e 69 74 28 29 3b 0a 0a 20 20 2f  ist_init();..  /
7150: 2a 20 46 69 6e 64 20 74 68 65 20 73 74 61 72 74  * Find the start
7160: 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 66 28   symbol */.  if(
7170: 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a   lemp->start ){.
7180: 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f      sp = Symbol_
7190: 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74  find(lemp->start
71a0: 29 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30  );.    if( sp==0
71b0: 20 29 7b 0a 20 20 20 20 20 20 45 72 72 6f 72 4d   ){.      ErrorM
71c0: 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  sg(lemp->filenam
71d0: 65 2c 30 2c 0a 22 54 68 65 20 73 70 65 63 69 66  e,0,."The specif
71e0: 69 65 64 20 73 74 61 72 74 20 73 79 6d 62 6f 6c  ied start symbol
71f0: 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 5c   \"%s\" is not \
7200: 0a 69 6e 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61  .in a nontermina
7210: 6c 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72  l of the grammar
7220: 2e 20 20 5c 22 25 73 5c 22 20 77 69 6c 6c 20 62  .  \"%s\" will b
7230: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 73 74  e used as the st
7240: 61 72 74 20 5c 0a 73 79 6d 62 6f 6c 20 69 6e 73  art \.symbol ins
7250: 74 65 61 64 2e 22 2c 6c 65 6d 70 2d 3e 73 74 61  tead.",lemp->sta
7260: 72 74 2c 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c  rt,lemp->rule->l
7270: 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  hs->name);.     
7280: 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
7290: 2b 3b 0a 20 20 20 20 20 20 73 70 20 3d 20 6c 65  +;.      sp = le
72a0: 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20  mp->rule->lhs;. 
72b0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
72c0: 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c    sp = lemp->rul
72d0: 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 0a 20 20 2f  e->lhs;.  }..  /
72e0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
72f0: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 64 6f 65  start symbol doe
7300: 73 6e 27 74 20 6f 63 63 75 72 20 6f 6e 20 74 68  sn't occur on th
7310: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
7320: 65 20 6f 66 0a 20 20 2a 2a 20 61 6e 79 20 72 75  e of.  ** any ru
7330: 6c 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  le.  Report an e
7340: 72 72 6f 72 20 69 66 20 69 74 20 64 6f 65 73 2e  rror if it does.
7350: 20 20 28 59 41 43 43 20 77 6f 75 6c 64 20 67 65    (YACC would ge
7360: 6e 65 72 61 74 65 20 61 20 6e 65 77 0a 20 20 2a  nerate a new.  *
7370: 2a 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 69  * start symbol i
7380: 6e 20 74 68 69 73 20 63 61 73 65 2e 29 20 2a 2f  n this case.) */
7390: 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
73a0: 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
73b0: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  >next){.    int 
73c0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
73d0: 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
73e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e  {.      if( rp->
73f0: 72 68 73 5b 69 5d 3d 3d 73 70 20 29 7b 20 20 20  rhs[i]==sp ){   
7400: 2f 2a 20 46 49 58 20 4d 45 3a 20 20 44 65 61 6c  /* FIX ME:  Deal
7410: 20 77 69 74 68 20 6d 75 6c 74 69 74 65 72 6d 69   with multitermi
7420: 6e 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  nals */.        
7430: 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
7440: 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20  ilename,0,."The 
7450: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25  start symbol \"%
7460: 73 5c 22 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  s\" occurs on th
7470: 65 20 5c 0a 72 69 67 68 74 2d 68 61 6e 64 20 73  e \.right-hand s
7480: 69 64 65 20 6f 66 20 61 20 72 75 6c 65 2e 20 54  ide of a rule. T
7490: 68 69 73 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  his will result 
74a0: 69 6e 20 61 20 70 61 72 73 65 72 20 77 68 69 63  in a parser whic
74b0: 68 20 5c 0a 64 6f 65 73 20 6e 6f 74 20 77 6f 72  h \.does not wor
74c0: 6b 20 70 72 6f 70 65 72 6c 79 2e 22 2c 73 70 2d  k properly.",sp-
74d0: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
74e0: 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
74f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7500: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62 61    }..  /* The ba
7510: 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  sis configuratio
7520: 6e 20 73 65 74 20 66 6f 72 20 74 68 65 20 66 69  n set for the fi
7530: 72 73 74 20 73 74 61 74 65 0a 20 20 2a 2a 20 69  rst state.  ** i
7540: 73 20 61 6c 6c 20 72 75 6c 65 73 20 77 68 69 63  s all rules whic
7550: 68 20 68 61 76 65 20 74 68 65 20 73 74 61 72 74  h have the start
7560: 20 73 79 6d 62 6f 6c 20 61 73 20 74 68 65 69 72   symbol as their
7570: 0a 20 20 2a 2a 20 6c 65 66 74 2d 68 61 6e 64 20  .  ** left-hand 
7580: 73 69 64 65 20 2a 2f 0a 20 20 66 6f 72 28 72 70  side */.  for(rp
7590: 3d 73 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  =sp->rule; rp; r
75a0: 70 3d 72 70 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a  p=rp->nextlhs){.
75b0: 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69      struct confi
75c0: 67 20 2a 6e 65 77 63 66 70 3b 0a 20 20 20 20 72  g *newcfp;.    r
75d0: 70 2d 3e 6c 68 73 53 74 61 72 74 20 3d 20 31 3b  p->lhsStart = 1;
75e0: 0a 20 20 20 20 6e 65 77 63 66 70 20 3d 20 43 6f  .    newcfp = Co
75f0: 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69  nfiglist_addbasi
7600: 73 28 72 70 2c 30 29 3b 0a 20 20 20 20 53 65 74  s(rp,0);.    Set
7610: 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c  Add(newcfp->fws,
7620: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  0);.  }..  /* Co
7630: 6d 70 75 74 65 20 74 68 65 20 66 69 72 73 74 20  mpute the first 
7640: 73 74 61 74 65 2e 20 20 41 6c 6c 20 6f 74 68 65  state.  All othe
7650: 72 20 73 74 61 74 65 73 20 77 69 6c 6c 20 62 65  r states will be
7660: 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 61  .  ** computed a
7670: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 75 72  utomatically dur
7680: 69 6e 67 20 74 68 65 20 63 6f 6d 70 75 74 61 74  ing the computat
7690: 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74  ion of the first
76a0: 20 6f 6e 65 2e 0a 20 20 2a 2a 20 54 68 65 20 72   one..  ** The r
76b0: 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20  eturned pointer 
76c0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 73 74 61  to the first sta
76d0: 74 65 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20  te is not used. 
76e0: 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 73 74  */.  (void)getst
76f0: 61 74 65 28 6c 65 6d 70 29 3b 0a 20 20 72 65 74  ate(lemp);.  ret
7700: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  urn;.}../* Retur
7710: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
7720: 20 73 74 61 74 65 20 77 68 69 63 68 20 69 73 20   state which is 
7730: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 68 65  described by the
7740: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 2a   configuration.*
7750: 2a 20 6c 69 73 74 20 77 68 69 63 68 20 68 61 73  * list which has
7760: 20 62 65 65 6e 20 62 75 69 6c 74 20 66 72 6f 6d   been built from
7770: 20 63 61 6c 6c 73 20 74 6f 20 43 6f 6e 66 69 67   calls to Config
7780: 6c 69 73 74 5f 61 64 64 2e 0a 2a 2f 0a 50 52 49  list_add..*/.PRI
7790: 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73  VATE void builds
77a0: 68 69 66 74 73 28 73 74 72 75 63 74 20 6c 65 6d  hifts(struct lem
77b0: 6f 6e 20 2a 2c 20 73 74 72 75 63 74 20 73 74 61  on *, struct sta
77c0: 74 65 20 2a 29 3b 20 2f 2a 20 46 6f 72 77 64 20  te *); /* Forwd 
77d0: 72 65 66 20 2a 2f 0a 50 52 49 56 41 54 45 20 73  ref */.PRIVATE s
77e0: 74 72 75 63 74 20 73 74 61 74 65 20 2a 67 65 74  truct state *get
77f0: 73 74 61 74 65 28 73 74 72 75 63 74 20 6c 65 6d  state(struct lem
7800: 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74  on *lemp).{.  st
7810: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
7820: 2c 20 2a 62 70 3b 0a 20 20 73 74 72 75 63 74 20  , *bp;.  struct 
7830: 73 74 61 74 65 20 2a 73 74 70 3b 0a 0a 20 20 2f  state *stp;..  /
7840: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 73 6f  * Extract the so
7850: 72 74 65 64 20 62 61 73 69 73 20 6f 66 20 74 68  rted basis of th
7860: 65 20 6e 65 77 20 73 74 61 74 65 2e 20 20 54 68  e new state.  Th
7870: 65 20 62 61 73 69 73 20 77 61 73 20 63 6f 6e 73  e basis was cons
7880: 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 62 79 20  tructed.  ** by 
7890: 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 22  prior calls to "
78a0: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61  Configlist_addba
78b0: 73 69 73 28 29 22 2e 20 2a 2f 0a 20 20 43 6f 6e  sis()". */.  Con
78c0: 66 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69  figlist_sortbasi
78d0: 73 28 29 3b 0a 20 20 62 70 20 3d 20 43 6f 6e 66  s();.  bp = Conf
78e0: 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29 3b 0a  iglist_basis();.
78f0: 0a 20 20 2f 2a 20 47 65 74 20 61 20 73 74 61 74  .  /* Get a stat
7900: 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
7910: 62 61 73 69 73 20 2a 2f 0a 20 20 73 74 70 20 3d  basis */.  stp =
7920: 20 53 74 61 74 65 5f 66 69 6e 64 28 62 70 29 3b   State_find(bp);
7930: 0a 20 20 69 66 28 20 73 74 70 20 29 7b 0a 20 20  .  if( stp ){.  
7940: 20 20 2f 2a 20 41 20 73 74 61 74 65 20 77 69 74    /* A state wit
7950: 68 20 74 68 65 20 73 61 6d 65 20 62 61 73 69 73  h the same basis
7960: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 21   already exists!
7970: 20 20 43 6f 70 79 20 61 6c 6c 20 74 68 65 20 66    Copy all the f
7980: 6f 6c 6c 6f 77 2d 73 65 74 0a 20 20 20 20 2a 2a  ollow-set.    **
7990: 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e   propagation lin
79a0: 6b 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74  ks from the stat
79b0: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
79c0: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 0a 20 20  tion into the.  
79d0: 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69 6e 67    ** preexisting
79e0: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 72 65 74   state, then ret
79f0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
7a00: 20 74 68 65 20 70 72 65 65 78 69 73 74 69 6e 67   the preexisting
7a10: 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74   state */.    st
7a20: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 78 2c 20  ruct config *x, 
7a30: 2a 79 3b 0a 20 20 20 20 66 6f 72 28 78 3d 62 70  *y;.    for(x=bp
7a40: 2c 20 79 3d 73 74 70 2d 3e 62 70 3b 20 78 20 26  , y=stp->bp; x &
7a50: 26 20 79 3b 20 78 3d 78 2d 3e 62 70 2c 20 79 3d  & y; x=x->bp, y=
7a60: 79 2d 3e 62 70 29 7b 0a 20 20 20 20 20 20 50 6c  y->bp){.      Pl
7a70: 69 6e 6b 5f 63 6f 70 79 28 26 79 2d 3e 62 70 6c  ink_copy(&y->bpl
7a80: 70 2c 78 2d 3e 62 70 6c 70 29 3b 0a 20 20 20 20  p,x->bplp);.    
7a90: 20 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 78    Plink_delete(x
7aa0: 2d 3e 66 70 6c 70 29 3b 0a 20 20 20 20 20 20 78  ->fplp);.      x
7ab0: 2d 3e 66 70 6c 70 20 3d 20 78 2d 3e 62 70 6c 70  ->fplp = x->bplp
7ac0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
7ad0: 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74  cfp = Configlist
7ae0: 5f 72 65 74 75 72 6e 28 29 3b 0a 20 20 20 20 43  _return();.    C
7af0: 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 63 66  onfiglist_eat(cf
7b00: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
7b10: 20 2f 2a 20 54 68 69 73 20 72 65 61 6c 6c 79 20   /* This really 
7b20: 69 73 20 61 20 6e 65 77 20 73 74 61 74 65 2e 20  is a new state. 
7b30: 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20 74   Construct all t
7b40: 68 65 20 64 65 74 61 69 6c 73 20 2a 2f 0a 20 20  he details */.  
7b50: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f    Configlist_clo
7b60: 73 75 72 65 28 6c 65 6d 70 29 3b 20 20 20 20 2f  sure(lemp);    /
7b70: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
7b80: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73  nfiguration clos
7b90: 75 72 65 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69  ure */.    Confi
7ba0: 67 6c 69 73 74 5f 73 6f 72 74 28 29 3b 20 20 20  glist_sort();   
7bb0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 20          /* Sort 
7bc0: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
7bd0: 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20  n closure */.   
7be0: 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73   cfp = Configlis
7bf0: 74 5f 72 65 74 75 72 6e 28 29 3b 20 20 20 2f 2a  t_return();   /*
7c00: 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74   Get a pointer t
7c10: 6f 20 74 68 65 20 63 6f 6e 66 69 67 20 6c 69 73  o the config lis
7c20: 74 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 53  t */.    stp = S
7c30: 74 61 74 65 5f 6e 65 77 28 29 3b 20 20 20 20 20  tate_new();     
7c40: 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73        /* A new s
7c50: 74 61 74 65 20 73 74 72 75 63 74 75 72 65 20 2a  tate structure *
7c60: 2f 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68 65 63  /.    MemoryChec
7c70: 6b 28 73 74 70 29 3b 0a 20 20 20 20 73 74 70 2d  k(stp);.    stp-
7c80: 3e 62 70 20 3d 20 62 70 3b 20 20 20 20 20 20 20  >bp = bp;       
7c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65           /* Reme
7ca0: 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75  mber the configu
7cb0: 72 61 74 69 6f 6e 20 62 61 73 69 73 20 2a 2f 0a  ration basis */.
7cc0: 20 20 20 20 73 74 70 2d 3e 63 66 70 20 3d 20 63      stp->cfp = c
7cd0: 66 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fp;             
7ce0: 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65   /* Remember the
7cf0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
7d00: 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 73 74  losure */.    st
7d10: 70 2d 3e 73 74 61 74 65 6e 75 6d 20 3d 20 6c 65  p->statenum = le
7d20: 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b 3b 20 2f 2a  mp->nstate++; /*
7d30: 20 45 76 65 72 79 20 73 74 61 74 65 20 67 65 74   Every state get
7d40: 73 20 61 20 73 65 71 75 65 6e 63 65 20 6e 75 6d  s a sequence num
7d50: 62 65 72 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e  ber */.    stp->
7d60: 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ap = 0;         
7d70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61 63          /* No ac
7d80: 74 69 6f 6e 73 2c 20 79 65 74 2e 20 2a 2f 0a 20  tions, yet. */. 
7d90: 20 20 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28     State_insert(
7da0: 73 74 70 2c 73 74 70 2d 3e 62 70 29 3b 20 20 20  stp,stp->bp);   
7db0: 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20 73 74  /* Add to the st
7dc0: 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ate table */.   
7dd0: 20 62 75 69 6c 64 73 68 69 66 74 73 28 6c 65 6d   buildshifts(lem
7de0: 70 2c 73 74 70 29 3b 20 20 20 20 20 20 20 2f 2a  p,stp);       /*
7df0: 20 52 65 63 75 72 73 69 76 65 6c 79 20 63 6f 6d   Recursively com
7e00: 70 75 74 65 20 73 75 63 63 65 73 73 6f 72 20 73  pute successor s
7e10: 74 61 74 65 73 20 2a 2f 0a 20 20 7d 0a 20 20 72  tates */.  }.  r
7e20: 65 74 75 72 6e 20 73 74 70 3b 0a 7d 0a 0a 2f 2a  eturn stp;.}../*
7e30: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
7e40: 69 66 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20 61  if two symbols a
7e50: 72 65 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a  re the same..*/.
7e60: 69 6e 74 20 73 61 6d 65 5f 73 79 6d 62 6f 6c 28  int same_symbol(
7e70: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 61  struct symbol *a
7e80: 2c 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  , struct symbol 
7e90: 2a 62 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *b).{.  int i;. 
7ea0: 20 69 66 28 20 61 3d 3d 62 20 29 20 72 65 74 75   if( a==b ) retu
7eb0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 61 2d 3e 74  rn 1;.  if( a->t
7ec0: 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype!=MULTITERMIN
7ed0: 41 4c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  AL ) return 0;. 
7ee0: 20 69 66 28 20 62 2d 3e 74 79 70 65 21 3d 4d 55   if( b->type!=MU
7ef0: 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 20 72 65  LTITERMINAL ) re
7f00: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 61 2d  turn 0;.  if( a-
7f10: 3e 6e 73 75 62 73 79 6d 21 3d 62 2d 3e 6e 73 75  >nsubsym!=b->nsu
7f20: 62 73 79 6d 20 29 20 72 65 74 75 72 6e 20 30 3b  bsym ) return 0;
7f30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 2d  .  for(i=0; i<a-
7f40: 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a  >nsubsym; i++){.
7f50: 20 20 20 20 69 66 28 20 61 2d 3e 73 75 62 73 79      if( a->subsy
7f60: 6d 5b 69 5d 21 3d 62 2d 3e 73 75 62 73 79 6d 5b  m[i]!=b->subsym[
7f70: 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  i] ) return 0;. 
7f80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
7f90: 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  ../* Construct a
7fa0: 6c 6c 20 73 75 63 63 65 73 73 6f 72 20 73 74 61  ll successor sta
7fb0: 74 65 73 20 74 6f 20 74 68 65 20 67 69 76 65 6e  tes to the given
7fc0: 20 73 74 61 74 65 2e 20 20 41 20 22 73 75 63 63   state.  A "succ
7fd0: 65 73 73 6f 72 22 0a 2a 2a 20 73 74 61 74 65 20  essor".** state 
7fe0: 69 73 20 61 6e 79 20 73 74 61 74 65 20 77 68 69  is any state whi
7ff0: 63 68 20 63 61 6e 20 62 65 20 72 65 61 63 68 65  ch can be reache
8000: 64 20 62 79 20 61 20 73 68 69 66 74 20 61 63 74  d by a shift act
8010: 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ion..*/.PRIVATE 
8020: 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74 73  void buildshifts
8030: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
8040: 65 6d 70 2c 20 73 74 72 75 63 74 20 73 74 61 74  emp, struct stat
8050: 65 20 2a 73 74 70 29 0a 7b 0a 20 20 73 74 72 75  e *stp).{.  stru
8060: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20  ct config *cfp; 
8070: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
8080: 74 68 72 75 20 74 68 65 20 63 6f 6e 66 69 67 20  thru the config 
8090: 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22  closure of "stp"
80a0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   */.  struct con
80b0: 66 69 67 20 2a 62 63 66 70 3b 20 2f 2a 20 46 6f  fig *bcfp; /* Fo
80c0: 72 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  r the inner loop
80d0: 20 6f 6e 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75   on config closu
80e0: 72 65 20 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20  re of "stp" */. 
80f0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
8100: 6e 65 77 63 66 67 3b 20 20 2f 2a 20 2a 2f 0a 20  newcfg;  /* */. 
8110: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
8120: 73 70 3b 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20  sp;   /* Symbol 
8130: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f  following the do
8140: 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69  t in configurati
8150: 6f 6e 20 22 63 66 70 22 20 2a 2f 0a 20 20 73 74  on "cfp" */.  st
8160: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62 73 70  ruct symbol *bsp
8170: 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c  ;  /* Symbol fol
8180: 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74 20 69  lowing the dot i
8190: 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  n configuration 
81a0: 22 62 63 66 70 22 20 2a 2f 0a 20 20 73 74 72 75  "bcfp" */.  stru
81b0: 63 74 20 73 74 61 74 65 20 2a 6e 65 77 73 74 70  ct state *newstp
81c0: 3b 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74  ; /* A pointer t
81d0: 6f 20 61 20 73 75 63 63 65 73 73 6f 72 20 73 74  o a successor st
81e0: 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 61 63  ate */..  /* Eac
81f0: 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  h configuration 
8200: 62 65 63 6f 6d 65 73 20 63 6f 6d 70 6c 65 74 65  becomes complete
8210: 20 61 66 74 65 72 20 69 74 20 63 6f 6e 74 69 62   after it contib
8220: 75 74 65 73 20 74 6f 20 61 20 73 75 63 63 65 73  utes to a succes
8230: 73 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20  sor.  ** state. 
8240: 20 49 6e 69 74 69 61 6c 6c 79 2c 20 61 6c 6c 20   Initially, all 
8250: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61  configurations a
8260: 72 65 20 69 6e 63 6f 6d 70 6c 65 74 65 20 2a 2f  re incomplete */
8270: 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e  .  for(cfp=stp->
8280: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
8290: 70 2d 3e 6e 65 78 74 29 20 63 66 70 2d 3e 73 74  p->next) cfp->st
82a0: 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54  atus = INCOMPLET
82b0: 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  E;..  /* Loop th
82c0: 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6e 66 69 67  rough all config
82d0: 75 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  urations of the 
82e0: 73 74 61 74 65 20 22 73 74 70 22 20 2a 2f 0a 20  state "stp" */. 
82f0: 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66   for(cfp=stp->cf
8300: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
8310: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  >next){.    if( 
8320: 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d  cfp->status==COM
8330: 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65  PLETE ) continue
8340: 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20  ;    /* Already 
8350: 75 73 65 64 20 62 79 20 69 6e 6e 65 72 20 6c 6f  used by inner lo
8360: 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 66  op */.    if( cf
8370: 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d 3e 72 70 2d  p->dot>=cfp->rp-
8380: 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65  >nrhs ) continue
8390: 3b 20 20 2f 2a 20 43 61 6e 27 74 20 73 68 69 66  ;  /* Can't shif
83a0: 74 20 74 68 69 73 20 63 6f 6e 66 69 67 20 2a 2f  t this config */
83b0: 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  .    Configlist_
83c0: 72 65 73 65 74 28 29 3b 20 20 20 20 20 20 20 20  reset();        
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
83e0: 20 52 65 73 65 74 20 74 68 65 20 6e 65 77 20 63   Reset the new c
83f0: 6f 6e 66 69 67 20 73 65 74 20 2a 2f 0a 20 20 20  onfig set */.   
8400: 20 73 70 20 3d 20 63 66 70 2d 3e 72 70 2d 3e 72   sp = cfp->rp->r
8410: 68 73 5b 63 66 70 2d 3e 64 6f 74 5d 3b 20 20 20  hs[cfp->dot];   
8420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d            /* Sym
8430: 62 6f 6c 20 61 66 74 65 72 20 74 68 65 20 64 6f  bol after the do
8440: 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 6f 72  t */..    /* For
8450: 20 65 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61   every configura
8460: 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74 61 74  tion in the stat
8470: 65 20 22 73 74 70 22 20 77 68 69 63 68 20 68 61  e "stp" which ha
8480: 73 20 74 68 65 20 73 79 6d 62 6f 6c 20 22 73 70  s the symbol "sp
8490: 22 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  ".    ** followi
84a0: 6e 67 20 69 74 73 20 64 6f 74 2c 20 61 64 64 20  ng its dot, add 
84b0: 74 68 65 20 73 61 6d 65 20 63 6f 6e 66 69 67 75  the same configu
84c0: 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 62 61  ration to the ba
84d0: 73 69 73 20 73 65 74 20 75 6e 64 65 72 0a 20 20  sis set under.  
84e0: 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f    ** constructio
84f0: 6e 20 62 75 74 20 77 69 74 68 20 74 68 65 20 64  n but with the d
8500: 6f 74 20 73 68 69 66 74 65 64 20 6f 6e 65 20 73  ot shifted one s
8510: 79 6d 62 6f 6c 20 74 6f 20 74 68 65 20 72 69 67  ymbol to the rig
8520: 68 74 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 62  ht. */.    for(b
8530: 63 66 70 3d 63 66 70 3b 20 62 63 66 70 3b 20 62  cfp=cfp; bcfp; b
8540: 63 66 70 3d 62 63 66 70 2d 3e 6e 65 78 74 29 7b  cfp=bcfp->next){
8550: 0a 20 20 20 20 20 20 69 66 28 20 62 63 66 70 2d  .      if( bcfp-
8560: 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54  >status==COMPLET
8570: 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20  E ) continue;   
8580: 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64   /* Already used
8590: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 63   */.      if( bc
85a0: 66 70 2d 3e 64 6f 74 3e 3d 62 63 66 70 2d 3e 72  fp->dot>=bcfp->r
85b0: 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e  p->nrhs ) contin
85c0: 75 65 3b 20 2f 2a 20 43 61 6e 27 74 20 73 68 69  ue; /* Can't shi
85d0: 66 74 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  ft this one */. 
85e0: 20 20 20 20 20 62 73 70 20 3d 20 62 63 66 70 2d       bsp = bcfp-
85f0: 3e 72 70 2d 3e 72 68 73 5b 62 63 66 70 2d 3e 64  >rp->rhs[bcfp->d
8600: 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ot];           /
8610: 2a 20 47 65 74 20 73 79 6d 62 6f 6c 20 61 66 74  * Get symbol aft
8620: 65 72 20 64 6f 74 20 2a 2f 0a 20 20 20 20 20 20  er dot */.      
8630: 69 66 28 20 21 73 61 6d 65 5f 73 79 6d 62 6f 6c  if( !same_symbol
8640: 28 62 73 70 2c 73 70 29 20 29 20 63 6f 6e 74 69  (bsp,sp) ) conti
8650: 6e 75 65 3b 20 20 20 20 20 20 2f 2a 20 4d 75 73  nue;      /* Mus
8660: 74 20 62 65 20 73 61 6d 65 20 61 73 20 66 6f 72  t be same as for
8670: 20 22 63 66 70 22 20 2a 2f 0a 20 20 20 20 20 20   "cfp" */.      
8680: 62 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43  bcfp->status = C
8690: 4f 4d 50 4c 45 54 45 3b 20 20 20 20 20 20 20 20  OMPLETE;        
86a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72            /* Mar
86b0: 6b 20 74 68 69 73 20 63 6f 6e 66 69 67 20 61 73  k this config as
86c0: 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 6e   used */.      n
86d0: 65 77 63 66 67 20 3d 20 43 6f 6e 66 69 67 6c 69  ewcfg = Configli
86e0: 73 74 5f 61 64 64 62 61 73 69 73 28 62 63 66 70  st_addbasis(bcfp
86f0: 2d 3e 72 70 2c 62 63 66 70 2d 3e 64 6f 74 2b 31  ->rp,bcfp->dot+1
8700: 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61  );.      Plink_a
8710: 64 64 28 26 6e 65 77 63 66 67 2d 3e 62 70 6c 70  dd(&newcfg->bplp
8720: 2c 62 63 66 70 29 3b 0a 20 20 20 20 7d 0a 0a 20  ,bcfp);.    }.. 
8730: 20 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e     /* Get a poin
8740: 74 65 72 20 74 6f 20 74 68 65 20 73 74 61 74 65  ter to the state
8750: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74 68   described by th
8760: 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  e basis configur
8770: 61 74 69 6f 6e 20 73 65 74 0a 20 20 20 20 2a 2a  ation set.    **
8780: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
8790: 74 68 65 20 70 72 65 63 65 64 69 6e 67 20 6c 6f  the preceding lo
87a0: 6f 70 20 2a 2f 0a 20 20 20 20 6e 65 77 73 74 70  op */.    newstp
87b0: 20 3d 20 67 65 74 73 74 61 74 65 28 6c 65 6d 70   = getstate(lemp
87c0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73  );..    /* The s
87d0: 74 61 74 65 20 22 6e 65 77 73 74 70 22 20 69 73  tate "newstp" is
87e0: 20 72 65 61 63 68 65 64 20 66 72 6f 6d 20 74 68   reached from th
87f0: 65 20 73 74 61 74 65 20 22 73 74 70 22 20 62 79  e state "stp" by
8800: 20 61 20 73 68 69 66 74 20 61 63 74 69 6f 6e 0a   a shift action.
8810: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 79      ** on the sy
8820: 6d 62 6f 6c 20 22 73 70 22 20 2a 2f 0a 20 20 20  mbol "sp" */.   
8830: 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d   if( sp->type==M
8840: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
8850: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
8860: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 70     for(i=0; i<sp
8870: 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b 29 7b  ->nsubsym; i++){
8880: 0a 20 20 20 20 20 20 20 20 41 63 74 69 6f 6e 5f  .        Action_
8890: 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 53 48 49  add(&stp->ap,SHI
88a0: 46 54 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 69 5d  FT,sp->subsym[i]
88b0: 2c 28 63 68 61 72 2a 29 6e 65 77 73 74 70 29 3b  ,(char*)newstp);
88c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
88d0: 73 65 7b 0a 20 20 20 20 20 20 41 63 74 69 6f 6e  se{.      Action
88e0: 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 53 48  _add(&stp->ap,SH
88f0: 49 46 54 2c 73 70 2c 28 63 68 61 72 20 2a 29 6e  IFT,sp,(char *)n
8900: 65 77 73 74 70 29 3b 0a 20 20 20 20 7d 0a 20 20  ewstp);.    }.  
8910: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
8920: 72 75 63 74 20 74 68 65 20 70 72 6f 70 61 67 61  ruct the propaga
8930: 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2f 0a 76 6f  tion links.*/.vo
8940: 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28 73 74 72  id FindLinks(str
8950: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
8960: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  .{.  int i;.  st
8970: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
8980: 2c 20 2a 6f 74 68 65 72 3b 0a 20 20 73 74 72 75  , *other;.  stru
8990: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
89a0: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70   struct plink *p
89b0: 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f 75 73 65 6b  lp;..  /* Housek
89c0: 65 65 70 69 6e 67 20 64 65 74 61 69 6c 3a 0a 20  eeping detail:. 
89d0: 20 2a 2a 20 41 64 64 20 74 6f 20 65 76 65 72 79   ** Add to every
89e0: 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e 6b 20   propagate link 
89f0: 61 20 70 6f 69 6e 74 65 72 20 62 61 63 6b 20 74  a pointer back t
8a00: 6f 20 74 68 65 20 73 74 61 74 65 20 74 6f 0a 20  o the state to. 
8a10: 20 2a 2a 20 77 68 69 63 68 20 74 68 65 20 6c 69   ** which the li
8a20: 6e 6b 20 69 73 20 61 74 74 61 63 68 65 64 2e 20  nk is attached. 
8a30: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
8a40: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
8a50: 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  +){.    stp = le
8a60: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
8a70: 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e     for(cfp=stp->
8a80: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
8a90: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
8aa0: 63 66 70 2d 3e 73 74 70 20 3d 20 73 74 70 3b 0a  cfp->stp = stp;.
8ab0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
8ac0: 43 6f 6e 76 65 72 74 20 61 6c 6c 20 62 61 63 6b  Convert all back
8ad0: 6c 69 6e 6b 73 20 69 6e 74 6f 20 66 6f 72 77 61  links into forwa
8ae0: 72 64 20 6c 69 6e 6b 73 2e 20 20 4f 6e 6c 79 20  rd links.  Only 
8af0: 74 68 65 20 66 6f 72 77 61 72 64 0a 20 20 2a 2a  the forward.  **
8b00: 20 6c 69 6e 6b 73 20 61 72 65 20 75 73 65 64 20   links are used 
8b10: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65  in the follow-se
8b20: 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 20 2a  t computation. *
8b30: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
8b40: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
8b50: 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
8b60: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
8b70: 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63    for(cfp=stp->c
8b80: 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  fp; cfp; cfp=cfp
8b90: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66  ->next){.      f
8ba0: 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 62 70 6c 70  or(plp=cfp->bplp
8bb0: 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e  ; plp; plp=plp->
8bc0: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 6f  next){.        o
8bd0: 74 68 65 72 20 3d 20 70 6c 70 2d 3e 63 66 70 3b  ther = plp->cfp;
8be0: 0a 20 20 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61  .        Plink_a
8bf0: 64 64 28 26 6f 74 68 65 72 2d 3e 66 70 6c 70 2c  dd(&other->fplp,
8c00: 63 66 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  cfp);.      }.  
8c10: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6f    }.  }.}../* Co
8c20: 6d 70 75 74 65 20 61 6c 6c 20 66 6f 6c 6c 6f 77  mpute all follow
8c30: 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 66 6f  sets..**.** A fo
8c40: 6c 6c 6f 77 73 65 74 20 69 73 20 74 68 65 20 73  llowset is the s
8c50: 65 74 20 6f 66 20 61 6c 6c 20 73 79 6d 62 6f 6c  et of all symbol
8c60: 73 20 77 68 69 63 68 20 63 61 6e 20 63 6f 6d 65  s which can come
8c70: 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
8c80: 61 66 74 65 72 20 61 20 63 6f 6e 66 69 67 75 72  after a configur
8c90: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 46  ation..*/.void F
8ca0: 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 73 74  indFollowSets(st
8cb0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
8cc0: 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  ).{.  int i;.  s
8cd0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
8ce0: 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  p;.  struct plin
8cf0: 6b 20 2a 70 6c 70 3b 0a 20 20 69 6e 74 20 70 72  k *plp;.  int pr
8d00: 6f 67 72 65 73 73 3b 0a 20 20 69 6e 74 20 63 68  ogress;.  int ch
8d10: 61 6e 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  ange;..  for(i=0
8d20: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
8d30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28  ; i++){.    for(
8d40: 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  cfp=lemp->sorted
8d50: 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  [i]->cfp; cfp; c
8d60: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  fp=cfp->next){. 
8d70: 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74 75 73       cfp->status
8d80: 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20   = INCOMPLETE;. 
8d90: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 64 6f     }.  }.  .  do
8da0: 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d  {.    progress =
8db0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
8dc0: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
8dd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   i++){.      for
8de0: 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65  (cfp=lemp->sorte
8df0: 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b 20  d[i]->cfp; cfp; 
8e00: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
8e10: 20 20 20 20 20 20 20 20 69 66 28 20 63 66 70 2d          if( cfp-
8e20: 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54  >status==COMPLET
8e30: 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  E ) continue;.  
8e40: 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d 63 66        for(plp=cf
8e50: 70 2d 3e 66 70 6c 70 3b 20 70 6c 70 3b 20 70 6c  p->fplp; plp; pl
8e60: 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=plp->next){.  
8e70: 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 20 3d          change =
8e80: 20 53 65 74 55 6e 69 6f 6e 28 70 6c 70 2d 3e 63   SetUnion(plp->c
8e90: 66 70 2d 3e 66 77 73 2c 63 66 70 2d 3e 66 77 73  fp->fws,cfp->fws
8ea0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
8eb0: 20 63 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 20   change ){.     
8ec0: 20 20 20 20 20 20 20 70 6c 70 2d 3e 63 66 70 2d         plp->cfp-
8ed0: 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50  >status = INCOMP
8ee0: 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20 20 20  LETE;.          
8ef0: 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a    progress = 1;.
8f00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8f10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 66      }.        cf
8f20: 70 2d 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d 50  p->status = COMP
8f30: 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LETE;.      }.  
8f40: 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72    }.  }while( pr
8f50: 6f 67 72 65 73 73 20 29 3b 0a 7d 0a 0a 73 74 61  ogress );.}..sta
8f60: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f  tic int resolve_
8f70: 63 6f 6e 66 6c 69 63 74 28 73 74 72 75 63 74 20  conflict(struct 
8f80: 61 63 74 69 6f 6e 20 2a 2c 73 74 72 75 63 74 20  action *,struct 
8f90: 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a 20 43  action *);../* C
8fa0: 6f 6d 70 75 74 65 20 74 68 65 20 72 65 64 75 63  ompute the reduc
8fb0: 65 20 61 63 74 69 6f 6e 73 2c 20 61 6e 64 20 72  e actions, and r
8fc0: 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73  esolve conflicts
8fd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 41 63  ..*/.void FindAc
8fe0: 74 69 6f 6e 73 28 73 74 72 75 63 74 20 6c 65 6d  tions(struct lem
8ff0: 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e  on *lemp).{.  in
9000: 74 20 69 2c 6a 3b 0a 20 20 73 74 72 75 63 74 20  t i,j;.  struct 
9010: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73  config *cfp;.  s
9020: 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
9030: 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  ;.  struct symbo
9040: 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74 20  l *sp;.  struct 
9050: 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 2f 2a 20  rule *rp;..  /* 
9060: 41 64 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  Add all of the r
9070: 65 64 75 63 65 20 61 63 74 69 6f 6e 73 20 0a 20  educe actions . 
9080: 20 2a 2a 20 41 20 72 65 64 75 63 65 20 61 63 74   ** A reduce act
9090: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 66 6f 72  ion is added for
90a0: 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66   each element of
90b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 73 65 74 20 6f   the followset o
90c0: 66 0a 20 20 2a 2a 20 61 20 63 6f 6e 66 69 67 75  f.  ** a configu
90d0: 72 61 74 69 6f 6e 20 77 68 69 63 68 20 68 61 73  ration which has
90e0: 20 69 74 73 20 64 6f 74 20 61 74 20 74 68 65 20   its dot at the 
90f0: 65 78 74 72 65 6d 65 20 72 69 67 68 74 2e 0a 20  extreme right.. 
9100: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
9110: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
9120: 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f  ++){   /* Loop o
9130: 76 65 72 20 61 6c 6c 20 73 74 61 74 65 73 20 2a  ver all states *
9140: 2f 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  /.    stp = lemp
9150: 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
9160: 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66   for(cfp=stp->cf
9170: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
9180: 3e 6e 65 78 74 29 7b 20 20 2f 2a 20 4c 6f 6f 70  >next){  /* Loop
9190: 20 6f 76 65 72 20 61 6c 6c 20 63 6f 6e 66 69 67   over all config
91a0: 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20  urations */.    
91b0: 20 20 69 66 28 20 63 66 70 2d 3e 72 70 2d 3e 6e    if( cfp->rp->n
91c0: 72 68 73 3d 3d 63 66 70 2d 3e 64 6f 74 20 29 7b  rhs==cfp->dot ){
91d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20 64 6f          /* Is do
91e0: 74 20 61 74 20 65 78 74 72 65 6d 65 20 72 69 67  t at extreme rig
91f0: 68 74 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ht? */.        f
9200: 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e  or(j=0; j<lemp->
9210: 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b  nterminal; j++){
9220: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53  .          if( S
9230: 65 74 46 69 6e 64 28 63 66 70 2d 3e 66 77 73 2c  etFind(cfp->fws,
9240: 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j) ){.          
9250: 20 20 2f 2a 20 41 64 64 20 61 20 72 65 64 75 63    /* Add a reduc
9260: 65 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  e action to the 
9270: 73 74 61 74 65 20 22 73 74 70 22 20 77 68 69 63  state "stp" whic
9280: 68 20 77 69 6c 6c 20 72 65 64 75 63 65 20 62 79  h will reduce by
9290: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
92a0: 20 2a 2a 20 72 75 6c 65 20 22 63 66 70 2d 3e 72   ** rule "cfp->r
92b0: 70 22 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68  p" if the lookah
92c0: 65 61 64 20 73 79 6d 62 6f 6c 20 69 73 20 22 6c  ead symbol is "l
92d0: 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 22  emp->symbols[j]"
92e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
92f0: 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d  Action_add(&stp-
9300: 3e 61 70 2c 52 45 44 55 43 45 2c 6c 65 6d 70 2d  >ap,REDUCE,lemp-
9310: 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c 28 63 68 61  >symbols[j],(cha
9320: 72 20 2a 29 63 66 70 2d 3e 72 70 29 3b 0a 20 20  r *)cfp->rp);.  
9330: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9340: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9350: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  }.  }..  /* Add 
9360: 74 68 65 20 61 63 63 65 70 74 69 6e 67 20 74 6f  the accepting to
9370: 6b 65 6e 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d  ken */.  if( lem
9380: 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20 20  p->start ){.    
9390: 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64  sp = Symbol_find
93a0: 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20  (lemp->start);. 
93b0: 20 20 20 69 66 28 20 73 70 3d 3d 30 20 29 20 73     if( sp==0 ) s
93c0: 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e  p = lemp->rule->
93d0: 6c 68 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lhs;.  }else{.  
93e0: 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c    sp = lemp->rul
93f0: 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 20 20 2f 2a  e->lhs;.  }.  /*
9400: 20 41 64 64 20 74 6f 20 74 68 65 20 66 69 72 73   Add to the firs
9410: 74 20 73 74 61 74 65 20 28 77 68 69 63 68 20 69  t state (which i
9420: 73 20 61 6c 77 61 79 73 20 74 68 65 20 73 74 61  s always the sta
9430: 72 74 69 6e 67 20 73 74 61 74 65 20 6f 66 20 74  rting state of t
9440: 68 65 0a 20 20 2a 2a 20 66 69 6e 69 74 65 20 73  he.  ** finite s
9450: 74 61 74 65 20 6d 61 63 68 69 6e 65 29 20 61 6e  tate machine) an
9460: 20 61 63 74 69 6f 6e 20 74 6f 20 41 43 43 45 50   action to ACCEP
9470: 54 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65  T if the lookahe
9480: 61 64 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 73  ad is the.  ** s
9490: 74 61 72 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  tart nonterminal
94a0: 2e 20 20 2a 2f 0a 20 20 41 63 74 69 6f 6e 5f 61  .  */.  Action_a
94b0: 64 64 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  dd(&lemp->sorted
94c0: 5b 30 5d 2d 3e 61 70 2c 41 43 43 45 50 54 2c 73  [0]->ap,ACCEPT,s
94d0: 70 2c 30 29 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f  p,0);..  /* Reso
94e0: 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f  lve conflicts */
94f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
9500: 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
9510: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 61 63 74  {.    struct act
9520: 69 6f 6e 20 2a 61 70 2c 20 2a 6e 61 70 3b 0a 20  ion *ap, *nap;. 
9530: 20 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20     struct state 
9540: 2a 73 74 70 3b 0a 20 20 20 20 73 74 70 20 3d 20  *stp;.    stp = 
9550: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
9560: 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20  .    /* assert( 
9570: 73 74 70 2d 3e 61 70 20 29 3b 20 2a 2f 0a 20 20  stp->ap ); */.  
9580: 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63 74 69    stp->ap = Acti
9590: 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70 29  on_sort(stp->ap)
95a0: 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70  ;.    for(ap=stp
95b0: 2d 3e 61 70 3b 20 61 70 20 26 26 20 61 70 2d 3e  ->ap; ap && ap->
95c0: 6e 65 78 74 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  next; ap=ap->nex
95d0: 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6e 61  t){.      for(na
95e0: 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 6e 61 70 20  p=ap->next; nap 
95f0: 26 26 20 6e 61 70 2d 3e 73 70 3d 3d 61 70 2d 3e  && nap->sp==ap->
9600: 73 70 3b 20 6e 61 70 3d 6e 61 70 2d 3e 6e 65 78  sp; nap=nap->nex
9610: 74 29 7b 0a 20 20 20 20 20 20 20 20 20 2f 2a 20  t){.         /* 
9620: 54 68 65 20 74 77 6f 20 61 63 74 69 6f 6e 73 20  The two actions 
9630: 22 61 70 22 20 61 6e 64 20 22 6e 61 70 22 20 68  "ap" and "nap" h
9640: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 6f  ave the same loo
9650: 6b 61 68 65 61 64 2e 0a 20 20 20 20 20 20 20 20  kahead..        
9660: 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   ** Figure out w
9670: 68 69 63 68 20 6f 6e 65 20 73 68 6f 75 6c 64 20  hich one should 
9680: 62 65 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20  be used */.     
9690: 20 20 20 20 6c 65 6d 70 2d 3e 6e 63 6f 6e 66 6c      lemp->nconfl
96a0: 69 63 74 20 2b 3d 20 72 65 73 6f 6c 76 65 5f 63  ict += resolve_c
96b0: 6f 6e 66 6c 69 63 74 28 61 70 2c 6e 61 70 29 3b  onflict(ap,nap);
96c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
96d0: 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20   }..  /* Report 
96e0: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 65 61 63  an error for eac
96f0: 68 20 72 75 6c 65 20 74 68 61 74 20 63 61 6e 20  h rule that can 
9700: 6e 65 76 65 72 20 62 65 20 72 65 64 75 63 65 64  never be reduced
9710: 2e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65  . */.  for(rp=le
9720: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
9730: 3d 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 63  =rp->next) rp->c
9740: 61 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e  anReduce = LEMON
9750: 5f 46 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d  _FALSE;.  for(i=
9760: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
9770: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  e; i++){.    str
9780: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
9790: 20 20 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d      for(ap=lemp-
97a0: 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20  >sorted[i]->ap; 
97b0: 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
97c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  {.      if( ap->
97d0: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 20 61  type==REDUCE ) a
97e0: 70 2d 3e 78 2e 72 70 2d 3e 63 61 6e 52 65 64 75  p->x.rp->canRedu
97f0: 63 65 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b  ce = LEMON_TRUE;
9800: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
9810: 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
9820: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
9830: 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 61  {.    if( rp->ca
9840: 6e 52 65 64 75 63 65 20 29 20 63 6f 6e 74 69 6e  nReduce ) contin
9850: 75 65 3b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67  ue;.    ErrorMsg
9860: 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
9870: 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 22 54 68  rp->ruleline,"Th
9880: 69 73 20 72 75 6c 65 20 63 61 6e 20 6e 6f 74 20  is rule can not 
9890: 62 65 20 72 65 64 75 63 65 64 2e 5c 6e 22 29 3b  be reduced.\n");
98a0: 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
98b0: 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  cnt++;.  }.}../*
98c0: 20 52 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c   Resolve a confl
98d0: 69 63 74 20 62 65 74 77 65 65 6e 20 74 68 65 20  ict between the 
98e0: 74 77 6f 20 67 69 76 65 6e 20 61 63 74 69 6f 6e  two given action
98f0: 73 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 6f  s.  If the.** co
9900: 6e 66 6c 69 63 74 20 63 61 6e 27 74 20 62 65 20  nflict can't be 
9910: 72 65 73 6f 6c 76 65 64 2c 20 72 65 74 75 72 6e  resolved, return
9920: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
9930: 20 4e 4f 20 4c 4f 4e 47 45 52 20 54 52 55 45 3a   NO LONGER TRUE:
9940: 0a 2a 2a 20 20 20 54 6f 20 72 65 73 6f 6c 76 65  .**   To resolve
9950: 20 61 20 63 6f 6e 66 6c 69 63 74 2c 20 66 69 72   a conflict, fir
9960: 73 74 20 6c 6f 6f 6b 20 74 6f 20 73 65 65 20 69  st look to see i
9970: 66 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 0a  f either action.
9980: 2a 2a 20 20 20 69 73 20 6f 6e 20 61 6e 20 65 72  **   is on an er
9990: 72 6f 72 20 72 75 6c 65 2e 20 20 49 6e 20 74 68  ror rule.  In th
99a0: 61 74 20 63 61 73 65 2c 20 74 61 6b 65 20 74 68  at case, take th
99b0: 65 20 61 63 74 69 6f 6e 20 77 68 69 63 68 0a 2a  e action which.*
99c0: 2a 20 20 20 69 73 20 6e 6f 74 20 61 73 73 6f 63  *   is not assoc
99d0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 65  iated with the e
99e0: 72 72 6f 72 20 72 75 6c 65 2e 20 20 49 66 20 6e  rror rule.  If n
99f0: 65 69 74 68 65 72 20 6f 72 20 62 6f 74 68 0a 2a  either or both.*
9a00: 2a 20 20 20 61 63 74 69 6f 6e 73 20 61 72 65 20  *   actions are 
9a10: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
9a20: 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2c 20 74  an error rule, t
9a30: 68 65 6e 20 74 72 79 20 74 6f 0a 2a 2a 20 20 20  hen try to.**   
9a40: 75 73 65 20 70 72 65 63 65 64 65 6e 63 65 20 74  use precedence t
9a50: 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 63 6f  o resolve the co
9a60: 6e 66 6c 69 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  nflict..**.** If
9a70: 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 20 69   either action i
9a80: 73 20 61 20 53 48 49 46 54 2c 20 74 68 65 6e 20  s a SHIFT, then 
9a90: 69 74 20 6d 75 73 74 20 62 65 20 61 70 78 2e 20  it must be apx. 
9aa0: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
9ab0: 6e 20 77 6f 6e 27 74 20 77 6f 72 6b 20 69 66 20  n won't work if 
9ac0: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43  apx->type==REDUC
9ad0: 45 20 61 6e 64 20 61 70 79 2d 3e 74 79 70 65 3d  E and apy->type=
9ae0: 3d 53 48 49 46 54 2e 0a 2a 2f 0a 73 74 61 74 69  =SHIFT..*/.stati
9af0: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f  c int resolve_co
9b00: 6e 66 6c 69 63 74 28 0a 20 20 73 74 72 75 63 74  nflict(.  struct
9b10: 20 61 63 74 69 6f 6e 20 2a 61 70 78 2c 0a 20 20   action *apx,.  
9b20: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
9b30: 70 79 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 73  py.){.  struct s
9b40: 79 6d 62 6f 6c 20 2a 73 70 78 2c 20 2a 73 70 79  ymbol *spx, *spy
9b50: 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d  ;.  int errcnt =
9b60: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70   0;.  assert( ap
9b70: 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e 73 70 20 29  x->sp==apy->sp )
9b80: 3b 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  ;  /* Otherwise 
9b90: 74 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 6e  there would be n
9ba0: 6f 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  o conflict */.  
9bb0: 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53  if( apx->type==S
9bc0: 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70  HIFT && apy->typ
9bd0: 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20  e==SHIFT ){.    
9be0: 61 70 79 2d 3e 74 79 70 65 20 3d 20 53 53 43 4f  apy->type = SSCO
9bf0: 4e 46 4c 49 43 54 3b 0a 20 20 20 20 65 72 72 63  NFLICT;.    errc
9c00: 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nt++;.  }.  if( 
9c10: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54  apx->type==SHIFT
9c20: 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52   && apy->type==R
9c30: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78  EDUCE ){.    spx
9c40: 20 3d 20 61 70 78 2d 3e 73 70 3b 0a 20 20 20 20   = apx->sp;.    
9c50: 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d  spy = apy->x.rp-
9c60: 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66  >precsym;.    if
9c70: 28 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d  ( spy==0 || spx-
9c80: 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70 79 2d 3e  >prec<0 || spy->
9c90: 70 72 65 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  prec<0 ){.      
9ca0: 2f 2a 20 4e 6f 74 20 65 6e 6f 75 67 68 20 70 72  /* Not enough pr
9cb0: 65 63 65 64 65 6e 63 65 20 69 6e 66 6f 72 6d 61  ecedence informa
9cc0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  tion. */.      a
9cd0: 70 79 2d 3e 74 79 70 65 20 3d 20 53 52 43 4f 4e  py->type = SRCON
9ce0: 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72  FLICT;.      err
9cf0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  cnt++;.    }else
9d00: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73   if( spx->prec>s
9d10: 70 79 2d 3e 70 72 65 63 20 29 7b 20 20 20 20 2f  py->prec ){    /
9d20: 2a 20 68 69 67 68 65 72 20 70 72 65 63 65 64 65  * higher precede
9d30: 6e 63 65 20 77 69 6e 73 20 2a 2f 0a 20 20 20 20  nce wins */.    
9d40: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44    apy->type = RD
9d50: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
9d60: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
9d70: 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a  ec<spy->prec ){.
9d80: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20        apx->type 
9d90: 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20  = SH_RESOLVED;. 
9da0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78     }else if( spx
9db0: 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65  ->prec==spy->pre
9dc0: 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d  c && spx->assoc=
9dd0: 3d 52 49 47 48 54 20 29 7b 20 2f 2a 20 55 73 65  =RIGHT ){ /* Use
9de0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
9df0: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52     apy->type = R
9e00: 44 5f 52 45 53 4f 4c 56 45 44 3b 20 20 20 20 20  D_RESOLVED;     
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e20: 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73 6f 63          /* assoc
9e30: 69 61 74 69 76 69 74 79 20 2a 2f 0a 20 20 20 20  iativity */.    
9e40: 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70  }else if( spx->p
9e50: 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26  rec==spy->prec &
9e60: 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4c 45  & spx->assoc==LE
9e70: 46 54 20 29 7b 20 20 2f 2a 20 74 6f 20 62 72 65  FT ){  /* to bre
9e80: 61 6b 20 74 69 65 20 2a 2f 0a 20 20 20 20 20 20  ak tie */.      
9e90: 61 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52  apx->type = SH_R
9ea0: 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c  ESOLVED;.    }el
9eb0: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
9ec0: 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  ( spx->prec==spy
9ed0: 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61  ->prec && spx->a
9ee0: 73 73 6f 63 3d 3d 4e 4f 4e 45 20 29 3b 0a 20 20  ssoc==NONE );.  
9ef0: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20      apx->type = 
9f00: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
9f10: 65 6c 73 65 20 69 66 28 20 61 70 78 2d 3e 74 79  else if( apx->ty
9f20: 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70  pe==REDUCE && ap
9f30: 79 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  y->type==REDUCE 
9f40: 29 7b 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78  ){.    spx = apx
9f50: 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b  ->x.rp->precsym;
9f60: 0a 20 20 20 20 73 70 79 20 3d 20 61 70 79 2d 3e  .    spy = apy->
9f70: 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20  x.rp->precsym;. 
9f80: 20 20 20 69 66 28 20 73 70 78 3d 3d 30 20 7c 7c     if( spx==0 ||
9f90: 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e   spy==0 || spx->
9fa0: 70 72 65 63 3c 30 20 7c 7c 0a 20 20 20 20 73 70  prec<0 ||.    sp
9fb0: 79 2d 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70 78  y->prec<0 || spx
9fc0: 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65  ->prec==spy->pre
9fd0: 63 20 29 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e  c ){.      apy->
9fe0: 74 79 70 65 20 3d 20 52 52 43 4f 4e 46 4c 49 43  type = RRCONFLIC
9ff0: 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e 74 2b  T;.      errcnt+
a000: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  +;.    }else if(
a010: 20 73 70 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e   spx->prec>spy->
a020: 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70  prec ){.      ap
a030: 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53  y->type = RD_RES
a040: 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65  OLVED;.    }else
a050: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3c 73   if( spx->prec<s
a060: 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20  py->prec ){.    
a070: 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 52 44    apx->type = RD
a080: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
a090: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
a0a0: 73 65 72 74 28 20 0a 20 20 20 20 20 20 61 70 78  sert( .      apx
a0b0: 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c  ->type==SH_RESOL
a0c0: 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 78  VED ||.      apx
a0d0: 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c  ->type==RD_RESOL
a0e0: 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 78  VED ||.      apx
a0f0: 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e 46 4c 49  ->type==SSCONFLI
a100: 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d  CT ||.      apx-
a110: 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46 4c 49 43  >type==SRCONFLIC
a120: 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e  T ||.      apx->
a130: 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c 49 43 54  type==RRCONFLICT
a140: 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   ||.      apy->t
a150: 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44  ype==SH_RESOLVED
a160: 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   ||.      apy->t
a170: 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44  ype==RD_RESOLVED
a180: 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   ||.      apy->t
a190: 79 70 65 3d 3d 53 53 43 4f 4e 46 4c 49 43 54 20  ype==SSCONFLICT 
a1a0: 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  ||.      apy->ty
a1b0: 70 65 3d 3d 53 52 43 4f 4e 46 4c 49 43 54 20 7c  pe==SRCONFLICT |
a1c0: 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  |.      apy->typ
a1d0: 65 3d 3d 52 52 43 4f 4e 46 4c 49 43 54 0a 20 20  e==RRCONFLICT.  
a1e0: 20 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20    );.    /* The 
a1f0: 52 45 44 55 43 45 2f 53 48 49 46 54 20 63 61 73  REDUCE/SHIFT cas
a200: 65 20 63 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20  e cannot happen 
a210: 62 65 63 61 75 73 65 20 53 48 49 46 54 73 20 63  because SHIFTs c
a220: 6f 6d 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ome before.    *
a230: 2a 20 52 45 44 55 43 45 73 20 6f 6e 20 74 68 65  * REDUCEs on the
a240: 20 6c 69 73 74 2e 20 20 49 66 20 77 65 20 72 65   list.  If we re
a250: 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69  ach this point i
a260: 74 20 6d 75 73 74 20 62 65 20 62 65 63 61 75 73  t must be becaus
a270: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 72  e.    ** the par
a280: 73 65 72 20 63 6f 6e 66 6c 69 63 74 20 68 61 64  ser conflict had
a290: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65   already been re
a2a0: 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 7d 0a 20  solved. */.  }. 
a2b0: 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a   return errcnt;.
a2c0: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
a2d0: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
a2e0: 65 20 66 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69  e file "configli
a2f0: 73 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  st.c" **********
a300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
a310: 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20  ./*.** Routines 
a320: 74 6f 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  to processing a 
a330: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
a340: 73 74 20 61 6e 64 20 62 75 69 6c 64 69 6e 67 20  st and building 
a350: 61 20 73 74 61 74 65 0a 2a 2a 20 69 6e 20 74 68  a state.** in th
a360: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
a370: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74  enerator..*/..st
a380: 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66  atic struct conf
a390: 69 67 20 2a 66 72 65 65 6c 69 73 74 20 3d 20 30  ig *freelist = 0
a3a0: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
a3b0: 66 20 66 72 65 65 20 63 6f 6e 66 69 67 75 72 61  f free configura
a3c0: 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
a3d0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
a3e0: 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  urrent = 0;     
a3f0: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74    /* Top of list
a400: 20 6f 66 20 63 6f 6e 66 69 67 75 72 61 74 69 6f   of configuratio
a410: 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ns */.static str
a420: 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a 63 75 72  uct config **cur
a430: 72 65 6e 74 65 6e 64 20 3d 20 30 3b 20 20 20 2f  rentend = 0;   /
a440: 2a 20 4c 61 73 74 20 6f 6e 20 6c 69 73 74 20 6f  * Last on list o
a450: 66 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61  f configs */.sta
a460: 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69  tic struct confi
a470: 67 20 2a 62 61 73 69 73 20 3d 20 30 3b 20 20 20  g *basis = 0;   
a480: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
a490: 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f  list of basis co
a4a0: 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74 69 63 20  nfigs */.static 
a4b0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a  struct config **
a4c0: 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 20 20 20  basisend = 0;   
a4d0: 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c 69 73 74    /* End of list
a4e0: 20 6f 66 20 62 61 73 69 73 20 63 6f 6e 66 69 67   of basis config
a4f0: 73 20 2a 2f 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  s */../* Return 
a500: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
a510: 65 77 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ew configuration
a520: 20 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75   */.PRIVATE stru
a530: 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 6f  ct config *newco
a540: 6e 66 69 67 28 29 7b 0a 20 20 73 74 72 75 63 74  nfig(){.  struct
a550: 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 67 3b   config *newcfg;
a560: 0a 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d  .  if( freelist=
a570: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
a580: 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 33  .    int amt = 3
a590: 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d  ;.    freelist =
a5a0: 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20   (struct config 
a5b0: 2a 29 63 61 6c 6c 6f 63 28 20 61 6d 74 2c 20 73  *)calloc( amt, s
a5c0: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 63 6f 6e  izeof(struct con
a5d0: 66 69 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20  fig) );.    if( 
a5e0: 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  freelist==0 ){. 
a5f0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
a600: 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61  err,"Unable to a
a610: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
a620: 6f 72 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75  or a new configu
a630: 72 61 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20  ration.");.     
a640: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
a650: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
a660: 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c  mt-1; i++) freel
a670: 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66  ist[i].next = &f
a680: 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20  reelist[i+1];.  
a690: 20 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31    freelist[amt-1
a6a0: 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a  ].next = 0;.  }.
a6b0: 20 20 6e 65 77 63 66 67 20 3d 20 66 72 65 65 6c    newcfg = freel
a6c0: 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20  ist;.  freelist 
a6d0: 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74  = freelist->next
a6e0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 63 66  ;.  return newcf
a6f0: 67 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e  g;.}../* The con
a700: 66 69 67 75 72 61 74 69 6f 6e 20 22 6f 6c 64 22  figuration "old"
a710: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73   is no longer us
a720: 65 64 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  ed */.PRIVATE vo
a730: 69 64 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28  id deleteconfig(
a740: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f  struct config *o
a750: 6c 64 29 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65 78  ld).{.  old->nex
a760: 74 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20  t = freelist;.  
a770: 66 72 65 65 6c 69 73 74 20 3d 20 6f 6c 64 3b 0a  freelist = old;.
a780: 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  }../* Initialize
a790: 64 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  d the configurat
a7a0: 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72  ion list builder
a7b0: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
a7c0: 69 73 74 5f 69 6e 69 74 28 29 7b 0a 20 20 63 75  ist_init(){.  cu
a7d0: 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72  rrent = 0;.  cur
a7e0: 72 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65  rentend = &curre
a7f0: 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b  nt;.  basis = 0;
a800: 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62  .  basisend = &b
a810: 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61  asis;.  Configta
a820: 62 6c 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72 65  ble_init();.  re
a830: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74  turn;.}../* Init
a840: 69 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66  ialized the conf
a850: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62  iguration list b
a860: 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43  uilder */.void C
a870: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28  onfiglist_reset(
a880: 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30  ){.  current = 0
a890: 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d  ;.  currentend =
a8a0: 20 26 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73   &current;.  bas
a8b0: 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65  is = 0;.  basise
a8c0: 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43  nd = &basis;.  C
a8d0: 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72  onfigtable_clear
a8e0: 28 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  (0);.  return;.}
a8f0: 0a 0a 2f 2a 20 41 64 64 20 61 6e 6f 74 68 65 72  ../* Add another
a900: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74   configuration t
a910: 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  o the configurat
a920: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75  ion list */.stru
a930: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
a940: 67 6c 69 73 74 5f 61 64 64 28 0a 20 20 73 74 72  glist_add(.  str
a950: 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 20 20  uct rule *rp,   
a960: 20 2f 2a 20 54 68 65 20 72 75 6c 65 20 2a 2f 0a   /* The rule */.
a970: 20 20 69 6e 74 20 64 6f 74 20 20 20 20 20 20 20    int dot       
a980: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
a990: 6e 74 6f 20 74 68 65 20 52 48 53 20 6f 66 20 74  nto the RHS of t
a9a0: 68 65 20 72 75 6c 65 20 77 68 65 72 65 20 74 68  he rule where th
a9b0: 65 20 64 6f 74 20 67 6f 65 73 20 2a 2f 0a 29 7b  e dot goes */.){
a9c0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
a9d0: 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20   *cfp, model;.. 
a9e0: 20 61 73 73 65 72 74 28 20 63 75 72 72 65 6e 74   assert( current
a9f0: 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65  end!=0 );.  mode
aa00: 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64  l.rp = rp;.  mod
aa10: 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20  el.dot = dot;.  
aa20: 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c  cfp = Configtabl
aa30: 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a  e_find(&model);.
aa40: 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a    if( cfp==0 ){.
aa50: 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e      cfp = newcon
aa60: 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e  fig();.    cfp->
aa70: 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66 70  rp = rp;.    cfp
aa80: 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20  ->dot = dot;.   
aa90: 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e   cfp->fws = SetN
aaa0: 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73  ew();.    cfp->s
aab0: 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d  tp = 0;.    cfp-
aac0: 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c  >fplp = cfp->bpl
aad0: 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e  p = 0;.    cfp->
aae0: 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 66  next = 0;.    cf
aaf0: 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a  p->bp = 0;.    *
ab00: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66 70  currentend = cfp
ab10: 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e 64  ;.    currentend
ab20: 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20   = &cfp->next;. 
ab30: 20 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69     Configtable_i
ab40: 6e 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a  nsert(cfp);.  }.
ab50: 20 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a    return cfp;.}.
ab60: 0a 2f 2a 20 41 64 64 20 61 20 62 61 73 69 73 20  ./* Add a basis 
ab70: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f  configuration to
ab80: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
ab90: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63  on list */.struc
aba0: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
abb0: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 73 74  list_addbasis(st
abc0: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 69  ruct rule *rp, i
abd0: 6e 74 20 64 6f 74 29 0a 7b 0a 20 20 73 74 72 75  nt dot).{.  stru
abe0: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20  ct config *cfp, 
abf0: 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65 72 74  model;..  assert
ac00: 28 20 62 61 73 69 73 65 6e 64 21 3d 30 20 29 3b  ( basisend!=0 );
ac10: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65  .  assert( curre
ac20: 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f  ntend!=0 );.  mo
ac30: 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d  del.rp = rp;.  m
ac40: 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a  odel.dot = dot;.
ac50: 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61    cfp = Configta
ac60: 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29  ble_find(&model)
ac70: 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29  ;.  if( cfp==0 )
ac80: 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63  {.    cfp = newc
ac90: 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70  onfig();.    cfp
aca0: 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63  ->rp = rp;.    c
acb0: 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20  fp->dot = dot;. 
acc0: 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65     cfp->fws = Se
acd0: 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d  tNew();.    cfp-
ace0: 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66  >stp = 0;.    cf
acf0: 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62  p->fplp = cfp->b
ad00: 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  plp = 0;.    cfp
ad10: 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ->next = 0;.    
ad20: 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20  cfp->bp = 0;.   
ad30: 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63   *currentend = c
ad40: 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65  fp;.    currente
ad50: 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b  nd = &cfp->next;
ad60: 0a 20 20 20 20 2a 62 61 73 69 73 65 6e 64 20 3d  .    *basisend =
ad70: 20 63 66 70 3b 0a 20 20 20 20 62 61 73 69 73 65   cfp;.    basise
ad80: 6e 64 20 3d 20 26 63 66 70 2d 3e 62 70 3b 0a 20  nd = &cfp->bp;. 
ad90: 20 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69     Configtable_i
ada0: 6e 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a  nsert(cfp);.  }.
adb0: 20 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a    return cfp;.}.
adc0: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  ./* Compute the 
add0: 63 6c 6f 73 75 72 65 20 6f 66 20 74 68 65 20 63  closure of the c
ade0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
adf0: 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  t */.void Config
ae00: 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 73 74 72  list_closure(str
ae10: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
ae20: 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .{.  struct conf
ae30: 69 67 20 2a 63 66 70 2c 20 2a 6e 65 77 63 66 70  ig *cfp, *newcfp
ae40: 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
ae50: 2a 72 70 2c 20 2a 6e 65 77 72 70 3b 0a 20 20 73  *rp, *newrp;.  s
ae60: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
ae70: 2c 20 2a 78 73 70 3b 0a 20 20 69 6e 74 20 69 2c  , *xsp;.  int i,
ae80: 20 64 6f 74 3b 0a 0a 20 20 61 73 73 65 72 74 28   dot;..  assert(
ae90: 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29   currentend!=0 )
aea0: 3b 0a 20 20 66 6f 72 28 63 66 70 3d 63 75 72 72  ;.  for(cfp=curr
aeb0: 65 6e 74 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  ent; cfp; cfp=cf
aec0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 72 70  p->next){.    rp
aed0: 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 20 20   = cfp->rp;.    
aee0: 64 6f 74 20 3d 20 63 66 70 2d 3e 64 6f 74 3b 0a  dot = cfp->dot;.
aef0: 20 20 20 20 69 66 28 20 64 6f 74 3e 3d 72 70 2d      if( dot>=rp-
af00: 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65  >nrhs ) continue
af10: 3b 0a 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72  ;.    sp = rp->r
af20: 68 73 5b 64 6f 74 5d 3b 0a 20 20 20 20 69 66 28  hs[dot];.    if(
af30: 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45   sp->type==NONTE
af40: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
af50: 69 66 28 20 73 70 2d 3e 72 75 6c 65 3d 3d 30 20  if( sp->rule==0 
af60: 26 26 20 73 70 21 3d 6c 65 6d 70 2d 3e 65 72 72  && sp!=lemp->err
af70: 73 79 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 45  sym ){.        E
af80: 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
af90: 6c 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65 2c  lename,rp->line,
afa0: 22 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20 5c 22 25  "Nonterminal \"%
afb0: 73 5c 22 20 68 61 73 20 6e 6f 20 72 75 6c 65 73  s\" has no rules
afc0: 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 73 70  .",.          sp
afd0: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
afe0: 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
aff0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
b000: 20 66 6f 72 28 6e 65 77 72 70 3d 73 70 2d 3e 72   for(newrp=sp->r
b010: 75 6c 65 3b 20 6e 65 77 72 70 3b 20 6e 65 77 72  ule; newrp; newr
b020: 70 3d 6e 65 77 72 70 2d 3e 6e 65 78 74 6c 68 73  p=newrp->nextlhs
b030: 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 63 66  ){.        newcf
b040: 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61  p = Configlist_a
b050: 64 64 28 6e 65 77 72 70 2c 30 29 3b 0a 20 20 20  dd(newrp,0);.   
b060: 20 20 20 20 20 66 6f 72 28 69 3d 64 6f 74 2b 31       for(i=dot+1
b070: 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
b080: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 73  +){.          xs
b090: 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  p = rp->rhs[i];.
b0a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 73            if( xs
b0b0: 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  p->type==TERMINA
b0c0: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
b0d0: 20 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e   SetAdd(newcfp->
b0e0: 66 77 73 2c 78 73 70 2d 3e 69 6e 64 65 78 29 3b  fws,xsp->index);
b0f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
b100: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ak;.          }e
b110: 6c 73 65 20 69 66 28 20 78 73 70 2d 3e 74 79 70  lse if( xsp->typ
b120: 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
b130: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b140: 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
b150: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 78 73     for(k=0; k<xs
b160: 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29  p->nsubsym; k++)
b170: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b180: 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66  SetAdd(newcfp->f
b190: 77 73 2c 20 78 73 70 2d 3e 73 75 62 73 79 6d 5b  ws, xsp->subsym[
b1a0: 6b 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  k]->index);.    
b1b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b1c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b1d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
b1e0: 20 20 20 20 20 20 20 20 20 20 53 65 74 55 6e 69            SetUni
b1f0: 6f 6e 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78  on(newcfp->fws,x
b200: 73 70 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20  sp->firstset);. 
b210: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78             if( x
b220: 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f  sp->lambda==LEMO
b230: 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b  N_FALSE ) break;
b240: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b250: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
b260: 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29  f( i==rp->nrhs )
b270: 20 50 6c 69 6e 6b 5f 61 64 64 28 26 63 66 70 2d   Plink_add(&cfp-
b280: 3e 66 70 6c 70 2c 6e 65 77 63 66 70 29 3b 0a 20  >fplp,newcfp);. 
b290: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
b2a0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
b2b0: 20 53 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67   Sort the config
b2c0: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
b2d0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
b2e0: 73 6f 72 74 28 29 7b 0a 20 20 63 75 72 72 65 6e  sort(){.  curren
b2f0: 74 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66  t = (struct conf
b300: 69 67 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72  ig *)msort((char
b310: 20 2a 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72   *)current,(char
b320: 20 2a 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 6e   **)&(current->n
b330: 65 78 74 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b  ext),Configcmp);
b340: 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20  .  currentend = 
b350: 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  0;.  return;.}..
b360: 2f 2a 20 53 6f 72 74 20 74 68 65 20 62 61 73 69  /* Sort the basi
b370: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
b380: 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  list */.void Con
b390: 66 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69  figlist_sortbasi
b3a0: 73 28 29 7b 0a 20 20 62 61 73 69 73 20 3d 20 28  s(){.  basis = (
b3b0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
b3c0: 6d 73 6f 72 74 28 28 63 68 61 72 20 2a 29 63 75  msort((char *)cu
b3d0: 72 72 65 6e 74 2c 28 63 68 61 72 20 2a 2a 29 26  rrent,(char **)&
b3e0: 28 63 75 72 72 65 6e 74 2d 3e 62 70 29 2c 43 6f  (current->bp),Co
b3f0: 6e 66 69 67 63 6d 70 29 3b 0a 20 20 62 61 73 69  nfigcmp);.  basi
b400: 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  send = 0;.  retu
b410: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  rn;.}../* Return
b420: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
b430: 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f  e head of the co
b440: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
b450: 20 61 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68   and.** reset th
b460: 65 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74  e list */.struct
b470: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
b480: 69 73 74 5f 72 65 74 75 72 6e 28 29 7b 0a 20 20  ist_return(){.  
b490: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f  struct config *o
b4a0: 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 63 75 72 72  ld;.  old = curr
b4b0: 65 6e 74 3b 0a 20 20 63 75 72 72 65 6e 74 20 3d  ent;.  current =
b4c0: 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64   0;.  currentend
b4d0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f   = 0;.  return o
b4e0: 6c 64 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  ld;.}../* Return
b4f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
b500: 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f  e head of the co
b510: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
b520: 20 61 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68   and.** reset th
b530: 65 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74  e list */.struct
b540: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
b550: 69 73 74 5f 62 61 73 69 73 28 29 7b 0a 20 20 73  ist_basis(){.  s
b560: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c  truct config *ol
b570: 64 3b 0a 20 20 6f 6c 64 20 3d 20 62 61 73 69 73  d;.  old = basis
b580: 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20  ;.  basis = 0;. 
b590: 20 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20   basisend = 0;. 
b5a0: 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a   return old;.}..
b5b0: 2f 2a 20 46 72 65 65 20 61 6c 6c 20 65 6c 65 6d  /* Free all elem
b5c0: 65 6e 74 73 20 6f 66 20 74 68 65 20 67 69 76 65  ents of the give
b5d0: 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  n configuration 
b5e0: 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  list */.void Con
b5f0: 66 69 67 6c 69 73 74 5f 65 61 74 28 73 74 72 75  figlist_eat(stru
b600: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a  ct config *cfp).
b610: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
b620: 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20 20 66 6f  g *nextcfp;.  fo
b630: 72 28 3b 20 63 66 70 3b 20 63 66 70 3d 6e 65 78  r(; cfp; cfp=nex
b640: 74 63 66 70 29 7b 0a 20 20 20 20 6e 65 78 74 63  tcfp){.    nextc
b650: 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78 74 3b 0a  fp = cfp->next;.
b660: 20 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d      assert( cfp-
b670: 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20  >fplp==0 );.    
b680: 61 73 73 65 72 74 28 20 63 66 70 2d 3e 62 70 6c  assert( cfp->bpl
b690: 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  p==0 );.    if( 
b6a0: 63 66 70 2d 3e 66 77 73 20 29 20 53 65 74 46 72  cfp->fws ) SetFr
b6b0: 65 65 28 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20  ee(cfp->fws);.  
b6c0: 20 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 63    deleteconfig(c
b6d0: 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fp);.  }.  retur
b6e0: 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n;.}./**********
b6f0: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
b700: 20 66 69 6c 65 20 22 65 72 72 6f 72 2e 63 22 20   file "error.c" 
b710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b730: 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f  */./*.** Code fo
b740: 72 20 70 72 69 6e 74 69 6e 67 20 65 72 72 6f 72  r printing error
b750: 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a 76 6f   message..*/..vo
b760: 69 64 20 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73  id ErrorMsg(cons
b770: 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65  t char *filename
b780: 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f  , int lineno, co
b790: 6e 73 74 20 63 68 61 72 20 2a 66 6f 72 6d 61 74  nst char *format
b7a0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
b7b0: 74 20 61 70 3b 0a 20 20 66 70 72 69 6e 74 66 28  t ap;.  fprintf(
b7c0: 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20  stderr, "%s:%d: 
b7d0: 22 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 6c 69 6e  ", filename, lin
b7e0: 65 6e 6f 29 3b 0a 20 20 76 61 5f 73 74 61 72 74  eno);.  va_start
b7f0: 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20  (ap, format);.  
b800: 76 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  vfprintf(stderr,
b810: 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76 61  format,ap);.  va
b820: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66 70 72 69  _end(ap);.  fpri
b830: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22  ntf(stderr, "\n"
b840: 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}./**********
b850: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
b860: 66 69 6c 65 20 22 6d 61 69 6e 2e 63 22 20 2a 2a  file "main.c" **
b870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b890: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20 70  **/./*.** Main p
b8a0: 72 6f 67 72 61 6d 20 66 69 6c 65 20 66 6f 72 20  rogram file for 
b8b0: 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
b8c0: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
b8d0: 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f 75 74  /* Report an out
b8e0: 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64 69  -of-memory condi
b8f0: 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72 74 2e 20  tion and abort. 
b900: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
b910: 2a 20 69 73 20 75 73 65 64 20 6d 6f 73 74 6c 79  * is used mostly
b920: 20 62 79 20 74 68 65 20 22 4d 65 6d 6f 72 79 43   by the "MemoryC
b930: 68 65 63 6b 22 20 6d 61 63 72 6f 20 69 6e 20 73  heck" macro in s
b940: 74 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64 20  truct.h.*/.void 
b950: 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 7b 0a  memory_error(){.
b960: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
b970: 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  ,"Out of memory.
b980: 20 20 41 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e 22    Aborting...\n"
b990: 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a  );.  exit(1);.}.
b9a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 44 65 66  .static int nDef
b9b0: 69 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ine = 0;      /*
b9c0: 20 4e 75 6d 62 65 72 20 6f 66 20 2d 44 20 6f 70   Number of -D op
b9d0: 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 63 6f 6d  tions on the com
b9e0: 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a 73 74 61  mand line */.sta
b9f0: 74 69 63 20 63 68 61 72 20 2a 2a 61 7a 44 65 66  tic char **azDef
ba00: 69 6e 65 20 3d 20 30 3b 20 20 2f 2a 20 4e 61 6d  ine = 0;  /* Nam
ba10: 65 20 6f 66 20 74 68 65 20 2d 44 20 6d 61 63 72  e of the -D macr
ba20: 6f 73 20 2a 2f 0a 0a 2f 2a 20 54 68 69 73 20 72  os */../* This r
ba30: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
ba40: 20 77 69 74 68 20 74 68 65 20 61 72 67 75 6d 65   with the argume
ba50: 6e 74 20 74 6f 20 65 61 63 68 20 2d 44 20 63 6f  nt to each -D co
ba60: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
ba70: 6e 2e 0a 2a 2a 20 41 64 64 20 74 68 65 20 6d 61  n..** Add the ma
ba80: 63 72 6f 20 64 65 66 69 6e 65 64 20 74 6f 20 74  cro defined to t
ba90: 68 65 20 61 7a 44 65 66 69 6e 65 20 61 72 72 61  he azDefine arra
baa0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
bab0: 64 20 68 61 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f  d handle_D_optio
bac0: 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68  n(char *z){.  ch
bad0: 61 72 20 2a 2a 70 61 7a 3b 0a 20 20 6e 44 65 66  ar **paz;.  nDef
bae0: 69 6e 65 2b 2b 3b 0a 20 20 61 7a 44 65 66 69 6e  ine++;.  azDefin
baf0: 65 20 3d 20 28 63 68 61 72 20 2a 2a 29 20 72 65  e = (char **) re
bb00: 61 6c 6c 6f 63 28 61 7a 44 65 66 69 6e 65 2c 20  alloc(azDefine, 
bb10: 73 69 7a 65 6f 66 28 61 7a 44 65 66 69 6e 65 5b  sizeof(azDefine[
bb20: 30 5d 29 2a 6e 44 65 66 69 6e 65 29 3b 0a 20 20  0])*nDefine);.  
bb30: 69 66 28 20 61 7a 44 65 66 69 6e 65 3d 3d 30 20  if( azDefine==0 
bb40: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
bb50: 74 64 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d 65  tderr,"out of me
bb60: 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78  mory\n");.    ex
bb70: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 70 61 7a  it(1);.  }.  paz
bb80: 20 3d 20 26 61 7a 44 65 66 69 6e 65 5b 6e 44 65   = &azDefine[nDe
bb90: 66 69 6e 65 2d 31 5d 3b 0a 20 20 2a 70 61 7a 20  fine-1];.  *paz 
bba0: 3d 20 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f  = (char *) mallo
bbb0: 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a  c( lemonStrlen(z
bbc0: 29 2b 31 20 29 3b 0a 20 20 69 66 28 20 2a 70 61  )+1 );.  if( *pa
bbd0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  z==0 ){.    fpri
bbe0: 6e 74 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20  ntf(stderr,"out 
bbf0: 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  of memory\n");. 
bc00: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
bc10: 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 2a    lemon_strcpy(*
bc20: 70 61 7a 2c 20 7a 29 3b 0a 20 20 66 6f 72 28 7a  paz, z);.  for(z
bc30: 3d 2a 70 61 7a 3b 20 2a 7a 20 26 26 20 2a 7a 21  =*paz; *z && *z!
bc40: 3d 27 3d 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20 2a  ='='; z++){}.  *
bc50: 7a 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63  z = 0;.}..static
bc60: 20 63 68 61 72 20 2a 75 73 65 72 5f 74 65 6d 70   char *user_temp
bc70: 6c 61 74 65 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b  latename = NULL;
bc80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 6e  .static void han
bc90: 64 6c 65 5f 54 5f 6f 70 74 69 6f 6e 28 63 68 61  dle_T_option(cha
bca0: 72 20 2a 7a 29 7b 0a 20 20 75 73 65 72 5f 74 65  r *z){.  user_te
bcb0: 6d 70 6c 61 74 65 6e 61 6d 65 20 3d 20 28 63 68  mplatename = (ch
bcc0: 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65  ar *) malloc( le
bcd0: 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29 2b 31 20 29  monStrlen(z)+1 )
bce0: 3b 0a 20 20 69 66 28 20 75 73 65 72 5f 74 65 6d  ;.  if( user_tem
bcf0: 70 6c 61 74 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  platename==0 ){.
bd00: 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72      memory_error
bd10: 28 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f  ();.  }.  lemon_
bd20: 73 74 72 63 70 79 28 75 73 65 72 5f 74 65 6d 70  strcpy(user_temp
bd30: 6c 61 74 65 6e 61 6d 65 2c 20 7a 29 3b 0a 7d 0a  latename, z);.}.
bd40: 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70 72 6f  ./* The main pro
bd50: 67 72 61 6d 2e 20 20 50 61 72 73 65 20 74 68 65  gram.  Parse the
bd60: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 6e   command line an
bd70: 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a 69 6e  d do it... */.in
bd80: 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c  t main(int argc,
bd90: 20 63 68 61 72 20 2a 2a 61 72 67 76 29 0a 7b 0a   char **argv).{.
bda0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 76 65 72    static int ver
bdb0: 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74  sion = 0;.  stat
bdc0: 69 63 20 69 6e 74 20 72 70 66 6c 61 67 20 3d 20  ic int rpflag = 
bdd0: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
bde0: 62 61 73 69 73 66 6c 61 67 20 3d 20 30 3b 0a 20  basisflag = 0;. 
bdf0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6d 70   static int comp
be00: 72 65 73 73 20 3d 20 30 3b 0a 20 20 73 74 61 74  ress = 0;.  stat
be10: 69 63 20 69 6e 74 20 71 75 69 65 74 20 3d 20 30  ic int quiet = 0
be20: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 73  ;.  static int s
be30: 74 61 74 69 73 74 69 63 73 20 3d 20 30 3b 0a 20  tatistics = 0;. 
be40: 20 73 74 61 74 69 63 20 69 6e 74 20 6d 68 66 6c   static int mhfl
be50: 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ag = 0;.  static
be60: 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c   int nolinenosfl
be70: 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ag = 0;.  static
be80: 20 69 6e 74 20 6e 6f 52 65 73 6f 72 74 20 3d 20   int noResort = 
be90: 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  0;.  static stru
bea0: 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f 70 74  ct s_options opt
beb0: 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  ions[] = {.    {
bec0: 4f 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c 20 28  OPT_FLAG, "b", (
bed0: 63 68 61 72 2a 29 26 62 61 73 69 73 66 6c 61 67  char*)&basisflag
bee0: 2c 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20 74 68  , "Print only th
bef0: 65 20 62 61 73 69 73 20 69 6e 20 72 65 70 6f 72  e basis in repor
bf00: 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  t."},.    {OPT_F
bf10: 4c 41 47 2c 20 22 63 22 2c 20 28 63 68 61 72 2a  LAG, "c", (char*
bf20: 29 26 63 6f 6d 70 72 65 73 73 2c 20 22 44 6f 6e  )&compress, "Don
bf30: 27 74 20 63 6f 6d 70 72 65 73 73 20 74 68 65 20  't compress the 
bf40: 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22 7d 2c  action table."},
bf50: 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20  .    {OPT_FSTR, 
bf60: 22 44 22 2c 20 28 63 68 61 72 2a 29 68 61 6e 64  "D", (char*)hand
bf70: 6c 65 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22 44 65  le_D_option, "De
bf80: 66 69 6e 65 20 61 6e 20 25 69 66 64 65 66 20 6d  fine an %ifdef m
bf90: 61 63 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  acro."},.    {OP
bfa0: 54 5f 46 53 54 52 2c 20 22 66 22 2c 20 30 2c 20  T_FSTR, "f", 0, 
bfb0: 22 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63  "Ignored.  (Plac
bfc0: 65 68 6f 6c 64 65 72 20 66 6f 72 20 2d 66 20 63  eholder for -f c
bfd0: 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e  ompiler options.
bfe0: 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  )"},.    {OPT_FL
bff0: 41 47 2c 20 22 67 22 2c 20 28 63 68 61 72 2a 29  AG, "g", (char*)
c000: 26 72 70 66 6c 61 67 2c 20 22 50 72 69 6e 74 20  &rpflag, "Print 
c010: 67 72 61 6d 6d 61 72 20 77 69 74 68 6f 75 74 20  grammar without 
c020: 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20  actions."},.    
c030: 7b 4f 50 54 5f 46 53 54 52 2c 20 22 49 22 2c 20  {OPT_FSTR, "I", 
c040: 30 2c 20 22 49 67 6e 6f 72 65 64 2e 20 20 28 50  0, "Ignored.  (P
c050: 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 27  laceholder for '
c060: 2d 49 27 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  -I' compiler opt
c070: 69 6f 6e 73 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f  ions.)"},.    {O
c080: 50 54 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28 63  PT_FLAG, "m", (c
c090: 68 61 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22 4f  har*)&mhflag, "O
c0a0: 75 74 70 75 74 20 61 20 6d 61 6b 65 68 65 61 64  utput a makehead
c0b0: 65 72 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 66  ers compatible f
c0c0: 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ile."},.    {OPT
c0d0: 5f 46 4c 41 47 2c 20 22 6c 22 2c 20 28 63 68 61  _FLAG, "l", (cha
c0e0: 72 2a 29 26 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  r*)&nolinenosfla
c0f0: 67 2c 20 22 44 6f 20 6e 6f 74 20 70 72 69 6e 74  g, "Do not print
c100: 20 23 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e 74   #line statement
c110: 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  s."},.    {OPT_F
c120: 53 54 52 2c 20 22 4f 22 2c 20 30 2c 20 22 49 67  STR, "O", 0, "Ig
c130: 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63 65 68 6f  nored.  (Placeho
c140: 6c 64 65 72 20 66 6f 72 20 27 2d 4f 27 20 63 6f  lder for '-O' co
c150: 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29  mpiler options.)
c160: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
c170: 47 2c 20 22 70 22 2c 20 28 63 68 61 72 2a 29 26  G, "p", (char*)&
c180: 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f  showPrecedenceCo
c190: 6e 66 6c 69 63 74 2c 0a 20 20 20 20 20 20 20 20  nflict,.        
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 68 6f              "Sho
c1b0: 77 20 63 6f 6e 66 6c 69 63 74 73 20 72 65 73 6f  w conflicts reso
c1c0: 6c 76 65 64 20 62 79 20 70 72 65 63 65 64 65 6e  lved by preceden
c1d0: 63 65 20 72 75 6c 65 73 22 7d 2c 0a 20 20 20 20  ce rules"},.    
c1e0: 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20  {OPT_FLAG, "q", 
c1f0: 28 63 68 61 72 2a 29 26 71 75 69 65 74 2c 20 22  (char*)&quiet, "
c200: 28 51 75 69 65 74 29 20 44 6f 6e 27 74 20 70 72  (Quiet) Don't pr
c210: 69 6e 74 20 74 68 65 20 72 65 70 6f 72 74 20 66  int the report f
c220: 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ile."},.    {OPT
c230: 5f 46 4c 41 47 2c 20 22 72 22 2c 20 28 63 68 61  _FLAG, "r", (cha
c240: 72 2a 29 26 6e 6f 52 65 73 6f 72 74 2c 20 22 44  r*)&noResort, "D
c250: 6f 20 6e 6f 74 20 73 6f 72 74 20 6f 72 20 72 65  o not sort or re
c260: 6e 75 6d 62 65 72 20 73 74 61 74 65 73 22 7d 2c  number states"},
c270: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
c280: 22 73 22 2c 20 28 63 68 61 72 2a 29 26 73 74 61  "s", (char*)&sta
c290: 74 69 73 74 69 63 73 2c 0a 20 20 20 20 20 20 20  tistics,.       
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 50 72 69              "Pri
c2c0: 6e 74 20 70 61 72 73 65 72 20 73 74 61 74 73 20  nt parser stats 
c2d0: 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70  to standard outp
c2e0: 75 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  ut."},.    {OPT_
c2f0: 46 4c 41 47 2c 20 22 78 22 2c 20 28 63 68 61 72  FLAG, "x", (char
c300: 2a 29 26 76 65 72 73 69 6f 6e 2c 20 22 50 72 69  *)&version, "Pri
c310: 6e 74 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  nt the version n
c320: 75 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20 7b 4f  umber."},.    {O
c330: 50 54 5f 46 53 54 52 2c 20 22 54 22 2c 20 28 63  PT_FSTR, "T", (c
c340: 68 61 72 2a 29 68 61 6e 64 6c 65 5f 54 5f 6f 70  har*)handle_T_op
c350: 74 69 6f 6e 2c 20 22 53 70 65 63 69 66 79 20 61  tion, "Specify a
c360: 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 2e 22   template file."
c370: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52  },.    {OPT_FSTR
c380: 2c 20 22 57 22 2c 20 30 2c 20 22 49 67 6e 6f 72  , "W", 0, "Ignor
c390: 65 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c 64 65  ed.  (Placeholde
c3a0: 72 20 66 6f 72 20 27 2d 57 27 20 63 6f 6d 70 69  r for '-W' compi
c3b0: 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c  ler options.)"},
c3c0: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 30  .    {OPT_FLAG,0
c3d0: 2c 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74  ,0,0}.  };.  int
c3e0: 20 69 3b 0a 20 20 69 6e 74 20 65 78 69 74 63 6f   i;.  int exitco
c3f0: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 6c 65 6d  de;.  struct lem
c400: 6f 6e 20 6c 65 6d 3b 0a 0a 20 20 4f 70 74 49 6e  on lem;..  OptIn
c410: 69 74 28 61 72 67 76 2c 6f 70 74 69 6f 6e 73 2c  it(argv,options,
c420: 73 74 64 65 72 72 29 3b 0a 20 20 69 66 28 20 76  stderr);.  if( v
c430: 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 70  ersion ){.     p
c440: 72 69 6e 74 66 28 22 4c 65 6d 6f 6e 20 76 65 72  rintf("Lemon ver
c450: 73 69 6f 6e 20 31 2e 30 5c 6e 22 29 3b 0a 20 20  sion 1.0\n");.  
c460: 20 20 20 65 78 69 74 28 30 29 3b 20 0a 20 20 7d     exit(0); .  }
c470: 0a 20 20 69 66 28 20 4f 70 74 4e 41 72 67 73 28  .  if( OptNArgs(
c480: 29 21 3d 31 20 29 7b 0a 20 20 20 20 66 70 72 69  )!=1 ){.    fpri
c490: 6e 74 66 28 73 74 64 65 72 72 2c 22 45 78 61 63  ntf(stderr,"Exac
c4a0: 74 6c 79 20 6f 6e 65 20 66 69 6c 65 6e 61 6d 65  tly one filename
c4b0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 72 65 71   argument is req
c4c0: 75 69 72 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20  uired.\n");.    
c4d0: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d  exit(1);.  }.  m
c4e0: 65 6d 73 65 74 28 26 6c 65 6d 2c 20 30 2c 20 73  emset(&lem, 0, s
c4f0: 69 7a 65 6f 66 28 6c 65 6d 29 29 3b 0a 20 20 6c  izeof(lem));.  l
c500: 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b  em.errorcnt = 0;
c510: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
c520: 65 20 74 68 65 20 6d 61 63 68 69 6e 65 20 2a 2f  e the machine */
c530: 0a 20 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28  .  Strsafe_init(
c540: 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69 6e 69 74  );.  Symbol_init
c550: 28 29 3b 0a 20 20 53 74 61 74 65 5f 69 6e 69 74  ();.  State_init
c560: 28 29 3b 0a 20 20 6c 65 6d 2e 61 72 67 76 30 20  ();.  lem.argv0 
c570: 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 6c 65 6d  = argv[0];.  lem
c580: 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 4f 70 74 41  .filename = OptA
c590: 72 67 28 30 29 3b 0a 20 20 6c 65 6d 2e 62 61 73  rg(0);.  lem.bas
c5a0: 69 73 66 6c 61 67 20 3d 20 62 61 73 69 73 66 6c  isflag = basisfl
c5b0: 61 67 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c 69 6e 65  ag;.  lem.noline
c5c0: 6e 6f 73 66 6c 61 67 20 3d 20 6e 6f 6c 69 6e 65  nosflag = noline
c5d0: 6e 6f 73 66 6c 61 67 3b 0a 20 20 53 79 6d 62 6f  nosflag;.  Symbo
c5e0: 6c 5f 6e 65 77 28 22 24 22 29 3b 0a 20 20 6c 65  l_new("$");.  le
c5f0: 6d 2e 65 72 72 73 79 6d 20 3d 20 53 79 6d 62 6f  m.errsym = Symbo
c600: 6c 5f 6e 65 77 28 22 65 72 72 6f 72 22 29 3b 0a  l_new("error");.
c610: 20 20 6c 65 6d 2e 65 72 72 73 79 6d 2d 3e 75 73    lem.errsym->us
c620: 65 43 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  eCnt = 0;..  /* 
c630: 50 61 72 73 65 20 74 68 65 20 69 6e 70 75 74 20  Parse the input 
c640: 66 69 6c 65 20 2a 2f 0a 20 20 50 61 72 73 65 28  file */.  Parse(
c650: 26 6c 65 6d 29 3b 0a 20 20 69 66 28 20 6c 65 6d  &lem);.  if( lem
c660: 2e 65 72 72 6f 72 63 6e 74 20 29 20 65 78 69 74  .errorcnt ) exit
c670: 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 29 3b 0a  (lem.errorcnt);.
c680: 20 20 69 66 28 20 6c 65 6d 2e 6e 72 75 6c 65 3d    if( lem.nrule=
c690: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
c6a0: 66 28 73 74 64 65 72 72 2c 22 45 6d 70 74 79 20  f(stderr,"Empty 
c6b0: 67 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20  grammar.\n");.  
c6c0: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a    exit(1);.  }..
c6d0: 20 20 2f 2a 20 43 6f 75 6e 74 20 61 6e 64 20 69    /* Count and i
c6e0: 6e 64 65 78 20 74 68 65 20 73 79 6d 62 6f 6c 73  ndex the symbols
c6f0: 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20   of the grammar 
c700: 2a 2f 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  */.  Symbol_new(
c710: 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20  "{default}");.  
c720: 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53 79  lem.nsymbol = Sy
c730: 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20 20  mbol_count();.  
c740: 6c 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20 53 79  lem.symbols = Sy
c750: 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 3b 0a  mbol_arrayof();.
c760: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
c770: 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c  .nsymbol; i++) l
c780: 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69  em.symbols[i]->i
c790: 6e 64 65 78 20 3d 20 69 3b 0a 20 20 71 73 6f 72  ndex = i;.  qsor
c7a0: 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65  t(lem.symbols,le
c7b0: 6d 2e 6e 73 79 6d 62 6f 6c 2c 73 69 7a 65 6f 66  m.nsymbol,sizeof
c7c0: 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29  (struct symbol*)
c7d0: 2c 20 53 79 6d 62 6f 6c 63 6d 70 70 29 3b 0a 20  , Symbolcmpp);. 
c7e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 2e   for(i=0; i<lem.
c7f0: 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65  nsymbol; i++) le
c800: 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e  m.symbols[i]->in
c810: 64 65 78 20 3d 20 69 3b 0a 20 20 77 68 69 6c 65  dex = i;.  while
c820: 28 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 2d  ( lem.symbols[i-
c830: 31 5d 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54  1]->type==MULTIT
c840: 45 52 4d 49 4e 41 4c 20 29 7b 20 69 2d 2d 3b 20  ERMINAL ){ i--; 
c850: 7d 0a 20 20 61 73 73 65 72 74 28 20 73 74 72 63  }.  assert( strc
c860: 6d 70 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69  mp(lem.symbols[i
c870: 2d 31 5d 2d 3e 6e 61 6d 65 2c 22 7b 64 65 66 61  -1]->name,"{defa
c880: 75 6c 74 7d 22 29 3d 3d 30 20 29 3b 0a 20 20 6c  ult}")==0 );.  l
c890: 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 69 20 2d  em.nsymbol = i -
c8a0: 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   1;.  for(i=1; i
c8b0: 73 75 70 70 65 72 28 6c 65 6d 2e 73 79 6d 62 6f  supper(lem.symbo
c8c0: 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 3b  ls[i]->name[0]);
c8d0: 20 69 2b 2b 29 3b 0a 20 20 6c 65 6d 2e 6e 74 65   i++);.  lem.nte
c8e0: 72 6d 69 6e 61 6c 20 3d 20 69 3b 0a 0a 20 20 2f  rminal = i;..  /
c8f0: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 72 65 70  * Generate a rep
c900: 72 69 6e 74 20 6f 66 20 74 68 65 20 67 72 61 6d  rint of the gram
c910: 6d 61 72 2c 20 69 66 20 72 65 71 75 65 73 74 65  mar, if requeste
c920: 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  d on the command
c930: 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 72   line */.  if( r
c940: 70 66 6c 61 67 20 29 7b 0a 20 20 20 20 52 65 70  pflag ){.    Rep
c950: 72 69 6e 74 28 26 6c 65 6d 29 3b 0a 20 20 7d 65  rint(&lem);.  }e
c960: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  lse{.    /* Init
c970: 69 61 6c 69 7a 65 20 74 68 65 20 73 69 7a 65 20  ialize the size 
c980: 66 6f 72 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61  for all follow a
c990: 6e 64 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f  nd first sets */
c9a0: 0a 20 20 20 20 53 65 74 53 69 7a 65 28 6c 65 6d  .    SetSize(lem
c9b0: 2e 6e 74 65 72 6d 69 6e 61 6c 2b 31 29 3b 0a 0a  .nterminal+1);..
c9c0: 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
c9d0: 70 72 65 63 65 64 65 6e 63 65 20 66 6f 72 20 65  precedence for e
c9e0: 76 65 72 79 20 70 72 6f 64 75 63 74 69 6f 6e 20  very production 
c9f0: 72 75 6c 65 20 28 74 68 61 74 20 68 61 73 20 6f  rule (that has o
ca00: 6e 65 29 20 2a 2f 0a 20 20 20 20 46 69 6e 64 52  ne) */.    FindR
ca10: 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28 26  ulePrecedences(&
ca20: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  lem);..    /* Co
ca30: 6d 70 75 74 65 20 74 68 65 20 6c 61 6d 62 64 61  mpute the lambda
ca40: 2d 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 61 6e  -nonterminals an
ca50: 64 20 74 68 65 20 66 69 72 73 74 2d 73 65 74 73  d the first-sets
ca60: 20 66 6f 72 20 65 76 65 72 79 0a 20 20 20 20 2a   for every.    *
ca70: 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 2a 2f  * nonterminal */
ca80: 0a 20 20 20 20 46 69 6e 64 46 69 72 73 74 53 65  .    FindFirstSe
ca90: 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  ts(&lem);..    /
caa0: 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52  * Compute all LR
cab0: 28 30 29 20 73 74 61 74 65 73 2e 20 20 41 6c 73  (0) states.  Als
cac0: 6f 20 72 65 63 6f 72 64 20 66 6f 6c 6c 6f 77 2d  o record follow-
cad0: 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 0a  set propagation.
cae0: 20 20 20 20 2a 2a 20 6c 69 6e 6b 73 20 73 6f 20      ** links so 
caf0: 74 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 2d  that the follow-
cb00: 73 65 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 75  set can be compu
cb10: 74 65 64 20 6c 61 74 65 72 20 2a 2f 0a 20 20 20  ted later */.   
cb20: 20 6c 65 6d 2e 6e 73 74 61 74 65 20 3d 20 30 3b   lem.nstate = 0;
cb30: 0a 20 20 20 20 46 69 6e 64 53 74 61 74 65 73 28  .    FindStates(
cb40: 26 6c 65 6d 29 3b 0a 20 20 20 20 6c 65 6d 2e 73  &lem);.    lem.s
cb50: 6f 72 74 65 64 20 3d 20 53 74 61 74 65 5f 61 72  orted = State_ar
cb60: 72 61 79 6f 66 28 29 3b 0a 0a 20 20 20 20 2f 2a  rayof();..    /*
cb70: 20 54 69 65 20 75 70 20 6c 6f 6f 73 65 20 65 6e   Tie up loose en
cb80: 64 73 20 6f 6e 20 74 68 65 20 70 72 6f 70 61 67  ds on the propag
cb90: 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20  ation links */. 
cba0: 20 20 20 46 69 6e 64 4c 69 6e 6b 73 28 26 6c 65     FindLinks(&le
cbb0: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
cbc0: 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 20 73  ute the follow s
cbd0: 65 74 20 6f 66 20 65 76 65 72 79 20 72 65 64 75  et of every redu
cbe0: 63 69 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74  cible configurat
cbf0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46  ion */.    FindF
cc00: 6f 6c 6c 6f 77 53 65 74 73 28 26 6c 65 6d 29 3b  ollowSets(&lem);
cc10: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
cc20: 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
cc30: 65 73 20 2a 2f 0a 20 20 20 20 46 69 6e 64 41 63  es */.    FindAc
cc40: 74 69 6f 6e 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  tions(&lem);..  
cc50: 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 20 74 68    /* Compress th
cc60: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20  e action tables 
cc70: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 6d 70 72  */.    if( compr
cc80: 65 73 73 3d 3d 30 20 29 20 43 6f 6d 70 72 65 73  ess==0 ) Compres
cc90: 73 54 61 62 6c 65 73 28 26 6c 65 6d 29 3b 0a 0a  sTables(&lem);..
cca0: 20 20 20 20 2f 2a 20 52 65 6f 72 64 65 72 20 61      /* Reorder a
ccb0: 6e 64 20 72 65 6e 75 6d 62 65 72 20 74 68 65 20  nd renumber the 
ccc0: 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20 73  states so that s
ccd0: 74 61 74 65 73 20 77 69 74 68 20 66 65 77 65 72  tates with fewer
cce0: 20 63 68 6f 69 63 65 73 0a 20 20 20 20 2a 2a 20   choices.    ** 
ccf0: 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e 64  occur at the end
cd00: 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  .  This is an op
cd10: 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20  timization that 
cd20: 68 65 6c 70 73 20 6d 61 6b 65 20 74 68 65 0a 20  helps make the. 
cd30: 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20     ** generated 
cd40: 70 61 72 73 65 72 20 74 61 62 6c 65 73 20 73 6d  parser tables sm
cd50: 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 69 66  aller. */.    if
cd60: 28 20 6e 6f 52 65 73 6f 72 74 3d 3d 30 20 29 20  ( noResort==0 ) 
cd70: 52 65 73 6f 72 74 53 74 61 74 65 73 28 26 6c 65  ResortStates(&le
cd80: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  m);..    /* Gene
cd90: 72 61 74 65 20 61 20 72 65 70 6f 72 74 20 6f 66  rate a report of
cda0: 20 74 68 65 20 70 61 72 73 65 72 20 67 65 6e 65   the parser gene
cdb0: 72 61 74 65 64 2e 20 20 28 74 68 65 20 22 79 2e  rated.  (the "y.
cdc0: 6f 75 74 70 75 74 22 20 66 69 6c 65 29 20 2a 2f  output" file) */
cdd0: 0a 20 20 20 20 69 66 28 20 21 71 75 69 65 74 20  .    if( !quiet 
cde0: 29 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28 26  ) ReportOutput(&
cdf0: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  lem);..    /* Ge
ce00: 6e 65 72 61 74 65 20 74 68 65 20 73 6f 75 72 63  nerate the sourc
ce10: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70  e code for the p
ce20: 61 72 73 65 72 20 2a 2f 0a 20 20 20 20 52 65 70  arser */.    Rep
ce30: 6f 72 74 54 61 62 6c 65 28 26 6c 65 6d 2c 20 6d  ortTable(&lem, m
ce40: 68 66 6c 61 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  hflag);..    /* 
ce50: 50 72 6f 64 75 63 65 20 61 20 68 65 61 64 65 72  Produce a header
ce60: 20 66 69 6c 65 20 66 6f 72 20 75 73 65 20 62 79   file for use by
ce70: 20 74 68 65 20 73 63 61 6e 6e 65 72 2e 20 20 28   the scanner.  (
ce80: 54 68 69 73 20 73 74 65 70 20 69 73 0a 20 20 20  This step is.   
ce90: 20 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74   ** omitted if t
cea0: 68 65 20 22 2d 6d 22 20 6f 70 74 69 6f 6e 20 69  he "-m" option i
ceb0: 73 20 75 73 65 64 20 62 65 63 61 75 73 65 20 6d  s used because m
cec0: 61 6b 65 68 65 61 64 65 72 73 20 77 69 6c 6c 0a  akeheaders will.
ced0: 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 20      ** generate 
cee0: 74 68 65 20 66 69 6c 65 20 66 6f 72 20 75 73 2e  the file for us.
cef0: 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 6d 68  ) */.    if( !mh
cf00: 66 6c 61 67 20 29 20 52 65 70 6f 72 74 48 65 61  flag ) ReportHea
cf10: 64 65 72 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20  der(&lem);.  }. 
cf20: 20 69 66 28 20 73 74 61 74 69 73 74 69 63 73 20   if( statistics 
cf30: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50  ){.    printf("P
cf40: 61 72 73 65 72 20 73 74 61 74 69 73 74 69 63 73  arser statistics
cf50: 3a 20 25 64 20 74 65 72 6d 69 6e 61 6c 73 2c 20  : %d terminals, 
cf60: 25 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2c  %d nonterminals,
cf70: 20 25 64 20 72 75 6c 65 73 5c 6e 22 2c 0a 20 20   %d rules\n",.  
cf80: 20 20 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61      lem.ntermina
cf90: 6c 2c 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 2d  l, lem.nsymbol -
cfa0: 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2c 20   lem.nterminal, 
cfb0: 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20 20 20  lem.nrule);.    
cfc0: 70 72 69 6e 74 66 28 22 20 20 20 20 20 20 20 20  printf("        
cfd0: 20 20 20 20 20 20 20 20 20 20 20 25 64 20 73 74             %d st
cfe0: 61 74 65 73 2c 20 25 64 20 70 61 72 73 65 72 20  ates, %d parser 
cff0: 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2c 20 25  table entries, %
d000: 64 20 63 6f 6e 66 6c 69 63 74 73 5c 6e 22 2c 0a  d conflicts\n",.
d010: 20 20 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74 65        lem.nstate
d020: 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69 7a 65 2c  , lem.tablesize,
d030: 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b   lem.nconflict);
d040: 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 2e 6e  .  }.  if( lem.n
d050: 63 6f 6e 66 6c 69 63 74 20 3e 20 30 20 29 7b 0a  conflict > 0 ){.
d060: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
d070: 72 72 2c 22 25 64 20 70 61 72 73 69 6e 67 20 63  rr,"%d parsing c
d080: 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c 65 6d  onflicts.\n",lem
d090: 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 7d  .nconflict);.  }
d0a0: 0a 0a 20 20 2f 2a 20 72 65 74 75 72 6e 20 30 20  ..  /* return 0 
d0b0: 6f 6e 20 73 75 63 63 65 73 73 2c 20 31 20 6f 6e  on success, 1 on
d0c0: 20 66 61 69 6c 75 72 65 2e 20 2a 2f 0a 20 20 65   failure. */.  e
d0d0: 78 69 74 63 6f 64 65 20 3d 20 28 28 6c 65 6d 2e  xitcode = ((lem.
d0e0: 65 72 72 6f 72 63 6e 74 20 3e 20 30 29 20 7c 7c  errorcnt > 0) ||
d0f0: 20 28 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20   (lem.nconflict 
d100: 3e 20 30 29 29 20 3f 20 31 20 3a 20 30 3b 0a 20  > 0)) ? 1 : 0;. 
d110: 20 65 78 69 74 28 65 78 69 74 63 6f 64 65 29 3b   exit(exitcode);
d120: 0a 20 20 72 65 74 75 72 6e 20 28 65 78 69 74 63  .  return (exitc
d130: 6f 64 65 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ode);.}./*******
d140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
d150: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6d 73 6f  om the file "mso
d160: 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rt.c" **********
d170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d180: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20 67  *****/./*.** A g
d190: 65 6e 65 72 69 63 20 6d 65 72 67 65 2d 73 6f 72  eneric merge-sor
d1a0: 74 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  t program..**.**
d1b0: 20 55 53 41 47 45 3a 0a 2a 2a 20 4c 65 74 20 22   USAGE:.** Let "
d1c0: 70 74 72 22 20 62 65 20 61 20 70 6f 69 6e 74 65  ptr" be a pointe
d1d0: 72 20 74 6f 20 73 6f 6d 65 20 73 74 72 75 63 74  r to some struct
d1e0: 75 72 65 20 77 68 69 63 68 20 69 73 20 61 74 20  ure which is at 
d1f0: 74 68 65 20 68 65 61 64 20 6f 66 0a 2a 2a 20 61  the head of.** a
d200: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
d210: 20 6c 69 73 74 2e 20 20 54 68 65 6e 20 74 6f 20   list.  Then to 
d220: 73 6f 72 74 20 74 68 65 20 6c 69 73 74 20 63 61  sort the list ca
d230: 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 74  ll:.**.**     pt
d240: 72 20 3d 20 6d 73 6f 72 74 28 70 74 72 2c 26 28  r = msort(ptr,&(
d250: 70 74 72 2d 3e 6e 65 78 74 29 2c 63 6d 70 66 6e  ptr->next),cmpfn
d260: 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  c);.**.** In the
d270: 20 61 62 6f 76 65 2c 20 22 63 6d 70 66 6e 63 22   above, "cmpfnc"
d280: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
d290: 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 63   a function whic
d2a0: 68 20 63 6f 6d 70 61 72 65 73 0a 2a 2a 20 74 77  h compares.** tw
d2b0: 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  o instances of t
d2c0: 68 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  he structure and
d2d0: 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 74 65   returns an inte
d2e0: 67 65 72 2c 20 61 73 20 69 6e 0a 2a 2a 20 73 74  ger, as in.** st
d2f0: 72 63 6d 70 2e 20 20 54 68 65 20 73 65 63 6f 6e  rcmp.  The secon
d300: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  d argument is a 
d310: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
d320: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
d330: 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20   second element 
d340: 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  of the linked li
d350: 73 74 2e 20 20 54 68 69 73 20 61 64 64 72 65 73  st.  This addres
d360: 73 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  s is used to com
d370: 70 75 74 65 0a 2a 2a 20 74 68 65 20 6f 66 66 73  pute.** the offs
d380: 65 74 20 74 6f 20 74 68 65 20 22 6e 65 78 74 22  et to the "next"
d390: 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68   field within th
d3a0: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
d3b0: 65 20 6f 66 66 73 65 74 20 74 6f 0a 2a 2a 20 74  e offset to.** t
d3c0: 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c 64 20  he "next" field 
d3d0: 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74  must be constant
d3e0: 20 66 6f 72 20 61 6c 6c 20 73 74 72 75 63 74 75   for all structu
d3f0: 72 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  res in the list.
d400: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74  .**.** The funct
d410: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 6e 65  ion returns a ne
d420: 77 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20  w pointer which 
d430: 69 73 20 74 68 65 20 68 65 61 64 20 6f 66 20 74  is the head of t
d440: 68 65 20 6c 69 73 74 0a 2a 2a 20 61 66 74 65 72  he list.** after
d450: 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   sorting..**.** 
d460: 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a 20 4d 65  ALGORITHM:.** Me
d470: 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a 2f 2a  rge-sort..*/../*
d480: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
d490: 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74  nter to the next
d4a0: 20 73 74 72 75 63 74 75 72 65 20 69 6e 20 74 68   structure in th
d4b0: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a  e linked list..*
d4c0: 2f 0a 23 64 65 66 69 6e 65 20 4e 45 58 54 28 41  /.#define NEXT(A
d4d0: 29 20 28 2a 28 63 68 61 72 2a 2a 29 28 28 28 63  ) (*(char**)(((c
d4e0: 68 61 72 2a 29 41 29 2b 6f 66 66 73 65 74 29 29  har*)A)+offset))
d4f0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a  ../*.** Inputs:.
d500: 2a 2a 20 20 20 61 3a 20 20 20 20 20 20 20 41 20  **   a:       A 
d510: 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72  sorted, null-ter
d520: 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c  minated linked l
d530: 69 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75  ist.  (May be nu
d540: 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a 20 20 20 20  ll)..**   b:    
d550: 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c     A sorted, nul
d560: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e  l-terminated lin
d570: 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20  ked list.  (May 
d580: 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 63  be null)..**   c
d590: 6d 70 3a 20 20 20 20 20 41 20 70 6f 69 6e 74 65  mp:     A pointe
d5a0: 72 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  r to the compari
d5b0: 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  son function..**
d5c0: 20 20 20 6f 66 66 73 65 74 3a 20 20 4f 66 66 73     offset:  Offs
d5d0: 65 74 20 69 6e 20 74 68 65 20 73 74 72 75 63 74  et in the struct
d5e0: 75 72 65 20 74 6f 20 74 68 65 20 22 6e 65 78 74  ure to the "next
d5f0: 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52  " field..**.** R
d600: 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20  eturn Value:.** 
d610: 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74    A pointer to t
d620: 68 65 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72  he head of a sor
d630: 74 65 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ted list contain
d640: 69 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73  ing the elements
d650: 0a 2a 2a 20 20 20 6f 66 20 62 6f 74 68 20 61 20  .**   of both a 
d660: 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 69 64  and b..**.** Sid
d670: 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20  e effects:.**   
d680: 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74  The "next" point
d690: 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73  ers for elements
d6a0: 20 69 6e 20 74 68 65 20 6c 69 73 74 73 20 61 20   in the lists a 
d6b0: 61 6e 64 20 62 20 61 72 65 0a 2a 2a 20 20 20 63  and b are.**   c
d6c0: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  hanged..*/.stati
d6d0: 63 20 63 68 61 72 20 2a 6d 65 72 67 65 28 0a 20  c char *merge(. 
d6e0: 20 63 68 61 72 20 2a 61 2c 0a 20 20 63 68 61 72   char *a,.  char
d6f0: 20 2a 62 2c 0a 20 20 69 6e 74 20 28 2a 63 6d 70   *b,.  int (*cmp
d700: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
d710: 6e 73 74 20 63 68 61 72 2a 29 2c 0a 20 20 69 6e  nst char*),.  in
d720: 74 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 63 68  t offset.){.  ch
d730: 61 72 20 2a 70 74 72 2c 20 2a 68 65 61 64 3b 0a  ar *ptr, *head;.
d740: 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20  .  if( a==0 ){. 
d750: 20 20 20 68 65 61 64 20 3d 20 62 3b 0a 20 20 7d     head = b;.  }
d760: 65 6c 73 65 20 69 66 28 20 62 3d 3d 30 20 29 7b  else if( b==0 ){
d770: 0a 20 20 20 20 68 65 61 64 20 3d 20 61 3b 0a 20  .    head = a;. 
d780: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
d790: 28 2a 63 6d 70 29 28 61 2c 62 29 3c 3d 30 20 29  (*cmp)(a,b)<=0 )
d7a0: 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b  {.      ptr = a;
d7b0: 0a 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28  .      a = NEXT(
d7c0: 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  a);.    }else{. 
d7d0: 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20       ptr = b;.  
d7e0: 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b      b = NEXT(b);
d7f0: 0a 20 20 20 20 7d 0a 20 20 20 20 68 65 61 64 20  .    }.    head 
d800: 3d 20 70 74 72 3b 0a 20 20 20 20 77 68 69 6c 65  = ptr;.    while
d810: 28 20 61 20 26 26 20 62 20 29 7b 0a 20 20 20 20  ( a && b ){.    
d820: 20 20 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62    if( (*cmp)(a,b
d830: 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )<=0 ){.        
d840: 4e 45 58 54 28 70 74 72 29 20 3d 20 61 3b 0a 20  NEXT(ptr) = a;. 
d850: 20 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a         ptr = a;.
d860: 20 20 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54          a = NEXT
d870: 28 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (a);.      }else
d880: 7b 0a 20 20 20 20 20 20 20 20 4e 45 58 54 28 70  {.        NEXT(p
d890: 74 72 29 20 3d 20 62 3b 0a 20 20 20 20 20 20 20  tr) = b;.       
d8a0: 20 70 74 72 20 3d 20 62 3b 0a 20 20 20 20 20 20   ptr = b;.      
d8b0: 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20    b = NEXT(b);. 
d8c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d8d0: 20 69 66 28 20 61 20 29 20 4e 45 58 54 28 70 74   if( a ) NEXT(pt
d8e0: 72 29 20 3d 20 61 3b 0a 20 20 20 20 65 6c 73 65  r) = a;.    else
d8f0: 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20      NEXT(ptr) = 
d900: 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  b;.  }.  return 
d910: 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  head;.}../*.** I
d920: 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 6c 69 73 74  nputs:.**   list
d930: 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74  :      Pointer t
d940: 6f 20 61 20 73 69 6e 67 6c 79 2d 6c 69 6e 6b 65  o a singly-linke
d950: 64 20 6c 69 73 74 20 6f 66 20 73 74 72 75 63 74  d list of struct
d960: 75 72 65 73 2e 0a 2a 2a 20 20 20 6e 65 78 74 3a  ures..**   next:
d970: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
d980: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
d990: 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f  second element o
d9a0: 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 20 20  f the list..**  
d9b0: 20 63 6d 70 3a 20 20 20 20 20 20 20 41 20 63 6f   cmp:       A co
d9c0: 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
d9d0: 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  n..**.** Return 
d9e0: 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f  Value:.**   A po
d9f0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
da00: 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20 6c 69  d of a sorted li
da10: 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  st containing th
da20: 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  e elements.**   
da30: 6f 72 67 69 6e 61 6c 6c 79 20 69 6e 20 6c 69 73  orginally in lis
da40: 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66  t..**.** Side ef
da50: 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20  fects:.**   The 
da60: 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20  "next" pointers 
da70: 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  for elements in 
da80: 6c 69 73 74 20 61 72 65 20 63 68 61 6e 67 65 64  list are changed
da90: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 49 53  ..*/.#define LIS
daa0: 54 53 49 5a 45 20 33 30 0a 73 74 61 74 69 63 20  TSIZE 30.static 
dab0: 63 68 61 72 20 2a 6d 73 6f 72 74 28 0a 20 20 63  char *msort(.  c
dac0: 68 61 72 20 2a 6c 69 73 74 2c 0a 20 20 63 68 61  har *list,.  cha
dad0: 72 20 2a 2a 6e 65 78 74 2c 0a 20 20 69 6e 74 20  r **next,.  int 
dae0: 28 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61  (*cmp)(const cha
daf0: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a  r*,const char*).
db00: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  ){.  unsigned lo
db10: 6e 67 20 6f 66 66 73 65 74 3b 0a 20 20 63 68 61  ng offset;.  cha
db20: 72 20 2a 65 70 3b 0a 20 20 63 68 61 72 20 2a 73  r *ep;.  char *s
db30: 65 74 5b 4c 49 53 54 53 49 5a 45 5d 3b 0a 20 20  et[LISTSIZE];.  
db40: 69 6e 74 20 69 3b 0a 20 20 6f 66 66 73 65 74 20  int i;.  offset 
db50: 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  = (unsigned long
db60: 29 28 28 63 68 61 72 2a 29 6e 65 78 74 20 2d 20  )((char*)next - 
db70: 28 63 68 61 72 2a 29 6c 69 73 74 29 3b 0a 20 20  (char*)list);.  
db80: 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53  for(i=0; i<LISTS
db90: 49 5a 45 3b 20 69 2b 2b 29 20 73 65 74 5b 69 5d  IZE; i++) set[i]
dba0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 6c   = 0;.  while( l
dbb0: 69 73 74 20 29 7b 0a 20 20 20 20 65 70 20 3d 20  ist ){.    ep = 
dbc0: 6c 69 73 74 3b 0a 20 20 20 20 6c 69 73 74 20 3d  list;.    list =
dbd0: 20 4e 45 58 54 28 6c 69 73 74 29 3b 0a 20 20 20   NEXT(list);.   
dbe0: 20 4e 45 58 54 28 65 70 29 20 3d 20 30 3b 0a 20   NEXT(ep) = 0;. 
dbf0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49     for(i=0; i<LI
dc00: 53 54 53 49 5a 45 2d 31 20 26 26 20 73 65 74 5b  STSIZE-1 && set[
dc10: 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  i]!=0; i++){.   
dc20: 20 20 20 65 70 20 3d 20 6d 65 72 67 65 28 65 70     ep = merge(ep
dc30: 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73  ,set[i],cmp,offs
dc40: 65 74 29 3b 0a 20 20 20 20 20 20 73 65 74 5b 69  et);.      set[i
dc50: 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = 0;.    }.   
dc60: 20 73 65 74 5b 69 5d 20 3d 20 65 70 3b 0a 20 20   set[i] = ep;.  
dc70: 7d 0a 20 20 65 70 20 3d 20 30 3b 0a 20 20 66 6f  }.  ep = 0;.  fo
dc80: 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a  r(i=0; i<LISTSIZ
dc90: 45 3b 20 69 2b 2b 29 20 69 66 28 20 73 65 74 5b  E; i++) if( set[
dca0: 69 5d 20 29 20 65 70 20 3d 20 6d 65 72 67 65 28  i] ) ep = merge(
dcb0: 73 65 74 5b 69 5d 2c 65 70 2c 63 6d 70 2c 6f 66  set[i],ep,cmp,of
dcc0: 66 73 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  fset);.  return 
dcd0: 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ep;.}./*********
dce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
dcf0: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6f  From the file "o
dd00: 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  ption.c" *******
dd10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd20: 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ***/.static char
dd30: 20 2a 2a 61 72 67 76 3b 0a 73 74 61 74 69 63 20   **argv;.static 
dd40: 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73  struct s_options
dd50: 20 2a 6f 70 3b 0a 73 74 61 74 69 63 20 46 49 4c   *op;.static FIL
dd60: 45 20 2a 65 72 72 73 74 72 65 61 6d 3b 0a 0a 23  E *errstream;..#
dd70: 64 65 66 69 6e 65 20 49 53 4f 50 54 28 58 29 20  define ISOPT(X) 
dd80: 28 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c 7c 28 58  ((X)[0]=='-'||(X
dd90: 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74 72 63 68  )[0]=='+'||strch
dda0: 72 28 28 58 29 2c 27 3d 27 29 21 3d 30 29 0a 0a  r((X),'=')!=0)..
ddb0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
ddc0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 69 74  command line wit
ddd0: 68 20 61 20 63 61 72 72 6f 74 20 70 6f 69 6e 74  h a carrot point
dde0: 69 6e 67 20 74 6f 20 74 68 65 20 6b 2d 74 68 20  ing to the k-th 
ddf0: 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20  character.** of 
de00: 74 68 65 20 6e 2d 74 68 20 66 69 65 6c 64 2e 0a  the n-th field..
de10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
de20: 72 72 6c 69 6e 65 28 69 6e 74 20 6e 2c 20 69 6e  rrline(int n, in
de30: 74 20 6b 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a  t k, FILE *err).
de40: 7b 0a 20 20 69 6e 74 20 73 70 63 6e 74 2c 20 69  {.  int spcnt, i
de50: 3b 0a 20 20 69 66 28 20 61 72 67 76 5b 30 5d 20  ;.  if( argv[0] 
de60: 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25  ) fprintf(err,"%
de70: 73 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73  s",argv[0]);.  s
de80: 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c  pcnt = lemonStrl
de90: 65 6e 28 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b  en(argv[0]) + 1;
dea0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20  .  for(i=1; i<n 
deb0: 26 26 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29  && argv[i]; i++)
dec0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72  {.    fprintf(er
ded0: 72 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d 29  r," %s",argv[i])
dee0: 3b 0a 20 20 20 20 73 70 63 6e 74 20 2b 3d 20 6c  ;.    spcnt += l
def0: 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76 5b  emonStrlen(argv[
df00: 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20 20 73 70 63  i])+1;.  }.  spc
df10: 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b  nt += k;.  for(;
df20: 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 20 66   argv[i]; i++) f
df30: 70 72 69 6e 74 66 28 65 72 72 2c 22 20 25 73 22  printf(err," %s"
df40: 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 69 66 28  ,argv[i]);.  if(
df50: 20 73 70 63 6e 74 3c 32 30 20 29 7b 0a 20 20 20   spcnt<20 ){.   
df60: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e   fprintf(err,"\n
df70: 25 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c 73  %*s^-- here\n",s
df80: 70 63 6e 74 2c 22 22 29 3b 0a 20 20 7d 65 6c 73  pcnt,"");.  }els
df90: 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65  e{.    fprintf(e
dfa0: 72 72 2c 22 5c 6e 25 2a 73 68 65 72 65 20 2d 2d  rr,"\n%*shere --
dfb0: 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c 22 22 29  ^\n",spcnt-7,"")
dfc0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
dfd0: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
dfe0: 6f 66 20 74 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d  of the N-th non-
dff0: 73 77 69 74 63 68 20 61 72 67 75 6d 65 6e 74 2e  switch argument.
e000: 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69    Return -1.** i
e010: 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f N is out of ra
e020: 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nge..*/.static i
e030: 6e 74 20 61 72 67 69 6e 64 65 78 28 69 6e 74 20  nt argindex(int 
e040: 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  n).{.  int i;.  
e050: 69 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20 30  int dashdash = 0
e060: 3b 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20  ;.  if( argv!=0 
e070: 26 26 20 2a 61 72 67 76 21 3d 30 20 29 7b 0a 20  && *argv!=0 ){. 
e080: 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76     for(i=1; argv
e090: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
e0a0: 20 69 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c   if( dashdash ||
e0b0: 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29   !ISOPT(argv[i])
e0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e0d0: 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  n==0 ) return i;
e0e0: 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  .        n--;.  
e0f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e100: 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22  strcmp(argv[i],"
e110: 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61  --")==0 ) dashda
e120: 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  sh = 1;.    }.  
e130: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
e140: 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 65 6d  ..static char em
e150: 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64 20  sg[] = "Command 
e160: 6c 69 6e 65 20 73 79 6e 74 61 78 20 65 72 72 6f  line syntax erro
e170: 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  r: ";../*.** Pro
e180: 63 65 73 73 20 61 20 66 6c 61 67 20 63 6f 6d 6d  cess a flag comm
e190: 61 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and line argumen
e1a0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
e1b0: 20 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 6e 74   handleflags(int
e1c0: 20 69 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b   i, FILE *err).{
e1d0: 0a 20 20 69 6e 74 20 76 3b 0a 20 20 69 6e 74 20  .  int v;.  int 
e1e0: 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  errcnt = 0;.  in
e1f0: 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  t j;.  for(j=0; 
e200: 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b  op[j].label; j++
e210: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63  ){.    if( strnc
e220: 6d 70 28 26 61 72 67 76 5b 69 5d 5b 31 5d 2c 6f  mp(&argv[i][1],o
e230: 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c 65 6d 6f 6e  p[j].label,lemon
e240: 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d 2e 6c 61 62  Strlen(op[j].lab
e250: 65 6c 29 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  el))==0 ) break;
e260: 0a 20 20 7d 0a 20 20 76 20 3d 20 61 72 67 76 5b  .  }.  v = argv[
e270: 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f 20 31 20 3a  i][0]=='-' ? 1 :
e280: 20 30 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e   0;.  if( op[j].
e290: 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  label==0 ){.    
e2a0: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
e2b0: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
e2c0: 75 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e  undefined option
e2d0: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
e2e0: 20 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72    errline(i,1,er
e2f0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72  r);.    }.    er
e300: 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20  rcnt++;.  }else 
e310: 69 66 28 20 6f 70 5b 6a 5d 2e 61 72 67 3d 3d 30  if( op[j].arg==0
e320: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72   ){.    /* Ignor
e330: 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 2a 2f  e this option */
e340: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b  .  }else if( op[
e350: 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 4c 41  j].type==OPT_FLA
e360: 47 20 29 7b 0a 20 20 20 20 2a 28 28 69 6e 74 2a  G ){.    *((int*
e370: 29 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 76 3b  )op[j].arg) = v;
e380: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b  .  }else if( op[
e390: 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 46 4c  j].type==OPT_FFL
e3a0: 41 47 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69  AG ){.    (*(voi
e3b0: 64 28 2a 29 28 69 6e 74 29 29 28 6f 70 5b 6a 5d  d(*)(int))(op[j]
e3c0: 2e 61 72 67 29 29 28 76 29 3b 0a 20 20 7d 65 6c  .arg))(v);.  }el
e3d0: 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70  se if( op[j].typ
e3e0: 65 3d 3d 4f 50 54 5f 46 53 54 52 20 29 7b 0a 20  e==OPT_FSTR ){. 
e3f0: 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 63 68     (*(void(*)(ch
e400: 61 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61 72 67  ar *))(op[j].arg
e410: 29 29 28 26 61 72 67 76 5b 69 5d 5b 32 5d 29 3b  ))(&argv[i][2]);
e420: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
e430: 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66  ( err ){.      f
e440: 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 6d 69  printf(err,"%smi
e450: 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f  ssing argument o
e460: 6e 20 73 77 69 74 63 68 2e 5c 6e 22 2c 65 6d 73  n switch.\n",ems
e470: 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e  g);.      errlin
e480: 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20  e(i,1,err);.    
e490: 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a  }.    errcnt++;.
e4a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72    }.  return err
e4b0: 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  cnt;.}../*.** Pr
e4c0: 6f 63 65 73 73 20 61 20 63 6f 6d 6d 61 6e 64 20  ocess a command 
e4d0: 6c 69 6e 65 20 73 77 69 74 63 68 20 77 68 69 63  line switch whic
e4e0: 68 20 68 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  h has an argumen
e4f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
e500: 20 68 61 6e 64 6c 65 73 77 69 74 63 68 28 69 6e   handleswitch(in
e510: 74 20 69 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a  t i, FILE *err).
e520: 7b 0a 20 20 69 6e 74 20 6c 76 20 3d 20 30 3b 0a  {.  int lv = 0;.
e530: 20 20 64 6f 75 62 6c 65 20 64 76 20 3d 20 30 2e    double dv = 0.
e540: 30 3b 0a 20 20 63 68 61 72 20 2a 73 76 20 3d 20  0;.  char *sv = 
e550: 30 2c 20 2a 65 6e 64 3b 0a 20 20 63 68 61 72 20  0, *end;.  char 
e560: 2a 63 70 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  *cp;.  int j;.  
e570: 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a  int errcnt = 0;.
e580: 20 20 63 70 20 3d 20 73 74 72 63 68 72 28 61 72    cp = strchr(ar
e590: 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20 20 61 73  gv[i],'=');.  as
e5a0: 73 65 72 74 28 20 63 70 21 3d 30 20 29 3b 0a 20  sert( cp!=0 );. 
e5b0: 20 2a 63 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28   *cp = 0;.  for(
e5c0: 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c  j=0; op[j].label
e5d0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
e5e0: 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 6f  strcmp(argv[i],o
e5f0: 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20 29  p[j].label)==0 )
e600: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a 63   break;.  }.  *c
e610: 70 20 3d 20 27 3d 27 3b 0a 20 20 69 66 28 20 6f  p = '=';.  if( o
e620: 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b  p[j].label==0 ){
e630: 0a 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a  .    if( err ){.
e640: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
e650: 72 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f  r,"%sundefined o
e660: 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b  ption.\n",emsg);
e670: 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69  .      errline(i
e680: 2c 30 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20  ,0,err);.    }. 
e690: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d     errcnt++;.  }
e6a0: 65 6c 73 65 7b 0a 20 20 20 20 63 70 2b 2b 3b 0a  else{.    cp++;.
e6b0: 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a      switch( op[j
e6c0: 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  ].type ){.      
e6d0: 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20  case OPT_FLAG:. 
e6e0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46       case OPT_FF
e6f0: 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 69 66 28  LAG:.        if(
e700: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20   err ){.        
e710: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25    fprintf(err,"%
e720: 73 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73  soption requires
e730: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22   an argument.\n"
e740: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  ,emsg);.        
e750: 20 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72    errline(i,0,er
e760: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
e770: 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a        errcnt++;.
e780: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e790: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42       case OPT_DB
e7a0: 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  L:.      case OP
e7b0: 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20  T_FDBL:.        
e7c0: 64 76 20 3d 20 73 74 72 74 6f 64 28 63 70 2c 26  dv = strtod(cp,&
e7d0: 65 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66  end);.        if
e7e0: 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20  ( *end ){.      
e7f0: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
e800: 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
e810: 74 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61  tf(err,"%sillega
e820: 6c 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 66  l character in f
e830: 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 61 72  loating-point ar
e840: 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29  gument.\n",emsg)
e850: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72  ;.            er
e860: 72 6c 69 6e 65 28 69 2c 28 69 6e 74 29 28 28 63  rline(i,(int)((c
e870: 68 61 72 2a 29 65 6e 64 2d 28 63 68 61 72 2a 29  har*)end-(char*)
e880: 61 72 67 76 5b 69 5d 29 2c 65 72 72 29 3b 0a 20  argv[i]),err);. 
e890: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e8a0: 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20       errcnt++;. 
e8b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e8c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
e8d0: 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20  se OPT_INT:.    
e8e0: 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a    case OPT_FINT:
e8f0: 0a 20 20 20 20 20 20 20 20 6c 76 20 3d 20 73 74  .        lv = st
e900: 72 74 6f 6c 28 63 70 2c 26 65 6e 64 2c 30 29 3b  rtol(cp,&end,0);
e910: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e  .        if( *en
e920: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  d ){.          i
e930: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
e940: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
e950: 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61  r,"%sillegal cha
e960: 72 61 63 74 65 72 20 69 6e 20 69 6e 74 65 67 65  racter in intege
e970: 72 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65  r argument.\n",e
e980: 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
e990: 20 20 65 72 72 6c 69 6e 65 28 69 2c 28 69 6e 74    errline(i,(int
e9a0: 29 28 28 63 68 61 72 2a 29 65 6e 64 2d 28 63 68  )((char*)end-(ch
e9b0: 61 72 2a 29 61 72 67 76 5b 69 5d 29 2c 65 72 72  ar*)argv[i]),err
e9c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
e9d0: 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b           errcnt+
e9e0: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
e9f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ea00: 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a    case OPT_STR:.
ea10: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
ea20: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 73 76 20  STR:.        sv 
ea30: 3d 20 63 70 3b 0a 20 20 20 20 20 20 20 20 62 72  = cp;.        br
ea40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  eak;.    }.    s
ea50: 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70  witch( op[j].typ
ea60: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
ea70: 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
ea80: 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
ea90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
eaa0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42       case OPT_DB
eab0: 4c 3a 0a 20 20 20 20 20 20 20 20 2a 28 64 6f 75  L:.        *(dou
eac0: 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  ble*)(op[j].arg)
ead0: 20 3d 20 64 76 3b 0a 20 20 20 20 20 20 20 20 62   = dv;.        b
eae0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
eaf0: 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20   OPT_FDBL:.     
eb00: 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 64 6f     (*(void(*)(do
eb10: 75 62 6c 65 29 29 28 6f 70 5b 6a 5d 2e 61 72 67  uble))(op[j].arg
eb20: 29 29 28 64 76 29 3b 0a 20 20 20 20 20 20 20 20  ))(dv);.        
eb30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
eb40: 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20  e OPT_INT:.     
eb50: 20 20 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d     *(int*)(op[j]
eb60: 2e 61 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20 20  .arg) = lv;.    
eb70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
eb80: 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a   case OPT_FINT:.
eb90: 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28          (*(void(
eba0: 2a 29 28 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e 61  *)(int))(op[j].a
ebb0: 72 67 29 29 28 28 69 6e 74 29 6c 76 29 3b 0a 20  rg))((int)lv);. 
ebc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ebd0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52      case OPT_STR
ebe0: 3a 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72  :.        *(char
ebf0: 2a 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d  **)(op[j].arg) =
ec00: 20 73 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65   sv;.        bre
ec10: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
ec20: 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20  PT_FSTR:.       
ec30: 20 28 2a 28 76 6f 69 64 28 2a 29 28 63 68 61 72   (*(void(*)(char
ec40: 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29   *))(op[j].arg))
ec50: 28 73 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (sv);.        br
ec60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
ec70: 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a   return errcnt;.
ec80: 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e 69 74 28 63  }..int OptInit(c
ec90: 68 61 72 20 2a 2a 61 2c 20 73 74 72 75 63 74 20  har **a, struct 
eca0: 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 2c 20 46 49  s_options *o, FI
ecb0: 4c 45 20 2a 65 72 72 29 0a 7b 0a 20 20 69 6e 74  LE *err).{.  int
ecc0: 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61   errcnt = 0;.  a
ecd0: 72 67 76 20 3d 20 61 3b 0a 20 20 6f 70 20 3d 20  rgv = a;.  op = 
ece0: 6f 3b 0a 20 20 65 72 72 73 74 72 65 61 6d 20 3d  o;.  errstream =
ecf0: 20 65 72 72 3b 0a 20 20 69 66 28 20 61 72 67 76   err;.  if( argv
ed00: 20 26 26 20 2a 61 72 67 76 20 26 26 20 6f 70 20   && *argv && op 
ed10: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
ed20: 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b    for(i=1; argv[
ed30: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
ed40: 69 66 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d  if( argv[i][0]==
ed50: 27 2b 27 20 7c 7c 20 61 72 67 76 5b 69 5d 5b 30  '+' || argv[i][0
ed60: 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
ed70: 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64    errcnt += hand
ed80: 6c 65 66 6c 61 67 73 28 69 2c 65 72 72 29 3b 0a  leflags(i,err);.
ed90: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
eda0: 73 74 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27  strchr(argv[i],'
edb0: 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65  =') ){.        e
edc0: 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 73  rrcnt += handles
edd0: 77 69 74 63 68 28 69 2c 65 72 72 29 3b 0a 20 20  witch(i,err);.  
ede0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
edf0: 20 20 69 66 28 20 65 72 72 63 6e 74 3e 30 20 29    if( errcnt>0 )
ee00: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72  {.    fprintf(er
ee10: 72 2c 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e 64  r,"Valid command
ee20: 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66 6f   line options fo
ee30: 72 20 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e 22  r \"%s\" are:\n"
ee40: 2c 2a 61 29 3b 0a 20 20 20 20 4f 70 74 50 72 69  ,*a);.    OptPri
ee50: 6e 74 28 29 3b 0a 20 20 20 20 65 78 69 74 28 31  nt();.    exit(1
ee60: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
ee70: 30 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41 72  0;.}..int OptNAr
ee80: 67 73 28 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  gs(){.  int cnt 
ee90: 3d 20 30 3b 0a 20 20 69 6e 74 20 64 61 73 68 64  = 0;.  int dashd
eea0: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
eeb0: 3b 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20  ;.  if( argv!=0 
eec0: 26 26 20 61 72 67 76 5b 30 5d 21 3d 30 20 29 7b  && argv[0]!=0 ){
eed0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72  .    for(i=1; ar
eee0: 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  gv[i]; i++){.   
eef0: 20 20 20 69 66 28 20 64 61 73 68 64 61 73 68 20     if( dashdash 
ef00: 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69  || !ISOPT(argv[i
ef10: 5d 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20  ]) ) cnt++;.    
ef20: 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
ef30: 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20  v[i],"--")==0 ) 
ef40: 64 61 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20  dashdash = 1;.  
ef50: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
ef60: 20 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f   cnt;.}..char *O
ef70: 70 74 41 72 67 28 69 6e 74 20 6e 29 0a 7b 0a 20  ptArg(int n).{. 
ef80: 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61 72   int i;.  i = ar
ef90: 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72 65 74  gindex(n);.  ret
efa0: 75 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67 76 5b  urn i>=0 ? argv[
efb0: 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20  i] : 0;.}..void 
efc0: 4f 70 74 45 72 72 28 69 6e 74 20 6e 29 0a 7b 0a  OptErr(int n).{.
efd0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61    int i;.  i = a
efe0: 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 69 66  rgindex(n);.  if
eff0: 28 20 69 3e 3d 30 20 29 20 65 72 72 6c 69 6e 65  ( i>=0 ) errline
f000: 28 69 2c 30 2c 65 72 72 73 74 72 65 61 6d 29 3b  (i,0,errstream);
f010: 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 50 72 69 6e  .}..void OptPrin
f020: 74 28 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  t(){.  int i;.  
f030: 69 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b 0a 20 20  int max, len;.  
f040: 6d 61 78 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  max = 0;.  for(i
f050: 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b  =0; op[i].label;
f060: 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6e 20 3d   i++){.    len =
f070: 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b   lemonStrlen(op[
f080: 69 5d 2e 6c 61 62 65 6c 29 20 2b 20 31 3b 0a 20  i].label) + 1;. 
f090: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d     switch( op[i]
f0a0: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
f0b0: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
f0c0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
f0d0: 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61  AG:.        brea
f0e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
f0f0: 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73  T_INT:.      cas
f100: 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20  e OPT_FINT:.    
f110: 20 20 20 20 6c 65 6e 20 2b 3d 20 39 3b 20 20 20      len += 9;   
f120: 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66      /* length of
f130: 20 22 3c 69 6e 74 65 67 65 72 3e 22 20 2a 2f 0a   "<integer>" */.
f140: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f150: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42       case OPT_DB
f160: 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  L:.      case OP
f170: 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20  T_FDBL:.        
f180: 6c 65 6e 20 2b 3d 20 36 3b 20 20 20 20 20 20 20  len += 6;       
f190: 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 72  /* length of "<r
f1a0: 65 61 6c 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20  eal>" */.       
f1b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
f1c0: 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20  se OPT_STR:.    
f1d0: 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a    case OPT_FSTR:
f1e0: 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20  .        len += 
f1f0: 38 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67  8;       /* leng
f200: 74 68 20 6f 66 20 22 3c 73 74 72 69 6e 67 3e 22  th of "<string>"
f210: 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
f220: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
f230: 20 6c 65 6e 3e 6d 61 78 20 29 20 6d 61 78 20 3d   len>max ) max =
f240: 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   len;.  }.  for(
f250: 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c  i=0; op[i].label
f260: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74  ; i++){.    swit
f270: 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29  ch( op[i].type )
f280: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  {.      case OPT
f290: 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73  _FLAG:.      cas
f2a0: 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20  e OPT_FFLAG:.   
f2b0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
f2c0: 73 74 72 65 61 6d 2c 22 20 20 2d 25 2d 2a 73 20  stream,"  -%-*s 
f2d0: 20 25 73 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d   %s\n",max,op[i]
f2e0: 2e 6c 61 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73  .label,op[i].mes
f2f0: 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62  sage);.        b
f300: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
f310: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
f320: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
f330: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65         fprintf(e
f340: 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 73 3c  rrstream,"  -%s<
f350: 69 6e 74 65 67 65 72 3e 25 2a 73 20 20 25 73 5c  integer>%*s  %s\
f360: 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a  n",op[i].label,.
f370: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
f380: 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  max-lemonStrlen(
f390: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 39 29 2c  op[i].label)-9),
f3a0: 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65  "",op[i].message
f3b0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
f3c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
f3d0: 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  _DBL:.      case
f3e0: 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20   OPT_FDBL:.     
f3f0: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74     fprintf(errst
f400: 72 65 61 6d 2c 22 20 20 2d 25 73 3c 72 65 61 6c  ream,"  -%s<real
f410: 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69  >%*s  %s\n",op[i
f420: 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  ].label,.       
f430: 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d     (int)(max-lem
f440: 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c  onStrlen(op[i].l
f450: 61 62 65 6c 29 2d 36 29 2c 22 22 2c 6f 70 5b 69  abel)-6),"",op[i
f460: 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20  ].message);.    
f470: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f480: 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20   case OPT_STR:. 
f490: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53       case OPT_FS
f4a0: 54 52 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69  TR:.        fpri
f4b0: 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20  ntf(errstream," 
f4c0: 20 2d 25 73 3c 73 74 72 69 6e 67 3e 25 2a 73 20   -%s<string>%*s 
f4d0: 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62   %s\n",op[i].lab
f4e0: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69  el,.          (i
f4f0: 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72  nt)(max-lemonStr
f500: 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29  len(op[i].label)
f510: 2d 38 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73  -8),"",op[i].mes
f520: 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62  sage);.        b
f530: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
f540: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
f550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
f560: 74 68 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e  the file "parse.
f570: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
f580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
f590: 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 20 66 69 6c  ./*.** Input fil
f5a0: 65 20 70 61 72 73 65 72 20 66 6f 72 20 74 68 65  e parser for the
f5b0: 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
f5c0: 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20  nerator..*/../* 
f5d0: 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  The state of the
f5e0: 20 70 61 72 73 65 72 20 2a 2f 0a 65 6e 75 6d 20   parser */.enum 
f5f0: 65 5f 73 74 61 74 65 20 7b 0a 20 20 49 4e 49 54  e_state {.  INIT
f600: 49 41 4c 49 5a 45 2c 0a 20 20 57 41 49 54 49 4e  IALIZE,.  WAITIN
f610: 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
f620: 4c 45 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  LE,.  WAITING_FO
f630: 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a  R_DECL_KEYWORD,.
f640: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45    WAITING_FOR_DE
f650: 43 4c 5f 41 52 47 2c 0a 20 20 57 41 49 54 49 4e  CL_ARG,.  WAITIN
f660: 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45  G_FOR_PRECEDENCE
f670: 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49  _SYMBOL,.  WAITI
f680: 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 2c 0a 20 20  NG_FOR_ARROW,.  
f690: 49 4e 5f 52 48 53 2c 0a 20 20 4c 48 53 5f 41 4c  IN_RHS,.  LHS_AL
f6a0: 49 41 53 5f 31 2c 0a 20 20 4c 48 53 5f 41 4c 49  IAS_1,.  LHS_ALI
f6b0: 41 53 5f 32 2c 0a 20 20 4c 48 53 5f 41 4c 49 41  AS_2,.  LHS_ALIA
f6c0: 53 5f 33 2c 0a 20 20 52 48 53 5f 41 4c 49 41 53  S_3,.  RHS_ALIAS
f6d0: 5f 31 2c 0a 20 20 52 48 53 5f 41 4c 49 41 53 5f  _1,.  RHS_ALIAS_
f6e0: 32 2c 0a 20 20 50 52 45 43 45 44 45 4e 43 45 5f  2,.  PRECEDENCE_
f6f0: 4d 41 52 4b 5f 31 2c 0a 20 20 50 52 45 43 45 44  MARK_1,.  PRECED
f700: 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c 0a 20 20 52  ENCE_MARK_2,.  R
f710: 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
f720: 5f 45 52 52 4f 52 2c 0a 20 20 52 45 53 59 4e 43  _ERROR,.  RESYNC
f730: 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
f740: 52 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  R,.  WAITING_FOR
f750: 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42  _DESTRUCTOR_SYMB
f760: 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  OL,.  WAITING_FO
f770: 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f  R_DATATYPE_SYMBO
f780: 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  L,.  WAITING_FOR
f790: 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 2c 0a 20 20  _FALLBACK_ID,.  
f7a0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44  WAITING_FOR_WILD
f7b0: 43 41 52 44 5f 49 44 2c 0a 20 20 57 41 49 54 49  CARD_ID,.  WAITI
f7c0: 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 49 44 2c  NG_FOR_CLASS_ID,
f7d0: 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43  .  WAITING_FOR_C
f7e0: 4c 41 53 53 5f 54 4f 4b 45 4e 0a 7d 3b 0a 73 74  LASS_TOKEN.};.st
f7f0: 72 75 63 74 20 70 73 74 61 74 65 20 7b 0a 20 20  ruct pstate {.  
f800: 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20  char *filename; 
f810: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
f820: 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
f830: 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b 65 6e 6c 69  */.  int tokenli
f840: 6e 65 6e 6f 3b 20 20 20 20 20 20 2f 2a 20 4c 69  neno;      /* Li
f850: 6e 65 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63  nenumber at whic
f860: 68 20 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20  h current token 
f870: 73 74 61 72 74 73 20 2a 2f 0a 20 20 69 6e 74 20  starts */.  int 
f880: 65 72 72 6f 72 63 6e 74 3b 20 20 20 20 20 20 20  errorcnt;       
f890: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
f8a0: 72 72 6f 72 73 20 73 6f 20 66 61 72 20 2a 2f 0a  rrors so far */.
f8b0: 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 73 74 61    char *tokensta
f8c0: 72 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20  rt;     /* Text 
f8d0: 6f 66 20 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e  of current token
f8e0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 65 6d   */.  struct lem
f8f0: 6f 6e 20 2a 67 70 3b 20 20 20 20 20 2f 2a 20 47  on *gp;     /* G
f900: 6c 6f 62 61 6c 20 73 74 61 74 65 20 76 65 63 74  lobal state vect
f910: 6f 72 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 73  or */.  enum e_s
f920: 74 61 74 65 20 73 74 61 74 65 3b 20 20 20 20 20  tate state;     
f930: 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20     /* The state 
f940: 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  of the parser */
f950: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
f960: 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 20 20 2f 2a   *fallback;   /*
f970: 20 54 68 65 20 66 61 6c 6c 62 61 63 6b 20 74 6f   The fallback to
f980: 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ken */.  struct 
f990: 73 79 6d 62 6f 6c 20 2a 74 6b 63 6c 61 73 73 3b  symbol *tkclass;
f9a0: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 63 6c 61      /* Token cla
f9b0: 73 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73  ss symbol */.  s
f9c0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68  truct symbol *lh
f9d0: 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66  s;        /* Lef
f9e0: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63  t-hand side of c
f9f0: 75 72 72 65 6e 74 20 72 75 6c 65 20 2a 2f 0a 20  urrent rule */. 
fa00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 68 73   const char *lhs
fa10: 61 6c 69 61 73 3b 20 20 20 20 20 20 2f 2a 20 41  alias;      /* A
fa20: 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53  lias for the LHS
fa30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20   */.  int nrhs; 
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 69   /* Number of ri
fa60: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 73 79  ght-hand side sy
fa70: 6d 62 6f 6c 73 20 73 65 65 6e 20 2a 2f 0a 20 20  mbols seen */.  
fa80: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 72  struct symbol *r
fa90: 68 73 5b 4d 41 58 52 48 53 5d 3b 20 20 2f 2a 20  hs[MAXRHS];  /* 
faa0: 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  RHS symbols */. 
fab0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 6c 69   const char *ali
fac0: 61 73 5b 4d 41 58 52 48 53 5d 3b 20 2f 2a 20 41  as[MAXRHS]; /* A
fad0: 6c 69 61 73 65 73 20 66 6f 72 20 65 61 63 68 20  liases for each 
fae0: 52 48 53 20 73 79 6d 62 6f 6c 20 28 6f 72 20 4e  RHS symbol (or N
faf0: 55 4c 4c 29 20 2a 2f 0a 20 20 73 74 72 75 63 74  ULL) */.  struct
fb00: 20 72 75 6c 65 20 2a 70 72 65 76 72 75 6c 65 3b   rule *prevrule;
fb10: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
fb20: 20 72 75 6c 65 20 70 61 72 73 65 64 20 2a 2f 0a   rule parsed */.
fb30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 65    const char *de
fb40: 63 6c 6b 65 79 77 6f 72 64 3b 20 20 20 2f 2a 20  clkeyword;   /* 
fb50: 4b 65 79 77 6f 72 64 20 6f 66 20 61 20 64 65 63  Keyword of a dec
fb60: 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68  laration */.  ch
fb70: 61 72 20 2a 2a 64 65 63 6c 61 72 67 73 6c 6f 74  ar **declargslot
fb80: 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ;        /* Wher
fb90: 65 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  e the declaratio
fba0: 6e 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c  n argument shoul
fbb0: 64 20 62 65 20 70 75 74 20 2a 2f 0a 20 20 69 6e  d be put */.  in
fbc0: 74 20 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  t insertLineMacr
fbd0: 6f 3b 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20  o;       /* Add 
fbe0: 23 6c 69 6e 65 20 62 65 66 6f 72 65 20 64 65 63  #line before dec
fbf0: 6c 61 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 20  laration insert 
fc00: 2a 2f 0a 20 20 69 6e 74 20 2a 64 65 63 6c 6c 69  */.  int *declli
fc10: 6e 65 6e 6f 73 6c 6f 74 3b 20 20 20 20 20 20 20  nenoslot;       
fc20: 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
fc30: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6c 69  e declaration li
fc40: 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 65  ne number */.  e
fc50: 6e 75 6d 20 65 5f 61 73 73 6f 63 20 64 65 63 6c  num e_assoc decl
fc60: 61 73 73 6f 63 3b 20 20 20 20 2f 2a 20 41 73 73  assoc;    /* Ass
fc70: 69 67 6e 20 74 68 69 73 20 61 73 73 6f 63 69 61  ign this associa
fc80: 74 69 6f 6e 20 74 6f 20 64 65 63 6c 20 61 72 67  tion to decl arg
fc90: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  uments */.  int 
fca0: 70 72 65 63 63 6f 75 6e 74 65 72 3b 20 20 20 20  preccounter;    
fcb0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 69 67 6e         /* Assign
fcc0: 20 74 68 69 73 20 70 72 65 63 65 64 65 6e 63 65   this precedence
fcd0: 20 74 6f 20 64 65 63 6c 20 61 72 67 75 6d 65 6e   to decl argumen
fce0: 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72  ts */.  struct r
fcf0: 75 6c 65 20 2a 66 69 72 73 74 72 75 6c 65 3b 20  ule *firstrule; 
fd00: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
fd10: 20 66 69 72 73 74 20 72 75 6c 65 20 69 6e 20 74   first rule in t
fd20: 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20  he grammar */.  
fd30: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6c 61 73  struct rule *las
fd40: 74 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 6f  trule;     /* Po
fd50: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 6f 73  inter to the mos
fd60: 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
fd70: 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  d rule */.};../*
fd80: 20 50 61 72 73 65 20 61 20 73 69 6e 67 6c 65 20   Parse a single 
fd90: 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74 69 63 20  token */.static 
fda0: 76 6f 69 64 20 70 61 72 73 65 6f 6e 65 74 6f 6b  void parseonetok
fdb0: 65 6e 28 73 74 72 75 63 74 20 70 73 74 61 74 65  en(struct pstate
fdc0: 20 2a 70 73 70 29 0a 7b 0a 20 20 63 6f 6e 73 74   *psp).{.  const
fdd0: 20 63 68 61 72 20 2a 78 3b 0a 20 20 78 20 3d 20   char *x;.  x = 
fde0: 53 74 72 73 61 66 65 28 70 73 70 2d 3e 74 6f 6b  Strsafe(psp->tok
fdf0: 65 6e 73 74 61 72 74 29 3b 20 20 20 20 20 2f 2a  enstart);     /*
fe00: 20 53 61 76 65 20 74 68 65 20 74 6f 6b 65 6e 20   Save the token 
fe10: 70 65 72 6d 61 6e 65 6e 74 6c 79 20 2a 2f 0a 23  permanently */.#
fe20: 69 66 20 30 0a 20 20 70 72 69 6e 74 66 28 22 25  if 0.  printf("%
fe30: 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b 25 73 5d  s:%d: Token=[%s]
fe40: 20 73 74 61 74 65 3d 25 64 5c 6e 22 2c 70 73 70   state=%d\n",psp
fe50: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
fe60: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
fe70: 20 78 2c 70 73 70 2d 3e 73 74 61 74 65 29 3b 0a   x,psp->state);.
fe80: 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28  #endif.  switch(
fe90: 20 70 73 70 2d 3e 73 74 61 74 65 20 29 7b 0a 20   psp->state ){. 
fea0: 20 20 20 63 61 73 65 20 49 4e 49 54 49 41 4c 49     case INITIALI
feb0: 5a 45 3a 0a 20 20 20 20 20 20 70 73 70 2d 3e 70  ZE:.      psp->p
fec0: 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  revrule = 0;.   
fed0: 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e     psp->preccoun
fee0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
fef0: 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20  sp->firstrule = 
ff00: 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20  psp->lastrule = 
ff10: 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 67 70  0;.      psp->gp
ff20: 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  ->nrule = 0;.   
ff30: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
ff40: 74 6f 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a  to next case */.
ff50: 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
ff60: 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
ff70: 45 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  E:.      if( x[0
ff80: 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20 20 20  ]=='%' ){.      
ff90: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
ffa0: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
ffb0: 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20 7d  KEYWORD;.      }
ffc0: 65 6c 73 65 20 69 66 28 20 69 73 6c 6f 77 65 72  else if( islower
ffd0: 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
ffe0: 20 20 70 73 70 2d 3e 6c 68 73 20 3d 20 53 79 6d    psp->lhs = Sym
fff0: 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
10000 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 20 3d 20      psp->nrhs = 
10010 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
10020 6c 68 73 61 6c 69 61 73 20 3d 20 30 3b 0a 20 20  lhsalias = 0;.  
10030 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10040 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41   = WAITING_FOR_A
10050 52 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROW;.      }els
10060 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27 20  e if( x[0]=='{' 
10070 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
10080 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20  sp->prevrule==0 
10090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
100a0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
100b0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
100c0 6e 65 6e 6f 2c 0a 22 54 68 65 72 65 20 69 73 20  neno,."There is 
100d0 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20 75 70  no prior rule up
100e0 6f 6e 20 77 68 69 63 68 20 74 6f 20 61 74 74 61  on which to atta
100f0 63 68 20 74 68 65 20 63 6f 64 65 20 5c 0a 66 72  ch the code \.fr
10100 61 67 6d 65 6e 74 20 77 68 69 63 68 20 62 65 67  agment which beg
10110 69 6e 73 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65  ins on this line
10120 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  .");.          p
10130 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
10140 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
10150 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d  ( psp->prevrule-
10160 3e 63 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20 20  >code!=0 ){.    
10170 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
10180 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
10190 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22  ->tokenlineno,."
101a0 43 6f 64 65 20 66 72 61 67 6d 65 6e 74 20 62 65  Code fragment be
101b0 67 69 6e 6e 69 6e 67 20 6f 6e 20 74 68 69 73 20  ginning on this 
101c0 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 65 20  line is not the 
101d0 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f  first \.to follo
101e0 77 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  w the previous r
101f0 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ule.");.        
10200 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
10210 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
10220 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
10230 3e 70 72 65 76 72 75 6c 65 2d 3e 6c 69 6e 65 20  >prevrule->line 
10240 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  = psp->tokenline
10250 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  no;.          ps
10260 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64  p->prevrule->cod
10270 65 20 3d 20 26 78 5b 31 5d 3b 0a 20 20 20 20 20  e = &x[1];.     
10280 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
10290 20 69 66 28 20 78 5b 30 5d 3d 3d 27 5b 27 20 29   if( x[0]=='[' )
102a0 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
102b0 74 61 74 65 20 3d 20 50 52 45 43 45 44 45 4e 43  tate = PRECEDENC
102c0 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20 20 20 20 20  E_MARK_1;.      
102d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
102e0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
102f0 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
10300 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
10310 20 20 22 54 6f 6b 65 6e 20 5c 22 25 73 5c 22 20    "Token \"%s\" 
10320 73 68 6f 75 6c 64 20 62 65 20 65 69 74 68 65 72  should be either
10330 20 5c 22 25 25 5c 22 20 6f 72 20 61 20 6e 6f 6e   \"%%\" or a non
10340 74 65 72 6d 69 6e 61 6c 20 6e 61 6d 65 2e 22 2c  terminal name.",
10350 0a 20 20 20 20 20 20 20 20 20 20 78 29 3b 0a 20  .          x);. 
10360 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
10370 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
10380 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10390 20 63 61 73 65 20 50 52 45 43 45 44 45 4e 43 45   case PRECEDENCE
103a0 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20 20 20 20 69  _MARK_1:.      i
103b0 66 28 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d  f( !isupper(x[0]
103c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ) ){.        Err
103d0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
103e0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
103f0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
10400 22 54 68 65 20 70 72 65 63 65 64 65 6e 63 65 20  "The precedence 
10410 73 79 6d 62 6f 6c 20 6d 75 73 74 20 62 65 20 61  symbol must be a
10420 20 74 65 72 6d 69 6e 61 6c 2e 22 29 3b 0a 20 20   terminal.");.  
10430 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
10440 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
10450 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76  se if( psp->prev
10460 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rule==0 ){.     
10470 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
10480 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
10490 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
104a0 20 20 20 20 20 20 22 54 68 65 72 65 20 69 73 20        "There is 
104b0 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20 74 6f  no prior rule to
104c0 20 61 73 73 69 67 6e 20 70 72 65 63 65 64 65 6e   assign preceden
104d0 63 65 20 5c 22 5b 25 73 5d 5c 22 2e 22 2c 78 29  ce \"[%s]\".",x)
104e0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
104f0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
10500 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e   }else if( psp->
10510 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73 79  prevrule->precsy
10520 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m!=0 ){.        
10530 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
10540 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
10550 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72 65 63 65 64  nlineno,."Preced
10560 65 6e 63 65 20 6d 61 72 6b 20 6f 6e 20 74 68 69  ence mark on thi
10570 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 68  s line is not th
10580 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c  e first \.to fol
10590 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f 75 73  low the previous
105a0 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20   rule.");.      
105b0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
105c0 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
105d0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
105e0 76 72 75 6c 65 2d 3e 70 72 65 63 73 79 6d 20 3d  vrule->precsym =
105f0 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
10600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 73        }.      ps
10610 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45  p->state = PRECE
10620 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3b 0a 20 20  DENCE_MARK_2;.  
10630 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
10640 61 73 65 20 50 52 45 43 45 44 45 4e 43 45 5f 4d  ase PRECEDENCE_M
10650 41 52 4b 5f 32 3a 0a 20 20 20 20 20 20 69 66 28  ARK_2:.      if(
10660 20 78 5b 30 5d 21 3d 27 5d 27 20 29 7b 0a 20 20   x[0]!=']' ){.  
10670 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
10680 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
10690 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
106a0 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e           "Missin
106b0 67 20 5c 22 5d 5c 22 20 6f 6e 20 70 72 65 63 65  g \"]\" on prece
106c0 64 65 6e 63 65 20 6d 61 72 6b 2e 22 29 3b 0a 20  dence mark.");. 
106d0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
106e0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
106f0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10700 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
10710 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20  ECL_OR_RULE;.   
10720 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
10730 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41  se WAITING_FOR_A
10740 52 52 4f 57 3a 0a 20 20 20 20 20 20 69 66 28 20  RROW:.      if( 
10750 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31  x[0]==':' && x[1
10760 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d  ]==':' && x[2]==
10770 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '=' ){.        p
10780 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52  sp->state = IN_R
10790 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  HS;.      }else 
107a0 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 29 7b  if( x[0]=='(' ){
107b0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
107c0 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f  ate = LHS_ALIAS_
107d0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
107e0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
107f0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
10800 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
10810 0a 20 20 20 20 20 20 20 20 20 20 22 45 78 70 65  .          "Expe
10820 63 74 65 64 20 74 6f 20 73 65 65 20 61 20 5c 22  cted to see a \"
10830 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  :\" following th
10840 65 20 4c 48 53 20 73 79 6d 62 6f 6c 20 5c 22 25  e LHS symbol \"%
10850 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  s\".",.         
10860 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29   psp->lhs->name)
10870 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
10880 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
10890 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
108a0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
108b0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
108c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
108d0 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53    case LHS_ALIAS
108e0 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73  _1:.      if( is
108f0 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
10900 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 61         psp->lhsa
10910 6c 69 61 73 20 3d 20 78 3b 0a 20 20 20 20 20 20  lias = x;.      
10920 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c    psp->state = L
10930 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20 20  HS_ALIAS_2;.    
10940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10950 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
10960 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
10970 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
10980 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73 20 6e      "\"%s\" is n
10990 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69 61 73  ot a valid alias
109a0 20 66 6f 72 20 74 68 65 20 4c 48 53 20 5c 22 25   for the LHS \"%
109b0 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s\"\n",.        
109c0 20 20 78 2c 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61    x,psp->lhs->na
109d0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  me);.        psp
109e0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
109f0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10a00 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
10a10 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
10a20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
10a30 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c  .    case LHS_AL
10a40 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66 28  IAS_2:.      if(
10a50 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20   x[0]==')' ){.  
10a60 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10a70 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3b 0a   = LHS_ALIAS_3;.
10a80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10a90 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
10aa0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
10ab0 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
10ac0 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67          "Missing
10ad0 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67   \")\" following
10ae0 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65 20   LHS alias name 
10af0 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68  \"%s\".",psp->lh
10b00 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20  salias);.       
10b10 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
10b20 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
10b30 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
10b40 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
10b50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
10b60 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48  eak;.    case LH
10b70 53 5f 41 4c 49 41 53 5f 33 3a 0a 20 20 20 20 20  S_ALIAS_3:.     
10b80 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26   if( x[0]==':' &
10b90 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78  & x[1]==':' && x
10ba0 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20  [2]=='=' ){.    
10bb0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
10bc0 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d   IN_RHS;.      }
10bd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
10be0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
10bf0 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
10c00 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
10c10 20 22 4d 69 73 73 69 6e 67 20 5c 22 2d 3e 5c 22   "Missing \"->\"
10c20 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 5c 22 25 73   following: \"%s
10c30 28 25 73 29 5c 22 2e 22 2c 0a 20 20 20 20 20 20  (%s)\".",.      
10c40 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e       psp->lhs->n
10c50 61 6d 65 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61  ame,psp->lhsalia
10c60 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  s);.        psp-
10c70 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
10c80 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10c90 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
10ca0 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
10cb0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
10cc0 20 20 20 20 63 61 73 65 20 49 4e 5f 52 48 53 3a      case IN_RHS:
10cd0 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
10ce0 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
10cf0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
10d00 0a 20 20 20 20 20 20 20 20 72 70 20 3d 20 28 73  .        rp = (s
10d10 74 72 75 63 74 20 72 75 6c 65 20 2a 29 63 61 6c  truct rule *)cal
10d20 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
10d30 63 74 20 72 75 6c 65 29 20 2b 20 0a 20 20 20 20  ct rule) + .    
10d40 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
10d50 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a  struct symbol*)*
10d60 70 73 70 2d 3e 6e 72 68 73 20 2b 20 73 69 7a 65  psp->nrhs + size
10d70 6f 66 28 63 68 61 72 2a 29 2a 70 73 70 2d 3e 6e  of(char*)*psp->n
10d80 72 68 73 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  rhs, 1);.       
10d90 20 69 66 28 20 72 70 3d 3d 30 20 29 7b 0a 20 20   if( rp==0 ){.  
10da0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
10db0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
10dc0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
10dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 61  .            "Ca
10de0 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 65 6e 6f  n't allocate eno
10df0 75 67 68 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ugh memory for t
10e00 68 69 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20  his rule.");.   
10e10 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
10e20 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
10e30 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20    psp->prevrule 
10e40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
10e50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
10e60 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 72  t i;.          r
10e70 70 2d 3e 72 75 6c 65 6c 69 6e 65 20 3d 20 70 73  p->ruleline = ps
10e80 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a  p->tokenlineno;.
10e90 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
10ea0 73 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  s = (struct symb
10eb0 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b 0a 20 20 20  ol**)&rp[1];.   
10ec0 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c         rp->rhsal
10ed0 69 61 73 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ias = (const cha
10ee0 72 2a 2a 29 26 28 72 70 2d 3e 72 68 73 5b 70 73  r**)&(rp->rhs[ps
10ef0 70 2d 3e 6e 72 68 73 5d 29 3b 0a 20 20 20 20 20  p->nrhs]);.     
10f00 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
10f10 70 73 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  psp->nrhs; i++){
10f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d  .            rp-
10f30 3e 72 68 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 72  >rhs[i] = psp->r
10f40 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  hs[i];.         
10f50 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b     rp->rhsalias[
10f60 69 5d 20 3d 20 70 73 70 2d 3e 61 6c 69 61 73 5b  i] = psp->alias[
10f70 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  i];.          }.
10f80 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68            rp->lh
10f90 73 20 3d 20 70 73 70 2d 3e 6c 68 73 3b 0a 20 20  s = psp->lhs;.  
10fa0 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61          rp->lhsa
10fb0 6c 69 61 73 20 3d 20 70 73 70 2d 3e 6c 68 73 61  lias = psp->lhsa
10fc0 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
10fd0 72 70 2d 3e 6e 72 68 73 20 3d 20 70 73 70 2d 3e  rp->nrhs = psp->
10fe0 6e 72 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20  nrhs;.          
10ff0 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20  rp->code = 0;.  
11000 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63          rp->prec
11010 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  sym = 0;.       
11020 20 20 20 72 70 2d 3e 69 6e 64 65 78 20 3d 20 70     rp->index = p
11030 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 2b 2b 3b  sp->gp->nrule++;
11040 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e  .          rp->n
11050 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e 6c 68 73  extlhs = rp->lhs
11060 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20 20 20 20  ->rule;.        
11070 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65 20    rp->lhs->rule 
11080 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20  = rp;.          
11090 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  rp->next = 0;.  
110a0 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d          if( psp-
110b0 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30 20 29 7b  >firstrule==0 ){
110c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73 70  .            psp
110d0 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70 73  ->firstrule = ps
110e0 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72 70  p->lastrule = rp
110f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
11100 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
11110 73 70 2d 3e 6c 61 73 74 72 75 6c 65 2d 3e 6e 65  sp->lastrule->ne
11120 78 74 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20  xt = rp;.       
11130 20 20 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75       psp->lastru
11140 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20  le = rp;.       
11150 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
11160 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 72  sp->prevrule = r
11170 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
11180 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11190 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
111a0 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20  CL_OR_RULE;.    
111b0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 61 6c    }else if( isal
111c0 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  pha(x[0]) ){.   
111d0 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 6e 72       if( psp->nr
111e0 68 73 3e 3d 4d 41 58 52 48 53 20 29 7b 0a 20 20  hs>=MAXRHS ){.  
111f0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11200 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
11210 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
11220 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 54 6f  .            "To
11230 6f 20 6d 61 6e 79 20 73 79 6d 62 6f 6c 73 20 6f  o many symbols o
11240 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 20 62 65  n RHS of rule be
11250 67 69 6e 6e 69 6e 67 20 61 74 20 5c 22 25 73 5c  ginning at \"%s\
11260 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ".",.           
11270 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   x);.          p
11280 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11290 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
112a0 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
112b0 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
112c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
112d0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68           psp->rh
112e0 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 53  s[psp->nrhs] = S
112f0 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
11300 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c 69          psp->ali
11310 61 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20  as[psp->nrhs] = 
11320 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  0;.          psp
11330 2d 3e 6e 72 68 73 2b 2b 3b 0a 20 20 20 20 20 20  ->nrhs++;.      
11340 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
11350 69 66 28 20 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c  if( (x[0]=='|' |
11360 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20  | x[0]=='/') && 
11370 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20  psp->nrhs>0 ){. 
11380 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
11390 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d  mbol *msp = psp-
113a0 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31  >rhs[psp->nrhs-1
113b0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  ];.        if( m
113c0 73 70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54  sp->type!=MULTIT
113d0 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
113e0 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
113f0 6f 6c 20 2a 6f 72 69 67 73 70 20 3d 20 6d 73 70  ol *origsp = msp
11400 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 20  ;.          msp 
11410 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  = (struct symbol
11420 20 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a   *) calloc(1,siz
11430 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20 20 20 20  eof(*msp));.    
11440 20 20 20 20 20 20 6d 65 6d 73 65 74 28 6d 73 70        memset(msp
11450 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6d 73 70  , 0, sizeof(*msp
11460 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73  ));.          ms
11470 70 2d 3e 74 79 70 65 20 3d 20 4d 55 4c 54 49 54  p->type = MULTIT
11480 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 20 20 20  ERMINAL;.       
11490 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 20     msp->nsubsym 
114a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  = 1;.          m
114b0 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73 74  sp->subsym = (st
114c0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20  ruct symbol **) 
114d0 63 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f 66 28  calloc(1,sizeof(
114e0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 29  struct symbol*))
114f0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d  ;.          msp-
11500 3e 73 75 62 73 79 6d 5b 30 5d 20 3d 20 6f 72 69  >subsym[0] = ori
11510 67 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  gsp;.          m
11520 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f 72 69 67 73  sp->name = origs
11530 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  p->name;.       
11540 20 20 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d     psp->rhs[psp-
11550 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d 73 70 3b 0a  >nrhs-1] = msp;.
11560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11570 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b 2b    msp->nsubsym++
11580 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73  ;.        msp->s
11590 75 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74 20  ubsym = (struct 
115a0 73 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61 6c 6c  symbol **) reall
115b0 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c 0a  oc(msp->subsym,.
115c0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
115d0 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29  (struct symbol*)
115e0 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29 3b 0a  *msp->nsubsym);.
115f0 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62          msp->sub
11600 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73 79 6d  sym[msp->nsubsym
11610 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  -1] = Symbol_new
11620 28 26 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  (&x[1]);.       
11630 20 69 66 28 20 69 73 6c 6f 77 65 72 28 78 5b 31   if( islower(x[1
11640 5d 29 20 7c 7c 20 69 73 6c 6f 77 65 72 28 6d 73  ]) || islower(ms
11650 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61  p->subsym[0]->na
11660 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  me[0]) ){.      
11670 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
11680 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
11690 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
116a0 20 20 20 20 20 20 20 20 20 22 43 61 6e 6e 6f 74           "Cannot
116b0 20 66 6f 72 6d 20 61 20 63 6f 6d 70 6f 75 6e 64   form a compound
116c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 6e 6f   containing a no
116d0 6e 2d 74 65 72 6d 69 6e 61 6c 22 29 3b 0a 20 20  n-terminal");.  
116e0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
116f0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
11700 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
11710 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 26 26 20  f( x[0]=='(' && 
11720 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20  psp->nrhs>0 ){. 
11730 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11740 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 31 3b  e = RHS_ALIAS_1;
11750 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11760 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11770 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11780 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
11790 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
117a0 6c 20 63 68 61 72 61 63 74 65 72 20 6f 6e 20 52  l character on R
117b0 48 53 20 6f 66 20 72 75 6c 65 3a 20 5c 22 25 73  HS of rule: \"%s
117c0 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  \".",x);.       
117d0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
117e0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
117f0 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
11800 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
11810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
11820 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 48  eak;.    case RH
11830 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20  S_ALIAS_1:.     
11840 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30   if( isalpha(x[0
11850 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  ]) ){.        ps
11860 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72  p->alias[psp->nr
11870 68 73 2d 31 5d 20 3d 20 78 3b 0a 20 20 20 20 20  hs-1] = x;.     
11880 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
11890 52 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20  RHS_ALIAS_2;.   
118a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
118b0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
118c0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
118d0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
118e0 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73 20       "\"%s\" is 
118f0 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69 61  not a valid alia
11900 73 20 66 6f 72 20 74 68 65 20 52 48 53 20 73 79  s for the RHS sy
11910 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a  mbol \"%s\"\n",.
11920 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d            x,psp-
11930 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31  >rhs[psp->nrhs-1
11940 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
11950 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
11960 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
11970 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
11980 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
11990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
119a0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52  reak;.    case R
119b0 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20  HS_ALIAS_2:.    
119c0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20    if( x[0]==')' 
119d0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
119e0 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a  state = IN_RHS;.
119f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11a00 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
11a10 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
11a20 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
11a30 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67          "Missing
11a40 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67   \")\" following
11a50 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65 20   LHS alias name 
11a60 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68  \"%s\".",psp->lh
11a70 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20  salias);.       
11a80 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
11a90 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
11aa0 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
11ab0 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
11ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
11ad0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
11ae0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b  ITING_FOR_DECL_K
11af0 45 59 57 4f 52 44 3a 0a 20 20 20 20 20 20 69 66  EYWORD:.      if
11b00 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20  ( isalpha(x[0]) 
11b10 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
11b20 64 65 63 6c 6b 65 79 77 6f 72 64 20 3d 20 78 3b  declkeyword = x;
11b30 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65  .        psp->de
11b40 63 6c 61 72 67 73 6c 6f 74 20 3d 20 30 3b 0a 20  clargslot = 0;. 
11b50 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
11b60 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20 30 3b 0a  linenoslot = 0;.
11b70 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
11b80 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 31  ertLineMacro = 1
11b90 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
11ba0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
11bb0 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20  OR_DECL_ARG;.   
11bc0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
11bd0 78 2c 22 6e 61 6d 65 22 29 3d 3d 30 20 29 7b 0a  x,"name")==0 ){.
11be0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
11bf0 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
11c00 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65 29 3b 0a 20  sp->gp->name);. 
11c10 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
11c20 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
11c30 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
11c40 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 69   if( strcmp(x,"i
11c50 6e 63 6c 75 64 65 22 29 3d 3d 30 20 29 7b 0a 20  nclude")==0 ){. 
11c60 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
11c70 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
11c80 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 29 3b  p->gp->include);
11c90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11ca0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 63 6f 64  f( strcmp(x,"cod
11cb0 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
11cc0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
11cd0 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
11ce0 2d 3e 65 78 74 72 61 63 6f 64 65 29 3b 0a 20 20  ->extracode);.  
11cf0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11d00 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f  strcmp(x,"token_
11d10 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20  destructor")==0 
11d20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
11d30 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
11d40 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 64  &psp->gp->tokend
11d50 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  est;.        }el
11d60 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
11d70 22 64 65 66 61 75 6c 74 5f 64 65 73 74 72 75 63  "default_destruc
11d80 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tor")==0 ){.    
11d90 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
11da0 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67  rgslot = &psp->g
11db0 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20 20  p->vardest;.    
11dc0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
11dd0 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 70 72  rcmp(x,"token_pr
11de0 65 66 69 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  efix")==0 ){.   
11df0 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
11e00 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  argslot = &psp->
11e10 67 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b  gp->tokenprefix;
11e20 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11e30 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
11e40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
11e50 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
11e60 22 73 79 6e 74 61 78 5f 65 72 72 6f 72 22 29 3d  "syntax_error")=
11e70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11e80 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
11e90 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65 72   = &(psp->gp->er
11ea0 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ror);.        }e
11eb0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
11ec0 2c 22 70 61 72 73 65 5f 61 63 63 65 70 74 22 29  ,"parse_accept")
11ed0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11ee0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
11ef0 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61  t = &(psp->gp->a
11f00 63 63 65 70 74 29 3b 0a 20 20 20 20 20 20 20 20  ccept);.        
11f10 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
11f20 28 78 2c 22 70 61 72 73 65 5f 66 61 69 6c 75 72  (x,"parse_failur
11f30 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
11f40 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
11f50 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
11f60 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 20 20 20 20  ->failure);.    
11f70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
11f80 72 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f 6f 76  rcmp(x,"stack_ov
11f90 65 72 66 6c 6f 77 22 29 3d 3d 30 20 29 7b 0a 20  erflow")==0 ){. 
11fa0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
11fb0 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
11fc0 70 2d 3e 67 70 2d 3e 6f 76 65 72 66 6c 6f 77 29  p->gp->overflow)
11fd0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
11fe0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 65 78  if( strcmp(x,"ex
11ff0 74 72 61 5f 61 72 67 75 6d 65 6e 74 22 29 3d 3d  tra_argument")==
12000 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
12010 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
12020 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61 72 67  = &(psp->gp->arg
12030 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
12040 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
12050 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  o = 0;.        }
12060 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
12070 78 2c 22 74 6f 6b 65 6e 5f 74 79 70 65 22 29 3d  x,"token_type")=
12080 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12090 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
120a0 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 74 6f   = &(psp->gp->to
120b0 6b 65 6e 74 79 70 65 29 3b 0a 20 20 20 20 20 20  kentype);.      
120c0 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
120d0 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20  ineMacro = 0;.  
120e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
120f0 73 74 72 63 6d 70 28 78 2c 22 64 65 66 61 75 6c  strcmp(x,"defaul
12100 74 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20  t_type")==0 ){. 
12110 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
12120 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
12130 70 2d 3e 67 70 2d 3e 76 61 72 74 79 70 65 29 3b  p->gp->vartype);
12140 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12150 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
12160 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
12170 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
12180 22 73 74 61 63 6b 5f 73 69 7a 65 22 29 3d 3d 30  "stack_size")==0
12190 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
121a0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
121b0 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61 63   &(psp->gp->stac
121c0 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  ksize);.        
121d0 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e    psp->insertLin
121e0 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20  eMacro = 0;.    
121f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
12200 72 63 6d 70 28 78 2c 22 73 74 61 72 74 5f 73 79  rcmp(x,"start_sy
12210 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  mbol")==0 ){.   
12220 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
12230 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
12240 3e 67 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20  >gp->start);.   
12250 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
12260 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
12270 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
12280 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6c 65 66  f( strcmp(x,"lef
12290 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
122a0 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75      psp->preccou
122b0 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nter++;.        
122c0 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63    psp->declassoc
122d0 20 3d 20 4c 45 46 54 3b 0a 20 20 20 20 20 20 20   = LEFT;.       
122e0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
122f0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43  WAITING_FOR_PREC
12300 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20  EDENCE_SYMBOL;. 
12310 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
12320 20 73 74 72 63 6d 70 28 78 2c 22 72 69 67 68 74   strcmp(x,"right
12330 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
12340 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e     psp->preccoun
12350 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  ter++;.         
12360 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20   psp->declassoc 
12370 3d 20 52 49 47 48 54 3b 0a 20 20 20 20 20 20 20  = RIGHT;.       
12380 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
12390 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43  WAITING_FOR_PREC
123a0 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20  EDENCE_SYMBOL;. 
123b0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
123c0 20 73 74 72 63 6d 70 28 78 2c 22 6e 6f 6e 61 73   strcmp(x,"nonas
123d0 73 6f 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  soc")==0 ){.    
123e0 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63        psp->precc
123f0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
12400 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73      psp->declass
12410 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20 20 20 20 20  oc = NONE;.     
12420 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
12430 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52  = WAITING_FOR_PR
12440 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b  ECEDENCE_SYMBOL;
12450 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
12460 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65 73  f( strcmp(x,"des
12470 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a  tructor")==0 ){.
12480 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
12490 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
124a0 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59  OR_DESTRUCTOR_SY
124b0 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65  MBOL;.        }e
124c0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
124d0 2c 22 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20  ,"type")==0 ){. 
124e0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
124f0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
12500 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f  R_DATATYPE_SYMBO
12510 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
12520 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 66   if( strcmp(x,"f
12530 61 6c 6c 62 61 63 6b 22 29 3d 3d 30 20 29 7b 0a  allback")==0 ){.
12540 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66            psp->f
12550 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20  allback = 0;.   
12560 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12570 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
12580 46 41 4c 4c 42 41 43 4b 5f 49 44 3b 0a 20 20 20  FALLBACK_ID;.   
12590 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
125a0 74 72 63 6d 70 28 78 2c 22 77 69 6c 64 63 61 72  trcmp(x,"wildcar
125b0 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  d")==0 ){.      
125c0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
125d0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c   WAITING_FOR_WIL
125e0 44 43 41 52 44 5f 49 44 3b 0a 20 20 20 20 20 20  DCARD_ID;.      
125f0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
12600 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 63 6c 61 73  mp(x,"token_clas
12610 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  s")==0 ){.      
12620 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
12630 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41   WAITING_FOR_CLA
12640 53 53 5f 49 44 3b 0a 20 20 20 20 20 20 20 20 7d  SS_ID;.        }
12650 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
12660 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
12670 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
12680 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
12690 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 64 65       "Unknown de
126a0 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72  claration keywor
126b0 64 3a 20 5c 22 25 25 25 73 5c 22 2e 22 2c 78 29  d: \"%%%s\".",x)
126c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
126d0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
126e0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
126f0 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
12700 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  _DECL_ERROR;.   
12710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
12720 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
12730 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
12740 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
12750 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
12760 49 6c 6c 65 67 61 6c 20 64 65 63 6c 61 72 61 74  Illegal declarat
12770 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25  ion keyword: \"%
12780 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  s\".",x);.      
12790 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
127a0 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
127b0 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
127c0 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
127d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
127e0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
127f0 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52  AITING_FOR_DESTR
12800 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3a 0a 20 20  UCTOR_SYMBOL:.  
12810 20 20 20 20 69 66 28 20 21 69 73 61 6c 70 68 61      if( !isalpha
12820 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
12830 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
12840 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
12850 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
12860 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d       "Symbol nam
12870 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20  e missing after 
12880 25 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79  %%destructor key
12890 77 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20  word");.        
128a0 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
128b0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
128c0 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
128d0 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
128e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
128f0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
12900 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e  l *sp = Symbol_n
12910 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ew(x);.        p
12920 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
12930 3d 20 26 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  = &sp->destructo
12940 72 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  r;.        psp->
12950 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d  decllinenoslot =
12960 20 26 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f   &sp->destLineno
12970 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69  ;.        psp->i
12980 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
12990 20 31 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   1;.        psp-
129a0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
129b0 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20  _FOR_DECL_ARG;. 
129c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
129d0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
129e0 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50  TING_FOR_DATATYP
129f0 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20  E_SYMBOL:.      
12a00 69 66 28 20 21 69 73 61 6c 70 68 61 28 78 5b 30  if( !isalpha(x[0
12a10 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]) ){.        Er
12a20 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
12a30 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
12a40 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
12a50 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69   "Symbol name mi
12a60 73 73 69 6e 67 20 61 66 74 65 72 20 25 25 74 79  ssing after %%ty
12a70 70 65 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20  pe keyword");.  
12a80 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
12a90 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
12aa0 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
12ab0 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
12ac0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
12ad0 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
12ae0 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79   symbol *sp = Sy
12af0 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20  mbol_find(x);.  
12b00 20 20 20 20 20 20 69 66 28 28 73 70 29 20 26 26        if((sp) &&
12b10 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65 29 29   (sp->datatype))
12b20 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
12b30 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
12b40 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
12b50 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
12b60 20 22 53 79 6d 62 6f 6c 20 25 25 74 79 70 65 20   "Symbol %%type 
12b70 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20 64  \"%s\" already d
12b80 65 66 69 6e 65 64 22 2c 20 78 29 3b 0a 20 20 20  efined", x);.   
12b90 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
12ba0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
12bb0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
12bc0 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
12bd0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
12be0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12bf0 20 69 66 20 28 21 73 70 29 7b 0a 20 20 20 20 20   if (!sp){.     
12c00 20 20 20 20 20 20 20 73 70 20 3d 20 53 79 6d 62         sp = Symb
12c10 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
12c20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12c30 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
12c40 74 20 3d 20 26 73 70 2d 3e 64 61 74 61 74 79 70  t = &sp->datatyp
12c50 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  e;.          psp
12c60 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
12c70 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  o = 0;.         
12c80 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
12c90 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
12ca0 52 47 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  RG;.        }.  
12cb0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
12cc0 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
12cd0 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
12ce0 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20  CE_SYMBOL:.     
12cf0 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
12d00 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
12d10 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
12d20 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
12d30 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
12d40 20 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29   isupper(x[0]) )
12d50 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
12d60 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 20   symbol *sp;.   
12d70 20 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c       sp = Symbol
12d80 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
12d90 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30   if( sp->prec>=0
12da0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72   ){.          Er
12db0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
12dc0 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
12dd0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
12de0 20 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c     "Symbol \"%s\
12df0 22 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  " has already be
12e00 20 67 69 76 65 6e 20 61 20 70 72 65 63 65 64 65   given a precede
12e10 6e 63 65 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  nce.",x);.      
12e20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
12e30 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t++;.        }el
12e40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70  se{.          sp
12e50 2d 3e 70 72 65 63 20 3d 20 70 73 70 2d 3e 70 72  ->prec = psp->pr
12e60 65 63 63 6f 75 6e 74 65 72 3b 0a 20 20 20 20 20  eccounter;.     
12e70 20 20 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d       sp->assoc =
12e80 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 3b   psp->declassoc;
12e90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12ea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12eb0 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
12ec0 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
12ed0 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
12ee0 20 20 20 22 43 61 6e 27 74 20 61 73 73 69 67 6e     "Can't assign
12ef0 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 74 6f   a precedence to
12f00 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20   \"%s\".",x);.  
12f10 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
12f20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  cnt++;.      }. 
12f30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12f40 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
12f50 5f 44 45 43 4c 5f 41 52 47 3a 0a 20 20 20 20 20  _DECL_ARG:.     
12f60 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27 20 7c   if( x[0]=='{' |
12f70 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c 20  | x[0]=='\"' || 
12f80 69 73 61 6c 6e 75 6d 28 78 5b 30 5d 29 20 29 7b  isalnum(x[0]) ){
12f90 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
12fa0 68 61 72 20 2a 7a 4f 6c 64 2c 20 2a 7a 4e 65 77  har *zOld, *zNew
12fb0 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
12fc0 7a 42 75 66 2c 20 2a 7a 3b 0a 20 20 20 20 20 20  zBuf, *z;.      
12fd0 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 6e 2c 20 6e    int nOld, n, n
12fe0 4c 69 6e 65 20 3d 20 30 2c 20 6e 4e 65 77 2c 20  Line = 0, nNew, 
12ff0 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 69  nBack;.        i
13000 6e 74 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 3b  nt addLineMacro;
13010 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 4c  .        char zL
13020 69 6e 65 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20  ine[50];.       
13030 20 7a 4e 65 77 20 3d 20 78 3b 0a 20 20 20 20 20   zNew = x;.     
13040 20 20 20 69 66 28 20 7a 4e 65 77 5b 30 5d 3d 3d     if( zNew[0]==
13050 27 22 27 20 7c 7c 20 7a 4e 65 77 5b 30 5d 3d 3d  '"' || zNew[0]==
13060 27 7b 27 20 29 20 7a 4e 65 77 2b 2b 3b 0a 20 20  '{' ) zNew++;.  
13070 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 6c 65 6d        nNew = lem
13080 6f 6e 53 74 72 6c 65 6e 28 7a 4e 65 77 29 3b 0a  onStrlen(zNew);.
13090 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 73 70          if( *psp
130a0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 29 7b  ->declargslot ){
130b0 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20  .          zOld 
130c0 3d 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73  = *psp->declargs
130d0 6c 6f 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  lot;.        }el
130e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  se{.          zO
130f0 6c 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20  ld = "";.       
13100 20 7d 0a 20 20 20 20 20 20 20 20 6e 4f 6c 64 20   }.        nOld 
13110 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4f  = lemonStrlen(zO
13120 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d  ld);.        n =
13130 20 6e 4f 6c 64 20 2b 20 6e 4e 65 77 20 2b 20 32   nOld + nNew + 2
13140 30 3b 0a 20 20 20 20 20 20 20 20 61 64 64 4c 69  0;.        addLi
13150 6e 65 4d 61 63 72 6f 20 3d 20 21 70 73 70 2d 3e  neMacro = !psp->
13160 67 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  gp->nolinenosfla
13170 67 20 26 26 20 70 73 70 2d 3e 69 6e 73 65 72 74  g && psp->insert
13180 4c 69 6e 65 4d 61 63 72 6f 20 26 26 0a 20 20 20  LineMacro &&.   
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131a0 20 20 20 20 20 28 70 73 70 2d 3e 64 65 63 6c 6c       (psp->decll
131b0 69 6e 65 6e 6f 73 6c 6f 74 3d 3d 30 20 7c 7c 20  inenoslot==0 || 
131c0 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73  psp->decllinenos
131d0 6c 6f 74 5b 30 5d 21 3d 30 29 3b 0a 20 20 20 20  lot[0]!=0);.    
131e0 20 20 20 20 69 66 28 20 61 64 64 4c 69 6e 65 4d      if( addLineM
131f0 61 63 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  acro ){.        
13200 20 20 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c    for(z=psp->fil
13210 65 6e 61 6d 65 2c 20 6e 42 61 63 6b 3d 30 3b 20  ename, nBack=0; 
13220 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20  *z; z++){.      
13230 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c        if( *z=='\
13240 5c 27 20 29 20 6e 42 61 63 6b 2b 2b 3b 0a 20 20  \' ) nBack++;.  
13250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13260 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74      lemon_sprint
13270 66 28 7a 4c 69 6e 65 2c 20 22 23 6c 69 6e 65 20  f(zLine, "#line 
13280 25 64 20 22 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e  %d ", psp->token
13290 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 20  lineno);.       
132a0 20 20 20 6e 4c 69 6e 65 20 3d 20 6c 65 6d 6f 6e     nLine = lemon
132b0 53 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20  Strlen(zLine);. 
132c0 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 6e 4c           n += nL
132d0 69 6e 65 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65  ine + lemonStrle
132e0 6e 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  n(psp->filename)
132f0 20 2b 20 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20   + nBack;.      
13300 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 73 70    }.        *psp
13310 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
13320 28 63 68 61 72 20 2a 29 20 72 65 61 6c 6c 6f 63  (char *) realloc
13330 28 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c  (*psp->declargsl
13340 6f 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  ot, n);.        
13350 7a 42 75 66 20 3d 20 2a 70 73 70 2d 3e 64 65 63  zBuf = *psp->dec
13360 6c 61 72 67 73 6c 6f 74 20 2b 20 6e 4f 6c 64 3b  largslot + nOld;
13370 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
13380 4c 69 6e 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20  LineMacro ){.   
13390 20 20 20 20 20 20 20 69 66 28 20 6e 4f 6c 64 20         if( nOld 
133a0 26 26 20 7a 42 75 66 5b 2d 31 5d 21 3d 27 5c 6e  && zBuf[-1]!='\n
133b0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
133c0 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e   *(zBuf++) = '\n
133d0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ';.          }. 
133e0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
133f0 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 6e 4c 69  zBuf, zLine, nLi
13400 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ne);.          z
13410 42 75 66 20 2b 3d 20 6e 4c 69 6e 65 3b 0a 20 20  Buf += nLine;.  
13420 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b          *(zBuf++
13430 29 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 20  ) = '"';.       
13440 20 20 20 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69     for(z=psp->fi
13450 6c 65 6e 61 6d 65 3b 20 2a 7a 3b 20 7a 2b 2b 29  lename; *z; z++)
13460 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
13470 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20  ( *z=='\\' ){.  
13480 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42              *(zB
13490 75 66 2b 2b 29 20 3d 20 27 5c 5c 27 3b 0a 20 20  uf++) = '\\';.  
134a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
134b0 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b          *(zBuf++
134c0 29 20 3d 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20  ) = *z;.        
134d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2a 28    }.          *(
134e0 7a 42 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20  zBuf++) = '"';. 
134f0 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b           *(zBuf+
13500 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20  +) = '\n';.     
13510 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
13520 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f   psp->decllineno
13530 73 6c 6f 74 20 26 26 20 70 73 70 2d 3e 64 65 63  slot && psp->dec
13540 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 3d 3d  llinenoslot[0]==
13550 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
13560 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
13570 6f 74 5b 30 5d 20 3d 20 70 73 70 2d 3e 74 6f 6b  ot[0] = psp->tok
13580 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  enlineno;.      
13590 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63    }.        memc
135a0 70 79 28 7a 42 75 66 2c 20 7a 4e 65 77 2c 20 6e  py(zBuf, zNew, n
135b0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7a 42  New);.        zB
135c0 75 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  uf += nNew;.    
135d0 20 20 20 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20      *zBuf = 0;. 
135e0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
135f0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
13600 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
13610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13620 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
13630 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
13640 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
13650 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 61        "Illegal a
13660 72 67 75 6d 65 6e 74 20 74 6f 20 25 25 25 73 3a  rgument to %%%s:
13670 20 25 73 22 2c 70 73 70 2d 3e 64 65 63 6c 6b 65   %s",psp->declke
13680 79 77 6f 72 64 2c 78 29 3b 0a 20 20 20 20 20 20  yword,x);.      
13690 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
136a0 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
136b0 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
136c0 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
136d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
136e0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
136f0 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42  AITING_FOR_FALLB
13700 41 43 4b 5f 49 44 3a 0a 20 20 20 20 20 20 69 66  ACK_ID:.      if
13710 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
13720 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
13730 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
13740 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
13750 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69      }else if( !i
13760 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a  supper(x[0]) ){.
13770 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
13780 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
13790 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
137a0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 25 66  ,.          "%%f
137b0 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74  allback argument
137c0 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62   \"%s\" should b
137d0 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a  e a token", x);.
137e0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
137f0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
13800 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
13810 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
13820 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
13830 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70  .        if( psp
13840 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b  ->fallback==0 ){
13850 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13860 66 61 6c 6c 62 61 63 6b 20 3d 20 73 70 3b 0a 20  fallback = sp;. 
13870 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
13880 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 29 7b   sp->fallback ){
13890 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
138a0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
138b0 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
138c0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
138d0 20 22 4d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20   "More than one 
138e0 66 61 6c 6c 62 61 63 6b 20 61 73 73 69 67 6e 65  fallback assigne
138f0 64 20 74 6f 20 74 6f 6b 65 6e 20 25 73 22 2c 20  d to token %s", 
13900 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
13910 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
13920 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
13930 20 20 20 20 20 20 20 20 73 70 2d 3e 66 61 6c 6c          sp->fall
13940 62 61 63 6b 20 3d 20 70 73 70 2d 3e 66 61 6c 6c  back = psp->fall
13950 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  back;.          
13960 70 73 70 2d 3e 67 70 2d 3e 68 61 73 5f 66 61 6c  psp->gp->has_fal
13970 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  lback = 1;.     
13980 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13990 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
139a0 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57  se WAITING_FOR_W
139b0 49 4c 44 43 41 52 44 5f 49 44 3a 0a 20 20 20 20  ILDCARD_ID:.    
139c0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
139d0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
139e0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
139f0 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
13a00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
13a10 28 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d 29  ( !isupper(x[0])
13a20 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
13a30 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
13a40 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
13a50 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
13a60 22 25 25 77 69 6c 64 63 61 72 64 20 61 72 67 75  "%%wildcard argu
13a70 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75  ment \"%s\" shou
13a80 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20  ld be a token", 
13a90 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
13aa0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
13ab0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13ac0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
13ad0 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  *sp = Symbol_new
13ae0 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (x);.        if(
13af0 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61   psp->gp->wildca
13b00 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rd==0 ){.       
13b10 20 20 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64     psp->gp->wild
13b20 63 61 72 64 20 3d 20 73 70 3b 0a 20 20 20 20 20  card = sp;.     
13b30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13b40 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
13b50 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d  ->filename, psp-
13b60 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
13b70 20 20 20 20 20 20 20 20 20 20 22 45 78 74 72 61            "Extra
13b80 20 77 69 6c 64 63 61 72 64 20 74 6f 20 74 6f 6b   wildcard to tok
13b90 65 6e 3a 20 25 73 22 2c 20 78 29 3b 0a 20 20 20  en: %s", x);.   
13ba0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
13bb0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
13bc0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
13bd0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
13be0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53  WAITING_FOR_CLAS
13bf0 53 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20  S_ID:.      if( 
13c00 21 69 73 6c 6f 77 65 72 28 78 5b 30 5d 29 20 29  !islower(x[0]) )
13c10 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
13c20 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
13c30 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  , psp->tokenline
13c40 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25  no,.          "%
13c50 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 6d 75 73  %token_class mus
13c60 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79  t be followed by
13c70 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 3a 20   an identifier: 
13c80 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ", x);.        p
13c90 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
13ca0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
13cb0 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
13cc0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
13cd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53 79 6d     }else if( Sym
13ce0 62 6f 6c 5f 66 69 6e 64 28 78 29 20 29 7b 0a 20  bol_find(x) ){. 
13cf0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
13d00 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70  psp->filename, p
13d10 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
13d20 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62  .          "Symb
13d30 6f 6c 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64  ol \"%s\" alread
13d40 79 20 75 73 65 64 22 2c 20 78 29 3b 0a 20 20 20  y used", x);.   
13d50 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
13d60 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
13d70 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
13d80 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
13d90 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
13da0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 74 6b  .        psp->tk
13db0 63 6c 61 73 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e  class = Symbol_n
13dc0 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ew(x);.        p
13dd0 73 70 2d 3e 74 6b 63 6c 61 73 73 2d 3e 74 79 70  sp->tkclass->typ
13de0 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41  e = MULTITERMINA
13df0 4c 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  L;.        psp->
13e00 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
13e10 46 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 3b  FOR_CLASS_TOKEN;
13e20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13e30 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
13e40 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53  AITING_FOR_CLASS
13e50 5f 54 4f 4b 45 4e 3a 0a 20 20 20 20 20 20 69 66  _TOKEN:.      if
13e60 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
13e70 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
13e80 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
13e90 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
13ea0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
13eb0 75 70 70 65 72 28 78 5b 30 5d 29 20 7c 7c 20 28  upper(x[0]) || (
13ec0 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78 5b  (x[0]=='|' || x[
13ed0 30 5d 3d 3d 27 2f 27 29 20 26 26 20 69 73 75 70  0]=='/') && isup
13ee0 70 65 72 28 78 5b 31 5d 29 29 20 29 7b 0a 20 20  per(x[1])) ){.  
13ef0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
13f00 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d 3e  bol *msp = psp->
13f10 74 6b 63 6c 61 73 73 3b 0a 20 20 20 20 20 20 20  tkclass;.       
13f20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b 2b 3b   msp->nsubsym++;
13f30 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75  .        msp->su
13f40 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74 20 73  bsym = (struct s
13f50 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61 6c 6c 6f  ymbol **) reallo
13f60 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c 0a 20  c(msp->subsym,. 
13f70 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
13f80 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a  struct symbol*)*
13f90 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29 3b 0a 20  msp->nsubsym);. 
13fa0 20 20 20 20 20 20 20 69 66 28 20 21 69 73 75 70         if( !isup
13fb0 70 65 72 28 78 5b 30 5d 29 20 29 20 78 2b 2b 3b  per(x[0]) ) x++;
13fc0 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75  .        msp->su
13fd0 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73 79  bsym[msp->nsubsy
13fe0 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  m-1] = Symbol_ne
13ff0 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  w(x);.      }els
14000 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
14010 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
14020 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
14030 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
14040 25 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 61 72  %%token_class ar
14050 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68  gument \"%s\" sh
14060 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22  ould be a token"
14070 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  , x);.        ps
14080 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
14090 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
140a0 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
140b0 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  _DECL_ERROR;.   
140c0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
140d0 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 59 4e  ;.    case RESYN
140e0 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
140f0 4f 52 3a 0a 2f 2a 20 20 20 20 20 20 69 66 28 20  OR:./*      if( 
14100 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d  x[0]=='.' ) psp-
14110 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
14120 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
14130 45 3b 0a 2a 2a 20 20 20 20 20 20 62 72 65 61 6b  E;.**      break
14140 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 52 45  ; */.    case RE
14150 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
14160 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 69 66 28  ERROR:.      if(
14170 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70   x[0]=='.' ) psp
14180 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
14190 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
141a0 4c 45 3b 0a 20 20 20 20 20 20 69 66 28 20 78 5b  LE;.      if( x[
141b0 30 5d 3d 3d 27 25 27 20 29 20 70 73 70 2d 3e 73  0]=='%' ) psp->s
141c0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
141d0 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b  OR_DECL_KEYWORD;
141e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
141f0 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 74 68 65 20  }.}../* Run the 
14200 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6f 76 65  preprocessor ove
14210 72 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  r the input file
14220 20 74 65 78 74 2e 20 20 54 68 65 20 67 6c 6f 62   text.  The glob
14230 61 6c 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  al variables.** 
14240 61 7a 44 65 66 69 6e 65 5b 30 5d 20 74 68 72 6f  azDefine[0] thro
14250 75 67 68 20 61 7a 44 65 66 69 6e 65 5b 6e 44 65  ugh azDefine[nDe
14260 66 69 6e 65 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  fine-1] contains
14270 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
14280 6c 20 64 65 66 69 6e 65 64 0a 2a 2a 20 6d 61 63  l defined.** mac
14290 72 6f 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ros.  This routi
142a0 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72 20 22 25 69  ne looks for "%i
142b0 66 64 65 66 22 20 61 6e 64 20 22 25 69 66 6e 64  fdef" and "%ifnd
142c0 65 66 22 20 61 6e 64 20 22 25 65 6e 64 69 66 22  ef" and "%endif"
142d0 20 61 6e 64 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73   and.** comments
142e0 20 74 68 65 6d 20 6f 75 74 2e 20 20 54 65 78 74   them out.  Text
142f0 20 69 6e 20 62 65 74 77 65 65 6e 20 69 73 20 61   in between is a
14300 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75  lso commented ou
14310 74 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  t as appropriate
14320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14330 20 70 72 65 70 72 6f 63 65 73 73 5f 69 6e 70 75   preprocess_inpu
14340 74 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t(char *z){.  in
14350 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20  t i, j, k, n;.  
14360 69 6e 74 20 65 78 63 6c 75 64 65 20 3d 20 30 3b  int exclude = 0;
14370 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30  .  int start = 0
14380 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d  ;.  int lineno =
14390 20 31 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 5f   1;.  int start_
143a0 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f  lineno = 1;.  fo
143b0 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
143c0 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  ){.    if( z[i]=
143d0 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
143e0 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 21 3d  ;.    if( z[i]!=
143f0 27 25 27 20 7c 7c 20 28 69 3e 30 20 26 26 20 7a  '%' || (i>0 && z
14400 5b 69 2d 31 5d 21 3d 27 5c 6e 27 29 20 29 20 63  [i-1]!='\n') ) c
14410 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
14420 20 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22   strncmp(&z[i],"
14430 25 65 6e 64 69 66 22 2c 36 29 3d 3d 30 20 26 26  %endif",6)==0 &&
14440 20 69 73 73 70 61 63 65 28 7a 5b 69 2b 36 5d 29   isspace(z[i+6])
14450 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78   ){.      if( ex
14460 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20  clude ){.       
14470 20 65 78 63 6c 75 64 65 2d 2d 3b 0a 20 20 20 20   exclude--;.    
14480 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 3d      if( exclude=
14490 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
144a0 66 6f 72 28 6a 3d 73 74 61 72 74 3b 20 6a 3c 69  for(j=start; j<i
144b0 3b 20 6a 2b 2b 29 20 69 66 28 20 7a 5b 6a 5d 21  ; j++) if( z[j]!
144c0 3d 27 5c 6e 27 20 29 20 7a 5b 6a 5d 20 3d 20 27  ='\n' ) z[j] = '
144d0 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
144e0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
144f0 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a  j=i; z[j] && z[j
14500 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b  ]!='\n'; j++) z[
14510 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 65  j] = ' ';.    }e
14520 6c 73 65 20 69 66 28 20 28 73 74 72 6e 63 6d 70  lse if( (strncmp
14530 28 26 7a 5b 69 5d 2c 22 25 69 66 64 65 66 22 2c  (&z[i],"%ifdef",
14540 36 29 3d 3d 30 20 26 26 20 69 73 73 70 61 63 65  6)==0 && isspace
14550 28 7a 5b 69 2b 36 5d 29 29 0a 20 20 20 20 20 20  (z[i+6])).      
14560 20 20 20 20 7c 7c 20 28 73 74 72 6e 63 6d 70 28      || (strncmp(
14570 26 7a 5b 69 5d 2c 22 25 69 66 6e 64 65 66 22 2c  &z[i],"%ifndef",
14580 37 29 3d 3d 30 20 26 26 20 69 73 73 70 61 63 65  7)==0 && isspace
14590 28 7a 5b 69 2b 37 5d 29 29 20 29 7b 0a 20 20 20  (z[i+7])) ){.   
145a0 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29     if( exclude )
145b0 7b 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64  {.        exclud
145c0 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e++;.      }else
145d0 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
145e0 69 2b 37 3b 20 69 73 73 70 61 63 65 28 7a 5b 6a  i+7; isspace(z[j
145f0 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]); j++){}.     
14600 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6a 2b     for(n=0; z[j+
14610 6e 5d 20 26 26 20 21 69 73 73 70 61 63 65 28 7a  n] && !isspace(z
14620 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20  [j+n]); n++){}. 
14630 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 20 3d         exclude =
14640 20 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   1;.        for(
14650 6b 3d 30 3b 20 6b 3c 6e 44 65 66 69 6e 65 3b 20  k=0; k<nDefine; 
14660 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
14670 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 44 65  if( strncmp(azDe
14680 66 69 6e 65 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e 29  fine[k],&z[j],n)
14690 3d 3d 30 20 26 26 20 6c 65 6d 6f 6e 53 74 72 6c  ==0 && lemonStrl
146a0 65 6e 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 29 3d  en(azDefine[k])=
146b0 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =n ){.          
146c0 20 20 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20    exclude = 0;. 
146d0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
146e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
146f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14700 69 66 28 20 7a 5b 69 2b 33 5d 3d 3d 27 6e 27 20  if( z[i+3]=='n' 
14710 29 20 65 78 63 6c 75 64 65 20 3d 20 21 65 78 63  ) exclude = !exc
14720 6c 75 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66  lude;.        if
14730 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20  ( exclude ){.   
14740 20 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 69         start = i
14750 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72  ;.          star
14760 74 5f 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e  t_lineno = linen
14770 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  o;.        }.   
14780 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
14790 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d  =i; z[j] && z[j]
147a0 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a  !='\n'; j++) z[j
147b0 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20  ] = ' ';.    }. 
147c0 20 7d 0a 20 20 69 66 28 20 65 78 63 6c 75 64 65   }.  if( exclude
147d0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
147e0 73 74 64 65 72 72 2c 22 75 6e 74 65 72 6d 69 6e  stderr,"untermin
147f0 61 74 65 64 20 25 25 69 66 64 65 66 20 73 74 61  ated %%ifdef sta
14800 72 74 69 6e 67 20 6f 6e 20 6c 69 6e 65 20 25 64  rting on line %d
14810 5c 6e 22 2c 20 73 74 61 72 74 5f 6c 69 6e 65 6e  \n", start_linen
14820 6f 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  o);.    exit(1);
14830 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20 73 70  .  }.}../* In sp
14840 69 74 65 20 6f 66 20 69 74 73 20 6e 61 6d 65 2c  ite of its name,
14850 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
14860 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6e 6e  s really a scann
14870 65 72 2e 20 20 49 74 20 72 65 61 64 0a 2a 2a 20  er.  It read.** 
14880 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e  in the entire in
14890 70 75 74 20 66 69 6c 65 20 28 61 6c 6c 20 61 74  put file (all at
148a0 20 6f 6e 63 65 29 20 74 68 65 6e 20 74 6f 6b 65   once) then toke
148b0 6e 69 7a 65 73 20 69 74 2e 20 20 45 61 63 68 0a  nizes it.  Each.
148c0 2a 2a 20 74 6f 6b 65 6e 20 69 73 20 70 61 73 73  ** token is pass
148d0 65 64 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ed to the functi
148e0 6f 6e 20 22 70 61 72 73 65 6f 6e 65 74 6f 6b 65  on "parseonetoke
148f0 6e 22 20 77 68 69 63 68 20 62 75 69 6c 64 73 20  n" which builds 
14900 61 6c 6c 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f  all.** the appro
14910 70 72 69 61 74 65 20 64 61 74 61 20 73 74 72 75  priate data stru
14920 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 67 6c  ctures in the gl
14930 6f 62 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f  obal state vecto
14940 72 20 22 67 70 22 2e 0a 2a 2f 0a 76 6f 69 64 20  r "gp"..*/.void 
14950 50 61 72 73 65 28 73 74 72 75 63 74 20 6c 65 6d  Parse(struct lem
14960 6f 6e 20 2a 67 70 29 0a 7b 0a 20 20 73 74 72 75  on *gp).{.  stru
14970 63 74 20 70 73 74 61 74 65 20 70 73 3b 0a 20 20  ct pstate ps;.  
14980 46 49 4c 45 20 2a 66 70 3b 0a 20 20 63 68 61 72  FILE *fp;.  char
14990 20 2a 66 69 6c 65 62 75 66 3b 0a 20 20 75 6e 73   *filebuf;.  uns
149a0 69 67 6e 65 64 20 69 6e 74 20 66 69 6c 65 73 69  igned int filesi
149b0 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f  ze;.  int lineno
149c0 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68 61  ;.  int c;.  cha
149d0 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63 70 3b 0a  r *cp, *nextcp;.
149e0 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e 65 20    int startline 
149f0 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  = 0;..  memset(&
14a00 70 73 2c 20 27 5c 30 27 2c 20 73 69 7a 65 6f 66  ps, '\0', sizeof
14a10 28 70 73 29 29 3b 0a 20 20 70 73 2e 67 70 20 3d  (ps));.  ps.gp =
14a20 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65 6e 61   gp;.  ps.filena
14a30 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e 61 6d  me = gp->filenam
14a40 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63 6e 74  e;.  ps.errorcnt
14a50 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61 74 65   = 0;.  ps.state
14a60 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b 0a 0a   = INITIALIZE;..
14a70 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 65    /* Begin by re
14a80 61 64 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20  ading the input 
14a90 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d 20 66  file */.  fp = f
14aa0 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61 6d 65  open(ps.filename
14ab0 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 66 70  ,"rb");.  if( fp
14ac0 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ==0 ){.    Error
14ad0 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
14ae0 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68  0,"Can't open th
14af0 69 73 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  is file for read
14b00 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70 2d 3e  ing.");.    gp->
14b10 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
14b20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 73  return;.  }.  fs
14b30 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20 20 66  eek(fp,0,2);.  f
14b40 69 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c 6c 28  ilesize = ftell(
14b50 66 70 29 3b 0a 20 20 72 65 77 69 6e 64 28 66 70  fp);.  rewind(fp
14b60 29 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d 20 28  );.  filebuf = (
14b70 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 66  char *)malloc( f
14b80 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20 20 69  ilesize+1 );.  i
14b90 66 28 20 66 69 6c 65 73 69 7a 65 3e 31 30 30 30  f( filesize>1000
14ba0 30 30 30 30 30 20 7c 7c 20 66 69 6c 65 62 75 66  00000 || filebuf
14bb0 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ==0 ){.    Error
14bc0 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
14bd0 30 2c 22 49 6e 70 75 74 20 66 69 6c 65 20 74 6f  0,"Input file to
14be0 6f 20 6c 61 72 67 65 2e 22 29 3b 0a 20 20 20 20  o large.");.    
14bf0 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  gp->errorcnt++;.
14c00 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a      fclose(fp);.
14c10 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
14c20 20 20 69 66 28 20 66 72 65 61 64 28 66 69 6c 65    if( fread(file
14c30 62 75 66 2c 31 2c 66 69 6c 65 73 69 7a 65 2c 66  buf,1,filesize,f
14c40 70 29 21 3d 66 69 6c 65 73 69 7a 65 20 29 7b 0a  p)!=filesize ){.
14c50 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e      ErrorMsg(ps.
14c60 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27  filename,0,"Can'
14c70 74 20 72 65 61 64 20 69 6e 20 61 6c 6c 20 25 64  t read in all %d
14c80 20 62 79 74 65 73 20 6f 66 20 74 68 69 73 20 66   bytes of this f
14c90 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66 69 6c  ile.",.      fil
14ca0 65 73 69 7a 65 29 3b 0a 20 20 20 20 66 72 65 65  esize);.    free
14cb0 28 66 69 6c 65 62 75 66 29 3b 0a 20 20 20 20 67  (filebuf);.    g
14cc0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
14cd0 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20     fclose(fp);. 
14ce0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
14cf0 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 66   fclose(fp);.  f
14d00 69 6c 65 62 75 66 5b 66 69 6c 65 73 69 7a 65 5d  ilebuf[filesize]
14d10 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65   = 0;..  /* Make
14d20 20 61 6e 20 69 6e 69 74 69 61 6c 20 70 61 73 73   an initial pass
14d30 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
14d40 65 20 74 6f 20 68 61 6e 64 6c 65 20 25 69 66 64  e to handle %ifd
14d50 65 66 20 61 6e 64 20 25 69 66 6e 64 65 66 20 2a  ef and %ifndef *
14d60 2f 0a 20 20 70 72 65 70 72 6f 63 65 73 73 5f 69  /.  preprocess_i
14d70 6e 70 75 74 28 66 69 6c 65 62 75 66 29 3b 0a 0a  nput(filebuf);..
14d80 20 20 2f 2a 20 4e 6f 77 20 73 63 61 6e 20 74 68    /* Now scan th
14d90 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 69 6e  e text of the in
14da0 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 6c 69  put file */.  li
14db0 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28  neno = 1;.  for(
14dc0 63 70 3d 66 69 6c 65 62 75 66 3b 20 28 63 3d 20  cp=filebuf; (c= 
14dd0 2a 63 70 29 21 3d 30 3b 20 29 7b 0a 20 20 20 20  *cp)!=0; ){.    
14de0 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
14df0 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20 20 20 20 20  neno++;         
14e00 20 20 20 20 20 2f 2a 20 4b 65 65 70 20 74 72 61       /* Keep tra
14e10 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e  ck of the line n
14e20 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 66 28  umber */.    if(
14e30 20 69 73 73 70 61 63 65 28 63 29 20 29 7b 20 63   isspace(c) ){ c
14e40 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d  p++; continue; }
14e50 20 20 2f 2a 20 53 6b 69 70 20 61 6c 6c 20 77 68    /* Skip all wh
14e60 69 74 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ite space */.   
14e70 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63   if( c=='/' && c
14e80 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 20 20  p[1]=='/' ){    
14e90 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 2b        /* Skip C+
14ea0 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73  + style comments
14eb0 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b   */.      cp+=2;
14ec0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
14ed0 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d  = *cp)!=0 && c!=
14ee0 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20  '\n' ) cp++;.   
14ef0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
14f00 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2f   }.    if( c=='/
14f10 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20  ' && cp[1]=='*' 
14f20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ){          /* S
14f30 6b 69 70 20 43 20 73 74 79 6c 65 20 63 6f 6d 6d  kip C style comm
14f40 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70  ents */.      cp
14f50 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  +=2;.      while
14f60 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ( (c= *cp)!=0 &&
14f70 20 28 63 21 3d 27 2f 27 20 7c 7c 20 63 70 5b 2d   (c!='/' || cp[-
14f80 31 5d 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20  1]!='*') ){.    
14f90 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
14fa0 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ) lineno++;.    
14fb0 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20      cp++;.      
14fc0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 20  }.      if( c ) 
14fd0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74  cp++;.      cont
14fe0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
14ff0 70 73 2e 74 6f 6b 65 6e 73 74 61 72 74 20 3d 20  ps.tokenstart = 
15000 63 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  cp;             
15010 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 62     /* Mark the b
15020 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
15030 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 73 2e  token */.    ps.
15040 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d 20 6c 69  tokenlineno = li
15050 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  neno;           
15060 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 6f 6e  /* Linenumber on
15070 20 77 68 69 63 68 20 74 6f 6b 65 6e 20 62 65 67   which token beg
15080 69 6e 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 63  ins */.    if( c
15090 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 20 20 20  =='\"' ){       
150a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
150b0 20 53 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73   String literals
150c0 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a   */.      cp++;.
150d0 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
150e0 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27   *cp)!=0 && c!='
150f0 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  \"' ){.        i
15100 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
15110 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63  eno++;.        c
15120 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p++;.      }.   
15130 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
15140 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
15150 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 73 74 61 72  ps.filename,star
15160 74 6c 69 6e 65 2c 0a 22 53 74 72 69 6e 67 20 73  tline,."String s
15170 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20  tarting on this 
15180 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d  line is not term
15190 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74 68  inated before th
151a0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
151b0 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  e.");.        ps
151c0 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  .errorcnt++;.   
151d0 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
151e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
151f0 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20         nextcp = 
15200 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  cp+1;.      }.  
15210 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
15220 7b 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  {' ){           
15230 20 20 20 20 2f 2a 20 41 20 62 6c 6f 63 6b 20 6f      /* A block o
15240 66 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  f C code */.    
15250 20 20 69 6e 74 20 6c 65 76 65 6c 3b 0a 20 20 20    int level;.   
15260 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 66     cp++;.      f
15270 6f 72 28 6c 65 76 65 6c 3d 31 3b 20 28 63 3d 20  or(level=1; (c= 
15280 2a 63 70 29 21 3d 30 20 26 26 20 28 6c 65 76 65  *cp)!=0 && (leve
15290 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d 27 29 3b 20  l>1 || c!='}'); 
152a0 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  cp++){.        i
152b0 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
152c0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65  eno++;.        e
152d0 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29  lse if( c=='{' )
152e0 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20   level++;.      
152f0 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7d    else if( c=='}
15300 27 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a 20 20 20  ' ) level--;.   
15310 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d       else if( c=
15320 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='/' && cp[1]=='
15330 2a 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 63  *' ){  /* Skip c
15340 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  omments */.     
15350 20 20 20 20 20 69 6e 74 20 70 72 65 76 63 3b 0a       int prevc;.
15360 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 26            cp = &
15370 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20  cp[2];.         
15380 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20   prevc = 0;.    
15390 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
153a0 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d   *cp)!=0 && (c!=
153b0 27 2f 27 20 7c 7c 20 70 72 65 76 63 21 3d 27 2a  '/' || prevc!='*
153c0 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ') ){.          
153d0 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
153e0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
153f0 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b        prevc = c;
15400 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 70 2b  .            cp+
15410 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
15420 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
15430 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d   c=='/' && cp[1]
15440 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20 53 6b 69  =='/' ){  /* Ski
15450 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d  p C++ style comm
15460 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20 20 20 20  ents too */.    
15470 20 20 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32        cp = &cp[2
15480 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ];.          whi
15490 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
154a0 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b  && c!='\n' ) cp+
154b0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  +;.          if(
154c0 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20   c ) lineno++;. 
154d0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
154e0 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27   c=='\'' || c=='
154f0 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20 53 74 72  \"' ){    /* Str
15500 69 6e 67 20 61 20 63 68 61 72 61 63 74 65 72 20  ing a character 
15510 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20  literals */.    
15520 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 63        int startc
15530 68 61 72 2c 20 70 72 65 76 63 3b 0a 20 20 20 20  har, prevc;.    
15540 20 20 20 20 20 20 73 74 61 72 74 63 68 61 72 20        startchar 
15550 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = c;.          p
15560 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  revc = 0;.      
15570 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b 20 28 63      for(cp++; (c
15580 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21  = *cp)!=0 && (c!
15590 3d 73 74 61 72 74 63 68 61 72 20 7c 7c 20 70 72  =startchar || pr
155a0 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63 70 2b 2b  evc=='\\'); cp++
155b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
155c0 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
155d0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  eno++;.         
155e0 20 20 20 69 66 28 20 70 72 65 76 63 3d 3d 27 5c     if( prevc=='\
155f0 5c 27 20 29 20 70 72 65 76 63 20 3d 20 30 3b 0a  \' ) prevc = 0;.
15600 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
15620 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  evc = c;.       
15630 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
15640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
15650 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
15660 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c   ErrorMsg(ps.fil
15670 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b 65 6e 6c 69  ename,ps.tokenli
15680 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64 65 20 73 74  neno,."C code st
15690 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c  arting on this l
156a0 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d 69  ine is not termi
156b0 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74 68 65  nated before the
156c0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
156d0 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 2e  .");.        ps.
156e0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
156f0 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
15700 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15710 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
15720 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p+1;.      }.   
15730 20 7d 65 6c 73 65 20 69 66 28 20 69 73 61 6c 6e   }else if( isaln
15740 75 6d 28 63 29 20 29 7b 20 20 20 20 20 20 20 20  um(c) ){        
15750 20 20 2f 2a 20 49 64 65 6e 74 69 66 69 65 72 73    /* Identifiers
15760 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
15770 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
15780 28 69 73 61 6c 6e 75 6d 28 63 29 20 7c 7c 20 63  (isalnum(c) || c
15790 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a 20  =='_') ) cp++;. 
157a0 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
157b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
157c0 63 3d 3d 27 3a 27 20 26 26 20 63 70 5b 31 5d 3d  c==':' && cp[1]=
157d0 3d 27 3a 27 20 26 26 20 63 70 5b 32 5d 3d 3d 27  =':' && cp[2]=='
157e0 3d 27 20 29 7b 20 2f 2a 20 54 68 65 20 6f 70 65  =' ){ /* The ope
157f0 72 61 74 6f 72 20 22 3a 3a 3d 22 20 2a 2f 0a 20  rator "::=" */. 
15800 20 20 20 20 20 63 70 20 2b 3d 20 33 3b 0a 20 20       cp += 3;.  
15810 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
15820 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
15830 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27 7c 27  c=='/' || c=='|'
15840 29 20 26 26 20 69 73 61 6c 70 68 61 28 63 70 5b  ) && isalpha(cp[
15850 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 63 70 20  1]) ){.      cp 
15860 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c  += 2;.      whil
15870 65 28 20 28 63 20 3d 20 2a 63 70 29 21 3d 30 20  e( (c = *cp)!=0 
15880 26 26 20 28 69 73 61 6c 6e 75 6d 28 63 29 20 7c  && (isalnum(c) |
15890 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b  | c=='_') ) cp++
158a0 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
158b0 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20   cp;.    }else{ 
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
158e0 6f 74 68 65 72 20 28 6f 6e 65 20 63 68 61 72 61  other (one chara
158f0 63 74 65 72 29 20 6f 70 65 72 61 74 6f 72 73 20  cter) operators 
15900 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20  */.      cp++;. 
15910 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
15920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 20 3d 20  ;.    }.    c = 
15930 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30  *cp;.    *cp = 0
15940 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15950 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 6c           /* Null
15960 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 74   terminate the t
15970 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 61 72 73  oken */.    pars
15980 65 6f 6e 65 74 6f 6b 65 6e 28 26 70 73 29 3b 20  eonetoken(&ps); 
15990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
159a0 61 72 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a  arse the token *
159b0 2f 0a 20 20 20 20 2a 63 70 20 3d 20 28 63 68 61  /.    *cp = (cha
159c0 72 29 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  r)c;            
159d0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 6f 72 65        /* Restore
159e0 20 74 68 65 20 62 75 66 66 65 72 20 2a 2f 0a 20   the buffer */. 
159f0 20 20 20 63 70 20 3d 20 6e 65 78 74 63 70 3b 0a     cp = nextcp;.
15a00 20 20 7d 0a 20 20 66 72 65 65 28 66 69 6c 65 62    }.  free(fileb
15a10 75 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  uf);            
15a20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61          /* Relea
15a30 73 65 20 74 68 65 20 62 75 66 66 65 72 20 61 66  se the buffer af
15a40 74 65 72 20 70 61 72 73 69 6e 67 20 2a 2f 0a 20  ter parsing */. 
15a50 20 67 70 2d 3e 72 75 6c 65 20 3d 20 70 73 2e 66   gp->rule = ps.f
15a60 69 72 73 74 72 75 6c 65 3b 0a 20 20 67 70 2d 3e  irstrule;.  gp->
15a70 65 72 72 6f 72 63 6e 74 20 3d 20 70 73 2e 65 72  errorcnt = ps.er
15a80 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  rorcnt;.}./*****
15a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15aa0 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
15ab0 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 63 22 20 2a  file "plink.c" *
15ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ad0 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ****/./*.** Rout
15ae0 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20  ines processing 
15af0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f  configuration fo
15b00 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61  llow-set propaga
15b10 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a 20 69 6e  tion links.** in
15b20 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
15b30 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
15b40 73 74 61 74 69 63 20 73 74 72 75 63 74 20 70 6c  static struct pl
15b50 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66 72 65 65 6c  ink *plink_freel
15b60 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 20 41 6c 6c  ist = 0;../* All
15b70 6f 63 61 74 65 20 61 20 6e 65 77 20 70 6c 69 6e  ocate a new plin
15b80 6b 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e  k */.struct plin
15b90 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28 29 7b 0a  k *Plink_new(){.
15ba0 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
15bb0 6e 65 77 6c 69 6e 6b 3b 0a 0a 20 20 69 66 28 20  newlink;..  if( 
15bc0 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d  plink_freelist==
15bd0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
15be0 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30      int amt = 10
15bf0 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65  0;.    plink_fre
15c00 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20  elist = (struct 
15c10 70 6c 69 6e 6b 20 2a 29 63 61 6c 6c 6f 63 28 20  plink *)calloc( 
15c20 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  amt, sizeof(stru
15c30 63 74 20 70 6c 69 6e 6b 29 20 29 3b 0a 20 20 20  ct plink) );.   
15c40 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c   if( plink_freel
15c50 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
15c60 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a  fprintf(stderr,.
15c70 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f        "Unable to
15c80 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
15c90 20 66 6f 72 20 61 20 6e 65 77 20 66 6f 6c 6c 6f   for a new follo
15ca0 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f  w-set propagatio
15cb0 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20 20 20  n link.\n");.   
15cc0 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
15cd0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
15ce0 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 70 6c 69  <amt-1; i++) pli
15cf0 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e  nk_freelist[i].n
15d00 65 78 74 20 3d 20 26 70 6c 69 6e 6b 5f 66 72 65  ext = &plink_fre
15d10 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20  elist[i+1];.    
15d20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 61  plink_freelist[a
15d30 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a  mt-1].next = 0;.
15d40 20 20 7d 0a 20 20 6e 65 77 6c 69 6e 6b 20 3d 20    }.  newlink = 
15d50 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a  plink_freelist;.
15d60 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74    plink_freelist
15d70 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73   = plink_freelis
15d80 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72  t->next;.  retur
15d90 6e 20 6e 65 77 6c 69 6e 6b 3b 0a 7d 0a 0a 2f 2a  n newlink;.}../*
15da0 20 41 64 64 20 61 20 70 6c 69 6e 6b 20 74 6f 20   Add a plink to 
15db0 61 20 70 6c 69 6e 6b 20 6c 69 73 74 20 2a 2f 0a  a plink list */.
15dc0 76 6f 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 73  void Plink_add(s
15dd0 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 70 6c  truct plink **pl
15de0 70 70 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69  pp, struct confi
15df0 67 20 2a 63 66 70 29 0a 7b 0a 20 20 73 74 72 75  g *cfp).{.  stru
15e00 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 6c 69 6e  ct plink *newlin
15e10 6b 3b 0a 20 20 6e 65 77 6c 69 6e 6b 20 3d 20 50  k;.  newlink = P
15e20 6c 69 6e 6b 5f 6e 65 77 28 29 3b 0a 20 20 6e 65  link_new();.  ne
15e30 77 6c 69 6e 6b 2d 3e 6e 65 78 74 20 3d 20 2a 70  wlink->next = *p
15e40 6c 70 70 3b 0a 20 20 2a 70 6c 70 70 20 3d 20 6e  lpp;.  *plpp = n
15e50 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e  ewlink;.  newlin
15e60 6b 2d 3e 63 66 70 20 3d 20 63 66 70 3b 0a 7d 0a  k->cfp = cfp;.}.
15e70 0a 2f 2a 20 54 72 61 6e 73 66 65 72 20 65 76 65  ./* Transfer eve
15e80 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20  ry plink on the 
15e90 6c 69 73 74 20 22 66 72 6f 6d 22 20 74 6f 20 74  list "from" to t
15ea0 68 65 20 6c 69 73 74 20 22 74 6f 22 20 2a 2f 0a  he list "to" */.
15eb0 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28  void Plink_copy(
15ec0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 74  struct plink **t
15ed0 6f 2c 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  o, struct plink 
15ee0 2a 66 72 6f 6d 29 0a 7b 0a 20 20 73 74 72 75 63  *from).{.  struc
15ef0 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b  t plink *nextpl;
15f00 0a 20 20 77 68 69 6c 65 28 20 66 72 6f 6d 20 29  .  while( from )
15f10 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d 20 66  {.    nextpl = f
15f20 72 6f 6d 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 66  rom->next;.    f
15f30 72 6f 6d 2d 3e 6e 65 78 74 20 3d 20 2a 74 6f 3b  rom->next = *to;
15f40 0a 20 20 20 20 2a 74 6f 20 3d 20 66 72 6f 6d 3b  .    *to = from;
15f50 0a 20 20 20 20 66 72 6f 6d 20 3d 20 6e 65 78 74  .    from = next
15f60 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 44 65  pl;.  }.}../* De
15f70 6c 65 74 65 20 65 76 65 72 79 20 70 6c 69 6e 6b  lete every plink
15f80 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   on the list */.
15f90 76 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74  void Plink_delet
15fa0 65 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  e(struct plink *
15fb0 70 6c 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  plp).{.  struct 
15fc0 70 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 0a  plink *nextpl;..
15fd0 20 20 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a    while( plp ){.
15fe0 20 20 20 20 6e 65 78 74 70 6c 20 3d 20 70 6c 70      nextpl = plp
15ff0 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 70 6c 70 2d  ->next;.    plp-
16000 3e 6e 65 78 74 20 3d 20 70 6c 69 6e 6b 5f 66 72  >next = plink_fr
16010 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 6c 69 6e  eelist;.    plin
16020 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70 6c 70  k_freelist = plp
16030 3b 0a 20 20 20 20 70 6c 70 20 3d 20 6e 65 78 74  ;.    plp = next
16040 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a  pl;.  }.}./*****
16050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16060 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
16070 20 22 72 65 70 6f 72 74 2e 63 22 20 2a 2a 2a 2a   "report.c" ****
16080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16090 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72  ******/./*.** Pr
160a0 6f 63 65 64 75 72 65 73 20 66 6f 72 20 67 65 6e  ocedures for gen
160b0 65 72 61 74 69 6e 67 20 72 65 70 6f 72 74 73 20  erating reports 
160c0 61 6e 64 20 74 61 62 6c 65 73 20 69 6e 20 74 68  and tables in th
160d0 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
160e0 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
160f0 20 47 65 6e 65 72 61 74 65 20 61 20 66 69 6c 65   Generate a file
16100 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20 67 69  name with the gi
16110 76 65 6e 20 73 75 66 66 69 78 2e 20 20 53 70 61  ven suffix.  Spa
16120 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  ce to hold the.*
16130 2a 20 6e 61 6d 65 20 63 6f 6d 65 73 20 66 72 6f  * name comes fro
16140 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  m malloc() and m
16150 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
16160 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  the calling.** f
16170 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56  unction..*/.PRIV
16180 41 54 45 20 63 68 61 72 20 2a 66 69 6c 65 5f 6d  ATE char *file_m
16190 61 6b 65 6e 61 6d 65 28 73 74 72 75 63 74 20 6c  akename(struct l
161a0 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63 6f 6e 73  emon *lemp, cons
161b0 74 20 63 68 61 72 20 2a 73 75 66 66 69 78 29 0a  t char *suffix).
161c0 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a  {.  char *name;.
161d0 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20 6e    char *cp;..  n
161e0 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c  ame = (char*)mal
161f0 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  loc( lemonStrlen
16200 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  (lemp->filename)
16210 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73   + lemonStrlen(s
16220 75 66 66 69 78 29 20 2b 20 35 20 29 3b 0a 20 20  uffix) + 5 );.  
16230 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  if( name==0 ){. 
16240 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
16250 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74  r,"Can't allocat
16260 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 66 69  e space for a fi
16270 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20 20  lename.\n");.   
16280 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
16290 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 6e 61 6d  lemon_strcpy(nam
162a0 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  e,lemp->filename
162b0 29 3b 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68  );.  cp = strrch
162c0 72 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69  r(name,'.');.  i
162d0 66 28 20 63 70 20 29 20 2a 63 70 20 3d 20 30 3b  f( cp ) *cp = 0;
162e0 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 61 74 28  .  lemon_strcat(
162f0 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b 0a 20 20  name,suffix);.  
16300 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d 0a 0a  return name;.}..
16310 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 77  /* Open a file w
16320 69 74 68 20 61 20 6e 61 6d 65 20 62 61 73 65 64  ith a name based
16330 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   on the name of 
16340 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 2c 0a  the input file,.
16350 2a 2a 20 62 75 74 20 77 69 74 68 20 61 20 64 69  ** but with a di
16360 66 66 65 72 65 6e 74 20 28 73 70 65 63 69 66 69  fferent (specifi
16370 65 64 29 20 73 75 66 66 69 78 2c 20 61 6e 64 20  ed) suffix, and 
16380 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
16390 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 72 65 61  .** to the strea
163a0 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49 4c  m */.PRIVATE FIL
163b0 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28 0a 20 20  E *file_open(.  
163c0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
163d0 6d 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  mp,.  const char
163e0 20 2a 73 75 66 66 69 78 2c 0a 20 20 63 6f 6e 73   *suffix,.  cons
163f0 74 20 63 68 61 72 20 2a 6d 6f 64 65 0a 29 7b 0a  t char *mode.){.
16400 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 69    FILE *fp;..  i
16410 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  f( lemp->outname
16420 20 29 20 66 72 65 65 28 6c 65 6d 70 2d 3e 6f 75   ) free(lemp->ou
16430 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d 70 2d 3e  tname);.  lemp->
16440 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d  outname = file_m
16450 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 73 75  akename(lemp, su
16460 66 66 69 78 29 3b 0a 20 20 66 70 20 3d 20 66 6f  ffix);.  fp = fo
16470 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  pen(lemp->outnam
16480 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66 28 20 66  e,mode);.  if( f
16490 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65 3d 3d 27  p==0 && *mode=='
164a0 77 27 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  w' ){.    fprint
164b0 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
164c0 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25 73 5c 22  open file \"%s\"
164d0 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  .\n",lemp->outna
164e0 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65  me);.    lemp->e
164f0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72  rrorcnt++;.    r
16500 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
16510 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f 2a 20  eturn fp;.}../* 
16520 44 75 70 6c 69 63 61 74 65 20 74 68 65 20 69 6e  Duplicate the in
16530 70 75 74 20 66 69 6c 65 20 77 69 74 68 6f 75 74  put file without
16540 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64 20 77 69   comments and wi
16550 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 20 0a 2a  thout actions .*
16560 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f 0a 76 6f  * on rules */.vo
16570 69 64 20 52 65 70 72 69 6e 74 28 73 74 72 75 63  id Reprint(struc
16580 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
16590 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
165a0 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  rp;.  struct sym
165b0 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69  bol *sp;.  int i
165c0 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20 6c 65 6e  , j, maxlen, len
165d0 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73 6b 69 70  , ncolumns, skip
165e0 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f 2f 20 52  ;.  printf("// R
165f0 65 70 72 69 6e 74 20 6f 66 20 69 6e 70 75 74 20  eprint of input 
16600 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 2f 2f  file \"%s\".\n//
16610 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c 65 6d   Symbols:\n",lem
16620 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
16630 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a 20 20 66  maxlen = 10;.  f
16640 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
16650 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
16660 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79     sp = lemp->sy
16670 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 6c 65  mbols[i];.    le
16680 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  n = lemonStrlen(
16690 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69  sp->name);.    i
166a0 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29 20  f( len>maxlen ) 
166b0 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20  maxlen = len;.  
166c0 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 37  }.  ncolumns = 7
166d0 36 2f 28 6d 61 78 6c 65 6e 2b 35 29 3b 0a 20 20  6/(maxlen+5);.  
166e0 69 66 28 20 6e 63 6f 6c 75 6d 6e 73 3c 31 20 29  if( ncolumns<1 )
166f0 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20   ncolumns = 1;. 
16700 20 73 6b 69 70 20 3d 20 28 6c 65 6d 70 2d 3e 6e   skip = (lemp->n
16710 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f 6c 75 6d 6e  symbol + ncolumn
16720 73 20 2d 20 31 29 2f 6e 63 6f 6c 75 6d 6e 73 3b  s - 1)/ncolumns;
16730 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 6b  .  for(i=0; i<sk
16740 69 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 72  ip; i++){.    pr
16750 69 6e 74 66 28 22 2f 2f 22 29 3b 0a 20 20 20 20  intf("//");.    
16760 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c 65 6d 70 2d  for(j=i; j<lemp-
16770 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 3d 73 6b 69  >nsymbol; j+=ski
16780 70 29 7b 0a 20 20 20 20 20 20 73 70 20 3d 20 6c  p){.      sp = l
16790 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b  emp->symbols[j];
167a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
167b0 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20 29 3b 0a 20  p->index==j );. 
167c0 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 33       printf(" %3
167d0 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d 61 78 6c  d %-*.*s",j,maxl
167e0 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70 2d 3e 6e 61  en,maxlen,sp->na
167f0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
16800 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
16810 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
16820 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
16830 3e 6e 65 78 74 29 7b 0a 20 20 20 20 70 72 69 6e  >next){.    prin
16840 74 66 28 22 25 73 22 2c 72 70 2d 3e 6c 68 73 2d  tf("%s",rp->lhs-
16850 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a 20 20  >name);.    /*  
16860 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69    if( rp->lhsali
16870 61 73 20 29 20 70 72 69 6e 74 66 28 22 28 25 73  as ) printf("(%s
16880 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29  )",rp->lhsalias)
16890 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28  ; */.    printf(
168a0 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20 66 6f 72  " ::=");.    for
168b0 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
168c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 70  ; i++){.      sp
168d0 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
168e0 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70       if( sp->typ
168f0 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
16900 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e   ){.        prin
16910 74 66 28 22 20 25 73 22 2c 20 73 70 2d 3e 73 75  tf(" %s", sp->su
16920 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 29 3b 0a  bsym[0]->name);.
16930 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b          for(j=1;
16940 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20   j<sp->nsubsym; 
16950 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
16960 70 72 69 6e 74 66 28 22 7c 25 73 22 2c 20 73 70  printf("|%s", sp
16970 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d  ->subsym[j]->nam
16980 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
16990 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
169a0 20 20 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c     printf(" %s",
169b0 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
169c0 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 69 66 28    }.      /* if(
169d0 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
169e0 20 29 20 70 72 69 6e 74 66 28 22 28 25 73 29 22   ) printf("(%s)"
169f0 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d  ,rp->rhsalias[i]
16a00 29 3b 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ); */.    }.    
16a10 70 72 69 6e 74 66 28 22 2e 22 29 3b 0a 20 20 20  printf(".");.   
16a20 20 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d   if( rp->precsym
16a30 20 29 20 70 72 69 6e 74 66 28 22 20 5b 25 73 5d   ) printf(" [%s]
16a40 22 2c 72 70 2d 3e 70 72 65 63 73 79 6d 2d 3e 6e  ",rp->precsym->n
16a50 61 6d 65 29 3b 0a 20 20 20 20 2f 2a 20 69 66 28  ame);.    /* if(
16a60 20 72 70 2d 3e 63 6f 64 65 20 29 20 70 72 69 6e   rp->code ) prin
16a70 74 66 28 22 5c 6e 20 20 20 20 25 73 22 2c 72 70  tf("\n    %s",rp
16a80 2d 3e 63 6f 64 65 29 3b 20 2a 2f 0a 20 20 20 20  ->code); */.    
16a90 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  printf("\n");.  
16aa0 7d 0a 7d 0a 0a 76 6f 69 64 20 43 6f 6e 66 69 67  }.}..void Config
16ab0 50 72 69 6e 74 28 46 49 4c 45 20 2a 66 70 2c 20  Print(FILE *fp, 
16ac0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
16ad0 66 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72  fp).{.  struct r
16ae0 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63  ule *rp;.  struc
16af0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20  t symbol *sp;.  
16b00 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 72 70 20 3d  int i, j;.  rp =
16b10 20 63 66 70 2d 3e 72 70 3b 0a 20 20 66 70 72 69   cfp->rp;.  fpri
16b20 6e 74 66 28 66 70 2c 22 25 73 20 3a 3a 3d 22 2c  ntf(fp,"%s ::=",
16b30 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a  rp->lhs->name);.
16b40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 72 70    for(i=0; i<=rp
16b50 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
16b60 20 20 69 66 28 20 69 3d 3d 63 66 70 2d 3e 64 6f    if( i==cfp->do
16b70 74 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c 22  t ) fprintf(fp,"
16b80 20 2a 22 29 3b 0a 20 20 20 20 69 66 28 20 69 3d   *");.    if( i=
16b90 3d 72 70 2d 3e 6e 72 68 73 20 29 20 62 72 65 61  =rp->nrhs ) brea
16ba0 6b 3b 0a 20 20 20 20 73 70 20 3d 20 72 70 2d 3e  k;.    sp = rp->
16bb0 72 68 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  rhs[i];.    if( 
16bc0 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54  sp->type==MULTIT
16bd0 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
16be0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73   fprintf(fp," %s
16bf0 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d  ", sp->subsym[0]
16c00 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66  ->name);.      f
16c10 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73  or(j=1; j<sp->ns
16c20 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ubsym; j++){.   
16c30 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
16c40 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62 73 79 6d  "|%s",sp->subsym
16c50 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [j]->name);.    
16c60 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
16c70 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
16c80 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29  " %s", sp->name)
16c90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
16ca0 2a 20 23 64 65 66 69 6e 65 20 54 45 53 54 20 2a  * #define TEST *
16cb0 2f 0a 23 69 66 20 30 0a 2f 2a 20 50 72 69 6e 74  /.#if 0./* Print
16cc0 20 61 20 73 65 74 20 2a 2f 0a 50 52 49 56 41 54   a set */.PRIVAT
16cd0 45 20 76 6f 69 64 20 53 65 74 50 72 69 6e 74 28  E void SetPrint(
16ce0 6f 75 74 2c 73 65 74 2c 6c 65 6d 70 29 0a 46 49  out,set,lemp).FI
16cf0 4c 45 20 2a 6f 75 74 3b 0a 63 68 61 72 20 2a 73  LE *out;.char *s
16d00 65 74 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  et;.struct lemon
16d10 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20   *lemp;.{.  int 
16d20 69 3b 0a 20 20 63 68 61 72 20 2a 73 70 61 63 65  i;.  char *space
16d30 72 3b 0a 20 20 73 70 61 63 65 72 20 3d 20 22 22  r;.  spacer = ""
16d40 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
16d50 22 25 31 32 73 5b 22 2c 22 22 29 3b 0a 20 20 66  "%12s[","");.  f
16d60 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
16d70 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b  nterminal; i++){
16d80 0a 20 20 20 20 69 66 28 20 53 65 74 46 69 6e 64  .    if( SetFind
16d90 28 73 65 74 2c 69 29 20 29 7b 0a 20 20 20 20 20  (set,i) ){.     
16da0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73   fprintf(out,"%s
16db0 25 73 22 2c 73 70 61 63 65 72 2c 6c 65 6d 70 2d  %s",spacer,lemp-
16dc0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d  >symbols[i]->nam
16dd0 65 29 3b 0a 20 20 20 20 20 20 73 70 61 63 65 72  e);.      spacer
16de0 20 3d 20 22 20 22 3b 0a 20 20 20 20 7d 0a 20 20   = " ";.    }.  
16df0 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
16e00 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72  "]\n");.}../* Pr
16e10 69 6e 74 20 61 20 70 6c 69 6e 6b 20 63 68 61 69  int a plink chai
16e20 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  n */.PRIVATE voi
16e30 64 20 50 6c 69 6e 6b 50 72 69 6e 74 28 6f 75 74  d PlinkPrint(out
16e40 2c 70 6c 70 2c 74 61 67 29 0a 46 49 4c 45 20 2a  ,plp,tag).FILE *
16e50 6f 75 74 3b 0a 73 74 72 75 63 74 20 70 6c 69 6e  out;.struct plin
16e60 6b 20 2a 70 6c 70 3b 0a 63 68 61 72 20 2a 74 61  k *plp;.char *ta
16e70 67 3b 0a 7b 0a 20 20 77 68 69 6c 65 28 20 70 6c  g;.{.  while( pl
16e80 70 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  p ){.    fprintf
16e90 28 6f 75 74 2c 22 25 31 32 73 25 73 20 28 73 74  (out,"%12s%s (st
16ea0 61 74 65 20 25 32 64 29 20 22 2c 22 22 2c 74 61  ate %2d) ","",ta
16eb0 67 2c 70 6c 70 2d 3e 63 66 70 2d 3e 73 74 70 2d  g,plp->cfp->stp-
16ec0 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20  >statenum);.    
16ed0 43 6f 6e 66 69 67 50 72 69 6e 74 28 6f 75 74 2c  ConfigPrint(out,
16ee0 70 6c 70 2d 3e 63 66 70 29 3b 0a 20 20 20 20 66  plp->cfp);.    f
16ef0 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29  printf(out,"\n")
16f00 3b 0a 20 20 20 20 70 6c 70 20 3d 20 70 6c 70 2d  ;.    plp = plp-
16f10 3e 6e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  >next;.  }.}.#en
16f20 64 69 66 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 6e  dif../* Print an
16f30 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 67   action to the g
16f40 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
16f50 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 46 41  ptor.  Return FA
16f60 4c 53 45 20 69 66 0a 2a 2a 20 6e 6f 74 68 69 6e  LSE if.** nothin
16f70 67 20 77 61 73 20 61 63 74 75 61 6c 6c 79 20 70  g was actually p
16f80 72 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 50  rinted..*/.int P
16f90 72 69 6e 74 41 63 74 69 6f 6e 28 73 74 72 75 63  rintAction(struc
16fa0 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 46 49  t action *ap, FI
16fb0 4c 45 20 2a 66 70 2c 20 69 6e 74 20 69 6e 64 65  LE *fp, int inde
16fc0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 65 73 75 6c  nt){.  int resul
16fd0 74 20 3d 20 31 3b 0a 20 20 73 77 69 74 63 68 28  t = 1;.  switch(
16fe0 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20   ap->type ){.   
16ff0 20 63 61 73 65 20 53 48 49 46 54 3a 0a 20 20 20   case SHIFT:.   
17000 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
17010 2a 73 20 73 68 69 66 74 20 20 25 64 22 2c 69 6e  *s shift  %d",in
17020 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
17030 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61  e,ap->x.stp->sta
17040 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72  tenum);.      br
17050 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45  eak;.    case RE
17060 44 55 43 45 3a 0a 20 20 20 20 20 20 66 70 72 69  DUCE:.      fpri
17070 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75  ntf(fp,"%*s redu
17080 63 65 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70  ce %d",indent,ap
17090 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78  ->sp->name,ap->x
170a0 2e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  .rp->index);.   
170b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
170c0 73 65 20 41 43 43 45 50 54 3a 0a 20 20 20 20 20  se ACCEPT:.     
170d0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
170e0 20 61 63 63 65 70 74 22 2c 69 6e 64 65 6e 74 2c   accept",indent,
170f0 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  ap->sp->name);. 
17100 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17110 63 61 73 65 20 45 52 52 4f 52 3a 0a 20 20 20 20  case ERROR:.    
17120 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
17130 73 20 65 72 72 6f 72 22 2c 69 6e 64 65 6e 74 2c  s error",indent,
17140 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  ap->sp->name);. 
17150 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17160 63 61 73 65 20 53 52 43 4f 4e 46 4c 49 43 54 3a  case SRCONFLICT:
17170 0a 20 20 20 20 63 61 73 65 20 52 52 43 4f 4e 46  .    case RRCONF
17180 4c 49 43 54 3a 0a 20 20 20 20 20 20 66 70 72 69  LICT:.      fpri
17190 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75  ntf(fp,"%*s redu
171a0 63 65 20 25 2d 33 64 20 2a 2a 20 50 61 72 73 69  ce %-3d ** Parsi
171b0 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a 22 2c  ng conflict **",
171c0 0a 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74 2c  .        indent,
171d0 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d  ap->sp->name,ap-
171e0 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20  >x.rp->index);. 
171f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17200 63 61 73 65 20 53 53 43 4f 4e 46 4c 49 43 54 3a  case SSCONFLICT:
17210 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
17220 70 2c 22 25 2a 73 20 73 68 69 66 74 20 20 25 2d  p,"%*s shift  %-
17230 33 64 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f  3d ** Parsing co
17240 6e 66 6c 69 63 74 20 2a 2a 22 2c 20 0a 20 20 20  nflict **", .   
17250 20 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e       indent,ap->
17260 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73  sp->name,ap->x.s
17270 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20  tp->statenum);. 
17280 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17290 63 61 73 65 20 53 48 5f 52 45 53 4f 4c 56 45 44  case SH_RESOLVED
172a0 3a 0a 20 20 20 20 20 20 69 66 28 20 73 68 6f 77  :.      if( show
172b0 50 72 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69  PrecedenceConfli
172c0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  ct ){.        fp
172d0 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68  rintf(fp,"%*s sh
172e0 69 66 74 20 20 25 2d 33 64 20 2d 2d 20 64 72 6f  ift  %-3d -- dro
172f0 70 70 65 64 20 62 79 20 70 72 65 63 65 64 65 6e  pped by preceden
17300 63 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ce",.           
17310 20 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e       indent,ap->
17320 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73  sp->name,ap->x.s
17330 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20  tp->statenum);. 
17340 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17350 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a      result = 0;.
17360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
17370 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 44  eak;.    case RD
17380 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 20  _RESOLVED:.     
17390 20 69 66 28 20 73 68 6f 77 50 72 65 63 65 64 65   if( showPrecede
173a0 6e 63 65 43 6f 6e 66 6c 69 63 74 20 29 7b 0a 20  nceConflict ){. 
173b0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
173c0 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25 2d  p,"%*s reduce %-
173d0 33 64 20 2d 2d 20 64 72 6f 70 70 65 64 20 62 79  3d -- dropped by
173e0 20 70 72 65 63 65 64 65 6e 63 65 22 2c 0a 20 20   precedence",.  
173f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
17400 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
17410 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65  e,ap->x.rp->inde
17420 78 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  x);.      }else{
17430 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20  .        result 
17440 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
17450 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
17460 73 65 20 4e 4f 54 5f 55 53 45 44 3a 0a 20 20 20  se NOT_USED:.   
17470 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20     result = 0;. 
17480 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
17490 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b    return result;
174a0 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
174b0 74 68 65 20 22 79 2e 6f 75 74 70 75 74 22 20 6c  the "y.output" l
174c0 6f 67 20 66 69 6c 65 20 2a 2f 0a 76 6f 69 64 20  og file */.void 
174d0 52 65 70 6f 72 74 4f 75 74 70 75 74 28 73 74 72  ReportOutput(str
174e0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
174f0 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  .{.  int i;.  st
17500 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
17510 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
17520 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20   *cfp;.  struct 
17530 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 46 49  action *ap;.  FI
17540 4c 45 20 2a 66 70 3b 0a 0a 20 20 66 70 20 3d 20  LE *fp;..  fp = 
17550 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22  file_open(lemp,"
17560 2e 6f 75 74 22 2c 22 77 62 22 29 3b 0a 20 20 69  .out","wb");.  i
17570 66 28 20 66 70 3d 3d 30 20 29 20 72 65 74 75 72  f( fp==0 ) retur
17580 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
17590 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
175a0 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  +){.    stp = le
175b0 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
175c0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 53     fprintf(fp,"S
175d0 74 61 74 65 20 25 64 3a 5c 6e 22 2c 73 74 70 2d  tate %d:\n",stp-
175e0 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20  >statenum);.    
175f0 69 66 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66  if( lemp->basisf
17600 6c 61 67 20 29 20 63 66 70 3d 73 74 70 2d 3e 62  lag ) cfp=stp->b
17610 70 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20  p;.    else     
17620 20 20 20 20 20 20 20 20 20 20 20 20 20 63 66 70               cfp
17630 3d 73 74 70 2d 3e 63 66 70 3b 0a 20 20 20 20 77  =stp->cfp;.    w
17640 68 69 6c 65 28 20 63 66 70 20 29 7b 0a 20 20 20  hile( cfp ){.   
17650 20 20 20 63 68 61 72 20 62 75 66 5b 32 30 5d 3b     char buf[20];
17660 0a 20 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e  .      if( cfp->
17670 64 6f 74 3d 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72  dot==cfp->rp->nr
17680 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65  hs ){.        le
17690 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 62 75 66 2c  mon_sprintf(buf,
176a0 22 28 25 64 29 22 2c 63 66 70 2d 3e 72 70 2d 3e  "(%d)",cfp->rp->
176b0 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20  index);.        
176c0 66 70 72 69 6e 74 66 28 66 70 2c 22 20 20 20 20  fprintf(fp,"    
176d0 25 35 73 20 22 2c 62 75 66 29 3b 0a 20 20 20 20  %5s ",buf);.    
176e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
176f0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 20 20   fprintf(fp,"   
17700 20 20 20 20 20 20 20 22 29 3b 0a 20 20 20 20 20         ");.     
17710 20 7d 0a 20 20 20 20 20 20 43 6f 6e 66 69 67 50   }.      ConfigP
17720 72 69 6e 74 28 66 70 2c 63 66 70 29 3b 0a 20 20  rint(fp,cfp);.  
17730 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
17740 5c 6e 22 29 3b 0a 23 69 66 20 30 0a 20 20 20 20  \n");.#if 0.    
17750 20 20 53 65 74 50 72 69 6e 74 28 66 70 2c 63 66    SetPrint(fp,cf
17760 70 2d 3e 66 77 73 2c 6c 65 6d 70 29 3b 0a 20 20  p->fws,lemp);.  
17770 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66      PlinkPrint(f
17780 70 2c 63 66 70 2d 3e 66 70 6c 70 2c 22 54 6f 20  p,cfp->fplp,"To 
17790 20 22 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b   ");.      Plink
177a0 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 62 70  Print(fp,cfp->bp
177b0 6c 70 2c 22 46 72 6f 6d 22 29 3b 0a 23 65 6e 64  lp,"From");.#end
177c0 69 66 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6d  if.      if( lem
177d0 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29 20 63  p->basisflag ) c
177e0 66 70 3d 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20  fp=cfp->bp;.    
177f0 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
17800 20 20 20 20 20 20 20 20 63 66 70 3d 63 66 70 2d          cfp=cfp-
17810 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  >next;.    }.   
17820 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22   fprintf(fp,"\n"
17830 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74  );.    for(ap=st
17840 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
17850 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
17860 66 28 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 61  f( PrintAction(a
17870 70 2c 66 70 2c 33 30 29 20 29 20 66 70 72 69 6e  p,fp,30) ) fprin
17880 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20  tf(fp,"\n");.   
17890 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66   }.    fprintf(f
178a0 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66  p,"\n");.  }.  f
178b0 70 72 69 6e 74 66 28 66 70 2c 20 22 2d 2d 2d 2d  printf(fp, "----
178c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
178d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
178e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
178f0 5c 6e 22 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  \n");.  fprintf(
17900 66 70 2c 20 22 53 79 6d 62 6f 6c 73 3a 5c 6e 22  fp, "Symbols:\n"
17910 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
17920 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
17930 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  ++){.    int j;.
17940 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
17950 6c 20 2a 73 70 3b 0a 0a 20 20 20 20 73 70 20 3d  l *sp;..    sp =
17960 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
17970 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66  ];.    fprintf(f
17980 70 2c 20 22 20 20 25 33 64 3a 20 25 73 22 2c 20  p, "  %3d: %s", 
17990 69 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  i, sp->name);.  
179a0 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
179b0 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  NONTERMINAL ){. 
179c0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
179d0 20 22 3a 22 29 3b 0a 20 20 20 20 20 20 69 66 28   ":");.      if(
179e0 20 73 70 2d 3e 6c 61 6d 62 64 61 20 29 7b 0a 20   sp->lambda ){. 
179f0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
17a00 70 2c 20 22 20 3c 6c 61 6d 62 64 61 3e 22 29 3b  p, " <lambda>");
17a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
17a20 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e  or(j=0; j<lemp->
17a30 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b  nterminal; j++){
17a40 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d  .        if( sp-
17a50 3e 66 69 72 73 74 73 65 74 20 26 26 20 53 65 74  >firstset && Set
17a60 46 69 6e 64 28 73 70 2d 3e 66 69 72 73 74 73 65  Find(sp->firstse
17a70 74 2c 20 6a 29 20 29 7b 0a 20 20 20 20 20 20 20  t, j) ){.       
17a80 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22     fprintf(fp, "
17a90 20 25 73 22 2c 20 6c 65 6d 70 2d 3e 73 79 6d 62   %s", lemp->symb
17aa0 6f 6c 73 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  ols[j]->name);. 
17ab0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17ac0 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
17ad0 74 66 28 66 70 2c 20 22 5c 6e 22 29 3b 0a 20 20  tf(fp, "\n");.  
17ae0 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a  }.  fclose(fp);.
17af0 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
17b00 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 66  Search for the f
17b10 69 6c 65 20 22 6e 61 6d 65 22 20 77 68 69 63 68  ile "name" which
17b20 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20   is in the same 
17b30 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20  directory as.** 
17b40 74 68 65 20 65 78 61 63 75 74 61 62 6c 65 20 2a  the exacutable *
17b50 2f 0a 50 52 49 56 41 54 45 20 63 68 61 72 20 2a  /.PRIVATE char *
17b60 70 61 74 68 73 65 61 72 63 68 28 63 68 61 72 20  pathsearch(char 
17b70 2a 61 72 67 76 30 2c 20 63 68 61 72 20 2a 6e 61  *argv0, char *na
17b80 6d 65 2c 20 69 6e 74 20 6d 6f 64 65 6d 61 73 6b  me, int modemask
17b90 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ).{.  const char
17ba0 20 2a 70 61 74 68 6c 69 73 74 3b 0a 20 20 63 68   *pathlist;.  ch
17bb0 61 72 20 2a 70 61 74 68 62 75 66 70 74 72 3b 0a  ar *pathbufptr;.
17bc0 20 20 63 68 61 72 20 2a 70 61 74 68 62 75 66 3b    char *pathbuf;
17bd0 0a 20 20 63 68 61 72 20 2a 70 61 74 68 2c 2a 63  .  char *path,*c
17be0 70 3b 0a 20 20 63 68 61 72 20 63 3b 0a 0a 23 69  p;.  char c;..#i
17bf0 66 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20  fdef __WIN32__. 
17c00 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 61 72   cp = strrchr(ar
17c10 67 76 30 2c 27 5c 5c 27 29 3b 0a 23 65 6c 73 65  gv0,'\\');.#else
17c20 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72 28  .  cp = strrchr(
17c30 61 72 67 76 30 2c 27 2f 27 29 3b 0a 23 65 6e 64  argv0,'/');.#end
17c40 69 66 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20  if.  if( cp ){. 
17c50 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20     c = *cp;.    
17c60 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 70 61 74  *cp = 0;.    pat
17c70 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c  h = (char *)mall
17c80 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
17c90 61 72 67 76 30 29 20 2b 20 6c 65 6d 6f 6e 53 74  argv0) + lemonSt
17ca0 72 6c 65 6e 28 6e 61 6d 65 29 20 2b 20 32 20 29  rlen(name) + 2 )
17cb0 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68 20 29  ;.    if( path )
17cc0 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 70   lemon_sprintf(p
17cd0 61 74 68 2c 22 25 73 2f 25 73 22 2c 61 72 67 76  ath,"%s/%s",argv
17ce0 30 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 2a 63 70  0,name);.    *cp
17cf0 20 3d 20 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = c;.  }else{. 
17d00 20 20 20 70 61 74 68 6c 69 73 74 20 3d 20 67 65     pathlist = ge
17d10 74 65 6e 76 28 22 50 41 54 48 22 29 3b 0a 20 20  tenv("PATH");.  
17d20 20 20 69 66 28 20 70 61 74 68 6c 69 73 74 3d 3d    if( pathlist==
17d30 30 20 29 20 70 61 74 68 6c 69 73 74 20 3d 20 22  0 ) pathlist = "
17d40 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22  .:/bin:/usr/bin"
17d50 3b 0a 20 20 20 20 70 61 74 68 62 75 66 20 3d 20  ;.    pathbuf = 
17d60 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28  (char *) malloc(
17d70 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74   lemonStrlen(pat
17d80 68 6c 69 73 74 29 20 2b 20 31 20 29 3b 0a 20 20  hlist) + 1 );.  
17d90 20 20 70 61 74 68 20 3d 20 28 63 68 61 72 20 2a    path = (char *
17da0 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74  )malloc( lemonSt
17db0 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 2b 6c  rlen(pathlist)+l
17dc0 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29  emonStrlen(name)
17dd0 2b 32 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  +2 );.    if( (p
17de0 61 74 68 62 75 66 20 21 3d 20 30 29 20 26 26 20  athbuf != 0) && 
17df0 28 70 61 74 68 21 3d 30 29 20 29 7b 0a 20 20 20  (path!=0) ){.   
17e00 20 20 20 70 61 74 68 62 75 66 70 74 72 20 3d 20     pathbufptr = 
17e10 70 61 74 68 62 75 66 3b 0a 20 20 20 20 20 20 6c  pathbuf;.      l
17e20 65 6d 6f 6e 5f 73 74 72 63 70 79 28 70 61 74 68  emon_strcpy(path
17e30 62 75 66 2c 20 70 61 74 68 6c 69 73 74 29 3b 0a  buf, pathlist);.
17e40 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 70 61        while( *pa
17e50 74 68 62 75 66 20 29 7b 0a 20 20 20 20 20 20 20  thbuf ){.       
17e60 20 63 70 20 3d 20 73 74 72 63 68 72 28 70 61 74   cp = strchr(pat
17e70 68 62 75 66 2c 27 3a 27 29 3b 0a 20 20 20 20 20  hbuf,':');.     
17e80 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63     if( cp==0 ) c
17e90 70 20 3d 20 26 70 61 74 68 62 75 66 5b 6c 65 6d  p = &pathbuf[lem
17ea0 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68 62 75 66  onStrlen(pathbuf
17eb0 29 5d 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20  )];.        c = 
17ec0 2a 63 70 3b 0a 20 20 20 20 20 20 20 20 2a 63 70  *cp;.        *cp
17ed0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6c 65   = 0;.        le
17ee0 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 70 61 74 68  mon_sprintf(path
17ef0 2c 22 25 73 2f 25 73 22 2c 70 61 74 68 62 75 66  ,"%s/%s",pathbuf
17f00 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ,name);.        
17f10 2a 63 70 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  *cp = c;.       
17f20 20 69 66 28 20 63 3d 3d 30 20 29 20 70 61 74 68   if( c==0 ) path
17f30 62 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  buf[0] = 0;.    
17f40 20 20 20 20 65 6c 73 65 20 70 61 74 68 62 75 66      else pathbuf
17f50 20 3d 20 26 63 70 5b 31 5d 3b 0a 20 20 20 20 20   = &cp[1];.     
17f60 20 20 20 69 66 28 20 61 63 63 65 73 73 28 70 61     if( access(pa
17f70 74 68 2c 6d 6f 64 65 6d 61 73 6b 29 3d 3d 30 20  th,modemask)==0 
17f80 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
17f90 0a 20 20 20 20 20 20 66 72 65 65 28 70 61 74 68  .      free(path
17fa0 62 75 66 70 74 72 29 3b 0a 20 20 20 20 7d 0a 20  bufptr);.    }. 
17fb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 61 74 68   }.  return path
17fc0 3b 0a 7d 0a 0a 2f 2a 20 47 69 76 65 6e 20 61 6e  ;.}../* Given an
17fd0 20 61 63 74 69 6f 6e 2c 20 63 6f 6d 70 75 74 65   action, compute
17fe0 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
17ff0 75 65 20 66 6f 72 20 74 68 61 74 20 61 63 74 69  ue for that acti
18000 6f 6e 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 74  on.** which is t
18010 6f 20 62 65 20 70 75 74 20 69 6e 20 74 68 65 20  o be put in the 
18020 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20  action table of 
18030 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 6d 61  the generated ma
18040 63 68 69 6e 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  chine..** Return
18050 20 6e 65 67 61 74 69 76 65 20 69 66 20 6e 6f 20   negative if no 
18060 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  action should be
18070 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 50   generated..*/.P
18080 52 49 56 41 54 45 20 69 6e 74 20 63 6f 6d 70 75  RIVATE int compu
18090 74 65 5f 61 63 74 69 6f 6e 28 73 74 72 75 63 74  te_action(struct
180a0 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74   lemon *lemp, st
180b0 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 29  ruct action *ap)
180c0 0a 7b 0a 20 20 69 6e 74 20 61 63 74 3b 0a 20 20  .{.  int act;.  
180d0 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65  switch( ap->type
180e0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49   ){.    case SHI
180f0 46 54 3a 20 20 61 63 74 20 3d 20 61 70 2d 3e 78  FT:  act = ap->x
18100 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 3b 20  .stp->statenum; 
18110 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
18120 3b 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43  ;.    case REDUC
18130 45 3a 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 72  E: act = ap->x.r
18140 70 2d 3e 69 6e 64 65 78 20 2b 20 6c 65 6d 70 2d  p->index + lemp-
18150 3e 6e 73 74 61 74 65 3b 20 62 72 65 61 6b 3b 0a  >nstate; break;.
18160 20 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a 20      case ERROR: 
18170 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74   act = lemp->nst
18180 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c  ate + lemp->nrul
18190 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e;     break;.  
181a0 20 20 63 61 73 65 20 41 43 43 45 50 54 3a 20 61    case ACCEPT: a
181b0 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  ct = lemp->nstat
181c0 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20  e + lemp->nrule 
181d0 2b 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  + 1; break;.    
181e0 64 65 66 61 75 6c 74 3a 20 20 20 20 20 61 63 74  default:     act
181f0 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20 20   = -1; break;.  
18200 7d 0a 20 20 72 65 74 75 72 6e 20 61 63 74 3b 0a  }.  return act;.
18210 7d 0a 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 53  }..#define LINES
18220 49 5a 45 20 31 30 30 30 0a 2f 2a 20 54 68 65 20  IZE 1000./* The 
18230 6e 65 78 74 20 63 6c 75 73 74 65 72 20 6f 66 20  next cluster of 
18240 72 6f 75 74 69 6e 65 73 20 61 72 65 20 66 6f 72  routines are for
18250 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 65 6d   reading the tem
18260 70 6c 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61 6e  plate file.** an
18270 64 20 77 72 69 74 69 6e 67 20 74 68 65 20 72 65  d writing the re
18280 73 75 6c 74 73 20 74 6f 20 74 68 65 20 67 65 6e  sults to the gen
18290 65 72 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f  erated parser */
182a0 0a 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 75  ./* The first fu
182b0 6e 63 74 69 6f 6e 20 74 72 61 6e 73 66 65 72 73  nction transfers
182c0 20 64 61 74 61 20 66 72 6f 6d 20 22 69 6e 22 20   data from "in" 
182d0 74 6f 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a 2a  to "out" until.*
182e0 2a 20 61 20 6c 69 6e 65 20 69 73 20 73 65 65 6e  * a line is seen
182f0 20 77 68 69 63 68 20 62 65 67 69 6e 73 20 77 69   which begins wi
18300 74 68 20 22 25 25 22 2e 20 20 54 68 65 20 6c 69  th "%%".  The li
18310 6e 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  ne number is.** 
18320 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69  tracked..**.** i
18330 66 20 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e 20  f name!=0, then 
18340 61 6e 79 20 77 6f 72 64 20 74 68 61 74 20 62 65  any word that be
18350 67 69 6e 20 77 69 74 68 20 22 50 61 72 73 65 22  gin with "Parse"
18360 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 2a   is changed to.*
18370 2a 20 62 65 67 69 6e 20 77 69 74 68 20 2a 6e 61  * begin with *na
18380 6d 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50  me instead..*/.P
18390 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74  RIVATE void tplt
183a0 5f 78 66 65 72 28 63 68 61 72 20 2a 6e 61 6d 65  _xfer(char *name
183b0 2c 20 46 49 4c 45 20 2a 69 6e 2c 20 46 49 4c 45  , FILE *in, FILE
183c0 20 2a 6f 75 74 2c 20 69 6e 74 20 2a 6c 69 6e 65   *out, int *line
183d0 6e 6f 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 69  no).{.  int i, i
183e0 53 74 61 72 74 3b 0a 20 20 63 68 61 72 20 6c 69  Start;.  char li
183f0 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20  ne[LINESIZE];.  
18400 77 68 69 6c 65 28 20 66 67 65 74 73 28 6c 69 6e  while( fgets(lin
18410 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 20 26  e,LINESIZE,in) &
18420 26 20 28 6c 69 6e 65 5b 30 5d 21 3d 27 25 27 20  & (line[0]!='%' 
18430 7c 7c 20 6c 69 6e 65 5b 31 5d 21 3d 27 25 27 29  || line[1]!='%')
18440 20 29 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f   ){.    (*lineno
18450 29 2b 2b 3b 0a 20 20 20 20 69 53 74 61 72 74 20  )++;.    iStart 
18460 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 61 6d  = 0;.    if( nam
18470 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  e ){.      for(i
18480 3d 30 3b 20 6c 69 6e 65 5b 69 5d 3b 20 69 2b 2b  =0; line[i]; i++
18490 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  ){.        if( l
184a0 69 6e 65 5b 69 5d 3d 3d 27 50 27 20 26 26 20 73  ine[i]=='P' && s
184b0 74 72 6e 63 6d 70 28 26 6c 69 6e 65 5b 69 5d 2c  trncmp(&line[i],
184c0 22 50 61 72 73 65 22 2c 35 29 3d 3d 30 0a 20 20  "Parse",5)==0.  
184d0 20 20 20 20 20 20 20 20 26 26 20 28 69 3d 3d 30          && (i==0
184e0 20 7c 7c 20 21 69 73 61 6c 70 68 61 28 6c 69 6e   || !isalpha(lin
184f0 65 5b 69 2d 31 5d 29 29 0a 20 20 20 20 20 20 20  e[i-1])).       
18500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
18510 28 20 69 3e 69 53 74 61 72 74 20 29 20 66 70 72  ( i>iStart ) fpr
18520 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c  intf(out,"%.*s",
18530 69 2d 69 53 74 61 72 74 2c 26 6c 69 6e 65 5b 69  i-iStart,&line[i
18540 53 74 61 72 74 5d 29 3b 0a 20 20 20 20 20 20 20  Start]);.       
18550 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
18560 25 73 22 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  %s",name);.     
18570 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20       i += 4;.   
18580 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
18590 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i+1;.        }. 
185a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
185b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73   fprintf(out,"%s
185c0 22 2c 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29  ",&line[iStart])
185d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 54 68 65 20  ;.  }.}../* The 
185e0 6e 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 66 69  next function fi
185f0 6e 64 73 20 74 68 65 20 74 65 6d 70 6c 61 74 65  nds the template
18600 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 73 20   file and opens 
18610 69 74 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a  it, returning.**
18620 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
18630 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 2e 20 2a  e opened file. *
18640 2f 0a 50 52 49 56 41 54 45 20 46 49 4c 45 20 2a  /.PRIVATE FILE *
18650 74 70 6c 74 5f 6f 70 65 6e 28 73 74 72 75 63 74  tplt_open(struct
18660 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a   lemon *lemp).{.
18670 20 20 73 74 61 74 69 63 20 63 68 61 72 20 74 65    static char te
18680 6d 70 6c 61 74 65 6e 61 6d 65 5b 5d 20 3d 20 22  mplatename[] = "
18690 6c 65 6d 70 61 72 2e 63 22 3b 0a 20 20 63 68 61  lempar.c";.  cha
186a0 72 20 62 75 66 5b 31 30 30 30 5d 3b 0a 20 20 46  r buf[1000];.  F
186b0 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20  ILE *in;.  char 
186c0 2a 74 70 6c 74 6e 61 6d 65 3b 0a 20 20 63 68 61  *tpltname;.  cha
186d0 72 20 2a 63 70 3b 0a 0a 20 20 2f 2a 20 66 69 72  r *cp;..  /* fir
186e0 73 74 2c 20 73 65 65 20 69 66 20 75 73 65 72 20  st, see if user 
186f0 73 70 65 63 69 66 69 65 64 20 61 20 74 65 6d 70  specified a temp
18700 6c 61 74 65 20 66 69 6c 65 6e 61 6d 65 20 6f 6e  late filename on
18710 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
18720 65 2e 20 2a 2f 0a 20 20 69 66 20 28 75 73 65 72  e. */.  if (user
18730 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20 21 3d  _templatename !=
18740 20 30 29 20 7b 0a 20 20 20 20 69 66 28 20 61 63   0) {.    if( ac
18750 63 65 73 73 28 75 73 65 72 5f 74 65 6d 70 6c 61  cess(user_templa
18760 74 65 6e 61 6d 65 2c 30 30 34 29 3d 3d 2d 31 20  tename,004)==-1 
18770 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
18780 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66  (stderr,"Can't f
18790 69 6e 64 20 74 68 65 20 70 61 72 73 65 72 20 64  ind the parser d
187a0 72 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66  river template f
187b0 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a  ile \"%s\".\n",.
187c0 20 20 20 20 20 20 20 20 75 73 65 72 5f 74 65 6d          user_tem
187d0 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20  platename);.    
187e0 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
187f0 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
18800 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e   0;.    }.    in
18810 20 3d 20 66 6f 70 65 6e 28 75 73 65 72 5f 74 65   = fopen(user_te
18820 6d 70 6c 61 74 65 6e 61 6d 65 2c 22 72 62 22 29  mplatename,"rb")
18830 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20  ;.    if( in==0 
18840 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
18850 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f  (stderr,"Can't o
18860 70 65 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65  pen the template
18870 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22   file \"%s\".\n"
18880 2c 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61  ,user_templatena
18890 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d  me);.      lemp-
188a0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
188b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
188c0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69 6e   }.    return in
188d0 3b 0a 20 20 7d 0a 0a 20 20 63 70 20 3d 20 73 74  ;.  }..  cp = st
188e0 72 72 63 68 72 28 6c 65 6d 70 2d 3e 66 69 6c 65  rrchr(lemp->file
188f0 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28  name,'.');.  if(
18900 20 63 70 20 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e   cp ){.    lemon
18910 5f 73 70 72 69 6e 74 66 28 62 75 66 2c 22 25 2e  _sprintf(buf,"%.
18920 2a 73 2e 6c 74 22 2c 28 69 6e 74 29 28 63 70 2d  *s.lt",(int)(cp-
18930 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 2c  lemp->filename),
18940 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
18950 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 65  .  }else{.    le
18960 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 62 75 66 2c  mon_sprintf(buf,
18970 22 25 73 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69  "%s.lt",lemp->fi
18980 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69  lename);.  }.  i
18990 66 28 20 61 63 63 65 73 73 28 62 75 66 2c 30 30  f( access(buf,00
189a0 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c  4)==0 ){.    tpl
189b0 74 6e 61 6d 65 20 3d 20 62 75 66 3b 0a 20 20 7d  tname = buf;.  }
189c0 65 6c 73 65 20 69 66 28 20 61 63 63 65 73 73 28  else if( access(
189d0 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34  templatename,004
189e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74  )==0 ){.    tplt
189f0 6e 61 6d 65 20 3d 20 74 65 6d 70 6c 61 74 65 6e  name = templaten
18a00 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
18a10 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 70 61 74    tpltname = pat
18a20 68 73 65 61 72 63 68 28 6c 65 6d 70 2d 3e 61 72  hsearch(lemp->ar
18a30 67 76 30 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65  gv0,templatename
18a40 2c 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  ,0);.  }.  if( t
18a50 70 6c 74 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  pltname==0 ){.  
18a60 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
18a70 2c 22 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65  ,"Can't find the
18a80 20 70 61 72 73 65 72 20 64 72 69 76 65 72 20 74   parser driver t
18a90 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25  emplate file \"%
18aa0 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 74 65 6d  s\".\n",.    tem
18ab0 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20  platename);.    
18ac0 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
18ad0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
18ae0 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e    }.  in = fopen
18af0 28 74 70 6c 74 6e 61 6d 65 2c 22 72 62 22 29 3b  (tpltname,"rb");
18b00 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a  .  if( in==0 ){.
18b10 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
18b20 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74  rr,"Can't open t
18b30 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
18b40 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70   \"%s\".\n",temp
18b50 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c  latename);.    l
18b60 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
18b70 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
18b80 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a   }.  return in;.
18b90 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 23 6c  }../* Print a #l
18ba0 69 6e 65 20 64 69 72 65 63 74 69 76 65 20 6c 69  ine directive li
18bb0 6e 65 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ne to the output
18bc0 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54   file. */.PRIVAT
18bd0 45 20 76 6f 69 64 20 74 70 6c 74 5f 6c 69 6e 65  E void tplt_line
18be0 64 69 72 28 46 49 4c 45 20 2a 6f 75 74 2c 20 69  dir(FILE *out, i
18bf0 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 68 61 72 20  nt lineno, char 
18c00 2a 66 69 6c 65 6e 61 6d 65 29 0a 7b 0a 20 20 66  *filename).{.  f
18c10 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e  printf(out,"#lin
18c20 65 20 25 64 20 5c 22 22 2c 6c 69 6e 65 6e 6f 29  e %d \"",lineno)
18c30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 66 69 6c 65  ;.  while( *file
18c40 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69 66 28 20  name ){.    if( 
18c50 2a 66 69 6c 65 6e 61 6d 65 20 3d 3d 20 27 5c 5c  *filename == '\\
18c60 27 20 29 20 70 75 74 63 28 27 5c 5c 27 2c 6f 75  ' ) putc('\\',ou
18c70 74 29 3b 0a 20 20 20 20 70 75 74 63 28 2a 66 69  t);.    putc(*fi
18c80 6c 65 6e 61 6d 65 2c 6f 75 74 29 3b 0a 20 20 20  lename,out);.   
18c90 20 66 69 6c 65 6e 61 6d 65 2b 2b 3b 0a 20 20 7d   filename++;.  }
18ca0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
18cb0 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72  \"\n");.}../* Pr
18cc0 69 6e 74 20 61 20 73 74 72 69 6e 67 20 74 6f 20  int a string to 
18cd0 74 68 65 20 66 69 6c 65 20 61 6e 64 20 6b 65 65  the file and kee
18ce0 70 20 74 68 65 20 6c 69 6e 65 6e 75 6d 62 65 72  p the linenumber
18cf0 20 75 70 20 74 6f 20 64 61 74 65 20 2a 2f 0a 50   up to date */.P
18d00 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74  RIVATE void tplt
18d10 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a 6f 75 74  _print(FILE *out
18d20 2c 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  , struct lemon *
18d30 6c 65 6d 70 2c 20 63 68 61 72 20 2a 73 74 72 2c  lemp, char *str,
18d40 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a   int *lineno).{.
18d50 20 20 69 66 28 20 73 74 72 3d 3d 30 20 29 20 72    if( str==0 ) r
18d60 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20  eturn;.  while( 
18d70 2a 73 74 72 20 29 7b 0a 20 20 20 20 70 75 74 63  *str ){.    putc
18d80 28 2a 73 74 72 2c 6f 75 74 29 3b 0a 20 20 20 20  (*str,out);.    
18d90 69 66 28 20 2a 73 74 72 3d 3d 27 5c 6e 27 20 29  if( *str=='\n' )
18da0 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
18db0 20 20 73 74 72 2b 2b 3b 0a 20 20 7d 0a 20 20 69    str++;.  }.  i
18dc0 66 28 20 73 74 72 5b 2d 31 5d 21 3d 27 5c 6e 27  f( str[-1]!='\n'
18dd0 20 29 7b 0a 20 20 20 20 70 75 74 63 28 27 5c 6e   ){.    putc('\n
18de0 27 2c 6f 75 74 29 3b 0a 20 20 20 20 28 2a 6c 69  ',out);.    (*li
18df0 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 7d 0a 20 20 69  neno)++;.  }.  i
18e00 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65  f (!lemp->noline
18e10 6e 6f 73 66 6c 61 67 29 20 7b 0a 20 20 20 20 28  nosflag) {.    (
18e20 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74  *lineno)++; tplt
18e30 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69  _linedir(out,*li
18e40 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  neno,lemp->outna
18e50 6d 65 29 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  me); .  }.  retu
18e60 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rn;.}../*.** The
18e70 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
18e80 6e 65 20 65 6d 69 74 73 20 63 6f 64 65 20 66 6f  ne emits code fo
18e90 72 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  r the destructor
18ea0 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 79 6d 62   for the.** symb
18eb0 6f 6c 20 73 70 0a 2a 2f 0a 76 6f 69 64 20 65 6d  ol sp.*/.void em
18ec0 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
18ed0 64 65 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c  de(.  FILE *out,
18ee0 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
18ef0 20 2a 73 70 2c 0a 20 20 73 74 72 75 63 74 20 6c   *sp,.  struct l
18f00 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e  emon *lemp,.  in
18f10 74 20 2a 6c 69 6e 65 6e 6f 0a 29 7b 0a 20 63 68  t *lineno.){. ch
18f20 61 72 20 2a 63 70 20 3d 20 30 3b 0a 0a 20 69 66  ar *cp = 0;.. if
18f30 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d  ( sp->type==TERM
18f40 49 4e 41 4c 20 29 7b 0a 20 20 20 63 70 20 3d 20  INAL ){.   cp = 
18f50 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b  lemp->tokendest;
18f60 0a 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20  .   if( cp==0 ) 
18f70 72 65 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e  return;.   fprin
18f80 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28  tf(out,"{\n"); (
18f90 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c  *lineno)++;. }el
18fa0 73 65 20 69 66 28 20 73 70 2d 3e 64 65 73 74 72  se if( sp->destr
18fb0 75 63 74 6f 72 20 29 7b 0a 20 20 20 63 70 20 3d  uctor ){.   cp =
18fc0 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b   sp->destructor;
18fd0 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
18fe0 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f  "{\n"); (*lineno
18ff0 29 2b 2b 3b 0a 20 20 20 69 66 20 28 21 6c 65 6d  )++;.   if (!lem
19000 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
19010 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ) { (*lineno)++;
19020 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75   tplt_linedir(ou
19030 74 2c 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f  t,sp->destLineno
19040 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
19050 3b 20 7d 0a 20 7d 65 6c 73 65 20 69 66 28 20 6c  ; }. }else if( l
19060 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a  emp->vardest ){.
19070 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61     cp = lemp->va
19080 72 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70  rdest;.   if( cp
19090 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
190a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c   fprintf(out,"{\
190b0 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n"); (*lineno)++
190c0 3b 0a 20 7d 65 6c 73 65 7b 0a 20 20 20 61 73 73  ;. }else{.   ass
190d0 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61  ert( 0 );  /* Ca
190e0 6e 6e 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20  nnot happen */. 
190f0 7d 0a 20 66 6f 72 28 3b 20 2a 63 70 3b 20 63 70  }. for(; *cp; cp
19100 2b 2b 29 7b 0a 20 20 20 69 66 28 20 2a 63 70 3d  ++){.   if( *cp=
19110 3d 27 24 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='$' && cp[1]=='
19120 24 27 20 29 7b 0a 20 20 20 20 20 66 70 72 69 6e  $' ){.     fprin
19130 74 66 28 6f 75 74 2c 22 28 79 79 70 6d 69 6e 6f  tf(out,"(yypmino
19140 72 2d 3e 79 79 25 64 29 22 2c 73 70 2d 3e 64 74  r->yy%d)",sp->dt
19150 6e 75 6d 29 3b 0a 20 20 20 20 20 63 70 2b 2b 3b  num);.     cp++;
19160 0a 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a  .     continue;.
19170 20 20 20 7d 0a 20 20 20 69 66 28 20 2a 63 70 3d     }.   if( *cp=
19180 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f  ='\n' ) (*lineno
19190 29 2b 2b 3b 0a 20 20 20 66 70 75 74 63 28 2a 63  )++;.   fputc(*c
191a0 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20 66 70 72 69  p,out);. }. fpri
191b0 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 28  ntf(out,"\n"); (
191c0 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 69 66 20  *lineno)++;. if 
191d0 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f  (!lemp->nolineno
191e0 73 66 6c 61 67 29 20 7b 20 0a 20 20 20 28 2a 6c  sflag) { .   (*l
191f0 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c  ineno)++; tplt_l
19200 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65  inedir(out,*line
19210 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  no,lemp->outname
19220 29 3b 20 0a 20 7d 0a 20 66 70 72 69 6e 74 66 28  ); . }. fprintf(
19230 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69  out,"}\n"); (*li
19240 6e 65 6e 6f 29 2b 2b 3b 0a 20 72 65 74 75 72 6e  neno)++;. return
19250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19260 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f  n TRUE (non-zero
19270 29 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  ) if the given s
19280 79 6d 62 6f 6c 20 68 61 73 20 61 20 64 65 73 74  ymbol has a dest
19290 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 68  ructor..*/.int h
192a0 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28 73 74  as_destructor(st
192b0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c  ruct symbol *sp,
192c0 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c   struct lemon *l
192d0 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 72 65 74  emp).{.  int ret
192e0 3b 0a 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65  ;.  if( sp->type
192f0 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  ==TERMINAL ){.  
19300 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 74 6f    ret = lemp->to
19310 6b 65 6e 64 65 73 74 21 3d 30 3b 0a 20 20 7d 65  kendest!=0;.  }e
19320 6c 73 65 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c  lse{.    ret = l
19330 65 6d 70 2d 3e 76 61 72 64 65 73 74 21 3d 30 20  emp->vardest!=0 
19340 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  || sp->destructo
19350 72 21 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  r!=0;.  }.  retu
19360 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
19370 20 41 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20   Append text to 
19380 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
19390 6c 6f 63 61 74 65 64 20 73 74 72 69 6e 67 2e 20  located string. 
193a0 20 49 66 20 7a 54 65 78 74 20 69 73 20 30 20 74   If zText is 0 t
193b0 68 65 6e 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  hen.** reset the
193c0 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20 65 6d   string to be em
193d0 70 74 79 20 61 67 61 69 6e 2e 20 20 41 6c 77 61  pty again.  Alwa
193e0 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f  ys return the co
193f0 6d 70 6c 65 74 65 20 74 65 78 74 0a 2a 2a 20 6f  mplete text.** o
19400 66 20 74 68 65 20 73 74 72 69 6e 67 20 28 77 68  f the string (wh
19410 69 63 68 20 69 73 20 6f 76 65 72 77 72 69 74 74  ich is overwritt
19420 65 6e 20 77 69 74 68 20 65 61 63 68 20 63 61 6c  en with each cal
19430 6c 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62 79 74 65  l)..**.** n byte
19440 73 20 6f 66 20 7a 54 65 78 74 20 61 72 65 20 73  s of zText are s
19450 74 6f 72 65 64 2e 20 20 49 66 20 6e 3d 3d 30 20  tored.  If n==0 
19460 74 68 65 6e 20 61 6c 6c 20 6f 66 20 7a 54 65 78  then all of zTex
19470 74 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  t up to the firs
19480 74 0a 2a 2a 20 5c 30 30 30 20 74 65 72 6d 69 6e  t.** \000 termin
19490 61 74 6f 72 20 69 73 20 73 74 6f 72 65 64 2e 20  ator is stored. 
194a0 20 7a 54 65 78 74 20 63 61 6e 20 63 6f 6e 74 61   zText can conta
194b0 69 6e 20 75 70 20 74 6f 20 74 77 6f 20 69 6e 73  in up to two ins
194c0 74 61 6e 63 65 73 20 6f 66 0a 2a 2a 20 25 64 2e  tances of.** %d.
194d0 20 20 54 68 65 20 76 61 6c 75 65 73 20 6f 66 20    The values of 
194e0 70 31 20 61 6e 64 20 70 32 20 61 72 65 20 77 72  p1 and p2 are wr
194f0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 66  itten into the f
19500 69 72 73 74 20 61 6e 64 20 73 65 63 6f 6e 64 0a  irst and second.
19510 2a 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ** %d..**.** If 
19520 6e 3d 3d 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  n==-1, then the 
19530 70 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74  previous charact
19540 65 72 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  er is overwritte
19550 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63 68  n..*/.PRIVATE ch
19560 61 72 20 2a 61 70 70 65 6e 64 5f 73 74 72 28 63  ar *append_str(c
19570 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
19580 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 70 31 2c  , int n, int p1,
19590 20 69 6e 74 20 70 32 29 7b 0a 20 20 73 74 61 74   int p2){.  stat
195a0 69 63 20 63 68 61 72 20 65 6d 70 74 79 5b 31 5d  ic char empty[1]
195b0 20 3d 20 7b 20 30 20 7d 3b 0a 20 20 73 74 61 74   = { 0 };.  stat
195c0 69 63 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a  ic char *z = 0;.
195d0 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c    static int all
195e0 6f 63 65 64 20 3d 20 30 3b 0a 20 20 73 74 61 74  oced = 0;.  stat
195f0 69 63 20 69 6e 74 20 75 73 65 64 20 3d 20 30 3b  ic int used = 0;
19600 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68 61 72  .  int c;.  char
19610 20 7a 49 6e 74 5b 34 30 5d 3b 0a 20 20 69 66 28   zInt[40];.  if(
19620 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20   zText==0 ){.   
19630 20 75 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 72   used = 0;.    r
19640 65 74 75 72 6e 20 7a 3b 0a 20 20 7d 0a 20 20 69  eturn z;.  }.  i
19650 66 28 20 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 69  f( n<=0 ){.    i
19660 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( n<0 ){.      
19670 75 73 65 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  used += n;.     
19680 20 61 73 73 65 72 74 28 20 75 73 65 64 3e 3d 30   assert( used>=0
19690 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   );.    }.    n 
196a0 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 54  = lemonStrlen(zT
196b0 65 78 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ext);.  }.  if( 
196c0 28 69 6e 74 29 20 28 6e 2b 73 69 7a 65 6f 66 28  (int) (n+sizeof(
196d0 7a 49 6e 74 29 2a 32 2b 75 73 65 64 29 20 3e 3d  zInt)*2+used) >=
196e0 20 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20   alloced ){.    
196f0 61 6c 6c 6f 63 65 64 20 3d 20 6e 20 2b 20 73 69  alloced = n + si
19700 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 20 2b 20 75  zeof(zInt)*2 + u
19710 73 65 64 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a  sed + 200;.    z
19720 20 3d 20 28 63 68 61 72 20 2a 29 20 72 65 61 6c   = (char *) real
19730 6c 6f 63 28 7a 2c 20 20 61 6c 6c 6f 63 65 64 29  loc(z,  alloced)
19740 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 3d 3d 30  ;.  }.  if( z==0
19750 20 29 20 72 65 74 75 72 6e 20 65 6d 70 74 79 3b   ) return empty;
19760 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
19770 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 28 7a  0 ){.    c = *(z
19780 54 65 78 74 2b 2b 29 3b 0a 20 20 20 20 69 66 28  Text++);.    if(
19790 20 63 3d 3d 27 25 27 20 26 26 20 6e 3e 30 20 26   c=='%' && n>0 &
197a0 26 20 7a 54 65 78 74 5b 30 5d 3d 3d 27 64 27 20  & zText[0]=='d' 
197b0 29 7b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73  ){.      lemon_s
197c0 70 72 69 6e 74 66 28 7a 49 6e 74 2c 20 22 25 64  printf(zInt, "%d
197d0 22 2c 20 70 31 29 3b 0a 20 20 20 20 20 20 70 31  ", p1);.      p1
197e0 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 6c 65 6d   = p2;.      lem
197f0 6f 6e 5f 73 74 72 63 70 79 28 26 7a 5b 75 73 65  on_strcpy(&z[use
19800 64 5d 2c 20 7a 49 6e 74 29 3b 0a 20 20 20 20 20  d], zInt);.     
19810 20 75 73 65 64 20 2b 3d 20 6c 65 6d 6f 6e 53 74   used += lemonSt
19820 72 6c 65 6e 28 26 7a 5b 75 73 65 64 5d 29 3b 0a  rlen(&z[used]);.
19830 20 20 20 20 20 20 7a 54 65 78 74 2b 2b 3b 0a 20        zText++;. 
19840 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65       n--;.    }e
19850 6c 73 65 7b 0a 20 20 20 20 20 20 7a 5b 75 73 65  lse{.      z[use
19860 64 2b 2b 5d 20 3d 20 28 63 68 61 72 29 63 3b 0a  d++] = (char)c;.
19870 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 5b 75 73      }.  }.  z[us
19880 65 64 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ed] = 0;.  retur
19890 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 7a 43  n z;.}../*.** zC
198a0 6f 64 65 20 69 73 20 61 20 73 74 72 69 6e 67 20  ode is a string 
198b0 74 68 61 74 20 69 73 20 74 68 65 20 61 63 74 69  that is the acti
198c0 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
198d0 74 68 20 61 20 72 75 6c 65 2e 20 20 45 78 70 61  th a rule.  Expa
198e0 6e 64 0a 2a 2a 20 74 68 65 20 73 79 6d 62 6f 6c  nd.** the symbol
198f0 73 20 69 6e 20 74 68 69 73 20 73 74 72 69 6e 67  s in this string
19900 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 66   so that the ref
19910 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74 73 20 6f  er to elements o
19920 66 20 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20  f the parser.** 
19930 73 74 61 63 6b 2e 0a 2a 2f 0a 50 52 49 56 41 54  stack..*/.PRIVAT
19940 45 20 76 6f 69 64 20 74 72 61 6e 73 6c 61 74 65  E void translate
19950 5f 63 6f 64 65 28 73 74 72 75 63 74 20 6c 65 6d  _code(struct lem
19960 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74  on *lemp, struct
19970 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20 20 63 68   rule *rp){.  ch
19980 61 72 20 2a 63 70 2c 20 2a 78 70 3b 0a 20 20 69  ar *cp, *xp;.  i
19990 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 6c 68 73  nt i;.  char lhs
199a0 75 73 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20  used = 0;    /* 
199b0 54 72 75 65 20 69 66 20 74 68 65 20 4c 48 53 20  True if the LHS 
199c0 65 6c 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e  element has been
199d0 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20   used */.  char 
199e0 75 73 65 64 5b 4d 41 58 52 48 53 5d 3b 20 20 20  used[MAXRHS];   
199f0 2f 2a 20 54 72 75 65 20 66 6f 72 20 65 61 63 68  /* True for each
19a00 20 52 48 53 20 65 6c 65 6d 65 6e 74 20 77 68 69   RHS element whi
19a10 63 68 20 69 73 20 75 73 65 64 20 2a 2f 0a 0a 20  ch is used */.. 
19a20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
19a30 6e 72 68 73 3b 20 69 2b 2b 29 20 75 73 65 64 5b  nrhs; i++) used[
19a40 69 5d 20 3d 20 30 3b 0a 20 20 6c 68 73 75 73 65  i] = 0;.  lhsuse
19a50 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72 70  d = 0;..  if( rp
19a60 2d 3e 63 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  ->code==0 ){.   
19a70 20 73 74 61 74 69 63 20 63 68 61 72 20 6e 65 77   static char new
19a80 6c 69 6e 65 73 74 72 5b 32 5d 20 3d 20 7b 20 27  linestr[2] = { '
19a90 5c 6e 27 2c 20 27 5c 30 27 20 7d 3b 0a 20 20 20  \n', '\0' };.   
19aa0 20 72 70 2d 3e 63 6f 64 65 20 3d 20 6e 65 77 6c   rp->code = newl
19ab0 69 6e 65 73 74 72 3b 0a 20 20 20 20 72 70 2d 3e  inestr;.    rp->
19ac0 6c 69 6e 65 20 3d 20 72 70 2d 3e 72 75 6c 65 6c  line = rp->rulel
19ad0 69 6e 65 3b 0a 20 20 7d 0a 0a 20 20 61 70 70 65  ine;.  }..  appe
19ae0 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b  nd_str(0,0,0,0);
19af0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73  ..  /* This cons
19b00 74 20 63 61 73 74 20 69 73 20 77 72 6f 6e 67 20  t cast is wrong 
19b10 62 75 74 20 68 61 72 6d 6c 65 73 73 2c 20 69 66  but harmless, if
19b20 20 77 65 27 72 65 20 63 61 72 65 66 75 6c 2e 20   we're careful. 
19b30 2a 2f 0a 20 20 66 6f 72 28 63 70 3d 28 63 68 61  */.  for(cp=(cha
19b40 72 20 2a 29 72 70 2d 3e 63 6f 64 65 3b 20 2a 63  r *)rp->code; *c
19b50 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 69 66  p; cp++){.    if
19b60 28 20 69 73 61 6c 70 68 61 28 2a 63 70 29 20 26  ( isalpha(*cp) &
19b70 26 20 28 63 70 3d 3d 72 70 2d 3e 63 6f 64 65 20  & (cp==rp->code 
19b80 7c 7c 20 28 21 69 73 61 6c 6e 75 6d 28 63 70 5b  || (!isalnum(cp[
19b90 2d 31 5d 29 20 26 26 20 63 70 5b 2d 31 5d 21 3d  -1]) && cp[-1]!=
19ba0 27 5f 27 29 29 20 29 7b 0a 20 20 20 20 20 20 63  '_')) ){.      c
19bb0 68 61 72 20 73 61 76 65 64 3b 0a 20 20 20 20 20  har saved;.     
19bc0 20 66 6f 72 28 78 70 3d 20 26 63 70 5b 31 5d 3b   for(xp= &cp[1];
19bd0 20 69 73 61 6c 6e 75 6d 28 2a 78 70 29 20 7c 7c   isalnum(*xp) ||
19be0 20 2a 78 70 3d 3d 27 5f 27 3b 20 78 70 2b 2b 29   *xp=='_'; xp++)
19bf0 3b 0a 20 20 20 20 20 20 73 61 76 65 64 20 3d 20  ;.      saved = 
19c00 2a 78 70 3b 0a 20 20 20 20 20 20 2a 78 70 20 3d  *xp;.      *xp =
19c10 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70   0;.      if( rp
19c20 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 73 74  ->lhsalias && st
19c30 72 63 6d 70 28 63 70 2c 72 70 2d 3e 6c 68 73 61  rcmp(cp,rp->lhsa
19c40 6c 69 61 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lias)==0 ){.    
19c50 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22      append_str("
19c60 79 79 67 6f 74 6f 6d 69 6e 6f 72 2e 79 79 25 64  yygotominor.yy%d
19c70 22 2c 30 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e  ",0,rp->lhs->dtn
19c80 75 6d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 63  um,0);.        c
19c90 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20 20 20  p = xp;.        
19ca0 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a 20 20 20  lhsused = 1;.   
19cb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19cc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
19cd0 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
19ce0 20 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72         if( rp->r
19cf0 68 73 61 6c 69 61 73 5b 69 5d 20 26 26 20 73 74  hsalias[i] && st
19d00 72 63 6d 70 28 63 70 2c 72 70 2d 3e 72 68 73 61  rcmp(cp,rp->rhsa
19d10 6c 69 61 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20  lias[i])==0 ){. 
19d20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
19d30 70 21 3d 72 70 2d 3e 63 6f 64 65 20 26 26 20 63  p!=rp->code && c
19d40 70 5b 2d 31 5d 3d 3d 27 40 27 20 29 7b 0a 20 20  p[-1]=='@' ){.  
19d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
19d60 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69  f the argument i
19d70 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 40 58  s of the form @X
19d80 20 74 68 65 6e 20 73 75 62 73 74 69 74 75 74 65   then substitute
19d90 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
19da0 2a 2a 20 74 68 65 20 74 6f 6b 65 6e 20 6e 75 6d  ** the token num
19db0 62 65 72 20 6f 66 20 58 2c 20 6e 6f 74 20 74 68  ber of X, not th
19dc0 65 20 76 61 6c 75 65 20 6f 66 20 58 20 2a 2f 0a  e value of X */.
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
19de0 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73 70 5b  pend_str("yymsp[
19df0 25 64 5d 2e 6d 61 6a 6f 72 22 2c 2d 31 2c 69 2d  %d].major",-1,i-
19e00 72 70 2d 3e 6e 72 68 73 2b 31 2c 30 29 3b 0a 20  rp->nrhs+1,0);. 
19e10 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
19e20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
19e30 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
19e40 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  p = rp->rhs[i];.
19e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
19e60 74 20 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  t dtnum;.       
19e70 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74         if( sp->t
19e80 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype==MULTITERMIN
19e90 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
19ea0 20 20 20 20 20 20 64 74 6e 75 6d 20 3d 20 73 70        dtnum = sp
19eb0 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 64 74 6e  ->subsym[0]->dtn
19ec0 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  um;.            
19ed0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19ee0 20 20 20 20 20 20 20 20 20 64 74 6e 75 6d 20 3d           dtnum =
19ef0 20 73 70 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20   sp->dtnum;.    
19f00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19f10 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64            append
19f20 5f 73 74 72 28 22 79 79 6d 73 70 5b 25 64 5d 2e  _str("yymsp[%d].
19f30 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30 2c 69 2d  minor.yy%d",0,i-
19f40 72 70 2d 3e 6e 72 68 73 2b 31 2c 20 64 74 6e 75  rp->nrhs+1, dtnu
19f50 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  m);.            
19f60 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 70  }.            cp
19f70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20 20 20 20   = xp;.         
19f80 20 20 20 75 73 65 64 5b 69 5d 20 3d 20 31 3b 0a     used[i] = 1;.
19f90 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
19fa0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
19fb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
19fc0 0a 20 20 20 20 20 20 2a 78 70 20 3d 20 73 61 76  .      *xp = sav
19fd0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 70  ed;.    }.    ap
19fe0 70 65 6e 64 5f 73 74 72 28 63 70 2c 20 31 2c 20  pend_str(cp, 1, 
19ff0 30 2c 20 30 29 3b 0a 20 20 7d 20 2f 2a 20 45 6e  0, 0);.  } /* En
1a000 64 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 2f 2a 20  d loop */..  /* 
1a010 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
1a020 72 65 20 74 68 65 20 4c 48 53 20 68 61 73 20 62  re the LHS has b
1a030 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20 69 66  een used */.  if
1a040 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26  ( rp->lhsalias &
1a050 26 20 21 6c 68 73 75 73 65 64 20 29 7b 0a 20 20  & !lhsused ){.  
1a060 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
1a070 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
1a080 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 22 4c  leline,.      "L
1a090 61 62 65 6c 20 5c 22 25 73 5c 22 20 66 6f 72 20  abel \"%s\" for 
1a0a0 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e 65  \"%s(%s)\" is ne
1a0b0 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20 20  ver used.",.    
1a0c0 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73      rp->lhsalias
1a0d0 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 72  ,rp->lhs->name,r
1a0e0 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20  p->lhsalias);.  
1a0f0 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
1a100 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  ++;.  }..  /* Ge
1a110 6e 65 72 61 74 65 20 64 65 73 74 72 75 63 74 6f  nerate destructo
1a120 72 20 63 6f 64 65 20 66 6f 72 20 52 48 53 20 73  r code for RHS s
1a130 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 61 72 65  ymbols which are
1a140 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 74 68 65   not used in the
1a150 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 63 6f 64  .  ** reduce cod
1a160 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
1a170 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
1a180 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68  {.    if( rp->rh
1a190 73 61 6c 69 61 73 5b 69 5d 20 26 26 20 21 75 73  salias[i] && !us
1a1a0 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 45  ed[i] ){.      E
1a1b0 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
1a1c0 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c  lename,rp->rulel
1a1d0 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 22 4c 61  ine,.        "La
1a1e0 62 65 6c 20 25 73 20 66 6f 72 20 5c 22 25 73 28  bel %s for \"%s(
1a1f0 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75  %s)\" is never u
1a200 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 20 72  sed.",.        r
1a210 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 2c 72  p->rhsalias[i],r
1a220 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c  p->rhs[i]->name,
1a230 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29  rp->rhsalias[i])
1a240 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72  ;.      lemp->er
1a250 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65  rorcnt++;.    }e
1a260 6c 73 65 20 69 66 28 20 72 70 2d 3e 72 68 73 61  lse if( rp->rhsa
1a270 6c 69 61 73 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  lias[i]==0 ){.  
1a280 20 20 20 20 69 66 28 20 68 61 73 5f 64 65 73 74      if( has_dest
1a290 72 75 63 74 6f 72 28 72 70 2d 3e 72 68 73 5b 69  ructor(rp->rhs[i
1a2a0 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20 20 20 20 20  ],lemp) ){.     
1a2b0 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22 20     append_str(" 
1a2c0 20 79 79 5f 64 65 73 74 72 75 63 74 6f 72 28 79   yy_destructor(y
1a2d0 79 70 50 61 72 73 65 72 2c 25 64 2c 26 79 79 6d  ypParser,%d,&yym
1a2e0 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c 6e  sp[%d].minor);\n
1a2f0 22 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  ", 0,.          
1a300 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 69 6e 64   rp->rhs[i]->ind
1a310 65 78 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 29  ex,i-rp->nrhs+1)
1a320 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a330 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 64 65 73         /* No des
1a340 74 72 75 63 74 6f 72 20 64 65 66 69 6e 65 64 20  tructor defined 
1a350 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f  for this term */
1a360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a370 20 7d 0a 20 20 69 66 28 20 72 70 2d 3e 63 6f 64   }.  if( rp->cod
1a380 65 20 29 7b 0a 20 20 20 20 63 70 20 3d 20 61 70  e ){.    cp = ap
1a390 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30  pend_str(0,0,0,0
1a3a0 29 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20  );.    rp->code 
1a3b0 3d 20 53 74 72 73 61 66 65 28 63 70 3f 63 70 3a  = Strsafe(cp?cp:
1a3c0 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a  "");.  }.}../* .
1a3d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1a3e0 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20   which executes 
1a3f0 77 68 65 6e 20 74 68 65 20 72 75 6c 65 20 22 72  when the rule "r
1a400 70 22 20 69 73 20 72 65 64 75 63 65 64 2e 20 20  p" is reduced.  
1a410 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 63 6f 64  Write.** the cod
1a420 65 20 74 6f 20 22 6f 75 74 22 2e 20 20 4d 61 6b  e to "out".  Mak
1a430 65 20 73 75 72 65 20 6c 69 6e 65 6e 6f 20 73 74  e sure lineno st
1a440 61 79 73 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a  ays up-to-date..
1a450 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
1a460 65 6d 69 74 5f 63 6f 64 65 28 0a 20 20 46 49 4c  emit_code(.  FIL
1a470 45 20 2a 6f 75 74 2c 0a 20 20 73 74 72 75 63 74  E *out,.  struct
1a480 20 72 75 6c 65 20 2a 72 70 2c 0a 20 20 73 74 72   rule *rp,.  str
1a490 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
1a4a0 0a 20 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 0a 29  .  int *lineno.)
1a4b0 7b 0a 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  {. const char *c
1a4c0 70 3b 0a 0a 20 2f 2a 20 47 65 6e 65 72 61 74 65  p;.. /* Generate
1a4d0 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20   code to do the 
1a4e0 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 2a 2f  reduce action */
1a4f0 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29  . if( rp->code )
1a500 7b 0a 20 20 20 69 66 20 28 21 6c 65 6d 70 2d 3e  {.   if (!lemp->
1a510 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b  nolinenosflag) {
1a520 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70   (*lineno)++; tp
1a530 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 72  lt_linedir(out,r
1a540 70 2d 3e 6c 69 6e 65 2c 6c 65 6d 70 2d 3e 66 69  p->line,lemp->fi
1a550 6c 65 6e 61 6d 65 29 3b 20 7d 0a 20 20 20 66 70  lename); }.   fp
1a560 72 69 6e 74 66 28 6f 75 74 2c 22 7b 25 73 22 2c  rintf(out,"{%s",
1a570 72 70 2d 3e 63 6f 64 65 29 3b 0a 20 20 20 66 6f  rp->code);.   fo
1a580 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a  r(cp=rp->code; *
1a590 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20  cp; cp++){.     
1a5a0 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20  if( *cp=='\n' ) 
1a5b0 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
1a5c0 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f  } /* End loop */
1a5d0 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
1a5e0 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f  "}\n"); (*lineno
1a5f0 29 2b 2b 3b 0a 20 20 20 69 66 20 28 21 6c 65 6d  )++;.   if (!lem
1a600 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
1a610 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ) { (*lineno)++;
1a620 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75   tplt_linedir(ou
1a630 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e  t,*lineno,lemp->
1a640 6f 75 74 6e 61 6d 65 29 3b 20 7d 0a 20 7d 20 2f  outname); }. } /
1a650 2a 20 45 6e 64 20 69 66 28 20 72 70 2d 3e 63 6f  * End if( rp->co
1a660 64 65 20 29 20 2a 2f 0a 0a 20 72 65 74 75 72 6e  de ) */.. return
1a670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ;.}../*.** Print
1a680 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20   the definition 
1a690 6f 66 20 74 68 65 20 75 6e 69 6f 6e 20 75 73 65  of the union use
1a6a0 64 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72  d for the parser
1a6b0 27 73 20 64 61 74 61 20 73 74 61 63 6b 2e 0a 2a  's data stack..*
1a6c0 2a 20 54 68 69 73 20 75 6e 69 6f 6e 20 63 6f 6e  * This union con
1a6d0 74 61 69 6e 73 20 66 69 65 6c 64 73 20 66 6f 72  tains fields for
1a6e0 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20   every possible 
1a6f0 64 61 74 61 20 74 79 70 65 20 66 6f 72 20 74 6f  data type for to
1a700 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f 6e 74  kens.** and nont
1a710 65 72 6d 69 6e 61 6c 73 2e 20 20 49 6e 20 74 68  erminals.  In th
1a720 65 20 70 72 6f 63 65 73 73 20 6f 66 20 63 6f 6d  e process of com
1a730 70 75 74 69 6e 67 20 61 6e 64 20 70 72 69 6e 74  puting and print
1a740 69 6e 67 20 74 68 69 73 0a 2a 2a 20 75 6e 69 6f  ing this.** unio
1a750 6e 2c 20 61 6c 73 6f 20 73 65 74 20 74 68 65 20  n, also set the 
1a760 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f  ".dtnum" field o
1a770 66 20 65 76 65 72 79 20 74 65 72 6d 69 6e 61 6c  f every terminal
1a780 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
1a790 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f 0a 76  .** symbol..*/.v
1a7a0 6f 69 64 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f  oid print_stack_
1a7b0 75 6e 69 6f 6e 28 0a 20 20 46 49 4c 45 20 2a 6f  union(.  FILE *o
1a7c0 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
1a7d0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70       /* The outp
1a7e0 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 73  ut stream */.  s
1a7f0 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
1a800 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  p,         /* Th
1a810 65 20 6d 61 69 6e 20 69 6e 66 6f 20 73 74 72 75  e main info stru
1a820 63 74 75 72 65 20 66 6f 72 20 74 68 69 73 20 70  cture for this p
1a830 61 72 73 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  arser */.  int *
1a840 70 6c 69 6e 65 6e 6f 2c 20 20 20 20 20 20 20 20  plineno,        
1a850 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1a860 72 20 74 6f 20 74 68 65 20 6c 69 6e 65 20 6e 75  r to the line nu
1a870 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 68  mber */.  int mh
1a880 66 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  flag            
1a890 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1a8a0 20 67 65 6e 65 72 61 74 69 6e 67 20 6d 61 6b 65   generating make
1a8b0 68 65 61 64 65 72 73 20 6f 75 74 70 75 74 20 2a  headers output *
1a8c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e  /.){.  int linen
1a8d0 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20  o = *plineno;   
1a8e0 20 2f 2a 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d   /* The line num
1a8f0 62 65 72 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ber of the outpu
1a900 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 74 79  t */.  char **ty
1a910 70 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  pes;            
1a920 20 2f 2a 20 41 20 68 61 73 68 20 74 61 62 6c 65   /* A hash table
1a930 20 6f 66 20 64 61 74 61 74 79 70 65 73 20 2a 2f   of datatypes */
1a940 0a 20 20 69 6e 74 20 61 72 72 61 79 73 69 7a 65  .  int arraysize
1a950 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1a960 53 69 7a 65 20 6f 66 20 74 68 65 20 22 74 79 70  Size of the "typ
1a970 65 73 22 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  es" array */.  i
1a980 6e 74 20 6d 61 78 64 74 6c 65 6e 67 74 68 3b 20  nt maxdtlength; 
1a990 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
1a9a0 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e  mum length of an
1a9b0 79 20 22 2e 64 61 74 61 74 79 70 65 22 20 66 69  y ".datatype" fi
1a9c0 65 6c 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  eld. */.  char *
1a9d0 73 74 64 64 74 3b 20 20 20 20 20 20 20 20 20 20  stddt;          
1a9e0 20 20 20 20 2f 2a 20 53 74 61 6e 64 61 72 64 69      /* Standardi
1a9f0 7a 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 64  zed name for a d
1aa00 61 74 61 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74  atatype */.  int
1aa10 20 69 2c 6a 3b 20 20 20 20 20 20 20 20 20 20 20   i,j;           
1aa20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1aa30 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 6e 73  ounters */.  uns
1aa40 69 67 6e 65 64 20 68 61 73 68 3b 20 20 20 20 20  igned hash;     
1aa50 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 68 61         /* For ha
1aa60 73 68 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f  shing the name o
1aa70 66 20 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 6f  f a type */.  co
1aa80 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20  nst char *name; 
1aa90 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1aaa0 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  of the parser */
1aab0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1aac0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
1aad0 79 70 65 73 5b 5d 20 61 6e 64 20 61 6c 6c 6f 63  ypes[] and alloc
1aae0 61 74 65 20 73 74 64 64 74 5b 5d 20 2a 2f 0a 20  ate stddt[] */. 
1aaf0 20 61 72 72 61 79 73 69 7a 65 20 3d 20 6c 65 6d   arraysize = lem
1ab00 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a 20 32 3b 0a  p->nsymbol * 2;.
1ab10 20 20 74 79 70 65 73 20 3d 20 28 63 68 61 72 2a    types = (char*
1ab20 2a 29 63 61 6c 6c 6f 63 28 20 61 72 72 61 79 73  *)calloc( arrays
1ab30 69 7a 65 2c 20 73 69 7a 65 6f 66 28 63 68 61 72  ize, sizeof(char
1ab40 2a 29 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65  *) );.  if( type
1ab50 73 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  s==0 ){.    fpri
1ab60 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20  ntf(stderr,"Out 
1ab70 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a  of memory.\n");.
1ab80 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
1ab90 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
1aba0 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29 20 74 79  raysize; i++) ty
1abb0 70 65 73 5b 69 5d 20 3d 20 30 3b 0a 20 20 6d 61  pes[i] = 0;.  ma
1abc0 78 64 74 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20  xdtlength = 0;. 
1abd0 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 74 79   if( lemp->varty
1abe0 70 65 20 29 7b 0a 20 20 20 20 6d 61 78 64 74 6c  pe ){.    maxdtl
1abf0 65 6e 67 74 68 20 3d 20 6c 65 6d 6f 6e 53 74 72  ength = lemonStr
1ac00 6c 65 6e 28 6c 65 6d 70 2d 3e 76 61 72 74 79 70  len(lemp->vartyp
1ac10 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  e);.  }.  for(i=
1ac20 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
1ac30 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ol; i++){.    in
1ac40 74 20 6c 65 6e 3b 0a 20 20 20 20 73 74 72 75 63  t len;.    struc
1ac50 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
1ac60 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
1ac70 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 64 61 74  .    if( sp->dat
1ac80 61 74 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69  atype==0 ) conti
1ac90 6e 75 65 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c  nue;.    len = l
1aca0 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 70 2d 3e 64  emonStrlen(sp->d
1acb0 61 74 61 74 79 70 65 29 3b 0a 20 20 20 20 69 66  atatype);.    if
1acc0 28 20 6c 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74  ( len>maxdtlengt
1acd0 68 20 29 20 6d 61 78 64 74 6c 65 6e 67 74 68 20  h ) maxdtlength 
1ace0 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64  = len;.  }.  std
1acf0 64 74 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c  dt = (char*)mall
1ad00 6f 63 28 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a  oc( maxdtlength*
1ad10 32 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 73  2 + 1 );.  if( s
1ad20 74 64 64 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66  tddt==0 ){.    f
1ad30 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f  printf(stderr,"O
1ad40 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22  ut of memory.\n"
1ad50 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
1ad60 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20    }..  /* Build 
1ad70 61 20 68 61 73 68 20 74 61 62 6c 65 20 6f 66 20  a hash table of 
1ad80 64 61 74 61 74 79 70 65 73 2e 20 54 68 65 20 22  datatypes. The "
1ad90 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66  .dtnum" field of
1ada0 20 65 61 63 68 20 73 79 6d 62 6f 6c 0a 20 20 2a   each symbol.  *
1adb0 2a 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77  * is filled in w
1adc0 69 74 68 20 74 68 65 20 68 61 73 68 20 69 6e 64  ith the hash ind
1add0 65 78 20 70 6c 75 73 20 31 2e 20 20 41 20 22 2e  ex plus 1.  A ".
1ade0 64 74 6e 75 6d 22 20 76 61 6c 75 65 20 6f 66 20  dtnum" value of 
1adf0 30 20 69 73 0a 20 20 2a 2a 20 75 73 65 64 20 66  0 is.  ** used f
1ae00 6f 72 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  or terminal symb
1ae10 6f 6c 73 2e 20 20 49 66 20 74 68 65 72 65 20 69  ols.  If there i
1ae20 73 20 6e 6f 20 25 64 65 66 61 75 6c 74 5f 74 79  s no %default_ty
1ae30 70 65 20 64 65 66 69 6e 65 64 20 74 68 65 6e 0a  pe defined then.
1ae40 20 20 2a 2a 20 30 20 69 73 20 61 6c 73 6f 20 75    ** 0 is also u
1ae50 73 65 64 20 61 73 20 74 68 65 20 2e 64 74 6e 75  sed as the .dtnu
1ae60 6d 20 76 61 6c 75 65 20 66 6f 72 20 6e 6f 6e 74  m value for nont
1ae70 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 64  erminals which d
1ae80 6f 20 6e 6f 74 20 73 70 65 63 69 66 79 0a 20 20  o not specify.  
1ae90 2a 2a 20 61 20 64 61 74 61 74 79 70 65 20 75 73  ** a datatype us
1aea0 69 6e 67 20 74 68 65 20 25 74 79 70 65 20 64 69  ing the %type di
1aeb0 72 65 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20  rective..  */.  
1aec0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1aed0 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
1aee0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
1aef0 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  l *sp = lemp->sy
1af00 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 63 68  mbols[i];.    ch
1af10 61 72 20 2a 63 70 3b 0a 20 20 20 20 69 66 28 20  ar *cp;.    if( 
1af20 73 70 3d 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  sp==lemp->errsym
1af30 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74   ){.      sp->dt
1af40 6e 75 6d 20 3d 20 61 72 72 61 79 73 69 7a 65 2b  num = arraysize+
1af50 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  1;.      continu
1af60 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
1af70 20 73 70 2d 3e 74 79 70 65 21 3d 4e 4f 4e 54 45   sp->type!=NONTE
1af80 52 4d 49 4e 41 4c 20 7c 7c 20 28 73 70 2d 3e 64  RMINAL || (sp->d
1af90 61 74 61 74 79 70 65 3d 3d 30 20 26 26 20 6c 65  atatype==0 && le
1afa0 6d 70 2d 3e 76 61 72 74 79 70 65 3d 3d 30 29 20  mp->vartype==0) 
1afb0 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e  ){.      sp->dtn
1afc0 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  um = 0;.      co
1afd0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1afe0 20 20 63 70 20 3d 20 73 70 2d 3e 64 61 74 61 74    cp = sp->datat
1aff0 79 70 65 3b 0a 20 20 20 20 69 66 28 20 63 70 3d  ype;.    if( cp=
1b000 3d 30 20 29 20 63 70 20 3d 20 6c 65 6d 70 2d 3e  =0 ) cp = lemp->
1b010 76 61 72 74 79 70 65 3b 0a 20 20 20 20 6a 20 3d  vartype;.    j =
1b020 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69   0;.    while( i
1b030 73 73 70 61 63 65 28 2a 63 70 29 20 29 20 63 70  sspace(*cp) ) cp
1b040 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  ++;.    while( *
1b050 63 70 20 29 20 73 74 64 64 74 5b 6a 2b 2b 5d 20  cp ) stddt[j++] 
1b060 3d 20 2a 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69  = *cp++;.    whi
1b070 6c 65 28 20 6a 3e 30 20 26 26 20 69 73 73 70 61  le( j>0 && isspa
1b080 63 65 28 73 74 64 64 74 5b 6a 2d 31 5d 29 20 29  ce(stddt[j-1]) )
1b090 20 6a 2d 2d 3b 0a 20 20 20 20 73 74 64 64 74 5b   j--;.    stddt[
1b0a0 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  j] = 0;.    if( 
1b0b0 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 20  lemp->tokentype 
1b0c0 26 26 20 73 74 72 63 6d 70 28 73 74 64 64 74 2c  && strcmp(stddt,
1b0d0 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65   lemp->tokentype
1b0e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70  )==0 ){.      sp
1b0f0 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  ->dtnum = 0;.   
1b100 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1b110 20 7d 0a 20 20 20 20 68 61 73 68 20 3d 20 30 3b   }.    hash = 0;
1b120 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 73 74  .    for(j=0; st
1b130 64 64 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ddt[j]; j++){.  
1b140 20 20 20 20 68 61 73 68 20 3d 20 68 61 73 68 2a      hash = hash*
1b150 35 33 20 2b 20 73 74 64 64 74 5b 6a 5d 3b 0a 20  53 + stddt[j];. 
1b160 20 20 20 7d 0a 20 20 20 20 68 61 73 68 20 3d 20     }.    hash = 
1b170 28 68 61 73 68 20 26 20 30 78 37 66 66 66 66 66  (hash & 0x7fffff
1b180 66 66 29 25 61 72 72 61 79 73 69 7a 65 3b 0a 20  ff)%arraysize;. 
1b190 20 20 20 77 68 69 6c 65 28 20 74 79 70 65 73 5b     while( types[
1b1a0 68 61 73 68 5d 20 29 7b 0a 20 20 20 20 20 20 69  hash] ){.      i
1b1b0 66 28 20 73 74 72 63 6d 70 28 74 79 70 65 73 5b  f( strcmp(types[
1b1c0 68 61 73 68 5d 2c 73 74 64 64 74 29 3d 3d 30 20  hash],stddt)==0 
1b1d0 29 7b 0a 20 20 20 20 20 20 20 20 73 70 2d 3e 64  ){.        sp->d
1b1e0 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b  tnum = hash + 1;
1b1f0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1b200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 68 61        }.      ha
1b210 73 68 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  sh++;.      if( 
1b220 68 61 73 68 3e 3d 28 75 6e 73 69 67 6e 65 64 29  hash>=(unsigned)
1b230 61 72 72 61 79 73 69 7a 65 20 29 20 68 61 73 68  arraysize ) hash
1b240 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1b250 69 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d  if( types[hash]=
1b260 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e  =0 ){.      sp->
1b270 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31  dtnum = hash + 1
1b280 3b 0a 20 20 20 20 20 20 74 79 70 65 73 5b 68 61  ;.      types[ha
1b290 73 68 5d 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c  sh] = (char*)mal
1b2a0 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  loc( lemonStrlen
1b2b0 28 73 74 64 64 74 29 2b 31 20 29 3b 0a 20 20 20  (stddt)+1 );.   
1b2c0 20 20 20 69 66 28 20 74 79 70 65 73 5b 68 61 73     if( types[has
1b2d0 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  h]==0 ){.       
1b2e0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1b2f0 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c  "Out of memory.\
1b300 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69  n");.        exi
1b310 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t(1);.      }.  
1b320 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79      lemon_strcpy
1b330 28 74 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64  (types[hash],std
1b340 64 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dt);.    }.  }..
1b350 20 20 2f 2a 20 50 72 69 6e 74 20 6f 75 74 20 74    /* Print out t
1b360 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  he definition of
1b370 20 59 59 54 4f 4b 45 4e 54 59 50 45 20 61 6e 64   YYTOKENTYPE and
1b380 20 59 59 4d 49 4e 4f 52 54 59 50 45 20 2a 2f 0a   YYMINORTYPE */.
1b390 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e    name = lemp->n
1b3a0 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65  ame ? lemp->name
1b3b0 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20 6c 69   : "Parse";.  li
1b3c0 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b  neno = *plineno;
1b3d0 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
1b3e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69   fprintf(out,"#i
1b3f0 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b  f INTERFACE\n");
1b400 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66   lineno++; }.  f
1b410 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1b420 69 6e 65 20 25 73 54 4f 4b 45 4e 54 59 50 45 20  ine %sTOKENTYPE 
1b430 25 73 5c 6e 22 2c 6e 61 6d 65 2c 0a 20 20 20 20  %s\n",name,.    
1b440 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3f  lemp->tokentype?
1b450 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3a  lemp->tokentype:
1b460 22 76 6f 69 64 2a 22 29 3b 20 20 6c 69 6e 65 6e  "void*");  linen
1b470 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61  o++;.  if( mhfla
1b480 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74  g ){ fprintf(out
1b490 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69  ,"#endif\n"); li
1b4a0 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69  neno++; }.  fpri
1b4b0 6e 74 66 28 6f 75 74 2c 22 74 79 70 65 64 65 66  ntf(out,"typedef
1b4c0 20 75 6e 69 6f 6e 20 7b 5c 6e 22 29 3b 20 6c 69   union {\n"); li
1b4d0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1b4e0 66 28 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 69  f(out,"  int yyi
1b4f0 6e 69 74 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  nit;\n"); lineno
1b500 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1b510 74 2c 22 20 20 25 73 54 4f 4b 45 4e 54 59 50 45  t,"  %sTOKENTYPE
1b520 20 79 79 30 3b 5c 6e 22 2c 6e 61 6d 65 29 3b 20   yy0;\n",name); 
1b530 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28  lineno++;.  for(
1b540 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65  i=0; i<arraysize
1b550 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1b560 74 79 70 65 73 5b 69 5d 3d 3d 30 20 29 20 63 6f  types[i]==0 ) co
1b570 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69  ntinue;.    fpri
1b580 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 20 79 79  ntf(out,"  %s yy
1b590 25 64 3b 5c 6e 22 2c 74 79 70 65 73 5b 69 5d 2c  %d;\n",types[i],
1b5a0 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i+1); lineno++;.
1b5b0 20 20 20 20 66 72 65 65 28 74 79 70 65 73 5b 69      free(types[i
1b5c0 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65  ]);.  }.  if( le
1b5d0 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43  mp->errsym->useC
1b5e0 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  nt ){.    fprint
1b5f0 66 28 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 25  f(out,"  int yy%
1b600 64 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73  d;\n",lemp->errs
1b610 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65  ym->dtnum); line
1b620 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 72 65 65  no++;.  }.  free
1b630 28 73 74 64 64 74 29 3b 0a 20 20 66 72 65 65 28  (stddt);.  free(
1b640 74 79 70 65 73 29 3b 0a 20 20 66 70 72 69 6e 74  types);.  fprint
1b650 66 28 6f 75 74 2c 22 7d 20 59 59 4d 49 4e 4f 52  f(out,"} YYMINOR
1b660 54 59 50 45 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  TYPE;\n"); linen
1b670 6f 2b 2b 3b 0a 20 20 2a 70 6c 69 6e 65 6e 6f 20  o++;.  *plineno 
1b680 3d 20 6c 69 6e 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  = lineno;.}../*.
1b690 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
1b6a0 6d 65 20 6f 66 20 61 20 43 20 64 61 74 61 74 79  me of a C dataty
1b6b0 70 65 20 61 62 6c 65 20 74 6f 20 72 65 70 72 65  pe able to repre
1b6c0 73 65 6e 74 20 76 61 6c 75 65 73 20 62 65 74 77  sent values betw
1b6d0 65 65 6e 0a 2a 2a 20 6c 77 72 20 61 6e 64 20 75  een.** lwr and u
1b6e0 70 72 2c 20 69 6e 63 6c 75 73 69 76 65 2e 0a 2a  pr, inclusive..*
1b6f0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
1b700 68 61 72 20 2a 6d 69 6e 69 6d 75 6d 5f 73 69 7a  har *minimum_siz
1b710 65 5f 74 79 70 65 28 69 6e 74 20 6c 77 72 2c 20  e_type(int lwr, 
1b720 69 6e 74 20 75 70 72 29 7b 0a 20 20 69 66 28 20  int upr){.  if( 
1b730 6c 77 72 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  lwr>=0 ){.    if
1b740 28 20 75 70 72 3c 3d 32 35 35 20 29 7b 0a 20 20  ( upr<=255 ){.  
1b750 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69      return "unsi
1b760 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20 20 20  gned char";.    
1b770 7d 65 6c 73 65 20 69 66 28 20 75 70 72 3c 36 35  }else if( upr<65
1b780 35 33 35 20 29 7b 0a 20 20 20 20 20 20 72 65 74  535 ){.      ret
1b790 75 72 6e 20 22 75 6e 73 69 67 6e 65 64 20 73 68  urn "unsigned sh
1b7a0 6f 72 74 20 69 6e 74 22 3b 0a 20 20 20 20 7d 65  ort int";.    }e
1b7b0 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
1b7c0 6e 20 22 75 6e 73 69 67 6e 65 64 20 69 6e 74 22  n "unsigned int"
1b7d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
1b7e0 69 66 28 20 6c 77 72 3e 3d 2d 31 32 37 20 26 26  if( lwr>=-127 &&
1b7f0 20 75 70 72 3c 3d 31 32 37 20 29 7b 0a 20 20 20   upr<=127 ){.   
1b800 20 72 65 74 75 72 6e 20 22 73 69 67 6e 65 64 20   return "signed 
1b810 63 68 61 72 22 3b 0a 20 20 7d 65 6c 73 65 20 69  char";.  }else i
1b820 66 28 20 6c 77 72 3e 3d 2d 33 32 37 36 37 20 26  f( lwr>=-32767 &
1b830 26 20 75 70 72 3c 33 32 37 36 37 20 29 7b 0a 20  & upr<32767 ){. 
1b840 20 20 20 72 65 74 75 72 6e 20 22 73 68 6f 72 74     return "short
1b850 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
1b860 72 65 74 75 72 6e 20 22 69 6e 74 22 3b 0a 20 20  return "int";.  
1b870 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  }.}../*.** Each 
1b880 73 74 61 74 65 20 63 6f 6e 74 61 69 6e 73 20 61  state contains a
1b890 20 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 74 72   set of token tr
1b8a0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
1b8b0 73 65 74 20 6f 66 0a 2a 2a 20 6e 6f 6e 74 65 72  set of.** nonter
1b8c0 6d 69 6e 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  minal transactio
1b8d0 6e 73 2e 20 20 45 61 63 68 20 6f 66 20 74 68 65  ns.  Each of the
1b8e0 73 65 20 73 65 74 73 20 6d 61 6b 65 73 20 61 6e  se sets makes an
1b8f0 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20   instance.** of 
1b900 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1b910 72 75 63 74 75 72 65 2e 20 20 41 6e 20 61 72 72  ructure.  An arr
1b920 61 79 20 6f 66 20 74 68 65 73 65 20 73 74 72 75  ay of these stru
1b930 63 74 75 72 65 73 20 69 73 20 75 73 65 64 0a 2a  ctures is used.*
1b940 2a 20 74 6f 20 6f 72 64 65 72 20 74 68 65 20 63  * to order the c
1b950 72 65 61 74 69 6f 6e 20 6f 66 20 65 6e 74 72 69  reation of entri
1b960 65 73 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74  es in the yy_act
1b970 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a  ion[] table..*/.
1b980 73 74 72 75 63 74 20 61 78 73 65 74 20 7b 0a 20  struct axset {. 
1b990 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
1b9a0 74 70 3b 20 20 20 2f 2a 20 41 20 70 6f 69 6e 74  tp;   /* A point
1b9b0 65 72 20 74 6f 20 61 20 73 74 61 74 65 20 2a 2f  er to a state */
1b9c0 0a 20 20 69 6e 74 20 69 73 54 6b 6e 3b 20 20 20  .  int isTkn;   
1b9d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1b9e0 74 6f 20 75 73 65 20 74 6f 6b 65 6e 73 2e 20 20  to use tokens.  
1b9f0 46 61 6c 73 65 20 66 6f 72 20 6e 6f 6e 2d 74 65  False for non-te
1ba00 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e 74  rminals */.  int
1ba10 20 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20   nAction;       
1ba20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
1ba30 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
1ba40 69 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20 20  iOrder;         
1ba50 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6f 72 64   /* Original ord
1ba60 65 72 20 6f 66 20 61 63 74 69 6f 6e 20 73 65 74  er of action set
1ba70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  s */.};../*.** C
1ba80 6f 6d 70 61 72 65 20 74 6f 20 61 78 73 65 74 20  ompare to axset 
1ba90 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 73  structures for s
1baa0 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 0a  orting purposes.
1bab0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 78  */.static int ax
1bac0 73 65 74 5f 63 6f 6d 70 61 72 65 28 63 6f 6e 73  set_compare(cons
1bad0 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74  t void *a, const
1bae0 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 73 74 72   void *b){.  str
1baf0 75 63 74 20 61 78 73 65 74 20 2a 70 31 20 3d 20  uct axset *p1 = 
1bb00 28 73 74 72 75 63 74 20 61 78 73 65 74 2a 29 61  (struct axset*)a
1bb10 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65 74  ;.  struct axset
1bb20 20 2a 70 32 20 3d 20 28 73 74 72 75 63 74 20 61   *p2 = (struct a
1bb30 78 73 65 74 2a 29 62 3b 0a 20 20 69 6e 74 20 63  xset*)b;.  int c
1bb40 3b 0a 20 20 63 20 3d 20 70 32 2d 3e 6e 41 63 74  ;.  c = p2->nAct
1bb50 69 6f 6e 20 2d 20 70 31 2d 3e 6e 41 63 74 69 6f  ion - p1->nActio
1bb60 6e 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b  n;.  if( c==0 ){
1bb70 0a 20 20 20 20 63 20 3d 20 70 32 2d 3e 69 4f 72  .    c = p2->iOr
1bb80 64 65 72 20 2d 20 70 31 2d 3e 69 4f 72 64 65 72  der - p1->iOrder
1bb90 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1bba0 63 21 3d 30 20 7c 7c 20 70 31 3d 3d 70 32 20 29  c!=0 || p1==p2 )
1bbb0 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  ;.  return c;.}.
1bbc0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 65 78  ./*.** Write tex
1bbd0 74 20 6f 6e 20 22 6f 75 74 22 20 74 68 61 74 20  t on "out" that 
1bbe0 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72 75  describes the ru
1bbf0 6c 65 20 22 72 70 22 2e 0a 2a 2f 0a 73 74 61 74  le "rp"..*/.stat
1bc00 69 63 20 76 6f 69 64 20 77 72 69 74 65 52 75 6c  ic void writeRul
1bc10 65 54 65 78 74 28 46 49 4c 45 20 2a 6f 75 74 2c  eText(FILE *out,
1bc20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
1bc30 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 70  ){.  int j;.  fp
1bc40 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 20 3a 3a  rintf(out,"%s ::
1bc50 3d 22 2c 20 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d  =", rp->lhs->nam
1bc60 65 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  e);.  for(j=0; j
1bc70 3c 72 70 2d 3e 6e 72 68 73 3b 20 6a 2b 2b 29 7b  <rp->nrhs; j++){
1bc80 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62  .    struct symb
1bc90 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73  ol *sp = rp->rhs
1bca0 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d  [j];.    if( sp-
1bcb0 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d  >type!=MULTITERM
1bcc0 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 66 70  INAL ){.      fp
1bcd0 72 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22 2c  rintf(out," %s",
1bce0 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
1bcf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1bd00 20 6b 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   k;.      fprint
1bd10 66 28 6f 75 74 2c 22 20 25 73 22 2c 20 73 70 2d  f(out," %s", sp-
1bd20 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65  >subsym[0]->name
1bd30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31  );.      for(k=1
1bd40 3b 20 6b 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b  ; k<sp->nsubsym;
1bd50 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   k++){.        f
1bd60 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c 25 73 22  printf(out,"|%s"
1bd70 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e  ,sp->subsym[k]->
1bd80 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  name);.      }. 
1bd90 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20     }.  }.}.../* 
1bda0 47 65 6e 65 72 61 74 65 20 43 20 73 6f 75 72 63  Generate C sourc
1bdb0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70  e code for the p
1bdc0 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65  arser */.void Re
1bdd0 70 6f 72 74 54 61 62 6c 65 28 0a 20 20 73 74 72  portTable(.  str
1bde0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
1bdf0 0a 20 20 69 6e 74 20 6d 68 66 6c 61 67 20 20 20  .  int mhflag   
1be00 20 20 2f 2a 20 4f 75 74 70 75 74 20 69 6e 20 6d    /* Output in m
1be10 61 6b 65 68 65 61 64 65 72 73 20 66 6f 72 6d 61  akeheaders forma
1be20 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  t if true */.){.
1be30 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e    FILE *out, *in
1be40 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49  ;.  char line[LI
1be50 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 20  NESIZE];.  int  
1be60 6c 69 6e 65 6e 6f 3b 0a 20 20 73 74 72 75 63 74  lineno;.  struct
1be70 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73   state *stp;.  s
1be80 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
1be90 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
1bea0 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63  *rp;.  struct ac
1beb0 74 74 61 62 20 2a 70 41 63 74 74 61 62 3b 0a 20  ttab *pActtab;. 
1bec0 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20   int i, j, n;.  
1bed0 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65  const char *name
1bee0 3b 0a 20 20 69 6e 74 20 6d 6e 54 6b 6e 4f 66 73  ;.  int mnTknOfs
1bef0 74 2c 20 6d 78 54 6b 6e 4f 66 73 74 3b 0a 20 20  t, mxTknOfst;.  
1bf00 69 6e 74 20 6d 6e 4e 74 4f 66 73 74 2c 20 6d 78  int mnNtOfst, mx
1bf10 4e 74 4f 66 73 74 3b 0a 20 20 73 74 72 75 63 74  NtOfst;.  struct
1bf20 20 61 78 73 65 74 20 2a 61 78 3b 0a 0a 20 20 69   axset *ax;..  i
1bf30 6e 20 3d 20 74 70 6c 74 5f 6f 70 65 6e 28 6c 65  n = tplt_open(le
1bf40 6d 70 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30  mp);.  if( in==0
1bf50 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 75 74   ) return;.  out
1bf60 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d   = file_open(lem
1bf70 70 2c 22 2e 63 22 2c 22 77 62 22 29 3b 0a 20 20  p,".c","wb");.  
1bf80 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20  if( out==0 ){.  
1bf90 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
1bfa0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1bfb0 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 74 70  lineno = 1;.  tp
1bfc0 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1bfd0 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
1bfe0 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
1bff0 74 65 20 74 68 65 20 69 6e 63 6c 75 64 65 20 63  te the include c
1c000 6f 64 65 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20  ode, if any */. 
1c010 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
1c020 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75  lemp,lemp->inclu
1c030 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 69  de,&lineno);.  i
1c040 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20  f( mhflag ){.   
1c050 20 63 68 61 72 20 2a 6e 61 6d 65 20 3d 20 66 69   char *name = fi
1c060 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70  le_makename(lemp
1c070 2c 20 22 2e 68 22 29 3b 0a 20 20 20 20 66 70 72  , ".h");.    fpr
1c080 69 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63 6c 75  intf(out,"#inclu
1c090 64 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 6e 61  de \"%s\"\n", na
1c0a0 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
1c0b0 20 20 20 66 72 65 65 28 6e 61 6d 65 29 3b 0a 20     free(name);. 
1c0c0 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
1c0d0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1c0e0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1c0f0 20 47 65 6e 65 72 61 74 65 20 23 64 65 66 69 6e   Generate #defin
1c100 65 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e  es for all token
1c110 73 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66 6c 61  s */.  if( mhfla
1c120 67 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  g ){.    const c
1c130 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 20  har *prefix;.   
1c140 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69   fprintf(out,"#i
1c150 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b  f INTERFACE\n");
1c160 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69   lineno++;.    i
1c170 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72  f( lemp->tokenpr
1c180 65 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20  efix ) prefix = 
1c190 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
1c1a0 78 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20  x;.    else     
1c1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c1c0 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20  refix = "";.    
1c1d0 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d  for(i=1; i<lemp-
1c1e0 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29  >nterminal; i++)
1c1f0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1c200 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25  out,"#define %s%
1c210 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66  -30s %2d\n",pref
1c220 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ix,lemp->symbols
1c230 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20  [i]->name,i);.  
1c240 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
1c250 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
1c260 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b  out,"#endif\n");
1c270 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1c280 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1c290 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1c2a0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1c2b0 65 72 61 74 65 20 74 68 65 20 64 65 66 69 6e 65  erate the define
1c2c0 73 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  s */.  fprintf(o
1c2d0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 43 4f  ut,"#define YYCO
1c2e0 44 45 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20  DETYPE %s\n",.  
1c2f0 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74    minimum_size_t
1c300 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79  ype(0, lemp->nsy
1c310 6d 62 6f 6c 2b 31 29 29 3b 20 6c 69 6e 65 6e 6f  mbol+1)); lineno
1c320 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1c330 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 4f 43  t,"#define YYNOC
1c340 4f 44 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e  ODE %d\n",lemp->
1c350 6e 73 79 6d 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e  nsymbol+1);  lin
1c360 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1c370 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1c380 41 43 54 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22  ACTIONTYPE %s\n"
1c390 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69  ,.    minimum_si
1c3a0 7a 65 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d  ze_type(0, lemp-
1c3b0 3e 6e 73 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72  >nstate+lemp->nr
1c3c0 75 6c 65 2b 35 29 29 3b 20 20 6c 69 6e 65 6e 6f  ule+5));  lineno
1c3d0 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  ++;.  if( lemp->
1c3e0 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20  wildcard ){.    
1c3f0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1c400 66 69 6e 65 20 59 59 57 49 4c 44 43 41 52 44 20  fine YYWILDCARD 
1c410 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6c 65  %d\n",.       le
1c420 6d 70 2d 3e 77 69 6c 64 63 61 72 64 2d 3e 69 6e  mp->wildcard->in
1c430 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
1c440 20 20 7d 0a 20 20 70 72 69 6e 74 5f 73 74 61 63    }.  print_stac
1c450 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70  k_union(out,lemp
1c460 2c 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29  ,&lineno,mhflag)
1c470 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1c480 20 22 23 69 66 6e 64 65 66 20 59 59 53 54 41 43   "#ifndef YYSTAC
1c490 4b 44 45 50 54 48 5c 6e 22 29 3b 20 6c 69 6e 65  KDEPTH\n"); line
1c4a0 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70  no++;.  if( lemp
1c4b0 2d 3e 73 74 61 63 6b 73 69 7a 65 20 29 7b 0a 20  ->stacksize ){. 
1c4c0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1c4d0 23 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44  #define YYSTACKD
1c4e0 45 50 54 48 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d  EPTH %s\n",lemp-
1c4f0 3e 73 74 61 63 6b 73 69 7a 65 29 3b 20 20 6c 69  >stacksize);  li
1c500 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  neno++;.  }else{
1c510 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1c520 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54 41 43  ,"#define YYSTAC
1c530 4b 44 45 50 54 48 20 31 30 30 5c 6e 22 29 3b 20  KDEPTH 100\n"); 
1c540 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1c550 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
1c560 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e  endif\n"); linen
1c570 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61  o++;.  if( mhfla
1c580 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  g ){.    fprintf
1c590 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46  (out,"#if INTERF
1c5a0 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ACE\n"); lineno+
1c5b0 2b 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d 20  +;.  }.  name = 
1c5c0 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d  lemp->name ? lem
1c5d0 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65  p->name : "Parse
1c5e0 22 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 61  ";.  if( lemp->a
1c5f0 72 67 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67 5b  rg && lemp->arg[
1c600 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  0] ){.    int i;
1c610 0a 20 20 20 20 69 20 3d 20 6c 65 6d 6f 6e 53 74  .    i = lemonSt
1c620 72 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29 3b  rlen(lemp->arg);
1c630 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31  .    while( i>=1
1c640 20 26 26 20 69 73 73 70 61 63 65 28 6c 65 6d 70   && isspace(lemp
1c650 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 29 20 69 2d  ->arg[i-1]) ) i-
1c660 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e  -;.    while( i>
1c670 3d 31 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 6c  =1 && (isalnum(l
1c680 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 7c  emp->arg[i-1]) |
1c690 7c 20 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d  | lemp->arg[i-1]
1c6a0 3d 3d 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20 20  =='_') ) i--;.  
1c6b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1c6c0 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45  define %sARG_SDE
1c6d0 43 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c  CL %s;\n",name,l
1c6e0 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65  emp->arg);  line
1c6f0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1c700 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1c710 73 41 52 47 5f 50 44 45 43 4c 20 2c 25 73 5c 6e  sARG_PDECL ,%s\n
1c720 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67  ",name,lemp->arg
1c730 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1c740 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1c750 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54  define %sARG_FET
1c760 43 48 20 25 73 20 3d 20 79 79 70 50 61 72 73 65  CH %s = yypParse
1c770 72 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  r->%s\n",.      
1c780 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c             name,
1c790 6c 65 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d  lemp->arg,&lemp-
1c7a0 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e  >arg[i]);  linen
1c7b0 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1c7c0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1c7d0 41 52 47 5f 53 54 4f 52 45 20 79 79 70 50 61 72  ARG_STORE yypPar
1c7e0 73 65 72 2d 3e 25 73 20 3d 20 25 73 5c 6e 22 2c  ser->%s = %s\n",
1c7f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c800 20 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72    name,&lemp->ar
1c810 67 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b  g[i],&lemp->arg[
1c820 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i]);  lineno++;.
1c830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
1c840 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1c850 65 20 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e 22  e %sARG_SDECL\n"
1c860 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ,name);  lineno+
1c870 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
1c880 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
1c890 47 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29  G_PDECL\n",name)
1c8a0 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1c8b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1c8c0 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43  efine %sARG_FETC
1c8d0 48 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65  H\n",name); line
1c8e0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1c8f0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1c900 73 41 52 47 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61  sARG_STORE\n",na
1c910 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
1c920 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20   }.  if( mhflag 
1c930 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1c940 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20  ut,"#endif\n"); 
1c950 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1c960 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1c970 66 69 6e 65 20 59 59 4e 53 54 41 54 45 20 25 64  fine YYNSTATE %d
1c980 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  \n",lemp->nstate
1c990 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1c9a0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1c9b0 66 69 6e 65 20 59 59 4e 52 55 4c 45 20 25 64 5c  fine YYNRULE %d\
1c9c0 6e 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b  n",lemp->nrule);
1c9d0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66    lineno++;.  if
1c9e0 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e  ( lemp->errsym->
1c9f0 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20 66 70  useCnt ){.    fp
1ca00 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1ca10 6e 65 20 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c  ne YYERRORSYMBOL
1ca20 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72   %d\n",lemp->err
1ca30 73 79 6d 2d 3e 69 6e 64 65 78 29 3b 20 20 6c 69  sym->index);  li
1ca40 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1ca50 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1ca60 20 59 59 45 52 52 53 59 4d 44 54 20 79 79 25 64   YYERRSYMDT yy%d
1ca70 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  \n",lemp->errsym
1ca80 2d 3e 64 74 6e 75 6d 29 3b 20 20 6c 69 6e 65 6e  ->dtnum);  linen
1ca90 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  o++;.  }.  if( l
1caa0 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63  emp->has_fallbac
1cab0 6b 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  k ){.    fprintf
1cac0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1cad0 46 41 4c 4c 42 41 43 4b 20 31 5c 6e 22 29 3b 20  FALLBACK 1\n"); 
1cae0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1caf0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1cb00 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1cb10 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1cb20 65 72 61 74 65 20 74 68 65 20 61 63 74 69 6f 6e  erate the action
1cb30 20 74 61 62 6c 65 20 61 6e 64 20 69 74 73 20 61   table and its a
1cb40 73 73 6f 63 69 61 74 65 73 3a 0a 20 20 2a 2a 0a  ssociates:.  **.
1cb50 20 20 2a 2a 20 20 79 79 5f 61 63 74 69 6f 6e 5b    **  yy_action[
1cb60 5d 20 20 20 20 20 20 20 20 41 20 73 69 6e 67 6c  ]        A singl
1cb70 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  e table containi
1cb80 6e 67 20 61 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a  ng all actions..
1cb90 20 20 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61 68 65    **  yy_lookahe
1cba0 61 64 5b 5d 20 20 20 20 20 41 20 74 61 62 6c 65  ad[]     A table
1cbb0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1cbc0 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 65 61  lookahead for ea
1cbd0 63 68 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a  ch entry in.  **
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbf0 20 20 20 20 20 79 79 5f 61 63 74 69 6f 6e 2e 20       yy_action. 
1cc00 20 55 73 65 64 20 74 6f 20 64 65 74 65 63 74 20   Used to detect 
1cc10 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e  hash collisions.
1cc20 0a 20 20 2a 2a 20 20 79 79 5f 73 68 69 66 74 5f  .  **  yy_shift_
1cc30 6f 66 73 74 5b 5d 20 20 20 20 46 6f 72 20 65 61  ofst[]    For ea
1cc40 63 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66  ch state, the of
1cc50 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74  fset into yy_act
1cc60 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20  ion for.  **    
1cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc80 20 73 68 69 66 74 69 6e 67 20 74 65 72 6d 69 6e   shifting termin
1cc90 61 6c 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 72 65  als..  **  yy_re
1cca0 64 75 63 65 5f 6f 66 73 74 5b 5d 20 20 20 46 6f  duce_ofst[]   Fo
1ccb0 72 20 65 61 63 68 20 73 74 61 74 65 2c 20 74 68  r each state, th
1ccc0 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79  e offset into yy
1ccd0 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a  _action for.  **
1cce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccf0 20 20 20 20 20 73 68 69 66 74 69 6e 67 20 6e 6f       shifting no
1cd00 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 61 66 74 65  n-terminals afte
1cd10 72 20 61 20 72 65 64 75 63 65 2e 0a 20 20 2a 2a  r a reduce..  **
1cd20 20 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 20    yy_default[]  
1cd30 20 20 20 20 20 44 65 66 61 75 6c 74 20 61 63 74       Default act
1cd40 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 73 74 61  ion for each sta
1cd50 74 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 43  te..  */..  /* C
1cd60 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74 69 6f  ompute the actio
1cd70 6e 73 20 6f 6e 20 61 6c 6c 20 73 74 61 74 65 73  ns on all states
1cd80 20 61 6e 64 20 63 6f 75 6e 74 20 74 68 65 6d 20   and count them 
1cd90 75 70 20 2a 2f 0a 20 20 61 78 20 3d 20 28 73 74  up */.  ax = (st
1cda0 72 75 63 74 20 61 78 73 65 74 20 2a 29 20 63 61  ruct axset *) ca
1cdb0 6c 6c 6f 63 28 6c 65 6d 70 2d 3e 6e 73 74 61 74  lloc(lemp->nstat
1cdc0 65 2a 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30  e*2, sizeof(ax[0
1cdd0 5d 29 29 3b 0a 20 20 69 66 28 20 61 78 3d 3d 30  ]));.  if( ax==0
1cde0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1cdf0 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66  stderr,"malloc f
1ce00 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 65  ailed\n");.    e
1ce10 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f  xit(1);.  }.  fo
1ce20 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1ce30 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
1ce40 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
1ce50 74 65 64 5b 69 5d 3b 0a 20 20 20 20 61 78 5b 69  ted[i];.    ax[i
1ce60 2a 32 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20  *2].stp = stp;. 
1ce70 20 20 20 61 78 5b 69 2a 32 5d 2e 69 73 54 6b 6e     ax[i*2].isTkn
1ce80 20 3d 20 31 3b 0a 20 20 20 20 61 78 5b 69 2a 32   = 1;.    ax[i*2
1ce90 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d  ].nAction = stp-
1cea0 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20 61 78  >nTknAct;.    ax
1ceb0 5b 69 2a 32 2b 31 5d 2e 73 74 70 20 3d 20 73 74  [i*2+1].stp = st
1cec0 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d  p;.    ax[i*2+1]
1ced0 2e 69 73 54 6b 6e 20 3d 20 30 3b 0a 20 20 20 20  .isTkn = 0;.    
1cee0 61 78 5b 69 2a 32 2b 31 5d 2e 6e 41 63 74 69 6f  ax[i*2+1].nActio
1cef0 6e 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 3b  n = stp->nNtAct;
1cf00 0a 20 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66 73 74  .  }.  mxTknOfst
1cf10 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 30   = mnTknOfst = 0
1cf20 3b 0a 20 20 6d 78 4e 74 4f 66 73 74 20 3d 20 6d  ;.  mxNtOfst = m
1cf30 6e 4e 74 4f 66 73 74 20 3d 20 30 3b 0a 0a 20 20  nNtOfst = 0;..  
1cf40 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61  /* Compute the a
1cf50 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20 49 6e  ction table.  In
1cf60 20 6f 72 64 65 72 20 74 6f 20 74 72 79 20 74 6f   order to try to
1cf70 20 6b 65 65 70 20 74 68 65 20 73 69 7a 65 20 6f   keep the size o
1cf80 66 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 69 6f  f the.  ** actio
1cf90 6e 20 74 61 62 6c 65 20 74 6f 20 61 20 6d 69 6e  n table to a min
1cfa0 69 6d 75 6d 2c 20 74 68 65 20 68 65 75 72 69 73  imum, the heuris
1cfb0 74 69 63 20 6f 66 20 70 6c 61 63 69 6e 67 20 74  tic of placing t
1cfc0 68 65 20 6c 61 72 67 65 73 74 20 61 63 74 69 6f  he largest actio
1cfd0 6e 0a 20 20 2a 2a 20 73 65 74 73 20 66 69 72 73  n.  ** sets firs
1cfe0 74 20 69 73 20 75 73 65 64 2e 0a 20 20 2a 2f 0a  t is used..  */.
1cff0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1d000 70 2d 3e 6e 73 74 61 74 65 2a 32 3b 20 69 2b 2b  p->nstate*2; i++
1d010 29 20 61 78 5b 69 5d 2e 69 4f 72 64 65 72 20 3d  ) ax[i].iOrder =
1d020 20 69 3b 0a 20 20 71 73 6f 72 74 28 61 78 2c 20   i;.  qsort(ax, 
1d030 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 2c 20  lemp->nstate*2, 
1d040 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 2c 20 61  sizeof(ax[0]), a
1d050 78 73 65 74 5f 63 6f 6d 70 61 72 65 29 3b 0a 20  xset_compare);. 
1d060 20 70 41 63 74 74 61 62 20 3d 20 61 63 74 74 61   pActtab = actta
1d070 62 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72  b_alloc();.  for
1d080 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1d090 74 61 74 65 2a 32 20 26 26 20 61 78 5b 69 5d 2e  tate*2 && ax[i].
1d0a0 6e 41 63 74 69 6f 6e 3e 30 3b 20 69 2b 2b 29 7b  nAction>0; i++){
1d0b0 0a 20 20 20 20 73 74 70 20 3d 20 61 78 5b 69 5d  .    stp = ax[i]
1d0c0 2e 73 74 70 3b 0a 20 20 20 20 69 66 28 20 61 78  .stp;.    if( ax
1d0d0 5b 69 5d 2e 69 73 54 6b 6e 20 29 7b 0a 20 20 20  [i].isTkn ){.   
1d0e0 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
1d0f0 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
1d100 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  xt){.        int
1d110 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20   action;.       
1d120 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64   if( ap->sp->ind
1d130 65 78 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ex>=lemp->ntermi
1d140 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  nal ) continue;.
1d150 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 20 3d          action =
1d160 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28   compute_action(
1d170 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20  lemp, ap);.     
1d180 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20     if( action<0 
1d190 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1d1a0 20 20 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f      acttab_actio
1d1b0 6e 28 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73  n(pActtab, ap->s
1d1c0 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e  p->index, action
1d1d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d1e0 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d   stp->iTknOfst =
1d1f0 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70   acttab_insert(p
1d200 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20 20 69  Acttab);.      i
1d210 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74  f( stp->iTknOfst
1d220 3c 6d 6e 54 6b 6e 4f 66 73 74 20 29 20 6d 6e 54  <mnTknOfst ) mnT
1d230 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54  knOfst = stp->iT
1d240 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66  knOfst;.      if
1d250 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3e  ( stp->iTknOfst>
1d260 6d 78 54 6b 6e 4f 66 73 74 20 29 20 6d 78 54 6b  mxTknOfst ) mxTk
1d270 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b  nOfst = stp->iTk
1d280 6e 4f 66 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65  nOfst;.    }else
1d290 7b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73  {.      for(ap=s
1d2a0 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  tp->ap; ap; ap=a
1d2b0 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
1d2c0 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20    int action;.  
1d2d0 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70        if( ap->sp
1d2e0 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74  ->index<lemp->nt
1d2f0 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e  erminal ) contin
1d300 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
1d310 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c  ap->sp->index==l
1d320 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 20 63  emp->nsymbol ) c
1d330 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1d340 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74   action = comput
1d350 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61  e_action(lemp, a
1d360 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
1d370 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69  action<0 ) conti
1d380 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74  nue;.        act
1d390 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74  tab_action(pActt
1d3a0 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  ab, ap->sp->inde
1d3b0 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20  x, action);.    
1d3c0 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69    }.      stp->i
1d3d0 4e 74 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f  NtOfst = acttab_
1d3e0 69 6e 73 65 72 74 28 70 41 63 74 74 61 62 29 3b  insert(pActtab);
1d3f0 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e  .      if( stp->
1d400 69 4e 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66 73 74  iNtOfst<mnNtOfst
1d410 20 29 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 73 74   ) mnNtOfst = st
1d420 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20  p->iNtOfst;.    
1d430 20 20 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66    if( stp->iNtOf
1d440 73 74 3e 6d 78 4e 74 4f 66 73 74 20 29 20 6d 78  st>mxNtOfst ) mx
1d450 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e  NtOfst = stp->iN
1d460 74 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  tOfst;.    }.  }
1d470 0a 20 20 66 72 65 65 28 61 78 29 3b 0a 0a 20 20  .  free(ax);..  
1d480 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79  /* Output the yy
1d490 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f  _action table */
1d4a0 0a 20 20 6e 20 3d 20 61 63 74 74 61 62 5f 73 69  .  n = acttab_si
1d4b0 7a 65 28 70 41 63 74 74 61 62 29 3b 0a 20 20 66  ze(pActtab);.  f
1d4c0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1d4d0 69 6e 65 20 59 59 5f 41 43 54 54 41 42 5f 43 4f  ine YY_ACTTAB_CO
1d4e0 55 4e 54 20 28 25 64 29 5c 6e 22 2c 20 6e 29 3b  UNT (%d)\n", n);
1d4f0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1d500 69 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63  intf(out,"static
1d510 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e 54   const YYACTIONT
1d520 59 50 45 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20  YPE yy_action[] 
1d530 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  = {\n"); lineno+
1d540 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  +;.  for(i=j=0; 
1d550 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
1d560 6e 74 20 61 63 74 69 6f 6e 20 3d 20 61 63 74 74  nt action = actt
1d570 61 62 5f 79 79 61 63 74 69 6f 6e 28 70 41 63 74  ab_yyaction(pAct
1d580 74 61 62 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  tab, i);.    if(
1d590 20 61 63 74 69 6f 6e 3c 30 20 29 20 61 63 74 69   action<0 ) acti
1d5a0 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  on = lemp->nstat
1d5b0 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20  e + lemp->nrule 
1d5c0 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  + 2;.    if( j==
1d5d0 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
1d5e0 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
1d5f0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1d600 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 61 63 74  ut, " %4d,", act
1d610 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d  ion);.    if( j=
1d620 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
1d630 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1d640 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
1d650 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
1d660 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d670 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
1d680 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1d690 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
1d6a0 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  +;..  /* Output 
1d6b0 74 68 65 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64  the yy_lookahead
1d6c0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69   table */.  fpri
1d6d0 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63 20  ntf(out,"static 
1d6e0 63 6f 6e 73 74 20 59 59 43 4f 44 45 54 59 50 45  const YYCODETYPE
1d6f0 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20   yy_lookahead[] 
1d700 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  = {\n"); lineno+
1d710 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  +;.  for(i=j=0; 
1d720 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
1d730 6e 74 20 6c 61 20 3d 20 61 63 74 74 61 62 5f 79  nt la = acttab_y
1d740 79 6c 6f 6f 6b 61 68 65 61 64 28 70 41 63 74 74  ylookahead(pActt
1d750 61 62 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ab, i);.    if( 
1d760 6c 61 3c 30 20 29 20 6c 61 20 3d 20 6c 65 6d 70  la<0 ) la = lemp
1d770 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a 20 20 20 20 69  ->nsymbol;.    i
1d780 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74  f( j==0 ) fprint
1d790 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a  f(out," /* %5d *
1d7a0 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72  / ", i);.    fpr
1d7b0 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c  intf(out, " %4d,
1d7c0 22 2c 20 6c 61 29 3b 0a 20 20 20 20 69 66 28 20  ", la);.    if( 
1d7d0 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29  j==9 || i==n-1 )
1d7e0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1d7f0 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65  out, "\n"); line
1d800 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20  no++;.      j = 
1d810 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1d820 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      j++;.    }. 
1d830 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
1d840 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  , "};\n"); linen
1d850 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  o++;..  /* Outpu
1d860 74 20 74 68 65 20 79 79 5f 73 68 69 66 74 5f 6f  t the yy_shift_o
1d870 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20  fst[] table */. 
1d880 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
1d890 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f  define YY_SHIFT_
1d8a0 55 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22  USE_DFLT (%d)\n"
1d8b0 2c 20 6d 6e 54 6b 6e 4f 66 73 74 2d 31 29 3b 20  , mnTknOfst-1); 
1d8c0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20  lineno++;.  n = 
1d8d0 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20  lemp->nstate;.  
1d8e0 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65  while( n>0 && le
1d8f0 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d  mp->sorted[n-1]-
1d900 3e 69 54 6b 6e 4f 66 73 74 3d 3d 4e 4f 5f 4f 46  >iTknOfst==NO_OF
1d910 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70  FSET ) n--;.  fp
1d920 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
1d930 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 43 4f 55  ine YY_SHIFT_COU
1d940 4e 54 20 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29  NT (%d)\n", n-1)
1d950 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1d960 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
1d970 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d 49 4e  ine YY_SHIFT_MIN
1d980 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b     (%d)\n", mnTk
1d990 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  nOfst); lineno++
1d9a0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1d9b0 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49   "#define YY_SHI
1d9c0 46 54 5f 4d 41 58 20 20 20 28 25 64 29 5c 6e 22  FT_MAX   (%d)\n"
1d9d0 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 3b 20 6c 69  , mxTknOfst); li
1d9e0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1d9f0 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63  f(out, "static c
1da00 6f 6e 73 74 20 25 73 20 79 79 5f 73 68 69 66 74  onst %s yy_shift
1da10 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20  _ofst[] = {\n", 
1da20 0a 20 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d  .          minim
1da30 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 54  um_size_type(mnT
1da40 6b 6e 4f 66 73 74 2d 31 2c 20 6d 78 54 6b 6e 4f  knOfst-1, mxTknO
1da50 66 73 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  fst)); lineno++;
1da60 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
1da70 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; i++){.    int
1da80 20 6f 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d   ofst;.    stp =
1da90 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
1daa0 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70  ;.    ofst = stp
1dab0 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20  ->iTknOfst;.    
1dac0 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46  if( ofst==NO_OFF
1dad0 53 45 54 20 29 20 6f 66 73 74 20 3d 20 6d 6e 54  SET ) ofst = mnT
1dae0 6b 6e 4f 66 73 74 20 2d 20 31 3b 0a 20 20 20 20  knOfst - 1;.    
1daf0 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e  if( j==0 ) fprin
1db00 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20  tf(out," /* %5d 
1db10 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70  */ ", i);.    fp
1db20 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64  rintf(out, " %4d
1db30 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ,", ofst);.    i
1db40 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d  f( j==9 || i==n-
1db50 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  1 ){.      fprin
1db60 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c  tf(out, "\n"); l
1db70 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a  ineno++;.      j
1db80 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1db90 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
1dba0 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  }.  }.  fprintf(
1dbb0 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69  out, "};\n"); li
1dbc0 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75  neno++;..  /* Ou
1dbd0 74 70 75 74 20 74 68 65 20 79 79 5f 72 65 64 75  tput the yy_redu
1dbe0 63 65 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20  ce_ofst[] table 
1dbf0 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
1dc00 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45  , "#define YY_RE
1dc10 44 55 43 45 5f 55 53 45 5f 44 46 4c 54 20 28 25  DUCE_USE_DFLT (%
1dc20 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73 74 2d  d)\n", mnNtOfst-
1dc30 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  1); lineno++;.  
1dc40 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  n = lemp->nstate
1dc50 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  ;.  while( n>0 &
1dc60 26 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e  & lemp->sorted[n
1dc70 2d 31 5d 2d 3e 69 4e 74 4f 66 73 74 3d 3d 4e 4f  -1]->iNtOfst==NO
1dc80 5f 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20  _OFFSET ) n--;. 
1dc90 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
1dca0 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45  define YY_REDUCE
1dcb0 5f 43 4f 55 4e 54 20 28 25 64 29 5c 6e 22 2c 20  _COUNT (%d)\n", 
1dcc0 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  n-1); lineno++;.
1dcd0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1dce0 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43  #define YY_REDUC
1dcf0 45 5f 4d 49 4e 20 20 20 28 25 64 29 5c 6e 22 2c  E_MIN   (%d)\n",
1dd00 20 6d 6e 4e 74 4f 66 73 74 29 3b 20 6c 69 6e 65   mnNtOfst); line
1dd10 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1dd20 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59  out, "#define YY
1dd30 5f 52 45 44 55 43 45 5f 4d 41 58 20 20 20 28 25  _REDUCE_MAX   (%
1dd40 64 29 5c 6e 22 2c 20 6d 78 4e 74 4f 66 73 74 29  d)\n", mxNtOfst)
1dd50 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1dd60 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74  rintf(out, "stat
1dd70 69 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f 72  ic const %s yy_r
1dd80 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 3d 20 7b  educe_ofst[] = {
1dd90 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
1dda0 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
1ddb0 65 28 6d 6e 4e 74 4f 66 73 74 2d 31 2c 20 6d 78  e(mnNtOfst-1, mx
1ddc0 4e 74 4f 66 73 74 29 29 3b 20 6c 69 6e 65 6e 6f  NtOfst)); lineno
1ddd0 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ++;.  for(i=j=0;
1dde0 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
1ddf0 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 73 74  int ofst;.    st
1de00 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
1de10 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20  [i];.    ofst = 
1de20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20  stp->iNtOfst;.  
1de30 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f    if( ofst==NO_O
1de40 46 46 53 45 54 20 29 20 6f 66 73 74 20 3d 20 6d  FFSET ) ofst = m
1de50 6e 4e 74 4f 66 73 74 20 2d 20 31 3b 0a 20 20 20  nNtOfst - 1;.   
1de60 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69   if( j==0 ) fpri
1de70 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64  ntf(out," /* %5d
1de80 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66   */ ", i);.    f
1de90 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34  printf(out, " %4
1dea0 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20  d,", ofst);.    
1deb0 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e  if( j==9 || i==n
1dec0 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  -1 ){.      fpri
1ded0 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20  ntf(out, "\n"); 
1dee0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
1def0 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  j = 0;.    }else
1df00 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
1df10 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
1df20 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c  (out, "};\n"); l
1df30 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f  ineno++;..  /* O
1df40 75 74 70 75 74 20 74 68 65 20 64 65 66 61 75 6c  utput the defaul
1df50 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a  t action table *
1df60 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  /.  fprintf(out,
1df70 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59   "static const Y
1df80 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 64  YACTIONTYPE yy_d
1df90 65 66 61 75 6c 74 5b 5d 20 3d 20 7b 5c 6e 22 29  efault[] = {\n")
1dfa0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20  ; lineno++;.  n 
1dfb0 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a  = lemp->nstate;.
1dfc0 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
1dfd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
1dfe0 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
1dff0 5d 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20  ];.    if( j==0 
1e000 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20  ) fprintf(out," 
1e010 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b  /* %5d */ ", i);
1e020 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1e030 2c 20 22 20 25 34 64 2c 22 2c 20 73 74 70 2d 3e  , " %4d,", stp->
1e040 69 44 66 6c 74 29 3b 0a 20 20 20 20 69 66 28 20  iDflt);.    if( 
1e050 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29  j==9 || i==n-1 )
1e060 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1e070 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65  out, "\n"); line
1e080 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20  no++;.      j = 
1e090 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1e0a0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      j++;.    }. 
1e0b0 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
1e0c0 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  , "};\n"); linen
1e0d0 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  o++;.  tplt_xfer
1e0e0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1e0f0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1e100 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
1e110 74 61 62 6c 65 20 6f 66 20 66 61 6c 6c 62 61 63  table of fallbac
1e120 6b 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20  k tokens..  */. 
1e130 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66   if( lemp->has_f
1e140 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 69  allback ){.    i
1e150 6e 74 20 6d 78 20 3d 20 6c 65 6d 70 2d 3e 6e 74  nt mx = lemp->nt
1e160 65 72 6d 69 6e 61 6c 20 2d 20 31 3b 0a 20 20 20  erminal - 1;.   
1e170 20 77 68 69 6c 65 28 20 6d 78 3e 30 20 26 26 20   while( mx>0 && 
1e180 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6d 78  lemp->symbols[mx
1e190 5d 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29  ]->fallback==0 )
1e1a0 7b 20 6d 78 2d 2d 3b 20 7d 0a 20 20 20 20 66 6f  { mx--; }.    fo
1e1b0 72 28 69 3d 30 3b 20 69 3c 3d 6d 78 3b 20 69 2b  r(i=0; i<=mx; i+
1e1c0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1e1d0 20 73 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c 65 6d   symbol *p = lem
1e1e0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
1e1f0 20 20 20 20 20 69 66 28 20 70 2d 3e 66 61 6c 6c       if( p->fall
1e200 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  back==0 ){.     
1e210 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1e220 22 20 20 20 20 30 2c 20 20 2f 2a 20 25 31 30 73  "    0,  /* %10s
1e230 20 3d 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f 5c 6e   => nothing */\n
1e240 22 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  ", p->name);.   
1e250 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e260 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1e270 20 20 25 33 64 2c 20 20 2f 2a 20 25 31 30 73 20    %3d,  /* %10s 
1e280 3d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 20 70 2d 3e  => %s */\n", p->
1e290 66 61 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65 78 2c  fallback->index,
1e2a0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 61  .          p->na
1e2b0 6d 65 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d  me, p->fallback-
1e2c0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  >name);.      }.
1e2d0 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a        lineno++;.
1e2e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74 70 6c 74      }.  }.  tplt
1e2f0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1e300 2c 20 69 6e 2c 20 6f 75 74 2c 20 26 6c 69 6e 65  , in, out, &line
1e310 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1e320 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74  ate a table cont
1e330 61 69 6e 69 6e 67 20 74 68 65 20 73 79 6d 62 6f  aining the symbo
1e340 6c 69 63 20 6e 61 6d 65 20 6f 66 20 65 76 65 72  lic name of ever
1e350 79 20 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a 20 20  y symbol.  */.  
1e360 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1e370 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
1e380 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74      lemon_sprint
1e390 66 28 6c 69 6e 65 2c 22 5c 22 25 73 5c 22 2c 22  f(line,"\"%s\","
1e3a0 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
1e3b0 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66 70  ]->name);.    fp
1e3c0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 2d 31  rintf(out,"  %-1
1e3d0 35 73 22 2c 6c 69 6e 65 29 3b 0a 20 20 20 20 69  5s",line);.    i
1e3e0 66 28 20 28 69 26 33 29 3d 3d 33 20 29 7b 20 66  f( (i&3)==3 ){ f
1e3f0 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29  printf(out,"\n")
1e400 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20  ; lineno++; }.  
1e410 7d 0a 20 20 69 66 28 20 28 69 26 33 29 21 3d 30  }.  if( (i&3)!=0
1e420 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c   ){ fprintf(out,
1e430 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1e440 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
1e450 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1e460 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1e470 20 47 65 6e 65 72 61 74 65 20 61 20 74 61 62 6c   Generate a tabl
1e480 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74  e containing a t
1e490 65 78 74 20 73 74 72 69 6e 67 20 74 68 61 74 20  ext string that 
1e4a0 64 65 73 63 72 69 62 65 73 20 65 76 65 72 79 0a  describes every.
1e4b0 20 20 2a 2a 20 72 75 6c 65 20 69 6e 20 74 68 65    ** rule in the
1e4c0 20 72 75 6c 65 20 73 65 74 20 6f 66 20 74 68 65   rule set of the
1e4d0 20 67 72 61 6d 6d 61 72 2e 20 20 54 68 69 73 20   grammar.  This 
1e4e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
1e4f0 73 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 72  sed.  ** when tr
1e500 61 63 69 6e 67 20 52 45 44 55 43 45 20 61 63 74  acing REDUCE act
1e510 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
1e520 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 70 2d 3e 72  (i=0, rp=lemp->r
1e530 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
1e540 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  next, i++){.    
1e550 61 73 73 65 72 74 28 20 72 70 2d 3e 69 6e 64 65  assert( rp->inde
1e560 78 3d 3d 69 20 29 3b 0a 20 20 20 20 66 70 72 69  x==i );.    fpri
1e570 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 33 64  ntf(out," /* %3d
1e580 20 2a 2f 20 5c 22 22 2c 20 69 29 3b 0a 20 20 20   */ \"", i);.   
1e590 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f   writeRuleText(o
1e5a0 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72  ut, rp);.    fpr
1e5b0 69 6e 74 66 28 6f 75 74 2c 22 5c 22 2c 5c 6e 22  intf(out,"\",\n"
1e5c0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1e5d0 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1e5e0 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1e5f0 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1e600 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
1e610 63 68 20 65 78 65 63 75 74 65 73 20 65 76 65 72  ch executes ever
1e620 79 20 74 69 6d 65 20 61 20 73 79 6d 62 6f 6c 20  y time a symbol 
1e630 69 73 20 70 6f 70 70 65 64 20 66 72 6f 6d 0a 20  is popped from. 
1e640 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 20 77 68   ** the stack wh
1e650 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 65  ile processing e
1e660 72 72 6f 72 73 20 6f 72 20 77 68 69 6c 65 20 64  rrors or while d
1e670 65 73 74 72 6f 79 69 6e 67 20 74 68 65 20 70 61  estroying the pa
1e680 72 73 65 72 2e 20 0a 20 20 2a 2a 20 28 49 6e 20  rser. .  ** (In 
1e690 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 67 65 6e  other words, gen
1e6a0 65 72 61 74 65 20 74 68 65 20 25 64 65 73 74 72  erate the %destr
1e6b0 75 63 74 6f 72 20 61 63 74 69 6f 6e 73 29 0a 20  uctor actions). 
1e6c0 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
1e6d0 74 6f 6b 65 6e 64 65 73 74 20 29 7b 0a 20 20 20  tokendest ){.   
1e6e0 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20   int once = 1;. 
1e6f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65     for(i=0; i<le
1e700 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
1e710 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1e720 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
1e730 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
1e740 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c       if( sp==0 |
1e750 7c 20 73 70 2d 3e 74 79 70 65 21 3d 54 45 52 4d  | sp->type!=TERM
1e760 49 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  INAL ) continue;
1e770 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20  .      if( once 
1e780 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1e790 74 66 28 6f 75 74 2c 20 22 20 20 20 20 20 20 2f  tf(out, "      /
1e7a0 2a 20 54 45 52 4d 49 4e 41 4c 20 44 65 73 74 72  * TERMINAL Destr
1e7b0 75 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b 20 6c 69  uctor */\n"); li
1e7c0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
1e7d0 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  once = 0;.      
1e7e0 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
1e7f0 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64  out,"    case %d
1e800 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73  : /* %s */\n", s
1e810 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61  p->index, sp->na
1e820 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
1e830 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
1e840 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
1e850 6c 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  l && lemp->symbo
1e860 6c 73 5b 69 5d 2d 3e 74 79 70 65 21 3d 54 45 52  ls[i]->type!=TER
1e870 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20 20 20  MINAL; i++);.   
1e880 20 69 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79   if( i<lemp->nsy
1e890 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 65 6d  mbol ){.      em
1e8a0 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
1e8b0 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d  de(out,lemp->sym
1e8c0 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69  bols[i],lemp,&li
1e8d0 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70 72  neno);.      fpr
1e8e0 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
1e8f0 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65  break;\n"); line
1e900 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  no++;.    }.  }.
1e910 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64    if( lemp->vard
1e920 65 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  est ){.    struc
1e930 74 20 73 79 6d 62 6f 6c 20 2a 64 66 6c 74 5f 73  t symbol *dflt_s
1e940 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6f  p = 0;.    int o
1e950 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72  nce = 1;.    for
1e960 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1e970 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
1e980 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
1e990 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d   *sp = lemp->sym
1e9a0 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69  bols[i];.      i
1e9b0 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e  f( sp==0 || sp->
1e9c0 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c  type==TERMINAL |
1e9d0 7c 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e  |.          sp->
1e9e0 69 6e 64 65 78 3c 3d 30 20 7c 7c 20 73 70 2d 3e  index<=0 || sp->
1e9f0 64 65 73 74 72 75 63 74 6f 72 21 3d 30 20 29 20  destructor!=0 ) 
1ea00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1ea10 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20  if( once ){.    
1ea20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1ea30 20 22 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75   "      /* Defau
1ea40 6c 74 20 4e 4f 4e 2d 54 45 52 4d 49 4e 41 4c 20  lt NON-TERMINAL 
1ea50 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22  Destructor */\n"
1ea60 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1ea70 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
1ea80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
1ea90 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61  intf(out,"    ca
1eaa0 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c  se %d: /* %s */\
1eab0 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73  n", sp->index, s
1eac0 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  p->name); lineno
1ead0 2b 2b 3b 0a 20 20 20 20 20 20 64 66 6c 74 5f 73  ++;.      dflt_s
1eae0 70 20 3d 20 73 70 3b 0a 20 20 20 20 7d 0a 20 20  p = sp;.    }.  
1eaf0 20 20 69 66 28 20 64 66 6c 74 5f 73 70 21 3d 30    if( dflt_sp!=0
1eb00 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64   ){.      emit_d
1eb10 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f  estructor_code(o
1eb20 75 74 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d 70 2c  ut,dflt_sp,lemp,
1eb30 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 7d 0a  &lineno);.    }.
1eb40 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1eb50 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22  "      break;\n"
1eb60 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1eb70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
1eb80 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
1eb90 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79  ){.    struct sy
1eba0 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d  mbol *sp = lemp-
1ebb0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
1ebc0 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70   if( sp==0 || sp
1ebd0 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
1ebe0 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74   || sp->destruct
1ebf0 6f 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  or==0 ) continue
1ec00 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1ec10 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 20  t,"    case %d: 
1ec20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d  /* %s */\n", sp-
1ec30 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65  >index, sp->name
1ec40 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
1ec50 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 64 75 70    /* Combine dup
1ec60 6c 69 63 61 74 65 20 64 65 73 74 72 75 63 74 6f  licate destructo
1ec70 72 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  rs into a single
1ec80 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 66 6f 72   case */.    for
1ec90 28 6a 3d 69 2b 31 3b 20 6a 3c 6c 65 6d 70 2d 3e  (j=i+1; j<lemp->
1eca0 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nsymbol; j++){. 
1ecb0 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
1ecc0 6f 6c 20 2a 73 70 32 20 3d 20 6c 65 6d 70 2d 3e  ol *sp2 = lemp->
1ecd0 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20  symbols[j];.    
1ece0 20 20 69 66 28 20 73 70 32 20 26 26 20 73 70 32    if( sp2 && sp2
1ecf0 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c  ->type!=TERMINAL
1ed00 20 26 26 20 73 70 32 2d 3e 64 65 73 74 72 75 63   && sp2->destruc
1ed10 74 6f 72 0a 20 20 20 20 20 20 20 20 20 20 26 26  tor.          &&
1ed20 20 73 70 32 2d 3e 64 74 6e 75 6d 3d 3d 73 70 2d   sp2->dtnum==sp-
1ed30 3e 64 74 6e 75 6d 0a 20 20 20 20 20 20 20 20 20  >dtnum.         
1ed40 20 26 26 20 73 74 72 63 6d 70 28 73 70 2d 3e 64   && strcmp(sp->d
1ed50 65 73 74 72 75 63 74 6f 72 2c 73 70 32 2d 3e 64  estructor,sp2->d
1ed60 65 73 74 72 75 63 74 6f 72 29 3d 3d 30 20 29 7b  estructor)==0 ){
1ed70 0a 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  .         fprint
1ed80 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20  f(out,"    case 
1ed90 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c  %d: /* %s */\n",
1eda0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1edb0 20 20 73 70 32 2d 3e 69 6e 64 65 78 2c 20 73 70    sp2->index, sp
1edc0 32 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  2->name); lineno
1edd0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 73 70 32  ++;.         sp2
1ede0 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 3d 20 30  ->destructor = 0
1edf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ee00 0a 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75  .    emit_destru
1ee10 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65  ctor_code(out,le
1ee20 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c  mp->symbols[i],l
1ee30 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  emp,&lineno);.  
1ee40 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1ee50 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b       break;\n");
1ee60 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1ee70 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1ee80 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1ee90 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1eea0 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
1eeb0 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 65 76   executes whenev
1eec0 65 72 20 74 68 65 20 70 61 72 73 65 72 20 73 74  er the parser st
1eed0 61 63 6b 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f  ack overflows */
1eee0 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
1eef0 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 6f 76 65  t,lemp,lemp->ove
1ef00 72 66 6c 6f 77 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  rflow,&lineno);.
1ef10 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1ef20 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1ef30 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1ef40 6e 65 72 61 74 65 20 74 68 65 20 74 61 62 6c 65  nerate the table
1ef50 20 6f 66 20 72 75 6c 65 20 69 6e 66 6f 72 6d 61   of rule informa
1ef60 74 69 6f 6e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tion .  **.  ** 
1ef70 4e 6f 74 65 3a 20 54 68 69 73 20 63 6f 64 65 20  Note: This code 
1ef80 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
1ef90 61 63 74 20 74 68 61 74 20 72 75 6c 65 73 20 61  act that rules a
1efa0 72 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73  re number.  ** s
1efb0 65 71 75 65 6e 74 75 61 6c 6c 79 20 62 65 67 69  equentually begi
1efc0 6e 6e 69 6e 67 20 77 69 74 68 20 30 2e 0a 20 20  nning with 0..  
1efd0 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
1efe0 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
1eff0 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 66 70  p->next){.    fp
1f000 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 7b 20 25  rintf(out,"  { %
1f010 64 2c 20 25 64 20 7d 2c 5c 6e 22 2c 72 70 2d 3e  d, %d },\n",rp->
1f020 6c 68 73 2d 3e 69 6e 64 65 78 2c 72 70 2d 3e 6e  lhs->index,rp->n
1f030 72 68 73 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  rhs); lineno++;.
1f040 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
1f050 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1f060 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1f070 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1f080 77 68 69 63 68 20 65 78 65 63 75 74 69 6f 6e 20  which execution 
1f090 64 75 72 69 6e 67 20 65 61 63 68 20 52 45 44 55  during each REDU
1f0a0 43 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 66  CE action */.  f
1f0b0 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
1f0c0 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
1f0d0 74 29 7b 0a 20 20 20 20 74 72 61 6e 73 6c 61 74  t){.    translat
1f0e0 65 5f 63 6f 64 65 28 6c 65 6d 70 2c 20 72 70 29  e_code(lemp, rp)
1f0f0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 69 72 73 74  ;.  }.  /* First
1f100 20 6f 75 74 70 75 74 20 72 75 6c 65 73 20 6f 74   output rules ot
1f110 68 65 72 20 74 68 61 6e 20 74 68 65 20 64 65 66  her than the def
1f120 61 75 6c 74 3a 20 72 75 6c 65 20 2a 2f 0a 20 20  ault: rule */.  
1f130 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
1f140 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
1f150 78 74 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  xt){.    struct 
1f160 72 75 6c 65 20 2a 72 70 32 3b 20 20 20 20 20 20  rule *rp2;      
1f170 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 74 68 65           /* Othe
1f180 72 20 72 75 6c 65 73 20 77 69 74 68 20 74 68 65  r rules with the
1f190 20 73 61 6d 65 20 61 63 74 69 6f 6e 20 2a 2f 0a   same action */.
1f1a0 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65      if( rp->code
1f1b0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1f1c0 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65      if( rp->code
1f1d0 5b 30 5d 3d 3d 27 5c 6e 27 20 26 26 20 72 70 2d  [0]=='\n' && rp-
1f1e0 3e 63 6f 64 65 5b 31 5d 3d 3d 30 20 29 20 63 6f  >code[1]==0 ) co
1f1f0 6e 74 69 6e 75 65 3b 20 2f 2a 20 57 69 6c 6c 20  ntinue; /* Will 
1f200 62 65 20 64 65 66 61 75 6c 74 3a 20 2a 2f 0a 20  be default: */. 
1f210 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1f220 20 20 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f        case %d: /
1f230 2a 20 22 2c 20 72 70 2d 3e 69 6e 64 65 78 29 3b  * ", rp->index);
1f240 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54 65  .    writeRuleTe
1f250 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20  xt(out, rp);.   
1f260 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
1f270 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  */\n"); lineno++
1f280 3b 0a 20 20 20 20 66 6f 72 28 72 70 32 3d 72 70  ;.    for(rp2=rp
1f290 2d 3e 6e 65 78 74 3b 20 72 70 32 3b 20 72 70 32  ->next; rp2; rp2
1f2a0 3d 72 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =rp2->next){.   
1f2b0 20 20 20 69 66 28 20 72 70 32 2d 3e 63 6f 64 65     if( rp2->code
1f2c0 3d 3d 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20  ==rp->code ){.  
1f2d0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1f2e0 74 2c 22 20 20 20 20 20 20 63 61 73 65 20 25 64  t,"      case %d
1f2f0 3a 20 2f 2a 20 22 2c 20 72 70 32 2d 3e 69 6e 64  : /* ", rp2->ind
1f300 65 78 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69  ex);.        wri
1f310 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20  teRuleText(out, 
1f320 72 70 32 29 3b 0a 20 20 20 20 20 20 20 20 66 70  rp2);.        fp
1f330 72 69 6e 74 66 28 6f 75 74 2c 22 20 2a 2f 20 79  rintf(out," */ y
1f340 79 74 65 73 74 63 61 73 65 28 79 79 72 75 6c 65  ytestcase(yyrule
1f350 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72 70 32  no==%d);\n", rp2
1f360 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f  ->index); lineno
1f370 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 70 32 2d  ++;.        rp2-
1f380 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  >code = 0;.     
1f390 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6d 69   }.    }.    emi
1f3a0 74 5f 63 6f 64 65 28 6f 75 74 2c 72 70 2c 6c 65  t_code(out,rp,le
1f3b0 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  mp,&lineno);.   
1f3c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1f3d0 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29        break;\n")
1f3e0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1f3f0 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20  rp->code = 0;.  
1f400 7d 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20  }.  /* Finally, 
1f410 6f 75 74 70 75 74 20 74 68 65 20 64 65 66 61 75  output the defau
1f420 6c 74 3a 20 72 75 6c 65 2e 20 20 57 65 20 63 68  lt: rule.  We ch
1f430 6f 6f 73 65 20 61 73 20 74 68 65 20 64 65 66 61  oose as the defa
1f440 75 6c 74 3a 20 61 6c 6c 0a 20 20 2a 2a 20 65 6d  ult: all.  ** em
1f450 70 74 79 20 61 63 74 69 6f 6e 73 2e 20 2a 2f 0a  pty actions. */.
1f460 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1f470 20 20 20 20 20 64 65 66 61 75 6c 74 3a 5c 6e 22       default:\n"
1f480 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1f490 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
1f4a0 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
1f4b0 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  t){.    if( rp->
1f4c0 63 6f 64 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  code==0 ) contin
1f4d0 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
1f4e0 72 70 2d 3e 63 6f 64 65 5b 30 5d 3d 3d 27 5c 6e  rp->code[0]=='\n
1f4f0 27 20 26 26 20 72 70 2d 3e 63 6f 64 65 5b 31 5d  ' && rp->code[1]
1f500 3d 3d 30 20 29 3b 0a 20 20 20 20 66 70 72 69 6e  ==0 );.    fprin
1f510 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 2f 2a  tf(out,"      /*
1f520 20 28 25 64 29 20 22 2c 20 72 70 2d 3e 69 6e 64   (%d) ", rp->ind
1f530 65 78 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75  ex);.    writeRu
1f540 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b  leText(out, rp);
1f550 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1f560 2c 20 22 20 2a 2f 20 79 79 74 65 73 74 63 61 73  , " */ yytestcas
1f570 65 28 79 79 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b  e(yyruleno==%d);
1f580 5c 6e 22 2c 20 72 70 2d 3e 69 6e 64 65 78 29 3b  \n", rp->index);
1f590 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1f5a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1f5b0 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29        break;\n")
1f5c0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70  ; lineno++;.  tp
1f5d0 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1f5e0 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
1f5f0 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
1f600 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78  te code which ex
1f610 65 63 75 74 65 73 20 69 66 20 61 20 70 61 72 73  ecutes if a pars
1f620 65 20 66 61 69 6c 73 20 2a 2f 0a 20 20 74 70 6c  e fails */.  tpl
1f630 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
1f640 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75 72 65 2c 26  ,lemp->failure,&
1f650 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f  lineno);.  tplt_
1f660 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1f670 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1f680 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1f690 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
1f6a0 74 65 73 20 77 68 65 6e 20 61 20 73 79 6e 74 61  tes when a synta
1f6b0 78 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a  x error occurs *
1f6c0 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  /.  tplt_print(o
1f6d0 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 72  ut,lemp,lemp->er
1f6e0 72 6f 72 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  ror,&lineno);.  
1f6f0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1f700 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1f710 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1f720 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
1f730 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 74 68  executes when th
1f740 65 20 70 61 72 73 65 72 20 61 63 63 65 70 74 73  e parser accepts
1f750 20 69 74 73 20 69 6e 70 75 74 20 2a 2f 0a 20 20   its input */.  
1f760 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
1f770 65 6d 70 2c 6c 65 6d 70 2d 3e 61 63 63 65 70 74  emp,lemp->accept
1f780 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c  ,&lineno);.  tpl
1f790 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1f7a0 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1f7b0 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20  );..  /* Append 
1f7c0 61 6e 79 20 61 64 64 69 74 69 6f 6e 20 63 6f 64  any addition cod
1f7d0 65 20 74 68 65 20 75 73 65 72 20 64 65 73 69 72  e the user desir
1f7e0 65 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  es */.  tplt_pri
1f7f0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1f800 2d 3e 65 78 74 72 61 63 6f 64 65 2c 26 6c 69 6e  ->extracode,&lin
1f810 65 6e 6f 29 3b 0a 0a 20 20 66 63 6c 6f 73 65 28  eno);..  fclose(
1f820 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 6f 75  in);.  fclose(ou
1f830 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  t);.  return;.}.
1f840 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  ./* Generate a h
1f850 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20 74  eader file for t
1f860 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69  he parser */.voi
1f870 64 20 52 65 70 6f 72 74 48 65 61 64 65 72 28 73  d ReportHeader(s
1f880 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
1f890 70 29 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74  p).{.  FILE *out
1f8a0 2c 20 2a 69 6e 3b 0a 20 20 63 6f 6e 73 74 20 63  , *in;.  const c
1f8b0 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 63  har *prefix;.  c
1f8c0 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a  har line[LINESIZ
1f8d0 45 5d 3b 0a 20 20 63 68 61 72 20 70 61 74 74 65  E];.  char patte
1f8e0 72 6e 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20  rn[LINESIZE];.  
1f8f0 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6c 65  int i;..  if( le
1f900 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20  mp->tokenprefix 
1f910 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d  ) prefix = lemp-
1f920 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20  >tokenprefix;.  
1f930 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
1f940 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d          prefix =
1f950 20 22 22 3b 0a 20 20 69 6e 20 3d 20 66 69 6c 65   "";.  in = file
1f960 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c  _open(lemp,".h",
1f970 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 20  "rb");.  if( in 
1f980 29 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 43  ){.    int nextC
1f990 68 61 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  har;.    for(i=1
1f9a0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; i<lemp->ntermi
1f9b0 6e 61 6c 20 26 26 20 66 67 65 74 73 28 6c 69 6e  nal && fgets(lin
1f9c0 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 3b 20  e,LINESIZE,in); 
1f9d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6c 65 6d 6f  i++){.      lemo
1f9e0 6e 5f 73 70 72 69 6e 74 66 28 70 61 74 74 65 72  n_sprintf(patter
1f9f0 6e 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33  n,"#define %s%-3
1fa00 30 73 20 25 33 64 5c 6e 22 2c 0a 20 20 20 20 20  0s %3d\n",.     
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1fa20 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62  refix,lemp->symb
1fa30 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b  ols[i]->name,i);
1fa40 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
1fa50 70 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e 29 20  p(line,pattern) 
1fa60 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
1fa70 20 20 20 6e 65 78 74 43 68 61 72 20 3d 20 66 67     nextChar = fg
1fa80 65 74 63 28 69 6e 29 3b 0a 20 20 20 20 66 63 6c  etc(in);.    fcl
1fa90 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 69 66 28  ose(in);.    if(
1faa0 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69   i==lemp->ntermi
1fab0 6e 61 6c 20 26 26 20 6e 65 78 74 43 68 61 72 3d  nal && nextChar=
1fac0 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 2f 2a  =EOF ){.      /*
1fad0 20 4e 6f 20 63 68 61 6e 67 65 20 69 6e 20 74 68   No change in th
1fae0 65 20 66 69 6c 65 2e 20 20 44 6f 6e 27 74 20 72  e file.  Don't r
1faf0 65 77 72 69 74 65 20 69 74 2e 20 2a 2f 0a 20 20  ewrite it. */.  
1fb00 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1fb10 7d 0a 20 20 7d 0a 20 20 6f 75 74 20 3d 20 66 69  }.  }.  out = fi
1fb20 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68  le_open(lemp,".h
1fb30 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 6f  ","wb");.  if( o
1fb40 75 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ut ){.    for(i=
1fb50 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  1; i<lemp->nterm
1fb60 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  inal; i++){.    
1fb70 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1fb80 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25  define %s%-30s %
1fb90 33 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d  3d\n",prefix,lem
1fba0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
1fbb0 61 6d 65 2c 69 29 3b 0a 20 20 20 20 7d 0a 20 20  ame,i);.    }.  
1fbc0 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 20 20    fclose(out);  
1fbd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
1fbe0 0a 0a 2f 2a 20 52 65 64 75 63 65 20 74 68 65 20  ../* Reduce the 
1fbf0 73 69 7a 65 20 6f 66 20 74 68 65 20 61 63 74 69  size of the acti
1fc00 6f 6e 20 74 61 62 6c 65 73 2c 20 69 66 20 70 6f  on tables, if po
1fc10 73 73 69 62 6c 65 2c 20 62 79 20 6d 61 6b 69 6e  ssible, by makin
1fc20 67 20 75 73 65 0a 2a 2a 20 6f 66 20 64 65 66 61  g use.** of defa
1fc30 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ults..**.** In t
1fc40 68 69 73 20 76 65 72 73 69 6f 6e 2c 20 77 65 20  his version, we 
1fc50 74 61 6b 65 20 74 68 65 20 6d 6f 73 74 20 66 72  take the most fr
1fc60 65 71 75 65 6e 74 20 52 45 44 55 43 45 20 61 63  equent REDUCE ac
1fc70 74 69 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a  tion and make.**
1fc80 20 69 74 20 74 68 65 20 64 65 66 61 75 6c 74 2e   it the default.
1fc90 20 20 45 78 63 65 70 74 2c 20 74 68 65 72 65 20    Except, there 
1fca0 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 69 66  is no default if
1fcb0 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 74 6f   the wildcard to
1fcc0 6b 65 6e 0a 2a 2a 20 69 73 20 61 20 70 6f 73 73  ken.** is a poss
1fcd0 69 62 6c 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 2e  ible look-ahead.
1fce0 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73  .*/.void Compres
1fcf0 73 54 61 62 6c 65 73 28 73 74 72 75 63 74 20 6c  sTables(struct l
1fd00 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
1fd10 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
1fd20 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  p;.  struct acti
1fd30 6f 6e 20 2a 61 70 2c 20 2a 61 70 32 3b 0a 20 20  on *ap, *ap2;.  
1fd40 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c  struct rule *rp,
1fd50 20 2a 72 70 32 2c 20 2a 72 62 65 73 74 3b 0a 20   *rp2, *rbest;. 
1fd60 20 69 6e 74 20 6e 62 65 73 74 2c 20 6e 3b 0a 20   int nbest, n;. 
1fd70 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 75 73   int i;.  int us
1fd80 65 73 57 69 6c 64 63 61 72 64 3b 0a 0a 20 20 66  esWildcard;..  f
1fd90 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1fda0 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
1fdb0 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
1fdc0 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6e 62 65  rted[i];.    nbe
1fdd0 73 74 20 3d 20 30 3b 0a 20 20 20 20 72 62 65 73  st = 0;.    rbes
1fde0 74 20 3d 20 30 3b 0a 20 20 20 20 75 73 65 73 57  t = 0;.    usesW
1fdf0 69 6c 64 63 61 72 64 20 3d 20 30 3b 0a 0a 20 20  ildcard = 0;..  
1fe00 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
1fe10 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
1fe20 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70  t){.      if( ap
1fe30 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26 26  ->type==SHIFT &&
1fe40 20 61 70 2d 3e 73 70 3d 3d 6c 65 6d 70 2d 3e 77   ap->sp==lemp->w
1fe50 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20 20  ildcard ){.     
1fe60 20 20 20 75 73 65 73 57 69 6c 64 63 61 72 64 20     usesWildcard 
1fe70 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1fe80 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 21     if( ap->type!
1fe90 3d 52 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e  =REDUCE ) contin
1fea0 75 65 3b 0a 20 20 20 20 20 20 72 70 20 3d 20 61  ue;.      rp = a
1feb0 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 69  p->x.rp;.      i
1fec0 66 28 20 72 70 2d 3e 6c 68 73 53 74 61 72 74 20  f( rp->lhsStart 
1fed0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1fee0 20 20 69 66 28 20 72 70 3d 3d 72 62 65 73 74 20    if( rp==rbest 
1fef0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1ff00 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66    n = 1;.      f
1ff10 6f 72 28 61 70 32 3d 61 70 2d 3e 6e 65 78 74 3b  or(ap2=ap->next;
1ff20 20 61 70 32 3b 20 61 70 32 3d 61 70 32 2d 3e 6e   ap2; ap2=ap2->n
1ff30 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ext){.        if
1ff40 28 20 61 70 32 2d 3e 74 79 70 65 21 3d 52 45 44  ( ap2->type!=RED
1ff50 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UCE ) continue;.
1ff60 20 20 20 20 20 20 20 20 72 70 32 20 3d 20 61 70          rp2 = ap
1ff70 32 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 20  2->x.rp;.       
1ff80 20 69 66 28 20 72 70 32 3d 3d 72 62 65 73 74 20   if( rp2==rbest 
1ff90 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1ffa0 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72 70 20      if( rp2==rp 
1ffb0 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ) n++;.      }. 
1ffc0 20 20 20 20 20 69 66 28 20 6e 3e 6e 62 65 73 74       if( n>nbest
1ffd0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 62 65 73   ){.        nbes
1ffe0 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 72  t = n;.        r
1fff0 62 65 73 74 20 3d 20 72 70 3b 0a 20 20 20 20 20  best = rp;.     
20000 20 7d 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f   }.    }. .    /
20010 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b 65 20 61 20  * Do not make a 
20020 64 65 66 61 75 6c 74 20 69 66 20 74 68 65 20 6e  default if the n
20030 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73 20 74  umber of rules t
20040 6f 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  o default.    **
20050 20 69 73 20 6e 6f 74 20 61 74 20 6c 65 61 73 74   is not at least
20060 20 31 20 6f 72 20 69 66 20 74 68 65 20 77 69 6c   1 or if the wil
20070 64 63 61 72 64 20 74 6f 6b 65 6e 20 69 73 20 61  dcard token is a
20080 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a   possible.    **
20090 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20   lookahead..    
200a0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 62 65 73 74  */.    if( nbest
200b0 3c 31 20 7c 7c 20 75 73 65 73 57 69 6c 64 63 61  <1 || usesWildca
200c0 72 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  rd ) continue;..
200d0 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20  .    /* Combine 
200e0 6d 61 74 63 68 69 6e 67 20 52 45 44 55 43 45 20  matching REDUCE 
200f0 61 63 74 69 6f 6e 73 20 69 6e 74 6f 20 61 20 73  actions into a s
20100 69 6e 67 6c 65 20 64 65 66 61 75 6c 74 20 2a 2f  ingle default */
20110 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
20120 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
20130 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
20140 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43   ap->type==REDUC
20150 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72  E && ap->x.rp==r
20160 62 65 73 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  best ) break;.  
20170 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
20180 61 70 20 29 3b 0a 20 20 20 20 61 70 2d 3e 73 70  ap );.    ap->sp
20190 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b   = Symbol_new("{
201a0 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 20 20  default}");.    
201b0 66 6f 72 28 61 70 3d 61 70 2d 3e 6e 65 78 74 3b  for(ap=ap->next;
201c0 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
201d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d  ){.      if( ap-
201e0 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26  >type==REDUCE &&
201f0 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74   ap->x.rp==rbest
20200 20 29 20 61 70 2d 3e 74 79 70 65 20 3d 20 4e 4f   ) ap->type = NO
20210 54 5f 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20  T_USED;.    }.  
20220 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63 74 69    stp->ap = Acti
20230 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70 29  on_sort(stp->ap)
20240 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
20250 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 61 74  Compare two stat
20260 65 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70  es for sorting p
20270 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20 73 6d  urposes.  The sm
20280 61 6c 6c 65 72 20 73 74 61 74 65 20 69 73 20 74  aller state is t
20290 68 65 0a 2a 2a 20 6f 6e 65 20 77 69 74 68 20 74  he.** one with t
202a0 68 65 20 6d 6f 73 74 20 6e 6f 6e 2d 74 65 72 6d  he most non-term
202b0 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2e 20 20 49  inal actions.  I
202c0 66 20 74 68 65 79 20 68 61 76 65 20 74 68 65 20  f they have the 
202d0 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f  same number.** o
202e0 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61  f non-terminal a
202f0 63 74 69 6f 6e 73 2c 20 74 68 65 6e 20 74 68 65  ctions, then the
20300 20 73 6d 61 6c 6c 65 72 20 69 73 20 74 68 65 20   smaller is the 
20310 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 6f 73  one with the mos
20320 74 0a 2a 2a 20 74 6f 6b 65 6e 20 61 63 74 69 6f  t.** token actio
20330 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
20340 74 20 73 74 61 74 65 52 65 73 6f 72 74 43 6f 6d  t stateResortCom
20350 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20  pare(const void 
20360 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  *a, const void *
20370 62 29 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  b){.  const stru
20380 63 74 20 73 74 61 74 65 20 2a 70 41 20 3d 20 2a  ct state *pA = *
20390 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74  (const struct st
203a0 61 74 65 2a 2a 29 61 3b 0a 20 20 63 6f 6e 73 74  ate**)a;.  const
203b0 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 70   struct state *p
203c0 42 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75  B = *(const stru
203d0 63 74 20 73 74 61 74 65 2a 2a 29 62 3b 0a 20 20  ct state**)b;.  
203e0 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70 42  int n;..  n = pB
203f0 2d 3e 6e 4e 74 41 63 74 20 2d 20 70 41 2d 3e 6e  ->nNtAct - pA->n
20400 4e 74 41 63 74 3b 0a 20 20 69 66 28 20 6e 3d 3d  NtAct;.  if( n==
20410 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 42 2d  0 ){.    n = pB-
20420 3e 6e 54 6b 6e 41 63 74 20 2d 20 70 41 2d 3e 6e  >nTknAct - pA->n
20430 54 6b 6e 41 63 74 3b 0a 20 20 20 20 69 66 28 20  TknAct;.    if( 
20440 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 20  n==0 ){.      n 
20450 3d 20 70 42 2d 3e 73 74 61 74 65 6e 75 6d 20 2d  = pB->statenum -
20460 20 70 41 2d 3e 73 74 61 74 65 6e 75 6d 3b 0a 20   pA->statenum;. 
20470 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
20480 74 28 20 6e 21 3d 30 20 29 3b 0a 20 20 72 65 74  t( n!=0 );.  ret
20490 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
204a0 20 52 65 6e 75 6d 62 65 72 20 61 6e 64 20 72 65   Renumber and re
204b0 73 6f 72 74 20 73 74 61 74 65 73 20 73 6f 20 74  sort states so t
204c0 68 61 74 20 73 74 61 74 65 73 20 77 69 74 68 20  hat states with 
204d0 66 65 77 65 72 20 63 68 6f 69 63 65 73 0a 2a 2a  fewer choices.**
204e0 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e   occur at the en
204f0 64 2e 20 20 45 78 63 65 70 74 2c 20 6b 65 65 70  d.  Except, keep
20500 20 73 74 61 74 65 20 30 20 61 73 20 74 68 65 20   state 0 as the 
20510 66 69 72 73 74 20 73 74 61 74 65 2e 0a 2a 2f 0a  first state..*/.
20520 76 6f 69 64 20 52 65 73 6f 72 74 53 74 61 74 65  void ResortState
20530 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
20540 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  lemp).{.  int i;
20550 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
20560 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61  *stp;.  struct a
20570 63 74 69 6f 6e 20 2a 61 70 3b 0a 0a 20 20 66 6f  ction *ap;..  fo
20580 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
20590 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
205a0 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
205b0 74 65 64 5b 69 5d 3b 0a 20 20 20 20 73 74 70 2d  ted[i];.    stp-
205c0 3e 6e 54 6b 6e 41 63 74 20 3d 20 73 74 70 2d 3e  >nTknAct = stp->
205d0 6e 4e 74 41 63 74 20 3d 20 30 3b 0a 20 20 20 20  nNtAct = 0;.    
205e0 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 6c 65 6d  stp->iDflt = lem
205f0 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70  p->nstate + lemp
20600 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20 20 73 74 70  ->nrule;.    stp
20610 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 4e 4f 5f  ->iTknOfst = NO_
20620 4f 46 46 53 45 54 3b 0a 20 20 20 20 73 74 70 2d  OFFSET;.    stp-
20630 3e 69 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46  >iNtOfst = NO_OF
20640 46 53 45 54 3b 0a 20 20 20 20 66 6f 72 28 61 70  FSET;.    for(ap
20650 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
20660 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
20670 20 20 69 66 28 20 63 6f 6d 70 75 74 65 5f 61 63    if( compute_ac
20680 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 3e 3d 30  tion(lemp,ap)>=0
20690 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
206a0 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65  ap->sp->index<le
206b0 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b  mp->nterminal ){
206c0 0a 20 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e  .          stp->
206d0 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20 20 20 20 20  nTknAct++;.     
206e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70 2d     }else if( ap-
206f0 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d  >sp->index<lemp-
20700 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20  >nsymbol ){.    
20710 20 20 20 20 20 20 73 74 70 2d 3e 6e 4e 74 41 63        stp->nNtAc
20720 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t++;.        }el
20730 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  se{.          st
20740 70 2d 3e 69 44 66 6c 74 20 3d 20 63 6f 6d 70 75  p->iDflt = compu
20750 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20  te_action(lemp, 
20760 61 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ap);.        }. 
20770 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
20780 0a 20 20 71 73 6f 72 74 28 26 6c 65 6d 70 2d 3e  .  qsort(&lemp->
20790 73 6f 72 74 65 64 5b 31 5d 2c 20 6c 65 6d 70 2d  sorted[1], lemp-
207a0 3e 6e 73 74 61 74 65 2d 31 2c 20 73 69 7a 65 6f  >nstate-1, sizeo
207b0 66 28 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30  f(lemp->sorted[0
207c0 5d 29 2c 0a 20 20 20 20 20 20 20 20 73 74 61 74  ]),.        stat
207d0 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 29 3b  eResortCompare);
207e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
207f0 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
20800 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 6f 72 74  {.    lemp->sort
20810 65 64 5b 69 5d 2d 3e 73 74 61 74 65 6e 75 6d 20  ed[i]->statenum 
20820 3d 20 69 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a  = i;.  }.}.../**
20830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
20840 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73  From the file "s
20850 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  et.c" **********
20860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
20880 2a 20 53 65 74 20 6d 61 6e 69 70 75 6c 61 74 69  * Set manipulati
20890 6f 6e 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  on routines for 
208a0 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
208b0 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
208c0 73 74 61 74 69 63 20 69 6e 74 20 73 69 7a 65 20  static int size 
208d0 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74 20 74 68 65  = 0;../* Set the
208e0 20 73 65 74 20 73 69 7a 65 20 2a 2f 0a 76 6f 69   set size */.voi
208f0 64 20 53 65 74 53 69 7a 65 28 69 6e 74 20 6e 29  d SetSize(int n)
20900 0a 7b 0a 20 20 73 69 7a 65 20 3d 20 6e 2b 31 3b  .{.  size = n+1;
20910 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  .}../* Allocate 
20920 61 20 6e 65 77 20 73 65 74 20 2a 2f 0a 63 68 61  a new set */.cha
20930 72 20 2a 53 65 74 4e 65 77 28 29 7b 0a 20 20 63  r *SetNew(){.  c
20940 68 61 72 20 2a 73 3b 0a 20 20 73 20 3d 20 28 63  har *s;.  s = (c
20950 68 61 72 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a  har*)calloc( siz
20960 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73 3d 3d  e, 1);.  if( s==
20970 30 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  0 ){.    extern 
20980 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  void memory_erro
20990 72 28 29 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f  r();.    memory_
209a0 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72  error();.  }.  r
209b0 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44  eturn s;.}../* D
209c0 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65 74 20  eallocate a set 
209d0 2a 2f 0a 76 6f 69 64 20 53 65 74 46 72 65 65 28  */.void SetFree(
209e0 63 68 61 72 20 2a 73 29 0a 7b 0a 20 20 66 72 65  char *s).{.  fre
209f0 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20  e(s);.}../* Add 
20a00 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
20a10 20 74 68 65 20 73 65 74 2e 20 20 52 65 74 75 72   the set.  Retur
20a20 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 65 6c  n TRUE if the el
20a30 65 6d 65 6e 74 20 77 61 73 20 61 64 64 65 64 0a  ement was added.
20a40 2a 2a 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20  ** and FALSE if 
20a50 69 74 20 77 61 73 20 61 6c 72 65 61 64 79 20 74  it was already t
20a60 68 65 72 65 2e 20 2a 2f 0a 69 6e 74 20 53 65 74  here. */.int Set
20a70 41 64 64 28 63 68 61 72 20 2a 73 2c 20 69 6e 74  Add(char *s, int
20a80 20 65 29 0a 7b 0a 20 20 69 6e 74 20 72 76 3b 0a   e).{.  int rv;.
20a90 20 20 61 73 73 65 72 74 28 20 65 3e 3d 30 20 26    assert( e>=0 &
20aa0 26 20 65 3c 73 69 7a 65 20 29 3b 0a 20 20 72 76  & e<size );.  rv
20ab0 20 3d 20 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20   = s[e];.  s[e] 
20ac0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 21 72  = 1;.  return !r
20ad0 76 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 65 76 65  v;.}../* Add eve
20ae0 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 73 32  ry element of s2
20af0 20 74 6f 20 73 31 2e 20 20 52 65 74 75 72 6e 20   to s1.  Return 
20b00 54 52 55 45 20 69 66 20 73 31 20 63 68 61 6e 67  TRUE if s1 chang
20b10 65 73 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e  es. */.int SetUn
20b20 69 6f 6e 28 63 68 61 72 20 2a 73 31 2c 20 63 68  ion(char *s1, ch
20b30 61 72 20 2a 73 32 29 0a 7b 0a 20 20 69 6e 74 20  ar *s2).{.  int 
20b40 69 2c 20 70 72 6f 67 72 65 73 73 3b 0a 20 20 70  i, progress;.  p
20b50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 66  rogress = 0;.  f
20b60 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20  or(i=0; i<size; 
20b70 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 32  i++){.    if( s2
20b80 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
20b90 65 3b 0a 20 20 20 20 69 66 28 20 73 31 5b 69 5d  e;.    if( s1[i]
20ba0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f  ==0 ){.      pro
20bb0 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20  gress = 1;.     
20bc0 20 73 31 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20   s1[i] = 1;.    
20bd0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
20be0 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a  rogress;.}./****
20bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20c00 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
20c10 20 22 74 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a 2a   "table.c" *****
20c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20c30 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41  *******/./*.** A
20c40 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20  ll code in this 
20c50 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75  file has been au
20c60 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65  tomatically gene
20c70 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20  rated.** from a 
20c80 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e  specification in
20c90 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20   the file.**    
20ca0 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
20cb0 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73  .q".** by the as
20cc0 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
20cd0 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72  code building pr
20ce0 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a  ogram "aagen"..*
20cf0 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68  * Do not edit th
20d00 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61  is file!  Instea
20d10 64 2c 20 65 64 69 74 20 74 68 65 20 73 70 65 63  d, edit the spec
20d20 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c  ification.** fil
20d30 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61  e, then rerun aa
20d40 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f  gen..*/./*.** Co
20d50 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  de for processin
20d60 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  g tables in the 
20d70 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
20d80 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49 56  erator..*/..PRIV
20d90 41 54 45 20 75 6e 73 69 67 6e 65 64 20 73 74 72  ATE unsigned str
20da0 68 61 73 68 28 63 6f 6e 73 74 20 63 68 61 72 20  hash(const char 
20db0 2a 78 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64  *x).{.  unsigned
20dc0 20 68 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   h = 0;.  while(
20dd0 20 2a 78 20 29 20 68 20 3d 20 68 2a 31 33 20 2b   *x ) h = h*13 +
20de0 20 2a 28 78 2b 2b 29 3b 0a 20 20 72 65 74 75 72   *(x++);.  retur
20df0 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b 73  n h;.}../* Works
20e00 20 6c 69 6b 65 20 73 74 72 64 75 70 2c 20 73 6f   like strdup, so
20e10 72 74 20 6f 66 2e 20 20 53 61 76 65 20 61 20 73  rt of.  Save a s
20e20 74 72 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f 63 65  tring in malloce
20e30 64 20 6d 65 6d 6f 72 79 2c 20 62 75 74 0a 2a 2a  d memory, but.**
20e40 20 6b 65 65 70 20 73 74 72 69 6e 67 73 20 69 6e   keep strings in
20e50 20 61 20 74 61 62 6c 65 20 73 6f 20 74 68 61 74   a table so that
20e60 20 74 68 65 20 73 61 6d 65 20 73 74 72 69 6e 67   the same string
20e70 20 69 73 20 6e 6f 74 20 69 6e 20 6d 6f 72 65 0a   is not in more.
20e80 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 70 6c 61 63  ** than one plac
20e90 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
20ea0 20 2a 53 74 72 73 61 66 65 28 63 6f 6e 73 74 20   *Strsafe(const 
20eb0 63 68 61 72 20 2a 79 29 0a 7b 0a 20 20 63 6f 6e  char *y).{.  con
20ec0 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68  st char *z;.  ch
20ed0 61 72 20 2a 63 70 79 3b 0a 0a 20 20 69 66 28 20  ar *cpy;..  if( 
20ee0 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
20ef0 0a 20 20 7a 20 3d 20 53 74 72 73 61 66 65 5f 66  .  z = Strsafe_f
20f00 69 6e 64 28 79 29 3b 0a 20 20 69 66 28 20 7a 3d  ind(y);.  if( z=
20f10 3d 30 20 26 26 20 28 63 70 79 3d 28 63 68 61 72  =0 && (cpy=(char
20f20 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e   *)malloc( lemon
20f30 53 74 72 6c 65 6e 28 79 29 2b 31 20 29 29 21 3d  Strlen(y)+1 ))!=
20f40 30 20 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73  0 ){.    lemon_s
20f50 74 72 63 70 79 28 63 70 79 2c 79 29 3b 0a 20 20  trcpy(cpy,y);.  
20f60 20 20 7a 20 3d 20 63 70 79 3b 0a 20 20 20 20 53    z = cpy;.    S
20f70 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28 7a 29  trsafe_insert(z)
20f80 3b 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72 79 43 68  ;.  }.  MemoryCh
20f90 65 63 6b 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  eck(z);.  return
20fa0 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20   z;.}../* There 
20fb0 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
20fc0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
20fd0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
20fe0 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69  ach.** associati
20ff0 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
21000 20 22 78 31 22 2e 0a 2a 2f 0a 73 74 72 75 63 74   "x1"..*/.struct
21010 20 73 5f 78 31 20 7b 0a 20 20 69 6e 74 20 73 69   s_x1 {.  int si
21020 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
21030 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
21040 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  of available slo
21050 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
21060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21070 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20   /*   Must be a 
21080 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74  power of 2 great
21090 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20  er than or */.  
210a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210b0 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75          /*   equ
210c0 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74  al to 1 */.  int
210d0 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20   count;         
210e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
210f0 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74  f currently slot
21100 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74  s filled */.  st
21110 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 74  ruct s_x1node *t
21120 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  bl;  /* The data
21130 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
21140 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64    struct s_x1nod
21150 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68  e **ht;  /* Hash
21160 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75   table for looku
21170 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ps */.};../* The
21180 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
21190 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
211a0 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64  ture for every d
211b0 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ata element.** i
211c0 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65  n an associative
211d0 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
211e0 78 31 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  x1"..*/.typedef 
211f0 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20  struct s_x1node 
21200 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
21210 64 61 74 61 3b 20 20 20 20 20 20 20 20 2f 2a 20  data;        /* 
21220 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74  The data */.  st
21230 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 6e  ruct s_x1node *n
21240 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65  ext;   /* Next e
21250 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
21260 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72  me hash */.  str
21270 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 66  uct s_x1node **f
21280 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75  rom;  /* Previou
21290 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e 6f  s link */.} x1no
212a0 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  de;../* There is
212b0 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e   only one instan
212c0 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c  ce of the array,
212d0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f   which is the fo
212e0 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69  llowing */.stati
212f0 63 20 73 74 72 75 63 74 20 73 5f 78 31 20 2a 78  c struct s_x1 *x
21300 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  1a;../* Allocate
21310 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69   a new associati
21320 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64  ve array */.void
21330 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29 7b   Strsafe_init(){
21340 0a 20 20 69 66 28 20 78 31 61 20 29 20 72 65 74  .  if( x1a ) ret
21350 75 72 6e 3b 0a 20 20 78 31 61 20 3d 20 28 73 74  urn;.  x1a = (st
21360 72 75 63 74 20 73 5f 78 31 2a 29 6d 61 6c 6c 6f  ruct s_x1*)mallo
21370 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  c( sizeof(struct
21380 20 73 5f 78 31 29 20 29 3b 0a 20 20 69 66 28 20   s_x1) );.  if( 
21390 78 31 61 20 29 7b 0a 20 20 20 20 78 31 61 2d 3e  x1a ){.    x1a->
213a0 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
213b0 20 78 31 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b   x1a->count = 0;
213c0 0a 20 20 20 20 78 31 61 2d 3e 74 62 6c 20 3d 20  .    x1a->tbl = 
213d0 28 78 31 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28  (x1node*)calloc(
213e0 31 30 32 34 2c 20 73 69 7a 65 6f 66 28 78 31 6e  1024, sizeof(x1n
213f0 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 31  ode) + sizeof(x1
21400 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28  node*));.    if(
21410 20 78 31 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a   x1a->tbl==0 ){.
21420 20 20 20 20 20 20 66 72 65 65 28 78 31 61 29 3b        free(x1a);
21430 0a 20 20 20 20 20 20 78 31 61 20 3d 20 30 3b 0a  .      x1a = 0;.
21440 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21450 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 31   int i;.      x1
21460 61 2d 3e 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a  a->ht = (x1node*
21470 2a 29 26 28 78 31 61 2d 3e 74 62 6c 5b 31 30 32  *)&(x1a->tbl[102
21480 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  4]);.      for(i
21490 3d 30 3b 20 69 3c 31 30 32 34 3b 20 69 2b 2b 29  =0; i<1024; i++)
214a0 20 78 31 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b   x1a->ht[i] = 0;
214b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20  .    }.  }.}./* 
214c0 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
214d0 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72  ord into the arr
214e0 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ay.  Return TRUE
214f0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
21500 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69  ** Prior data wi
21510 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
21520 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74  is NOT overwritt
21530 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 72 73 61 66  en */.int Strsaf
21540 65 5f 69 6e 73 65 72 74 28 63 6f 6e 73 74 20 63  e_insert(const c
21550 68 61 72 20 2a 64 61 74 61 29 0a 7b 0a 20 20 78  har *data).{.  x
21560 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73  1node *np;.  uns
21570 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e 73 69 67  igned h;.  unsig
21580 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66 28 20 78  ned ph;..  if( x
21590 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  1a==0 ) return 0
215a0 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73 68  ;.  ph = strhash
215b0 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68  (data);.  h = ph
215c0 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29   & (x1a->size-1)
215d0 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74  ;.  np = x1a->ht
215e0 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
215f0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
21600 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61  mp(np->data,data
21610 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
21620 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   An existing ent
21630 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
21640 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a   key is found. *
21650 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20  /.      /* Fail 
21660 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74  because overwrit
21670 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e  e is not allows.
21680 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
21690 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70   0;.    }.    np
216a0 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
216b0 0a 20 20 69 66 28 20 78 31 61 2d 3e 63 6f 75 6e  .  if( x1a->coun
216c0 74 3e 3d 78 31 61 2d 3e 73 69 7a 65 20 29 7b 0a  t>=x1a->size ){.
216d0 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d      /* Need to m
216e0 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ake the hash tab
216f0 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20  le bigger */.   
21700 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20   int i,size;.   
21710 20 73 74 72 75 63 74 20 73 5f 78 31 20 61 72 72   struct s_x1 arr
21720 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69  ay;.    array.si
21730 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 31 61 2d  ze = size = x1a-
21740 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72  >size*2;.    arr
21750 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31 61 2d 3e  ay.count = x1a->
21760 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79  count;.    array
21770 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29  .tbl = (x1node*)
21780 63 61 6c 6c 6f 63 28 73 69 7a 65 2c 20 73 69 7a  calloc(size, siz
21790 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69  eof(x1node) + si
217a0 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 3b 0a  zeof(x1node*));.
217b0 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62      if( array.tb
217c0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
217d0 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f    /* Fail due to
217e0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
217f0 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20  */.    array.ht 
21800 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 61 72  = (x1node**)&(ar
21810 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a  ray.tbl[size]);.
21820 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
21830 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e  ize; i++) array.
21840 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66  ht[i] = 0;.    f
21850 6f 72 28 69 3d 30 3b 20 69 3c 78 31 61 2d 3e 63  or(i=0; i<x1a->c
21860 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ount; i++){.    
21870 20 20 78 31 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c    x1node *oldnp,
21880 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f   *newnp;.      o
21890 6c 64 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62  ldnp = &(x1a->tb
218a0 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d  l[i]);.      h =
218b0 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e   strhash(oldnp->
218c0 64 61 74 61 29 20 26 20 28 73 69 7a 65 2d 31 29  data) & (size-1)
218d0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20  ;.      newnp = 
218e0 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b  &(array.tbl[i]);
218f0 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79  .      if( array
21900 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68  .ht[h] ) array.h
21910 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
21920 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20  ewnp->next);.   
21930 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d     newnp->next =
21940 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20   array.ht[h];.  
21950 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
21960 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
21970 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
21980 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
21990 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
219a0 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
219b0 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 31 61    }.    free(x1a
219c0 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 31 61  ->tbl);.    *x1a
219d0 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
219e0 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
219f0 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
21a00 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d  ph & (x1a->size-
21a10 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 31 61  1);.  np = &(x1a
21a20 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74  ->tbl[x1a->count
21a30 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61  ++]);.  np->data
21a40 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78   = data;.  if( x
21a50 31 61 2d 3e 68 74 5b 68 5d 20 29 20 78 31 61 2d  1a->ht[h] ) x1a-
21a60 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  >ht[h]->from = &
21a70 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70  (np->next);.  np
21a80 2d 3e 6e 65 78 74 20 3d 20 78 31 61 2d 3e 68 74  ->next = x1a->ht
21a90 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e 68 74 5b 68  [h];.  x1a->ht[h
21aa0 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72  ] = np;.  np->fr
21ab0 6f 6d 20 3d 20 26 28 78 31 61 2d 3e 68 74 5b 68  om = &(x1a->ht[h
21ac0 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ]);.  return 1;.
21ad0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
21ae0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61  ointer to data a
21af0 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67  ssigned to the g
21b00 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72  iven key.  Retur
21b10 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20  n NULL.** if no 
21b20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 63 6f 6e  such key. */.con
21b30 73 74 20 63 68 61 72 20 2a 53 74 72 73 61 66 65  st char *Strsafe
21b40 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72  _find(const char
21b50 20 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e 73 69 67   *key).{.  unsig
21b60 6e 65 64 20 68 3b 0a 20 20 78 31 6e 6f 64 65 20  ned h;.  x1node 
21b70 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d  *np;..  if( x1a=
21b80 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
21b90 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79   h = strhash(key
21ba0 29 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31  ) & (x1a->size-1
21bb0 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68  );.  np = x1a->h
21bc0 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
21bd0 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  p ){.    if( str
21be0 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79  cmp(np->data,key
21bf0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
21c00 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
21c10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70  .  }.  return np
21c20 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
21c30 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
21c40 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 28  pointer to the (
21c50 74 65 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74  terminal or nont
21c60 65 72 6d 69 6e 61 6c 29 20 73 79 6d 62 6f 6c 20  erminal) symbol 
21c70 22 78 22 2e 0a 2a 2a 20 43 72 65 61 74 65 20 61  "x"..** Create a
21c80 20 6e 65 77 20 73 79 6d 62 6f 6c 20 69 66 20 74   new symbol if t
21c90 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
21ca0 20 74 69 6d 65 20 22 78 22 20 68 61 73 20 62 65   time "x" has be
21cb0 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75  en seen..*/.stru
21cc0 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f  ct symbol *Symbo
21cd0 6c 5f 6e 65 77 28 63 6f 6e 73 74 20 63 68 61 72  l_new(const char
21ce0 20 2a 78 29 0a 7b 0a 20 20 73 74 72 75 63 74 20   *x).{.  struct 
21cf0 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73  symbol *sp;..  s
21d00 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28  p = Symbol_find(
21d10 78 29 3b 0a 20 20 69 66 28 20 73 70 3d 3d 30 20  x);.  if( sp==0 
21d20 29 7b 0a 20 20 20 20 73 70 20 3d 20 28 73 74 72  ){.    sp = (str
21d30 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 63 61 6c  uct symbol *)cal
21d40 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28 73 74  loc(1, sizeof(st
21d50 72 75 63 74 20 73 79 6d 62 6f 6c 29 20 29 3b 0a  ruct symbol) );.
21d60 20 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28      MemoryCheck(
21d70 73 70 29 3b 0a 20 20 20 20 73 70 2d 3e 6e 61 6d  sp);.    sp->nam
21d80 65 20 3d 20 53 74 72 73 61 66 65 28 78 29 3b 0a  e = Strsafe(x);.
21d90 20 20 20 20 73 70 2d 3e 74 79 70 65 20 3d 20 69      sp->type = i
21da0 73 75 70 70 65 72 28 2a 78 29 20 3f 20 54 45 52  supper(*x) ? TER
21db0 4d 49 4e 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d 49  MINAL : NONTERMI
21dc0 4e 41 4c 3b 0a 20 20 20 20 73 70 2d 3e 72 75 6c  NAL;.    sp->rul
21dd0 65 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 66  e = 0;.    sp->f
21de0 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20  allback = 0;.   
21df0 20 73 70 2d 3e 70 72 65 63 20 3d 20 2d 31 3b 0a   sp->prec = -1;.
21e00 20 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20      sp->assoc = 
21e10 55 4e 4b 3b 0a 20 20 20 20 73 70 2d 3e 66 69 72  UNK;.    sp->fir
21e20 73 74 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 73  stset = 0;.    s
21e30 70 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f  p->lambda = LEMO
21e40 4e 5f 46 41 4c 53 45 3b 0a 20 20 20 20 73 70 2d  N_FALSE;.    sp-
21e50 3e 64 65 73 74 72 75 63 74 6f 72 20 3d 20 30 3b  >destructor = 0;
21e60 0a 20 20 20 20 73 70 2d 3e 64 65 73 74 4c 69 6e  .    sp->destLin
21e70 65 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d  eno = 0;.    sp-
21e80 3e 64 61 74 61 74 79 70 65 20 3d 20 30 3b 0a 20  >datatype = 0;. 
21e90 20 20 20 73 70 2d 3e 75 73 65 43 6e 74 20 3d 20     sp->useCnt = 
21ea0 30 3b 0a 20 20 20 20 53 79 6d 62 6f 6c 5f 69 6e  0;.    Symbol_in
21eb0 73 65 72 74 28 73 70 2c 73 70 2d 3e 6e 61 6d 65  sert(sp,sp->name
21ec0 29 3b 0a 20 20 7d 0a 20 20 73 70 2d 3e 75 73 65  );.  }.  sp->use
21ed0 43 6e 74 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  Cnt++;.  return 
21ee0 73 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72  sp;.}../* Compar
21ef0 65 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20 66 6f  e two symbols fo
21f00 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73  r sorting purpos
21f10 65 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61  es.  Return nega
21f20 74 69 76 65 2c 0a 2a 2a 20 7a 65 72 6f 2c 20 6f  tive,.** zero, o
21f30 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 61 20  r positive if a 
21f40 69 73 20 6c 65 73 73 20 74 68 65 6e 2c 20 65 71  is less then, eq
21f50 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
21f60 65 72 0a 2a 2a 20 74 68 61 6e 20 62 2e 0a 2a 2a  er.** than b..**
21f70 0a 2a 2a 20 53 79 6d 62 6f 6c 73 20 74 68 61 74  .** Symbols that
21f80 20 62 65 67 69 6e 20 77 69 74 68 20 75 70 70 65   begin with uppe
21f90 72 20 63 61 73 65 20 6c 65 74 74 65 72 73 20 28  r case letters (
21fa0 74 65 72 6d 69 6e 61 6c 73 20 6f 72 20 74 6f 6b  terminals or tok
21fb0 65 6e 73 29 0a 2a 2a 20 6d 75 73 74 20 73 6f 72  ens).** must sor
21fc0 74 20 62 65 66 6f 72 65 20 73 79 6d 62 6f 6c 73  t before symbols
21fd0 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
21fe0 20 6c 6f 77 65 72 20 63 61 73 65 20 6c 65 74 74   lower case lett
21ff0 65 72 73 0a 2a 2a 20 28 6e 6f 6e 2d 74 65 72 6d  ers.** (non-term
22000 69 6e 61 6c 73 29 2e 20 20 41 6e 64 20 4d 55 4c  inals).  And MUL
22010 54 49 54 45 52 4d 49 4e 41 4c 20 73 79 6d 62 6f  TITERMINAL symbo
22020 6c 73 20 28 63 72 65 61 74 65 64 20 75 73 69 6e  ls (created usin
22030 67 20 74 68 65 0a 2a 2a 20 25 74 6f 6b 65 6e 5f  g the.** %token_
22040 63 6c 61 73 73 20 64 69 72 65 63 74 69 76 65 29  class directive)
22050 20 6d 75 73 74 20 73 6f 72 74 20 61 74 20 74 68   must sort at th
22060 65 20 76 65 72 79 20 65 6e 64 2e 20 4f 74 68 65  e very end. Othe
22070 72 20 74 68 61 6e 0a 2a 2a 20 74 68 61 74 2c 20  r than.** that, 
22080 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6e  the order does n
22090 6f 74 20 6d 61 74 74 65 72 2e 0a 2a 2a 0a 2a 2a  ot matter..**.**
220a0 20 57 65 20 66 69 6e 64 20 65 78 70 65 72 69 6d   We find experim
220b0 65 6e 74 61 6c 6c 79 20 74 68 61 74 20 6c 65 61  entally that lea
220c0 76 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 73  ving the symbols
220d0 20 69 6e 20 74 68 65 69 72 20 6f 72 69 67 69 6e   in their origin
220e0 61 6c 0a 2a 2a 20 6f 72 64 65 72 20 28 74 68 65  al.** order (the
220f0 20 6f 72 64 65 72 20 74 68 65 79 20 61 70 70 65   order they appe
22100 61 72 65 64 20 69 6e 20 74 68 65 20 67 72 61 6d  ared in the gram
22110 6d 61 72 20 66 69 6c 65 29 20 67 69 76 65 73 20  mar file) gives 
22120 74 68 65 0a 2a 2a 20 73 6d 61 6c 6c 65 73 74 20  the.** smallest 
22130 70 61 72 73 65 72 20 74 61 62 6c 65 73 20 69 6e  parser tables in
22140 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 69 6e 74 20   SQLite..*/.int 
22150 53 79 6d 62 6f 6c 63 6d 70 70 28 63 6f 6e 73 74  Symbolcmpp(const
22160 20 76 6f 69 64 20 2a 5f 61 2c 20 63 6f 6e 73 74   void *_a, const
22170 20 76 6f 69 64 20 2a 5f 62 29 0a 7b 0a 20 20 63   void *_b).{.  c
22180 6f 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d 62  onst struct symb
22190 6f 6c 20 2a 61 20 3d 20 2a 28 63 6f 6e 73 74 20  ol *a = *(const 
221a0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
221b0 29 20 5f 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74  ) _a;.  const st
221c0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62 20 3d  ruct symbol *b =
221d0 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20   *(const struct 
221e0 73 79 6d 62 6f 6c 20 2a 2a 29 20 5f 62 3b 0a 20  symbol **) _b;. 
221f0 20 69 6e 74 20 69 31 20 3d 20 61 2d 3e 74 79 70   int i1 = a->typ
22200 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
22210 20 3f 20 33 20 3a 20 61 2d 3e 6e 61 6d 65 5b 30   ? 3 : a->name[0
22220 5d 3e 27 5a 27 20 3f 20 32 20 3a 20 31 3b 0a 20  ]>'Z' ? 2 : 1;. 
22230 20 69 6e 74 20 69 32 20 3d 20 62 2d 3e 74 79 70   int i2 = b->typ
22240 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
22250 20 3f 20 33 20 3a 20 62 2d 3e 6e 61 6d 65 5b 30   ? 3 : b->name[0
22260 5d 3e 27 5a 27 20 3f 20 32 20 3a 20 31 3b 0a 20  ]>'Z' ? 2 : 1;. 
22270 20 72 65 74 75 72 6e 20 69 31 3d 3d 69 32 20 3f   return i1==i2 ?
22280 20 61 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 69   a->index - b->i
22290 6e 64 65 78 20 3a 20 69 31 20 2d 20 69 32 3b 0a  ndex : i1 - i2;.
222a0 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  }../* There is o
222b0 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
222c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
222d0 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a  ucture for each.
222e0 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ** associative a
222f0 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 32  rray of type "x2
22300 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78  "..*/.struct s_x
22310 32 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20  2 {.  int size; 
22320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22330 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   The number of a
22340 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20  vailable slots. 
22350 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22370 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65    Must be a powe
22380 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74  r of 2 greater t
22390 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20  han or */.      
223a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223b0 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74      /*   equal t
223c0 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  o 1 */.  int cou
223d0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
223e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
223f0 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69  rrently slots fi
22400 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  lled */.  struct
22410 20 73 5f 78 32 6e 6f 64 65 20 2a 74 62 6c 3b 20   s_x2node *tbl; 
22420 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f   /* The data sto
22430 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  red here */.  st
22440 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a  ruct s_x2node **
22450 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ht;  /* Hash tab
22460 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a  le for lookups *
22470 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  /.};../* There i
22480 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
22490 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
224a0 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20   for every data 
224b0 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e  element.** in an
224c0 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
224d0 61 79 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e  ay of type "x2".
224e0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
224f0 63 74 20 73 5f 78 32 6e 6f 64 65 20 7b 0a 20 20  ct s_x2node {.  
22500 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
22510 61 74 61 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ata;     /* The 
22520 64 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  data */.  const 
22530 63 68 61 72 20 2a 6b 65 79 3b 20 20 20 20 20 20  char *key;      
22540 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
22550 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f  .  struct s_x2no
22560 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e  de *next;   /* N
22570 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74  ext entry with t
22580 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a  he same hash */.
22590 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64    struct s_x2nod
225a0 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72  e **from;  /* Pr
225b0 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d  evious link */.}
225c0 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65   x2node;../* The
225d0 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69  re is only one i
225e0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61  nstance of the a
225f0 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74  rray, which is t
22600 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
22610 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f  static struct s_
22620 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a 20 41 6c 6c  x2 *x2a;../* All
22630 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f  ocate a new asso
22640 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f  ciative array */
22650 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69  .void Symbol_ini
22660 74 28 29 7b 0a 20 20 69 66 28 20 78 32 61 20 29  t(){.  if( x2a )
22670 20 72 65 74 75 72 6e 3b 0a 20 20 78 32 61 20 3d   return;.  x2a =
22680 20 28 73 74 72 75 63 74 20 73 5f 78 32 2a 29 6d   (struct s_x2*)m
22690 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
226a0 72 75 63 74 20 73 5f 78 32 29 20 29 3b 0a 20 20  ruct s_x2) );.  
226b0 69 66 28 20 78 32 61 20 29 7b 0a 20 20 20 20 78  if( x2a ){.    x
226c0 32 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a  2a->size = 128;.
226d0 20 20 20 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3d      x2a->count =
226e0 20 30 3b 0a 20 20 20 20 78 32 61 2d 3e 74 62 6c   0;.    x2a->tbl
226f0 20 3d 20 28 78 32 6e 6f 64 65 2a 29 63 61 6c 6c   = (x2node*)call
22700 6f 63 28 31 32 38 2c 20 73 69 7a 65 6f 66 28 78  oc(128, sizeof(x
22710 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  2node) + sizeof(
22720 78 32 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69  x2node*));.    i
22730 66 28 20 78 32 61 2d 3e 74 62 6c 3d 3d 30 20 29  f( x2a->tbl==0 )
22740 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 32 61  {.      free(x2a
22750 29 3b 0a 20 20 20 20 20 20 78 32 61 20 3d 20 30  );.      x2a = 0
22760 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22770 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
22780 78 32 61 2d 3e 68 74 20 3d 20 28 78 32 6e 6f 64  x2a->ht = (x2nod
22790 65 2a 2a 29 26 28 78 32 61 2d 3e 74 62 6c 5b 31  e**)&(x2a->tbl[1
227a0 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  28]);.      for(
227b0 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29  i=0; i<128; i++)
227c0 20 78 32 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b   x2a->ht[i] = 0;
227d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20  .    }.  }.}./* 
227e0 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
227f0 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72  ord into the arr
22800 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ay.  Return TRUE
22810 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
22820 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69  ** Prior data wi
22830 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
22840 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74  is NOT overwritt
22850 65 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c  en */.int Symbol
22860 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 73  _insert(struct s
22870 79 6d 62 6f 6c 20 2a 64 61 74 61 2c 20 63 6f 6e  ymbol *data, con
22880 73 74 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a  st char *key).{.
22890 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20    x2node *np;.  
228a0 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e  unsigned h;.  un
228b0 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66  signed ph;..  if
228c0 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x2a==0 ) retur
228d0 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68  n 0;.  ph = strh
228e0 61 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20  ash(key);.  h = 
228f0 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d  ph & (x2a->size-
22900 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e  1);.  np = x2a->
22910 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
22920 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
22930 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79  rcmp(np->key,key
22940 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
22950 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   An existing ent
22960 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
22970 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a   key is found. *
22980 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20  /.      /* Fail 
22990 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74  because overwrit
229a0 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e  e is not allows.
229b0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
229c0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70   0;.    }.    np
229d0 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
229e0 0a 20 20 69 66 28 20 78 32 61 2d 3e 63 6f 75 6e  .  if( x2a->coun
229f0 74 3e 3d 78 32 61 2d 3e 73 69 7a 65 20 29 7b 0a  t>=x2a->size ){.
22a00 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d      /* Need to m
22a10 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ake the hash tab
22a20 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20  le bigger */.   
22a30 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20   int i,size;.   
22a40 20 73 74 72 75 63 74 20 73 5f 78 32 20 61 72 72   struct s_x2 arr
22a50 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69  ay;.    array.si
22a60 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 32 61 2d  ze = size = x2a-
22a70 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72  >size*2;.    arr
22a80 61 79 2e 63 6f 75 6e 74 20 3d 20 78 32 61 2d 3e  ay.count = x2a->
22a90 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79  count;.    array
22aa0 2e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29  .tbl = (x2node*)
22ab0 63 61 6c 6c 6f 63 28 73 69 7a 65 2c 20 73 69 7a  calloc(size, siz
22ac0 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69  eof(x2node) + si
22ad0 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 3b 0a  zeof(x2node*));.
22ae0 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62      if( array.tb
22af0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
22b00 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f    /* Fail due to
22b10 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
22b20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20  */.    array.ht 
22b30 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28 61 72  = (x2node**)&(ar
22b40 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a  ray.tbl[size]);.
22b50 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
22b60 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e  ize; i++) array.
22b70 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66  ht[i] = 0;.    f
22b80 6f 72 28 69 3d 30 3b 20 69 3c 78 32 61 2d 3e 63  or(i=0; i<x2a->c
22b90 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ount; i++){.    
22ba0 20 20 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c    x2node *oldnp,
22bb0 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f   *newnp;.      o
22bc0 6c 64 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62  ldnp = &(x2a->tb
22bd0 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d  l[i]);.      h =
22be0 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e   strhash(oldnp->
22bf0 6b 65 79 29 20 26 20 28 73 69 7a 65 2d 31 29 3b  key) & (size-1);
22c00 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26  .      newnp = &
22c10 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a  (array.tbl[i]);.
22c20 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e        if( array.
22c30 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74  ht[h] ) array.ht
22c40 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65  [h]->from = &(ne
22c50 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20  wnp->next);.    
22c60 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20    newnp->next = 
22c70 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20  array.ht[h];.   
22c80 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20     newnp->key = 
22c90 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20  oldnp->key;.    
22ca0 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20    newnp->data = 
22cb0 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20  oldnp->data;.   
22cc0 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d     newnp->from =
22cd0 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b   &(array.ht[h]);
22ce0 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b  .      array.ht[
22cf0 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20  h] = newnp;.    
22d00 7d 0a 20 20 20 20 66 72 65 65 28 78 32 61 2d 3e  }.    free(x2a->
22d10 74 62 6c 29 3b 0a 20 20 20 20 2a 78 32 61 20 3d  tbl);.    *x2a =
22d20 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a   array;.  }.  /*
22d30 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
22d40 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68  data */.  h = ph
22d50 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29   & (x2a->size-1)
22d60 3b 0a 20 20 6e 70 20 3d 20 26 28 78 32 61 2d 3e  ;.  np = &(x2a->
22d70 74 62 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74 2b 2b  tbl[x2a->count++
22d80 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20  ]);.  np->key = 
22d90 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20  key;.  np->data 
22da0 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32  = data;.  if( x2
22db0 61 2d 3e 68 74 5b 68 5d 20 29 20 78 32 61 2d 3e  a->ht[h] ) x2a->
22dc0 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
22dd0 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d  np->next);.  np-
22de0 3e 6e 65 78 74 20 3d 20 78 32 61 2d 3e 68 74 5b  >next = x2a->ht[
22df0 68 5d 3b 0a 20 20 78 32 61 2d 3e 68 74 5b 68 5d  h];.  x2a->ht[h]
22e00 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f   = np;.  np->fro
22e10 6d 20 3d 20 26 28 78 32 61 2d 3e 68 74 5b 68 5d  m = &(x2a->ht[h]
22e20 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
22e30 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
22e40 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73  inter to data as
22e50 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69  signed to the gi
22e60 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e  ven key.  Return
22e70 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73   NULL.** if no s
22e80 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75  uch key. */.stru
22e90 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f  ct symbol *Symbo
22ea0 6c 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61  l_find(const cha
22eb0 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e 73 69  r *key).{.  unsi
22ec0 67 6e 65 64 20 68 3b 0a 20 20 78 32 6e 6f 64 65  gned h;.  x2node
22ed0 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 32 61   *np;..  if( x2a
22ee0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
22ef0 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65    h = strhash(ke
22f00 79 29 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d  y) & (x2a->size-
22f10 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e  1);.  np = x2a->
22f20 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
22f30 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
22f40 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79  rcmp(np->key,key
22f50 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
22f60 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
22f70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70  .  }.  return np
22f80 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
22f90 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68  .}../* Return th
22fa0 65 20 6e 2d 74 68 20 64 61 74 61 2e 20 20 52 65  e n-th data.  Re
22fb0 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 20 69  turn NULL if n i
22fc0 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
22fd0 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  */.struct symbol
22fe0 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74   *Symbol_Nth(int
22ff0 20 6e 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73   n).{.  struct s
23000 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 20 20 69  ymbol *data;.  i
23010 66 28 20 78 32 61 20 26 26 20 6e 3e 30 20 26 26  f( x2a && n>0 &&
23020 20 6e 3c 3d 78 32 61 2d 3e 63 6f 75 6e 74 20 29   n<=x2a->count )
23030 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 78 32 61  {.    data = x2a
23040 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e 64 61 74 61 3b  ->tbl[n-1].data;
23050 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 61  .  }else{.    da
23060 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ta = 0;.  }.  re
23070 74 75 72 6e 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a  turn data;.}../*
23080 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
23090 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 2a 2f   of the array */
230a0 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e  .int Symbol_coun
230b0 74 28 29 0a 7b 0a 20 20 72 65 74 75 72 6e 20 78  t().{.  return x
230c0 32 61 20 3f 20 78 32 61 2d 3e 63 6f 75 6e 74 20  2a ? x2a->count 
230d0 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  : 0;.}../* Retur
230e0 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f  n an array of po
230f0 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61  inters to all da
23100 74 61 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ta in the table.
23110 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69 73  .** The array is
23120 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
23130 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e  alloc.  Return N
23140 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c  ULL if memory al
23150 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62  location.** prob
23160 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20  lems, or if the 
23170 61 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20  array is empty. 
23180 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  */.struct symbol
23190 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f   **Symbol_arrayo
231a0 66 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73  f().{.  struct s
231b0 79 6d 62 6f 6c 20 2a 2a 61 72 72 61 79 3b 0a 20  ymbol **array;. 
231c0 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 69   int i,size;.  i
231d0 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75  f( x2a==0 ) retu
231e0 72 6e 20 30 3b 0a 20 20 73 69 7a 65 20 3d 20 78  rn 0;.  size = x
231f0 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72  2a->count;.  arr
23200 61 79 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d  ay = (struct sym
23210 62 6f 6c 20 2a 2a 29 63 61 6c 6c 6f 63 28 73 69  bol **)calloc(si
23220 7a 65 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63  ze, sizeof(struc
23230 74 20 73 79 6d 62 6f 6c 20 2a 29 29 3b 0a 20 20  t symbol *));.  
23240 69 66 28 20 61 72 72 61 79 20 29 7b 0a 20 20 20  if( array ){.   
23250 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
23260 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20  ; i++) array[i] 
23270 3d 20 78 32 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61  = x2a->tbl[i].da
23280 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ta;.  }.  return
23290 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f   array;.}../* Co
232a0 6d 70 61 72 65 20 74 77 6f 20 63 6f 6e 66 69 67  mpare two config
232b0 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20  urations */.int 
232c0 43 6f 6e 66 69 67 63 6d 70 28 63 6f 6e 73 74 20  Configcmp(const 
232d0 63 68 61 72 20 2a 5f 61 2c 63 6f 6e 73 74 20 63  char *_a,const c
232e0 68 61 72 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f 6e  har *_b).{.  con
232f0 73 74 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  st struct config
23300 20 2a 61 20 3d 20 28 73 74 72 75 63 74 20 63 6f   *a = (struct co
23310 6e 66 69 67 20 2a 29 20 5f 61 3b 0a 20 20 63 6f  nfig *) _a;.  co
23320 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6e 66 69  nst struct confi
23330 67 20 2a 62 20 3d 20 28 73 74 72 75 63 74 20 63  g *b = (struct c
23340 6f 6e 66 69 67 20 2a 29 20 5f 62 3b 0a 20 20 69  onfig *) _b;.  i
23350 6e 74 20 78 3b 0a 20 20 78 20 3d 20 61 2d 3e 72  nt x;.  x = a->r
23360 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70  p->index - b->rp
23370 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 78  ->index;.  if( x
23380 3d 3d 30 20 29 20 78 20 3d 20 61 2d 3e 64 6f 74  ==0 ) x = a->dot
23390 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 72 65 74   - b->dot;.  ret
233a0 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  urn x;.}../* Com
233b0 70 61 72 65 20 74 77 6f 20 73 74 61 74 65 73 20  pare two states 
233c0 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73  */.PRIVATE int s
233d0 74 61 74 65 63 6d 70 28 73 74 72 75 63 74 20 63  tatecmp(struct c
233e0 6f 6e 66 69 67 20 2a 61 2c 20 73 74 72 75 63 74  onfig *a, struct
233f0 20 63 6f 6e 66 69 67 20 2a 62 29 0a 7b 0a 20 20   config *b).{.  
23400 69 6e 74 20 72 63 3b 0a 20 20 66 6f 72 28 72 63  int rc;.  for(rc
23410 3d 30 3b 20 72 63 3d 3d 30 20 26 26 20 61 20 26  =0; rc==0 && a &
23420 26 20 62 3b 20 20 61 3d 61 2d 3e 62 70 2c 20 62  & b;  a=a->bp, b
23430 3d 62 2d 3e 62 70 29 7b 0a 20 20 20 20 72 63 20  =b->bp){.    rc 
23440 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d  = a->rp->index -
23450 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20   b->rp->index;. 
23460 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
23470 63 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e  c = a->dot - b->
23480 64 6f 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  dot;.  }.  if( r
23490 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
234a0 61 20 29 20 72 63 20 3d 20 31 3b 0a 20 20 20 20  a ) rc = 1;.    
234b0 69 66 28 20 62 20 29 20 72 63 20 3d 20 2d 31 3b  if( b ) rc = -1;
234c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
234d0 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 73  ;.}../* Hash a s
234e0 74 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20  tate */.PRIVATE 
234f0 75 6e 73 69 67 6e 65 64 20 73 74 61 74 65 68 61  unsigned stateha
23500 73 68 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  sh(struct config
23510 20 2a 61 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65   *a).{.  unsigne
23520 64 20 68 3d 30 3b 0a 20 20 77 68 69 6c 65 28 20  d h=0;.  while( 
23530 61 20 29 7b 0a 20 20 20 20 68 20 3d 20 68 2a 35  a ){.    h = h*5
23540 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65  71 + a->rp->inde
23550 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20  x*37 + a->dot;. 
23560 20 20 20 61 20 3d 20 61 2d 3e 62 70 3b 0a 20 20     a = a->bp;.  
23570 7d 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a  }.  return h;.}.
23580 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
23590 65 77 20 73 74 61 74 65 20 73 74 72 75 63 74 75  ew state structu
235a0 72 65 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61  re */.struct sta
235b0 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 29 0a  te *State_new().
235c0 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
235d0 20 2a 6e 65 77 73 74 61 74 65 3b 0a 20 20 6e 65   *newstate;.  ne
235e0 77 73 74 61 74 65 20 3d 20 28 73 74 72 75 63 74  wstate = (struct
235f0 20 73 74 61 74 65 20 2a 29 63 61 6c 6c 6f 63 28   state *)calloc(
23600 31 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  1, sizeof(struct
23610 20 73 74 61 74 65 29 20 29 3b 0a 20 20 4d 65 6d   state) );.  Mem
23620 6f 72 79 43 68 65 63 6b 28 6e 65 77 73 74 61 74  oryCheck(newstat
23630 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77  e);.  return new
23640 73 74 61 74 65 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  state;.}../* The
23650 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
23660 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
23670 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f  ing structure fo
23680 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69  r each.** associ
23690 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
236a0 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 73 74 72  ype "x3"..*/.str
236b0 75 63 74 20 73 5f 78 33 20 7b 0a 20 20 69 6e 74  uct s_x3 {.  int
236c0 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
236d0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
236e0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
236f0 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  slots. */.      
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23710 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65      /*   Must be
23720 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72   a power of 2 gr
23730 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f  eater than or */
23740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
23760 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20  equal to 1 */.  
23770 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20  int count;      
23780 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23790 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73  r of currently s
237a0 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20  lots filled */. 
237b0 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65   struct s_x3node
237c0 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64   *tbl;  /* The d
237d0 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20  ata stored here 
237e0 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33  */.  struct s_x3
237f0 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48  node **ht;  /* H
23800 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f  ash table for lo
23810 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  okups */.};../* 
23820 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
23830 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
23840 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72  ructure for ever
23850 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a  y data element.*
23860 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74  * in an associat
23870 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
23880 65 20 22 78 33 22 2e 0a 2a 2f 0a 74 79 70 65 64  e "x3"..*/.typed
23890 65 66 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f  ef struct s_x3no
238a0 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74  de {.  struct st
238b0 61 74 65 20 2a 64 61 74 61 3b 20 20 20 20 20 20  ate *data;      
238c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
238d0 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72  he data */.  str
238e0 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b  uct config *key;
238f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23900 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
23910 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f  .  struct s_x3no
23920 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e  de *next;   /* N
23930 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74  ext entry with t
23940 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a  he same hash */.
23950 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
23960 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72  e **from;  /* Pr
23970 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d  evious link */.}
23980 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65   x3node;../* The
23990 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69  re is only one i
239a0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61  nstance of the a
239b0 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74  rray, which is t
239c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
239d0 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f  static struct s_
239e0 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c 6c  x3 *x3a;../* All
239f0 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f  ocate a new asso
23a00 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f  ciative array */
23a10 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74  .void State_init
23a20 28 29 7b 0a 20 20 69 66 28 20 78 33 61 20 29 20  (){.  if( x3a ) 
23a30 72 65 74 75 72 6e 3b 0a 20 20 78 33 61 20 3d 20  return;.  x3a = 
23a40 28 73 74 72 75 63 74 20 73 5f 78 33 2a 29 6d 61  (struct s_x3*)ma
23a50 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
23a60 75 63 74 20 73 5f 78 33 29 20 29 3b 0a 20 20 69  uct s_x3) );.  i
23a70 66 28 20 78 33 61 20 29 7b 0a 20 20 20 20 78 33  f( x3a ){.    x3
23a80 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a 20  a->size = 128;. 
23a90 20 20 20 78 33 61 2d 3e 63 6f 75 6e 74 20 3d 20     x3a->count = 
23aa0 30 3b 0a 20 20 20 20 78 33 61 2d 3e 74 62 6c 20  0;.    x3a->tbl 
23ab0 3d 20 28 78 33 6e 6f 64 65 2a 29 63 61 6c 6c 6f  = (x3node*)callo
23ac0 63 28 31 32 38 2c 20 73 69 7a 65 6f 66 28 78 33  c(128, sizeof(x3
23ad0 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
23ae0 33 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66  3node*));.    if
23af0 28 20 78 33 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b  ( x3a->tbl==0 ){
23b00 0a 20 20 20 20 20 20 66 72 65 65 28 78 33 61 29  .      free(x3a)
23b10 3b 0a 20 20 20 20 20 20 78 33 61 20 3d 20 30 3b  ;.      x3a = 0;
23b20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23b30 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78    int i;.      x
23b40 33 61 2d 3e 68 74 20 3d 20 28 78 33 6e 6f 64 65  3a->ht = (x3node
23b50 2a 2a 29 26 28 78 33 61 2d 3e 74 62 6c 5b 31 32  **)&(x3a->tbl[12
23b60 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  8]);.      for(i
23b70 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20  =0; i<128; i++) 
23b80 78 33 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a  x3a->ht[i] = 0;.
23b90 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49      }.  }.}./* I
23ba0 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
23bb0 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61  rd into the arra
23bc0 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  y.  Return TRUE 
23bd0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
23be0 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74  * Prior data wit
23bf0 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
23c00 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65  s NOT overwritte
23c10 6e 20 2a 2f 0a 69 6e 74 20 53 74 61 74 65 5f 69  n */.int State_i
23c20 6e 73 65 72 74 28 73 74 72 75 63 74 20 73 74 61  nsert(struct sta
23c30 74 65 20 2a 64 61 74 61 2c 20 73 74 72 75 63 74  te *data, struct
23c40 20 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a   config *key).{.
23c50 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20    x3node *np;.  
23c60 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e  unsigned h;.  un
23c70 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66  signed ph;..  if
23c80 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x3a==0 ) retur
23c90 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 61 74  n 0;.  ph = stat
23ca0 65 68 61 73 68 28 6b 65 79 29 3b 0a 20 20 68 20  ehash(key);.  h 
23cb0 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73 69 7a  = ph & (x3a->siz
23cc0 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61  e-1);.  np = x3a
23cd0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
23ce0 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
23cf0 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79  statecmp(np->key
23d00 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ,key)==0 ){.    
23d10 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
23d20 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
23d30 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e  same key is foun
23d40 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46  d. */.      /* F
23d50 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72  ail because over
23d60 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c  write is not all
23d70 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ows. */.      re
23d80 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
23d90 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
23da0 0a 20 20 7d 0a 20 20 69 66 28 20 78 33 61 2d 3e  .  }.  if( x3a->
23db0 63 6f 75 6e 74 3e 3d 78 33 61 2d 3e 73 69 7a 65  count>=x3a->size
23dc0 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20   ){.    /* Need 
23dd0 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68  to make the hash
23de0 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f   table bigger */
23df0 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b  .    int i,size;
23e00 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 33  .    struct s_x3
23e10 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61   array;.    arra
23e20 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20  y.size = size = 
23e30 78 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20  x3a->size*2;.   
23e40 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78   array.count = x
23e50 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61  3a->count;.    a
23e60 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 33 6e 6f  rray.tbl = (x3no
23e70 64 65 2a 29 63 61 6c 6c 6f 63 28 73 69 7a 65 2c  de*)calloc(size,
23e80 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20   sizeof(x3node) 
23e90 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a  + sizeof(x3node*
23ea0 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61  ));.    if( arra
23eb0 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72  y.tbl==0 ) retur
23ec0 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75  n 0;  /* Fail du
23ed0 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e to malloc fail
23ee0 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79  ure */.    array
23ef0 2e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29  .ht = (x3node**)
23f00 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65  &(array.tbl[size
23f10 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
23f20 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72   i<size; i++) ar
23f30 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  ray.ht[i] = 0;. 
23f40 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 33     for(i=0; i<x3
23f50 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a  a->count; i++){.
23f60 20 20 20 20 20 20 78 33 6e 6f 64 65 20 2a 6f 6c        x3node *ol
23f70 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20  dnp, *newnp;.   
23f80 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 33 61     oldnp = &(x3a
23f90 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  ->tbl[i]);.     
23fa0 20 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6f   h = statehash(o
23fb0 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 73 69  ldnp->key) & (si
23fc0 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77  ze-1);.      new
23fd0 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c  np = &(array.tbl
23fe0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
23ff0 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72  array.ht[h] ) ar
24000 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  ray.ht[h]->from 
24010 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29  = &(newnp->next)
24020 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e  ;.      newnp->n
24030 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68  ext = array.ht[h
24040 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  ];.      newnp->
24050 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79  key = oldnp->key
24060 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64  ;.      newnp->d
24070 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74  ata = oldnp->dat
24080 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  a;.      newnp->
24090 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68  from = &(array.h
240a0 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72  t[h]);.      arr
240b0 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70  ay.ht[h] = newnp
240c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
240d0 28 78 33 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20  (x3a->tbl);.    
240e0 2a 78 33 61 20 3d 20 61 72 72 61 79 3b 0a 20 20  *x3a = array;.  
240f0 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  }.  /* Insert th
24100 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20  e new data */.  
24110 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73  h = ph & (x3a->s
24120 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26  ize-1);.  np = &
24130 28 78 33 61 2d 3e 74 62 6c 5b 78 33 61 2d 3e 63  (x3a->tbl[x3a->c
24140 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e  ount++]);.  np->
24150 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d  key = key;.  np-
24160 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20  >data = data;.  
24170 69 66 28 20 78 33 61 2d 3e 68 74 5b 68 5d 20 29  if( x3a->ht[h] )
24180 20 78 33 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f   x3a->ht[h]->fro
24190 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b  m = &(np->next);
241a0 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 33  .  np->next = x3
241b0 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 33 61 2d  a->ht[h];.  x3a-
241c0 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e  >ht[h] = np;.  n
241d0 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 33 61 2d  p->from = &(x3a-
241e0 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72  >ht[h]);.  retur
241f0 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  n 1;.}../* Retur
24200 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  n a pointer to d
24210 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ata assigned to 
24220 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20  the given key.  
24230 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69  Return NULL.** i
24240 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a  f no such key. *
24250 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  /.struct state *
24260 53 74 61 74 65 5f 66 69 6e 64 28 73 74 72 75 63  State_find(struc
24270 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a 7b  t config *key).{
24280 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20  .  unsigned h;. 
24290 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20   x3node *np;..  
242a0 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74  if( x3a==0 ) ret
242b0 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 61  urn 0;.  h = sta
242c0 74 65 68 61 73 68 28 6b 65 79 29 20 26 20 28 78  tehash(key) & (x
242d0 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  3a->size-1);.  n
242e0 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x3a->ht[h];.
242f0 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
24300 20 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28     if( statecmp(
24310 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20  np->key,key)==0 
24320 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20  ) break;.    np 
24330 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
24340 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70    return np ? np
24350 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->data : 0;.}../
24360 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61  * Return an arra
24370 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  y of pointers to
24380 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65   all data in the
24390 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61   table..** The a
243a0 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64  rray is obtained
243b0 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52   from malloc.  R
243c0 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65  eturn NULL if me
243d0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
243e0 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20  ** problems, or 
243f0 69 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  if the array is 
24400 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74  empty. */.struct
24410 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61   state **State_a
24420 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72  rrayof().{.  str
24430 75 63 74 20 73 74 61 74 65 20 2a 2a 61 72 72 61  uct state **arra
24440 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b  y;.  int i,size;
24450 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20  .  if( x3a==0 ) 
24460 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65  return 0;.  size
24470 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x3a->count;. 
24480 20 61 72 72 61 79 20 3d 20 28 73 74 72 75 63 74   array = (struct
24490 20 73 74 61 74 65 20 2a 2a 29 63 61 6c 6c 6f 63   state **)calloc
244a0 28 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28 73 74  (size, sizeof(st
244b0 72 75 63 74 20 73 74 61 74 65 20 2a 29 29 3b 0a  ruct state *));.
244c0 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a 20    if( array ){. 
244d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
244e0 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69  ze; i++) array[i
244f0 5d 20 3d 20 78 33 61 2d 3e 74 62 6c 5b 69 5d 2e  ] = x3a->tbl[i].
24500 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75  data;.  }.  retu
24510 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20  rn array;.}../* 
24520 48 61 73 68 20 61 20 63 6f 6e 66 69 67 75 72 61  Hash a configura
24530 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20  tion */.PRIVATE 
24540 75 6e 73 69 67 6e 65 64 20 63 6f 6e 66 69 67 68  unsigned configh
24550 61 73 68 28 73 74 72 75 63 74 20 63 6f 6e 66 69  ash(struct confi
24560 67 20 2a 61 29 0a 7b 0a 20 20 75 6e 73 69 67 6e  g *a).{.  unsign
24570 65 64 20 68 3d 30 3b 0a 20 20 68 20 3d 20 68 2a  ed h=0;.  h = h*
24580 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64  571 + a->rp->ind
24590 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a  ex*37 + a->dot;.
245a0 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f    return h;.}../
245b0 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
245c0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
245d0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
245e0 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61  re for each.** a
245f0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
24600 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a   of type "x4"..*
24610 2f 0a 73 74 72 75 63 74 20 73 5f 78 34 20 7b 0a  /.struct s_x4 {.
24620 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
24630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
24640 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
24650 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20  able slots. */. 
24660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24670 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75           /*   Mu
24680 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
24690 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
246a0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
246b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246c0 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20  /*   equal to 1 
246d0 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20  */.  int count; 
246e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
246f0 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  Number of curren
24700 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64  tly slots filled
24710 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
24720 34 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20  4node *tbl;  /* 
24730 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  The data stored 
24740 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  here */.  struct
24750 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 68 74 3b 20   s_x4node **ht; 
24760 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66   /* Hash table f
24770 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b  or lookups */.};
24780 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
24790 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
247a0 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
247b0 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d   every data elem
247c0 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73  ent.** in an ass
247d0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
247e0 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a  f type "x4"..*/.
247f0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
24800 5f 78 34 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75  _x4node {.  stru
24810 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b  ct config *data;
24820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24830 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
24840 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f  .  struct s_x4no
24850 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e  de *next;   /* N
24860 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74  ext entry with t
24870 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a  he same hash */.
24880 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64    struct s_x4nod
24890 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72  e **from;  /* Pr
248a0 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d  evious link */.}
248b0 20 78 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65   x4node;../* The
248c0 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69  re is only one i
248d0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61  nstance of the a
248e0 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74  rray, which is t
248f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
24900 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f  static struct s_
24910 78 34 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c  x4 *x4a;../* All
24920 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f  ocate a new asso
24930 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f  ciative array */
24940 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c  .void Configtabl
24950 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20  e_init(){.  if( 
24960 78 34 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  x4a ) return;.  
24970 78 34 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f  x4a = (struct s_
24980 78 34 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  x4*)malloc( size
24990 6f 66 28 73 74 72 75 63 74 20 73 5f 78 34 29 20  of(struct s_x4) 
249a0 29 3b 0a 20 20 69 66 28 20 78 34 61 20 29 7b 0a  );.  if( x4a ){.
249b0 20 20 20 20 78 34 61 2d 3e 73 69 7a 65 20 3d 20      x4a->size = 
249c0 36 34 3b 0a 20 20 20 20 78 34 61 2d 3e 63 6f 75  64;.    x4a->cou
249d0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 34 61 2d  nt = 0;.    x4a-
249e0 3e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29  >tbl = (x4node*)
249f0 63 61 6c 6c 6f 63 28 36 34 2c 20 73 69 7a 65 6f  calloc(64, sizeo
24a00 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x4node) + size
24a10 6f 66 28 78 34 6e 6f 64 65 2a 29 29 3b 0a 20 20  of(x4node*));.  
24a20 20 20 69 66 28 20 78 34 61 2d 3e 74 62 6c 3d 3d    if( x4a->tbl==
24a30 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
24a40 78 34 61 29 3b 0a 20 20 20 20 20 20 78 34 61 20  x4a);.      x4a 
24a50 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
24a60 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
24a70 20 20 20 78 34 61 2d 3e 68 74 20 3d 20 28 78 34     x4a->ht = (x4
24a80 6e 6f 64 65 2a 2a 29 26 28 78 34 61 2d 3e 74 62  node**)&(x4a->tb
24a90 6c 5b 36 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f  l[64]);.      fo
24aa0 72 28 69 3d 30 3b 20 69 3c 36 34 3b 20 69 2b 2b  r(i=0; i<64; i++
24ab0 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x4a->ht[i] = 0
24ac0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
24ad0 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
24ae0 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72  cord into the ar
24af0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ray.  Return TRU
24b00 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  E if successful.
24b10 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77  .** Prior data w
24b20 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
24b30 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74   is NOT overwrit
24b40 74 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69  ten */.int Confi
24b50 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 73 74  gtable_insert(st
24b60 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74  ruct config *dat
24b70 61 29 0a 7b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e  a).{.  x4node *n
24b80 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b  p;.  unsigned h;
24b90 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a  .  unsigned ph;.
24ba0 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20  .  if( x4a==0 ) 
24bb0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
24bc0 20 63 6f 6e 66 69 67 68 61 73 68 28 64 61 74 61   confighash(data
24bd0 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
24be0 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  4a->size-1);.  n
24bf0 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x4a->ht[h];.
24c00 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
24c10 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70     if( Configcmp
24c20 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20  ((const char *) 
24c30 6e 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73 74 20  np->data,(const 
24c40 63 68 61 72 20 2a 29 20 64 61 74 61 29 3d 3d 30  char *) data)==0
24c50 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
24c60 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77  existing entry w
24c70 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
24c80 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20   is found. */.  
24c90 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61      /* Fail beca
24ca0 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73  use overwrite is
24cb0 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a   not allows. */.
24cc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
24cd0 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e      }.    np = n
24ce0 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  p->next;.  }.  i
24cf0 66 28 20 78 34 61 2d 3e 63 6f 75 6e 74 3e 3d 78  f( x4a->count>=x
24d00 34 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20  4a->size ){.    
24d10 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
24d20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62  the hash table b
24d30 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  igger */.    int
24d40 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72   i,size;.    str
24d50 75 63 74 20 73 5f 78 34 20 61 72 72 61 79 3b 0a  uct s_x4 array;.
24d60 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d      array.size =
24d70 20 73 69 7a 65 20 3d 20 78 34 61 2d 3e 73 69 7a   size = x4a->siz
24d80 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63  e*2;.    array.c
24d90 6f 75 6e 74 20 3d 20 78 34 61 2d 3e 63 6f 75 6e  ount = x4a->coun
24da0 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c  t;.    array.tbl
24db0 20 3d 20 28 78 34 6e 6f 64 65 2a 29 63 61 6c 6c   = (x4node*)call
24dc0 6f 63 28 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28  oc(size, sizeof(
24dd0 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x4node) + sizeof
24de0 28 78 34 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20  (x4node*));.    
24df0 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30  if( array.tbl==0
24e00 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
24e10 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c   Fail due to mal
24e20 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  loc failure */. 
24e30 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78     array.ht = (x
24e40 34 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e  4node**)&(array.
24e50 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20  tbl[size]);.    
24e60 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
24e70 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69   i++) array.ht[i
24e80 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  ] = 0;.    for(i
24e90 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74  =0; i<x4a->count
24ea0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 34  ; i++){.      x4
24eb0 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65  node *oldnp, *ne
24ec0 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70  wnp;.      oldnp
24ed0 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 69 5d   = &(x4a->tbl[i]
24ee0 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 63 6f 6e  );.      h = con
24ef0 66 69 67 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64  fighash(oldnp->d
24f00 61 74 61 29 20 26 20 28 73 69 7a 65 2d 31 29 3b  ata) & (size-1);
24f10 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26  .      newnp = &
24f20 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a  (array.tbl[i]);.
24f30 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e        if( array.
24f40 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74  ht[h] ) array.ht
24f50 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65  [h]->from = &(ne
24f60 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20  wnp->next);.    
24f70 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20    newnp->next = 
24f80 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20  array.ht[h];.   
24f90 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d     newnp->data =
24fa0 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20   oldnp->data;.  
24fb0 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20      newnp->from 
24fc0 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29  = &(array.ht[h])
24fd0 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74  ;.      array.ht
24fe0 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20  [h] = newnp;.   
24ff0 20 7d 0a 20 20 20 20 66 72 65 65 28 78 34 61 2d   }.    free(x4a-
25000 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 34 61 20  >tbl);.    *x4a 
25010 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f  = array;.  }.  /
25020 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
25030 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70   data */.  h = p
25040 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31  h & (x4a->size-1
25050 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 34 61 2d  );.  np = &(x4a-
25060 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74 2b  >tbl[x4a->count+
25070 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20  +]);.  np->data 
25080 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 34  = data;.  if( x4
25090 61 2d 3e 68 74 5b 68 5d 20 29 20 78 34 61 2d 3e  a->ht[h] ) x4a->
250a0 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
250b0 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d  np->next);.  np-
250c0 3e 6e 65 78 74 20 3d 20 78 34 61 2d 3e 68 74 5b  >next = x4a->ht[
250d0 68 5d 3b 0a 20 20 78 34 61 2d 3e 68 74 5b 68 5d  h];.  x4a->ht[h]
250e0 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f   = np;.  np->fro
250f0 6d 20 3d 20 26 28 78 34 61 2d 3e 68 74 5b 68 5d  m = &(x4a->ht[h]
25100 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
25110 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
25120 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73  inter to data as
25130 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69  signed to the gi
25140 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e  ven key.  Return
25150 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73   NULL.** if no s
25160 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75  uch key. */.stru
25170 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
25180 67 74 61 62 6c 65 5f 66 69 6e 64 28 73 74 72 75  gtable_find(stru
25190 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a  ct config *key).
251a0 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 34 6e  {.  int h;.  x4n
251b0 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20  ode *np;..  if( 
251c0 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x4a==0 ) return 
251d0 30 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69 67 68  0;.  h = configh
251e0 61 73 68 28 6b 65 79 29 20 26 20 28 78 34 61 2d  ash(key) & (x4a-
251f0 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
25200 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77   x4a->ht[h];.  w
25210 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20  hile( np ){.    
25220 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28 28 63  if( Configcmp((c
25230 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6e 70 2d  onst char *) np-
25240 3e 64 61 74 61 2c 28 63 6f 6e 73 74 20 63 68 61  >data,(const cha
25250 72 20 2a 29 20 6b 65 79 29 3d 3d 30 20 29 20 62  r *) key)==0 ) b
25260 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e  reak;.    np = n
25270 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  p->next;.  }.  r
25280 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64  eturn np ? np->d
25290 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52  ata : 0;.}../* R
252a0 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61 20 66  emove all data f
252b0 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e 20 20  rom the table.  
252c0 50 61 73 73 20 65 61 63 68 20 64 61 74 61 20 74  Pass each data t
252d0 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 22  o the function "
252e0 66 22 0a 2a 2a 20 61 73 20 69 74 20 69 73 20 72  f".** as it is r
252f0 65 6d 6f 76 65 64 2e 20 20 28 22 66 22 20 6d 61  emoved.  ("f" ma
25300 79 20 62 65 20 6e 75 6c 6c 20 74 6f 20 61 76 6f  y be null to avo
25310 69 64 20 74 68 69 73 20 73 74 65 70 2e 29 20 2a  id this step.) *
25320 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62  /.void Configtab
25330 6c 65 5f 63 6c 65 61 72 28 69 6e 74 28 2a 66 29  le_clear(int(*f)
25340 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
25350 29 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  )).{.  int i;.  
25360 69 66 28 20 78 34 61 3d 3d 30 20 7c 7c 20 78 34  if( x4a==0 || x4
25370 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29 20 72 65  a->count==0 ) re
25380 74 75 72 6e 3b 0a 20 20 69 66 28 20 66 20 29 20  turn;.  if( f ) 
25390 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e  for(i=0; i<x4a->
253a0 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 28 2a 66 29  count; i++) (*f)
253b0 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74  (x4a->tbl[i].dat
253c0 61 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  a);.  for(i=0; i
253d0 3c 78 34 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b 29  <x4a->size; i++)
253e0 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b   x4a->ht[i] = 0;
253f0 0a 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20  .  x4a->count = 
25400 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     0;.  return;.}.