/ Hex Artifact Content
Login

Artifact 1864c4fe4a72b1bb28f1792b60504804fe82c5d2:


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 6e 65 78 74 20 2d 20 28 75 6e 73 69 67 6e 65  )next - (unsigne
db70: 64 20 6c 6f 6e 67 29 6c 69 73 74 3b 0a 20 20 66  d long)list;.  f
db80: 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49  or(i=0; i<LISTSI
db90: 5a 45 3b 20 69 2b 2b 29 20 73 65 74 5b 69 5d 20  ZE; i++) set[i] 
dba0: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 6c 69  = 0;.  while( li
dbb0: 73 74 20 29 7b 0a 20 20 20 20 65 70 20 3d 20 6c  st ){.    ep = l
dbc0: 69 73 74 3b 0a 20 20 20 20 6c 69 73 74 20 3d 20  ist;.    list = 
dbd0: 4e 45 58 54 28 6c 69 73 74 29 3b 0a 20 20 20 20  NEXT(list);.    
dbe0: 4e 45 58 54 28 65 70 29 20 3d 20 30 3b 0a 20 20  NEXT(ep) = 0;.  
dbf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53    for(i=0; i<LIS
dc00: 54 53 49 5a 45 2d 31 20 26 26 20 73 65 74 5b 69  TSIZE-1 && set[i
dc10: 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ]!=0; i++){.    
dc20: 20 20 65 70 20 3d 20 6d 65 72 67 65 28 65 70 2c    ep = merge(ep,
dc30: 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65  set[i],cmp,offse
dc40: 74 29 3b 0a 20 20 20 20 20 20 73 65 74 5b 69 5d  t);.      set[i]
dc50: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
dc60: 73 65 74 5b 69 5d 20 3d 20 65 70 3b 0a 20 20 7d  set[i] = ep;.  }
dc70: 0a 20 20 65 70 20 3d 20 30 3b 0a 20 20 66 6f 72  .  ep = 0;.  for
dc80: 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45  (i=0; i<LISTSIZE
dc90: 3b 20 69 2b 2b 29 20 69 66 28 20 73 65 74 5b 69  ; i++) if( set[i
dca0: 5d 20 29 20 65 70 20 3d 20 6d 65 72 67 65 28 73  ] ) ep = merge(s
dcb0: 65 74 5b 69 5d 2c 65 70 2c 63 6d 70 2c 6f 66 66  et[i],ep,cmp,off
dcc0: 73 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  set);.  return e
dcd0: 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  p;.}./**********
dce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
dcf0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70  rom the file "op
dd00: 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  tion.c" ********
dd10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd20: 2a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  **/.static char 
dd30: 2a 2a 61 72 67 76 3b 0a 73 74 61 74 69 63 20 73  **argv;.static s
dd40: 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20  truct s_options 
dd50: 2a 6f 70 3b 0a 73 74 61 74 69 63 20 46 49 4c 45  *op;.static FILE
dd60: 20 2a 65 72 72 73 74 72 65 61 6d 3b 0a 0a 23 64   *errstream;..#d
dd70: 65 66 69 6e 65 20 49 53 4f 50 54 28 58 29 20 28  efine ISOPT(X) (
dd80: 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c 7c 28 58 29  (X)[0]=='-'||(X)
dd90: 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74 72 63 68 72  [0]=='+'||strchr
dda0: 28 28 58 29 2c 27 3d 27 29 21 3d 30 29 0a 0a 2f  ((X),'=')!=0)../
ddb0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63  *.** Print the c
ddc0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 69 74 68  ommand line with
ddd0: 20 61 20 63 61 72 72 6f 74 20 70 6f 69 6e 74 69   a carrot pointi
dde0: 6e 67 20 74 6f 20 74 68 65 20 6b 2d 74 68 20 63  ng to the k-th c
ddf0: 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20 74  haracter.** of t
de00: 68 65 20 6e 2d 74 68 20 66 69 65 6c 64 2e 0a 2a  he n-th field..*
de10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 72  /.static void er
de20: 72 6c 69 6e 65 28 69 6e 74 20 6e 2c 20 69 6e 74  rline(int n, int
de30: 20 6b 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b   k, FILE *err).{
de40: 0a 20 20 69 6e 74 20 73 70 63 6e 74 2c 20 69 3b  .  int spcnt, i;
de50: 0a 20 20 69 66 28 20 61 72 67 76 5b 30 5d 20 29  .  if( argv[0] )
de60: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
de70: 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 70  ",argv[0]);.  sp
de80: 63 6e 74 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  cnt = lemonStrle
de90: 6e 28 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b 0a  n(argv[0]) + 1;.
dea0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26    for(i=1; i<n &
deb0: 26 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b  & argv[i]; i++){
dec0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
ded0: 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b  ," %s",argv[i]);
dee0: 0a 20 20 20 20 73 70 63 6e 74 20 2b 3d 20 6c 65  .    spcnt += le
def0: 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76 5b 69  monStrlen(argv[i
df00: 5d 29 2b 31 3b 0a 20 20 7d 0a 20 20 73 70 63 6e  ])+1;.  }.  spcn
df10: 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b 20  t += k;.  for(; 
df20: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 20 66 70  argv[i]; i++) fp
df30: 72 69 6e 74 66 28 65 72 72 2c 22 20 25 73 22 2c  rintf(err," %s",
df40: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 69 66 28 20  argv[i]);.  if( 
df50: 73 70 63 6e 74 3c 32 30 20 29 7b 0a 20 20 20 20  spcnt<20 ){.    
df60: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25  fprintf(err,"\n%
df70: 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c 73 70  *s^-- here\n",sp
df80: 63 6e 74 2c 22 22 29 3b 0a 20 20 7d 65 6c 73 65  cnt,"");.  }else
df90: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72  {.    fprintf(er
dfa0: 72 2c 22 5c 6e 25 2a 73 68 65 72 65 20 2d 2d 5e  r,"\n%*shere --^
dfb0: 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c 22 22 29 3b  \n",spcnt-7,"");
dfc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
dfd0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
dfe0: 66 20 74 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d 73  f the N-th non-s
dff0: 77 69 74 63 68 20 61 72 67 75 6d 65 6e 74 2e 20  witch argument. 
e000: 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
e010: 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   N is out of ran
e020: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
e030: 74 20 61 72 67 69 6e 64 65 78 28 69 6e 74 20 6e  t argindex(int n
e040: 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ).{.  int i;.  i
e050: 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b  nt dashdash = 0;
e060: 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20 26  .  if( argv!=0 &
e070: 26 20 2a 61 72 67 76 21 3d 30 20 29 7b 0a 20 20  & *argv!=0 ){.  
e080: 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b    for(i=1; argv[
e090: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
e0a0: 69 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20  if( dashdash || 
e0b0: 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20  !ISOPT(argv[i]) 
e0c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
e0d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
e0e0: 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20          n--;.   
e0f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
e100: 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d  trcmp(argv[i],"-
e110: 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73  -")==0 ) dashdas
e120: 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  h = 1;.    }.  }
e130: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
e140: 0a 73 74 61 74 69 63 20 63 68 61 72 20 65 6d 73  .static char ems
e150: 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c  g[] = "Command l
e160: 69 6e 65 20 73 79 6e 74 61 78 20 65 72 72 6f 72  ine syntax error
e170: 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  : ";../*.** Proc
e180: 65 73 73 20 61 20 66 6c 61 67 20 63 6f 6d 6d 61  ess a flag comma
e190: 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd line argument
e1a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e1b0: 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 6e 74 20  handleflags(int 
e1c0: 69 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a  i, FILE *err).{.
e1d0: 20 20 69 6e 74 20 76 3b 0a 20 20 69 6e 74 20 65    int v;.  int e
e1e0: 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  rrcnt = 0;.  int
e1f0: 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f   j;.  for(j=0; o
e200: 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29  p[j].label; j++)
e210: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  {.    if( strncm
e220: 70 28 26 61 72 67 76 5b 69 5d 5b 31 5d 2c 6f 70  p(&argv[i][1],op
e230: 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c 65 6d 6f 6e 53  [j].label,lemonS
e240: 74 72 6c 65 6e 28 6f 70 5b 6a 5d 2e 6c 61 62 65  trlen(op[j].labe
e250: 6c 29 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  l))==0 ) break;.
e260: 20 20 7d 0a 20 20 76 20 3d 20 61 72 67 76 5b 69    }.  v = argv[i
e270: 5d 5b 30 5d 3d 3d 27 2d 27 20 3f 20 31 20 3a 20  ][0]=='-' ? 1 : 
e280: 30 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c  0;.  if( op[j].l
e290: 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  abel==0 ){.    i
e2a0: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
e2b0: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75  fprintf(err,"%su
e2c0: 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e  ndefined option.
e2d0: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
e2e0: 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72   errline(i,1,err
e2f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72  );.    }.    err
e300: 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69  cnt++;.  }else i
e310: 66 28 20 6f 70 5b 6a 5d 2e 61 72 67 3d 3d 30 20  f( op[j].arg==0 
e320: 29 7b 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65  ){.    /* Ignore
e330: 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 2a 2f 0a   this option */.
e340: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a    }else if( op[j
e350: 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 4c 41 47  ].type==OPT_FLAG
e360: 20 29 7b 0a 20 20 20 20 2a 28 28 69 6e 74 2a 29   ){.    *((int*)
e370: 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 76 3b 0a  op[j].arg) = v;.
e380: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a    }else if( op[j
e390: 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 46 4c 41  ].type==OPT_FFLA
e3a0: 47 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64  G ){.    (*(void
e3b0: 28 2a 29 28 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e  (*)(int))(op[j].
e3c0: 61 72 67 29 29 28 76 29 3b 0a 20 20 7d 65 6c 73  arg))(v);.  }els
e3d0: 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65  e if( op[j].type
e3e0: 3d 3d 4f 50 54 5f 46 53 54 52 20 29 7b 0a 20 20  ==OPT_FSTR ){.  
e3f0: 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 63 68 61    (*(void(*)(cha
e400: 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  r *))(op[j].arg)
e410: 29 28 26 61 72 67 76 5b 69 5d 5b 32 5d 29 3b 0a  )(&argv[i][2]);.
e420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
e430: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70   err ){.      fp
e440: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 6d 69 73  rintf(err,"%smis
e450: 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e  sing argument on
e460: 20 73 77 69 74 63 68 2e 5c 6e 22 2c 65 6d 73 67   switch.\n",emsg
e470: 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65  );.      errline
e480: 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d  (i,1,err);.    }
e490: 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20  .    errcnt++;. 
e4a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63   }.  return errc
e4b0: 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  nt;.}../*.** Pro
e4c0: 63 65 73 73 20 61 20 63 6f 6d 6d 61 6e 64 20 6c  cess a command l
e4d0: 69 6e 65 20 73 77 69 74 63 68 20 77 68 69 63 68  ine switch which
e4e0: 20 68 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74   has an argument
e4f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e500: 68 61 6e 64 6c 65 73 77 69 74 63 68 28 69 6e 74  handleswitch(int
e510: 20 69 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b   i, FILE *err).{
e520: 0a 20 20 69 6e 74 20 6c 76 20 3d 20 30 3b 0a 20  .  int lv = 0;. 
e530: 20 64 6f 75 62 6c 65 20 64 76 20 3d 20 30 2e 30   double dv = 0.0
e540: 3b 0a 20 20 63 68 61 72 20 2a 73 76 20 3d 20 30  ;.  char *sv = 0
e550: 2c 20 2a 65 6e 64 3b 0a 20 20 63 68 61 72 20 2a  , *end;.  char *
e560: 63 70 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69  cp;.  int j;.  i
e570: 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20  nt errcnt = 0;. 
e580: 20 63 70 20 3d 20 73 74 72 63 68 72 28 61 72 67   cp = strchr(arg
e590: 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20 20 61 73 73  v[i],'=');.  ass
e5a0: 65 72 74 28 20 63 70 21 3d 30 20 29 3b 0a 20 20  ert( cp!=0 );.  
e5b0: 2a 63 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a  *cp = 0;.  for(j
e5c0: 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b  =0; op[j].label;
e5d0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   j++){.    if( s
e5e0: 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 6f 70  trcmp(argv[i],op
e5f0: 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20 29 20  [j].label)==0 ) 
e600: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70  break;.  }.  *cp
e610: 20 3d 20 27 3d 27 3b 0a 20 20 69 66 28 20 6f 70   = '=';.  if( op
e620: 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a  [j].label==0 ){.
e630: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
e640: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
e650: 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70  ,"%sundefined op
e660: 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  tion.\n",emsg);.
e670: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
e680: 30 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  0,err);.    }.  
e690: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65    errcnt++;.  }e
e6a0: 6c 73 65 7b 0a 20 20 20 20 63 70 2b 2b 3b 0a 20  lse{.    cp++;. 
e6b0: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d     switch( op[j]
e6c0: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
e6d0: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
e6e0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
e6f0: 41 47 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20  AG:.        if( 
e700: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  err ){.         
e710: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
e720: 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
e730: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c  an argument.\n",
e740: 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  emsg);.         
e750: 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72   errline(i,0,err
e760: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e770: 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20       errcnt++;. 
e780: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e790: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c      case OPT_DBL
e7a0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
e7b0: 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 64  _FDBL:.        d
e7c0: 76 20 3d 20 73 74 72 74 6f 64 28 63 70 2c 26 65  v = strtod(cp,&e
e7d0: 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nd);.        if(
e7e0: 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20   *end ){.       
e7f0: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
e800: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
e810: 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c  f(err,"%sillegal
e820: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 66 6c   character in fl
e830: 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 61 72 67  oating-point arg
e840: 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b  ument.\n",emsg);
e850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72  .            err
e860: 6c 69 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e 65  line(i,((unsigne
e870: 64 20 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73  d long)end)-(uns
e880: 69 67 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b  igned long)argv[
e890: 69 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20  i],err);.       
e8a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65     }.          e
e8b0: 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  rrcnt++;.       
e8c0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
e8d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
e8e0: 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65  _INT:.      case
e8f0: 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20   OPT_FINT:.     
e900: 20 20 20 6c 76 20 3d 20 73 74 72 74 6f 6c 28 63     lv = strtol(c
e910: 70 2c 26 65 6e 64 2c 30 29 3b 0a 20 20 20 20 20  p,&end,0);.     
e920: 20 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20     if( *end ){. 
e930: 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72           if( err
e940: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e950: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 69  fprintf(err,"%si
e960: 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72  llegal character
e970: 20 69 6e 20 69 6e 74 65 67 65 72 20 61 72 67 75   in integer argu
e980: 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  ment.\n",emsg);.
e990: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6c              errl
e9a0: 69 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e 65 64  ine(i,((unsigned
e9b0: 20 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69   long)end)-(unsi
e9c0: 67 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69  gned long)argv[i
e9d0: 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  ],err);.        
e9e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72    }.          er
e9f0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
ea00: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
ea10: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
ea20: 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20  STR:.      case 
ea30: 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20  OPT_FSTR:.      
ea40: 20 20 73 76 20 3d 20 63 70 3b 0a 20 20 20 20 20    sv = cp;.     
ea50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ea60: 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a      switch( op[j
ea70: 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  ].type ){.      
ea80: 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20  case OPT_FLAG:. 
ea90: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46       case OPT_FF
eaa0: 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65  LAG:.        bre
eab0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
eac0: 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20 20  PT_DBL:.        
ead0: 2a 28 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d  *(double*)(op[j]
eae0: 2e 61 72 67 29 20 3d 20 64 76 3b 0a 20 20 20 20  .arg) = dv;.    
eaf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
eb00: 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a   case OPT_FDBL:.
eb10: 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28          (*(void(
eb20: 2a 29 28 64 6f 75 62 6c 65 29 29 28 6f 70 5b 6a  *)(double))(op[j
eb30: 5d 2e 61 72 67 29 29 28 64 76 29 3b 0a 20 20 20  ].arg))(dv);.   
eb40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
eb50: 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a    case OPT_INT:.
eb60: 20 20 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 28          *(int*)(
eb70: 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 6c 76 3b  op[j].arg) = lv;
eb80: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
eb90: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
eba0: 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 28 2a 28  INT:.        (*(
ebb0: 76 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f 70  void(*)(int))(op
ebc0: 5b 6a 5d 2e 61 72 67 29 29 28 28 69 6e 74 29 6c  [j].arg))((int)l
ebd0: 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  v);.        brea
ebe0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
ebf0: 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 20 20 2a  T_STR:.        *
ec00: 28 63 68 61 72 2a 2a 29 28 6f 70 5b 6a 5d 2e 61  (char**)(op[j].a
ec10: 72 67 29 20 3d 20 73 76 3b 0a 20 20 20 20 20 20  rg) = sv;.      
ec20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ec30: 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20  ase OPT_FSTR:.  
ec40: 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29        (*(void(*)
ec50: 28 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e  (char *))(op[j].
ec60: 61 72 67 29 29 28 73 76 29 3b 0a 20 20 20 20 20  arg))(sv);.     
ec70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ec80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72    }.  return err
ec90: 63 6e 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49  cnt;.}..int OptI
eca0: 6e 69 74 28 63 68 61 72 20 2a 2a 61 2c 20 73 74  nit(char **a, st
ecb0: 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a  ruct s_options *
ecc0: 6f 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a  o, FILE *err).{.
ecd0: 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30    int errcnt = 0
ece0: 3b 0a 20 20 61 72 67 76 20 3d 20 61 3b 0a 20 20  ;.  argv = a;.  
ecf0: 6f 70 20 3d 20 6f 3b 0a 20 20 65 72 72 73 74 72  op = o;.  errstr
ed00: 65 61 6d 20 3d 20 65 72 72 3b 0a 20 20 69 66 28  eam = err;.  if(
ed10: 20 61 72 67 76 20 26 26 20 2a 61 72 67 76 20 26   argv && *argv &
ed20: 26 20 6f 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  & op ){.    int 
ed30: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  i;.    for(i=1; 
ed40: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
ed50: 20 20 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d       if( argv[i]
ed60: 5b 30 5d 3d 3d 27 2b 27 20 7c 7c 20 61 72 67 76  [0]=='+' || argv
ed70: 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  [i][0]=='-' ){. 
ed80: 20 20 20 20 20 20 20 65 72 72 63 6e 74 20 2b 3d         errcnt +=
ed90: 20 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65   handleflags(i,e
eda0: 72 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rr);.      }else
edb0: 20 69 66 28 20 73 74 72 63 68 72 28 61 72 67 76   if( strchr(argv
edc0: 5b 69 5d 2c 27 3d 27 29 20 29 7b 0a 20 20 20 20  [i],'=') ){.    
edd0: 20 20 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61      errcnt += ha
ede0: 6e 64 6c 65 73 77 69 74 63 68 28 69 2c 65 72 72  ndleswitch(i,err
edf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ee00: 0a 20 20 7d 0a 20 20 69 66 28 20 65 72 72 63 6e  .  }.  if( errcn
ee10: 74 3e 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  t>0 ){.    fprin
ee20: 74 66 28 65 72 72 2c 22 56 61 6c 69 64 20 63 6f  tf(err,"Valid co
ee30: 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f  mmand line optio
ee40: 6e 73 20 66 6f 72 20 5c 22 25 73 5c 22 20 61 72  ns for \"%s\" ar
ee50: 65 3a 5c 6e 22 2c 2a 61 29 3b 0a 20 20 20 20 4f  e:\n",*a);.    O
ee60: 70 74 50 72 69 6e 74 28 29 3b 0a 20 20 20 20 65  ptPrint();.    e
ee70: 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65  xit(1);.  }.  re
ee80: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20 4f  turn 0;.}..int O
ee90: 70 74 4e 41 72 67 73 28 29 7b 0a 20 20 69 6e 74  ptNArgs(){.  int
eea0: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
eeb0: 64 61 73 68 64 61 73 68 20 3d 20 30 3b 0a 20 20  dashdash = 0;.  
eec0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67  int i;.  if( arg
eed0: 76 21 3d 30 20 26 26 20 61 72 67 76 5b 30 5d 21  v!=0 && argv[0]!
eee0: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 ){.    for(i=
eef0: 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29  1; argv[i]; i++)
ef00: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 61 73 68  {.      if( dash
ef10: 64 61 73 68 20 7c 7c 20 21 49 53 4f 50 54 28 61  dash || !ISOPT(a
ef20: 72 67 76 5b 69 5d 29 20 29 20 63 6e 74 2b 2b 3b  rgv[i]) ) cnt++;
ef30: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
ef40: 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d  p(argv[i],"--")=
ef50: 3d 30 20 29 20 64 61 73 68 64 61 73 68 20 3d 20  =0 ) dashdash = 
ef60: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
ef70: 65 74 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 63 68  eturn cnt;.}..ch
ef80: 61 72 20 2a 4f 70 74 41 72 67 28 69 6e 74 20 6e  ar *OptArg(int n
ef90: 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ).{.  int i;.  i
efa0: 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a   = argindex(n);.
efb0: 20 20 72 65 74 75 72 6e 20 69 3e 3d 30 20 3f 20    return i>=0 ? 
efc0: 61 72 67 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a  argv[i] : 0;.}..
efd0: 76 6f 69 64 20 4f 70 74 45 72 72 28 69 6e 74 20  void OptErr(int 
efe0: 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  n).{.  int i;.  
eff0: 69 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b  i = argindex(n);
f000: 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 65 72  .  if( i>=0 ) er
f010: 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 73 74 72  rline(i,0,errstr
f020: 65 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70  eam);.}..void Op
f030: 74 50 72 69 6e 74 28 29 7b 0a 20 20 69 6e 74 20  tPrint(){.  int 
f040: 69 3b 0a 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65  i;.  int max, le
f050: 6e 3b 0a 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20  n;.  max = 0;.  
f060: 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c  for(i=0; op[i].l
f070: 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  abel; i++){.    
f080: 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  len = lemonStrle
f090: 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b  n(op[i].label) +
f0a0: 20 31 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20   1;.    switch( 
f0b0: 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[i].type ){.  
f0c0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
f0d0: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
f0e0: 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
f0f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
f100: 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20  se OPT_INT:.    
f110: 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a    case OPT_FINT:
f120: 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20  .        len += 
f130: 39 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67  9;       /* leng
f140: 74 68 20 6f 66 20 22 3c 69 6e 74 65 67 65 72 3e  th of "<integer>
f150: 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  " */.        bre
f160: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
f170: 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61  PT_DBL:.      ca
f180: 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20  se OPT_FDBL:.   
f190: 20 20 20 20 20 6c 65 6e 20 2b 3d 20 36 3b 20 20       len += 6;  
f1a0: 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f       /* length o
f1b0: 66 20 22 3c 72 65 61 6c 3e 22 20 2a 2f 0a 20 20  f "<real>" */.  
f1c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f1d0: 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a     case OPT_STR:
f1e0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
f1f0: 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 6c 65  FSTR:.        le
f200: 6e 20 2b 3d 20 38 3b 20 20 20 20 20 20 20 2f 2a  n += 8;       /*
f210: 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 73 74 72   length of "<str
f220: 69 6e 67 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20  ing>" */.       
f230: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f240: 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 20 29 20    if( len>max ) 
f250: 6d 61 78 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20  max = len;.  }. 
f260: 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e   for(i=0; op[i].
f270: 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  label; i++){.   
f280: 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74   switch( op[i].t
f290: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
f2a0: 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20  e OPT_FLAG:.    
f2b0: 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47    case OPT_FFLAG
f2c0: 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  :.        fprint
f2d0: 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d  f(errstream,"  -
f2e0: 25 2d 2a 73 20 20 25 73 5c 6e 22 2c 6d 61 78 2c  %-*s  %s\n",max,
f2f0: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69  op[i].label,op[i
f300: 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20  ].message);.    
f310: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f320: 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20   case OPT_INT:. 
f330: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49       case OPT_FI
f340: 4e 54 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69  NT:.        fpri
f350: 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20  ntf(errstream," 
f360: 20 2d 25 73 3c 69 6e 74 65 67 65 72 3e 25 2a 73   -%s<integer>%*s
f370: 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61    %s\n",op[i].la
f380: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  bel,.          (
f390: 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74  int)(max-lemonSt
f3a0: 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c  rlen(op[i].label
f3b0: 29 2d 39 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65  )-9),"",op[i].me
f3c0: 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
f3d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
f3e0: 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20  e OPT_DBL:.     
f3f0: 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a   case OPT_FDBL:.
f400: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
f410: 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 73  errstream,"  -%s
f420: 3c 72 65 61 6c 3e 25 2a 73 20 20 25 73 5c 6e 22  <real>%*s  %s\n"
f430: 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20  ,op[i].label,.  
f440: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61          (int)(ma
f450: 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70  x-lemonStrlen(op
f460: 5b 69 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c 22 22  [i].label)-6),""
f470: 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b  ,op[i].message);
f480: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
f490: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53        case OPT_S
f4a0: 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  TR:.      case O
f4b0: 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20  PT_FSTR:.       
f4c0: 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65   fprintf(errstre
f4d0: 61 6d 2c 22 20 20 2d 25 73 3c 73 74 72 69 6e 67  am,"  -%s<string
f4e0: 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69  >%*s  %s\n",op[i
f4f0: 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  ].label,.       
f500: 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d     (int)(max-lem
f510: 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c  onStrlen(op[i].l
f520: 61 62 65 6c 29 2d 38 29 2c 22 22 2c 6f 70 5b 69  abel)-8),"",op[i
f530: 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20  ].message);.    
f540: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f550: 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  .  }.}./********
f560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
f570: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70  From the file "p
f580: 61 72 73 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  arse.c" ********
f590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5a0: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70 75  ****/./*.** Inpu
f5b0: 74 20 66 69 6c 65 20 70 61 72 73 65 72 20 66 6f  t file parser fo
f5c0: 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
f5d0: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
f5e0: 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20 6f  ../* The state o
f5f0: 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a  f the parser */.
f600: 65 6e 75 6d 20 65 5f 73 74 61 74 65 20 7b 0a 20  enum e_state {. 
f610: 20 49 4e 49 54 49 41 4c 49 5a 45 2c 0a 20 20 57   INITIALIZE,.  W
f620: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
f630: 4f 52 5f 52 55 4c 45 2c 0a 20 20 57 41 49 54 49  OR_RULE,.  WAITI
f640: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57  NG_FOR_DECL_KEYW
f650: 4f 52 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  ORD,.  WAITING_F
f660: 4f 52 5f 44 45 43 4c 5f 41 52 47 2c 0a 20 20 57  OR_DECL_ARG,.  W
f670: 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45  AITING_FOR_PRECE
f680: 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20  DENCE_SYMBOL,.  
f690: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f  WAITING_FOR_ARRO
f6a0: 57 2c 0a 20 20 49 4e 5f 52 48 53 2c 0a 20 20 4c  W,.  IN_RHS,.  L
f6b0: 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 4c 48  HS_ALIAS_1,.  LH
f6c0: 53 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 4c 48 53  S_ALIAS_2,.  LHS
f6d0: 5f 41 4c 49 41 53 5f 33 2c 0a 20 20 52 48 53 5f  _ALIAS_3,.  RHS_
f6e0: 41 4c 49 41 53 5f 31 2c 0a 20 20 52 48 53 5f 41  ALIAS_1,.  RHS_A
f6f0: 4c 49 41 53 5f 32 2c 0a 20 20 50 52 45 43 45 44  LIAS_2,.  PRECED
f700: 45 4e 43 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20 50  ENCE_MARK_1,.  P
f710: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32  RECEDENCE_MARK_2
f720: 2c 0a 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52  ,.  RESYNC_AFTER
f730: 5f 52 55 4c 45 5f 45 52 52 4f 52 2c 0a 20 20 52  _RULE_ERROR,.  R
f740: 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
f750: 5f 45 52 52 4f 52 2c 0a 20 20 57 41 49 54 49 4e  _ERROR,.  WAITIN
f760: 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52  G_FOR_DESTRUCTOR
f770: 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49  _SYMBOL,.  WAITI
f780: 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f  NG_FOR_DATATYPE_
f790: 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e  SYMBOL,.  WAITIN
f7a0: 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49  G_FOR_FALLBACK_I
f7b0: 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  D,.  WAITING_FOR
f7c0: 5f 57 49 4c 44 43 41 52 44 5f 49 44 2c 0a 20 20  _WILDCARD_ID,.  
f7d0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53  WAITING_FOR_CLAS
f7e0: 53 5f 49 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f  S_ID,.  WAITING_
f7f0: 46 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 0a  FOR_CLASS_TOKEN.
f800: 7d 3b 0a 73 74 72 75 63 74 20 70 73 74 61 74 65  };.struct pstate
f810: 20 7b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 6e   {.  char *filen
f820: 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  ame;       /* Na
f830: 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  me of the input 
f840: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  file */.  int to
f850: 6b 65 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20  kenlineno;      
f860: 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 61 74  /* Linenumber at
f870: 20 77 68 69 63 68 20 63 75 72 72 65 6e 74 20 74   which current t
f880: 6f 6b 65 6e 20 73 74 61 72 74 73 20 2a 2f 0a 20  oken starts */. 
f890: 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20   int errorcnt;  
f8a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
f8b0: 20 6f 66 20 65 72 72 6f 72 73 20 73 6f 20 66 61   of errors so fa
f8c0: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  r */.  char *tok
f8d0: 65 6e 73 74 61 72 74 3b 20 20 20 20 20 2f 2a 20  enstart;     /* 
f8e0: 54 65 78 74 20 6f 66 20 63 75 72 72 65 6e 74 20  Text of current 
f8f0: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63  token */.  struc
f900: 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20 20 20  t lemon *gp;    
f910: 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 74 61 74 65   /* Global state
f920: 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 65 6e 75   vector */.  enu
f930: 6d 20 65 5f 73 74 61 74 65 20 73 74 61 74 65 3b  m e_state state;
f940: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
f950: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72 73  tate of the pars
f960: 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  er */.  struct s
f970: 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b  ymbol *fallback;
f980: 20 20 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62 61     /* The fallba
f990: 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74  ck token */.  st
f9a0: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 74 6b 63  ruct symbol *tkc
f9b0: 6c 61 73 73 3b 20 20 20 20 2f 2a 20 54 6f 6b 65  lass;    /* Toke
f9c0: 6e 20 63 6c 61 73 73 20 73 79 6d 62 6f 6c 20 2a  n class symbol *
f9d0: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
f9e0: 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 20 20 2f  l *lhs;        /
f9f0: 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  * Left-hand side
fa00: 20 6f 66 20 63 75 72 72 65 6e 74 20 72 75 6c 65   of current rule
fa10: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
fa20: 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 20   *lhsalias;     
fa30: 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68   /* Alias for th
fa40: 65 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 6e  e LHS */.  int n
fa50: 72 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  rhs;            
fa60: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
fa70: 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  of right-hand si
fa80: 64 65 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e 20  de symbols seen 
fa90: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
faa0: 6f 6c 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d 3b  ol *rhs[MAXRHS];
fab0: 20 20 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c 73    /* RHS symbols
fac0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
fad0: 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d 3b   *alias[MAXRHS];
fae0: 20 2f 2a 20 41 6c 69 61 73 65 73 20 66 6f 72 20   /* Aliases for 
faf0: 65 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20  each RHS symbol 
fb00: 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73  (or NULL) */.  s
fb10: 74 72 75 63 74 20 72 75 6c 65 20 2a 70 72 65 76  truct rule *prev
fb20: 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72 65  rule;     /* Pre
fb30: 76 69 6f 75 73 20 72 75 6c 65 20 70 61 72 73 65  vious rule parse
fb40: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
fb50: 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b 20  r *declkeyword; 
fb60: 20 20 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66 20    /* Keyword of 
fb70: 61 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  a declaration */
fb80: 0a 20 20 63 68 61 72 20 2a 2a 64 65 63 6c 61 72  .  char **declar
fb90: 67 73 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f 2a  gslot;        /*
fba0: 20 57 68 65 72 65 20 74 68 65 20 64 65 63 6c 61   Where the decla
fbb0: 72 61 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20  ration argument 
fbc0: 73 68 6f 75 6c 64 20 62 65 20 70 75 74 20 2a 2f  should be put */
fbd0: 0a 20 20 69 6e 74 20 69 6e 73 65 72 74 4c 69 6e  .  int insertLin
fbe0: 65 4d 61 63 72 6f 3b 20 20 20 20 20 20 20 2f 2a  eMacro;       /*
fbf0: 20 41 64 64 20 23 6c 69 6e 65 20 62 65 66 6f 72   Add #line befor
fc00: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e  e declaration in
fc10: 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 64  sert */.  int *d
fc20: 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3b 20 20  ecllinenoslot;  
fc30: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
fc40: 20 77 72 69 74 65 20 64 65 63 6c 61 72 61 74 69   write declarati
fc50: 6f 6e 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a  on line number *
fc60: 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63  /.  enum e_assoc
fc70: 20 64 65 63 6c 61 73 73 6f 63 3b 20 20 20 20 2f   declassoc;    /
fc80: 2a 20 41 73 73 69 67 6e 20 74 68 69 73 20 61 73  * Assign this as
fc90: 73 6f 63 69 61 74 69 6f 6e 20 74 6f 20 64 65 63  sociation to dec
fca0: 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  l arguments */. 
fcb0: 20 69 6e 74 20 70 72 65 63 63 6f 75 6e 74 65 72   int preccounter
fcc0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
fcd0: 73 73 69 67 6e 20 74 68 69 73 20 70 72 65 63 65  ssign this prece
fce0: 64 65 6e 63 65 20 74 6f 20 64 65 63 6c 20 61 72  dence to decl ar
fcf0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74 72  guments */.  str
fd00: 75 63 74 20 72 75 6c 65 20 2a 66 69 72 73 74 72  uct rule *firstr
fd10: 75 6c 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ule;    /* Point
fd20: 65 72 20 74 6f 20 66 69 72 73 74 20 72 75 6c 65  er to first rule
fd30: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
fd40: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
fd50: 20 2a 6c 61 73 74 72 75 6c 65 3b 20 20 20 20 20   *lastrule;     
fd60: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
fd70: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
fd80: 70 61 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a 7d  parsed rule */.}
fd90: 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20 73 69  ;../* Parse a si
fda0: 6e 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74  ngle token */.st
fdb0: 61 74 69 63 20 76 6f 69 64 20 70 61 72 73 65 6f  atic void parseo
fdc0: 6e 65 74 6f 6b 65 6e 28 73 74 72 75 63 74 20 70  netoken(struct p
fdd0: 73 74 61 74 65 20 2a 70 73 70 29 0a 7b 0a 20 20  state *psp).{.  
fde0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 3b 0a 20  const char *x;. 
fdf0: 20 78 20 3d 20 53 74 72 73 61 66 65 28 70 73 70   x = Strsafe(psp
fe00: 2d 3e 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20 20  ->tokenstart);  
fe10: 20 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 74     /* Save the t
fe20: 6f 6b 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c 79  oken permanently
fe30: 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70 72 69 6e   */.#if 0.  prin
fe40: 74 66 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65 6e  tf("%s:%d: Token
fe50: 3d 5b 25 73 5d 20 73 74 61 74 65 3d 25 64 5c 6e  =[%s] state=%d\n
fe60: 22 2c 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  ",psp->filename,
fe70: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
fe80: 2c 0a 20 20 20 20 78 2c 70 73 70 2d 3e 73 74 61  ,.    x,psp->sta
fe90: 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 77  te);.#endif.  sw
fea0: 69 74 63 68 28 20 70 73 70 2d 3e 73 74 61 74 65  itch( psp->state
feb0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 49 4e 49   ){.    case INI
fec0: 54 49 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20 70  TIALIZE:.      p
fed0: 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 30  sp->prevrule = 0
fee0: 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65  ;.      psp->pre
fef0: 63 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20  ccounter = 0;.  
ff00: 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75      psp->firstru
ff10: 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75  le = psp->lastru
ff20: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73  le = 0;.      ps
ff30: 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20 30  p->gp->nrule = 0
ff40: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
ff50: 74 68 72 75 20 74 6f 20 6e 65 78 74 20 63 61 73  thru to next cas
ff60: 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 57 41  e */.    case WA
ff70: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
ff80: 52 5f 52 55 4c 45 3a 0a 20 20 20 20 20 20 69 66  R_RULE:.      if
ff90: 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a 20  ( x[0]=='%' ){. 
ffa0: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
ffb0: 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
ffc0: 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20  DECL_KEYWORD;.  
ffd0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
ffe0: 6c 6f 77 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20  lower(x[0]) ){. 
fff0: 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 20         psp->lhs 
10000 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
10010 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72  .        psp->nr
10020 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  hs = 0;.        
10030 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20  psp->lhsalias = 
10040 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
10050 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
10060 46 4f 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20 20  FOR_ARROW;.     
10070 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d   }else if( x[0]=
10080 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='{' ){.        
10090 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c  if( psp->prevrul
100a0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
100b0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
100c0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
100d0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65 72  kenlineno,."Ther
100e0 65 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75  e is no prior ru
100f0 6c 65 20 75 70 6f 6e 20 77 68 69 63 68 20 74 6f  le upon which to
10100 20 61 74 74 61 63 68 20 74 68 65 20 63 6f 64 65   attach the code
10110 20 5c 0a 66 72 61 67 6d 65 6e 74 20 77 68 69 63   \.fragment whic
10120 68 20 62 65 67 69 6e 73 20 6f 6e 20 74 68 69 73  h begins on this
10130 20 6c 69 6e 65 2e 22 29 3b 0a 20 20 20 20 20 20   line.");.      
10140 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
10150 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t++;.        }el
10160 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76  se if( psp->prev
10170 72 75 6c 65 2d 3e 63 6f 64 65 21 3d 30 20 29 7b  rule->code!=0 ){
10180 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
10190 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
101a0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
101b0 6e 6f 2c 0a 22 43 6f 64 65 20 66 72 61 67 6d 65  no,."Code fragme
101c0 6e 74 20 62 65 67 69 6e 6e 69 6e 67 20 6f 6e 20  nt beginning on 
101d0 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74  this line is not
101e0 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20   the first \.to 
101f0 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69  follow the previ
10200 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20  ous rule.");.   
10210 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
10220 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
10230 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
10240 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e   psp->prevrule->
10250 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65  line = psp->toke
10260 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20  nlineno;.       
10270 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
10280 2d 3e 63 6f 64 65 20 3d 20 26 78 5b 31 5d 3b 0a  ->code = &x[1];.
10290 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
102a0 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d  }else if( x[0]==
102b0 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '[' ){.        p
102c0 73 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43  sp->state = PREC
102d0 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20  EDENCE_MARK_1;. 
102e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
102f0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
10300 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
10310 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
10320 20 20 20 20 20 20 20 22 54 6f 6b 65 6e 20 5c 22         "Token \"
10330 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 65  %s\" should be e
10340 69 74 68 65 72 20 5c 22 25 25 5c 22 20 6f 72 20  ither \"%%\" or 
10350 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6e 61  a nonterminal na
10360 6d 65 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  me.",.          
10370 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
10380 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
10390 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
103a0 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45 43 45  ;.    case PRECE
103b0 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20  DENCE_MARK_1:.  
103c0 20 20 20 20 69 66 28 20 21 69 73 75 70 70 65 72      if( !isupper
103d0 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
103e0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
103f0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
10400 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
10410 20 20 20 20 20 22 54 68 65 20 70 72 65 63 65 64       "The preced
10420 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6d 75 73 74  ence symbol must
10430 20 62 65 20 61 20 74 65 72 6d 69 6e 61 6c 2e 22   be a terminal."
10440 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
10450 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
10460 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d    }else if( psp-
10470 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a  >prevrule==0 ){.
10480 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
10490 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
104a0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
104b0 0a 20 20 20 20 20 20 20 20 20 20 22 54 68 65 72  .          "Ther
104c0 65 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75  e is no prior ru
104d0 6c 65 20 74 6f 20 61 73 73 69 67 6e 20 70 72 65  le to assign pre
104e0 63 65 64 65 6e 63 65 20 5c 22 5b 25 73 5d 5c 22  cedence \"[%s]\"
104f0 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  .",x);.        p
10500 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
10510 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10520 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70  psp->prevrule->p
10530 72 65 63 73 79 6d 21 3d 30 20 29 7b 0a 20 20 20  recsym!=0 ){.   
10540 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
10550 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
10560 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50  >tokenlineno,."P
10570 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 20 6f  recedence mark o
10580 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e  n this line is n
10590 6f 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74  ot the first \.t
105a0 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65  o follow the pre
105b0 76 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20  vious rule.");. 
105c0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
105d0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  rcnt++;.      }e
105e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70  lse{.        psp
105f0 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63  ->prevrule->prec
10600 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  sym = Symbol_new
10610 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (x);.      }.   
10620 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
10630 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f  PRECEDENCE_MARK_
10640 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  2;.      break;.
10650 20 20 20 20 63 61 73 65 20 50 52 45 43 45 44 45      case PRECEDE
10660 4e 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20 20 20 20  NCE_MARK_2:.    
10670 20 20 69 66 28 20 78 5b 30 5d 21 3d 27 5d 27 20    if( x[0]!=']' 
10680 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
10690 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
106a0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
106b0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d  no,.          "M
106c0 69 73 73 69 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20  issing \"]\" on 
106d0 70 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 2e  precedence mark.
106e0 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ");.        psp-
106f0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
10700 20 20 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e     }.      psp->
10710 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
10720 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
10730 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10740 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
10750 46 4f 52 5f 41 52 52 4f 57 3a 0a 20 20 20 20 20  FOR_ARROW:.     
10760 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26   if( x[0]==':' &
10770 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78  & x[1]==':' && x
10780 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20  [2]=='=' ){.    
10790 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
107a0 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d   IN_RHS;.      }
107b0 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27  else if( x[0]=='
107c0 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  (' ){.        ps
107d0 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41  p->state = LHS_A
107e0 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65  LIAS_1;.      }e
107f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
10800 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
10810 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
10820 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
10830 22 45 78 70 65 63 74 65 64 20 74 6f 20 73 65 65  "Expected to see
10840 20 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69   a \":\" followi
10850 6e 67 20 74 68 65 20 4c 48 53 20 73 79 6d 62 6f  ng the LHS symbo
10860 6c 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20  l \"%s\".",.    
10870 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e        psp->lhs->
10880 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  name);.        p
10890 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
108a0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
108b0 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
108c0 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20  R_RULE_ERROR;.  
108d0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
108e0 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f  k;.    case LHS_
108f0 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69  ALIAS_1:.      i
10900 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  f( isalpha(x[0])
10910 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
10920 3e 6c 68 73 61 6c 69 61 73 20 3d 20 78 3b 0a 20  >lhsalias = x;. 
10930 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
10940 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3b  e = LHS_ALIAS_2;
10950 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10960 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
10970 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
10980 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
10990 20 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22           "\"%s\"
109a0 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
109b0 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48  alias for the LH
109c0 53 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20  S \"%s\"\n",.   
109d0 20 20 20 20 20 20 20 78 2c 70 73 70 2d 3e 6c 68         x,psp->lh
109e0 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  s->name);.      
109f0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
10a00 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
10a10 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
10a20 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
10a30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
10a40 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c  reak;.    case L
10a50 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20  HS_ALIAS_2:.    
10a60 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20    if( x[0]==')' 
10a70 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
10a80 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41  state = LHS_ALIA
10a90 53 5f 33 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  S_3;.      }else
10aa0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
10ab0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
10ac0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
10ad0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69  o,.          "Mi
10ae0 73 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c  ssing \")\" foll
10af0 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20  owing LHS alias 
10b00 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73  name \"%s\".",ps
10b10 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20  p->lhsalias);.  
10b20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
10b30 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
10b40 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
10b50 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
10b60 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
10b70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
10b80 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3a 0a  se LHS_ALIAS_3:.
10b90 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
10ba0 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27  ':' && x[1]==':'
10bb0 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b   && x[2]=='=' ){
10bc0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10bd0 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20  ate = IN_RHS;.  
10be0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10bf0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
10c00 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
10c10 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
10c20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c        "Missing \
10c30 22 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a  "->\" following:
10c40 20 5c 22 25 73 28 25 73 29 5c 22 2e 22 2c 0a 20   \"%s(%s)\".",. 
10c50 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c            psp->l
10c60 68 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68  hs->name,psp->lh
10c70 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20  salias);.       
10c80 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
10c90 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
10ca0 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
10cb0 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
10cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
10cd0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 49 4e  eak;.    case IN
10ce0 5f 52 48 53 3a 0a 20 20 20 20 20 20 69 66 28 20  _RHS:.      if( 
10cf0 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  x[0]=='.' ){.   
10d00 20 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65       struct rule
10d10 20 2a 72 70 3b 0a 20 20 20 20 20 20 20 20 72 70   *rp;.        rp
10d20 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65 20   = (struct rule 
10d30 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)calloc( sizeof
10d40 28 73 74 72 75 63 74 20 72 75 6c 65 29 20 2b 20  (struct rule) + 
10d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69  .             si
10d60 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
10d70 6f 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 2b  ol*)*psp->nrhs +
10d80 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70   sizeof(char*)*p
10d90 73 70 2d 3e 6e 72 68 73 2c 20 31 29 3b 0a 20 20  sp->nrhs, 1);.  
10da0 20 20 20 20 20 20 69 66 28 20 72 70 3d 3d 30 20        if( rp==0 
10db0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
10dc0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
10dd0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
10de0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
10df0 20 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74    "Can't allocat
10e00 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20  e enough memory 
10e10 66 6f 72 20 74 68 69 73 20 72 75 6c 65 2e 22 29  for this rule.")
10e20 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10e30 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
10e40 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76         psp->prev
10e50 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rule = 0;.      
10e60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10e70 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
10e80 20 20 20 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65      rp->ruleline
10e90 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e   = psp->tokenlin
10ea0 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  eno;.          r
10eb0 70 2d 3e 72 68 73 20 3d 20 28 73 74 72 75 63 74  p->rhs = (struct
10ec0 20 73 79 6d 62 6f 6c 2a 2a 29 26 72 70 5b 31 5d   symbol**)&rp[1]
10ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
10ee0 72 68 73 61 6c 69 61 73 20 3d 20 28 63 6f 6e 73  rhsalias = (cons
10ef0 74 20 63 68 61 72 2a 2a 29 26 28 72 70 2d 3e 72  t char**)&(rp->r
10f00 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 29 3b 0a  hs[psp->nrhs]);.
10f10 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
10f20 30 3b 20 69 3c 70 73 70 2d 3e 6e 72 68 73 3b 20  0; i<psp->nrhs; 
10f30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
10f40 20 20 72 70 2d 3e 72 68 73 5b 69 5d 20 3d 20 70    rp->rhs[i] = p
10f50 73 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20  sp->rhs[i];.    
10f60 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61          rp->rhsa
10f70 6c 69 61 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 61  lias[i] = psp->a
10f80 6c 69 61 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20  lias[i];.       
10f90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
10fa0 70 2d 3e 6c 68 73 20 3d 20 70 73 70 2d 3e 6c 68  p->lhs = psp->lh
10fb0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  s;.          rp-
10fc0 3e 6c 68 73 61 6c 69 61 73 20 3d 20 70 73 70 2d  >lhsalias = psp-
10fd0 3e 6c 68 73 61 6c 69 61 73 3b 0a 20 20 20 20 20  >lhsalias;.     
10fe0 20 20 20 20 20 72 70 2d 3e 6e 72 68 73 20 3d 20       rp->nrhs = 
10ff0 70 73 70 2d 3e 6e 72 68 73 3b 0a 20 20 20 20 20  psp->nrhs;.     
11000 20 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20       rp->code = 
11010 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  0;.          rp-
11020 3e 70 72 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20  >precsym = 0;.  
11030 20 20 20 20 20 20 20 20 72 70 2d 3e 69 6e 64 65          rp->inde
11040 78 20 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75  x = psp->gp->nru
11050 6c 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  le++;.          
11060 72 70 2d 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70  rp->nextlhs = rp
11070 2d 3e 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20  ->lhs->rule;.   
11080 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e         rp->lhs->
11090 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20  rule = rp;.     
110a0 20 20 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20       rp->next = 
110b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
110c0 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d   psp->firstrule=
110d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
110e0 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65    psp->firstrule
110f0 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65   = psp->lastrule
11100 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20   = rp;.         
11110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11120 20 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c      psp->lastrul
11130 65 2d 3e 6e 65 78 74 20 3d 20 72 70 3b 0a 20 20  e->next = rp;.  
11140 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c            psp->l
11150 61 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20  astrule = rp;.  
11160 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11170 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c      psp->prevrul
11180 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20  e = rp;.        
11190 7d 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  }.        psp->s
111a0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
111b0 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
111c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
111d0 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29   isalpha(x[0]) )
111e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  {.        if( ps
111f0 70 2d 3e 6e 72 68 73 3e 3d 4d 41 58 52 48 53 20  p->nrhs>=MAXRHS 
11200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
11210 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
11220 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
11230 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
11240 20 20 22 54 6f 6f 20 6d 61 6e 79 20 73 79 6d 62    "Too many symb
11250 6f 6c 73 20 6f 6e 20 52 48 53 20 6f 66 20 72 75  ols on RHS of ru
11260 6c 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  le beginning at 
11270 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20  \"%s\".",.      
11280 20 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20        x);.      
11290 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
112a0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t++;.          p
112b0 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
112c0 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
112d0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ROR;.        }el
112e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73  se{.          ps
112f0 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73  p->rhs[psp->nrhs
11300 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  ] = Symbol_new(x
11310 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
11320 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68  ->alias[psp->nrh
11330 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  s] = 0;.        
11340 20 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 20    psp->nrhs++;. 
11350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11360 65 6c 73 65 20 69 66 28 20 28 78 5b 30 5d 3d 3d  else if( (x[0]==
11370 27 7c 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27  '|' || x[0]=='/'
11380 29 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30  ) && psp->nrhs>0
11390 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
113a0 63 74 20 73 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d  ct symbol *msp =
113b0 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e   psp->rhs[psp->n
113c0 72 68 73 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  rhs-1];.        
113d0 69 66 28 20 6d 73 70 2d 3e 74 79 70 65 21 3d 4d  if( msp->type!=M
113e0 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
113f0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
11400 20 73 79 6d 62 6f 6c 20 2a 6f 72 69 67 73 70 20   symbol *origsp 
11410 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20 20  = msp;.         
11420 20 6d 73 70 20 3d 20 28 73 74 72 75 63 74 20 73   msp = (struct s
11430 79 6d 62 6f 6c 20 2a 29 20 63 61 6c 6c 6f 63 28  ymbol *) calloc(
11440 31 2c 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b  1,sizeof(*msp));
11450 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65  .          memse
11460 74 28 6d 73 70 2c 20 30 2c 20 73 69 7a 65 6f 66  t(msp, 0, sizeof
11470 28 2a 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20  (*msp));.       
11480 20 20 20 6d 73 70 2d 3e 74 79 70 65 20 3d 20 4d     msp->type = M
11490 55 4c 54 49 54 45 52 4d 49 4e 41 4c 3b 0a 20 20  ULTITERMINAL;.  
114a0 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75          msp->nsu
114b0 62 73 79 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  bsym = 1;.      
114c0 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20      msp->subsym 
114d0 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  = (struct symbol
114e0 20 2a 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69   **) calloc(1,si
114f0 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
11500 6f 6c 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ol*));.         
11510 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 20   msp->subsym[0] 
11520 3d 20 6f 72 69 67 73 70 3b 0a 20 20 20 20 20 20  = origsp;.      
11530 20 20 20 20 6d 73 70 2d 3e 6e 61 6d 65 20 3d 20      msp->name = 
11540 6f 72 69 67 73 70 2d 3e 6e 61 6d 65 3b 0a 20 20  origsp->name;.  
11550 20 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68 73          psp->rhs
11560 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20  [psp->nrhs-1] = 
11570 6d 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  msp;.        }. 
11580 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62         msp->nsub
11590 73 79 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d  sym++;.        m
115a0 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73 74  sp->subsym = (st
115b0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20  ruct symbol **) 
115c0 72 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62  realloc(msp->sub
115d0 73 79 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 73  sym,.          s
115e0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
115f0 62 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62 73  bol*)*msp->nsubs
11600 79 6d 29 3b 0a 20 20 20 20 20 20 20 20 6d 73 70  ym);.        msp
11610 2d 3e 73 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73  ->subsym[msp->ns
11620 75 62 73 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f  ubsym-1] = Symbo
11630 6c 5f 6e 65 77 28 26 78 5b 31 5d 29 3b 0a 20 20  l_new(&x[1]);.  
11640 20 20 20 20 20 20 69 66 28 20 69 73 6c 6f 77 65        if( islowe
11650 72 28 78 5b 31 5d 29 20 7c 7c 20 69 73 6c 6f 77  r(x[1]) || islow
11660 65 72 28 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30  er(msp->subsym[0
11670 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20  ]->name[0]) ){. 
11680 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
11690 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
116a0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
116b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43  ,.            "C
116c0 61 6e 6e 6f 74 20 66 6f 72 6d 20 61 20 63 6f 6d  annot form a com
116d0 70 6f 75 6e 64 20 63 6f 6e 74 61 69 6e 69 6e 67  pound containing
116e0 20 61 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 22   a non-terminal"
116f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
11700 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
11710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
11720 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28  lse if( x[0]=='(
11730 27 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30  ' && psp->nrhs>0
11740 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
11750 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49  >state = RHS_ALI
11760 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  AS_1;.      }els
11770 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
11780 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
11790 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
117a0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49  no,.          "I
117b0 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72  llegal character
117c0 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 3a   on RHS of rule:
117d0 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20   \"%s\".",x);.  
117e0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
117f0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
11800 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
11810 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
11820 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
11830 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
11840 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 31 3a 0a  se RHS_ALIAS_1:.
11850 20 20 20 20 20 20 69 66 28 20 69 73 61 6c 70 68        if( isalph
11860 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  a(x[0]) ){.     
11870 20 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73     psp->alias[ps
11880 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 78 3b 0a  p->nrhs-1] = x;.
11890 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
118a0 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 32  te = RHS_ALIAS_2
118b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
118c0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
118d0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
118e0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
118f0 20 20 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c            "\"%s\
11900 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  " is not a valid
11910 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52   alias for the R
11920 48 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22  HS symbol \"%s\"
11930 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78  \n",.          x
11940 2c 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e  ,psp->rhs[psp->n
11950 72 68 73 2d 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  rhs-1]->name);. 
11960 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
11970 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
11980 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
11990 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
119a0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
119b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
119c0 61 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 32 3a  ase RHS_ALIAS_2:
119d0 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
119e0 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =')' ){.        
119f0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f  psp->state = IN_
11a00 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  RHS;.      }else
11a10 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
11a20 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
11a30 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
11a40 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69  o,.          "Mi
11a50 73 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c  ssing \")\" foll
11a60 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20  owing LHS alias 
11a70 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73  name \"%s\".",ps
11a80 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20  p->lhsalias);.  
11a90 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
11aa0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
11ab0 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
11ac0 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
11ad0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
11ae0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
11af0 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44  se WAITING_FOR_D
11b00 45 43 4c 5f 4b 45 59 57 4f 52 44 3a 0a 20 20 20  ECL_KEYWORD:.   
11b10 20 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 78     if( isalpha(x
11b20 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
11b30 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64  psp->declkeyword
11b40 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73   = x;.        ps
11b50 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
11b60 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
11b70 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20  >decllinenoslot 
11b80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 0;.        psp
11b90 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
11ba0 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  o = 1;.        p
11bb0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
11bc0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47  ING_FOR_DECL_ARG
11bd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  ;.        if( st
11be0 72 63 6d 70 28 78 2c 22 6e 61 6d 65 22 29 3d 3d  rcmp(x,"name")==
11bf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
11c00 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
11c10 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d  = &(psp->gp->nam
11c20 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  e);.          ps
11c30 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
11c40 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
11c50 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
11c60 28 78 2c 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30  (x,"include")==0
11c70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
11c80 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
11c90 20 26 28 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c   &(psp->gp->incl
11ca0 75 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ude);.        }e
11cb0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
11cc0 2c 22 63 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20  ,"code")==0 ){. 
11cd0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
11ce0 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
11cf0 70 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64 65  p->gp->extracode
11d00 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
11d10 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74   if( strcmp(x,"t
11d20 6f 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72 22  oken_destructor"
11d30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11d40 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
11d50 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74  ot = &psp->gp->t
11d60 6f 6b 65 6e 64 65 73 74 3b 0a 20 20 20 20 20 20  okendest;.      
11d70 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
11d80 6d 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 64 65  mp(x,"default_de
11d90 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b  structor")==0 ){
11da0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11db0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70  declargslot = &p
11dc0 73 70 2d 3e 67 70 2d 3e 76 61 72 64 65 73 74 3b  sp->gp->vardest;
11dd0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11de0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b  f( strcmp(x,"tok
11df0 65 6e 5f 70 72 65 66 69 78 22 29 3d 3d 30 20 29  en_prefix")==0 )
11e00 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
11e10 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
11e20 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72  psp->gp->tokenpr
11e30 65 66 69 78 3b 0a 20 20 20 20 20 20 20 20 20 20  efix;.          
11e40 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
11e50 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  acro = 0;.      
11e60 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
11e70 6d 70 28 78 2c 22 73 79 6e 74 61 78 5f 65 72 72  mp(x,"syntax_err
11e80 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  or")==0 ){.     
11e90 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
11ea0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
11eb0 70 2d 3e 65 72 72 6f 72 29 3b 0a 20 20 20 20 20  p->error);.     
11ec0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
11ed0 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 61 63 63  cmp(x,"parse_acc
11ee0 65 70 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ept")==0 ){.    
11ef0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
11f00 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
11f10 67 70 2d 3e 61 63 63 65 70 74 29 3b 0a 20 20 20  gp->accept);.   
11f20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
11f30 74 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 66  trcmp(x,"parse_f
11f40 61 69 6c 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20  ailure")==0 ){. 
11f50 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
11f60 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
11f70 70 2d 3e 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b  p->gp->failure);
11f80 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11f90 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61  f( strcmp(x,"sta
11fa0 63 6b 5f 6f 76 65 72 66 6c 6f 77 22 29 3d 3d 30  ck_overflow")==0
11fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
11fc0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
11fd0 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72   &(psp->gp->over
11fe0 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d  flow);.        }
11ff0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
12000 78 2c 22 65 78 74 72 61 5f 61 72 67 75 6d 65 6e  x,"extra_argumen
12010 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
12020 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
12030 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
12040 2d 3e 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20  ->arg);.        
12050 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e    psp->insertLin
12060 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20  eMacro = 0;.    
12070 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
12080 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79  rcmp(x,"token_ty
12090 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pe")==0 ){.     
120a0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
120b0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
120c0 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20  p->tokentype);. 
120d0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
120e0 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
120f0 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
12100 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64   if( strcmp(x,"d
12110 65 66 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30  efault_type")==0
12120 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
12130 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
12140 20 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74   &(psp->gp->vart
12150 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ype);.          
12160 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
12170 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  acro = 0;.      
12180 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
12190 6d 70 28 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65  mp(x,"stack_size
121a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
121b0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
121c0 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
121d0 3e 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20  >stacksize);.   
121e0 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
121f0 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
12200 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
12210 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61  f( strcmp(x,"sta
12220 72 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29  rt_symbol")==0 )
12230 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
12240 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
12250 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29  (psp->gp->start)
12260 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
12270 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
12280 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
12290 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
122a0 2c 22 6c 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20  ,"left")==0 ){. 
122b0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
122c0 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  eccounter++;.   
122d0 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
122e0 61 73 73 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20  assoc = LEFT;.  
122f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
12300 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
12310 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42  _PRECEDENCE_SYMB
12320 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OL;.        }els
12330 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
12340 72 69 67 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20  right")==0 ){.  
12350 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
12360 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  ccounter++;.    
12370 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
12380 73 73 6f 63 20 3d 20 52 49 47 48 54 3b 0a 20 20  ssoc = RIGHT;.  
12390 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
123a0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
123b0 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42  _PRECEDENCE_SYMB
123c0 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OL;.        }els
123d0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
123e0 6e 6f 6e 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b  nonassoc")==0 ){
123f0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12400 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  preccounter++;. 
12410 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
12420 63 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a  classoc = NONE;.
12430 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
12440 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
12450 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59  OR_PRECEDENCE_SY
12460 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65  MBOL;.        }e
12470 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
12480 2c 22 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d  ,"destructor")==
12490 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
124a0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
124b0 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54  ING_FOR_DESTRUCT
124c0 4f 52 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20  OR_SYMBOL;.     
124d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
124e0 63 6d 70 28 78 2c 22 74 79 70 65 22 29 3d 3d 30  cmp(x,"type")==0
124f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
12500 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
12510 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f  NG_FOR_DATATYPE_
12520 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20  SYMBOL;.        
12530 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
12540 28 78 2c 22 66 61 6c 6c 62 61 63 6b 22 29 3d 3d  (x,"fallback")==
12550 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
12560 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30  sp->fallback = 0
12570 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
12580 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
12590 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44  _FOR_FALLBACK_ID
125a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
125b0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 77 69  if( strcmp(x,"wi
125c0 6c 64 63 61 72 64 22 29 3d 3d 30 20 29 7b 0a 20  ldcard")==0 ){. 
125d0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
125e0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
125f0 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 3b 0a 20  R_WILDCARD_ID;. 
12600 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
12610 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e   strcmp(x,"token
12620 5f 63 6c 61 73 73 22 29 3d 3d 30 20 29 7b 0a 20  _class")==0 ){. 
12630 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
12640 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
12650 52 5f 43 4c 41 53 53 5f 49 44 3b 0a 20 20 20 20  R_CLASS_ID;.    
12660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12670 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
12680 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
12690 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
126a0 20 20 20 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f            "Unkno
126b0 77 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b  wn declaration k
126c0 65 79 77 6f 72 64 3a 20 5c 22 25 25 25 73 5c 22  eyword: \"%%%s\"
126d0 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20  .",x);.         
126e0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
126f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
12700 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
12710 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
12720 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12740 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
12750 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
12760 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
12770 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 64 65 63      "Illegal dec
12780 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64  laration keyword
12790 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20  : \"%s\".",x);. 
127a0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
127b0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
127c0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
127d0 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
127e0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
127f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
12800 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
12810 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f  DESTRUCTOR_SYMBO
12820 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  L:.      if( !is
12830 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
12840 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
12850 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
12860 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
12870 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f            "Symbo
12880 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61  l name missing a
12890 66 74 65 72 20 25 25 64 65 73 74 72 75 63 74 6f  fter %%destructo
128a0 72 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20  r keyword");.   
128b0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
128c0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
128d0 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
128e0 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
128f0 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
12900 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
12910 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d  symbol *sp = Sym
12920 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
12930 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
12940 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74  slot = &sp->dest
12950 72 75 63 74 6f 72 3b 0a 20 20 20 20 20 20 20 20  ructor;.        
12960 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73  psp->decllinenos
12970 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 4c  lot = &sp->destL
12980 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70  ineno;.        p
12990 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
129a0 63 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  cro = 1;.       
129b0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
129c0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
129d0 52 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  RG;.      }.    
129e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
129f0 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41  e WAITING_FOR_DA
12a00 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3a 0a 20  TATYPE_SYMBOL:. 
12a10 20 20 20 20 20 69 66 28 20 21 69 73 61 6c 70 68       if( !isalph
12a20 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  a(x[0]) ){.     
12a30 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
12a40 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
12a50 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
12a60 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61        "Symbol na
12a70 6d 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72  me missing after
12a80 20 25 25 74 79 70 65 20 6b 65 79 77 6f 72 64 22   %%type keyword"
12a90 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
12aa0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
12ab0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
12ac0 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
12ad0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
12ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
12af0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
12b00 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78   = Symbol_find(x
12b10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 28 73  );.        if((s
12b20 70 29 20 26 26 20 28 73 70 2d 3e 64 61 74 61 74  p) && (sp->datat
12b30 79 70 65 29 29 7b 0a 20 20 20 20 20 20 20 20 20  ype)){.         
12b40 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
12b50 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
12b60 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
12b70 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 25 25        "Symbol %%
12b80 74 79 70 65 20 5c 22 25 73 5c 22 20 61 6c 72 65  type \"%s\" alre
12b90 61 64 79 20 64 65 66 69 6e 65 64 22 2c 20 78 29  ady defined", x)
12ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
12bb0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
12bc0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12bd0 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
12be0 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  _DECL_ERROR;.   
12bf0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12c00 20 20 20 20 20 20 69 66 20 28 21 73 70 29 7b 0a        if (!sp){.
12c10 20 20 20 20 20 20 20 20 20 20 20 20 73 70 20 3d              sp =
12c20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
12c30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12c40 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
12c50 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61  rgslot = &sp->da
12c60 74 61 74 79 70 65 3b 0a 20 20 20 20 20 20 20 20  tatype;.        
12c70 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e    psp->insertLin
12c80 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20  eMacro = 0;.    
12c90 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
12ca0 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
12cb0 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 20  ECL_ARG;.       
12cc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
12cd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
12ce0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45   WAITING_FOR_PRE
12cf0 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a  CEDENCE_SYMBOL:.
12d00 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
12d10 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '.' ){.        p
12d20 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
12d30 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
12d40 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RULE;.      }els
12d50 65 20 69 66 28 20 69 73 75 70 70 65 72 28 78 5b  e if( isupper(x[
12d60 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  0]) ){.        s
12d70 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
12d80 3b 0a 20 20 20 20 20 20 20 20 73 70 20 3d 20 53  ;.        sp = S
12d90 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
12da0 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 70 72        if( sp->pr
12db0 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ec>=0 ){.       
12dc0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
12dd0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
12de0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
12df0 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20          "Symbol 
12e00 5c 22 25 73 5c 22 20 68 61 73 20 61 6c 72 65 61  \"%s\" has alrea
12e10 64 79 20 62 65 20 67 69 76 65 6e 20 61 20 70 72  dy be given a pr
12e20 65 63 65 64 65 6e 63 65 2e 22 2c 78 29 3b 0a 20  ecedence.",x);. 
12e30 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
12e40 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
12e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12e60 20 20 20 73 70 2d 3e 70 72 65 63 20 3d 20 70 73     sp->prec = ps
12e70 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 3b 0a  p->preccounter;.
12e80 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 61 73            sp->as
12e90 73 6f 63 20 3d 20 70 73 70 2d 3e 64 65 63 6c 61  soc = psp->decla
12ea0 73 73 6f 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ssoc;.        }.
12eb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12ec0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
12ed0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
12ee0 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
12ef0 20 20 20 20 20 20 20 20 22 43 61 6e 27 74 20 61          "Can't a
12f00 73 73 69 67 6e 20 61 20 70 72 65 63 65 64 65 6e  ssign a preceden
12f10 63 65 20 74 6f 20 5c 22 25 73 5c 22 2e 22 2c 78  ce to \"%s\".",x
12f20 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
12f30 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
12f40 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
12f50 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
12f60 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3a 0a  G_FOR_DECL_ARG:.
12f70 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
12f80 27 7b 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22  '{' || x[0]=='\"
12f90 27 20 7c 7c 20 69 73 61 6c 6e 75 6d 28 78 5b 30  ' || isalnum(x[0
12fa0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ]) ){.        co
12fb0 6e 73 74 20 63 68 61 72 20 2a 7a 4f 6c 64 2c 20  nst char *zOld, 
12fc0 2a 7a 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 63  *zNew;.        c
12fd0 68 61 72 20 2a 7a 42 75 66 2c 20 2a 7a 3b 0a 20  har *zBuf, *z;. 
12fe0 20 20 20 20 20 20 20 69 6e 74 20 6e 4f 6c 64 2c         int nOld,
12ff0 20 6e 2c 20 6e 4c 69 6e 65 20 3d 20 30 2c 20 6e   n, nLine = 0, n
13000 4e 65 77 2c 20 6e 42 61 63 6b 3b 0a 20 20 20 20  New, nBack;.    
13010 20 20 20 20 69 6e 74 20 61 64 64 4c 69 6e 65 4d      int addLineM
13020 61 63 72 6f 3b 0a 20 20 20 20 20 20 20 20 63 68  acro;.        ch
13030 61 72 20 7a 4c 69 6e 65 5b 35 30 5d 3b 0a 20 20  ar zLine[50];.  
13040 20 20 20 20 20 20 7a 4e 65 77 20 3d 20 78 3b 0a        zNew = x;.
13050 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 65 77          if( zNew
13060 5b 30 5d 3d 3d 27 22 27 20 7c 7c 20 7a 4e 65 77  [0]=='"' || zNew
13070 5b 30 5d 3d 3d 27 7b 27 20 29 20 7a 4e 65 77 2b  [0]=='{' ) zNew+
13080 2b 3b 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 20  +;.        nNew 
13090 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4e  = lemonStrlen(zN
130a0 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
130b0 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c   *psp->declargsl
130c0 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ot ){.          
130d0 7a 4f 6c 64 20 3d 20 2a 70 73 70 2d 3e 64 65 63  zOld = *psp->dec
130e0 6c 61 72 67 73 6c 6f 74 3b 0a 20 20 20 20 20 20  largslot;.      
130f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13100 20 20 20 7a 4f 6c 64 20 3d 20 22 22 3b 0a 20 20     zOld = "";.  
13110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13120 6e 4f 6c 64 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c  nOld = lemonStrl
13130 65 6e 28 7a 4f 6c 64 29 3b 0a 20 20 20 20 20 20  en(zOld);.      
13140 20 20 6e 20 3d 20 6e 4f 6c 64 20 2b 20 6e 4e 65    n = nOld + nNe
13150 77 20 2b 20 32 30 3b 0a 20 20 20 20 20 20 20 20  w + 20;.        
13160 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 21  addLineMacro = !
13170 70 73 70 2d 3e 67 70 2d 3e 6e 6f 6c 69 6e 65 6e  psp->gp->nolinen
13180 6f 73 66 6c 61 67 20 26 26 20 70 73 70 2d 3e 69  osflag && psp->i
13190 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 26  nsertLineMacro &
131a0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
131b0 20 20 20 20 20 20 20 20 20 20 28 70 73 70 2d 3e            (psp->
131c0 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3d 3d  decllinenoslot==
131d0 30 20 7c 7c 20 70 73 70 2d 3e 64 65 63 6c 6c 69  0 || psp->declli
131e0 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 21 3d 30 29 3b  nenoslot[0]!=0);
131f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
13200 4c 69 6e 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20  LineMacro ){.   
13210 20 20 20 20 20 20 20 66 6f 72 28 7a 3d 70 73 70         for(z=psp
13220 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 6e 42 61 63  ->filename, nBac
13230 6b 3d 30 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  k=0; *z; z++){. 
13240 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a             if( *
13250 7a 3d 3d 27 5c 5c 27 20 29 20 6e 42 61 63 6b 2b  z=='\\' ) nBack+
13260 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
13270 20 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73           lemon_s
13280 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 23  printf(zLine, "#
13290 6c 69 6e 65 20 25 64 20 22 2c 20 70 73 70 2d 3e  line %d ", psp->
132a0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 29 3b 0a 20 20  tokenlineno);.  
132b0 20 20 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20          nLine = 
132c0 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4c 69 6e  lemonStrlen(zLin
132d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20  e);.          n 
132e0 2b 3d 20 6e 4c 69 6e 65 20 2b 20 6c 65 6d 6f 6e  += nLine + lemon
132f0 53 74 72 6c 65 6e 28 70 73 70 2d 3e 66 69 6c 65  Strlen(psp->file
13300 6e 61 6d 65 29 20 2b 20 6e 42 61 63 6b 3b 0a 20  name) + nBack;. 
13310 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13320 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c   *psp->declargsl
13330 6f 74 20 3d 20 28 63 68 61 72 20 2a 29 20 72 65  ot = (char *) re
13340 61 6c 6c 6f 63 28 2a 70 73 70 2d 3e 64 65 63 6c  alloc(*psp->decl
13350 61 72 67 73 6c 6f 74 2c 20 6e 29 3b 0a 20 20 20  argslot, n);.   
13360 20 20 20 20 20 7a 42 75 66 20 3d 20 2a 70 73 70       zBuf = *psp
13370 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 2b 20  ->declargslot + 
13380 6e 4f 6c 64 3b 0a 20 20 20 20 20 20 20 20 69 66  nOld;.        if
13390 28 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20 29  ( addLineMacro )
133a0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
133b0 6e 4f 6c 64 20 26 26 20 7a 42 75 66 5b 2d 31 5d  nOld && zBuf[-1]
133c0 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  !='\n' ){.      
133d0 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20        *(zBuf++) 
133e0 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
133f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
13400 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65  mcpy(zBuf, zLine
13410 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  , nLine);.      
13420 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4c 69 6e      zBuf += nLin
13430 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a  e;.          *(z
13440 42 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20  Buf++) = '"';.  
13450 20 20 20 20 20 20 20 20 66 6f 72 28 7a 3d 70 73          for(z=ps
13460 70 2d 3e 66 69 6c 65 6e 61 6d 65 3b 20 2a 7a 3b  p->filename; *z;
13470 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   z++){.         
13480 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20     if( *z=='\\' 
13490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
134a0 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 5c   *(zBuf++) = '\\
134b0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ';.            }
134c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 7a  .            *(z
134d0 42 75 66 2b 2b 29 20 3d 20 2a 7a 3b 0a 20 20 20  Buf++) = *z;.   
134e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
134f0 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27     *(zBuf++) = '
13500 22 27 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28  "';.          *(
13510 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a  zBuf++) = '\n';.
13520 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13530 20 20 69 66 28 20 70 73 70 2d 3e 64 65 63 6c 6c    if( psp->decll
13540 69 6e 65 6e 6f 73 6c 6f 74 20 26 26 20 70 73 70  inenoslot && psp
13550 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74  ->decllinenoslot
13560 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]==0 ){.      
13570 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e      psp->decllin
13580 65 6e 6f 73 6c 6f 74 5b 30 5d 20 3d 20 70 73 70  enoslot[0] = psp
13590 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20  ->tokenlineno;. 
135a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
135b0 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4e   memcpy(zBuf, zN
135c0 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20  ew, nNew);.     
135d0 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4e 65 77 3b     zBuf += nNew;
135e0 0a 20 20 20 20 20 20 20 20 2a 7a 42 75 66 20 3d  .        *zBuf =
135f0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
13600 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
13610 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
13620 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
13630 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
13640 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
13650 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
13660 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65  .          "Ille
13670 67 61 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  gal argument to 
13680 25 25 25 73 3a 20 25 73 22 2c 70 73 70 2d 3e 64  %%%s: %s",psp->d
13690 65 63 6c 6b 65 79 77 6f 72 64 2c 78 29 3b 0a 20  eclkeyword,x);. 
136a0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
136b0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
136c0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
136d0 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
136e0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
136f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
13700 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
13710 46 41 4c 4c 42 41 43 4b 5f 49 44 3a 0a 20 20 20  FALLBACK_ID:.   
13720 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27     if( x[0]=='.'
13730 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
13740 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
13750 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
13760 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
13770 66 28 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d  f( !isupper(x[0]
13780 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ) ){.        Err
13790 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
137a0 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ame, psp->tokenl
137b0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
137c0 20 22 25 25 66 61 6c 6c 62 61 63 6b 20 61 72 67   "%%fallback arg
137d0 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f  ument \"%s\" sho
137e0 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c  uld be a token",
137f0 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70   x);.        psp
13800 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
13810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13820 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
13830 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65   *sp = Symbol_ne
13840 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  w(x);.        if
13850 28 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d  ( psp->fallback=
13860 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13870 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20  psp->fallback = 
13880 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  sp;.        }els
13890 65 20 69 66 28 20 73 70 2d 3e 66 61 6c 6c 62 61  e if( sp->fallba
138a0 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
138b0 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
138c0 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b  lename, psp->tok
138d0 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
138e0 20 20 20 20 20 20 22 4d 6f 72 65 20 74 68 61 6e        "More than
138f0 20 6f 6e 65 20 66 61 6c 6c 62 61 63 6b 20 61 73   one fallback as
13900 73 69 67 6e 65 64 20 74 6f 20 74 6f 6b 65 6e 20  signed to token 
13910 25 73 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  %s", x);.       
13920 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
13930 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
13940 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d  e{.          sp-
13950 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 70 73 70 2d  >fallback = psp-
13960 3e 66 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20  >fallback;.     
13970 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 68 61       psp->gp->ha
13980 73 5f 66 61 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  s_fallback = 1;.
13990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
139a0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
139b0 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
139c0 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 3a  FOR_WILDCARD_ID:
139d0 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
139e0 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
139f0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
13a00 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
13a10 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  _RULE;.      }el
13a20 73 65 20 69 66 28 20 21 69 73 75 70 70 65 72 28  se if( !isupper(
13a30 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
13a40 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
13a50 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f  ilename, psp->to
13a60 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
13a70 20 20 20 20 20 22 25 25 77 69 6c 64 63 61 72 64       "%%wildcard
13a80 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22   argument \"%s\"
13a90 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b   should be a tok
13aa0 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  en", x);.       
13ab0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
13ac0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13ad0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
13ae0 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f  mbol *sp = Symbo
13af0 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
13b00 20 20 69 66 28 20 70 73 70 2d 3e 67 70 2d 3e 77    if( psp->gp->w
13b10 69 6c 64 63 61 72 64 3d 3d 30 20 29 7b 0a 20 20  ildcard==0 ){.  
13b20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d          psp->gp-
13b30 3e 77 69 6c 64 63 61 72 64 20 3d 20 73 70 3b 0a  >wildcard = sp;.
13b40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
13b50 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
13b60 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
13b70 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
13b80 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  o,.            "
13b90 45 78 74 72 61 20 77 69 6c 64 63 61 72 64 20 74  Extra wildcard t
13ba0 6f 20 74 6f 6b 65 6e 3a 20 25 73 22 2c 20 78 29  o token: %s", x)
13bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
13bc0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
13bd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13be0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13bf0 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
13c00 5f 43 4c 41 53 53 5f 49 44 3a 0a 20 20 20 20 20  _CLASS_ID:.     
13c10 20 69 66 28 20 21 69 73 6c 6f 77 65 72 28 78 5b   if( !islower(x[
13c20 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
13c30 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
13c40 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65  ename, psp->toke
13c50 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
13c60 20 20 20 22 25 25 74 6f 6b 65 6e 5f 63 6c 61 73     "%%token_clas
13c70 73 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77  s must be follow
13c80 65 64 20 62 79 20 61 6e 20 69 64 65 6e 74 69 66  ed by an identif
13c90 69 65 72 3a 20 22 2c 20 78 29 3b 0a 20 20 20 20  ier: ", x);.    
13ca0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
13cb0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
13cc0 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
13cd0 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
13ce0 52 3b 0a 20 20 20 20 20 7d 65 6c 73 65 20 69 66  R;.     }else if
13cf0 28 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29  ( Symbol_find(x)
13d00 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
13d10 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
13d20 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
13d30 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
13d40 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 61  "Symbol \"%s\" a
13d50 6c 72 65 61 64 79 20 75 73 65 64 22 2c 20 78 29  lready used", x)
13d60 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
13d70 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
13d80 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
13d90 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
13da0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
13db0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 73  else{.        ps
13dc0 70 2d 3e 74 6b 63 6c 61 73 73 20 3d 20 53 79 6d  p->tkclass = Sym
13dd0 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
13de0 20 20 20 20 70 73 70 2d 3e 74 6b 63 6c 61 73 73      psp->tkclass
13df0 2d 3e 74 79 70 65 20 3d 20 4d 55 4c 54 49 54 45  ->type = MULTITE
13e00 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  RMINAL;.        
13e10 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
13e20 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 54  TING_FOR_CLASS_T
13e30 4f 4b 45 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OKEN;.      }.  
13e40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
13e50 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
13e60 43 4c 41 53 53 5f 54 4f 4b 45 4e 3a 0a 20 20 20  CLASS_TOKEN:.   
13e70 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27     if( x[0]=='.'
13e80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
13e90 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
13ea0 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
13eb0 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
13ec0 66 28 20 69 73 75 70 70 65 72 28 78 5b 30 5d 29  f( isupper(x[0])
13ed0 20 7c 7c 20 28 28 78 5b 30 5d 3d 3d 27 7c 27 20   || ((x[0]=='|' 
13ee0 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29 20 26 26  || x[0]=='/') &&
13ef0 20 69 73 75 70 70 65 72 28 78 5b 31 5d 29 29 20   isupper(x[1])) 
13f00 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
13f10 74 20 73 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20  t symbol *msp = 
13f20 70 73 70 2d 3e 74 6b 63 6c 61 73 73 3b 0a 20 20  psp->tkclass;.  
13f30 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73        msp->nsubs
13f40 79 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73  ym++;.        ms
13f50 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73 74 72  p->subsym = (str
13f60 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 72  uct symbol **) r
13f70 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73  ealloc(msp->subs
13f80 79 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 73 69  ym,.          si
13f90 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
13fa0 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79  ol*)*msp->nsubsy
13fb0 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  m);.        if( 
13fc0 21 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29  !isupper(x[0]) )
13fd0 20 78 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73   x++;.        ms
13fe0 70 2d 3e 73 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e  p->subsym[msp->n
13ff0 73 75 62 73 79 6d 2d 31 5d 20 3d 20 53 79 6d 62  subsym-1] = Symb
14000 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
14010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14020 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
14030 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b  lename, psp->tok
14040 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
14050 20 20 20 20 22 25 25 74 6f 6b 65 6e 5f 63 6c 61      "%%token_cla
14060 73 73 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73  ss argument \"%s
14070 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74  \" should be a t
14080 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20  oken", x);.     
14090 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
140a0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
140b0 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
140c0 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
140d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
140e0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
140f0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
14100 45 5f 45 52 52 4f 52 3a 0a 2f 2a 20 20 20 20 20  E_ERROR:./*     
14110 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
14120 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
14130 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
14140 52 5f 52 55 4c 45 3b 0a 2a 2a 20 20 20 20 20 20  R_RULE;.**      
14150 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 63 61  break; */.    ca
14160 73 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f  se RESYNC_AFTER_
14170 44 45 43 4c 5f 45 52 52 4f 52 3a 0a 20 20 20 20  DECL_ERROR:.    
14180 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
14190 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57  ) psp->state = W
141a0 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
141b0 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 69  OR_RULE;.      i
141c0 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 20 70  f( x[0]=='%' ) p
141d0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
141e0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59  ING_FOR_DECL_KEY
141f0 57 4f 52 44 3b 0a 20 20 20 20 20 20 62 72 65 61  WORD;.      brea
14200 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e  k;.  }.}../* Run
14210 20 74 68 65 20 70 72 65 70 72 6f 63 65 73 73 6f   the preprocesso
14220 72 20 6f 76 65 72 20 74 68 65 20 69 6e 70 75 74  r over the input
14230 20 66 69 6c 65 20 74 65 78 74 2e 20 20 54 68 65   file text.  The
14240 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
14250 73 0a 2a 2a 20 61 7a 44 65 66 69 6e 65 5b 30 5d  s.** azDefine[0]
14260 20 74 68 72 6f 75 67 68 20 61 7a 44 65 66 69 6e   through azDefin
14270 65 5b 6e 44 65 66 69 6e 65 2d 31 5d 20 63 6f 6e  e[nDefine-1] con
14280 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20  tains the names 
14290 6f 66 20 61 6c 6c 20 64 65 66 69 6e 65 64 0a 2a  of all defined.*
142a0 2a 20 6d 61 63 72 6f 73 2e 20 20 54 68 69 73 20  * macros.  This 
142b0 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 66 6f  routine looks fo
142c0 72 20 22 25 69 66 64 65 66 22 20 61 6e 64 20 22  r "%ifdef" and "
142d0 25 69 66 6e 64 65 66 22 20 61 6e 64 20 22 25 65  %ifndef" and "%e
142e0 6e 64 69 66 22 20 61 6e 64 0a 2a 2a 20 63 6f 6d  ndif" and.** com
142f0 6d 65 6e 74 73 20 74 68 65 6d 20 6f 75 74 2e 20  ments them out. 
14300 20 54 65 78 74 20 69 6e 20 62 65 74 77 65 65 6e   Text in between
14310 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74   is also comment
14320 65 64 20 6f 75 74 20 61 73 20 61 70 70 72 6f 70  ed out as approp
14330 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
14340 20 76 6f 69 64 20 70 72 65 70 72 6f 63 65 73 73   void preprocess
14350 5f 69 6e 70 75 74 28 63 68 61 72 20 2a 7a 29 7b  _input(char *z){
14360 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20  .  int i, j, k, 
14370 6e 3b 0a 20 20 69 6e 74 20 65 78 63 6c 75 64 65  n;.  int exclude
14380 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 74 61 72   = 0;.  int star
14390 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 69 6e  t = 0;.  int lin
143a0 65 6e 6f 20 3d 20 31 3b 0a 20 20 69 6e 74 20 73  eno = 1;.  int s
143b0 74 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20 31 3b  tart_lineno = 1;
143c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d  .  for(i=0; z[i]
143d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
143e0 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  z[i]=='\n' ) lin
143f0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a  eno++;.    if( z
14400 5b 69 5d 21 3d 27 25 27 20 7c 7c 20 28 69 3e 30  [i]!='%' || (i>0
14410 20 26 26 20 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27   && z[i-1]!='\n'
14420 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
14430 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 26 7a    if( strncmp(&z
14440 5b 69 5d 2c 22 25 65 6e 64 69 66 22 2c 36 29 3d  [i],"%endif",6)=
14450 3d 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b  =0 && isspace(z[
14460 69 2b 36 5d 29 20 29 7b 0a 20 20 20 20 20 20 69  i+6]) ){.      i
14470 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20  f( exclude ){.  
14480 20 20 20 20 20 20 65 78 63 6c 75 64 65 2d 2d 3b        exclude--;
14490 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78 63  .        if( exc
144a0 6c 75 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lude==0 ){.     
144b0 20 20 20 20 20 66 6f 72 28 6a 3d 73 74 61 72 74       for(j=start
144c0 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 20 69 66 28 20  ; j<i; j++) if( 
144d0 7a 5b 6a 5d 21 3d 27 5c 6e 27 20 29 20 7a 5b 6a  z[j]!='\n' ) z[j
144e0 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
144f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
14500 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26   for(j=i; z[j] &
14510 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b  & z[j]!='\n'; j+
14520 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20  +) z[j] = ' ';. 
14530 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 73 74     }else if( (st
14540 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66  rncmp(&z[i],"%if
14550 64 65 66 22 2c 36 29 3d 3d 30 20 26 26 20 69 73  def",6)==0 && is
14560 73 70 61 63 65 28 7a 5b 69 2b 36 5d 29 29 0a 20  space(z[i+6])). 
14570 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 74 72           || (str
14580 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 6e  ncmp(&z[i],"%ifn
14590 64 65 66 22 2c 37 29 3d 3d 30 20 26 26 20 69 73  def",7)==0 && is
145a0 73 70 61 63 65 28 7a 5b 69 2b 37 5d 29 29 20 29  space(z[i+7])) )
145b0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78 63 6c  {.      if( excl
145c0 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ude ){.        e
145d0 78 63 6c 75 64 65 2b 2b 3b 0a 20 20 20 20 20 20  xclude++;.      
145e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
145f0 6f 72 28 6a 3d 69 2b 37 3b 20 69 73 73 70 61 63  or(j=i+7; isspac
14600 65 28 7a 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a  e(z[j]); j++){}.
14610 20 20 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b          for(n=0;
14620 20 7a 5b 6a 2b 6e 5d 20 26 26 20 21 69 73 73 70   z[j+n] && !issp
14630 61 63 65 28 7a 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b  ace(z[j+n]); n++
14640 29 7b 7d 0a 20 20 20 20 20 20 20 20 65 78 63 6c  ){}.        excl
14650 75 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ude = 1;.       
14660 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 44 65 66   for(k=0; k<nDef
14670 69 6e 65 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  ine; k++){.     
14680 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
14690 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 2c 26 7a 5b  (azDefine[k],&z[
146a0 6a 5d 2c 6e 29 3d 3d 30 20 26 26 20 6c 65 6d 6f  j],n)==0 && lemo
146b0 6e 53 74 72 6c 65 6e 28 61 7a 44 65 66 69 6e 65  nStrlen(azDefine
146c0 5b 6b 5d 29 3d 3d 6e 20 29 7b 0a 20 20 20 20 20  [k])==n ){.     
146d0 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 20 3d         exclude =
146e0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
146f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
14700 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
14710 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 33 5d 3d       if( z[i+3]=
14720 3d 27 6e 27 20 29 20 65 78 63 6c 75 64 65 20 3d  ='n' ) exclude =
14730 20 21 65 78 63 6c 75 64 65 3b 0a 20 20 20 20 20   !exclude;.     
14740 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29     if( exclude )
14750 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72  {.          star
14760 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
14770 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20   start_lineno = 
14780 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20  lineno;.        
14790 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
147a0 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26  for(j=i; z[j] &&
147b0 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b   z[j]!='\n'; j++
147c0 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20  ) z[j] = ' ';.  
147d0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 78    }.  }.  if( ex
147e0 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 66 70 72  clude ){.    fpr
147f0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 75 6e 74  intf(stderr,"unt
14800 65 72 6d 69 6e 61 74 65 64 20 25 25 69 66 64 65  erminated %%ifde
14810 66 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 6c 69  f starting on li
14820 6e 65 20 25 64 5c 6e 22 2c 20 73 74 61 72 74 5f  ne %d\n", start_
14830 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 65 78 69  lineno);.    exi
14840 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  t(1);.  }.}../* 
14850 49 6e 20 73 70 69 74 65 20 6f 66 20 69 74 73 20  In spite of its 
14860 6e 61 6d 65 2c 20 74 68 69 73 20 66 75 6e 63 74  name, this funct
14870 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ion is really a 
14880 73 63 61 6e 6e 65 72 2e 20 20 49 74 20 72 65 61  scanner.  It rea
14890 64 0a 2a 2a 20 69 6e 20 74 68 65 20 65 6e 74 69  d.** in the enti
148a0 72 65 20 69 6e 70 75 74 20 66 69 6c 65 20 28 61  re input file (a
148b0 6c 6c 20 61 74 20 6f 6e 63 65 29 20 74 68 65 6e  ll at once) then
148c0 20 74 6f 6b 65 6e 69 7a 65 73 20 69 74 2e 20 20   tokenizes it.  
148d0 45 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20 69 73  Each.** token is
148e0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 66   passed to the f
148f0 75 6e 63 74 69 6f 6e 20 22 70 61 72 73 65 6f 6e  unction "parseon
14900 65 74 6f 6b 65 6e 22 20 77 68 69 63 68 20 62 75  etoken" which bu
14910 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20 74 68 65 20  ilds all.** the 
14920 61 70 70 72 6f 70 72 69 61 74 65 20 64 61 74 61  appropriate data
14930 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74   structures in t
14940 68 65 20 67 6c 6f 62 61 6c 20 73 74 61 74 65 20  he global state 
14950 76 65 63 74 6f 72 20 22 67 70 22 2e 0a 2a 2f 0a  vector "gp"..*/.
14960 76 6f 69 64 20 50 61 72 73 65 28 73 74 72 75 63  void Parse(struc
14970 74 20 6c 65 6d 6f 6e 20 2a 67 70 29 0a 7b 0a 20  t lemon *gp).{. 
14980 20 73 74 72 75 63 74 20 70 73 74 61 74 65 20 70   struct pstate p
14990 73 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 20  s;.  FILE *fp;. 
149a0 20 63 68 61 72 20 2a 66 69 6c 65 62 75 66 3b 0a   char *filebuf;.
149b0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66    unsigned int f
149c0 69 6c 65 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c  ilesize;.  int l
149d0 69 6e 65 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a  ineno;.  int c;.
149e0 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78    char *cp, *nex
149f0 74 63 70 3b 0a 20 20 69 6e 74 20 73 74 61 72 74  tcp;.  int start
14a00 6c 69 6e 65 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d  line = 0;..  mem
14a10 73 65 74 28 26 70 73 2c 20 27 5c 30 27 2c 20 73  set(&ps, '\0', s
14a20 69 7a 65 6f 66 28 70 73 29 29 3b 0a 20 20 70 73  izeof(ps));.  ps
14a30 2e 67 70 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66  .gp = gp;.  ps.f
14a40 69 6c 65 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69  ilename = gp->fi
14a50 6c 65 6e 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72  lename;.  ps.err
14a60 6f 72 63 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e  orcnt = 0;.  ps.
14a70 73 74 61 74 65 20 3d 20 49 4e 49 54 49 41 4c 49  state = INITIALI
14a80 5a 45 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  ZE;..  /* Begin 
14a90 62 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 69  by reading the i
14aa0 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66  nput file */.  f
14ab0 70 20 3d 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c  p = fopen(ps.fil
14ac0 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69  ename,"rb");.  i
14ad0 66 28 20 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20  f( fp==0 ){.    
14ae0 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65  ErrorMsg(ps.file
14af0 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70  name,0,"Can't op
14b00 65 6e 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72  en this file for
14b10 20 72 65 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20   reading.");.   
14b20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b   gp->errorcnt++;
14b30 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
14b40 0a 20 20 66 73 65 65 6b 28 66 70 2c 30 2c 32 29  .  fseek(fp,0,2)
14b50 3b 0a 20 20 66 69 6c 65 73 69 7a 65 20 3d 20 66  ;.  filesize = f
14b60 74 65 6c 6c 28 66 70 29 3b 0a 20 20 72 65 77 69  tell(fp);.  rewi
14b70 6e 64 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75  nd(fp);.  filebu
14b80 66 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c  f = (char *)mall
14b90 6f 63 28 20 66 69 6c 65 73 69 7a 65 2b 31 20 29  oc( filesize+1 )
14ba0 3b 0a 20 20 69 66 28 20 66 69 6c 65 73 69 7a 65  ;.  if( filesize
14bb0 3e 31 30 30 30 30 30 30 30 30 20 7c 7c 20 66 69  >100000000 || fi
14bc0 6c 65 62 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20  lebuf==0 ){.    
14bd0 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65  ErrorMsg(ps.file
14be0 6e 61 6d 65 2c 30 2c 22 49 6e 70 75 74 20 66 69  name,0,"Input fi
14bf0 6c 65 20 74 6f 6f 20 6c 61 72 67 65 2e 22 29 3b  le too large.");
14c00 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e  .    gp->errorcn
14c10 74 2b 2b 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28  t++;.    fclose(
14c20 66 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  fp);.    return;
14c30 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 61 64  .  }.  if( fread
14c40 28 66 69 6c 65 62 75 66 2c 31 2c 66 69 6c 65 73  (filebuf,1,files
14c50 69 7a 65 2c 66 70 29 21 3d 66 69 6c 65 73 69 7a  ize,fp)!=filesiz
14c60 65 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73  e ){.    ErrorMs
14c70 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c  g(ps.filename,0,
14c80 22 43 61 6e 27 74 20 72 65 61 64 20 69 6e 20 61  "Can't read in a
14c90 6c 6c 20 25 64 20 62 79 74 65 73 20 6f 66 20 74  ll %d bytes of t
14ca0 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20 20 20  his file.",.    
14cb0 20 20 66 69 6c 65 73 69 7a 65 29 3b 0a 20 20 20    filesize);.   
14cc0 20 66 72 65 65 28 66 69 6c 65 62 75 66 29 3b 0a   free(filebuf);.
14cd0 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74      gp->errorcnt
14ce0 2b 2b 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66  ++;.    fclose(f
14cf0 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  p);.    return;.
14d00 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70 29    }.  fclose(fp)
14d10 3b 0a 20 20 66 69 6c 65 62 75 66 5b 66 69 6c 65  ;.  filebuf[file
14d20 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a  size] = 0;..  /*
14d30 20 4d 61 6b 65 20 61 6e 20 69 6e 69 74 69 61 6c   Make an initial
14d40 20 70 61 73 73 20 74 68 72 6f 75 67 68 20 74 68   pass through th
14d50 65 20 66 69 6c 65 20 74 6f 20 68 61 6e 64 6c 65  e file to handle
14d60 20 25 69 66 64 65 66 20 61 6e 64 20 25 69 66 6e   %ifdef and %ifn
14d70 64 65 66 20 2a 2f 0a 20 20 70 72 65 70 72 6f 63  def */.  preproc
14d80 65 73 73 5f 69 6e 70 75 74 28 66 69 6c 65 62 75  ess_input(filebu
14d90 66 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 73 63  f);..  /* Now sc
14da0 61 6e 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  an the text of t
14db0 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
14dc0 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20  .  lineno = 1;. 
14dd0 20 66 6f 72 28 63 70 3d 66 69 6c 65 62 75 66 3b   for(cp=filebuf;
14de0 20 28 63 3d 20 2a 63 70 29 21 3d 30 3b 20 29 7b   (c= *cp)!=0; ){
14df0 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27  .    if( c=='\n'
14e00 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 20 20 20   ) lineno++;    
14e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 65            /* Kee
14e20 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c  p track of the l
14e30 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ine number */.  
14e40 20 20 69 66 28 20 69 73 73 70 61 63 65 28 63 29    if( isspace(c)
14e50 20 29 7b 20 63 70 2b 2b 3b 20 63 6f 6e 74 69 6e   ){ cp++; contin
14e60 75 65 3b 20 7d 20 20 2f 2a 20 53 6b 69 70 20 61  ue; }  /* Skip a
14e70 6c 6c 20 77 68 69 74 65 20 73 70 61 63 65 20 2a  ll white space *
14e80 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2f 27  /.    if( c=='/'
14e90 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29   && cp[1]=='/' )
14ea0 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b  {          /* Sk
14eb0 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d  ip C++ style com
14ec0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63  ments */.      c
14ed0 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c  p+=2;.      whil
14ee0 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  e( (c= *cp)!=0 &
14ef0 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b  & c!='\n' ) cp++
14f00 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
14f10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14f20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d  c=='/' && cp[1]=
14f30 3d 27 2a 27 20 29 7b 20 20 20 20 20 20 20 20 20  ='*' ){         
14f40 20 2f 2a 20 53 6b 69 70 20 43 20 73 74 79 6c 65   /* Skip C style
14f50 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   comments */.   
14f60 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20     cp+=2;.      
14f70 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
14f80 3d 30 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c  =0 && (c!='/' ||
14f90 20 63 70 5b 2d 31 5d 21 3d 27 2a 27 29 20 29 7b   cp[-1]!='*') ){
14fa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
14fb0 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
14fc0 0a 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20  .        cp++;. 
14fd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14fe0 20 63 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20   c ) cp++;.     
14ff0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
15000 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 73 74 61  .    ps.tokensta
15010 72 74 20 3d 20 63 70 3b 20 20 20 20 20 20 20 20  rt = cp;        
15020 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20          /* Mark 
15030 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
15040 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20   the token */.  
15050 20 20 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f    ps.tokenlineno
15060 20 3d 20 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20   = lineno;      
15070 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62       /* Linenumb
15080 65 72 20 6f 6e 20 77 68 69 63 68 20 74 6f 6b 65  er on which toke
15090 6e 20 62 65 67 69 6e 73 20 2a 2f 0a 20 20 20 20  n begins */.    
150a0 69 66 28 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20  if( c=='\"' ){  
150b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150c0 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c 69 74     /* String lit
150d0 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20 63  erals */.      c
150e0 70 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  p++;.      while
150f0 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ( (c= *cp)!=0 &&
15100 20 63 21 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20   c!='\"' ){.    
15110 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
15120 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ) lineno++;.    
15130 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20      cp++;.      
15140 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
15150 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
15160 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65  rMsg(ps.filename
15170 2c 73 74 61 72 74 6c 69 6e 65 2c 0a 22 53 74 72  ,startline,."Str
15180 69 6e 67 20 73 74 61 72 74 69 6e 67 20 6f 6e 20  ing starting on 
15190 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74  this line is not
151a0 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f   terminated befo
151b0 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  re the end of th
151c0 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20  e file.");.     
151d0 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b     ps.errorcnt++
151e0 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70  ;.        nextcp
151f0 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c   = cp;.      }el
15200 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  se{.        next
15210 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20  cp = cp+1;.     
15220 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
15230 20 63 3d 3d 27 7b 27 20 29 7b 20 20 20 20 20 20   c=='{' ){      
15240 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6c           /* A bl
15250 6f 63 6b 20 6f 66 20 43 20 63 6f 64 65 20 2a 2f  ock of C code */
15260 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 76 65 6c  .      int level
15270 3b 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20  ;.      cp++;.  
15280 20 20 20 20 66 6f 72 28 6c 65 76 65 6c 3d 31 3b      for(level=1;
15290 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
152a0 28 6c 65 76 65 6c 3e 31 20 7c 7c 20 63 21 3d 27  (level>1 || c!='
152b0 7d 27 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20  }'); cp++){.    
152c0 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
152d0 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ) lineno++;.    
152e0 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d      else if( c==
152f0 27 7b 27 20 29 20 6c 65 76 65 6c 2b 2b 3b 0a 20  '{' ) level++;. 
15300 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20         else if( 
15310 63 3d 3d 27 7d 27 20 29 20 6c 65 76 65 6c 2d 2d  c=='}' ) level--
15320 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69  ;.        else i
15330 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b  f( c=='/' && cp[
15340 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 2f 2a 20 53  1]=='*' ){  /* S
15350 6b 69 70 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a  kip comments */.
15360 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 70 72            int pr
15370 65 76 63 3b 0a 20 20 20 20 20 20 20 20 20 20 63  evc;.          c
15380 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20  p = &cp[2];.    
15390 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b        prevc = 0;
153a0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
153b0 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ( (c= *cp)!=0 &&
153c0 20 28 63 21 3d 27 2f 27 20 7c 7c 20 70 72 65 76   (c!='/' || prev
153d0 63 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20 20  c!='*') ){.     
153e0 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
153f0 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n' ) lineno++;. 
15400 20 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63             prevc
15410 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20   = c;.          
15420 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20    cp++;.        
15430 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
15440 65 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20  e if( c=='/' && 
15450 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 2f  cp[1]=='/' ){  /
15460 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65  * Skip C++ style
15470 20 63 6f 6d 6d 65 6e 74 73 20 74 6f 6f 20 2a 2f   comments too */
15480 0a 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20  .          cp = 
15490 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  &cp[2];.        
154a0 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70    while( (c= *cp
154b0 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20  )!=0 && c!='\n' 
154c0 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ) cp++;.        
154d0 20 20 69 66 28 20 63 20 29 20 6c 69 6e 65 6e 6f    if( c ) lineno
154e0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
154f0 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c  e if( c=='\'' ||
15500 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f   c=='\"' ){    /
15510 2a 20 53 74 72 69 6e 67 20 61 20 63 68 61 72 61  * String a chara
15520 63 74 65 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f  cter literals */
15530 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 73  .          int s
15540 74 61 72 74 63 68 61 72 2c 20 70 72 65 76 63 3b  tartchar, prevc;
15550 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74  .          start
15560 63 68 61 72 20 3d 20 63 3b 0a 20 20 20 20 20 20  char = c;.      
15570 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20      prevc = 0;. 
15580 20 20 20 20 20 20 20 20 20 66 6f 72 28 63 70 2b           for(cp+
15590 2b 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  +; (c= *cp)!=0 &
155a0 26 20 28 63 21 3d 73 74 61 72 74 63 68 61 72 20  & (c!=startchar 
155b0 7c 7c 20 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b  || prevc=='\\');
155c0 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   cp++){.        
155d0 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
155e0 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ) lineno++;.    
155f0 20 20 20 20 20 20 20 20 69 66 28 20 70 72 65 76          if( prev
15600 63 3d 3d 27 5c 5c 27 20 29 20 70 72 65 76 63 20  c=='\\' ) prevc 
15610 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
15620 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20   else           
15630 20 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 20 20     prevc = c;.  
15640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15650 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
15660 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
15670 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
15680 73 2e 66 69 6c 65 6e 61 6d 65 2c 70 73 2e 74 6f  s.filename,ps.to
15690 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63 6f  kenlineno,."C co
156a0 64 65 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74  de starting on t
156b0 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20  his line is not 
156c0 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72  terminated befor
156d0 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
156e0 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20   file.");.      
156f0 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b    ps.errorcnt++;
15700 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20  .        nextcp 
15710 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = cp;.      }els
15720 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63  e{.        nextc
15730 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20  p = cp+1;.      
15740 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
15750 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b 20 20 20  isalnum(c) ){   
15760 20 20 20 20 20 20 20 2f 2a 20 49 64 65 6e 74 69         /* Identi
15770 66 69 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 77  fiers */.      w
15780 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
15790 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 63 29  0 && (isalnum(c)
157a0 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70   || c=='_') ) cp
157b0 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70  ++;.      nextcp
157c0 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65   = cp;.    }else
157d0 20 69 66 28 20 63 3d 3d 27 3a 27 20 26 26 20 63   if( c==':' && c
157e0 70 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 63 70 5b  p[1]==':' && cp[
157f0 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20 54 68  2]=='=' ){ /* Th
15800 65 20 6f 70 65 72 61 74 6f 72 20 22 3a 3a 3d 22  e operator "::="
15810 20 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d 20   */.      cp += 
15820 33 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20  3;.      nextcp 
15830 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = cp;.    }else 
15840 69 66 28 20 28 63 3d 3d 27 2f 27 20 7c 7c 20 63  if( (c=='/' || c
15850 3d 3d 27 7c 27 29 20 26 26 20 69 73 61 6c 70 68  =='|') && isalph
15860 61 28 63 70 5b 31 5d 29 20 29 7b 0a 20 20 20 20  a(cp[1]) ){.    
15870 20 20 63 70 20 2b 3d 20 32 3b 0a 20 20 20 20 20    cp += 2;.     
15880 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 63 70   while( (c = *cp
15890 29 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d  )!=0 && (isalnum
158a0 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29  (c) || c=='_') )
158b0 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78   cp++;.      nex
158c0 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65  tcp = cp;.    }e
158d0 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
158f0 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20   All other (one 
15900 63 68 61 72 61 63 74 65 72 29 20 6f 70 65 72 61  character) opera
15910 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 63 70  tors */.      cp
15920 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70  ++;.      nextcp
15930 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20   = cp;.    }.   
15940 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63   c = *cp;.    *c
15950 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15970 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   Null terminate 
15980 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20  the token */.   
15990 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26   parseonetoken(&
159a0 70 73 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ps);            
159b0 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 74 6f   /* Parse the to
159c0 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d  ken */.    *cp =
159d0 20 28 63 68 61 72 29 63 3b 20 20 20 20 20 20 20   (char)c;       
159e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
159f0 73 74 6f 72 65 20 74 68 65 20 62 75 66 66 65 72  store the buffer
15a00 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65 78   */.    cp = nex
15a10 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28  tcp;.  }.  free(
15a20 66 69 6c 65 62 75 66 29 3b 20 20 20 20 20 20 20  filebuf);       
15a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a40 52 65 6c 65 61 73 65 20 74 68 65 20 62 75 66 66  Release the buff
15a50 65 72 20 61 66 74 65 72 20 70 61 72 73 69 6e 67  er after parsing
15a60 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d   */.  gp->rule =
15a70 20 70 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20   ps.firstrule;. 
15a80 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20   gp->errorcnt = 
15a90 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f  ps.errorcnt;.}./
15aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
15ac0 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b   the file "plink
15ad0 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
15ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
15af0 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73   Routines proces
15b00 73 69 6e 67 20 63 6f 6e 66 69 67 75 72 61 74 69  sing configurati
15b10 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72  on follow-set pr
15b20 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a  opagation links.
15b30 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20  ** in the LEMON 
15b40 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
15b50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
15b60 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f  ct plink *plink_
15b70 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f  freelist = 0;../
15b80 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
15b90 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74   plink */.struct
15ba0 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65   plink *Plink_ne
15bb0 77 28 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c  w(){.  struct pl
15bc0 69 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a 0a 20  ink *newlink;.. 
15bd0 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c   if( plink_freel
15be0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ist==0 ){.    in
15bf0 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74  t i;.    int amt
15c00 20 3d 20 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e   = 100;.    plin
15c10 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74  k_freelist = (st
15c20 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 63 61 6c  ruct plink *)cal
15c30 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66  loc( amt, sizeof
15c40 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 29 20 29  (struct plink) )
15c50 3b 0a 20 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f  ;.    if( plink_
15c60 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  freelist==0 ){. 
15c70 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
15c80 65 72 72 2c 0a 20 20 20 20 20 20 22 55 6e 61 62  err,.      "Unab
15c90 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
15ca0 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20  emory for a new 
15cb0 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61  follow-set propa
15cc0 67 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29  gation link.\n")
15cd0 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
15ce0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
15cf0 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b  =0; i<amt-1; i++
15d00 29 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  ) plink_freelist
15d10 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e  [i].next = &plin
15d20 6b 5f 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b  k_freelist[i+1];
15d30 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  .    plink_freel
15d40 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20  ist[amt-1].next 
15d50 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 6c 69  = 0;.  }.  newli
15d60 6e 6b 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  nk = plink_freel
15d70 69 73 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66 72 65  ist;.  plink_fre
15d80 65 6c 69 73 74 20 3d 20 70 6c 69 6e 6b 5f 66 72  elist = plink_fr
15d90 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20  eelist->next;.  
15da0 72 65 74 75 72 6e 20 6e 65 77 6c 69 6e 6b 3b 0a  return newlink;.
15db0 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c 69 6e  }../* Add a plin
15dc0 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c 69 73  k to a plink lis
15dd0 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  t */.void Plink_
15de0 61 64 64 28 73 74 72 75 63 74 20 70 6c 69 6e 6b  add(struct plink
15df0 20 2a 2a 70 6c 70 70 2c 20 73 74 72 75 63 74 20   **plpp, struct 
15e00 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20  config *cfp).{. 
15e10 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e   struct plink *n
15e20 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e  ewlink;.  newlin
15e30 6b 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77 28 29 3b  k = Plink_new();
15e40 0a 20 20 6e 65 77 6c 69 6e 6b 2d 3e 6e 65 78 74  .  newlink->next
15e50 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c 70   = *plpp;.  *plp
15e60 70 20 3d 20 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e  p = newlink;.  n
15e70 65 77 6c 69 6e 6b 2d 3e 63 66 70 20 3d 20 63 66  ewlink->cfp = cf
15e80 70 3b 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73 66 65  p;.}../* Transfe
15e90 72 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e  r every plink on
15ea0 20 74 68 65 20 6c 69 73 74 20 22 66 72 6f 6d 22   the list "from"
15eb0 20 74 6f 20 74 68 65 20 6c 69 73 74 20 22 74 6f   to the list "to
15ec0 22 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  " */.void Plink_
15ed0 63 6f 70 79 28 73 74 72 75 63 74 20 70 6c 69 6e  copy(struct plin
15ee0 6b 20 2a 2a 74 6f 2c 20 73 74 72 75 63 74 20 70  k **to, struct p
15ef0 6c 69 6e 6b 20 2a 66 72 6f 6d 29 0a 7b 0a 20 20  link *from).{.  
15f00 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
15f10 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28 20 66  xtpl;.  while( f
15f20 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78 74 70  rom ){.    nextp
15f30 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b 0a  l = from->next;.
15f40 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74 20 3d      from->next =
15f50 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d 20   *to;.    *to = 
15f60 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d 20 3d  from;.    from =
15f70 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a   nextpl;.  }.}..
15f80 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79 20  /* Delete every 
15f90 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73  plink on the lis
15fa0 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  t */.void Plink_
15fb0 64 65 6c 65 74 65 28 73 74 72 75 63 74 20 70 6c  delete(struct pl
15fc0 69 6e 6b 20 2a 70 6c 70 29 0a 7b 0a 20 20 73 74  ink *plp).{.  st
15fd0 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74  ruct plink *next
15fe0 70 6c 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 6c  pl;..  while( pl
15ff0 70 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20  p ){.    nextpl 
16000 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 20  = plp->next;.   
16010 20 70 6c 70 2d 3e 6e 65 78 74 20 3d 20 70 6c 69   plp->next = pli
16020 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 20  nk_freelist;.   
16030 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20   plink_freelist 
16040 3d 20 70 6c 70 3b 0a 20 20 20 20 70 6c 70 20 3d  = plp;.    plp =
16050 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f   nextpl;.  }.}./
16060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16070 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
16080 20 66 69 6c 65 20 22 72 65 70 6f 72 74 2e 63 22   file "report.c"
16090 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
160a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
160b0 2a 2a 20 50 72 6f 63 65 64 75 72 65 73 20 66 6f  ** Procedures fo
160c0 72 20 67 65 6e 65 72 61 74 69 6e 67 20 72 65 70  r generating rep
160d0 6f 72 74 73 20 61 6e 64 20 74 61 62 6c 65 73 20  orts and tables 
160e0 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  in the LEMON par
160f0 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
16100 2f 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  /../* Generate a
16110 20 66 69 6c 65 6e 61 6d 65 20 77 69 74 68 20 74   filename with t
16120 68 65 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e  he given suffix.
16130 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
16140 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6d 65  the.** name come
16150 73 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20  s from malloc() 
16160 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
16170 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
16180 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  .** function..*/
16190 0a 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 66  .PRIVATE char *f
161a0 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 73 74 72  ile_makename(str
161b0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
161c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 66   const char *suf
161d0 66 69 78 29 0a 7b 0a 20 20 63 68 61 72 20 2a 6e  fix).{.  char *n
161e0 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b  ame;.  char *cp;
161f0 0a 0a 20 20 6e 61 6d 65 20 3d 20 28 63 68 61 72  ..  name = (char
16200 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53  *)malloc( lemonS
16210 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69 6c 65  trlen(lemp->file
16220 6e 61 6d 65 29 20 2b 20 6c 65 6d 6f 6e 53 74 72  name) + lemonStr
16230 6c 65 6e 28 73 75 66 66 69 78 29 20 2b 20 35 20  len(suffix) + 5 
16240 29 3b 0a 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30  );.  if( name==0
16250 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
16260 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 61 6c  stderr,"Can't al
16270 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
16280 20 61 20 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29   a filename.\n")
16290 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
162a0 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70   }.  lemon_strcp
162b0 79 28 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 66 69 6c  y(name,lemp->fil
162c0 65 6e 61 6d 65 29 3b 0a 20 20 63 70 20 3d 20 73  ename);.  cp = s
162d0 74 72 72 63 68 72 28 6e 61 6d 65 2c 27 2e 27 29  trrchr(name,'.')
162e0 3b 0a 20 20 69 66 28 20 63 70 20 29 20 2a 63 70  ;.  if( cp ) *cp
162f0 20 3d 20 30 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74   = 0;.  lemon_st
16300 72 63 61 74 28 6e 61 6d 65 2c 73 75 66 66 69 78  rcat(name,suffix
16310 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d 65  );.  return name
16320 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66  ;.}../* Open a f
16330 69 6c 65 20 77 69 74 68 20 61 20 6e 61 6d 65 20  ile with a name 
16340 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d  based on the nam
16350 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66  e of the input f
16360 69 6c 65 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68  ile,.** but with
16370 20 61 20 64 69 66 66 65 72 65 6e 74 20 28 73 70   a different (sp
16380 65 63 69 66 69 65 64 29 20 73 75 66 66 69 78 2c  ecified) suffix,
16390 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
163a0 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
163b0 73 74 72 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54  stream */.PRIVAT
163c0 45 20 46 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65  E FILE *file_ope
163d0 6e 28 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f  n(.  struct lemo
163e0 6e 20 2a 6c 65 6d 70 2c 0a 20 20 63 6f 6e 73 74  n *lemp,.  const
163f0 20 63 68 61 72 20 2a 73 75 66 66 69 78 2c 0a 20   char *suffix,. 
16400 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64   const char *mod
16410 65 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b  e.){.  FILE *fp;
16420 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75  ..  if( lemp->ou
16430 74 6e 61 6d 65 20 29 20 66 72 65 65 28 6c 65 6d  tname ) free(lem
16440 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c  p->outname);.  l
16450 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66  emp->outname = f
16460 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d  ile_makename(lem
16470 70 2c 20 73 75 66 66 69 78 29 3b 0a 20 20 66 70  p, suffix);.  fp
16480 20 3d 20 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f   = fopen(lemp->o
16490 75 74 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20  utname,mode);.  
164a0 69 66 28 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f  if( fp==0 && *mo
164b0 64 65 3d 3d 27 77 27 20 29 7b 0a 20 20 20 20 66  de=='w' ){.    f
164c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43  printf(stderr,"C
164d0 61 6e 27 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c  an't open file \
164e0 22 25 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e  "%s\".\n",lemp->
164f0 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65  outname);.    le
16500 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
16510 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16520 7d 0a 20 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d  }.  return fp;.}
16530 0a 0a 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74  ../* Duplicate t
16540 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 77 69  he input file wi
16550 74 68 6f 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61  thout comments a
16560 6e 64 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f  nd without actio
16570 6e 73 20 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20  ns .** on rules 
16580 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28  */.void Reprint(
16590 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
165a0 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72  mp).{.  struct r
165b0 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63  ule *rp;.  struc
165c0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20  t symbol *sp;.  
165d0 69 6e 74 20 69 2c 20 6a 2c 20 6d 61 78 6c 65 6e  int i, j, maxlen
165e0 2c 20 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73 2c  , len, ncolumns,
165f0 20 73 6b 69 70 3b 0a 20 20 70 72 69 6e 74 66 28   skip;.  printf(
16600 22 2f 2f 20 52 65 70 72 69 6e 74 20 6f 66 20 69  "// Reprint of i
16610 6e 70 75 74 20 66 69 6c 65 20 5c 22 25 73 5c 22  nput file \"%s\"
16620 2e 5c 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c 6e  .\n// Symbols:\n
16630 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  ",lemp->filename
16640 29 3b 0a 20 20 6d 61 78 6c 65 6e 20 3d 20 31 30  );.  maxlen = 10
16650 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
16660 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
16670 2b 29 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d  +){.    sp = lem
16680 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
16690 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74     len = lemonSt
166a0 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a  rlen(sp->name);.
166b0 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c      if( len>maxl
166c0 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65  en ) maxlen = le
166d0 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e  n;.  }.  ncolumn
166e0 73 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35  s = 76/(maxlen+5
166f0 29 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e  );.  if( ncolumn
16700 73 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d  s<1 ) ncolumns =
16710 20 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65   1;.  skip = (le
16720 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63  mp->nsymbol + nc
16730 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c  olumns - 1)/ncol
16740 75 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  umns;.  for(i=0;
16750 20 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20   i<skip; i++){. 
16760 20 20 20 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b     printf("//");
16770 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c  .    for(j=i; j<
16780 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a  lemp->nsymbol; j
16790 2b 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20 20 73  +=skip){.      s
167a0 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
167b0 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  s[j];.      asse
167c0 72 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a  rt( sp->index==j
167d0 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66   );.      printf
167e0 28 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a  (" %3d %-*.*s",j
167f0 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73  ,maxlen,maxlen,s
16800 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  p->name);.    }.
16810 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29      printf("\n")
16820 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c  ;.  }.  for(rp=l
16830 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
16840 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
16850 20 70 72 69 6e 74 66 28 22 25 73 22 2c 72 70 2d   printf("%s",rp-
16860 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  >lhs->name);.   
16870 20 2f 2a 20 20 20 20 69 66 28 20 72 70 2d 3e 6c   /*    if( rp->l
16880 68 73 61 6c 69 61 73 20 29 20 70 72 69 6e 74 66  hsalias ) printf
16890 28 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61  ("(%s)",rp->lhsa
168a0 6c 69 61 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72  lias); */.    pr
168b0 69 6e 74 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20  intf(" ::=");.  
168c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
168d0 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
168e0 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b     sp = rp->rhs[
168f0 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70  i];.      if( sp
16900 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
16910 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
16920 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c 20 73   printf(" %s", s
16930 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61  p->subsym[0]->na
16940 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  me);.        for
16950 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62  (j=1; j<sp->nsub
16960 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  sym; j++){.     
16970 20 20 20 20 20 70 72 69 6e 74 66 28 22 7c 25 73       printf("|%s
16980 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d  ", sp->subsym[j]
16990 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
169a0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
169b0 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
169c0 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b   %s", sp->name);
169d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
169e0 2a 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69  * if( rp->rhsali
169f0 61 73 5b 69 5d 20 29 20 70 72 69 6e 74 66 28 22  as[i] ) printf("
16a00 28 25 73 29 22 2c 72 70 2d 3e 72 68 73 61 6c 69  (%s)",rp->rhsali
16a10 61 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20 20 20 7d  as[i]); */.    }
16a20 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2e 22 29  .    printf(".")
16a30 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72  ;.    if( rp->pr
16a40 65 63 73 79 6d 20 29 20 70 72 69 6e 74 66 28 22  ecsym ) printf("
16a50 20 5b 25 73 5d 22 2c 72 70 2d 3e 70 72 65 63 73   [%s]",rp->precs
16a60 79 6d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f  ym->name);.    /
16a70 2a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29  * if( rp->code )
16a80 20 70 72 69 6e 74 66 28 22 5c 6e 20 20 20 20 25   printf("\n    %
16a90 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 20 2a 2f  s",rp->code); */
16aa0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22  .    printf("\n"
16ab0 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 43  );.  }.}..void C
16ac0 6f 6e 66 69 67 50 72 69 6e 74 28 46 49 4c 45 20  onfigPrint(FILE 
16ad0 2a 66 70 2c 20 73 74 72 75 63 74 20 63 6f 6e 66  *fp, struct conf
16ae0 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20 73 74 72  ig *cfp).{.  str
16af0 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
16b00 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
16b10 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  p;.  int i, j;. 
16b20 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20   rp = cfp->rp;. 
16b30 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 73 20   fprintf(fp,"%s 
16b40 3a 3a 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61  ::=",rp->lhs->na
16b50 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  me);.  for(i=0; 
16b60 69 3c 3d 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b  i<=rp->nrhs; i++
16b70 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 63 66  ){.    if( i==cf
16b80 70 2d 3e 64 6f 74 20 29 20 66 70 72 69 6e 74 66  p->dot ) fprintf
16b90 28 66 70 2c 22 20 2a 22 29 3b 0a 20 20 20 20 69  (fp," *");.    i
16ba0 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29  f( i==rp->nrhs )
16bb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 70 20 3d   break;.    sp =
16bc0 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
16bd0 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d   if( sp->type==M
16be0 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
16bf0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
16c00 2c 22 20 25 73 22 2c 20 73 70 2d 3e 73 75 62 73  ," %s", sp->subs
16c10 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ym[0]->name);.  
16c20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73      for(j=1; j<s
16c30 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29  p->nsubsym; j++)
16c40 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
16c50 66 28 66 70 2c 22 7c 25 73 22 2c 73 70 2d 3e 73  f(fp,"|%s",sp->s
16c60 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b  ubsym[j]->name);
16c70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
16c80 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  se{.      fprint
16c90 66 28 66 70 2c 22 20 25 73 22 2c 20 73 70 2d 3e  f(fp," %s", sp->
16ca0 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  name);.    }.  }
16cb0 0a 7d 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 54  .}../* #define T
16cc0 45 53 54 20 2a 2f 0a 23 69 66 20 30 0a 2f 2a 20  EST */.#if 0./* 
16cd0 50 72 69 6e 74 20 61 20 73 65 74 20 2a 2f 0a 50  Print a set */.P
16ce0 52 49 56 41 54 45 20 76 6f 69 64 20 53 65 74 50  RIVATE void SetP
16cf0 72 69 6e 74 28 6f 75 74 2c 73 65 74 2c 6c 65 6d  rint(out,set,lem
16d00 70 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 63 68  p).FILE *out;.ch
16d10 61 72 20 2a 73 65 74 3b 0a 73 74 72 75 63 74 20  ar *set;.struct 
16d20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
16d30 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
16d40 73 70 61 63 65 72 3b 0a 20 20 73 70 61 63 65 72  spacer;.  spacer
16d50 20 3d 20 22 22 3b 0a 20 20 66 70 72 69 6e 74 66   = "";.  fprintf
16d60 28 6f 75 74 2c 22 25 31 32 73 5b 22 2c 22 22 29  (out,"%12s[","")
16d70 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
16d80 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
16d90 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 65  i++){.    if( Se
16da0 74 46 69 6e 64 28 73 65 74 2c 69 29 20 29 7b 0a  tFind(set,i) ){.
16db0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
16dc0 74 2c 22 25 73 25 73 22 2c 73 70 61 63 65 72 2c  t,"%s%s",spacer,
16dd0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
16de0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  ->name);.      s
16df0 70 61 63 65 72 20 3d 20 22 20 22 3b 0a 20 20 20  pacer = " ";.   
16e00 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
16e10 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a  (out,"]\n");.}..
16e20 2f 2a 20 50 72 69 6e 74 20 61 20 70 6c 69 6e 6b  /* Print a plink
16e30 20 63 68 61 69 6e 20 2a 2f 0a 50 52 49 56 41 54   chain */.PRIVAT
16e40 45 20 76 6f 69 64 20 50 6c 69 6e 6b 50 72 69 6e  E void PlinkPrin
16e50 74 28 6f 75 74 2c 70 6c 70 2c 74 61 67 29 0a 46  t(out,plp,tag).F
16e60 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74  ILE *out;.struct
16e70 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 63 68 61   plink *plp;.cha
16e80 72 20 2a 74 61 67 3b 0a 7b 0a 20 20 77 68 69 6c  r *tag;.{.  whil
16e90 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20 66 70  e( plp ){.    fp
16ea0 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 25  rintf(out,"%12s%
16eb0 73 20 28 73 74 61 74 65 20 25 32 64 29 20 22 2c  s (state %2d) ",
16ec0 22 22 2c 74 61 67 2c 70 6c 70 2d 3e 63 66 70 2d  "",tag,plp->cfp-
16ed0 3e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b  >stp->statenum);
16ee0 0a 20 20 20 20 43 6f 6e 66 69 67 50 72 69 6e 74  .    ConfigPrint
16ef0 28 6f 75 74 2c 70 6c 70 2d 3e 63 66 70 29 3b 0a  (out,plp->cfp);.
16f00 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
16f10 22 5c 6e 22 29 3b 0a 20 20 20 20 70 6c 70 20 3d  "\n");.    plp =
16f20 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a   plp->next;.  }.
16f30 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 50 72 69  }.#endif../* Pri
16f40 6e 74 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20  nt an action to 
16f50 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
16f60 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
16f70 72 6e 20 46 41 4c 53 45 20 69 66 0a 2a 2a 20 6e  rn FALSE if.** n
16f80 6f 74 68 69 6e 67 20 77 61 73 20 61 63 74 75 61  othing was actua
16f90 6c 6c 79 20 70 72 69 6e 74 65 64 2e 0a 2a 2f 0a  lly printed..*/.
16fa0 69 6e 74 20 50 72 69 6e 74 41 63 74 69 6f 6e 28  int PrintAction(
16fb0 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
16fc0 70 2c 20 46 49 4c 45 20 2a 66 70 2c 20 69 6e 74  p, FILE *fp, int
16fd0 20 69 6e 64 65 6e 74 29 7b 0a 20 20 69 6e 74 20   indent){.  int 
16fe0 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20 20 73 77  result = 1;.  sw
16ff0 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29  itch( ap->type )
17000 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49 46 54  {.    case SHIFT
17010 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
17020 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20 20 25  fp,"%*s shift  %
17030 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70  d",indent,ap->sp
17040 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70  ->name,ap->x.stp
17050 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20  ->statenum);.   
17060 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
17070 73 65 20 52 45 44 55 43 45 3a 0a 20 20 20 20 20  se REDUCE:.     
17080 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
17090 20 72 65 64 75 63 65 20 25 64 22 2c 69 6e 64 65   reduce %d",inde
170a0 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  nt,ap->sp->name,
170b0 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 29  ap->x.rp->index)
170c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
170d0 20 20 20 63 61 73 65 20 41 43 43 45 50 54 3a 0a     case ACCEPT:.
170e0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
170f0 2c 22 25 2a 73 20 61 63 63 65 70 74 22 2c 69 6e  ,"%*s accept",in
17100 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
17110 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
17120 0a 20 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a  .    case ERROR:
17130 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
17140 70 2c 22 25 2a 73 20 65 72 72 6f 72 22 2c 69 6e  p,"%*s error",in
17150 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
17160 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
17170 0a 20 20 20 20 63 61 73 65 20 53 52 43 4f 4e 46  .    case SRCONF
17180 4c 49 43 54 3a 0a 20 20 20 20 63 61 73 65 20 52  LICT:.    case R
17190 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20  RCONFLICT:.     
171a0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
171b0 20 72 65 64 75 63 65 20 25 2d 33 64 20 2a 2a 20   reduce %-3d ** 
171c0 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74  Parsing conflict
171d0 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20 20 69 6e   **",.        in
171e0 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
171f0 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65  e,ap->x.rp->inde
17200 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
17210 0a 20 20 20 20 63 61 73 65 20 53 53 43 4f 4e 46  .    case SSCONF
17220 4c 49 43 54 3a 0a 20 20 20 20 20 20 66 70 72 69  LICT:.      fpri
17230 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66  ntf(fp,"%*s shif
17240 74 20 20 25 2d 33 64 20 2a 2a 20 50 61 72 73 69  t  %-3d ** Parsi
17250 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a 22 2c  ng conflict **",
17260 20 0a 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74   .        indent
17270 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70  ,ap->sp->name,ap
17280 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75  ->x.stp->statenu
17290 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
172a0 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52 45 53  .    case SH_RES
172b0 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20 69 66 28  OLVED:.      if(
172c0 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43   showPrecedenceC
172d0 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20 20  onflict ){.     
172e0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
172f0 2a 73 20 73 68 69 66 74 20 20 25 2d 33 64 20 2d  *s shift  %-3d -
17300 2d 20 64 72 6f 70 70 65 64 20 62 79 20 70 72 65  - dropped by pre
17310 63 65 64 65 6e 63 65 22 2c 0a 20 20 20 20 20 20  cedence",.      
17320 20 20 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74            indent
17330 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70  ,ap->sp->name,ap
17340 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75  ->x.stp->statenu
17350 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
17360 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20  .        result 
17370 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
17380 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
17390 73 65 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a  se RD_RESOLVED:.
173a0 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 50 72        if( showPr
173b0 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63 74  ecedenceConflict
173c0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
173d0 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75  ntf(fp,"%*s redu
173e0 63 65 20 25 2d 33 64 20 2d 2d 20 64 72 6f 70 70  ce %-3d -- dropp
173f0 65 64 20 62 79 20 70 72 65 63 65 64 65 6e 63 65  ed by precedence
17400 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
17410 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70     indent,ap->sp
17420 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d  ->name,ap->x.rp-
17430 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d  >index);.      }
17440 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
17450 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sult = 0;.      
17460 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
17470 20 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44     case NOT_USED
17480 3a 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d  :.      result =
17490 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
174a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
174b0 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  sult;.}../* Gene
174c0 72 61 74 65 20 74 68 65 20 22 79 2e 6f 75 74 70  rate the "y.outp
174d0 75 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a  ut" log file */.
174e0 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75  void ReportOutpu
174f0 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  t(struct lemon *
17500 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  lemp).{.  int i;
17510 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
17520 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 63  *stp;.  struct c
17530 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74  onfig *cfp;.  st
17540 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b  ruct action *ap;
17550 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20  .  FILE *fp;..  
17560 66 70 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c  fp = file_open(l
17570 65 6d 70 2c 22 2e 6f 75 74 22 2c 22 77 62 22 29  emp,".out","wb")
17580 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 29 20  ;.  if( fp==0 ) 
17590 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
175a0 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
175b0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
175c0 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
175d0 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i];.    fprintf(
175e0 66 70 2c 22 53 74 61 74 65 20 25 64 3a 5c 6e 22  fp,"State %d:\n"
175f0 2c 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b  ,stp->statenum);
17600 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62  .    if( lemp->b
17610 61 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d 73  asisflag ) cfp=s
17620 74 70 2d 3e 62 70 3b 0a 20 20 20 20 65 6c 73 65  tp->bp;.    else
17630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17640 20 20 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 0a    cfp=stp->cfp;.
17650 20 20 20 20 77 68 69 6c 65 28 20 63 66 70 20 29      while( cfp )
17660 7b 0a 20 20 20 20 20 20 63 68 61 72 20 62 75 66  {.      char buf
17670 5b 32 30 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  [20];.      if( 
17680 63 66 70 2d 3e 64 6f 74 3d 3d 63 66 70 2d 3e 72  cfp->dot==cfp->r
17690 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20  p->nrhs ){.     
176a0 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66     lemon_sprintf
176b0 28 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d  (buf,"(%d)",cfp-
176c0 3e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  >rp->index);.   
176d0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
176e0 22 20 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b  "    %5s ",buf);
176f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17700 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
17710 2c 22 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a  ,"          ");.
17720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f        }.      Co
17730 6e 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70  nfigPrint(fp,cfp
17740 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
17750 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 20 30  (fp,"\n");.#if 0
17760 0a 20 20 20 20 20 20 53 65 74 50 72 69 6e 74 28  .      SetPrint(
17770 66 70 2c 63 66 70 2d 3e 66 77 73 2c 6c 65 6d 70  fp,cfp->fws,lemp
17780 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72  );.      PlinkPr
17790 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 70 6c 70  int(fp,cfp->fplp
177a0 2c 22 54 6f 20 20 22 29 3b 0a 20 20 20 20 20 20  ,"To  ");.      
177b0 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66  PlinkPrint(fp,cf
177c0 70 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d 22 29 3b  p->bplp,"From");
177d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
177e0 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61  ( lemp->basisfla
177f0 67 20 29 20 63 66 70 3d 63 66 70 2d 3e 62 70 3b  g ) cfp=cfp->bp;
17800 0a 20 20 20 20 20 20 65 6c 73 65 20 20 20 20 20  .      else     
17810 20 20 20 20 20 20 20 20 20 20 20 20 20 63 66 70               cfp
17820 3d 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20  =cfp->next;.    
17830 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70  }.    fprintf(fp
17840 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28  ,"\n");.    for(
17850 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
17860 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
17870 20 20 20 20 69 66 28 20 50 72 69 6e 74 41 63 74      if( PrintAct
17880 69 6f 6e 28 61 70 2c 66 70 2c 33 30 29 20 29 20  ion(ap,fp,30) ) 
17890 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29  fprintf(fp,"\n")
178a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
178b0 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20  ntf(fp,"\n");.  
178c0 7d 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20  }.  fprintf(fp, 
178d0 22 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17900 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 66 70 72  -----\n");.  fpr
17910 69 6e 74 66 28 66 70 2c 20 22 53 79 6d 62 6f 6c  intf(fp, "Symbol
17920 73 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69 3d  s:\n");.  for(i=
17930 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
17940 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ol; i++){.    in
17950 74 20 6a 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t j;.    struct 
17960 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 20  symbol *sp;..   
17970 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62   sp = lemp->symb
17980 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69  ols[i];.    fpri
17990 6e 74 66 28 66 70 2c 20 22 20 20 25 33 64 3a 20  ntf(fp, "  %3d: 
179a0 25 73 22 2c 20 69 2c 20 73 70 2d 3e 6e 61 6d 65  %s", i, sp->name
179b0 29 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74  );.    if( sp->t
179c0 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c  ype==NONTERMINAL
179d0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
179e0 66 28 66 70 2c 20 22 3a 22 29 3b 0a 20 20 20 20  f(fp, ":");.    
179f0 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61    if( sp->lambda
17a00 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
17a10 6e 74 66 28 66 70 2c 20 22 20 3c 6c 61 6d 62 64  ntf(fp, " <lambd
17a20 61 3e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  a>");.      }.  
17a30 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
17a40 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
17a50 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
17a60 28 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20 26  ( sp->firstset &
17a70 26 20 53 65 74 46 69 6e 64 28 73 70 2d 3e 66 69  & SetFind(sp->fi
17a80 72 73 74 73 65 74 2c 20 6a 29 20 29 7b 0a 20 20  rstset, j) ){.  
17a90 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
17aa0 66 70 2c 20 22 20 25 73 22 2c 20 6c 65 6d 70 2d  fp, " %s", lemp-
17ab0 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61 6d  >symbols[j]->nam
17ac0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
17ad0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
17ae0 66 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 6e 22  fprintf(fp, "\n"
17af0 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28  );.  }.  fclose(
17b00 66 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fp);.  return;.}
17b10 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20  ../* Search for 
17b20 74 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22 20  the file "name" 
17b30 77 68 69 63 68 20 69 73 20 69 6e 20 74 68 65 20  which is in the 
17b40 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
17b50 73 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74 61  s.** the exacuta
17b60 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 63  ble */.PRIVATE c
17b70 68 61 72 20 2a 70 61 74 68 73 65 61 72 63 68 28  har *pathsearch(
17b80 63 68 61 72 20 2a 61 72 67 76 30 2c 20 63 68 61  char *argv0, cha
17b90 72 20 2a 6e 61 6d 65 2c 20 69 6e 74 20 6d 6f 64  r *name, int mod
17ba0 65 6d 61 73 6b 29 0a 7b 0a 20 20 63 6f 6e 73 74  emask).{.  const
17bb0 20 63 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b   char *pathlist;
17bc0 0a 20 20 63 68 61 72 20 2a 70 61 74 68 62 75 66  .  char *pathbuf
17bd0 70 74 72 3b 0a 20 20 63 68 61 72 20 2a 70 61 74  ptr;.  char *pat
17be0 68 62 75 66 3b 0a 20 20 63 68 61 72 20 2a 70 61  hbuf;.  char *pa
17bf0 74 68 2c 2a 63 70 3b 0a 20 20 63 68 61 72 20 63  th,*cp;.  char c
17c00 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33  ;..#ifdef __WIN3
17c10 32 5f 5f 0a 20 20 63 70 20 3d 20 73 74 72 72 63  2__.  cp = strrc
17c20 68 72 28 61 72 67 76 30 2c 27 5c 5c 27 29 3b 0a  hr(argv0,'\\');.
17c30 23 65 6c 73 65 0a 20 20 63 70 20 3d 20 73 74 72  #else.  cp = str
17c40 72 63 68 72 28 61 72 67 76 30 2c 27 2f 27 29 3b  rchr(argv0,'/');
17c50 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 63 70  .#endif.  if( cp
17c60 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 63 70 3b   ){.    c = *cp;
17c70 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20  .    *cp = 0;.  
17c80 20 20 70 61 74 68 20 3d 20 28 63 68 61 72 20 2a    path = (char *
17c90 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74  )malloc( lemonSt
17ca0 72 6c 65 6e 28 61 72 67 76 30 29 20 2b 20 6c 65  rlen(argv0) + le
17cb0 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29 20  monStrlen(name) 
17cc0 2b 20 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  + 2 );.    if( p
17cd0 61 74 68 20 29 20 6c 65 6d 6f 6e 5f 73 70 72 69  ath ) lemon_spri
17ce0 6e 74 66 28 70 61 74 68 2c 22 25 73 2f 25 73 22  ntf(path,"%s/%s"
17cf0 2c 61 72 67 76 30 2c 6e 61 6d 65 29 3b 0a 20 20  ,argv0,name);.  
17d00 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 7d 65 6c    *cp = c;.  }el
17d10 73 65 7b 0a 20 20 20 20 70 61 74 68 6c 69 73 74  se{.    pathlist
17d20 20 3d 20 67 65 74 65 6e 76 28 22 50 41 54 48 22   = getenv("PATH"
17d30 29 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68 6c  );.    if( pathl
17d40 69 73 74 3d 3d 30 20 29 20 70 61 74 68 6c 69 73  ist==0 ) pathlis
17d50 74 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72  t = ".:/bin:/usr
17d60 2f 62 69 6e 22 3b 0a 20 20 20 20 70 61 74 68 62  /bin";.    pathb
17d70 75 66 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61  uf = (char *) ma
17d80 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65  lloc( lemonStrle
17d90 6e 28 70 61 74 68 6c 69 73 74 29 20 2b 20 31 20  n(pathlist) + 1 
17da0 29 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63  );.    path = (c
17db0 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65  har *)malloc( le
17dc0 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68 6c 69  monStrlen(pathli
17dd0 73 74 29 2b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  st)+lemonStrlen(
17de0 6e 61 6d 65 29 2b 32 20 29 3b 0a 20 20 20 20 69  name)+2 );.    i
17df0 66 28 20 28 70 61 74 68 62 75 66 20 21 3d 20 30  f( (pathbuf != 0
17e00 29 20 26 26 20 28 70 61 74 68 21 3d 30 29 20 29  ) && (path!=0) )
17e10 7b 0a 20 20 20 20 20 20 70 61 74 68 62 75 66 70  {.      pathbufp
17e20 74 72 20 3d 20 70 61 74 68 62 75 66 3b 0a 20 20  tr = pathbuf;.  
17e30 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79      lemon_strcpy
17e40 28 70 61 74 68 62 75 66 2c 20 70 61 74 68 6c 69  (pathbuf, pathli
17e50 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  st);.      while
17e60 28 20 2a 70 61 74 68 62 75 66 20 29 7b 0a 20 20  ( *pathbuf ){.  
17e70 20 20 20 20 20 20 63 70 20 3d 20 73 74 72 63 68        cp = strch
17e80 72 28 70 61 74 68 62 75 66 2c 27 3a 27 29 3b 0a  r(pathbuf,':');.
17e90 20 20 20 20 20 20 20 20 69 66 28 20 63 70 3d 3d          if( cp==
17ea0 30 20 29 20 63 70 20 3d 20 26 70 61 74 68 62 75  0 ) cp = &pathbu
17eb0 66 5b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61  f[lemonStrlen(pa
17ec0 74 68 62 75 66 29 5d 3b 0a 20 20 20 20 20 20 20  thbuf)];.       
17ed0 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20   c = *cp;.      
17ee0 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 20    *cp = 0;.     
17ef0 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66     lemon_sprintf
17f00 28 70 61 74 68 2c 22 25 73 2f 25 73 22 2c 70 61  (path,"%s/%s",pa
17f10 74 68 62 75 66 2c 6e 61 6d 65 29 3b 0a 20 20 20  thbuf,name);.   
17f20 20 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20       *cp = c;.  
17f30 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
17f40 20 70 61 74 68 62 75 66 5b 30 5d 20 3d 20 30 3b   pathbuf[0] = 0;
17f50 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 70 61  .        else pa
17f60 74 68 62 75 66 20 3d 20 26 63 70 5b 31 5d 3b 0a  thbuf = &cp[1];.
17f70 20 20 20 20 20 20 20 20 69 66 28 20 61 63 63 65          if( acce
17f80 73 73 28 70 61 74 68 2c 6d 6f 64 65 6d 61 73 6b  ss(path,modemask
17f90 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
17fa0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65      }.      free
17fb0 28 70 61 74 68 62 75 66 70 74 72 29 3b 0a 20 20  (pathbufptr);.  
17fc0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17fd0 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47 69 76   path;.}../* Giv
17fe0 65 6e 20 61 6e 20 61 63 74 69 6f 6e 2c 20 63 6f  en an action, co
17ff0 6d 70 75 74 65 20 74 68 65 20 69 6e 74 65 67 65  mpute the intege
18000 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68 61 74  r value for that
18010 20 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68   action.** which
18020 20 69 73 20 74 6f 20 62 65 20 70 75 74 20 69 6e   is to be put in
18030 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
18040 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74  e of the generat
18050 65 64 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 52  ed machine..** R
18060 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69  eturn negative i
18070 66 20 6e 6f 20 61 63 74 69 6f 6e 20 73 68 6f 75  f no action shou
18080 6c 64 20 62 65 20 67 65 6e 65 72 61 74 65 64 2e  ld be generated.
18090 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20  .*/.PRIVATE int 
180a0 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 73  compute_action(s
180b0 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
180c0 70 2c 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  p, struct action
180d0 20 2a 61 70 29 0a 7b 0a 20 20 69 6e 74 20 61 63   *ap).{.  int ac
180e0 74 3b 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d  t;.  switch( ap-
180f0 3e 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  >type ){.    cas
18100 65 20 53 48 49 46 54 3a 20 20 61 63 74 20 3d 20  e SHIFT:  act = 
18110 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65  ap->x.stp->state
18120 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
18130 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
18140 52 45 44 55 43 45 3a 20 61 63 74 20 3d 20 61 70  REDUCE: act = ap
18150 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2b 20  ->x.rp->index + 
18160 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 62 72  lemp->nstate; br
18170 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52  eak;.    case ER
18180 52 4f 52 3a 20 20 61 63 74 20 3d 20 6c 65 6d 70  ROR:  act = lemp
18190 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d  ->nstate + lemp-
181a0 3e 6e 72 75 6c 65 3b 20 20 20 20 20 62 72 65 61  >nrule;     brea
181b0 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 43 43 45  k;.    case ACCE
181c0 50 54 3a 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e  PT: act = lemp->
181d0 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e  nstate + lemp->n
181e0 72 75 6c 65 20 2b 20 31 3b 20 62 72 65 61 6b 3b  rule + 1; break;
181f0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
18200 20 20 61 63 74 20 3d 20 2d 31 3b 20 62 72 65 61    act = -1; brea
18210 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
18220 61 63 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20  act;.}..#define 
18230 4c 49 4e 45 53 49 5a 45 20 31 30 30 30 0a 2f 2a  LINESIZE 1000./*
18240 20 54 68 65 20 6e 65 78 74 20 63 6c 75 73 74 65   The next cluste
18250 72 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  r of routines ar
18260 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  e for reading th
18270 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 0a  e template file.
18280 2a 2a 20 61 6e 64 20 77 72 69 74 69 6e 67 20 74  ** and writing t
18290 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68  he results to th
182a0 65 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73  e generated pars
182b0 65 72 20 2a 2f 0a 2f 2a 20 54 68 65 20 66 69 72  er */./* The fir
182c0 73 74 20 66 75 6e 63 74 69 6f 6e 20 74 72 61 6e  st function tran
182d0 73 66 65 72 73 20 64 61 74 61 20 66 72 6f 6d 20  sfers data from 
182e0 22 69 6e 22 20 74 6f 20 22 6f 75 74 22 20 75 6e  "in" to "out" un
182f0 74 69 6c 0a 2a 2a 20 61 20 6c 69 6e 65 20 69 73  til.** a line is
18300 20 73 65 65 6e 20 77 68 69 63 68 20 62 65 67 69   seen which begi
18310 6e 73 20 77 69 74 68 20 22 25 25 22 2e 20 20 54  ns with "%%".  T
18320 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69  he line number i
18330 73 0a 2a 2a 20 74 72 61 63 6b 65 64 2e 0a 2a 2a  s.** tracked..**
18340 0a 2a 2a 20 69 66 20 6e 61 6d 65 21 3d 30 2c 20  .** if name!=0, 
18350 74 68 65 6e 20 61 6e 79 20 77 6f 72 64 20 74 68  then any word th
18360 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 22 50  at begin with "P
18370 61 72 73 65 22 20 69 73 20 63 68 61 6e 67 65 64  arse" is changed
18380 20 74 6f 0a 2a 2a 20 62 65 67 69 6e 20 77 69 74   to.** begin wit
18390 68 20 2a 6e 61 6d 65 20 69 6e 73 74 65 61 64 2e  h *name instead.
183a0 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64  .*/.PRIVATE void
183b0 20 74 70 6c 74 5f 78 66 65 72 28 63 68 61 72 20   tplt_xfer(char 
183c0 2a 6e 61 6d 65 2c 20 46 49 4c 45 20 2a 69 6e 2c  *name, FILE *in,
183d0 20 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e 74 20   FILE *out, int 
183e0 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a 20 20 69 6e 74  *lineno).{.  int
183f0 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 63 68   i, iStart;.  ch
18400 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45  ar line[LINESIZE
18410 5d 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74  ];.  while( fget
18420 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c  s(line,LINESIZE,
18430 69 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d 21  in) && (line[0]!
18440 3d 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21  ='%' || line[1]!
18450 3d 27 25 27 29 20 29 7b 0a 20 20 20 20 28 2a 6c  ='%') ){.    (*l
18460 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69 53  ineno)++;.    iS
18470 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  tart = 0;.    if
18480 28 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  ( name ){.      
18490 66 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d  for(i=0; line[i]
184a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
184b0 69 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27  if( line[i]=='P'
184c0 20 26 26 20 73 74 72 6e 63 6d 70 28 26 6c 69 6e   && strncmp(&lin
184d0 65 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35 29 3d  e[i],"Parse",5)=
184e0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
184f0 28 69 3d 3d 30 20 7c 7c 20 21 69 73 61 6c 70 68  (i==0 || !isalph
18500 61 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20 20  a(line[i-1])).  
18510 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
18520 20 20 20 69 66 28 20 69 3e 69 53 74 61 72 74 20     if( i>iStart 
18530 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25  ) fprintf(out,"%
18540 2e 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c 26 6c  .*s",i-iStart,&l
18550 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20  ine[iStart]);.  
18560 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
18570 6f 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b 0a  out,"%s",name);.
18580 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34            i += 4
18590 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53 74 61  ;.          iSta
185a0 72 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20  rt = i+1;.      
185b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
185c0 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  }.    fprintf(ou
185d0 74 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53 74  t,"%s",&line[iSt
185e0 61 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  art]);.  }.}../*
185f0 20 54 68 65 20 6e 65 78 74 20 66 75 6e 63 74 69   The next functi
18600 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 74 65 6d  on finds the tem
18610 70 6c 61 74 65 20 66 69 6c 65 20 61 6e 64 20 6f  plate file and o
18620 70 65 6e 73 20 69 74 2c 20 72 65 74 75 72 6e 69  pens it, returni
18630 6e 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ng.** a pointer 
18640 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69  to the opened fi
18650 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 46  le. */.PRIVATE F
18660 49 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28 73  ILE *tplt_open(s
18670 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
18680 70 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 63 68  p).{.  static ch
18690 61 72 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 5b  ar templatename[
186a0 5d 20 3d 20 22 6c 65 6d 70 61 72 2e 63 22 3b 0a  ] = "lempar.c";.
186b0 20 20 63 68 61 72 20 62 75 66 5b 31 30 30 30 5d    char buf[1000]
186c0 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20  ;.  FILE *in;.  
186d0 63 68 61 72 20 2a 74 70 6c 74 6e 61 6d 65 3b 0a  char *tpltname;.
186e0 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20 2f    char *cp;..  /
186f0 2a 20 66 69 72 73 74 2c 20 73 65 65 20 69 66 20  * first, see if 
18700 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20 61  user specified a
18710 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 6e 61   template filena
18720 6d 65 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  me on the comman
18730 64 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20 69 66 20  d line. */.  if 
18740 28 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61  (user_templatena
18750 6d 65 20 21 3d 20 30 29 20 7b 0a 20 20 20 20 69  me != 0) {.    i
18760 66 28 20 61 63 63 65 73 73 28 75 73 65 72 5f 74  f( access(user_t
18770 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29  emplatename,004)
18780 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70  ==-1 ){.      fp
18790 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61  rintf(stderr,"Ca
187a0 6e 27 74 20 66 69 6e 64 20 74 68 65 20 70 61 72  n't find the par
187b0 73 65 72 20 64 72 69 76 65 72 20 74 65 6d 70 6c  ser driver templ
187c0 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e  ate file \"%s\".
187d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 75 73 65  \n",.        use
187e0 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b  r_templatename);
187f0 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  .      lemp->err
18800 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72  orcnt++;.      r
18810 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
18820 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 75 73     in = fopen(us
18830 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c  er_templatename,
18840 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69  "rb");.    if( i
18850 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  n==0 ){.      fp
18860 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61  rintf(stderr,"Ca
18870 6e 27 74 20 6f 70 65 6e 20 74 68 65 20 74 65 6d  n't open the tem
18880 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c  plate file \"%s\
18890 22 2e 5c 6e 22 2c 75 73 65 72 5f 74 65 6d 70 6c  ".\n",user_templ
188a0 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  atename);.      
188b0 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
188c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
188d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
188e0 72 6e 20 69 6e 3b 0a 20 20 7d 0a 0a 20 20 63 70  rn in;.  }..  cp
188f0 20 3d 20 73 74 72 72 63 68 72 28 6c 65 6d 70 2d   = strrchr(lemp-
18900 3e 66 69 6c 65 6e 61 6d 65 2c 27 2e 27 29 3b 0a  >filename,'.');.
18910 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20 20    if( cp ){.    
18920 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 62 75  lemon_sprintf(bu
18930 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e 74  f,"%.*s.lt",(int
18940 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65 6e  )(cp-lemp->filen
18950 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  ame),lemp->filen
18960 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
18970 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66     lemon_sprintf
18980 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c 6c 65 6d  (buf,"%s.lt",lem
18990 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
189a0 7d 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 62  }.  if( access(b
189b0 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20  uf,004)==0 ){.  
189c0 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 62 75 66    tpltname = buf
189d0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 63  ;.  }else if( ac
189e0 63 65 73 73 28 74 65 6d 70 6c 61 74 65 6e 61 6d  cess(templatenam
189f0 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20 20  e,004)==0 ){.   
18a00 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74 65 6d 70   tpltname = temp
18a10 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d 65 6c 73  latename;.  }els
18a20 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20  e{.    tpltname 
18a30 3d 20 70 61 74 68 73 65 61 72 63 68 28 6c 65 6d  = pathsearch(lem
18a40 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70 6c 61 74  p->argv0,templat
18a50 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d 0a 20 20  ename,0);.  }.  
18a60 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d 3d 30 20  if( tpltname==0 
18a70 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
18a80 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69 6e  tderr,"Can't fin
18a90 64 20 74 68 65 20 70 61 72 73 65 72 20 64 72 69  d the parser dri
18aa0 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  ver template fil
18ab0 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20  e \"%s\".\n",.  
18ac0 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b    templatename);
18ad0 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
18ae0 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
18af0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20  n 0;.  }.  in = 
18b00 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d 65 2c 22  fopen(tpltname,"
18b10 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  rb");.  if( in==
18b20 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
18b30 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f  (stderr,"Can't o
18b40 70 65 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65  pen the template
18b50 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22   file \"%s\".\n"
18b60 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a  ,templatename);.
18b70 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
18b80 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
18b90 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
18ba0 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74   in;.}../* Print
18bb0 20 61 20 23 6c 69 6e 65 20 64 69 72 65 63 74 69   a #line directi
18bc0 76 65 20 6c 69 6e 65 20 74 6f 20 74 68 65 20 6f  ve line to the o
18bd0 75 74 70 75 74 20 66 69 6c 65 2e 20 2a 2f 0a 50  utput file. */.P
18be0 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74  RIVATE void tplt
18bf0 5f 6c 69 6e 65 64 69 72 28 46 49 4c 45 20 2a 6f  _linedir(FILE *o
18c00 75 74 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20  ut, int lineno, 
18c10 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 29 0a  char *filename).
18c20 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  {.  fprintf(out,
18c30 22 23 6c 69 6e 65 20 25 64 20 5c 22 22 2c 6c 69  "#line %d \"",li
18c40 6e 65 6e 6f 29 3b 0a 20 20 77 68 69 6c 65 28 20  neno);.  while( 
18c50 2a 66 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20  *filename ){.   
18c60 20 69 66 28 20 2a 66 69 6c 65 6e 61 6d 65 20 3d   if( *filename =
18c70 3d 20 27 5c 5c 27 20 29 20 70 75 74 63 28 27 5c  = '\\' ) putc('\
18c80 5c 27 2c 6f 75 74 29 3b 0a 20 20 20 20 70 75 74  \',out);.    put
18c90 63 28 2a 66 69 6c 65 6e 61 6d 65 2c 6f 75 74 29  c(*filename,out)
18ca0 3b 0a 20 20 20 20 66 69 6c 65 6e 61 6d 65 2b 2b  ;.    filename++
18cb0 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ;.  }.  fprintf(
18cc0 6f 75 74 2c 22 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a  out,"\"\n");.}..
18cd0 2f 2a 20 50 72 69 6e 74 20 61 20 73 74 72 69 6e  /* Print a strin
18ce0 67 20 74 6f 20 74 68 65 20 66 69 6c 65 20 61 6e  g to the file an
18cf0 64 20 6b 65 65 70 20 74 68 65 20 6c 69 6e 65 6e  d keep the linen
18d00 75 6d 62 65 72 20 75 70 20 74 6f 20 64 61 74 65  umber up to date
18d10 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64   */.PRIVATE void
18d20 20 74 70 6c 74 5f 70 72 69 6e 74 28 46 49 4c 45   tplt_print(FILE
18d30 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 6c 65   *out, struct le
18d40 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63 68 61 72 20  mon *lemp, char 
18d50 2a 73 74 72 2c 20 69 6e 74 20 2a 6c 69 6e 65 6e  *str, int *linen
18d60 6f 29 0a 7b 0a 20 20 69 66 28 20 73 74 72 3d 3d  o).{.  if( str==
18d70 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68  0 ) return;.  wh
18d80 69 6c 65 28 20 2a 73 74 72 20 29 7b 0a 20 20 20  ile( *str ){.   
18d90 20 70 75 74 63 28 2a 73 74 72 2c 6f 75 74 29 3b   putc(*str,out);
18da0 0a 20 20 20 20 69 66 28 20 2a 73 74 72 3d 3d 27  .    if( *str=='
18db0 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n' ) (*lineno)+
18dc0 2b 3b 0a 20 20 20 20 73 74 72 2b 2b 3b 0a 20 20  +;.    str++;.  
18dd0 7d 0a 20 20 69 66 28 20 73 74 72 5b 2d 31 5d 21  }.  if( str[-1]!
18de0 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 70 75 74  ='\n' ){.    put
18df0 63 28 27 5c 6e 27 2c 6f 75 74 29 3b 0a 20 20 20  c('\n',out);.   
18e00 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
18e10 7d 0a 20 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e  }.  if (!lemp->n
18e20 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 0a  olinenosflag) {.
18e30 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b      (*lineno)++;
18e40 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75   tplt_linedir(ou
18e50 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e  t,*lineno,lemp->
18e60 6f 75 74 6e 61 6d 65 29 3b 20 0a 20 20 7d 0a 20  outname); .  }. 
18e70 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
18e80 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
18e90 72 6f 75 74 69 6e 65 20 65 6d 69 74 73 20 63 6f  routine emits co
18ea0 64 65 20 66 6f 72 20 74 68 65 20 64 65 73 74 72  de for the destr
18eb0 75 63 74 6f 72 20 66 6f 72 20 74 68 65 0a 2a 2a  uctor for the.**
18ec0 20 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f 0a 76 6f   symbol sp.*/.vo
18ed0 69 64 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74  id emit_destruct
18ee0 6f 72 5f 63 6f 64 65 28 0a 20 20 46 49 4c 45 20  or_code(.  FILE 
18ef0 2a 6f 75 74 2c 0a 20 20 73 74 72 75 63 74 20 73  *out,.  struct s
18f00 79 6d 62 6f 6c 20 2a 73 70 2c 0a 20 20 73 74 72  ymbol *sp,.  str
18f10 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
18f20 0a 20 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 0a 29  .  int *lineno.)
18f30 7b 0a 20 63 68 61 72 20 2a 63 70 20 3d 20 30 3b  {. char *cp = 0;
18f40 0a 0a 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d  .. if( sp->type=
18f50 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  =TERMINAL ){.   
18f60 63 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  cp = lemp->token
18f70 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70 3d  dest;.   if( cp=
18f80 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
18f90 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e  fprintf(out,"{\n
18fa0 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
18fb0 0a 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e  . }else if( sp->
18fc0 64 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  destructor ){.  
18fd0 20 63 70 20 3d 20 73 70 2d 3e 64 65 73 74 72 75   cp = sp->destru
18fe0 63 74 6f 72 3b 0a 20 20 20 66 70 72 69 6e 74 66  ctor;.   fprintf
18ff0 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c  (out,"{\n"); (*l
19000 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 20  ineno)++;.   if 
19010 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f  (!lemp->nolineno
19020 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e  sflag) { (*linen
19030 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64  o)++; tplt_lined
19040 69 72 28 6f 75 74 2c 73 70 2d 3e 64 65 73 74 4c  ir(out,sp->destL
19050 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 66 69 6c 65  ineno,lemp->file
19060 6e 61 6d 65 29 3b 20 7d 0a 20 7d 65 6c 73 65 20  name); }. }else 
19070 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73  if( lemp->vardes
19080 74 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d  t ){.   cp = lem
19090 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20 69  p->vardest;.   i
190a0 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75 72  f( cp==0 ) retur
190b0 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75  n;.   fprintf(ou
190c0 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65  t,"{\n"); (*line
190d0 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65 7b 0a 20  no)++;. }else{. 
190e0 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20    assert( 0 );  
190f0 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e  /* Cannot happen
19100 20 2a 2f 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a 63   */. }. for(; *c
19110 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66 28  p; cp++){.   if(
19120 20 2a 63 70 3d 3d 27 24 27 20 26 26 20 63 70 5b   *cp=='$' && cp[
19130 31 5d 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20 20  1]=='$' ){.     
19140 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 79 79  fprintf(out,"(yy
19150 70 6d 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c 73  pminor->yy%d)",s
19160 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20  p->dtnum);.     
19170 63 70 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74 69  cp++;.     conti
19180 6e 75 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66 28  nue;.   }.   if(
19190 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c   *cp=='\n' ) (*l
191a0 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 66 70 75  ineno)++;.   fpu
191b0 74 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a  tc(*cp,out);. }.
191c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e   fprintf(out,"\n
191d0 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
191e0 0a 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c  . if (!lemp->nol
191f0 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 20 0a 20  inenosflag) { . 
19200 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74    (*lineno)++; t
19210 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c  plt_linedir(out,
19220 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75  *lineno,lemp->ou
19230 74 6e 61 6d 65 29 3b 20 0a 20 7d 0a 20 66 70 72  tname); . }. fpr
19240 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b  intf(out,"}\n");
19250 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 72   (*lineno)++;. r
19260 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
19270 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e  Return TRUE (non
19280 2d 7a 65 72 6f 29 20 69 66 20 74 68 65 20 67 69  -zero) if the gi
19290 76 65 6e 20 73 79 6d 62 6f 6c 20 68 61 73 20 61  ven symbol has a
192a0 20 64 65 73 74 72 75 63 74 6f 72 2e 0a 2a 2f 0a   destructor..*/.
192b0 69 6e 74 20 68 61 73 5f 64 65 73 74 72 75 63 74  int has_destruct
192c0 6f 72 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  or(struct symbol
192d0 20 2a 73 70 2c 20 73 74 72 75 63 74 20 6c 65 6d   *sp, struct lem
192e0 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e  on *lemp).{.  in
192f0 74 20 72 65 74 3b 0a 20 20 69 66 28 20 73 70 2d  t ret;.  if( sp-
19300 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20  >type==TERMINAL 
19310 29 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c 65 6d  ){.    ret = lem
19320 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 21 3d 30 3b  p->tokendest!=0;
19330 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
19340 74 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73  t = lemp->vardes
19350 74 21 3d 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74  t!=0 || sp->dest
19360 72 75 63 74 6f 72 21 3d 30 3b 0a 20 20 7d 0a 20  ructor!=0;.  }. 
19370 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
19380 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78  /*.** Append tex
19390 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c  t to a dynamical
193a0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 74 72  ly allocated str
193b0 69 6e 67 2e 20 20 49 66 20 7a 54 65 78 74 20 69  ing.  If zText i
193c0 73 20 30 20 74 68 65 6e 0a 2a 2a 20 72 65 73 65  s 0 then.** rese
193d0 74 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20  t the string to 
193e0 62 65 20 65 6d 70 74 79 20 61 67 61 69 6e 2e 20  be empty again. 
193f0 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74   Always return t
19400 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
19410 0a 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 69 6e  .** of the strin
19420 67 20 28 77 68 69 63 68 20 69 73 20 6f 76 65 72  g (which is over
19430 77 72 69 74 74 65 6e 20 77 69 74 68 20 65 61 63  written with eac
19440 68 20 63 61 6c 6c 29 2e 0a 2a 2a 0a 2a 2a 20 6e  h call)..**.** n
19450 20 62 79 74 65 73 20 6f 66 20 7a 54 65 78 74 20   bytes of zText 
19460 61 72 65 20 73 74 6f 72 65 64 2e 20 20 49 66 20  are stored.  If 
19470 6e 3d 3d 30 20 74 68 65 6e 20 61 6c 6c 20 6f 66  n==0 then all of
19480 20 7a 54 65 78 74 20 75 70 20 74 6f 20 74 68 65   zText up to the
19490 20 66 69 72 73 74 0a 2a 2a 20 5c 30 30 30 20 74   first.** \000 t
194a0 65 72 6d 69 6e 61 74 6f 72 20 69 73 20 73 74 6f  erminator is sto
194b0 72 65 64 2e 20 20 7a 54 65 78 74 20 63 61 6e 20  red.  zText can 
194c0 63 6f 6e 74 61 69 6e 20 75 70 20 74 6f 20 74 77  contain up to tw
194d0 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 0a 2a  o instances of.*
194e0 2a 20 25 64 2e 20 20 54 68 65 20 76 61 6c 75 65  * %d.  The value
194f0 73 20 6f 66 20 70 31 20 61 6e 64 20 70 32 20 61  s of p1 and p2 a
19500 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
19510 74 68 65 20 66 69 72 73 74 20 61 6e 64 20 73 65  the first and se
19520 63 6f 6e 64 0a 2a 2a 20 25 64 2e 0a 2a 2a 0a 2a  cond.** %d..**.*
19530 2a 20 49 66 20 6e 3d 3d 2d 31 2c 20 74 68 65 6e  * If n==-1, then
19540 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 68   the previous ch
19550 61 72 61 63 74 65 72 20 69 73 20 6f 76 65 72 77  aracter is overw
19560 72 69 74 74 65 6e 2e 0a 2a 2f 0a 50 52 49 56 41  ritten..*/.PRIVA
19570 54 45 20 63 68 61 72 20 2a 61 70 70 65 6e 64 5f  TE char *append_
19580 73 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  str(const char *
19590 7a 54 65 78 74 2c 20 69 6e 74 20 6e 2c 20 69 6e  zText, int n, in
195a0 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
195b0 20 73 74 61 74 69 63 20 63 68 61 72 20 65 6d 70   static char emp
195c0 74 79 5b 31 5d 20 3d 20 7b 20 30 20 7d 3b 0a 20  ty[1] = { 0 };. 
195d0 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 20   static char *z 
195e0 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
195f0 74 20 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20  t alloced = 0;. 
19600 20 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64   static int used
19610 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 3b 0a 20   = 0;.  int c;. 
19620 20 63 68 61 72 20 7a 49 6e 74 5b 34 30 5d 3b 0a   char zInt[40];.
19630 20 20 69 66 28 20 7a 54 65 78 74 3d 3d 30 20 29    if( zText==0 )
19640 7b 0a 20 20 20 20 75 73 65 64 20 3d 20 30 3b 0a  {.    used = 0;.
19650 20 20 20 20 72 65 74 75 72 6e 20 7a 3b 0a 20 20      return z;.  
19660 7d 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 7b 0a  }.  if( n<=0 ){.
19670 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20      if( n<0 ){. 
19680 20 20 20 20 20 75 73 65 64 20 2b 3d 20 6e 3b 0a       used += n;.
19690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 73        assert( us
196a0 65 64 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ed>=0 );.    }. 
196b0 20 20 20 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c     n = lemonStrl
196c0 65 6e 28 7a 54 65 78 74 29 3b 0a 20 20 7d 0a 20  en(zText);.  }. 
196d0 20 69 66 28 20 28 69 6e 74 29 20 28 6e 2b 73 69   if( (int) (n+si
196e0 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 2b 75 73 65  zeof(zInt)*2+use
196f0 64 29 20 3e 3d 20 61 6c 6c 6f 63 65 64 20 29 7b  d) >= alloced ){
19700 0a 20 20 20 20 61 6c 6c 6f 63 65 64 20 3d 20 6e  .    alloced = n
19710 20 2b 20 73 69 7a 65 6f 66 28 7a 49 6e 74 29 2a   + sizeof(zInt)*
19720 32 20 2b 20 75 73 65 64 20 2b 20 32 30 30 3b 0a  2 + used + 200;.
19730 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29      z = (char *)
19740 20 72 65 61 6c 6c 6f 63 28 7a 2c 20 20 61 6c 6c   realloc(z,  all
19750 6f 63 65 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oced);.  }.  if(
19760 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 65   z==0 ) return e
19770 6d 70 74 79 3b 0a 20 20 77 68 69 6c 65 28 20 6e  mpty;.  while( n
19780 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 63 20  -- > 0 ){.    c 
19790 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b 0a 20 20  = *(zText++);.  
197a0 20 20 69 66 28 20 63 3d 3d 27 25 27 20 26 26 20    if( c=='%' && 
197b0 6e 3e 30 20 26 26 20 7a 54 65 78 74 5b 30 5d 3d  n>0 && zText[0]=
197c0 3d 27 64 27 20 29 7b 0a 20 20 20 20 20 20 6c 65  ='d' ){.      le
197d0 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 7a 49 6e 74  mon_sprintf(zInt
197e0 2c 20 22 25 64 22 2c 20 70 31 29 3b 0a 20 20 20  , "%d", p1);.   
197f0 20 20 20 70 31 20 3d 20 70 32 3b 0a 20 20 20 20     p1 = p2;.    
19800 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 26    lemon_strcpy(&
19810 7a 5b 75 73 65 64 5d 2c 20 7a 49 6e 74 29 3b 0a  z[used], zInt);.
19820 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20 6c 65        used += le
19830 6d 6f 6e 53 74 72 6c 65 6e 28 26 7a 5b 75 73 65  monStrlen(&z[use
19840 64 5d 29 3b 0a 20 20 20 20 20 20 7a 54 65 78 74  d]);.      zText
19850 2b 2b 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20  ++;.      n--;. 
19860 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19870 7a 5b 75 73 65 64 2b 2b 5d 20 3d 20 28 63 68 61  z[used++] = (cha
19880 72 29 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  r)c;.    }.  }. 
19890 20 7a 5b 75 73 65 64 5d 20 3d 20 30 3b 0a 20 20   z[used] = 0;.  
198a0 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a  return z;.}../*.
198b0 2a 2a 20 7a 43 6f 64 65 20 69 73 20 61 20 73 74  ** zCode is a st
198c0 72 69 6e 67 20 74 68 61 74 20 69 73 20 74 68 65  ring that is the
198d0 20 61 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74   action associat
198e0 65 64 20 77 69 74 68 20 61 20 72 75 6c 65 2e 20  ed with a rule. 
198f0 20 45 78 70 61 6e 64 0a 2a 2a 20 74 68 65 20 73   Expand.** the s
19900 79 6d 62 6f 6c 73 20 69 6e 20 74 68 69 73 20 73  ymbols in this s
19910 74 72 69 6e 67 20 73 6f 20 74 68 61 74 20 74 68  tring so that th
19920 65 20 72 65 66 65 72 20 74 6f 20 65 6c 65 6d 65  e refer to eleme
19930 6e 74 73 20 6f 66 20 74 68 65 20 70 61 72 73 65  nts of the parse
19940 72 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f 0a 50  r.** stack..*/.P
19950 52 49 56 41 54 45 20 76 6f 69 64 20 74 72 61 6e  RIVATE void tran
19960 73 6c 61 74 65 5f 63 6f 64 65 28 73 74 72 75 63  slate_code(struc
19970 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73  t lemon *lemp, s
19980 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b  truct rule *rp){
19990 0a 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 78 70  .  char *cp, *xp
199a0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
199b0 72 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 20 20  r lhsused = 0;  
199c0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
199d0 20 4c 48 53 20 65 6c 65 6d 65 6e 74 20 68 61 73   LHS element has
199e0 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20   been used */.  
199f0 63 68 61 72 20 75 73 65 64 5b 4d 41 58 52 48 53  char used[MAXRHS
19a00 5d 3b 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72  ];   /* True for
19a10 20 65 61 63 68 20 52 48 53 20 65 6c 65 6d 65 6e   each RHS elemen
19a20 74 20 77 68 69 63 68 20 69 73 20 75 73 65 64 20  t which is used 
19a30 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  */..  for(i=0; i
19a40 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 20  <rp->nrhs; i++) 
19a50 75 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 6c  used[i] = 0;.  l
19a60 68 73 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 69  hsused = 0;..  i
19a70 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29  f( rp->code==0 )
19a80 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61  {.    static cha
19a90 72 20 6e 65 77 6c 69 6e 65 73 74 72 5b 32 5d 20  r newlinestr[2] 
19aa0 3d 20 7b 20 27 5c 6e 27 2c 20 27 5c 30 27 20 7d  = { '\n', '\0' }
19ab0 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d  ;.    rp->code =
19ac0 20 6e 65 77 6c 69 6e 65 73 74 72 3b 0a 20 20 20   newlinestr;.   
19ad0 20 72 70 2d 3e 6c 69 6e 65 20 3d 20 72 70 2d 3e   rp->line = rp->
19ae0 72 75 6c 65 6c 69 6e 65 3b 0a 20 20 7d 0a 0a 20  ruleline;.  }.. 
19af0 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c   append_str(0,0,
19b00 30 2c 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  0,0);..  /* This
19b10 20 63 6f 6e 73 74 20 63 61 73 74 20 69 73 20 77   const cast is w
19b20 72 6f 6e 67 20 62 75 74 20 68 61 72 6d 6c 65 73  rong but harmles
19b30 73 2c 20 69 66 20 77 65 27 72 65 20 63 61 72 65  s, if we're care
19b40 66 75 6c 2e 20 2a 2f 0a 20 20 66 6f 72 28 63 70  ful. */.  for(cp
19b50 3d 28 63 68 61 72 20 2a 29 72 70 2d 3e 63 6f 64  =(char *)rp->cod
19b60 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20  e; *cp; cp++){. 
19b70 20 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 2a     if( isalpha(*
19b80 63 70 29 20 26 26 20 28 63 70 3d 3d 72 70 2d 3e  cp) && (cp==rp->
19b90 63 6f 64 65 20 7c 7c 20 28 21 69 73 61 6c 6e 75  code || (!isalnu
19ba0 6d 28 63 70 5b 2d 31 5d 29 20 26 26 20 63 70 5b  m(cp[-1]) && cp[
19bb0 2d 31 5d 21 3d 27 5f 27 29 29 20 29 7b 0a 20 20  -1]!='_')) ){.  
19bc0 20 20 20 20 63 68 61 72 20 73 61 76 65 64 3b 0a      char saved;.
19bd0 20 20 20 20 20 20 66 6f 72 28 78 70 3d 20 26 63        for(xp= &c
19be0 70 5b 31 5d 3b 20 69 73 61 6c 6e 75 6d 28 2a 78  p[1]; isalnum(*x
19bf0 70 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20  p) || *xp=='_'; 
19c00 78 70 2b 2b 29 3b 0a 20 20 20 20 20 20 73 61 76  xp++);.      sav
19c10 65 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20 20  ed = *xp;.      
19c20 2a 78 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  *xp = 0;.      i
19c30 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20  f( rp->lhsalias 
19c40 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d  && strcmp(cp,rp-
19c50 3e 6c 68 73 61 6c 69 61 73 29 3d 3d 30 20 29 7b  >lhsalias)==0 ){
19c60 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f  .        append_
19c70 73 74 72 28 22 79 79 67 6f 74 6f 6d 69 6e 6f 72  str("yygotominor
19c80 2e 79 79 25 64 22 2c 30 2c 72 70 2d 3e 6c 68 73  .yy%d",0,rp->lhs
19c90 2d 3e 64 74 6e 75 6d 2c 30 29 3b 0a 20 20 20 20  ->dtnum,0);.    
19ca0 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20      cp = xp;.   
19cb0 20 20 20 20 20 6c 68 73 75 73 65 64 20 3d 20 31       lhsused = 1
19cc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19cd0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
19ce0 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
19cf0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
19d00 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20  rp->rhsalias[i] 
19d10 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d  && strcmp(cp,rp-
19d20 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30  >rhsalias[i])==0
19d30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19d40 69 66 28 20 63 70 21 3d 72 70 2d 3e 63 6f 64 65  if( cp!=rp->code
19d50 20 26 26 20 63 70 5b 2d 31 5d 3d 3d 27 40 27 20   && cp[-1]=='@' 
19d60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
19d70 20 2f 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d   /* If the argum
19d80 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ent is of the fo
19d90 72 6d 20 40 58 20 74 68 65 6e 20 73 75 62 73 74  rm @X then subst
19da0 69 74 75 74 65 64 0a 20 20 20 20 20 20 20 20 20  ituted.         
19db0 20 20 20 20 20 2a 2a 20 74 68 65 20 74 6f 6b 65       ** the toke
19dc0 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 2c 20 6e  n number of X, n
19dd0 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ot the value of 
19de0 58 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  X */.           
19df0 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79     append_str("y
19e00 79 6d 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22 2c  ymsp[%d].major",
19e10 2d 31 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c  -1,i-rp->nrhs+1,
19e20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
19e30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
19e40 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
19e50 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73  ol *sp = rp->rhs
19e60 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
19e70 20 20 20 69 6e 74 20 64 74 6e 75 6d 3b 0a 20 20     int dtnum;.  
19e80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
19e90 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54  sp->type==MULTIT
19ea0 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
19eb0 20 20 20 20 20 20 20 20 20 20 20 64 74 6e 75 6d             dtnum
19ec0 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d   = sp->subsym[0]
19ed0 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  ->dtnum;.       
19ee0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
19ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 74                dt
19f00 6e 75 6d 20 3d 20 73 70 2d 3e 64 74 6e 75 6d 3b  num = sp->dtnum;
19f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
19f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
19f30 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73 70  ppend_str("yymsp
19f40 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22  [%d].minor.yy%d"
19f50 2c 30 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c  ,0,i-rp->nrhs+1,
19f60 20 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20   dtnum);.       
19f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
19f80 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20     cp = xp;.    
19f90 20 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d 20          used[i] 
19fa0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
19fb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
19fc0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
19fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 78 70 20      }.      *xp 
19fe0 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a 20  = saved;.    }. 
19ff0 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 63 70     append_str(cp
1a000 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 20  , 1, 0, 0);.  } 
1a010 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 0a  /* End loop */..
1a020 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    /* Check to ma
1a030 6b 65 20 73 75 72 65 20 74 68 65 20 4c 48 53 20  ke sure the LHS 
1a040 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f  has been used */
1a050 0a 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c  .  if( rp->lhsal
1a060 69 61 73 20 26 26 20 21 6c 68 73 75 73 65 64 20  ias && !lhsused 
1a070 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28  ){.    ErrorMsg(
1a080 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72  lemp->filename,r
1a090 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20  p->ruleline,.   
1a0a0 20 20 20 22 4c 61 62 65 6c 20 5c 22 25 73 5c 22     "Label \"%s\"
1a0b0 20 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22 20   for \"%s(%s)\" 
1a0c0 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22 2c  is never used.",
1a0d0 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73  .        rp->lhs
1a0e0 61 6c 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e 6e  alias,rp->lhs->n
1a0f0 61 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73  ame,rp->lhsalias
1a100 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  );.    lemp->err
1a110 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  orcnt++;.  }..  
1a120 2f 2a 20 47 65 6e 65 72 61 74 65 20 64 65 73 74  /* Generate dest
1a130 72 75 63 74 6f 72 20 63 6f 64 65 20 66 6f 72 20  ructor code for 
1a140 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 68 69 63  RHS symbols whic
1a150 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69  h are not used i
1a160 6e 20 74 68 65 0a 20 20 2a 2a 20 72 65 64 75 63  n the.  ** reduc
1a170 65 20 63 6f 64 65 20 2a 2f 0a 20 20 66 6f 72 28  e code */.  for(
1a180 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
1a190 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   i++){.    if( r
1a1a0 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26  p->rhsalias[i] &
1a1b0 26 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20 20  & !used[i] ){.  
1a1c0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
1a1d0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e  p->filename,rp->
1a1e0 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20  ruleline,.      
1a1f0 20 20 22 4c 61 62 65 6c 20 25 73 20 66 6f 72 20    "Label %s for 
1a200 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e 65  \"%s(%s)\" is ne
1a210 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20 20  ver used.",.    
1a220 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73      rp->rhsalias
1a230 5b 69 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e  [i],rp->rhs[i]->
1a240 6e 61 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69 61  name,rp->rhsalia
1a250 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 6c 65 6d  s[i]);.      lem
1a260 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
1a270 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70 2d     }else if( rp-
1a280 3e 72 68 73 61 6c 69 61 73 5b 69 5d 3d 3d 30 20  >rhsalias[i]==0 
1a290 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  ){.      if( has
1a2a0 5f 64 65 73 74 72 75 63 74 6f 72 28 72 70 2d 3e  _destructor(rp->
1a2b0 72 68 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b 0a  rhs[i],lemp) ){.
1a2c0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73          append_s
1a2d0 74 72 28 22 20 20 79 79 5f 64 65 73 74 72 75 63  tr("  yy_destruc
1a2e0 74 6f 72 28 79 79 70 50 61 72 73 65 72 2c 25 64  tor(yypParser,%d
1a2f0 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f  ,&yymsp[%d].mino
1a300 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20  r);\n", 0,.     
1a310 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d        rp->rhs[i]
1a320 2d 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e 72  ->index,i-rp->nr
1a330 68 73 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  hs+1);.      }el
1a340 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
1a350 6f 20 64 65 73 74 72 75 63 74 6f 72 20 64 65 66  o destructor def
1a360 69 6e 65 64 20 66 6f 72 20 74 68 69 73 20 74 65  ined for this te
1a370 72 6d 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  rm */.      }.  
1a380 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 70    }.  }.  if( rp
1a390 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 70  ->code ){.    cp
1a3a0 20 3d 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c   = append_str(0,
1a3b0 30 2c 30 2c 30 29 3b 0a 20 20 20 20 72 70 2d 3e  0,0,0);.    rp->
1a3c0 63 6f 64 65 20 3d 20 53 74 72 73 61 66 65 28 63  code = Strsafe(c
1a3d0 70 3f 63 70 3a 22 22 29 3b 0a 20 20 7d 0a 7d 0a  p?cp:"");.  }.}.
1a3e0 0a 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ./* .** Generate
1a3f0 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   code which exec
1a400 75 74 65 73 20 77 68 65 6e 20 74 68 65 20 72 75  utes when the ru
1a410 6c 65 20 22 72 70 22 20 69 73 20 72 65 64 75 63  le "rp" is reduc
1a420 65 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74 68  ed.  Write.** th
1a430 65 20 63 6f 64 65 20 74 6f 20 22 6f 75 74 22 2e  e code to "out".
1a440 20 20 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e 65    Make sure line
1a450 6e 6f 20 73 74 61 79 73 20 75 70 2d 74 6f 2d 64  no stays up-to-d
1a460 61 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ate..*/.PRIVATE 
1a470 76 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65 28 0a  void emit_code(.
1a480 20 20 46 49 4c 45 20 2a 6f 75 74 2c 0a 20 20 73    FILE *out,.  s
1a490 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 0a  truct rule *rp,.
1a4a0 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a    struct lemon *
1a4b0 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c 69 6e  lemp,.  int *lin
1a4c0 65 6e 6f 0a 29 7b 0a 20 63 6f 6e 73 74 20 63 68  eno.){. const ch
1a4d0 61 72 20 2a 63 70 3b 0a 0a 20 2f 2a 20 47 65 6e  ar *cp;.. /* Gen
1a4e0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 6f  erate code to do
1a4f0 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69   the reduce acti
1a500 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63  on */. if( rp->c
1a510 6f 64 65 20 29 7b 0a 20 20 20 69 66 20 28 21 6c  ode ){.   if (!l
1a520 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c  emp->nolinenosfl
1a530 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  ag) { (*lineno)+
1a540 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28  +; tplt_linedir(
1a550 6f 75 74 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d  out,rp->line,lem
1a560 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 20 7d 0a  p->filename); }.
1a570 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1a580 7b 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 0a  {%s",rp->code);.
1a590 20 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f     for(cp=rp->co
1a5a0 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a  de; *cp; cp++){.
1a5b0 20 20 20 20 20 69 66 28 20 2a 63 70 3d 3d 27 5c       if( *cp=='\
1a5c0 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n' ) (*lineno)++
1a5d0 3b 0a 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f  ;.   } /* End lo
1a5e0 6f 70 20 2a 2f 0a 20 20 20 66 70 72 69 6e 74 66  op */.   fprintf
1a5f0 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c  (out,"}\n"); (*l
1a600 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 20  ineno)++;.   if 
1a610 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f  (!lemp->nolineno
1a620 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e  sflag) { (*linen
1a630 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64  o)++; tplt_lined
1a640 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c  ir(out,*lineno,l
1a650 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 7d  emp->outname); }
1a660 0a 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 72  . } /* End if( r
1a670 70 2d 3e 63 6f 64 65 20 29 20 2a 2f 0a 0a 20 72  p->code ) */.. r
1a680 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
1a690 50 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e 69  Print the defini
1a6a0 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69 6f  tion of the unio
1a6b0 6e 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 70  n used for the p
1a6c0 61 72 73 65 72 27 73 20 64 61 74 61 20 73 74 61  arser's data sta
1a6d0 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69 6f  ck..** This unio
1a6e0 6e 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c 64  n contains field
1a6f0 73 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73  s for every poss
1a700 69 62 6c 65 20 64 61 74 61 20 74 79 70 65 20 66  ible data type f
1a710 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64  or tokens.** and
1a720 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20 20   nonterminals.  
1a730 49 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f  In the process o
1a740 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64 20  f computing and 
1a750 70 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a 2a  printing this.**
1a760 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65 74   union, also set
1a770 20 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69   the ".dtnum" fi
1a780 65 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65 72  eld of every ter
1a790 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72  minal and nonter
1a7a0 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e  minal.** symbol.
1a7b0 0a 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f 73  .*/.void print_s
1a7c0 74 61 63 6b 5f 75 6e 69 6f 6e 28 0a 20 20 46 49  tack_union(.  FI
1a7d0 4c 45 20 2a 6f 75 74 2c 20 20 20 20 20 20 20 20  LE *out,        
1a7e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a7f0 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d 20 2a   output stream *
1a800 2f 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  /.  struct lemon
1a810 20 2a 6c 65 6d 70 2c 20 20 20 20 20 20 20 20 20   *lemp,         
1a820 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66 6f  /* The main info
1a830 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74   structure for t
1a840 68 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 20 20  his parser */.  
1a850 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 2c 20 20 20  int *plineno,   
1a860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1a870 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 69  ointer to the li
1a880 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ne number */.  i
1a890 6e 74 20 6d 68 66 6c 61 67 20 20 20 20 20 20 20  nt mhflag       
1a8a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1a8b0 75 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e 67  ue if generating
1a8c0 20 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75 74   makeheaders out
1a8d0 70 75 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  put */.){.  int 
1a8e0 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e  lineno = *plinen
1a8f0 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e  o;    /* The lin
1a900 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1a910 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63 68 61 72  output */.  char
1a920 20 2a 2a 74 79 70 65 73 3b 20 20 20 20 20 20 20   **types;       
1a930 20 20 20 20 20 20 2f 2a 20 41 20 68 61 73 68 20        /* A hash 
1a940 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70  table of datatyp
1a950 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72 61  es */.  int arra
1a960 79 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  ysize;          
1a970 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1a980 20 22 74 79 70 65 73 22 20 61 72 72 61 79 20 2a   "types" array *
1a990 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74 6c 65 6e  /.  int maxdtlen
1a9a0 67 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  gth;          /*
1a9b0 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20   Maximum length 
1a9c0 6f 66 20 61 6e 79 20 22 2e 64 61 74 61 74 79 70  of any ".datatyp
1a9d0 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 63  e" field. */.  c
1a9e0 68 61 72 20 2a 73 74 64 64 74 3b 20 20 20 20 20  har *stddt;     
1a9f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 6e           /* Stan
1aa00 64 61 72 64 69 7a 65 64 20 6e 61 6d 65 20 66 6f  dardized name fo
1aa10 72 20 61 20 64 61 74 61 74 79 70 65 20 2a 2f 0a  r a datatype */.
1aa20 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20 20    int i,j;      
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1aa40 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
1aa50 20 20 75 6e 73 69 67 6e 65 64 20 68 61 73 68 3b    unsigned hash;
1aa60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1aa70 6f 72 20 68 61 73 68 69 6e 67 20 74 68 65 20 6e  or hashing the n
1aa80 61 6d 65 20 6f 66 20 61 20 74 79 70 65 20 2a 2f  ame of a type */
1aa90 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e  .  const char *n
1aaa0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ame;         /* 
1aab0 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72 73  Name of the pars
1aac0 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  er */..  /* Allo
1aad0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
1aae0 69 7a 65 20 74 79 70 65 73 5b 5d 20 61 6e 64 20  ize types[] and 
1aaf0 61 6c 6c 6f 63 61 74 65 20 73 74 64 64 74 5b 5d  allocate stddt[]
1ab00 20 2a 2f 0a 20 20 61 72 72 61 79 73 69 7a 65 20   */.  arraysize 
1ab10 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  = lemp->nsymbol 
1ab20 2a 20 32 3b 0a 20 20 74 79 70 65 73 20 3d 20 28  * 2;.  types = (
1ab30 63 68 61 72 2a 2a 29 63 61 6c 6c 6f 63 28 20 61  char**)calloc( a
1ab40 72 72 61 79 73 69 7a 65 2c 20 73 69 7a 65 6f 66  rraysize, sizeof
1ab50 28 63 68 61 72 2a 29 20 29 3b 0a 20 20 69 66 28  (char*) );.  if(
1ab60 20 74 79 70 65 73 3d 3d 30 20 29 7b 0a 20 20 20   types==0 ){.   
1ab70 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1ab80 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c  "Out of memory.\
1ab90 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
1aba0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1abb0 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b   i<arraysize; i+
1abc0 2b 29 20 74 79 70 65 73 5b 69 5d 20 3d 20 30 3b  +) types[i] = 0;
1abd0 0a 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d  .  maxdtlength =
1abe0 20 30 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   0;.  if( lemp->
1abf0 76 61 72 74 79 70 65 20 29 7b 0a 20 20 20 20 6d  vartype ){.    m
1ac00 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6d  axdtlength = lem
1ac10 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 76  onStrlen(lemp->v
1ac20 61 72 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20 66  artype);.  }.  f
1ac30 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1ac40 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
1ac50 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
1ac60 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
1ac70 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
1ac80 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70  s[i];.    if( sp
1ac90 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 29 20  ->datatype==0 ) 
1aca0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c 65  continue;.    le
1acb0 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  n = lemonStrlen(
1acc0 73 70 2d 3e 64 61 74 61 74 79 70 65 29 3b 0a 20  sp->datatype);. 
1acd0 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 64 74     if( len>maxdt
1ace0 6c 65 6e 67 74 68 20 29 20 6d 61 78 64 74 6c 65  length ) maxdtle
1acf0 6e 67 74 68 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a  ngth = len;.  }.
1ad00 20 20 73 74 64 64 74 20 3d 20 28 63 68 61 72 2a    stddt = (char*
1ad10 29 6d 61 6c 6c 6f 63 28 20 6d 61 78 64 74 6c 65  )malloc( maxdtle
1ad20 6e 67 74 68 2a 32 20 2b 20 31 20 29 3b 0a 20 20  ngth*2 + 1 );.  
1ad30 69 66 28 20 73 74 64 64 74 3d 3d 30 20 29 7b 0a  if( stddt==0 ){.
1ad40 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1ad50 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72  rr,"Out of memor
1ad60 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  y.\n");.    exit
1ad70 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  (1);.  }..  /* B
1ad80 75 69 6c 64 20 61 20 68 61 73 68 20 74 61 62 6c  uild a hash tabl
1ad90 65 20 6f 66 20 64 61 74 61 74 79 70 65 73 2e 20  e of datatypes. 
1ada0 54 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65  The ".dtnum" fie
1adb0 6c 64 20 6f 66 20 65 61 63 68 20 73 79 6d 62 6f  ld of each symbo
1adc0 6c 0a 20 20 2a 2a 20 69 73 20 66 69 6c 6c 65 64  l.  ** is filled
1add0 20 69 6e 20 77 69 74 68 20 74 68 65 20 68 61 73   in with the has
1ade0 68 20 69 6e 64 65 78 20 70 6c 75 73 20 31 2e 20  h index plus 1. 
1adf0 20 41 20 22 2e 64 74 6e 75 6d 22 20 76 61 6c 75   A ".dtnum" valu
1ae00 65 20 6f 66 20 30 20 69 73 0a 20 20 2a 2a 20 75  e of 0 is.  ** u
1ae10 73 65 64 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c  sed for terminal
1ae20 20 73 79 6d 62 6f 6c 73 2e 20 20 49 66 20 74 68   symbols.  If th
1ae30 65 72 65 20 69 73 20 6e 6f 20 25 64 65 66 61 75  ere is no %defau
1ae40 6c 74 5f 74 79 70 65 20 64 65 66 69 6e 65 64 20  lt_type defined 
1ae50 74 68 65 6e 0a 20 20 2a 2a 20 30 20 69 73 20 61  then.  ** 0 is a
1ae60 6c 73 6f 20 75 73 65 64 20 61 73 20 74 68 65 20  lso used as the 
1ae70 2e 64 74 6e 75 6d 20 76 61 6c 75 65 20 66 6f 72  .dtnum value for
1ae80 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68   nonterminals wh
1ae90 69 63 68 20 64 6f 20 6e 6f 74 20 73 70 65 63 69  ich do not speci
1aea0 66 79 0a 20 20 2a 2a 20 61 20 64 61 74 61 74 79  fy.  ** a dataty
1aeb0 70 65 20 75 73 69 6e 67 20 74 68 65 20 25 74 79  pe using the %ty
1aec0 70 65 20 64 69 72 65 63 74 69 76 65 2e 0a 20 20  pe directive..  
1aed0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1aee0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
1aef0 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
1af00 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
1af10 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
1af20 20 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 20     char *cp;.   
1af30 20 69 66 28 20 73 70 3d 3d 6c 65 6d 70 2d 3e 65   if( sp==lemp->e
1af40 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20 73  rrsym ){.      s
1af50 70 2d 3e 64 74 6e 75 6d 20 3d 20 61 72 72 61 79  p->dtnum = array
1af60 73 69 7a 65 2b 31 3b 0a 20 20 20 20 20 20 63 6f  size+1;.      co
1af70 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1af80 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 21 3d    if( sp->type!=
1af90 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 28  NONTERMINAL || (
1afa0 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20  sp->datatype==0 
1afb0 26 26 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65  && lemp->vartype
1afc0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 70  ==0) ){.      sp
1afd0 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  ->dtnum = 0;.   
1afe0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1aff0 20 7d 0a 20 20 20 20 63 70 20 3d 20 73 70 2d 3e   }.    cp = sp->
1b000 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20 69 66  datatype;.    if
1b010 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20 6c  ( cp==0 ) cp = l
1b020 65 6d 70 2d 3e 76 61 72 74 79 70 65 3b 0a 20 20  emp->vartype;.  
1b030 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 77 68 69    j = 0;.    whi
1b040 6c 65 28 20 69 73 73 70 61 63 65 28 2a 63 70 29  le( isspace(*cp)
1b050 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69   ) cp++;.    whi
1b060 6c 65 28 20 2a 63 70 20 29 20 73 74 64 64 74 5b  le( *cp ) stddt[
1b070 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a 20 20  j++] = *cp++;.  
1b080 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20    while( j>0 && 
1b090 69 73 73 70 61 63 65 28 73 74 64 64 74 5b 6a 2d  isspace(stddt[j-
1b0a0 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 73  1]) ) j--;.    s
1b0b0 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  tddt[j] = 0;.   
1b0c0 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e   if( lemp->token
1b0d0 74 79 70 65 20 26 26 20 73 74 72 63 6d 70 28 73  type && strcmp(s
1b0e0 74 64 64 74 2c 20 6c 65 6d 70 2d 3e 74 6f 6b 65  tddt, lemp->toke
1b0f0 6e 74 79 70 65 29 3d 3d 30 20 29 7b 0a 20 20 20  ntype)==0 ){.   
1b100 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30     sp->dtnum = 0
1b110 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
1b120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73 68  ;.    }.    hash
1b130 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 0;.    for(j=
1b140 30 3b 20 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b 2b  0; stddt[j]; j++
1b150 29 7b 0a 20 20 20 20 20 20 68 61 73 68 20 3d 20  ){.      hash = 
1b160 68 61 73 68 2a 35 33 20 2b 20 73 74 64 64 74 5b  hash*53 + stddt[
1b170 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61  j];.    }.    ha
1b180 73 68 20 3d 20 28 68 61 73 68 20 26 20 30 78 37  sh = (hash & 0x7
1b190 66 66 66 66 66 66 66 29 25 61 72 72 61 79 73 69  fffffff)%arraysi
1b1a0 7a 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 74  ze;.    while( t
1b1b0 79 70 65 73 5b 68 61 73 68 5d 20 29 7b 0a 20 20  ypes[hash] ){.  
1b1c0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 74      if( strcmp(t
1b1d0 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74  ypes[hash],stddt
1b1e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1b1f0 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68  sp->dtnum = hash
1b200 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72   + 1;.        br
1b210 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1b220 20 20 20 68 61 73 68 2b 2b 3b 0a 20 20 20 20 20     hash++;.     
1b230 20 69 66 28 20 68 61 73 68 3e 3d 28 75 6e 73 69   if( hash>=(unsi
1b240 67 6e 65 64 29 61 72 72 61 79 73 69 7a 65 20 29  gned)arraysize )
1b250 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 7d   hash = 0;.    }
1b260 0a 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 68  .    if( types[h
1b270 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ash]==0 ){.     
1b280 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73   sp->dtnum = has
1b290 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 74 79 70  h + 1;.      typ
1b2a0 65 73 5b 68 61 73 68 5d 20 3d 20 28 63 68 61 72  es[hash] = (char
1b2b0 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53  *)malloc( lemonS
1b2c0 74 72 6c 65 6e 28 73 74 64 64 74 29 2b 31 20 29  trlen(stddt)+1 )
1b2d0 3b 0a 20 20 20 20 20 20 69 66 28 20 74 79 70 65  ;.      if( type
1b2e0 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20  s[hash]==0 ){.  
1b2f0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
1b300 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d  derr,"Out of mem
1b310 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ory.\n");.      
1b320 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20    exit(1);.     
1b330 20 7d 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73   }.      lemon_s
1b340 74 72 63 70 79 28 74 79 70 65 73 5b 68 61 73 68  trcpy(types[hash
1b350 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20 20 7d 0a  ],stddt);.    }.
1b360 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e 74 20    }..  /* Print 
1b370 6f 75 74 20 74 68 65 20 64 65 66 69 6e 69 74 69  out the definiti
1b380 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54 59 50  on of YYTOKENTYP
1b390 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54 59 50  E and YYMINORTYP
1b3a0 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c 65  E */.  name = le
1b3b0 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d  mp->name ? lemp-
1b3c0 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b  >name : "Parse";
1b3d0 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69  .  lineno = *pli
1b3e0 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68 66 6c  neno;.  if( mhfl
1b3f0 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75  ag ){ fprintf(ou
1b400 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43 45  t,"#if INTERFACE
1b410 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n"); lineno++; 
1b420 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
1b430 22 23 64 65 66 69 6e 65 20 25 73 54 4f 4b 45 4e  "#define %sTOKEN
1b440 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d 65 2c  TYPE %s\n",name,
1b450 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  .    lemp->token
1b460 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  type?lemp->token
1b470 74 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b 20 20  type:"void*");  
1b480 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20  lineno++;.  if( 
1b490 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74  mhflag ){ fprint
1b4a0 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22  f(out,"#endif\n"
1b4b0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20  ); lineno++; }. 
1b4c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 74 79   fprintf(out,"ty
1b4d0 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e 22  pedef union {\n"
1b4e0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1b4f0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e  printf(out,"  in
1b500 74 20 79 79 69 6e 69 74 3b 5c 6e 22 29 3b 20 6c  t yyinit;\n"); l
1b510 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
1b520 74 66 28 6f 75 74 2c 22 20 20 25 73 54 4f 4b 45  tf(out,"  %sTOKE
1b530 4e 54 59 50 45 20 79 79 30 3b 5c 6e 22 2c 6e 61  NTYPE yy0;\n",na
1b540 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
1b550 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61   for(i=0; i<arra
1b560 79 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  ysize; i++){.   
1b570 20 69 66 28 20 74 79 70 65 73 5b 69 5d 3d 3d 30   if( types[i]==0
1b580 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1b590 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1b5a0 25 73 20 79 79 25 64 3b 5c 6e 22 2c 74 79 70 65  %s yy%d;\n",type
1b5b0 73 5b 69 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65 6e  s[i],i+1); linen
1b5c0 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 74 79  o++;.    free(ty
1b5d0 70 65 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69  pes[i]);.  }.  i
1b5e0 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d  f( lemp->errsym-
1b5f0 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20 66  >useCnt ){.    f
1b600 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e  printf(out,"  in
1b610 74 20 79 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70 2d  t yy%d;\n",lemp-
1b620 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b  >errsym->dtnum);
1b630 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1b640 20 66 72 65 65 28 73 74 64 64 74 29 3b 0a 20 20   free(stddt);.  
1b650 66 72 65 65 28 74 79 70 65 73 29 3b 0a 20 20 66  free(types);.  f
1b660 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 20 59 59  printf(out,"} YY
1b670 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22 29 3b 20  MINORTYPE;\n"); 
1b680 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70 6c 69  lineno++;.  *pli
1b690 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 7d  neno = lineno;.}
1b6a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1b6b0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 43 20 64  he name of a C d
1b6c0 61 74 61 74 79 70 65 20 61 62 6c 65 20 74 6f 20  atatype able to 
1b6d0 72 65 70 72 65 73 65 6e 74 20 76 61 6c 75 65 73  represent values
1b6e0 20 62 65 74 77 65 65 6e 0a 2a 2a 20 6c 77 72 20   between.** lwr 
1b6f0 61 6e 64 20 75 70 72 2c 20 69 6e 63 6c 75 73 69  and upr, inclusi
1b700 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ve..*/.static co
1b710 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d 75  nst char *minimu
1b720 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e 74 20  m_size_type(int 
1b730 6c 77 72 2c 20 69 6e 74 20 75 70 72 29 7b 0a 20  lwr, int upr){. 
1b740 20 69 66 28 20 6c 77 72 3e 3d 30 20 29 7b 0a 20   if( lwr>=0 ){. 
1b750 20 20 20 69 66 28 20 75 70 72 3c 3d 32 35 35 20     if( upr<=255 
1b760 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b770 22 75 6e 73 69 67 6e 65 64 20 63 68 61 72 22 3b  "unsigned char";
1b780 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75  .    }else if( u
1b790 70 72 3c 36 35 35 33 35 20 29 7b 0a 20 20 20 20  pr<65535 ){.    
1b7a0 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e    return "unsign
1b7b0 65 64 20 73 68 6f 72 74 20 69 6e 74 22 3b 0a 20  ed short int";. 
1b7c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b7d0 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e 65 64  return "unsigned
1b7e0 20 69 6e 74 22 3b 0a 20 20 20 20 7d 0a 20 20 7d   int";.    }.  }
1b7f0 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d 31  else if( lwr>=-1
1b800 32 37 20 26 26 20 75 70 72 3c 3d 31 32 37 20 29  27 && upr<=127 )
1b810 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 73 69  {.    return "si
1b820 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20 7d 65  gned char";.  }e
1b830 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d 33 32  lse if( lwr>=-32
1b840 37 36 37 20 26 26 20 75 70 72 3c 33 32 37 36 37  767 && upr<32767
1b850 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22   ){.    return "
1b860 73 68 6f 72 74 22 3b 0a 20 20 7d 65 6c 73 65 7b  short";.  }else{
1b870 0a 20 20 20 20 72 65 74 75 72 6e 20 22 69 6e 74  .    return "int
1b880 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ";.  }.}../*.** 
1b890 45 61 63 68 20 73 74 61 74 65 20 63 6f 6e 74 61  Each state conta
1b8a0 69 6e 73 20 61 20 73 65 74 20 6f 66 20 74 6f 6b  ins a set of tok
1b8b0 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  en transaction a
1b8c0 6e 64 20 61 20 73 65 74 20 6f 66 0a 2a 2a 20 6e  nd a set of.** n
1b8d0 6f 6e 74 65 72 6d 69 6e 61 6c 20 74 72 61 6e 73  onterminal trans
1b8e0 61 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 6f  actions.  Each o
1b8f0 66 20 74 68 65 73 65 20 73 65 74 73 20 6d 61 6b  f these sets mak
1b900 65 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a 2a  es an instance.*
1b910 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
1b920 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 41  ng structure.  A
1b930 6e 20 61 72 72 61 79 20 6f 66 20 74 68 65 73 65  n array of these
1b940 20 73 74 72 75 63 74 75 72 65 73 20 69 73 20 75   structures is u
1b950 73 65 64 0a 2a 2a 20 74 6f 20 6f 72 64 65 72 20  sed.** to order 
1b960 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  the creation of 
1b970 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 79  entries in the y
1b980 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65  y_action[] table
1b990 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 61 78 73 65  ..*/.struct axse
1b9a0 74 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  t {.  struct sta
1b9b0 74 65 20 2a 73 74 70 3b 20 20 20 2f 2a 20 41 20  te *stp;   /* A 
1b9c0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61  pointer to a sta
1b9d0 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 6b  te */.  int isTk
1b9e0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
1b9f0 54 72 75 65 20 74 6f 20 75 73 65 20 74 6f 6b 65  True to use toke
1ba00 6e 73 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6e  ns.  False for n
1ba10 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a  on-terminals */.
1ba20 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20    int nAction;  
1ba30 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1ba40 20 6f 66 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 20   of actions */. 
1ba50 20 69 6e 74 20 69 4f 72 64 65 72 3b 20 20 20 20   int iOrder;    
1ba60 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
1ba70 6c 20 6f 72 64 65 72 20 6f 66 20 61 63 74 69 6f  l order of actio
1ba80 6e 20 73 65 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  n sets */.};../*
1ba90 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 6f 20 61  .** Compare to a
1baa0 78 73 65 74 20 73 74 72 75 63 74 75 72 65 73 20  xset structures 
1bab0 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70  for sorting purp
1bac0 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oses.*/.static i
1bad0 6e 74 20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65  nt axset_compare
1bae0 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20  (const void *a, 
1baf0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a  const void *b){.
1bb00 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a    struct axset *
1bb10 70 31 20 3d 20 28 73 74 72 75 63 74 20 61 78 73  p1 = (struct axs
1bb20 65 74 2a 29 61 3b 0a 20 20 73 74 72 75 63 74 20  et*)a;.  struct 
1bb30 61 78 73 65 74 20 2a 70 32 20 3d 20 28 73 74 72  axset *p2 = (str
1bb40 75 63 74 20 61 78 73 65 74 2a 29 62 3b 0a 20 20  uct axset*)b;.  
1bb50 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 70 32 2d  int c;.  c = p2-
1bb60 3e 6e 41 63 74 69 6f 6e 20 2d 20 70 31 2d 3e 6e  >nAction - p1->n
1bb70 41 63 74 69 6f 6e 3b 0a 20 20 69 66 28 20 63 3d  Action;.  if( c=
1bb80 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 70 32  =0 ){.    c = p2
1bb90 2d 3e 69 4f 72 64 65 72 20 2d 20 70 31 2d 3e 69  ->iOrder - p1->i
1bba0 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 61 73 73  Order;.  }.  ass
1bbb0 65 72 74 28 20 63 21 3d 30 20 7c 7c 20 70 31 3d  ert( c!=0 || p1=
1bbc0 3d 70 32 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  =p2 );.  return 
1bbd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
1bbe0 65 20 74 65 78 74 20 6f 6e 20 22 6f 75 74 22 20  e text on "out" 
1bbf0 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
1bc00 68 65 20 72 75 6c 65 20 22 72 70 22 2e 0a 2a 2f  he rule "rp"..*/
1bc10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 72 69  .static void wri
1bc20 74 65 52 75 6c 65 54 65 78 74 28 46 49 4c 45 20  teRuleText(FILE 
1bc30 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 72 75 6c  *out, struct rul
1bc40 65 20 2a 72 70 29 7b 0a 20 20 69 6e 74 20 6a 3b  e *rp){.  int j;
1bc50 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1bc60 25 73 20 3a 3a 3d 22 2c 20 72 70 2d 3e 6c 68 73  %s ::=", rp->lhs
1bc70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 6a  ->name);.  for(j
1bc80 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; j<rp->nrhs; 
1bc90 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  j++){.    struct
1bca0 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70   symbol *sp = rp
1bcb0 2d 3e 72 68 73 5b 6a 5d 3b 0a 20 20 20 20 69 66  ->rhs[j];.    if
1bcc0 28 20 73 70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54  ( sp->type!=MULT
1bcd0 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
1bce0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1bcf0 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b   %s", sp->name);
1bd00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bd10 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 66    int k;.      f
1bd20 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22  printf(out," %s"
1bd30 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d  , sp->subsym[0]-
1bd40 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f  >name);.      fo
1bd50 72 28 6b 3d 31 3b 20 6b 3c 73 70 2d 3e 6e 73 75  r(k=1; k<sp->nsu
1bd60 62 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  bsym; k++){.    
1bd70 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1bd80 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62 73 79 6d  "|%s",sp->subsym
1bd90 5b 6b 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [k]->name);.    
1bda0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
1bdb0 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 43 20  ../* Generate C 
1bdc0 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20  source code for 
1bdd0 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f  the parser */.vo
1bde0 69 64 20 52 65 70 6f 72 74 54 61 62 6c 65 28 0a  id ReportTable(.
1bdf0 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a    struct lemon *
1be00 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 6d 68 66 6c  lemp,.  int mhfl
1be10 61 67 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  ag     /* Output
1be20 20 69 6e 20 6d 61 6b 65 68 65 61 64 65 72 73 20   in makeheaders 
1be30 66 6f 72 6d 61 74 20 69 66 20 74 72 75 65 20 2a  format if true *
1be40 2f 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74  /.){.  FILE *out
1be50 2c 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 6c 69  , *in;.  char li
1be60 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20  ne[LINESIZE];.  
1be70 69 6e 74 20 20 6c 69 6e 65 6e 6f 3b 0a 20 20 73  int  lineno;.  s
1be80 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
1be90 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
1bea0 6e 20 2a 61 70 3b 0a 20 20 73 74 72 75 63 74 20  n *ap;.  struct 
1beb0 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72 75  rule *rp;.  stru
1bec0 63 74 20 61 63 74 74 61 62 20 2a 70 41 63 74 74  ct acttab *pActt
1bed0 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  ab;.  int i, j, 
1bee0 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n;.  const char 
1bef0 2a 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e 54  *name;.  int mnT
1bf00 6b 6e 4f 66 73 74 2c 20 6d 78 54 6b 6e 4f 66 73  knOfst, mxTknOfs
1bf10 74 3b 0a 20 20 69 6e 74 20 6d 6e 4e 74 4f 66 73  t;.  int mnNtOfs
1bf20 74 2c 20 6d 78 4e 74 4f 66 73 74 3b 0a 20 20 73  t, mxNtOfst;.  s
1bf30 74 72 75 63 74 20 61 78 73 65 74 20 2a 61 78 3b  truct axset *ax;
1bf40 0a 0a 20 20 69 6e 20 3d 20 74 70 6c 74 5f 6f 70  ..  in = tplt_op
1bf50 65 6e 28 6c 65 6d 70 29 3b 0a 20 20 69 66 28 20  en(lemp);.  if( 
1bf60 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  in==0 ) return;.
1bf70 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65    out = file_ope
1bf80 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c 22 77 62 22  n(lemp,".c","wb"
1bf90 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20  );.  if( out==0 
1bfa0 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e  ){.    fclose(in
1bfb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1bfc0 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b   }.  lineno = 1;
1bfd0 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1bfe0 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1bff0 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1c000 65 6e 65 72 61 74 65 20 74 68 65 20 69 6e 63 6c  enerate the incl
1c010 75 64 65 20 63 6f 64 65 2c 20 69 66 20 61 6e 79  ude code, if any
1c020 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
1c030 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
1c040 69 6e 63 6c 75 64 65 2c 26 6c 69 6e 65 6e 6f 29  include,&lineno)
1c050 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29  ;.  if( mhflag )
1c060 7b 0a 20 20 20 20 63 68 61 72 20 2a 6e 61 6d 65  {.    char *name
1c070 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65   = file_makename
1c080 28 6c 65 6d 70 2c 20 22 2e 68 22 29 3b 0a 20 20  (lemp, ".h");.  
1c090 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1c0a0 69 6e 63 6c 75 64 65 20 5c 22 25 73 5c 22 5c 6e  include \"%s\"\n
1c0b0 22 2c 20 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  ", name); lineno
1c0c0 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 6e 61 6d  ++;.    free(nam
1c0d0 65 29 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  e);.  }.  tplt_x
1c0e0 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1c0f0 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1c100 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 23  .  /* Generate #
1c110 64 65 66 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20  defines for all 
1c120 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 66 28 20  tokens */.  if( 
1c130 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63 6f  mhflag ){.    co
1c140 6e 73 74 20 63 68 61 72 20 2a 70 72 65 66 69 78  nst char *prefix
1c150 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1c160 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43 45  t,"#if INTERFACE
1c170 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1c180 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f      if( lemp->to
1c190 6b 65 6e 70 72 65 66 69 78 20 29 20 70 72 65 66  kenprefix ) pref
1c1a0 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  ix = lemp->token
1c1b0 70 72 65 66 69 78 3b 0a 20 20 20 20 65 6c 73 65  prefix;.    else
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1d0 20 20 20 20 70 72 65 66 69 78 20 3d 20 22 22 3b      prefix = "";
1c1e0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
1c1f0 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b  lemp->nterminal;
1c200 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70 72   i++){.      fpr
1c210 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1c220 65 20 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22  e %s%-30s %2d\n"
1c230 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79  ,prefix,lemp->sy
1c240 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69  mbols[i]->name,i
1c250 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b  );.      lineno+
1c260 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  +;.    }.    fpr
1c270 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66  intf(out,"#endif
1c280 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1c290 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
1c2a0 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1c2b0 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1c2c0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 64  * Generate the d
1c2d0 65 66 69 6e 65 73 20 2a 2f 0a 20 20 66 70 72 69  efines */.  fpri
1c2e0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1c2f0 20 59 59 43 4f 44 45 54 59 50 45 20 25 73 5c 6e   YYCODETYPE %s\n
1c300 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73  ",.    minimum_s
1c310 69 7a 65 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70  ize_type(0, lemp
1c320 2d 3e 6e 73 79 6d 62 6f 6c 2b 31 29 29 3b 20 6c  ->nsymbol+1)); l
1c330 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
1c340 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1c350 59 59 4e 4f 43 4f 44 45 20 25 64 5c 6e 22 2c 6c  YYNOCODE %d\n",l
1c360 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 31 29 3b  emp->nsymbol+1);
1c370 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70    lineno++;.  fp
1c380 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1c390 6e 65 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20  ne YYACTIONTYPE 
1c3a0 25 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d  %s\n",.    minim
1c3b0 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 30 2c 20  um_size_type(0, 
1c3c0 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 6c 65 6d  lemp->nstate+lem
1c3d0 70 2d 3e 6e 72 75 6c 65 2b 35 29 29 3b 20 20 6c  p->nrule+5));  l
1c3e0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c  ineno++;.  if( l
1c3f0 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 20 29 7b  emp->wildcard ){
1c400 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1c410 2c 22 23 64 65 66 69 6e 65 20 59 59 57 49 4c 44  ,"#define YYWILD
1c420 43 41 52 44 20 25 64 5c 6e 22 2c 0a 20 20 20 20  CARD %d\n",.    
1c430 20 20 20 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72     lemp->wildcar
1c440 64 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e  d->index); linen
1c450 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74  o++;.  }.  print
1c460 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74  _stack_union(out
1c470 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 2c 6d 68  ,lemp,&lineno,mh
1c480 66 6c 61 67 29 3b 0a 20 20 66 70 72 69 6e 74 66  flag);.  fprintf
1c490 28 6f 75 74 2c 20 22 23 69 66 6e 64 65 66 20 59  (out, "#ifndef Y
1c4a0 59 53 54 41 43 4b 44 45 50 54 48 5c 6e 22 29 3b  YSTACKDEPTH\n");
1c4b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28   lineno++;.  if(
1c4c0 20 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65   lemp->stacksize
1c4d0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1c4e0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 53  out,"#define YYS
1c4f0 54 41 43 4b 44 45 50 54 48 20 25 73 5c 6e 22 2c  TACKDEPTH %s\n",
1c500 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29  lemp->stacksize)
1c510 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ;  lineno++;.  }
1c520 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74  else{.    fprint
1c530 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1c540 59 53 54 41 43 4b 44 45 50 54 48 20 31 30 30 5c  YSTACKDEPTH 100\
1c550 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  n");  lineno++;.
1c560 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
1c570 74 2c 20 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20  t, "#endif\n"); 
1c580 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20  lineno++;.  if( 
1c590 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 66 70  mhflag ){.    fp
1c5a0 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49  rintf(out,"#if I
1c5b0 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69  NTERFACE\n"); li
1c5c0 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 61  neno++;.  }.  na
1c5d0 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20  me = lemp->name 
1c5e0 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22  ? lemp->name : "
1c5f0 50 61 72 73 65 22 3b 0a 20 20 69 66 28 20 6c 65  Parse";.  if( le
1c600 6d 70 2d 3e 61 72 67 20 26 26 20 6c 65 6d 70 2d  mp->arg && lemp-
1c610 3e 61 72 67 5b 30 5d 20 29 7b 0a 20 20 20 20 69  >arg[0] ){.    i
1c620 6e 74 20 69 3b 0a 20 20 20 20 69 20 3d 20 6c 65  nt i;.    i = le
1c630 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e  monStrlen(lemp->
1c640 61 72 67 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  arg);.    while(
1c650 20 69 3e 3d 31 20 26 26 20 69 73 73 70 61 63 65   i>=1 && isspace
1c660 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29  (lemp->arg[i-1])
1c670 20 29 20 69 2d 2d 3b 0a 20 20 20 20 77 68 69 6c   ) i--;.    whil
1c680 65 28 20 69 3e 3d 31 20 26 26 20 28 69 73 61 6c  e( i>=1 && (isal
1c690 6e 75 6d 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d  num(lemp->arg[i-
1c6a0 31 5d 29 20 7c 7c 20 6c 65 6d 70 2d 3e 61 72 67  1]) || lemp->arg
1c6b0 5b 69 2d 31 5d 3d 3d 27 5f 27 29 20 29 20 69 2d  [i-1]=='_') ) i-
1c6c0 2d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  -;.    fprintf(o
1c6d0 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
1c6e0 47 5f 53 44 45 43 4c 20 25 73 3b 5c 6e 22 2c 6e  G_SDECL %s;\n",n
1c6f0 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20  ame,lemp->arg); 
1c700 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
1c710 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1c720 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43 4c 20  ine %sARG_PDECL 
1c730 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70  ,%s\n",name,lemp
1c740 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ->arg);  lineno+
1c750 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
1c760 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
1c770 47 5f 46 45 54 43 48 20 25 73 20 3d 20 79 79 70  G_FETCH %s = yyp
1c780 50 61 72 73 65 72 2d 3e 25 73 5c 6e 22 2c 0a 20  Parser->%s\n",. 
1c790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7a0 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 2c 26  name,lemp->arg,&
1c7b0 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20  lemp->arg[i]);  
1c7c0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70  lineno++;.    fp
1c7d0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1c7e0 6e 65 20 25 73 41 52 47 5f 53 54 4f 52 45 20 79  ne %sARG_STORE y
1c7f0 79 70 50 61 72 73 65 72 2d 3e 25 73 20 3d 20 25  ypParser->%s = %
1c800 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1c810 20 20 20 20 20 20 20 6e 61 6d 65 2c 26 6c 65 6d         name,&lem
1c820 70 2d 3e 61 72 67 5b 69 5d 2c 26 6c 65 6d 70 2d  p->arg[i],&lemp-
1c830 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e  >arg[i]);  linen
1c840 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  o++;.  }else{.  
1c850 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1c860 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45  define %sARG_SDE
1c870 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69  CL\n",name);  li
1c880 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1c890 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1c8a0 20 25 73 41 52 47 5f 50 44 45 43 4c 5c 6e 22 2c   %sARG_PDECL\n",
1c8b0 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  name);  lineno++
1c8c0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1c8d0 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
1c8e0 5f 46 45 54 43 48 5c 6e 22 2c 6e 61 6d 65 29 3b  _FETCH\n",name);
1c8f0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
1c900 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1c910 69 6e 65 20 25 73 41 52 47 5f 53 54 4f 52 45 5c  ine %sARG_STORE\
1c920 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  n",name); lineno
1c930 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 68  ++;.  }.  if( mh
1c940 66 6c 61 67 20 29 7b 0a 20 20 20 20 66 70 72 69  flag ){.    fpri
1c950 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c  ntf(out,"#endif\
1c960 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1c970 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
1c980 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 53 54 41  ,"#define YYNSTA
1c990 54 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e  TE %d\n",lemp->n
1c9a0 73 74 61 74 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  state);  lineno+
1c9b0 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
1c9c0 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 52 55 4c  ,"#define YYNRUL
1c9d0 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 72  E %d\n",lemp->nr
1c9e0 75 6c 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  ule);  lineno++;
1c9f0 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72  .  if( lemp->err
1ca00 73 79 6d 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20  sym->useCnt ){. 
1ca10 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1ca20 23 64 65 66 69 6e 65 20 59 59 45 52 52 4f 52 53  #define YYERRORS
1ca30 59 4d 42 4f 4c 20 25 64 5c 6e 22 2c 6c 65 6d 70  YMBOL %d\n",lemp
1ca40 2d 3e 65 72 72 73 79 6d 2d 3e 69 6e 64 65 78 29  ->errsym->index)
1ca50 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1ca60 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1ca70 65 66 69 6e 65 20 59 59 45 52 52 53 59 4d 44 54  efine YYERRSYMDT
1ca80 20 79 79 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65   yy%d\n",lemp->e
1ca90 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 20  rrsym->dtnum);  
1caa0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1cab0 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61  if( lemp->has_fa
1cac0 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 70  llback ){.    fp
1cad0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1cae0 6e 65 20 59 59 46 41 4c 4c 42 41 43 4b 20 31 5c  ne YYFALLBACK 1\
1caf0 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  n");  lineno++;.
1cb00 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
1cb10 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1cb20 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1cb30 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 61  * Generate the a
1cb40 63 74 69 6f 6e 20 74 61 62 6c 65 20 61 6e 64 20  ction table and 
1cb50 69 74 73 20 61 73 73 6f 63 69 61 74 65 73 3a 0a  its associates:.
1cb60 20 20 2a 2a 0a 20 20 2a 2a 20 20 79 79 5f 61 63    **.  **  yy_ac
1cb70 74 69 6f 6e 5b 5d 20 20 20 20 20 20 20 20 41 20  tion[]        A 
1cb80 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 63 6f 6e  single table con
1cb90 74 61 69 6e 69 6e 67 20 61 6c 6c 20 61 63 74 69  taining all acti
1cba0 6f 6e 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 6c 6f  ons..  **  yy_lo
1cbb0 6f 6b 61 68 65 61 64 5b 5d 20 20 20 20 20 41 20  okahead[]     A 
1cbc0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1cbd0 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 66   the lookahead f
1cbe0 6f 72 20 65 61 63 68 20 65 6e 74 72 79 20 69 6e  or each entry in
1cbf0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
1cc00 20 20 20 20 20 20 20 20 20 20 79 79 5f 61 63 74            yy_act
1cc10 69 6f 6e 2e 20 20 55 73 65 64 20 74 6f 20 64 65  ion.  Used to de
1cc20 74 65 63 74 20 68 61 73 68 20 63 6f 6c 6c 69 73  tect hash collis
1cc30 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 73  ions..  **  yy_s
1cc40 68 69 66 74 5f 6f 66 73 74 5b 5d 20 20 20 20 46  hift_ofst[]    F
1cc50 6f 72 20 65 61 63 68 20 73 74 61 74 65 2c 20 74  or each state, t
1cc60 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 79  he offset into y
1cc70 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a  y_action for.  *
1cc80 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1cc90 20 20 20 20 20 20 73 68 69 66 74 69 6e 67 20 74        shifting t
1cca0 65 72 6d 69 6e 61 6c 73 2e 0a 20 20 2a 2a 20 20  erminals..  **  
1ccb0 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d  yy_reduce_ofst[]
1ccc0 20 20 20 46 6f 72 20 65 61 63 68 20 73 74 61 74     For each stat
1ccd0 65 2c 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  e, the offset in
1cce0 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72  to yy_action for
1ccf0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
1cd00 20 20 20 20 20 20 20 20 20 20 73 68 69 66 74 69            shifti
1cd10 6e 67 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73  ng non-terminals
1cd20 20 61 66 74 65 72 20 61 20 72 65 64 75 63 65 2e   after a reduce.
1cd30 0a 20 20 2a 2a 20 20 79 79 5f 64 65 66 61 75 6c  .  **  yy_defaul
1cd40 74 5b 5d 20 20 20 20 20 20 20 44 65 66 61 75 6c  t[]       Defaul
1cd50 74 20 61 63 74 69 6f 6e 20 66 6f 72 20 65 61 63  t action for eac
1cd60 68 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 0a 20  h state..  */.. 
1cd70 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
1cd80 61 63 74 69 6f 6e 73 20 6f 6e 20 61 6c 6c 20 73  actions on all s
1cd90 74 61 74 65 73 20 61 6e 64 20 63 6f 75 6e 74 20  tates and count 
1cda0 74 68 65 6d 20 75 70 20 2a 2f 0a 20 20 61 78 20  them up */.  ax 
1cdb0 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74 20  = (struct axset 
1cdc0 2a 29 20 63 61 6c 6c 6f 63 28 6c 65 6d 70 2d 3e  *) calloc(lemp->
1cdd0 6e 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66  nstate*2, sizeof
1cde0 28 61 78 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  (ax[0]));.  if( 
1cdf0 61 78 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  ax==0 ){.    fpr
1ce00 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c  intf(stderr,"mal
1ce10 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a  loc failed\n");.
1ce20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
1ce30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
1ce40 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
1ce50 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  {.    stp = lemp
1ce60 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
1ce70 20 61 78 5b 69 2a 32 5d 2e 73 74 70 20 3d 20 73   ax[i*2].stp = s
1ce80 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e  tp;.    ax[i*2].
1ce90 69 73 54 6b 6e 20 3d 20 31 3b 0a 20 20 20 20 61  isTkn = 1;.    a
1cea0 78 5b 69 2a 32 5d 2e 6e 41 63 74 69 6f 6e 20 3d  x[i*2].nAction =
1ceb0 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20   stp->nTknAct;. 
1cec0 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 73 74 70     ax[i*2+1].stp
1ced0 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78 5b 69   = stp;.    ax[i
1cee0 2a 32 2b 31 5d 2e 69 73 54 6b 6e 20 3d 20 30 3b  *2+1].isTkn = 0;
1cef0 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 6e  .    ax[i*2+1].n
1cf00 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 4e  Action = stp->nN
1cf10 74 41 63 74 3b 0a 20 20 7d 0a 20 20 6d 78 54 6b  tAct;.  }.  mxTk
1cf20 6e 4f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73  nOfst = mnTknOfs
1cf30 74 20 3d 20 30 3b 0a 20 20 6d 78 4e 74 4f 66 73  t = 0;.  mxNtOfs
1cf40 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 30  t = mnNtOfst = 0
1cf50 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
1cf60 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
1cf70 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 74  .  In order to t
1cf80 72 79 20 74 6f 20 6b 65 65 70 20 74 68 65 20 73  ry to keep the s
1cf90 69 7a 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ize of the.  ** 
1cfa0 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 74 6f 20  action table to 
1cfb0 61 20 6d 69 6e 69 6d 75 6d 2c 20 74 68 65 20 68  a minimum, the h
1cfc0 65 75 72 69 73 74 69 63 20 6f 66 20 70 6c 61 63  euristic of plac
1cfd0 69 6e 67 20 74 68 65 20 6c 61 72 67 65 73 74 20  ing the largest 
1cfe0 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 73 65 74 73  action.  ** sets
1cff0 20 66 69 72 73 74 20 69 73 20 75 73 65 64 2e 0a   first is used..
1d000 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
1d010 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32  i<lemp->nstate*2
1d020 3b 20 69 2b 2b 29 20 61 78 5b 69 5d 2e 69 4f 72  ; i++) ax[i].iOr
1d030 64 65 72 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74  der = i;.  qsort
1d040 28 61 78 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  (ax, lemp->nstat
1d050 65 2a 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30  e*2, sizeof(ax[0
1d060 5d 29 2c 20 61 78 73 65 74 5f 63 6f 6d 70 61 72  ]), axset_compar
1d070 65 29 3b 0a 20 20 70 41 63 74 74 61 62 20 3d 20  e);.  pActtab = 
1d080 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28 29 3b 0a  acttab_alloc();.
1d090 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1d0a0 70 2d 3e 6e 73 74 61 74 65 2a 32 20 26 26 20 61  p->nstate*2 && a
1d0b0 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e 3e 30 3b 20  x[i].nAction>0; 
1d0c0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
1d0d0 61 78 5b 69 5d 2e 73 74 70 3b 0a 20 20 20 20 69  ax[i].stp;.    i
1d0e0 66 28 20 61 78 5b 69 5d 2e 69 73 54 6b 6e 20 29  f( ax[i].isTkn )
1d0f0 7b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73  {.      for(ap=s
1d100 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  tp->ap; ap; ap=a
1d110 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
1d120 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20    int action;.  
1d130 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70        if( ap->sp
1d140 2d 3e 69 6e 64 65 78 3e 3d 6c 65 6d 70 2d 3e 6e  ->index>=lemp->n
1d150 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69  terminal ) conti
1d160 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74  nue;.        act
1d170 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63  ion = compute_ac
1d180 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a  tion(lemp, ap);.
1d190 20 20 20 20 20 20 20 20 69 66 28 20 61 63 74 69          if( acti
1d1a0 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  on<0 ) continue;
1d1b0 0a 20 20 20 20 20 20 20 20 61 63 74 74 61 62 5f  .        acttab_
1d1c0 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20  action(pActtab, 
1d1d0 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61  ap->sp->index, a
1d1e0 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  ction);.      }.
1d1f0 20 20 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f        stp->iTknO
1d200 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69 6e 73  fst = acttab_ins
1d210 65 72 74 28 70 41 63 74 74 61 62 29 3b 0a 20 20  ert(pActtab);.  
1d220 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 54 6b      if( stp->iTk
1d230 6e 4f 66 73 74 3c 6d 6e 54 6b 6e 4f 66 73 74 20  nOfst<mnTknOfst 
1d240 29 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 73 74  ) mnTknOfst = st
1d250 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20  p->iTknOfst;.   
1d260 20 20 20 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e     if( stp->iTkn
1d270 4f 66 73 74 3e 6d 78 54 6b 6e 4f 66 73 74 20 29  Ofst>mxTknOfst )
1d280 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70   mxTknOfst = stp
1d290 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20  ->iTknOfst;.    
1d2a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72  }else{.      for
1d2b0 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
1d2c0 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
1d2d0 20 20 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f         int actio
1d2e0 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  n;.        if( a
1d2f0 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d  p->sp->index<lem
1d300 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63  p->nterminal ) c
1d310 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1d320 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64   if( ap->sp->ind
1d330 65 78 3d 3d 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ex==lemp->nsymbo
1d340 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
1d350 20 20 20 20 20 20 61 63 74 69 6f 6e 20 3d 20 63        action = c
1d360 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65  ompute_action(le
1d370 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20  mp, ap);.       
1d380 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20   if( action<0 ) 
1d390 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1d3a0 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28    acttab_action(
1d3b0 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d  pActtab, ap->sp-
1d3c0 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b  >index, action);
1d3d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1d3e0 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 61 63  tp->iNtOfst = ac
1d3f0 74 74 61 62 5f 69 6e 73 65 72 74 28 70 41 63 74  ttab_insert(pAct
1d400 74 61 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tab);.      if( 
1d410 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3c 6d 6e 4e  stp->iNtOfst<mnN
1d420 74 4f 66 73 74 20 29 20 6d 6e 4e 74 4f 66 73 74  tOfst ) mnNtOfst
1d430 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b   = stp->iNtOfst;
1d440 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e  .      if( stp->
1d450 69 4e 74 4f 66 73 74 3e 6d 78 4e 74 4f 66 73 74  iNtOfst>mxNtOfst
1d460 20 29 20 6d 78 4e 74 4f 66 73 74 20 3d 20 73 74   ) mxNtOfst = st
1d470 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20  p->iNtOfst;.    
1d480 7d 0a 20 20 7d 0a 20 20 66 72 65 65 28 61 78 29  }.  }.  free(ax)
1d490 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
1d4a0 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62  he yy_action tab
1d4b0 6c 65 20 2a 2f 0a 20 20 6e 20 3d 20 61 63 74 74  le */.  n = actt
1d4c0 61 62 5f 73 69 7a 65 28 70 41 63 74 74 61 62 29  ab_size(pActtab)
1d4d0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1d4e0 22 23 64 65 66 69 6e 65 20 59 59 5f 41 43 54 54  "#define YY_ACTT
1d4f0 41 42 5f 43 4f 55 4e 54 20 28 25 64 29 5c 6e 22  AB_COUNT (%d)\n"
1d500 2c 20 6e 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  , n); lineno++;.
1d510 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 73    fprintf(out,"s
1d520 74 61 74 69 63 20 63 6f 6e 73 74 20 59 59 41 43  tatic const YYAC
1d530 54 49 4f 4e 54 59 50 45 20 79 79 5f 61 63 74 69  TIONTYPE yy_acti
1d540 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69  on[] = {\n"); li
1d550 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d  neno++;.  for(i=
1d560 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
1d570 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 20 3d      int action =
1d580 20 61 63 74 74 61 62 5f 79 79 61 63 74 69 6f 6e   acttab_yyaction
1d590 28 70 41 63 74 74 61 62 2c 20 69 29 3b 0a 20 20  (pActtab, i);.  
1d5a0 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29    if( action<0 )
1d5b0 20 61 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e   action = lemp->
1d5c0 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e  nstate + lemp->n
1d5d0 72 75 6c 65 20 2b 20 32 3b 0a 20 20 20 20 69 66  rule + 2;.    if
1d5e0 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66  ( j==0 ) fprintf
1d5f0 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f  (out," /* %5d */
1d600 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69   ", i);.    fpri
1d610 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22  ntf(out, " %4d,"
1d620 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 69  , action);.    i
1d630 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d  f( j==9 || i==n-
1d640 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  1 ){.      fprin
1d650 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c  tf(out, "\n"); l
1d660 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a  ineno++;.      j
1d670 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1d680 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
1d690 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  }.  }.  fprintf(
1d6a0 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69  out, "};\n"); li
1d6b0 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75  neno++;..  /* Ou
1d6c0 74 70 75 74 20 74 68 65 20 79 79 5f 6c 6f 6f 6b  tput the yy_look
1d6d0 61 68 65 61 64 20 74 61 62 6c 65 20 2a 2f 0a 20  ahead table */. 
1d6e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 73 74   fprintf(out,"st
1d6f0 61 74 69 63 20 63 6f 6e 73 74 20 59 59 43 4f 44  atic const YYCOD
1d700 45 54 59 50 45 20 79 79 5f 6c 6f 6f 6b 61 68 65  ETYPE yy_lookahe
1d710 61 64 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69  ad[] = {\n"); li
1d720 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d  neno++;.  for(i=
1d730 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
1d740 20 20 20 20 69 6e 74 20 6c 61 20 3d 20 61 63 74      int la = act
1d750 74 61 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28  tab_yylookahead(
1d760 70 41 63 74 74 61 62 2c 20 69 29 3b 0a 20 20 20  pActtab, i);.   
1d770 20 69 66 28 20 6c 61 3c 30 20 29 20 6c 61 20 3d   if( la<0 ) la =
1d780 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a   lemp->nsymbol;.
1d790 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
1d7a0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
1d7b0 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
1d7c0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1d7d0 20 25 34 64 2c 22 2c 20 6c 61 29 3b 0a 20 20 20   %4d,", la);.   
1d7e0 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
1d7f0 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
1d800 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
1d810 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
1d820 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
1d830 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
1d840 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
1d850 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
1d860 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20  lineno++;..  /* 
1d870 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 73 68  Output the yy_sh
1d880 69 66 74 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65  ift_ofst[] table
1d890 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
1d8a0 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53  t, "#define YY_S
1d8b0 48 49 46 54 5f 55 53 45 5f 44 46 4c 54 20 28 25  HIFT_USE_DFLT (%
1d8c0 64 29 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74  d)\n", mnTknOfst
1d8d0 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  -1); lineno++;. 
1d8e0 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74   n = lemp->nstat
1d8f0 65 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  e;.  while( n>0 
1d900 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  && lemp->sorted[
1d910 6e 2d 31 5d 2d 3e 69 54 6b 6e 4f 66 73 74 3d 3d  n-1]->iTknOfst==
1d920 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b  NO_OFFSET ) n--;
1d930 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1d940 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46  "#define YY_SHIF
1d950 54 5f 43 4f 55 4e 54 20 28 25 64 29 5c 6e 22 2c  T_COUNT (%d)\n",
1d960 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b   n-1); lineno++;
1d970 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1d980 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46  "#define YY_SHIF
1d990 54 5f 4d 49 4e 20 20 20 28 25 64 29 5c 6e 22 2c  T_MIN   (%d)\n",
1d9a0 20 6d 6e 54 6b 6e 4f 66 73 74 29 3b 20 6c 69 6e   mnTknOfst); lin
1d9b0 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1d9c0 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
1d9d0 59 5f 53 48 49 46 54 5f 4d 41 58 20 20 20 28 25  Y_SHIFT_MAX   (%
1d9e0 64 29 5c 6e 22 2c 20 6d 78 54 6b 6e 4f 66 73 74  d)\n", mxTknOfst
1d9f0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1da00 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61  printf(out, "sta
1da10 74 69 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f  tic const %s yy_
1da20 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 3d 20 7b  shift_ofst[] = {
1da30 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
1da40 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
1da50 65 28 6d 6e 54 6b 6e 4f 66 73 74 2d 31 2c 20 6d  e(mnTknOfst-1, m
1da60 78 54 6b 6e 4f 66 73 74 29 29 3b 20 6c 69 6e 65  xTknOfst)); line
1da70 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  no++;.  for(i=j=
1da80 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
1da90 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20    int ofst;.    
1daa0 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
1dab0 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20  ed[i];.    ofst 
1dac0 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b  = stp->iTknOfst;
1dad0 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e  .    if( ofst==N
1dae0 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20  O_OFFSET ) ofst 
1daf0 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 2d 20 31 3b  = mnTknOfst - 1;
1db00 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20  .    if( j==0 ) 
1db10 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
1db20 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20   %5d */ ", i);. 
1db30 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1db40 22 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a  " %4d,", ofst);.
1db50 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
1db60 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
1db70 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
1db80 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1db90 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
1dba0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
1dbb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
1dbc0 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
1dbd0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
1dbe0 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79  /* Output the yy
1dbf0 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 74  _reduce_ofst[] t
1dc00 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74  able */.  fprint
1dc10 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
1dc20 59 59 5f 52 45 44 55 43 45 5f 55 53 45 5f 44 46  YY_REDUCE_USE_DF
1dc30 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74  LT (%d)\n", mnNt
1dc40 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b  Ofst-1); lineno+
1dc50 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e  +;.  n = lemp->n
1dc60 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20  state;.  while( 
1dc70 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72  n>0 && lemp->sor
1dc80 74 65 64 5b 6e 2d 31 5d 2d 3e 69 4e 74 4f 66 73  ted[n-1]->iNtOfs
1dc90 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6e  t==NO_OFFSET ) n
1dca0 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  --;.  fprintf(ou
1dcb0 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52  t, "#define YY_R
1dcc0 45 44 55 43 45 5f 43 4f 55 4e 54 20 28 25 64 29  EDUCE_COUNT (%d)
1dcd0 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e  \n", n-1); linen
1dce0 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1dcf0 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f  ut, "#define YY_
1dd00 52 45 44 55 43 45 5f 4d 49 4e 20 20 20 28 25 64  REDUCE_MIN   (%d
1dd10 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73 74 29 3b  )\n", mnNtOfst);
1dd20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1dd30 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
1dd40 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 4d 41 58  ne YY_REDUCE_MAX
1dd50 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 78 4e 74     (%d)\n", mxNt
1dd60 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  Ofst); lineno++;
1dd70 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1dd80 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25 73  "static const %s
1dd90 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b   yy_reduce_ofst[
1dda0 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20 20  ] = {\n", .     
1ddb0 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a       minimum_siz
1ddc0 65 5f 74 79 70 65 28 6d 6e 4e 74 4f 66 73 74 2d  e_type(mnNtOfst-
1ddd0 31 2c 20 6d 78 4e 74 4f 66 73 74 29 29 3b 20 6c  1, mxNtOfst)); l
1dde0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69  ineno++;.  for(i
1ddf0 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
1de00 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20  .    int ofst;. 
1de10 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
1de20 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66  orted[i];.    of
1de30 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73  st = stp->iNtOfs
1de40 74 3b 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d  t;.    if( ofst=
1de50 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66 73  =NO_OFFSET ) ofs
1de60 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 2d 20 31  t = mnNtOfst - 1
1de70 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29  ;.    if( j==0 )
1de80 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f   fprintf(out," /
1de90 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a  * %5d */ ", i);.
1dea0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1deb0 20 22 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b   " %4d,", ofst);
1dec0 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
1ded0 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
1dee0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
1def0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1df00 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
1df10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
1df20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
1df30 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
1df40 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
1df50 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 64   /* Output the d
1df60 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 74 61  efault action ta
1df70 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  ble */.  fprintf
1df80 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f  (out, "static co
1df90 6e 73 74 20 59 59 41 43 54 49 4f 4e 54 59 50 45  nst YYACTIONTYPE
1dfa0 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 3d 20   yy_default[] = 
1dfb0 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  {\n"); lineno++;
1dfc0 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74  .  n = lemp->nst
1dfd0 61 74 65 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  ate;.  for(i=j=0
1dfe0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1dff0 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
1e000 74 65 64 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ted[i];.    if( 
1e010 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f  j==0 ) fprintf(o
1e020 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22  ut," /* %5d */ "
1e030 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , i);.    fprint
1e040 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20  f(out, " %4d,", 
1e050 73 74 70 2d 3e 69 44 66 6c 74 29 3b 0a 20 20 20  stp->iDflt);.   
1e060 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
1e070 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
1e080 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
1e090 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
1e0a0 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
1e0b0 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
1e0c0 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
1e0d0 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
1e0e0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74  lineno++;.  tplt
1e0f0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1e100 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1e110 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1e120 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 66 61   the table of fa
1e130 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 73 2e 0a 20  llback tokens.. 
1e140 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
1e150 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a  has_fallback ){.
1e160 20 20 20 20 69 6e 74 20 6d 78 20 3d 20 6c 65 6d      int mx = lem
1e170 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 2d 20 31  p->nterminal - 1
1e180 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6d 78 3e  ;.    while( mx>
1e190 30 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  0 && lemp->symbo
1e1a0 6c 73 5b 6d 78 5d 2d 3e 66 61 6c 6c 62 61 63 6b  ls[mx]->fallback
1e1b0 3d 3d 30 20 29 7b 20 6d 78 2d 2d 3b 20 7d 0a 20  ==0 ){ mx--; }. 
1e1c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6d     for(i=0; i<=m
1e1d0 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  x; i++){.      s
1e1e0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 70 20  truct symbol *p 
1e1f0 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
1e200 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  i];.      if( p-
1e210 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a  >fallback==0 ){.
1e220 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1e230 6f 75 74 2c 20 22 20 20 20 20 30 2c 20 20 2f 2a  out, "    0,  /*
1e240 20 25 31 30 73 20 3d 3e 20 6e 6f 74 68 69 6e 67   %10s => nothing
1e250 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 6e 61 6d 65 29   */\n", p->name)
1e260 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e270 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1e280 75 74 2c 20 22 20 20 25 33 64 2c 20 20 2f 2a 20  ut, "  %3d,  /* 
1e290 25 31 30 73 20 3d 3e 20 25 73 20 2a 2f 5c 6e 22  %10s => %s */\n"
1e2a0 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 69  , p->fallback->i
1e2b0 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 20 20 20  ndex,.          
1e2c0 70 2d 3e 6e 61 6d 65 2c 20 70 2d 3e 66 61 6c 6c  p->name, p->fall
1e2d0 62 61 63 6b 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  back->name);.   
1e2e0 20 20 20 7d 0a 20 20 20 20 20 20 6c 69 6e 65 6e     }.      linen
1e2f0 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  o++;.    }.  }. 
1e300 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1e310 3e 6e 61 6d 65 2c 20 69 6e 2c 20 6f 75 74 2c 20  >name, in, out, 
1e320 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1e330 47 65 6e 65 72 61 74 65 20 61 20 74 61 62 6c 65  Generate a table
1e340 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1e350 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 6f 66  symbolic name of
1e360 20 65 76 65 72 79 20 73 79 6d 62 6f 6c 0a 20 20   every symbol.  
1e370 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1e380 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
1e390 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73  ++){.    lemon_s
1e3a0 70 72 69 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25  printf(line,"\"%
1e3b0 73 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62  s\",",lemp->symb
1e3c0 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  ols[i]->name);. 
1e3d0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1e3e0 20 20 25 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a    %-15s",line);.
1e3f0 20 20 20 20 69 66 28 20 28 69 26 33 29 3d 3d 33      if( (i&3)==3
1e400 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c   ){ fprintf(out,
1e410 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1e420 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 26   }.  }.  if( (i&
1e430 33 29 21 3d 30 20 29 7b 20 66 70 72 69 6e 74 66  3)!=0 ){ fprintf
1e440 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65  (out,"\n"); line
1e450 6e 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78  no++; }.  tplt_x
1e460 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1e470 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1e480 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1e490 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1e4a0 67 20 61 20 74 65 78 74 20 73 74 72 69 6e 67 20  g a text string 
1e4b0 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 65  that describes e
1e4c0 76 65 72 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69  very.  ** rule i
1e4d0 6e 20 74 68 65 20 72 75 6c 65 20 73 65 74 20 6f  n the rule set o
1e4e0 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20  f the grammar.  
1e4f0 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
1e500 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 77 68   is used.  ** wh
1e510 65 6e 20 74 72 61 63 69 6e 67 20 52 45 44 55 43  en tracing REDUC
1e520 45 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  E actions..  */.
1e530 20 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65    for(i=0, rp=le
1e540 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
1e550 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b  =rp->next, i++){
1e560 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 70 2d  .    assert( rp-
1e570 3e 69 6e 64 65 78 3d 3d 69 20 29 3b 0a 20 20 20  >index==i );.   
1e580 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f   fprintf(out," /
1e590 2a 20 25 33 64 20 2a 2f 20 5c 22 22 2c 20 69 29  * %3d */ \"", i)
1e5a0 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54  ;.    writeRuleT
1e5b0 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20  ext(out, rp);.  
1e5c0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c    fprintf(out,"\
1e5d0 22 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ",\n"); lineno++
1e5e0 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
1e5f0 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1e600 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1e610 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1e620 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
1e630 20 65 76 65 72 79 20 74 69 6d 65 20 61 20 73 79   every time a sy
1e640 6d 62 6f 6c 20 69 73 20 70 6f 70 70 65 64 20 66  mbol is popped f
1e650 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  rom.  ** the sta
1e660 63 6b 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73  ck while process
1e670 69 6e 67 20 65 72 72 6f 72 73 20 6f 72 20 77 68  ing errors or wh
1e680 69 6c 65 20 64 65 73 74 72 6f 79 69 6e 67 20 74  ile destroying t
1e690 68 65 20 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a  he parser. .  **
1e6a0 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
1e6b0 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 25  , generate the %
1e6c0 64 65 73 74 72 75 63 74 6f 72 20 61 63 74 69 6f  destructor actio
1e6d0 6e 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ns).  */.  if( l
1e6e0 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29  emp->tokendest )
1e6f0 7b 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d  {.    int once =
1e700 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   1;.    for(i=0;
1e710 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1e720 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
1e730 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
1e740 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
1e750 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70  i];.      if( sp
1e760 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21  ==0 || sp->type!
1e770 3d 54 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74  =TERMINAL ) cont
1e780 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
1e790 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  once ){.        
1e7a0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20  fprintf(out, "  
1e7b0 20 20 20 20 2f 2a 20 54 45 52 4d 49 4e 41 4c 20      /* TERMINAL 
1e7c0 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22  Destructor */\n"
1e7d0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1e7e0 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
1e7f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
1e800 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61  intf(out,"    ca
1e810 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c  se %d: /* %s */\
1e820 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73  n", sp->index, s
1e830 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  p->name); lineno
1e840 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ++;.    }.    fo
1e850 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1e860 73 79 6d 62 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e  symbol && lemp->
1e870 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65  symbols[i]->type
1e880 21 3d 54 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29  !=TERMINAL; i++)
1e890 3b 0a 20 20 20 20 69 66 28 20 69 3c 6c 65 6d 70  ;.    if( i<lemp
1e8a0 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20  ->nsymbol ){.   
1e8b0 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74     emit_destruct
1e8c0 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70  or_code(out,lemp
1e8d0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d  ->symbols[i],lem
1e8e0 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  p,&lineno);.    
1e8f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1e900 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b       break;\n");
1e910 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
1e920 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d  .  }.  if( lemp-
1e930 3e 76 61 72 64 65 73 74 20 29 7b 0a 20 20 20 20  >vardest ){.    
1e940 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
1e950 66 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20  flt_sp = 0;.    
1e960 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20  int once = 1;.  
1e970 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1e980 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
1e990 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
1e9a0 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
1e9b0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
1e9c0 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c      if( sp==0 ||
1e9d0 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49   sp->type==TERMI
1e9e0 4e 41 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  NAL ||.         
1e9f0 20 73 70 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c   sp->index<=0 ||
1ea00 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21   sp->destructor!
1ea10 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1ea20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29 7b       if( once ){
1ea30 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1ea40 28 6f 75 74 2c 20 22 20 20 20 20 20 20 2f 2a 20  (out, "      /* 
1ea50 44 65 66 61 75 6c 74 20 4e 4f 4e 2d 54 45 52 4d  Default NON-TERM
1ea60 49 4e 41 4c 20 44 65 73 74 72 75 63 74 6f 72 20  INAL Destructor 
1ea70 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  */\n"); lineno++
1ea80 3b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d  ;.        once =
1ea90 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1eaa0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1eab0 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25     case %d: /* %
1eac0 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64  s */\n", sp->ind
1ead0 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c  ex, sp->name); l
1eae0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64  ineno++;.      d
1eaf0 66 6c 74 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20  flt_sp = sp;.   
1eb00 20 7d 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5f   }.    if( dflt_
1eb10 73 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 65  sp!=0 ){.      e
1eb20 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  mit_destructor_c
1eb30 6f 64 65 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c  ode(out,dflt_sp,
1eb40 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lemp,&lineno);. 
1eb50 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
1eb60 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61  (out,"      brea
1eb70 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  k;\n"); lineno++
1eb80 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1eb90 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1eba0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
1ebb0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
1ebc0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
1ebd0 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20  ;.    if( sp==0 
1ebe0 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52  || sp->type==TER
1ebf0 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64 65 73  MINAL || sp->des
1ec00 74 72 75 63 74 6f 72 3d 3d 30 20 29 20 63 6f 6e  tructor==0 ) con
1ec10 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e  tinue;.    fprin
1ec20 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65  tf(out,"    case
1ec30 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22   %d: /* %s */\n"
1ec40 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d  , sp->index, sp-
1ec50 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  >name); lineno++
1ec60 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e  ;..    /* Combin
1ec70 65 20 64 75 70 6c 69 63 61 74 65 20 64 65 73 74  e duplicate dest
1ec80 72 75 63 74 6f 72 73 20 69 6e 74 6f 20 61 20 73  ructors into a s
1ec90 69 6e 67 6c 65 20 63 61 73 65 20 2a 2f 0a 20 20  ingle case */.  
1eca0 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c    for(j=i+1; j<l
1ecb0 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b  emp->nsymbol; j+
1ecc0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1ecd0 20 73 79 6d 62 6f 6c 20 2a 73 70 32 20 3d 20 6c   symbol *sp2 = l
1ece0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b  emp->symbols[j];
1ecf0 0a 20 20 20 20 20 20 69 66 28 20 73 70 32 20 26  .      if( sp2 &
1ed00 26 20 73 70 32 2d 3e 74 79 70 65 21 3d 54 45 52  & sp2->type!=TER
1ed10 4d 49 4e 41 4c 20 26 26 20 73 70 32 2d 3e 64 65  MINAL && sp2->de
1ed20 73 74 72 75 63 74 6f 72 0a 20 20 20 20 20 20 20  structor.       
1ed30 20 20 20 26 26 20 73 70 32 2d 3e 64 74 6e 75 6d     && sp2->dtnum
1ed40 3d 3d 73 70 2d 3e 64 74 6e 75 6d 0a 20 20 20 20  ==sp->dtnum.    
1ed50 20 20 20 20 20 20 26 26 20 73 74 72 63 6d 70 28        && strcmp(
1ed60 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 2c 73  sp->destructor,s
1ed70 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 29 3d  p2->destructor)=
1ed80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 66  =0 ){.         f
1ed90 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1eda0 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a  case %d: /* %s *
1edb0 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  /\n",.          
1edc0 20 20 20 20 20 20 20 73 70 32 2d 3e 69 6e 64 65         sp2->inde
1edd0 78 2c 20 73 70 32 2d 3e 6e 61 6d 65 29 3b 20 6c  x, sp2->name); l
1ede0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
1edf0 20 20 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f    sp2->destructo
1ee00 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  r = 0;.      }. 
1ee10 20 20 20 7d 0a 0a 20 20 20 20 65 6d 69 74 5f 64     }..    emit_d
1ee20 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f  estructor_code(o
1ee30 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ut,lemp->symbols
1ee40 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f  [i],lemp,&lineno
1ee50 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1ee60 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b  ut,"      break;
1ee70 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1ee80 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
1ee90 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1eea0 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1eeb0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1eec0 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
1eed0 68 65 6e 65 76 65 72 20 74 68 65 20 70 61 72 73  henever the pars
1eee0 65 72 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f  er stack overflo
1eef0 77 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ws */.  tplt_pri
1ef00 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1ef10 2d 3e 6f 76 65 72 66 6c 6f 77 2c 26 6c 69 6e 65  ->overflow,&line
1ef20 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  no);.  tplt_xfer
1ef30 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1ef40 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1ef50 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
1ef60 74 61 62 6c 65 20 6f 66 20 72 75 6c 65 20 69 6e  table of rule in
1ef70 66 6f 72 6d 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a  formation .  **.
1ef80 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20    ** Note: This 
1ef90 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
1efa0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 72 75  the fact that ru
1efb0 6c 65 73 20 61 72 65 20 6e 75 6d 62 65 72 0a 20  les are number. 
1efc0 20 2a 2a 20 73 65 71 75 65 6e 74 75 61 6c 6c 79   ** sequentually
1efd0 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
1efe0 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70  0..  */.  for(rp
1eff0 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
1f000 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
1f010 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1f020 20 20 7b 20 25 64 2c 20 25 64 20 7d 2c 5c 6e 22    { %d, %d },\n"
1f030 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c  ,rp->lhs->index,
1f040 72 70 2d 3e 6e 72 68 73 29 3b 20 6c 69 6e 65 6e  rp->nrhs); linen
1f050 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
1f060 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1f070 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1f080 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1f090 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
1f0a0 74 69 6f 6e 20 64 75 72 69 6e 67 20 65 61 63 68  tion during each
1f0b0 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 2a   REDUCE action *
1f0c0 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  /.  for(rp=lemp-
1f0d0 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
1f0e0 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 74 72 61  ->next){.    tra
1f0f0 6e 73 6c 61 74 65 5f 63 6f 64 65 28 6c 65 6d 70  nslate_code(lemp
1f100 2c 20 72 70 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  , rp);.  }.  /* 
1f110 46 69 72 73 74 20 6f 75 74 70 75 74 20 72 75 6c  First output rul
1f120 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  es other than th
1f130 65 20 64 65 66 61 75 6c 74 3a 20 72 75 6c 65 20  e default: rule 
1f140 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
1f150 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
1f160 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 73 74  p->next){.    st
1f170 72 75 63 74 20 72 75 6c 65 20 2a 72 70 32 3b 20  ruct rule *rp2; 
1f180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f190 20 4f 74 68 65 72 20 72 75 6c 65 73 20 77 69 74   Other rules wit
1f1a0 68 20 74 68 65 20 73 61 6d 65 20 61 63 74 69 6f  h the same actio
1f1b0 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 70 2d  n */.    if( rp-
1f1c0 3e 63 6f 64 65 3d 3d 30 20 29 20 63 6f 6e 74 69  >code==0 ) conti
1f1d0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 72 70 2d  nue;.    if( rp-
1f1e0 3e 63 6f 64 65 5b 30 5d 3d 3d 27 5c 6e 27 20 26  >code[0]=='\n' &
1f1f0 26 20 72 70 2d 3e 63 6f 64 65 5b 31 5d 3d 3d 30  & rp->code[1]==0
1f200 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20   ) continue; /* 
1f210 57 69 6c 6c 20 62 65 20 64 65 66 61 75 6c 74 3a  Will be default:
1f220 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 66 28   */.    fprintf(
1f230 6f 75 74 2c 22 20 20 20 20 20 20 63 61 73 65 20  out,"      case 
1f240 25 64 3a 20 2f 2a 20 22 2c 20 72 70 2d 3e 69 6e  %d: /* ", rp->in
1f250 64 65 78 29 3b 0a 20 20 20 20 77 72 69 74 65 52  dex);.    writeR
1f260 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29  uleText(out, rp)
1f270 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1f280 74 2c 20 22 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e  t, " */\n"); lin
1f290 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 72  eno++;.    for(r
1f2a0 70 32 3d 72 70 2d 3e 6e 65 78 74 3b 20 72 70 32  p2=rp->next; rp2
1f2b0 3b 20 72 70 32 3d 72 70 32 2d 3e 6e 65 78 74 29  ; rp2=rp2->next)
1f2c0 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70 32 2d  {.      if( rp2-
1f2d0 3e 63 6f 64 65 3d 3d 72 70 2d 3e 63 6f 64 65 20  >code==rp->code 
1f2e0 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1f2f0 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61  tf(out,"      ca
1f300 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70 32  se %d: /* ", rp2
1f310 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
1f320 20 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28    writeRuleText(
1f330 6f 75 74 2c 20 72 70 32 29 3b 0a 20 20 20 20 20  out, rp2);.     
1f340 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1f350 20 2a 2f 20 79 79 74 65 73 74 63 61 73 65 28 79   */ yytestcase(y
1f360 79 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22  yruleno==%d);\n"
1f370 2c 20 72 70 32 2d 3e 69 6e 64 65 78 29 3b 20 6c  , rp2->index); l
1f380 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
1f390 20 72 70 32 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a   rp2->code = 0;.
1f3a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f3b0 20 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c    emit_code(out,
1f3c0 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  rp,lemp,&lineno)
1f3d0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1f3e0 74 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b  t,"        break
1f3f0 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1f400 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20  .    rp->code = 
1f410 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 69 6e 61  0;.  }.  /* Fina
1f420 6c 6c 79 2c 20 6f 75 74 70 75 74 20 74 68 65 20  lly, output the 
1f430 64 65 66 61 75 6c 74 3a 20 72 75 6c 65 2e 20 20  default: rule.  
1f440 57 65 20 63 68 6f 6f 73 65 20 61 73 20 74 68 65  We choose as the
1f450 20 64 65 66 61 75 6c 74 3a 20 61 6c 6c 0a 20 20   default: all.  
1f460 2a 2a 20 65 6d 70 74 79 20 61 63 74 69 6f 6e 73  ** empty actions
1f470 2e 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  . */.  fprintf(o
1f480 75 74 2c 22 20 20 20 20 20 20 64 65 66 61 75 6c  ut,"      defaul
1f490 74 3a 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  t:\n"); lineno++
1f4a0 3b 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  ;.  for(rp=lemp-
1f4b0 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
1f4c0 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  ->next){.    if(
1f4d0 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 20 63   rp->code==0 ) c
1f4e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
1f4f0 65 72 74 28 20 72 70 2d 3e 63 6f 64 65 5b 30 5d  ert( rp->code[0]
1f500 3d 3d 27 5c 6e 27 20 26 26 20 72 70 2d 3e 63 6f  =='\n' && rp->co
1f510 64 65 5b 31 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  de[1]==0 );.    
1f520 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1f530 20 20 20 2f 2a 20 28 25 64 29 20 22 2c 20 72 70     /* (%d) ", rp
1f540 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 77 72  ->index);.    wr
1f550 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c  iteRuleText(out,
1f560 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74   rp);.    fprint
1f570 66 28 6f 75 74 2c 20 22 20 2a 2f 20 79 79 74 65  f(out, " */ yyte
1f580 73 74 63 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d  stcase(yyruleno=
1f590 3d 25 64 29 3b 5c 6e 22 2c 20 72 70 2d 3e 69 6e  =%d);\n", rp->in
1f5a0 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
1f5b0 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
1f5c0 74 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b  t,"        break
1f5d0 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1f5e0 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1f5f0 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1f600 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1f610 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
1f620 63 68 20 65 78 65 63 75 74 65 73 20 69 66 20 61  ch executes if a
1f630 20 70 61 72 73 65 20 66 61 69 6c 73 20 2a 2f 0a   parse fails */.
1f640 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
1f650 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 66 61 69 6c  ,lemp,lemp->fail
1f660 75 72 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  ure,&lineno);.  
1f670 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1f680 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1f690 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1f6a0 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
1f6b0 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 61 20  executes when a 
1f6c0 73 79 6e 74 61 78 20 65 72 72 6f 72 20 6f 63 63  syntax error occ
1f6d0 75 72 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72  urs */.  tplt_pr
1f6e0 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d  int(out,lemp,lem
1f6f0 70 2d 3e 65 72 72 6f 72 2c 26 6c 69 6e 65 6e 6f  p->error,&lineno
1f700 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
1f710 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1f720 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1f730 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
1f740 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
1f750 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 63  en the parser ac
1f760 63 65 70 74 73 20 69 74 73 20 69 6e 70 75 74 20  cepts its input 
1f770 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
1f780 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 61  out,lemp,lemp->a
1f790 63 63 65 70 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  ccept,&lineno);.
1f7a0 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1f7b0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1f7c0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 41 70  ineno);..  /* Ap
1f7d0 70 65 6e 64 20 61 6e 79 20 61 64 64 69 74 69 6f  pend any additio
1f7e0 6e 20 63 6f 64 65 20 74 68 65 20 75 73 65 72 20  n code the user 
1f7f0 64 65 73 69 72 65 73 20 2a 2f 0a 20 20 74 70 6c  desires */.  tpl
1f800 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
1f810 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63 6f 64 65  ,lemp->extracode
1f820 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66 63  ,&lineno);..  fc
1f830 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 66 63 6c 6f  lose(in);.  fclo
1f840 73 65 28 6f 75 74 29 3b 0a 20 20 72 65 74 75 72  se(out);.  retur
1f850 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74  n;.}../* Generat
1f860 65 20 61 20 68 65 61 64 65 72 20 66 69 6c 65 20  e a header file 
1f870 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 2a  for the parser *
1f880 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 48 65 61  /.void ReportHea
1f890 64 65 72 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  der(struct lemon
1f8a0 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 46 49 4c 45   *lemp).{.  FILE
1f8b0 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 6f   *out, *in;.  co
1f8c0 6e 73 74 20 63 68 61 72 20 2a 70 72 65 66 69 78  nst char *prefix
1f8d0 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49  ;.  char line[LI
1f8e0 4e 45 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20  NESIZE];.  char 
1f8f0 70 61 74 74 65 72 6e 5b 4c 49 4e 45 53 49 5a 45  pattern[LINESIZE
1f900 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  ];.  int i;..  i
1f910 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72  f( lemp->tokenpr
1f920 65 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20  efix ) prefix = 
1f930 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
1f940 78 3b 0a 20 20 65 6c 73 65 20 20 20 20 20 20 20  x;.  else       
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
1f960 66 69 78 20 3d 20 22 22 3b 0a 20 20 69 6e 20 3d  fix = "";.  in =
1f970 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c   file_open(lemp,
1f980 22 2e 68 22 2c 22 72 62 22 29 3b 0a 20 20 69 66  ".h","rb");.  if
1f990 28 20 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ( in ){.    int 
1f9a0 6e 65 78 74 43 68 61 72 3b 0a 20 20 20 20 66 6f  nextChar;.    fo
1f9b0 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=1; i<lemp->n
1f9c0 74 65 72 6d 69 6e 61 6c 20 26 26 20 66 67 65 74  terminal && fget
1f9d0 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c  s(line,LINESIZE,
1f9e0 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  in); i++){.     
1f9f0 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 70   lemon_sprintf(p
1fa00 61 74 74 65 72 6e 2c 22 23 64 65 66 69 6e 65 20  attern,"#define 
1fa10 25 73 25 2d 33 30 73 20 25 33 64 5c 6e 22 2c 0a  %s%-30s %3d\n",.
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa30 20 20 20 20 70 72 65 66 69 78 2c 6c 65 6d 70 2d      prefix,lemp-
1fa40 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d  >symbols[i]->nam
1fa50 65 2c 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e,i);.      if( 
1fa60 73 74 72 63 6d 70 28 6c 69 6e 65 2c 70 61 74 74  strcmp(line,patt
1fa70 65 72 6e 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ern) ) break;.  
1fa80 20 20 7d 0a 20 20 20 20 6e 65 78 74 43 68 61 72    }.    nextChar
1fa90 20 3d 20 66 67 65 74 63 28 69 6e 29 3b 0a 20 20   = fgetc(in);.  
1faa0 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
1fab0 20 20 69 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e    if( i==lemp->n
1fac0 74 65 72 6d 69 6e 61 6c 20 26 26 20 6e 65 78 74  terminal && next
1fad0 43 68 61 72 3d 3d 45 4f 46 20 29 7b 0a 20 20 20  Char==EOF ){.   
1fae0 20 20 20 2f 2a 20 4e 6f 20 63 68 61 6e 67 65 20     /* No change 
1faf0 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 44 6f  in the file.  Do
1fb00 6e 27 74 20 72 65 77 72 69 74 65 20 69 74 2e 20  n't rewrite it. 
1fb10 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
1fb20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6f 75 74  .    }.  }.  out
1fb30 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d   = file_open(lem
1fb40 70 2c 22 2e 68 22 2c 22 77 62 22 29 3b 0a 20 20  p,".h","wb");.  
1fb50 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 66  if( out ){.    f
1fb60 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=1; i<lemp->
1fb70 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b  nterminal; i++){
1fb80 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1fb90 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d  ut,"#define %s%-
1fba0 33 30 73 20 25 33 64 5c 6e 22 2c 70 72 65 66 69  30s %3d\n",prefi
1fbb0 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  x,lemp->symbols[
1fbc0 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20  i]->name,i);.   
1fbd0 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 6f 75   }.    fclose(ou
1fbe0 74 29 3b 20 20 0a 20 20 7d 0a 20 20 72 65 74 75  t);  .  }.  retu
1fbf0 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 64 75 63 65  rn;.}../* Reduce
1fc00 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1fc10 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 2c 20   action tables, 
1fc20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 62 79 20  if possible, by 
1fc30 6d 61 6b 69 6e 67 20 75 73 65 0a 2a 2a 20 6f 66  making use.** of
1fc40 20 64 65 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a   defaults..**.**
1fc50 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e   In this version
1fc60 2c 20 77 65 20 74 61 6b 65 20 74 68 65 20 6d 6f  , we take the mo
1fc70 73 74 20 66 72 65 71 75 65 6e 74 20 52 45 44 55  st frequent REDU
1fc80 43 45 20 61 63 74 69 6f 6e 20 61 6e 64 20 6d 61  CE action and ma
1fc90 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20 64 65 66  ke.** it the def
1fca0 61 75 6c 74 2e 20 20 45 78 63 65 70 74 2c 20 74  ault.  Except, t
1fcb0 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66 61 75  here is no defau
1fcc0 6c 74 20 69 66 20 74 68 65 20 77 69 6c 64 63 61  lt if the wildca
1fcd0 72 64 20 74 6f 6b 65 6e 0a 2a 2a 20 69 73 20 61  rd token.** is a
1fce0 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b 2d 61   possible look-a
1fcf0 68 65 61 64 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f  head..*/.void Co
1fd00 6d 70 72 65 73 73 54 61 62 6c 65 73 28 73 74 72  mpressTables(str
1fd10 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
1fd20 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  .{.  struct stat
1fd30 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74  e *stp;.  struct
1fd40 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 61 70   action *ap, *ap
1fd50 32 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  2;.  struct rule
1fd60 20 2a 72 70 2c 20 2a 72 70 32 2c 20 2a 72 62 65   *rp, *rp2, *rbe
1fd70 73 74 3b 0a 20 20 69 6e 74 20 6e 62 65 73 74 2c  st;.  int nbest,
1fd80 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   n;.  int i;.  i
1fd90 6e 74 20 75 73 65 73 57 69 6c 64 63 61 72 64 3b  nt usesWildcard;
1fda0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ..  for(i=0; i<l
1fdb0 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
1fdc0 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
1fdd0 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
1fde0 20 20 6e 62 65 73 74 20 3d 20 30 3b 0a 20 20 20    nbest = 0;.   
1fdf0 20 72 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20   rbest = 0;.    
1fe00 75 73 65 73 57 69 6c 64 63 61 72 64 20 3d 20 30  usesWildcard = 0
1fe10 3b 0a 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74  ;..    for(ap=st
1fe20 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
1fe30 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
1fe40 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 53 48 49  f( ap->type==SHI
1fe50 46 54 20 26 26 20 61 70 2d 3e 73 70 3d 3d 6c 65  FT && ap->sp==le
1fe60 6d 70 2d 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a  mp->wildcard ){.
1fe70 20 20 20 20 20 20 20 20 75 73 65 73 57 69 6c 64          usesWild
1fe80 63 61 72 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  card = 1;.      
1fe90 7d 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  }.      if( ap->
1fea0 74 79 70 65 21 3d 52 45 44 55 43 45 20 29 20 63  type!=REDUCE ) c
1feb0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72  ontinue;.      r
1fec0 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20  p = ap->x.rp;.  
1fed0 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 53      if( rp->lhsS
1fee0 74 61 72 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  tart ) continue;
1fef0 0a 20 20 20 20 20 20 69 66 28 20 72 70 3d 3d 72  .      if( rp==r
1ff00 62 65 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  best ) continue;
1ff10 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20  .      n = 1;.  
1ff20 20 20 20 20 66 6f 72 28 61 70 32 3d 61 70 2d 3e      for(ap2=ap->
1ff30 6e 65 78 74 3b 20 61 70 32 3b 20 61 70 32 3d 61  next; ap2; ap2=a
1ff40 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  p2->next){.     
1ff50 20 20 20 69 66 28 20 61 70 32 2d 3e 74 79 70 65     if( ap2->type
1ff60 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e 74 69  !=REDUCE ) conti
1ff70 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 72 70 32  nue;.        rp2
1ff80 20 3d 20 61 70 32 2d 3e 78 2e 72 70 3b 0a 20 20   = ap2->x.rp;.  
1ff90 20 20 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72        if( rp2==r
1ffa0 62 65 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  best ) continue;
1ffb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70 32  .        if( rp2
1ffc0 3d 3d 72 70 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  ==rp ) n++;.    
1ffd0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3e    }.      if( n>
1ffe0 6e 62 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  nbest ){.       
1fff0 20 6e 62 65 73 74 20 3d 20 6e 3b 0a 20 20 20 20   nbest = n;.    
20000 20 20 20 20 72 62 65 73 74 20 3d 20 72 70 3b 0a      rbest = rp;.
20010 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 0a        }.    }. .
20020 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61      /* Do not ma
20030 6b 65 20 61 20 64 65 66 61 75 6c 74 20 69 66 20  ke a default if 
20040 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 75  the number of ru
20050 6c 65 73 20 74 6f 20 64 65 66 61 75 6c 74 0a 20  les to default. 
20060 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 74 20     ** is not at 
20070 6c 65 61 73 74 20 31 20 6f 72 20 69 66 20 74 68  least 1 or if th
20080 65 20 77 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e  e wildcard token
20090 20 69 73 20 61 20 70 6f 73 73 69 62 6c 65 0a 20   is a possible. 
200a0 20 20 20 2a 2a 20 6c 6f 6f 6b 61 68 65 61 64 2e     ** lookahead.
200b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
200c0 6e 62 65 73 74 3c 31 20 7c 7c 20 75 73 65 73 57  nbest<1 || usesW
200d0 69 6c 64 63 61 72 64 20 29 20 63 6f 6e 74 69 6e  ildcard ) contin
200e0 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  ue;...    /* Com
200f0 62 69 6e 65 20 6d 61 74 63 68 69 6e 67 20 52 45  bine matching RE
20100 44 55 43 45 20 61 63 74 69 6f 6e 73 20 69 6e 74  DUCE actions int
20110 6f 20 61 20 73 69 6e 67 6c 65 20 64 65 66 61 75  o a single defau
20120 6c 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28 61 70  lt */.    for(ap
20130 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
20140 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
20150 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d    if( ap->type==
20160 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e  REDUCE && ap->x.
20170 72 70 3d 3d 72 62 65 73 74 20 29 20 62 72 65 61  rp==rbest ) brea
20180 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  k;.    }.    ass
20190 65 72 74 28 20 61 70 20 29 3b 0a 20 20 20 20 61  ert( ap );.    a
201a0 70 2d 3e 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e  p->sp = Symbol_n
201b0 65 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b  ew("{default}");
201c0 0a 20 20 20 20 66 6f 72 28 61 70 3d 61 70 2d 3e  .    for(ap=ap->
201d0 6e 65 78 74 3b 20 61 70 3b 20 61 70 3d 61 70 2d  next; ap; ap=ap-
201e0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
201f0 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55  ( ap->type==REDU
20200 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d  CE && ap->x.rp==
20210 72 62 65 73 74 20 29 20 61 70 2d 3e 74 79 70 65  rbest ) ap->type
20220 20 3d 20 4e 4f 54 5f 55 53 45 44 3b 0a 20 20 20   = NOT_USED;.   
20230 20 7d 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d   }.    stp->ap =
20240 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70   Action_sort(stp
20250 2d 3e 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ->ap);.  }.}.../
20260 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
20270 20 73 74 61 74 65 73 20 66 6f 72 20 73 6f 72 74   states for sort
20280 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54  ing purposes.  T
20290 68 65 20 73 6d 61 6c 6c 65 72 20 73 74 61 74 65  he smaller state
202a0 20 69 73 20 74 68 65 0a 2a 2a 20 6f 6e 65 20 77   is the.** one w
202b0 69 74 68 20 74 68 65 20 6d 6f 73 74 20 6e 6f 6e  ith the most non
202c0 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e  -terminal action
202d0 73 2e 20 20 49 66 20 74 68 65 79 20 68 61 76 65  s.  If they have
202e0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
202f0 0a 2a 2a 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69  .** of non-termi
20300 6e 61 6c 20 61 63 74 69 6f 6e 73 2c 20 74 68 65  nal actions, the
20310 6e 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 69 73  n the smaller is
20320 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
20330 65 20 6d 6f 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20  e most.** token 
20340 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  actions..*/.stat
20350 69 63 20 69 6e 74 20 73 74 61 74 65 52 65 73 6f  ic int stateReso
20360 72 74 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  rtCompare(const 
20370 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76  void *a, const v
20380 6f 69 64 20 2a 62 29 7b 0a 20 20 63 6f 6e 73 74  oid *b){.  const
20390 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 70   struct state *p
203a0 41 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75  A = *(const stru
203b0 63 74 20 73 74 61 74 65 2a 2a 29 61 3b 0a 20 20  ct state**)a;.  
203c0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61  const struct sta
203d0 74 65 20 2a 70 42 20 3d 20 2a 28 63 6f 6e 73 74  te *pB = *(const
203e0 20 73 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29   struct state**)
203f0 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e  b;.  int n;..  n
20400 20 3d 20 70 42 2d 3e 6e 4e 74 41 63 74 20 2d 20   = pB->nNtAct - 
20410 70 41 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20 69 66  pA->nNtAct;.  if
20420 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 20  ( n==0 ){.    n 
20430 3d 20 70 42 2d 3e 6e 54 6b 6e 41 63 74 20 2d 20  = pB->nTknAct - 
20440 70 41 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20  pA->nTknAct;.   
20450 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
20460 20 20 20 6e 20 3d 20 70 42 2d 3e 73 74 61 74 65     n = pB->state
20470 6e 75 6d 20 2d 20 70 41 2d 3e 73 74 61 74 65 6e  num - pA->staten
20480 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  um;.    }.  }.  
20490 61 73 73 65 72 74 28 20 6e 21 3d 30 20 29 3b 0a  assert( n!=0 );.
204a0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
204b0 2f 2a 0a 2a 2a 20 52 65 6e 75 6d 62 65 72 20 61  /*.** Renumber a
204c0 6e 64 20 72 65 73 6f 72 74 20 73 74 61 74 65 73  nd resort states
204d0 20 73 6f 20 74 68 61 74 20 73 74 61 74 65 73 20   so that states 
204e0 77 69 74 68 20 66 65 77 65 72 20 63 68 6f 69 63  with fewer choic
204f0 65 73 0a 2a 2a 20 6f 63 63 75 72 20 61 74 20 74  es.** occur at t
20500 68 65 20 65 6e 64 2e 20 20 45 78 63 65 70 74 2c  he end.  Except,
20510 20 6b 65 65 70 20 73 74 61 74 65 20 30 20 61 73   keep state 0 as
20520 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65   the first state
20530 2e 0a 2a 2f 0a 76 6f 69 64 20 52 65 73 6f 72 74  ..*/.void Resort
20540 53 74 61 74 65 73 28 73 74 72 75 63 74 20 6c 65  States(struct le
20550 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69  mon *lemp).{.  i
20560 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
20570 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72  tate *stp;.  str
20580 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
20590 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
205a0 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
205b0 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  {.    stp = lemp
205c0 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
205d0 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20   stp->nTknAct = 
205e0 73 74 70 2d 3e 6e 4e 74 41 63 74 20 3d 20 30 3b  stp->nNtAct = 0;
205f0 0a 20 20 20 20 73 74 70 2d 3e 69 44 66 6c 74 20  .    stp->iDflt 
20600 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b  = lemp->nstate +
20610 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20   lemp->nrule;.  
20620 20 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20    stp->iTknOfst 
20630 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20  = NO_OFFSET;.   
20640 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20   stp->iNtOfst = 
20650 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 66  NO_OFFSET;.    f
20660 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61  or(ap=stp->ap; a
20670 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
20680 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6d 70 75  .      if( compu
20690 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61  te_action(lemp,a
206a0 70 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p)>=0 ){.       
206b0 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64   if( ap->sp->ind
206c0 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e  ex<lemp->ntermin
206d0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
206e0 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 2b 2b 3b 0a  stp->nTknAct++;.
206f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
20700 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c  ( ap->sp->index<
20710 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b  lemp->nsymbol ){
20720 0a 20 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e  .          stp->
20730 6e 4e 74 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20  nNtAct++;.      
20740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20750 20 20 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20     stp->iDflt = 
20760 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c  compute_action(l
20770 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20  emp, ap);.      
20780 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
20790 7d 0a 20 20 7d 0a 20 20 71 73 6f 72 74 28 26 6c  }.  }.  qsort(&l
207a0 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 31 5d 2c 20  emp->sorted[1], 
207b0 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2d 31 2c 20  lemp->nstate-1, 
207c0 73 69 7a 65 6f 66 28 6c 65 6d 70 2d 3e 73 6f 72  sizeof(lemp->sor
207d0 74 65 64 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  ted[0]),.       
207e0 20 73 74 61 74 65 52 65 73 6f 72 74 43 6f 6d 70   stateResortComp
207f0 61 72 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  are);.  for(i=0;
20800 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
20810 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d   i++){.    lemp-
20820 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 73 74 61 74  >sorted[i]->stat
20830 65 6e 75 6d 20 3d 20 69 3b 0a 20 20 7d 0a 7d 0a  enum = i;.  }.}.
20840 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
20850 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
20860 6c 65 20 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a  le "set.c" *****
20870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
20890 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70  ./*.** Set manip
208a0 75 6c 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73  ulation routines
208b0 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70   for the LEMON p
208c0 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
208d0 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
208e0 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65  size = 0;../* Se
208f0 74 20 74 68 65 20 73 65 74 20 73 69 7a 65 20 2a  t the set size *
20900 2f 0a 76 6f 69 64 20 53 65 74 53 69 7a 65 28 69  /.void SetSize(i
20910 6e 74 20 6e 29 0a 7b 0a 20 20 73 69 7a 65 20 3d  nt n).{.  size =
20920 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f   n+1;.}../* Allo
20930 63 61 74 65 20 61 20 6e 65 77 20 73 65 74 20 2a  cate a new set *
20940 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28 29  /.char *SetNew()
20950 7b 0a 20 20 63 68 61 72 20 2a 73 3b 0a 20 20 73  {.  char *s;.  s
20960 20 3d 20 28 63 68 61 72 2a 29 63 61 6c 6c 6f 63   = (char*)calloc
20970 28 20 73 69 7a 65 2c 20 31 29 3b 0a 20 20 69 66  ( size, 1);.  if
20980 28 20 73 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78  ( s==0 ){.    ex
20990 74 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79  tern void memory
209a0 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 6d 65  _error();.    me
209b0 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20  mory_error();.  
209c0 7d 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  }.  return s;.}.
209d0 0a 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  ./* Deallocate a
209e0 20 73 65 74 20 2a 2f 0a 76 6f 69 64 20 53 65 74   set */.void Set
209f0 46 72 65 65 28 63 68 61 72 20 2a 73 29 0a 7b 0a  Free(char *s).{.
20a00 20 20 66 72 65 65 28 73 29 3b 0a 7d 0a 0a 2f 2a    free(s);.}../*
20a10 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
20a20 6e 74 20 74 6f 20 74 68 65 20 73 65 74 2e 20 20  nt to the set.  
20a30 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
20a40 68 65 20 65 6c 65 6d 65 6e 74 20 77 61 73 20 61  he element was a
20a50 64 64 65 64 0a 2a 2a 20 61 6e 64 20 46 41 4c 53  dded.** and FALS
20a60 45 20 69 66 20 69 74 20 77 61 73 20 61 6c 72 65  E if it was alre
20a70 61 64 79 20 74 68 65 72 65 2e 20 2a 2f 0a 69 6e  ady there. */.in
20a80 74 20 53 65 74 41 64 64 28 63 68 61 72 20 2a 73  t SetAdd(char *s
20a90 2c 20 69 6e 74 20 65 29 0a 7b 0a 20 20 69 6e 74  , int e).{.  int
20aa0 20 72 76 3b 0a 20 20 61 73 73 65 72 74 28 20 65   rv;.  assert( e
20ab0 3e 3d 30 20 26 26 20 65 3c 73 69 7a 65 20 29 3b  >=0 && e<size );
20ac0 0a 20 20 72 76 20 3d 20 73 5b 65 5d 3b 0a 20 20  .  rv = s[e];.  
20ad0 73 5b 65 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  s[e] = 1;.  retu
20ae0 72 6e 20 21 72 76 3b 0a 7d 0a 0a 2f 2a 20 41 64  rn !rv;.}../* Ad
20af0 64 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  d every element 
20b00 6f 66 20 73 32 20 74 6f 20 73 31 2e 20 20 52 65  of s2 to s1.  Re
20b10 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 31 20  turn TRUE if s1 
20b20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 69 6e 74 20  changes. */.int 
20b30 53 65 74 55 6e 69 6f 6e 28 63 68 61 72 20 2a 73  SetUnion(char *s
20b40 31 2c 20 63 68 61 72 20 2a 73 32 29 0a 7b 0a 20  1, char *s2).{. 
20b50 20 69 6e 74 20 69 2c 20 70 72 6f 67 72 65 73 73   int i, progress
20b60 3b 0a 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30  ;.  progress = 0
20b70 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
20b80 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ize; i++){.    i
20b90 66 28 20 73 32 5b 69 5d 3d 3d 30 20 29 20 63 6f  f( s2[i]==0 ) co
20ba0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
20bb0 73 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  s1[i]==0 ){.    
20bc0 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a    progress = 1;.
20bd0 20 20 20 20 20 20 73 31 5b 69 5d 20 3d 20 31 3b        s1[i] = 1;
20be0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
20bf0 75 72 6e 20 70 72 6f 67 72 65 73 73 3b 0a 7d 0a  urn progress;.}.
20c00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
20c10 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
20c20 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 63 22 20   file "table.c" 
20c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
20c50 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20  .** All code in 
20c60 74 68 69 73 20 66 69 6c 65 20 68 61 73 20 62 65  this file has be
20c70 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  en automatically
20c80 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72   generated.** fr
20c90 6f 6d 20 61 20 73 70 65 63 69 66 69 63 61 74 69  om a specificati
20ca0 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a  on in the file.*
20cb0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  *              "
20cc0 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74  table.q".** by t
20cd0 68 65 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  he associative a
20ce0 72 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64 69  rray code buildi
20cf0 6e 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67 65  ng program "aage
20d00 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64  n"..** Do not ed
20d10 69 74 20 74 68 69 73 20 66 69 6c 65 21 20 20 49  it this file!  I
20d20 6e 73 74 65 61 64 2c 20 65 64 69 74 20 74 68 65  nstead, edit the
20d30 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a   specification.*
20d40 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 72  * file, then rer
20d50 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a  un aagen..*/./*.
20d60 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f 63  ** Code for proc
20d70 65 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69 6e  essing tables in
20d80 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
20d90 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
20da0 0a 50 52 49 56 41 54 45 20 75 6e 73 69 67 6e 65  .PRIVATE unsigne
20db0 64 20 73 74 72 68 61 73 68 28 63 6f 6e 73 74 20  d strhash(const 
20dc0 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20 75 6e 73  char *x).{.  uns
20dd0 69 67 6e 65 64 20 68 20 3d 20 30 3b 0a 20 20 77  igned h = 0;.  w
20de0 68 69 6c 65 28 20 2a 78 20 29 20 68 20 3d 20 68  hile( *x ) h = h
20df0 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20 20  *13 + *(x++);.  
20e00 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20  return h;.}../* 
20e10 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74 72 64 75  Works like strdu
20e20 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20 53 61 76  p, sort of.  Sav
20e30 65 20 61 20 73 74 72 69 6e 67 20 69 6e 20 6d 61  e a string in ma
20e40 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79 2c 20 62  lloced memory, b
20e50 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74 72 69 6e  ut.** keep strin
20e60 67 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73 6f  gs in a table so
20e70 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 73   that the same s
20e80 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 69 6e 20  tring is not in 
20e90 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e 65  more.** than one
20ea0 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 6f 6e 73 74   place..*/.const
20eb0 20 63 68 61 72 20 2a 53 74 72 73 61 66 65 28 63   char *Strsafe(c
20ec0 6f 6e 73 74 20 63 68 61 72 20 2a 79 29 0a 7b 0a  onst char *y).{.
20ed0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
20ee0 0a 20 20 63 68 61 72 20 2a 63 70 79 3b 0a 0a 20  .  char *cpy;.. 
20ef0 20 69 66 28 20 79 3d 3d 30 20 29 20 72 65 74 75   if( y==0 ) retu
20f00 72 6e 20 30 3b 0a 20 20 7a 20 3d 20 53 74 72 73  rn 0;.  z = Strs
20f10 61 66 65 5f 66 69 6e 64 28 79 29 3b 0a 20 20 69  afe_find(y);.  i
20f20 66 28 20 7a 3d 3d 30 20 26 26 20 28 63 70 79 3d  f( z==0 && (cpy=
20f30 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20  (char *)malloc( 
20f40 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 79 29 2b 31  lemonStrlen(y)+1
20f50 20 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 6c 65   ))!=0 ){.    le
20f60 6d 6f 6e 5f 73 74 72 63 70 79 28 63 70 79 2c 79  mon_strcpy(cpy,y
20f70 29 3b 0a 20 20 20 20 7a 20 3d 20 63 70 79 3b 0a  );.    z = cpy;.
20f80 20 20 20 20 53 74 72 73 61 66 65 5f 69 6e 73 65      Strsafe_inse
20f90 72 74 28 7a 29 3b 0a 20 20 7d 0a 20 20 4d 65 6d  rt(z);.  }.  Mem
20fa0 6f 72 79 43 68 65 63 6b 28 7a 29 3b 0a 20 20 72  oryCheck(z);.  r
20fb0 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54  eturn z;.}../* T
20fc0 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
20fd0 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
20fe0 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
20ff0 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f  for each.** asso
21000 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
21010 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 73   type "x1"..*/.s
21020 74 72 75 63 74 20 73 5f 78 31 20 7b 0a 20 20 69  truct s_x1 {.  i
21030 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
21040 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
21050 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
21060 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20  e slots. */.    
21070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21080 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20        /*   Must 
21090 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
210a0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
210b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
210c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
210d0 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a    equal to 1 */.
210e0 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20    int count;    
210f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
21100 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79  ber of currently
21110 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f   slots filled */
21120 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f  .  struct s_x1no
21130 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65  de *tbl;  /* The
21140 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72   data stored her
21150 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  e */.  struct s_
21160 78 31 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a  x1node **ht;  /*
21170 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   Hash table for 
21180 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f  lookups */.};../
21190 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
211a0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
211b0 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76  structure for ev
211c0 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ery data element
211d0 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69  .** in an associ
211e0 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
211f0 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 74 79 70  ype "x1"..*/.typ
21200 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 31  edef struct s_x1
21210 6e 6f 64 65 20 7b 0a 20 20 63 6f 6e 73 74 20 63  node {.  const c
21220 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20  har *data;      
21230 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
21240 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f  .  struct s_x1no
21250 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e  de *next;   /* N
21260 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74  ext entry with t
21270 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a  he same hash */.
21280 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64    struct s_x1nod
21290 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72  e **from;  /* Pr
212a0 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d  evious link */.}
212b0 20 78 31 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65   x1node;../* The
212c0 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69  re is only one i
212d0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61  nstance of the a
212e0 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74  rray, which is t
212f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
21300 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f  static struct s_
21310 78 31 20 2a 78 31 61 3b 0a 0a 2f 2a 20 41 6c 6c  x1 *x1a;../* All
21320 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f  ocate a new asso
21330 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f  ciative array */
21340 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e  .void Strsafe_in
21350 69 74 28 29 7b 0a 20 20 69 66 28 20 78 31 61 20  it(){.  if( x1a 
21360 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 31 61 20  ) return;.  x1a 
21370 3d 20 28 73 74 72 75 63 74 20 73 5f 78 31 2a 29  = (struct s_x1*)
21380 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
21390 74 72 75 63 74 20 73 5f 78 31 29 20 29 3b 0a 20  truct s_x1) );. 
213a0 20 69 66 28 20 78 31 61 20 29 7b 0a 20 20 20 20   if( x1a ){.    
213b0 78 31 61 2d 3e 73 69 7a 65 20 3d 20 31 30 32 34  x1a->size = 1024
213c0 3b 0a 20 20 20 20 78 31 61 2d 3e 63 6f 75 6e 74  ;.    x1a->count
213d0 20 3d 20 30 3b 0a 20 20 20 20 78 31 61 2d 3e 74   = 0;.    x1a->t
213e0 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29 63 61  bl = (x1node*)ca
213f0 6c 6c 6f 63 28 31 30 32 34 2c 20 73 69 7a 65 6f  lloc(1024, sizeo
21400 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x1node) + size
21410 6f 66 28 78 31 6e 6f 64 65 2a 29 29 3b 0a 20 20  of(x1node*));.  
21420 20 20 69 66 28 20 78 31 61 2d 3e 74 62 6c 3d 3d    if( x1a->tbl==
21430 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
21440 78 31 61 29 3b 0a 20 20 20 20 20 20 78 31 61 20  x1a);.      x1a 
21450 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
21460 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
21470 20 20 20 78 31 61 2d 3e 68 74 20 3d 20 28 78 31     x1a->ht = (x1
21480 6e 6f 64 65 2a 2a 29 26 28 78 31 61 2d 3e 74 62  node**)&(x1a->tb
21490 6c 5b 31 30 32 34 5d 29 3b 0a 20 20 20 20 20 20  l[1024]);.      
214a0 66 6f 72 28 69 3d 30 3b 20 69 3c 31 30 32 34 3b  for(i=0; i<1024;
214b0 20 69 2b 2b 29 20 78 31 61 2d 3e 68 74 5b 69 5d   i++) x1a->ht[i]
214c0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
214d0 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  }./* Insert a ne
214e0 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
214f0 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  e array.  Return
21500 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73   TRUE if success
21510 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61  ful..** Prior da
21520 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ta with the same
21530 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72   key is NOT over
21540 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53  written */.int S
21550 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28 63 6f  trsafe_insert(co
21560 6e 73 74 20 63 68 61 72 20 2a 64 61 74 61 29 0a  nst char *data).
21570 7b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a  {.  x1node *np;.
21580 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20    unsigned h;.  
21590 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20  unsigned ph;..  
215a0 69 66 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74  if( x1a==0 ) ret
215b0 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74  urn 0;.  ph = st
215c0 72 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68  rhash(data);.  h
215d0 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69   = ph & (x1a->si
215e0 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31  ze-1);.  np = x1
215f0 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
21600 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
21610 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61   strcmp(np->data
21620 2c 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20  ,data)==0 ){.   
21630 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
21640 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  g entry with the
21650 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75   same key is fou
21660 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  nd. */.      /* 
21670 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65  Fail because ove
21680 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c  rwrite is not al
21690 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  lows. */.      r
216a0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
216b0 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
216c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 31 61 2d  ;.  }.  if( x1a-
216d0 3e 63 6f 75 6e 74 3e 3d 78 31 61 2d 3e 73 69 7a  >count>=x1a->siz
216e0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64  e ){.    /* Need
216f0 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
21700 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a  h table bigger *
21710 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65  /.    int i,size
21720 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78  ;.    struct s_x
21730 31 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72  1 array;.    arr
21740 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d  ay.size = size =
21750 20 78 31 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20   x1a->size*2;.  
21760 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20    array.count = 
21770 78 31 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20  x1a->count;.    
21780 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 31 6e  array.tbl = (x1n
21790 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 73 69 7a 65  ode*)calloc(size
217a0 2c 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29  , sizeof(x1node)
217b0 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65   + sizeof(x1node
217c0 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72  *));.    if( arr
217d0 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75  ay.tbl==0 ) retu
217e0 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64  rn 0;  /* Fail d
217f0 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69  ue to malloc fai
21800 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61  lure */.    arra
21810 79 2e 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a  y.ht = (x1node**
21820 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a  )&(array.tbl[siz
21830 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e]);.    for(i=0
21840 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61  ; i<size; i++) a
21850 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a  rray.ht[i] = 0;.
21860 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78      for(i=0; i<x
21870 31 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b  1a->count; i++){
21880 0a 20 20 20 20 20 20 78 31 6e 6f 64 65 20 2a 6f  .      x1node *o
21890 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20  ldnp, *newnp;.  
218a0 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 31      oldnp = &(x1
218b0 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  a->tbl[i]);.    
218c0 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c    h = strhash(ol
218d0 64 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 73 69  dnp->data) & (si
218e0 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77  ze-1);.      new
218f0 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c  np = &(array.tbl
21900 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
21910 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72  array.ht[h] ) ar
21920 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  ray.ht[h]->from 
21930 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29  = &(newnp->next)
21940 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e  ;.      newnp->n
21950 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68  ext = array.ht[h
21960 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  ];.      newnp->
21970 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61  data = oldnp->da
21980 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  ta;.      newnp-
21990 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e  >from = &(array.
219a0 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72  ht[h]);.      ar
219b0 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e  ray.ht[h] = newn
219c0 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65  p;.    }.    fre
219d0 65 28 78 31 61 2d 3e 74 62 6c 29 3b 0a 20 20 20  e(x1a->tbl);.   
219e0 20 2a 78 31 61 20 3d 20 61 72 72 61 79 3b 0a 20   *x1a = array;. 
219f0 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74   }.  /* Insert t
21a00 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20  he new data */. 
21a10 20 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e   h = ph & (x1a->
21a20 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
21a30 26 28 78 31 61 2d 3e 74 62 6c 5b 78 31 61 2d 3e  &(x1a->tbl[x1a->
21a40 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d  count++]);.  np-
21a50 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20  >data = data;.  
21a60 69 66 28 20 78 31 61 2d 3e 68 74 5b 68 5d 20 29  if( x1a->ht[h] )
21a70 20 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f   x1a->ht[h]->fro
21a80 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b  m = &(np->next);
21a90 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 31  .  np->next = x1
21aa0 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 31 61 2d  a->ht[h];.  x1a-
21ab0 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e  >ht[h] = np;.  n
21ac0 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 31 61 2d  p->from = &(x1a-
21ad0 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72  >ht[h]);.  retur
21ae0 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  n 1;.}../* Retur
21af0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  n a pointer to d
21b00 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ata assigned to 
21b10 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20  the given key.  
21b20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69  Return NULL.** i
21b30 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a  f no such key. *
21b40 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74  /.const char *St
21b50 72 73 61 66 65 5f 66 69 6e 64 28 63 6f 6e 73 74  rsafe_find(const
21b60 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20   char *key).{.  
21b70 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 78 31  unsigned h;.  x1
21b80 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28  node *np;..  if(
21b90 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x1a==0 ) return
21ba0 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73   0;.  h = strhas
21bb0 68 28 6b 65 79 29 20 26 20 28 78 31 61 2d 3e 73  h(key) & (x1a->s
21bc0 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
21bd0 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  1a->ht[h];.  whi
21be0 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
21bf0 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74  ( strcmp(np->dat
21c00 61 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61  a,key)==0 ) brea
21c10 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e  k;.    np = np->
21c20 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  next;.  }.  retu
21c30 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61  rn np ? np->data
21c40 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75   : 0;.}../* Retu
21c50 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
21c60 74 68 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f 72  the (terminal or
21c70 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73 79   nonterminal) sy
21c80 6d 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72 65  mbol "x"..** Cre
21c90 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c  ate a new symbol
21ca0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
21cb0 66 69 72 73 74 20 74 69 6d 65 20 22 78 22 20 68  first time "x" h
21cc0 61 73 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a 2f  as been seen..*/
21cd0 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
21ce0 53 79 6d 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73 74  Symbol_new(const
21cf0 20 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20 73 74   char *x).{.  st
21d00 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
21d10 0a 0a 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f  ..  sp = Symbol_
21d20 66 69 6e 64 28 78 29 3b 0a 20 20 69 66 28 20 73  find(x);.  if( s
21d30 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 70 20 3d  p==0 ){.    sp =
21d40 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20   (struct symbol 
21d50 2a 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65  *)calloc(1, size
21d60 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
21d70 29 20 29 3b 0a 20 20 20 20 4d 65 6d 6f 72 79 43  ) );.    MemoryC
21d80 68 65 63 6b 28 73 70 29 3b 0a 20 20 20 20 73 70  heck(sp);.    sp
21d90 2d 3e 6e 61 6d 65 20 3d 20 53 74 72 73 61 66 65  ->name = Strsafe
21da0 28 78 29 3b 0a 20 20 20 20 73 70 2d 3e 74 79 70  (x);.    sp->typ
21db0 65 20 3d 20 69 73 75 70 70 65 72 28 2a 78 29 20  e = isupper(*x) 
21dc0 3f 20 54 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e  ? TERMINAL : NON
21dd0 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 73 70  TERMINAL;.    sp
21de0 2d 3e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20  ->rule = 0;.    
21df0 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30  sp->fallback = 0
21e00 3b 0a 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d  ;.    sp->prec =
21e10 20 2d 31 3b 0a 20 20 20 20 73 70 2d 3e 61 73 73   -1;.    sp->ass
21e20 6f 63 20 3d 20 55 4e 4b 3b 0a 20 20 20 20 73 70  oc = UNK;.    sp
21e30 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 30 3b 0a  ->firstset = 0;.
21e40 20 20 20 20 73 70 2d 3e 6c 61 6d 62 64 61 20 3d      sp->lambda =
21e50 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20   LEMON_FALSE;.  
21e60 20 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72    sp->destructor
21e70 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 65   = 0;.    sp->de
21e80 73 74 4c 69 6e 65 6e 6f 20 3d 20 30 3b 0a 20 20  stLineno = 0;.  
21e90 20 20 73 70 2d 3e 64 61 74 61 74 79 70 65 20 3d    sp->datatype =
21ea0 20 30 3b 0a 20 20 20 20 73 70 2d 3e 75 73 65 43   0;.    sp->useC
21eb0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 53 79 6d 62  nt = 0;.    Symb
21ec0 6f 6c 5f 69 6e 73 65 72 74 28 73 70 2c 73 70 2d  ol_insert(sp,sp-
21ed0 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 70  >name);.  }.  sp
21ee0 2d 3e 75 73 65 43 6e 74 2b 2b 3b 0a 20 20 72 65  ->useCnt++;.  re
21ef0 74 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a 20 43  turn sp;.}../* C
21f00 6f 6d 70 61 72 65 20 74 77 6f 20 73 79 6d 62 6f  ompare two symbo
21f10 6c 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70  ls for sorting p
21f20 75 72 70 6f 73 65 73 2e 20 20 52 65 74 75 72 6e  urposes.  Return
21f30 20 6e 65 67 61 74 69 76 65 2c 0a 2a 2a 20 7a 65   negative,.** ze
21f40 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
21f50 69 66 20 61 20 69 73 20 6c 65 73 73 20 74 68 65  if a is less the
21f60 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  n, equal to, or 
21f70 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20  greater.** than 
21f80 62 2e 0a 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c 73  b..**.** Symbols
21f90 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
21fa0 20 75 70 70 65 72 20 63 61 73 65 20 6c 65 74 74   upper case lett
21fb0 65 72 73 20 28 74 65 72 6d 69 6e 61 6c 73 20 6f  ers (terminals o
21fc0 72 20 74 6f 6b 65 6e 73 29 0a 2a 2a 20 6d 75 73  r tokens).** mus
21fd0 74 20 73 6f 72 74 20 62 65 66 6f 72 65 20 73 79  t sort before sy
21fe0 6d 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69 6e  mbols that begin
21ff0 20 77 69 74 68 20 6c 6f 77 65 72 20 63 61 73 65   with lower case
22000 20 6c 65 74 74 65 72 73 0a 2a 2a 20 28 6e 6f 6e   letters.** (non
22010 2d 74 65 72 6d 69 6e 61 6c 73 29 2e 20 20 41 6e  -terminals).  An
22020 64 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  d MULTITERMINAL 
22030 73 79 6d 62 6f 6c 73 20 28 63 72 65 61 74 65 64  symbols (created
22040 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 25 74   using the.** %t
22050 6f 6b 65 6e 5f 63 6c 61 73 73 20 64 69 72 65 63  oken_class direc
22060 74 69 76 65 29 20 6d 75 73 74 20 73 6f 72 74 20  tive) must sort 
22070 61 74 20 74 68 65 20 76 65 72 79 20 65 6e 64 2e  at the very end.
22080 20 4f 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20 74   Other than.** t
22090 68 61 74 2c 20 74 68 65 20 6f 72 64 65 72 20 64  hat, the order d
220a0 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 0a  oes not matter..
220b0 2a 2a 0a 2a 2a 20 57 65 20 66 69 6e 64 20 65 78  **.** We find ex
220c0 70 65 72 69 6d 65 6e 74 61 6c 6c 79 20 74 68 61  perimentally tha
220d0 74 20 6c 65 61 76 69 6e 67 20 74 68 65 20 73 79  t leaving the sy
220e0 6d 62 6f 6c 73 20 69 6e 20 74 68 65 69 72 20 6f  mbols in their o
220f0 72 69 67 69 6e 61 6c 0a 2a 2a 20 6f 72 64 65 72  riginal.** order
22100 20 28 74 68 65 20 6f 72 64 65 72 20 74 68 65 79   (the order they
22110 20 61 70 70 65 61 72 65 64 20 69 6e 20 74 68 65   appeared in the
22120 20 67 72 61 6d 6d 61 72 20 66 69 6c 65 29 20 67   grammar file) g
22130 69 76 65 73 20 74 68 65 0a 2a 2a 20 73 6d 61 6c  ives the.** smal
22140 6c 65 73 74 20 70 61 72 73 65 72 20 74 61 62 6c  lest parser tabl
22150 65 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f  es in SQLite..*/
22160 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28  .int Symbolcmpp(
22170 63 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 61 2c 20  const void *_a, 
22180 63 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 62 29 0a  const void *_b).
22190 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  {.  const struct
221a0 20 73 79 6d 62 6f 6c 20 2a 61 20 3d 20 2a 28 63   symbol *a = *(c
221b0 6f 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d 62  onst struct symb
221c0 6f 6c 20 2a 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e  ol **) _a;.  con
221d0 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  st struct symbol
221e0 20 2a 62 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74   *b = *(const st
221f0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20  ruct symbol **) 
22200 5f 62 3b 0a 20 20 69 6e 74 20 69 31 20 3d 20 61  _b;.  int i1 = a
22210 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
22220 4d 49 4e 41 4c 20 3f 20 33 20 3a 20 61 2d 3e 6e  MINAL ? 3 : a->n
22230 61 6d 65 5b 30 5d 3e 27 5a 27 20 3f 20 32 20 3a  ame[0]>'Z' ? 2 :
22240 20 31 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 62   1;.  int i2 = b
22250 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
22260 4d 49 4e 41 4c 20 3f 20 33 20 3a 20 62 2d 3e 6e  MINAL ? 3 : b->n
22270 61 6d 65 5b 30 5d 3e 27 5a 27 20 3f 20 32 20 3a  ame[0]>'Z' ? 2 :
22280 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 31 3d   1;.  return i1=
22290 3d 69 32 20 3f 20 61 2d 3e 69 6e 64 65 78 20 2d  =i2 ? a->index -
222a0 20 62 2d 3e 69 6e 64 65 78 20 3a 20 69 31 20 2d   b->index : i1 -
222b0 20 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65   i2;.}../* There
222c0 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
222d0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
222e0 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  g structure for 
222f0 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74  each.** associat
22300 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
22310 65 20 22 78 32 22 2e 0a 2a 2f 0a 73 74 72 75 63  e "x2"..*/.struc
22320 74 20 73 5f 78 32 20 7b 0a 20 20 69 6e 74 20 73  t s_x2 {.  int s
22330 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
22340 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
22350 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c   of available sl
22360 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ots. */.        
22370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22380 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61    /*   Must be a
22390 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61   power of 2 grea
223a0 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20  ter than or */. 
223b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223c0 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71           /*   eq
223d0 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e  ual to 1 */.  in
223e0 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  t count;        
223f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22400 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f  of currently slo
22410 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73  ts filled */.  s
22420 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a  truct s_x2node *
22430 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  tbl;  /* The dat
22440 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f  a stored here */
22450 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f  .  struct s_x2no
22460 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73  de **ht;  /* Has
22470 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b  h table for look
22480 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68  ups */.};../* Th
22490 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
224a0 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
224b0 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20  cture for every 
224c0 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20  data element.** 
224d0 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76  in an associativ
224e0 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
224f0 22 78 32 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  "x2"..*/.typedef
22500 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65   struct s_x2node
22510 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62   {.  struct symb
22520 6f 6c 20 2a 64 61 74 61 3b 20 20 20 20 20 2f 2a  ol *data;     /*
22530 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 63   The data */.  c
22540 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 3b 20  onst char *key; 
22550 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b          /* The k
22560 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ey */.  struct s
22570 5f 78 32 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20  _x2node *next;  
22580 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77   /* Next entry w
22590 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73  ith the same has
225a0 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  h */.  struct s_
225b0 78 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20  x2node **from;  
225c0 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b  /* Previous link
225d0 20 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f   */.} x2node;../
225e0 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  * There is only 
225f0 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
22600 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68  the array, which
22610 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   is the followin
22620 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  g */.static stru
22630 63 74 20 73 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f  ct s_x2 *x2a;../
22640 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
22650 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
22660 61 79 20 2a 2f 0a 76 6f 69 64 20 53 79 6d 62 6f  ay */.void Symbo
22670 6c 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20  l_init(){.  if( 
22680 78 32 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  x2a ) return;.  
22690 78 32 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f  x2a = (struct s_
226a0 78 32 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  x2*)malloc( size
226b0 6f 66 28 73 74 72 75 63 74 20 73 5f 78 32 29 20  of(struct s_x2) 
226c0 29 3b 0a 20 20 69 66 28 20 78 32 61 20 29 7b 0a  );.  if( x2a ){.
226d0 20 20 20 20 78 32 61 2d 3e 73 69 7a 65 20 3d 20      x2a->size = 
226e0 31 32 38 3b 0a 20 20 20 20 78 32 61 2d 3e 63 6f  128;.    x2a->co
226f0 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 32 61  unt = 0;.    x2a
22700 2d 3e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a  ->tbl = (x2node*
22710 29 63 61 6c 6c 6f 63 28 31 32 38 2c 20 73 69 7a  )calloc(128, siz
22720 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69  eof(x2node) + si
22730 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 3b 0a  zeof(x2node*));.
22740 20 20 20 20 69 66 28 20 78 32 61 2d 3e 74 62 6c      if( x2a->tbl
22750 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65  ==0 ){.      fre
22760 65 28 78 32 61 29 3b 0a 20 20 20 20 20 20 78 32  e(x2a);.      x2
22770 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
22780 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
22790 20 20 20 20 20 78 32 61 2d 3e 68 74 20 3d 20 28       x2a->ht = (
227a0 78 32 6e 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e  x2node**)&(x2a->
227b0 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20  tbl[128]);.     
227c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b   for(i=0; i<128;
227d0 20 69 2b 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d   i++) x2a->ht[i]
227e0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
227f0 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  }./* Insert a ne
22800 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
22810 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  e array.  Return
22820 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73   TRUE if success
22830 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61  ful..** Prior da
22840 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ta with the same
22850 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72   key is NOT over
22860 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53  written */.int S
22870 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 74 72  ymbol_insert(str
22880 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61  uct symbol *data
22890 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65  , const char *ke
228a0 79 29 0a 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e  y).{.  x2node *n
228b0 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b  p;.  unsigned h;
228c0 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a  .  unsigned ph;.
228d0 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20  .  if( x2a==0 ) 
228e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
228f0 20 73 74 72 68 61 73 68 28 6b 65 79 29 3b 0a 20   strhash(key);. 
22900 20 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e   h = ph & (x2a->
22910 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
22920 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x2a->ht[h];.  wh
22930 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
22940 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65  f( strcmp(np->ke
22950 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  y,key)==0 ){.   
22960 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
22970 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  g entry with the
22980 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75   same key is fou
22990 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  nd. */.      /* 
229a0 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65  Fail because ove
229b0 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c  rwrite is not al
229c0 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  lows. */.      r
229d0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
229e0 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
229f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 32 61 2d  ;.  }.  if( x2a-
22a00 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a  >count>=x2a->siz
22a10 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64  e ){.    /* Need
22a20 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
22a30 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a  h table bigger *
22a40 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65  /.    int i,size
22a50 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78  ;.    struct s_x
22a60 32 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72  2 array;.    arr
22a70 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d  ay.size = size =
22a80 20 78 32 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20   x2a->size*2;.  
22a90 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20    array.count = 
22aa0 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20  x2a->count;.    
22ab0 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 32 6e  array.tbl = (x2n
22ac0 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 73 69 7a 65  ode*)calloc(size
22ad0 2c 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29  , sizeof(x2node)
22ae0 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65   + sizeof(x2node
22af0 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72  *));.    if( arr
22b00 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75  ay.tbl==0 ) retu
22b10 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64  rn 0;  /* Fail d
22b20 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69  ue to malloc fai
22b30 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61  lure */.    arra
22b40 79 2e 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a  y.ht = (x2node**
22b50 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a  )&(array.tbl[siz
22b60 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e]);.    for(i=0
22b70 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61  ; i<size; i++) a
22b80 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a  rray.ht[i] = 0;.
22b90 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78      for(i=0; i<x
22ba0 32 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b  2a->count; i++){
22bb0 0a 20 20 20 20 20 20 78 32 6e 6f 64 65 20 2a 6f  .      x2node *o
22bc0 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20  ldnp, *newnp;.  
22bd0 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 32      oldnp = &(x2
22be0 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  a->tbl[i]);.    
22bf0 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c    h = strhash(ol
22c00 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a  dnp->key) & (siz
22c10 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
22c20 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
22c30 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
22c40 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
22c50 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
22c60 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
22c70 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
22c80 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
22c90 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b  ;.      newnp->k
22ca0 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b  ey = oldnp->key;
22cb0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
22cc0 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
22cd0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
22ce0 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
22cf0 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
22d00 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
22d10 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
22d20 78 32 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x2a->tbl);.    *
22d30 78 32 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x2a = array;.  }
22d40 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
22d50 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
22d60 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69   = ph & (x2a->si
22d70 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
22d80 78 32 61 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f  x2a->tbl[x2a->co
22d90 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b  unt++]);.  np->k
22da0 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e  ey = key;.  np->
22db0 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
22dc0 66 28 20 78 32 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x2a->ht[h] ) 
22dd0 78 32 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x2a->ht[h]->from
22de0 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
22df0 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 32 61    np->next = x2a
22e00 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e  ->ht[h];.  x2a->
22e10 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
22e20 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 32 61 2d 3e  ->from = &(x2a->
22e30 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
22e40 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
22e50 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
22e60 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
22e70 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
22e80 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
22e90 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
22ea0 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
22eb0 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73  Symbol_find(cons
22ec0 74 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20  t char *key).{. 
22ed0 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 78   unsigned h;.  x
22ee0 32 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  2node *np;..  if
22ef0 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x2a==0 ) retur
22f00 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61  n 0;.  h = strha
22f10 73 68 28 6b 65 79 29 20 26 20 28 78 32 61 2d 3e  sh(key) & (x2a->
22f20 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
22f30 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x2a->ht[h];.  wh
22f40 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
22f50 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65  f( strcmp(np->ke
22f60 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61  y,key)==0 ) brea
22f70 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e  k;.    np = np->
22f80 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  next;.  }.  retu
22f90 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61  rn np ? np->data
22fa0 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75   : 0;.}../* Retu
22fb0 72 6e 20 74 68 65 20 6e 2d 74 68 20 64 61 74 61  rn the n-th data
22fc0 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
22fd0 66 20 6e 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f n is out of ra
22fe0 6e 67 65 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  nge. */.struct s
22ff0 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74  ymbol *Symbol_Nt
23000 68 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 73 74 72  h(int n).{.  str
23010 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61  uct symbol *data
23020 3b 0a 20 20 69 66 28 20 78 32 61 20 26 26 20 6e  ;.  if( x2a && n
23030 3e 30 20 26 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f  >0 && n<=x2a->co
23040 75 6e 74 20 29 7b 0a 20 20 20 20 64 61 74 61 20  unt ){.    data 
23050 3d 20 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e  = x2a->tbl[n-1].
23060 64 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  data;.  }else{. 
23070 20 20 20 64 61 74 61 20 3d 20 30 3b 0a 20 20 7d     data = 0;.  }
23080 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61 3b 0a  .  return data;.
23090 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  }../* Return the
230a0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
230b0 61 79 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c  ay */.int Symbol
230c0 5f 63 6f 75 6e 74 28 29 0a 7b 0a 20 20 72 65 74  _count().{.  ret
230d0 75 72 6e 20 78 32 61 20 3f 20 78 32 61 2d 3e 63  urn x2a ? x2a->c
230e0 6f 75 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  ount : 0;.}../* 
230f0 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20  Return an array 
23100 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  of pointers to a
23110 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  ll data in the t
23120 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72  able..** The arr
23130 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ay is obtained f
23140 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74  rom malloc.  Ret
23150 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f  urn NULL if memo
23160 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
23170 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66   problems, or if
23180 20 74 68 65 20 61 72 72 61 79 20 69 73 20 65 6d   the array is em
23190 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  pty. */.struct s
231a0 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61  ymbol **Symbol_a
231b0 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72  rrayof().{.  str
231c0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 72 72  uct symbol **arr
231d0 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65  ay;.  int i,size
231e0 3b 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29  ;.  if( x2a==0 )
231f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a   return 0;.  siz
23200 65 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a  e = x2a->count;.
23210 20 20 61 72 72 61 79 20 3d 20 28 73 74 72 75 63    array = (struc
23220 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 63 61 6c 6c  t symbol **)call
23230 6f 63 28 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28  oc(size, sizeof(
23240 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29  struct symbol *)
23250 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20 29  );.  if( array )
23260 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
23270 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
23280 79 5b 69 5d 20 3d 20 78 32 61 2d 3e 74 62 6c 5b  y[i] = x2a->tbl[
23290 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72  i].data;.  }.  r
232a0 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a  eturn array;.}..
232b0 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 63  /* Compare two c
232c0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f  onfigurations */
232d0 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 63  .int Configcmp(c
232e0 6f 6e 73 74 20 63 68 61 72 20 2a 5f 61 2c 63 6f  onst char *_a,co
232f0 6e 73 74 20 63 68 61 72 20 2a 5f 62 29 0a 7b 0a  nst char *_b).{.
23300 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63    const struct c
23310 6f 6e 66 69 67 20 2a 61 20 3d 20 28 73 74 72 75  onfig *a = (stru
23320 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 5f 61 3b  ct config *) _a;
23330 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
23340 63 6f 6e 66 69 67 20 2a 62 20 3d 20 28 73 74 72  config *b = (str
23350 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 5f 62  uct config *) _b
23360 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 78 20 3d  ;.  int x;.  x =
23370 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20   a->rp->index - 
23380 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20  b->rp->index;.  
23390 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 61  if( x==0 ) x = a
233a0 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a  ->dot - b->dot;.
233b0 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f    return x;.}../
233c0 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74  * Compare two st
233d0 61 74 65 73 20 2a 2f 0a 50 52 49 56 41 54 45 20  ates */.PRIVATE 
233e0 69 6e 74 20 73 74 61 74 65 63 6d 70 28 73 74 72  int statecmp(str
233f0 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 2c 20 73  uct config *a, s
23400 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 29  truct config *b)
23410 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 66  .{.  int rc;.  f
23420 6f 72 28 72 63 3d 30 3b 20 72 63 3d 3d 30 20 26  or(rc=0; rc==0 &
23430 26 20 61 20 26 26 20 62 3b 20 20 61 3d 61 2d 3e  & a && b;  a=a->
23440 62 70 2c 20 62 3d 62 2d 3e 62 70 29 7b 0a 20 20  bp, b=b->bp){.  
23450 20 20 72 63 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e    rc = a->rp->in
23460 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64  dex - b->rp->ind
23470 65 78 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ex;.    if( rc==
23480 30 20 29 20 72 63 20 3d 20 61 2d 3e 64 6f 74 20  0 ) rc = a->dot 
23490 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 7d 0a 20 20  - b->dot;.  }.  
234a0 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
234b0 20 69 66 28 20 61 20 29 20 72 63 20 3d 20 31 3b   if( a ) rc = 1;
234c0 0a 20 20 20 20 69 66 28 20 62 20 29 20 72 63 20  .    if( b ) rc 
234d0 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
234e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 48 61 73  rn rc;.}../* Has
234f0 68 20 61 20 73 74 61 74 65 20 2a 2f 0a 50 52 49  h a state */.PRI
23500 56 41 54 45 20 75 6e 73 69 67 6e 65 64 20 73 74  VATE unsigned st
23510 61 74 65 68 61 73 68 28 73 74 72 75 63 74 20 63  atehash(struct c
23520 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20 20 75 6e  onfig *a).{.  un
23530 73 69 67 6e 65 64 20 68 3d 30 3b 0a 20 20 77 68  signed h=0;.  wh
23540 69 6c 65 28 20 61 20 29 7b 0a 20 20 20 20 68 20  ile( a ){.    h 
23550 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d  = h*571 + a->rp-
23560 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64  >index*37 + a->d
23570 6f 74 3b 0a 20 20 20 20 61 20 3d 20 61 2d 3e 62  ot;.    a = a->b
23580 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
23590 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  h;.}../* Allocat
235a0 65 20 61 20 6e 65 77 20 73 74 61 74 65 20 73 74  e a new state st
235b0 72 75 63 74 75 72 65 20 2a 2f 0a 73 74 72 75 63  ructure */.struc
235c0 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e  t state *State_n
235d0 65 77 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  ew().{.  struct 
235e0 73 74 61 74 65 20 2a 6e 65 77 73 74 61 74 65 3b  state *newstate;
235f0 0a 20 20 6e 65 77 73 74 61 74 65 20 3d 20 28 73  .  newstate = (s
23600 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 63 61  truct state *)ca
23610 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28 73  lloc(1, sizeof(s
23620 74 72 75 63 74 20 73 74 61 74 65 29 20 29 3b 0a  truct state) );.
23630 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 6e 65    MemoryCheck(ne
23640 77 73 74 61 74 65 29 3b 0a 20 20 72 65 74 75 72  wstate);.  retur
23650 6e 20 6e 65 77 73 74 61 74 65 3b 0a 7d 0a 0a 2f  n newstate;.}../
23660 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
23670 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
23680 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
23690 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61  re for each.** a
236a0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
236b0 20 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a   of type "x3"..*
236c0 2f 0a 73 74 72 75 63 74 20 73 5f 78 33 20 7b 0a  /.struct s_x3 {.
236d0 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
236e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
236f0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
23700 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20  able slots. */. 
23710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23720 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75           /*   Mu
23730 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
23740 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
23750 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23770 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20  /*   equal to 1 
23780 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20  */.  int count; 
23790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
237a0 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  Number of curren
237b0 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64  tly slots filled
237c0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
237d0 33 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20  3node *tbl;  /* 
237e0 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  The data stored 
237f0 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  here */.  struct
23800 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 68 74 3b 20   s_x3node **ht; 
23810 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66   /* Hash table f
23820 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b  or lookups */.};
23830 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
23840 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
23850 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
23860 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d   every data elem
23870 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73  ent.** in an ass
23880 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
23890 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a  f type "x3"..*/.
238a0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
238b0 5f 78 33 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75  _x3node {.  stru
238c0 63 74 20 73 74 61 74 65 20 2a 64 61 74 61 3b 20  ct state *data; 
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238e0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
238f0 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
23900 2a 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  *key;           
23910 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b          /* The k
23920 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ey */.  struct s
23930 5f 78 33 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20  _x3node *next;  
23940 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77   /* Next entry w
23950 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73  ith the same has
23960 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  h */.  struct s_
23970 78 33 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20  x3node **from;  
23980 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b  /* Previous link
23990 20 2a 2f 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f   */.} x3node;../
239a0 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  * There is only 
239b0 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
239c0 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68  the array, which
239d0 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   is the followin
239e0 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  g */.static stru
239f0 63 74 20 73 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f  ct s_x3 *x3a;../
23a00 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
23a10 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
23a20 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74 61 74 65  ay */.void State
23a30 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78  _init(){.  if( x
23a40 33 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  3a ) return;.  x
23a50 33 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78  3a = (struct s_x
23a60 33 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  3*)malloc( sizeo
23a70 66 28 73 74 72 75 63 74 20 73 5f 78 33 29 20 29  f(struct s_x3) )
23a80 3b 0a 20 20 69 66 28 20 78 33 61 20 29 7b 0a 20  ;.  if( x3a ){. 
23a90 20 20 20 78 33 61 2d 3e 73 69 7a 65 20 3d 20 31     x3a->size = 1
23aa0 32 38 3b 0a 20 20 20 20 78 33 61 2d 3e 63 6f 75  28;.    x3a->cou
23ab0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 33 61 2d  nt = 0;.    x3a-
23ac0 3e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29  >tbl = (x3node*)
23ad0 63 61 6c 6c 6f 63 28 31 32 38 2c 20 73 69 7a 65  calloc(128, size
23ae0 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x3node) + siz
23af0 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 3b 0a 20  eof(x3node*));. 
23b00 20 20 20 69 66 28 20 78 33 61 2d 3e 74 62 6c 3d     if( x3a->tbl=
23b10 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  =0 ){.      free
23b20 28 78 33 61 29 3b 0a 20 20 20 20 20 20 78 33 61  (x3a);.      x3a
23b30 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
23b40 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
23b50 20 20 20 20 78 33 61 2d 3e 68 74 20 3d 20 28 78      x3a->ht = (x
23b60 33 6e 6f 64 65 2a 2a 29 26 28 78 33 61 2d 3e 74  3node**)&(x3a->t
23b70 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20  bl[128]);.      
23b80 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20  for(i=0; i<128; 
23b90 69 2b 2b 29 20 78 33 61 2d 3e 68 74 5b 69 5d 20  i++) x3a->ht[i] 
23ba0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
23bb0 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  ./* Insert a new
23bc0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
23bd0 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
23be0 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66  TRUE if successf
23bf0 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74  ul..** Prior dat
23c00 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  a with the same 
23c10 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77  key is NOT overw
23c20 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74  ritten */.int St
23c30 61 74 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63  ate_insert(struc
23c40 74 20 73 74 61 74 65 20 2a 64 61 74 61 2c 20 73  t state *data, s
23c50 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65  truct config *ke
23c60 79 29 0a 7b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e  y).{.  x3node *n
23c70 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b  p;.  unsigned h;
23c80 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a  .  unsigned ph;.
23c90 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20  .  if( x3a==0 ) 
23ca0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
23cb0 20 73 74 61 74 65 68 61 73 68 28 6b 65 79 29 3b   statehash(key);
23cc0 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 33 61  .  h = ph & (x3a
23cd0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
23ce0 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x3a->ht[h];.  
23cf0 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
23d00 20 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e 70   if( statecmp(np
23d10 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b  ->key,key)==0 ){
23d20 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69  .      /* An exi
23d30 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68  sting entry with
23d40 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
23d50 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20   found. */.     
23d60 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65   /* Fail because
23d70 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f   overwrite is no
23d80 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20  t allows. */.   
23d90 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
23da0 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e   }.    np = np->
23db0 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  next;.  }.  if( 
23dc0 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61 2d  x3a->count>=x3a-
23dd0 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  >size ){.    /* 
23de0 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  Need to make the
23df0 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67   hash table bigg
23e00 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  er */.    int i,
23e10 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74  size;.    struct
23e20 20 73 5f 78 33 20 61 72 72 61 79 3b 0a 20 20 20   s_x3 array;.   
23e30 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69   array.size = si
23e40 7a 65 20 3d 20 78 33 61 2d 3e 73 69 7a 65 2a 32  ze = x3a->size*2
23e50 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e  ;.    array.coun
23e60 74 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a  t = x3a->count;.
23e70 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20      array.tbl = 
23e80 28 78 33 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28  (x3node*)calloc(
23e90 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28 78 33 6e  size, sizeof(x3n
23ea0 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 33  ode) + sizeof(x3
23eb0 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28  node*));.    if(
23ec0 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20   array.tbl==0 ) 
23ed0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61  return 0;  /* Fa
23ee0 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63  il due to malloc
23ef0 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20   failure */.    
23f00 61 72 72 61 79 2e 68 74 20 3d 20 28 78 33 6e 6f  array.ht = (x3no
23f10 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c  de**)&(array.tbl
23f20 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72  [size]);.    for
23f30 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
23f40 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d  +) array.ht[i] =
23f50 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
23f60 20 69 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b 20 69   i<x3a->count; i
23f70 2b 2b 29 7b 0a 20 20 20 20 20 20 78 33 6e 6f 64  ++){.      x3nod
23f80 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70  e *oldnp, *newnp
23f90 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20  ;.      oldnp = 
23fa0 26 28 78 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a  &(x3a->tbl[i]);.
23fb0 20 20 20 20 20 20 68 20 3d 20 73 74 61 74 65 68        h = stateh
23fc0 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20  ash(oldnp->key) 
23fd0 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20  & (size-1);.    
23fe0 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61    newnp = &(arra
23ff0 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  y.tbl[i]);.     
24000 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d   if( array.ht[h]
24010 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e   ) array.ht[h]->
24020 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e  from = &(newnp->
24030 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77  next);.      new
24040 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79  np->next = array
24050 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65  .ht[h];.      ne
24060 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70  wnp->key = oldnp
24070 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77  ->key;.      new
24080 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70  np->data = oldnp
24090 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65  ->data;.      ne
240a0 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72  wnp->from = &(ar
240b0 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20  ray.ht[h]);.    
240c0 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20    array.ht[h] = 
240d0 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20  newnp;.    }.   
240e0 20 66 72 65 65 28 78 33 61 2d 3e 74 62 6c 29 3b   free(x3a->tbl);
240f0 0a 20 20 20 20 2a 78 33 61 20 3d 20 61 72 72 61  .    *x3a = arra
24100 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65  y;.  }.  /* Inse
24110 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20  rt the new data 
24120 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  */.  h = ph & (x
24130 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  3a->size-1);.  n
24140 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 78  p = &(x3a->tbl[x
24150 33 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20  3a->count++]);. 
24160 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a   np->key = key;.
24170 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74    np->data = dat
24180 61 3b 0a 20 20 69 66 28 20 78 33 61 2d 3e 68 74  a;.  if( x3a->ht
24190 5b 68 5d 20 29 20 78 33 61 2d 3e 68 74 5b 68 5d  [h] ) x3a->ht[h]
241a0 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e  ->from = &(np->n
241b0 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74  ext);.  np->next
241c0 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x3a->ht[h];. 
241d0 20 78 33 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70   x3a->ht[h] = np
241e0 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26  ;.  np->from = &
241f0 28 78 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20  (x3a->ht[h]);.  
24200 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20  return 1;.}../* 
24210 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
24220 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65   to data assigne
24230 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b  d to the given k
24240 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ey.  Return NULL
24250 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b  .** if no such k
24260 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74  ey. */.struct st
24270 61 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28  ate *State_find(
24280 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b  struct config *k
24290 65 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ey).{.  unsigned
242a0 20 68 3b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70   h;.  x3node *np
242b0 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20  ;..  if( x3a==0 
242c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20  ) return 0;.  h 
242d0 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65 79 29  = statehash(key)
242e0 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29   & (x3a->size-1)
242f0 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74  ;.  np = x3a->ht
24300 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
24310 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74   ){.    if( stat
24320 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79  ecmp(np->key,key
24330 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
24340 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
24350 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70  .  }.  return np
24360 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
24370 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e  .}../* Return an
24380 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
24390 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69  rs to all data i
243a0 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  n the table..** 
243b0 54 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74  The array is obt
243c0 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
243d0 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  c.  Return NULL 
243e0 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  if memory alloca
243f0 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73  tion.** problems
24400 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61  , or if the arra
24410 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73  y is empty. */.s
24420 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74  truct state **St
24430 61 74 65 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a  ate_arrayof().{.
24440 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
24450 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c  *array;.  int i,
24460 73 69 7a 65 3b 0a 20 20 69 66 28 20 78 33 61 3d  size;.  if( x3a=
24470 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
24480 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e 63 6f 75   size = x3a->cou
24490 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20 28 73  nt;.  array = (s
244a0 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 29 63  truct state **)c
244b0 61 6c 6c 6f 63 28 73 69 7a 65 2c 20 73 69 7a 65  alloc(size, size
244c0 6f 66 28 73 74 72 75 63 74 20 73 74 61 74 65 20  of(struct state 
244d0 2a 29 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79  *));.  if( array
244e0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
244f0 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72   i<size; i++) ar
24500 72 61 79 5b 69 5d 20 3d 20 78 33 61 2d 3e 74 62  ray[i] = x3a->tb
24510 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20  l[i].data;.  }. 
24520 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d   return array;.}
24530 0a 0a 2f 2a 20 48 61 73 68 20 61 20 63 6f 6e 66  ../* Hash a conf
24540 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49  iguration */.PRI
24550 56 41 54 45 20 75 6e 73 69 67 6e 65 64 20 63 6f  VATE unsigned co
24560 6e 66 69 67 68 61 73 68 28 73 74 72 75 63 74 20  nfighash(struct 
24570 63 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20 20 75  config *a).{.  u
24580 6e 73 69 67 6e 65 64 20 68 3d 30 3b 0a 20 20 68  nsigned h=0;.  h
24590 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70   = h*571 + a->rp
245a0 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e  ->index*37 + a->
245b0 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b  dot;.  return h;
245c0 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  .}../* There is 
245d0 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
245e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
245f0 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
24600 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20  .** associative 
24610 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
24620 34 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f  4"..*/.struct s_
24630 78 34 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  x4 {.  int size;
24640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24650 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
24660 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e  available slots.
24670 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
24680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24690 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77     Must be a pow
246a0 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20  er of 2 greater 
246b0 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20  than or */.     
246c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246d0 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20       /*   equal 
246e0 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  to 1 */.  int co
246f0 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  unt;            
24700 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
24710 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66  urrently slots f
24720 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  illed */.  struc
24730 74 20 73 5f 78 34 6e 6f 64 65 20 2a 74 62 6c 3b  t s_x4node *tbl;
24740 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74    /* The data st
24750 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73  ored here */.  s
24760 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a  truct s_x4node *
24770 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61  *ht;  /* Hash ta
24780 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20  ble for lookups 
24790 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  */.};../* There 
247a0 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
247b0 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
247c0 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  e for every data
247d0 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61   element.** in a
247e0 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  n associative ar
247f0 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 34 22  ray of type "x4"
24800 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
24810 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 7b 0a 20  uct s_x4node {. 
24820 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
24830 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  data;           
24840 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
24850 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ta */.  struct s
24860 5f 78 34 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20  _x4node *next;  
24870 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77   /* Next entry w
24880 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73  ith the same has
24890 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  h */.  struct s_
248a0 78 34 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20  x4node **from;  
248b0 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b  /* Previous link
248c0 20 2a 2f 0a 7d 20 78 34 6e 6f 64 65 3b 0a 0a 2f   */.} x4node;../
248d0 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  * There is only 
248e0 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
248f0 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68  the array, which
24900 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   is the followin
24910 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  g */.static stru
24920 63 74 20 73 5f 78 34 20 2a 78 34 61 3b 0a 0a 2f  ct s_x4 *x4a;../
24930 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
24940 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
24950 61 79 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  ay */.void Confi
24960 67 74 61 62 6c 65 5f 69 6e 69 74 28 29 7b 0a 20  gtable_init(){. 
24970 20 69 66 28 20 78 34 61 20 29 20 72 65 74 75 72   if( x4a ) retur
24980 6e 3b 0a 20 20 78 34 61 20 3d 20 28 73 74 72 75  n;.  x4a = (stru
24990 63 74 20 73 5f 78 34 2a 29 6d 61 6c 6c 6f 63 28  ct s_x4*)malloc(
249a0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
249b0 5f 78 34 29 20 29 3b 0a 20 20 69 66 28 20 78 34  _x4) );.  if( x4
249c0 61 20 29 7b 0a 20 20 20 20 78 34 61 2d 3e 73 69  a ){.    x4a->si
249d0 7a 65 20 3d 20 36 34 3b 0a 20 20 20 20 78 34 61  ze = 64;.    x4a
249e0 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ->count = 0;.   
249f0 20 78 34 61 2d 3e 74 62 6c 20 3d 20 28 78 34 6e   x4a->tbl = (x4n
24a00 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 36 34 2c 20  ode*)calloc(64, 
24a10 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b  sizeof(x4node) +
24a20 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29   sizeof(x4node*)
24a30 29 3b 0a 20 20 20 20 69 66 28 20 78 34 61 2d 3e  );.    if( x4a->
24a40 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tbl==0 ){.      
24a50 66 72 65 65 28 78 34 61 29 3b 0a 20 20 20 20 20  free(x4a);.     
24a60 20 78 34 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65   x4a = 0;.    }e
24a70 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
24a80 3b 0a 20 20 20 20 20 20 78 34 61 2d 3e 68 74 20  ;.      x4a->ht 
24a90 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 78 34  = (x4node**)&(x4
24aa0 61 2d 3e 74 62 6c 5b 36 34 5d 29 3b 0a 20 20 20  a->tbl[64]);.   
24ab0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 36 34     for(i=0; i<64
24ac0 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69  ; i++) x4a->ht[i
24ad0 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
24ae0 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e  .}./* Insert a n
24af0 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
24b00 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  he array.  Retur
24b10 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73  n TRUE if succes
24b20 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64  sful..** Prior d
24b30 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d  ata with the sam
24b40 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65  e key is NOT ove
24b50 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20  rwritten */.int 
24b60 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65  Configtable_inse
24b70 72 74 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  rt(struct config
24b80 20 2a 64 61 74 61 29 0a 7b 0a 20 20 78 34 6e 6f   *data).{.  x4no
24b90 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e  de *np;.  unsign
24ba0 65 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ed h;.  unsigned
24bb0 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d   ph;..  if( x4a=
24bc0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
24bd0 20 70 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68   ph = confighash
24be0 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68  (data);.  h = ph
24bf0 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29   & (x4a->size-1)
24c00 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74  ;.  np = x4a->ht
24c10 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
24c20 20 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66   ){.    if( Conf
24c30 69 67 63 6d 70 28 28 63 6f 6e 73 74 20 63 68 61  igcmp((const cha
24c40 72 20 2a 29 20 6e 70 2d 3e 64 61 74 61 2c 28 63  r *) np->data,(c
24c50 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 64 61 74  onst char *) dat
24c60 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  a)==0 ){.      /
24c70 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  * An existing en
24c80 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
24c90 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20  e key is found. 
24ca0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  */.      /* Fail
24cb0 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69   because overwri
24cc0 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73  te is not allows
24cd0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
24ce0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 0;.    }.    n
24cf0 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
24d00 7d 0a 20 20 69 66 28 20 78 34 61 2d 3e 63 6f 75  }.  if( x4a->cou
24d10 6e 74 3e 3d 78 34 61 2d 3e 73 69 7a 65 20 29 7b  nt>=x4a->size ){
24d20 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
24d30 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
24d40 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20  ble bigger */.  
24d50 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20    int i,size;.  
24d60 20 20 73 74 72 75 63 74 20 73 5f 78 34 20 61 72    struct s_x4 ar
24d70 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73  ray;.    array.s
24d80 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 34 61  ize = size = x4a
24d90 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72  ->size*2;.    ar
24da0 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 34 61 2d  ray.count = x4a-
24db0 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61  >count;.    arra
24dc0 79 2e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a  y.tbl = (x4node*
24dd0 29 63 61 6c 6c 6f 63 28 73 69 7a 65 2c 20 73 69  )calloc(size, si
24de0 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73  zeof(x4node) + s
24df0 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 3b  izeof(x4node*));
24e00 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74  .    if( array.t
24e10 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  bl==0 ) return 0
24e20 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74  ;  /* Fail due t
24e30 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  o malloc failure
24e40 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74   */.    array.ht
24e50 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 61   = (x4node**)&(a
24e60 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b  rray.tbl[size]);
24e70 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
24e80 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  size; i++) array
24e90 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  .ht[i] = 0;.    
24ea0 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e  for(i=0; i<x4a->
24eb0 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  count; i++){.   
24ec0 20 20 20 78 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70     x4node *oldnp
24ed0 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20  , *newnp;.      
24ee0 6f 6c 64 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74  oldnp = &(x4a->t
24ef0 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20  bl[i]);.      h 
24f00 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 6f 6c 64  = confighash(old
24f10 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 73 69 7a  np->data) & (siz
24f20 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
24f30 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
24f40 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
24f50 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
24f60 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
24f70 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
24f80 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
24f90 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
24fa0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64  ;.      newnp->d
24fb0 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74  ata = oldnp->dat
24fc0 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  a;.      newnp->
24fd0 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68  from = &(array.h
24fe0 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72  t[h]);.      arr
24ff0 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70  ay.ht[h] = newnp
25000 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
25010 28 78 34 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20  (x4a->tbl);.    
25020 2a 78 34 61 20 3d 20 61 72 72 61 79 3b 0a 20 20  *x4a = array;.  
25030 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  }.  /* Insert th
25040 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20  e new data */.  
25050 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73  h = ph & (x4a->s
25060 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26  ize-1);.  np = &
25070 28 78 34 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63  (x4a->tbl[x4a->c
25080 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e  ount++]);.  np->
25090 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
250a0 66 28 20 78 34 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x4a->ht[h] ) 
250b0 78 34 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x4a->ht[h]->from
250c0 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
250d0 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 34 61    np->next = x4a
250e0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e  ->ht[h];.  x4a->
250f0 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
25100 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 34 61 2d 3e  ->from = &(x4a->
25110 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
25120 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
25130 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
25140 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
25150 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
25160 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
25170 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
25180 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
25190 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64  Configtable_find
251a0 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
251b0 6b 65 79 29 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a  key).{.  int h;.
251c0 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20    x4node *np;.. 
251d0 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72 65   if( x4a==0 ) re
251e0 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 63 6f  turn 0;.  h = co
251f0 6e 66 69 67 68 61 73 68 28 6b 65 79 29 20 26 20  nfighash(key) & 
25200 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x4a->size-1);. 
25210 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d   np = x4a->ht[h]
25220 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
25230 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63  .    if( Configc
25240 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  mp((const char *
25250 29 20 6e 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73  ) np->data,(cons
25260 74 20 63 68 61 72 20 2a 29 20 6b 65 79 29 3d 3d  t char *) key)==
25270 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e  0 ) break;.    n
25280 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
25290 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20  }.  return np ? 
252a0 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a  np->data : 0;.}.
252b0 0a 2f 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64  ./* Remove all d
252c0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 74 61 62  ata from the tab
252d0 6c 65 2e 20 20 50 61 73 73 20 65 61 63 68 20 64  le.  Pass each d
252e0 61 74 61 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ata to the funct
252f0 69 6f 6e 20 22 66 22 0a 2a 2a 20 61 73 20 69 74  ion "f".** as it
25300 20 69 73 20 72 65 6d 6f 76 65 64 2e 20 20 28 22   is removed.  ("
25310 66 22 20 6d 61 79 20 62 65 20 6e 75 6c 6c 20 74  f" may be null t
25320 6f 20 61 76 6f 69 64 20 74 68 69 73 20 73 74 65  o avoid this ste
25330 70 2e 29 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  p.) */.void Conf
25340 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 69 6e  igtable_clear(in
25350 74 28 2a 66 29 28 73 74 72 75 63 74 20 63 6f 6e  t(*f)(struct con
25360 66 69 67 20 2a 29 29 0a 7b 0a 20 20 69 6e 74 20  fig *)).{.  int 
25370 69 3b 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20  i;.  if( x4a==0 
25380 7c 7c 20 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30  || x4a->count==0
25390 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
253a0 20 66 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c   f ) for(i=0; i<
253b0 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x4a->count; i++)
253c0 20 28 2a 66 29 28 78 34 61 2d 3e 74 62 6c 5b 69   (*f)(x4a->tbl[i
253d0 5d 2e 64 61 74 61 29 3b 0a 20 20 66 6f 72 28 69  ].data);.  for(i
253e0 3d 30 3b 20 69 3c 78 34 61 2d 3e 73 69 7a 65 3b  =0; i<x4a->size;
253f0 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d   i++) x4a->ht[i]
25400 20 3d 20 30 3b 0a 20 20 78 34 61 2d 3e 63 6f 75   = 0;.  x4a->cou
25410 6e 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  nt = 0;.  return
25420 3b 0a 7d 0a                                      ;.}.