/ Hex Artifact Content
Login

Artifact 087dcf206f3bdeaf0d66d087b519a2c8851fa122:


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 09 64 65  ined(WIN32).#.de
01e0: 66 69 6e 65 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  fine __WIN32__.#
01f0: 20 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a     endif.#endif.
0200: 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33 32 5f  .#ifdef __WIN32_
0210: 5f 0a 65 78 74 65 72 6e 20 69 6e 74 20 61 63 63  _.extern int acc
0220: 65 73 73 28 29 3b 0a 23 65 6c 73 65 0a 23 69 6e  ess();.#else.#in
0230: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
0240: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66  .#endif../* #def
0250: 69 6e 65 20 50 52 49 56 41 54 45 20 73 74 61 74  ine PRIVATE stat
0260: 69 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  ic */.#define PR
0270: 49 56 41 54 45 0a 0a 23 69 66 64 65 66 20 54 45  IVATE..#ifdef TE
0280: 53 54 0a 23 64 65 66 69 6e 65 20 4d 41 58 52 48  ST.#define MAXRH
0290: 53 20 35 20 20 20 20 20 20 20 2f 2a 20 53 65 74  S 5       /* Set
02a0: 20 6c 6f 77 20 74 6f 20 65 78 65 72 63 69 73 65   low to exercise
02b0: 20 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65 20   exception code 
02c0: 2a 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  */.#else.#define
02d0: 20 4d 41 58 52 48 53 20 31 30 30 30 0a 23 65 6e   MAXRHS 1000.#en
02e0: 64 69 66 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  dif..static cons
02f0: 74 20 63 68 61 72 20 2a 2a 6d 61 64 65 5f 66 69  t char **made_fi
0300: 6c 65 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  les = NULL;.stat
0310: 69 63 20 69 6e 74 20 6d 61 64 65 5f 66 69 6c 65  ic int made_file
0320: 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 73 74 61  s_count = 0;.sta
0330: 74 69 63 20 69 6e 74 20 73 75 63 63 65 73 73 66  tic int successf
0340: 75 6c 5f 65 78 69 74 20 3d 20 30 3b 0a 73 74 61  ul_exit = 0;.sta
0350: 74 69 63 20 76 6f 69 64 20 4c 65 6d 6f 6e 41 74  tic void LemonAt
0360: 45 78 69 74 28 76 6f 69 64 29 0a 7b 0a 20 20 20  Exit(void).{.   
0370: 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64   /* if we failed
0380: 2c 20 64 65 6c 65 74 65 20 28 6d 6f 73 74 29 20  , delete (most) 
0390: 66 69 6c 65 73 20 77 65 20 6d 61 64 65 2c 20 74  files we made, t
03a0: 6f 20 75 6e 63 6f 6e 66 75 73 65 20 62 75 69 6c  o unconfuse buil
03b0: 64 20 74 6f 6f 6c 73 2e 20 2a 2f 0a 20 20 20 20  d tools. */.    
03c0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 20 28  int i;.    for (
03d0: 69 20 3d 20 30 3b 20 69 20 3c 20 6d 61 64 65 5f  i = 0; i < made_
03e0: 66 69 6c 65 73 5f 63 6f 75 6e 74 3b 20 69 2b 2b  files_count; i++
03f0: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ) {.        if (
0400: 21 73 75 63 63 65 73 73 66 75 6c 5f 65 78 69 74  !successful_exit
0410: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
0420: 72 65 6d 6f 76 65 28 6d 61 64 65 5f 66 69 6c 65  remove(made_file
0430: 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  s[i]);.        }
0440: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 28 76  .        free((v
0450: 6f 69 64 20 2a 29 20 6d 61 64 65 5f 66 69 6c 65  oid *) made_file
0460: 73 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  s[i]);.    }.   
0470: 20 66 72 65 65 28 6d 61 64 65 5f 66 69 6c 65 73   free(made_files
0480: 29 3b 0a 20 20 20 20 6d 61 64 65 5f 66 69 6c 65  );.    made_file
0490: 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  s_count = 0;.   
04a0: 20 6d 61 64 65 5f 66 69 6c 65 73 20 3d 20 4e 55   made_files = NU
04b0: 4c 4c 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68  LL;.}..static ch
04c0: 61 72 20 2a 6d 73 6f 72 74 28 63 68 61 72 2a 2c  ar *msort(char*,
04d0: 63 68 61 72 2a 2a 2c 69 6e 74 28 2a 29 28 63 6f  char**,int(*)(co
04e0: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
04f0: 63 68 61 72 2a 29 29 3b 0a 0a 2f 2a 0a 2a 2a 20  char*));../*.** 
0500: 43 6f 6d 70 69 6c 65 72 73 20 61 72 65 20 67 65  Compilers are ge
0510: 74 74 69 6e 67 20 69 6e 63 72 65 61 73 69 6e 67  tting increasing
0520: 6c 79 20 70 65 64 61 6e 74 69 63 20 61 62 6f 75  ly pedantic abou
0530: 74 20 74 79 70 65 20 63 6f 6e 76 65 72 73 69 6f  t type conversio
0540: 6e 73 0a 2a 2a 20 61 73 20 43 20 65 76 6f 6c 76  ns.** as C evolv
0550: 65 73 20 65 76 65 72 20 63 6c 6f 73 65 72 20 74  es ever closer t
0560: 6f 20 41 64 61 2e 2e 2e 2e 20 20 54 6f 20 77 6f  o Ada....  To wo
0570: 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 6c 61  rk around the la
0580: 74 65 73 74 20 70 72 6f 62 6c 65 6d 73 0a 2a 2a  test problems.**
0590: 20 77 65 20 68 61 76 65 20 74 6f 20 64 65 66 69   we have to defi
05a0: 6e 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ne the following
05b0: 20 76 61 72 69 61 6e 74 20 6f 66 20 73 74 72 6c   variant of strl
05c0: 65 6e 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  en()..*/.#define
05d0: 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 58 29 20   lemonStrlen(X) 
05e0: 20 20 28 28 69 6e 74 29 73 74 72 6c 65 6e 28 58    ((int)strlen(X
05f0: 29 29 0a 0a 2f 2a 20 61 20 66 65 77 20 66 6f 72  ))../* a few for
0600: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
0610: 73 2e 2e 2e 20 2a 2f 0a 73 74 72 75 63 74 20 72  s... */.struct r
0620: 75 6c 65 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f  ule;.struct lemo
0630: 6e 3b 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e  n;.struct action
0640: 3b 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  ;..static struct
0650: 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f   action *Action_
0660: 6e 65 77 28 76 6f 69 64 29 3b 0a 73 74 61 74 69  new(void);.stati
0670: 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  c struct action 
0680: 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 72  *Action_sort(str
0690: 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a  uct action *);..
06a0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  /********** From
06b0: 20 74 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64   the file "build
06c0: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
06d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
06e0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46  ********/.void F
06f0: 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63  indRulePrecedenc
0700: 65 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46  es();.void FindF
0710: 69 72 73 74 53 65 74 73 28 29 3b 0a 76 6f 69 64  irstSets();.void
0720: 20 46 69 6e 64 53 74 61 74 65 73 28 29 3b 0a 76   FindStates();.v
0730: 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28 29 3b  oid FindLinks();
0740: 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77  .void FindFollow
0750: 53 65 74 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e  Sets();.void Fin
0760: 64 41 63 74 69 6f 6e 73 28 29 3b 0a 0a 2f 2a 2a  dActions();../**
0770: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
0780: 20 66 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73   file "configlis
0790: 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t.h" ***********
07a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
07b0: 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e  ******/.void Con
07c0: 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 76 6f 69  figlist_init(voi
07d0: 64 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  d);.struct confi
07e0: 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  g *Configlist_ad
07f0: 64 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 2c  d(struct rule *,
0800: 20 69 6e 74 29 3b 0a 73 74 72 75 63 74 20 63 6f   int);.struct co
0810: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
0820: 5f 61 64 64 62 61 73 69 73 28 73 74 72 75 63 74  _addbasis(struct
0830: 20 72 75 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 76   rule *, int);.v
0840: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63  oid Configlist_c
0850: 6c 6f 73 75 72 65 28 73 74 72 75 63 74 20 6c 65  losure(struct le
0860: 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e  mon *);.void Con
0870: 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 76 6f 69  figlist_sort(voi
0880: 64 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  d);.void Configl
0890: 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28 76 6f  ist_sortbasis(vo
08a0: 69 64 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  id);.struct conf
08b0: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72  ig *Configlist_r
08c0: 65 74 75 72 6e 28 76 6f 69 64 29 3b 0a 73 74 72  eturn(void);.str
08d0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
08e0: 69 67 6c 69 73 74 5f 62 61 73 69 73 28 76 6f 69  iglist_basis(voi
08f0: 64 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  d);.void Configl
0900: 69 73 74 5f 65 61 74 28 73 74 72 75 63 74 20 63  ist_eat(struct c
0910: 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64 20 43  onfig *);.void C
0920: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28  onfiglist_reset(
0930: 76 6f 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  void);../*******
0940: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
0950: 20 22 65 72 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a   "error.h" *****
0960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0980: 2a 2a 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73  **/.void ErrorMs
0990: 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20  g(const char *, 
09a0: 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a  int,const char *
09b0: 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  , ...);../******
09c0: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
09d0: 6f 70 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a  option.h" ******
09e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a00: 2a 2a 2a 2a 2f 0a 65 6e 75 6d 20 6f 70 74 69 6f  ****/.enum optio
0a10: 6e 5f 74 79 70 65 20 7b 20 4f 50 54 5f 46 4c 41  n_type { OPT_FLA
0a20: 47 3d 31 2c 20 20 4f 50 54 5f 49 4e 54 2c 20 20  G=1,  OPT_INT,  
0a30: 4f 50 54 5f 44 42 4c 2c 20 20 4f 50 54 5f 53 54  OPT_DBL,  OPT_ST
0a40: 52 2c 0a 20 20 20 20 20 20 20 20 20 4f 50 54 5f  R,.         OPT_
0a50: 46 46 4c 41 47 2c 20 4f 50 54 5f 46 49 4e 54 2c  FFLAG, OPT_FINT,
0a60: 20 4f 50 54 5f 46 44 42 4c 2c 20 4f 50 54 5f 46   OPT_FDBL, OPT_F
0a70: 53 54 52 7d 3b 0a 73 74 72 75 63 74 20 73 5f 6f  STR};.struct s_o
0a80: 70 74 69 6f 6e 73 20 7b 0a 20 20 65 6e 75 6d 20  ptions {.  enum 
0a90: 6f 70 74 69 6f 6e 5f 74 79 70 65 20 74 79 70 65  option_type type
0aa0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
0ab0: 6c 61 62 65 6c 3b 0a 20 20 63 68 61 72 20 2a 61  label;.  char *a
0ac0: 72 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rg;.  const char
0ad0: 20 2a 6d 65 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e   *message;.};.in
0ae0: 74 20 20 20 20 4f 70 74 49 6e 69 74 28 63 68 61  t    OptInit(cha
0af0: 72 2a 2a 2c 73 74 72 75 63 74 20 73 5f 6f 70 74  r**,struct s_opt
0b00: 69 6f 6e 73 2a 2c 46 49 4c 45 2a 29 3b 0a 69 6e  ions*,FILE*);.in
0b10: 74 20 20 20 20 4f 70 74 4e 41 72 67 73 28 76 6f  t    OptNArgs(vo
0b20: 69 64 29 3b 0a 63 68 61 72 20 20 2a 4f 70 74 41  id);.char  *OptA
0b30: 72 67 28 69 6e 74 29 3b 0a 76 6f 69 64 20 20 20  rg(int);.void   
0b40: 4f 70 74 45 72 72 28 69 6e 74 29 3b 0a 76 6f 69  OptErr(int);.voi
0b50: 64 20 20 20 4f 70 74 50 72 69 6e 74 28 76 6f 69  d   OptPrint(voi
0b60: 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46  d);../******** F
0b70: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 61  rom the file "pa
0b80: 72 73 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  rse.h" *********
0b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0bb0: 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 73 74 72  /.void Parse(str
0bc0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
0bd0: 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ;../********* Fr
0be0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69  om the file "pli
0bf0: 6e 6b 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nk.h" **********
0c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73  *************/.s
0c20: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 50 6c 69  truct plink *Pli
0c30: 6e 6b 5f 6e 65 77 28 76 6f 69 64 29 3b 0a 76 6f  nk_new(void);.vo
0c40: 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 73 74 72  id Plink_add(str
0c50: 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74  uct plink **, st
0c60: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a  ruct config *);.
0c70: 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28  void Plink_copy(
0c80: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c  struct plink **,
0c90: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29   struct plink *)
0ca0: 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c  ;.void Plink_del
0cb0: 65 74 65 28 73 74 72 75 63 74 20 70 6c 69 6e 6b  ete(struct plink
0cc0: 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a   *);../*********
0cd0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
0ce0: 22 72 65 70 6f 72 74 2e 68 22 20 2a 2a 2a 2a 2a  "report.h" *****
0cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d10: 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73  /.void Reprint(s
0d20: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a  truct lemon *);.
0d30: 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75  void ReportOutpu
0d40: 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  t(struct lemon *
0d50: 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61  );.void ReportTa
0d60: 62 6c 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ble(struct lemon
0d70: 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20 52   *, int);.void R
0d80: 65 70 6f 72 74 48 65 61 64 65 72 28 73 74 72 75  eportHeader(stru
0d90: 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69  ct lemon *);.voi
0da0: 64 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73  d CompressTables
0db0: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29  (struct lemon *)
0dc0: 3b 0a 76 6f 69 64 20 52 65 73 6f 72 74 53 74 61  ;.void ResortSta
0dd0: 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  tes(struct lemon
0de0: 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a   *);../*********
0df0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
0e00: 22 73 65 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  "set.h" ********
0e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e30: 2f 0a 76 6f 69 64 20 20 53 65 74 53 69 7a 65 28  /.void  SetSize(
0e40: 69 6e 74 29 3b 20 20 20 20 20 20 20 20 20 20 20  int);           
0e50: 20 20 2f 2a 20 41 6c 6c 20 73 65 74 73 20 77 69    /* All sets wi
0e60: 6c 6c 20 62 65 20 6f 66 20 73 69 7a 65 20 4e 20  ll be of size N 
0e70: 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28  */.char *SetNew(
0e80: 76 6f 69 64 29 3b 20 20 20 20 20 20 20 20 20 20  void);          
0e90: 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 65       /* A new se
0ea0: 74 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20 30 2e  t for element 0.
0eb0: 2e 4e 20 2a 2f 0a 76 6f 69 64 20 20 53 65 74 46  .N */.void  SetF
0ec0: 72 65 65 28 63 68 61 72 2a 29 3b 20 20 20 20 20  ree(char*);     
0ed0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c          /* Deall
0ee0: 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f 0a 0a  ocate a set */..
0ef0: 63 68 61 72 20 2a 53 65 74 4e 65 77 28 76 6f 69  char *SetNew(voi
0f00: 64 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d);             
0f10: 20 20 2f 2a 20 41 20 6e 65 77 20 73 65 74 20 66    /* A new set f
0f20: 6f 72 20 65 6c 65 6d 65 6e 74 20 30 2e 2e 4e 20  or element 0..N 
0f30: 2a 2f 0a 69 6e 74 20 53 65 74 41 64 64 28 63 68  */.int SetAdd(ch
0f40: 61 72 2a 2c 69 6e 74 29 3b 20 20 20 20 20 20 20  ar*,int);       
0f50: 20 20 20 20 20 2f 2a 20 41 64 64 20 65 6c 65 6d       /* Add elem
0f60: 65 6e 74 20 74 6f 20 61 20 73 65 74 20 2a 2f 0a  ent to a set */.
0f70: 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28 63 68 61  int SetUnion(cha
0f80: 72 20 2a 2c 63 68 61 72 20 2a 29 3b 20 20 20 20  r *,char *);    
0f90: 2f 2a 20 41 20 3c 2d 20 41 20 55 20 42 2c 20 74  /* A <- A U B, t
0fa0: 68 72 75 20 65 6c 65 6d 65 6e 74 20 4e 20 2a 2f  hru element N */
0fb0: 0a 23 64 65 66 69 6e 65 20 53 65 74 46 69 6e 64  .#define SetFind
0fc0: 28 58 2c 59 29 20 28 58 5b 59 5d 29 20 20 20 20  (X,Y) (X[Y])    
0fd0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 59 20     /* True if Y 
0fe0: 69 73 20 69 6e 20 73 65 74 20 58 20 2a 2f 0a 0a  is in set X */..
0ff0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  /********** From
1000: 20 74 68 65 20 66 69 6c 65 20 22 73 74 72 75 63   the file "struc
1010: 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t.h" ***********
1020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
1040: 2a 20 50 72 69 6e 63 69 70 61 6c 20 64 61 74 61  * Principal data
1050: 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20   structures for 
1060: 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
1070: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
1080: 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 4c 45  typedef enum {LE
1090: 4d 4f 4e 5f 46 41 4c 53 45 3d 30 2c 20 4c 45 4d  MON_FALSE=0, LEM
10a0: 4f 4e 5f 54 52 55 45 7d 20 42 6f 6f 6c 65 61 6e  ON_TRUE} Boolean
10b0: 3b 0a 0a 2f 2a 20 53 79 6d 62 6f 6c 73 20 28 74  ;../* Symbols (t
10c0: 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e  erminals and non
10d0: 74 65 72 6d 69 6e 61 6c 73 29 20 6f 66 20 74 68  terminals) of th
10e0: 65 20 67 72 61 6d 6d 61 72 20 61 72 65 20 73 74  e grammar are st
10f0: 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 66  ored.** in the f
1100: 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 65 6e 75  ollowing: */.enu
1110: 6d 20 73 79 6d 62 6f 6c 5f 74 79 70 65 20 7b 0a  m symbol_type {.
1120: 20 20 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 4e 4f    TERMINAL,.  NO
1130: 4e 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 4d 55 4c  NTERMINAL,.  MUL
1140: 54 49 54 45 52 4d 49 4e 41 4c 0a 7d 3b 0a 65 6e  TITERMINAL.};.en
1150: 75 6d 20 65 5f 61 73 73 6f 63 20 7b 0a 20 20 20  um e_assoc {.   
1160: 20 4c 45 46 54 2c 0a 20 20 20 20 52 49 47 48 54   LEFT,.    RIGHT
1170: 2c 0a 20 20 20 20 4e 4f 4e 45 2c 0a 20 20 20 20  ,.    NONE,.    
1180: 55 4e 4b 0a 7d 3b 0a 73 74 72 75 63 74 20 73 79  UNK.};.struct sy
1190: 6d 62 6f 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63  mbol {.  const c
11a0: 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20  har *name;      
11b0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
11c0: 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 6e 74   symbol */.  int
11d0: 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20   index;         
11e0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e        /* Index n
11f0: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 73  umber for this s
1200: 79 6d 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20  ymbol */.  enum 
1210: 73 79 6d 62 6f 6c 5f 74 79 70 65 20 74 79 70 65  symbol_type type
1220: 3b 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 73 20 61  ;   /* Symbols a
1230: 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20 54 45  re all either TE
1240: 52 4d 49 4e 41 4c 53 20 6f 72 20 4e 54 73 20 2a  RMINALS or NTs *
1250: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
1260: 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  *rule;       /* 
1270: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 72  Linked list of r
1280: 75 6c 65 73 20 6f 66 20 74 68 69 73 20 28 69 66  ules of this (if
1290: 20 61 6e 20 4e 54 29 20 2a 2f 0a 20 20 73 74 72   an NT) */.  str
12a0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c  uct symbol *fall
12b0: 62 61 63 6b 3b 20 2f 2a 20 66 61 6c 6c 62 61 63  back; /* fallbac
12c0: 6b 20 74 6f 6b 65 6e 20 69 6e 20 63 61 73 65 20  k token in case 
12d0: 74 68 69 73 20 74 6f 6b 65 6e 20 64 6f 65 73 6e  this token doesn
12e0: 27 74 20 70 61 72 73 65 20 2a 2f 0a 20 20 69 6e  't parse */.  in
12f0: 74 20 70 72 65 63 3b 20 20 20 20 20 20 20 20 20  t prec;         
1300: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63 65 64         /* Preced
1310: 65 6e 63 65 20 69 66 20 64 65 66 69 6e 65 64 20  ence if defined 
1320: 28 2d 31 20 6f 74 68 65 72 77 69 73 65 29 20 2a  (-1 otherwise) *
1330: 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63  /.  enum e_assoc
1340: 20 61 73 73 6f 63 3b 20 20 20 20 20 20 2f 2a 20   assoc;      /* 
1350: 41 73 73 6f 63 69 61 74 69 76 69 74 79 20 69 66  Associativity if
1360: 20 70 72 65 63 65 64 65 6e 63 65 20 69 73 20 64   precedence is d
1370: 65 66 69 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72  efined */.  char
1380: 20 2a 66 69 72 73 74 73 65 74 3b 20 20 20 20 20   *firstset;     
1390: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 2d 73 65       /* First-se
13a0: 74 20 66 6f 72 20 61 6c 6c 20 72 75 6c 65 73 20  t for all rules 
13b0: 6f 66 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a  of this symbol *
13c0: 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 6c 61 6d 62  /.  Boolean lamb
13d0: 64 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  da;          /* 
13e0: 54 72 75 65 20 69 66 20 4e 54 20 61 6e 64 20 63  True if NT and c
13f0: 61 6e 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65  an generate an e
1400: 6d 70 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 20  mpty string */. 
1410: 20 69 6e 74 20 75 73 65 43 6e 74 3b 20 20 20 20   int useCnt;    
1420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1430: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 75 73 65  ber of times use
1440: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65 73  d */.  char *des
1450: 74 72 75 63 74 6f 72 3b 20 20 20 20 20 20 20 20  tructor;        
1460: 2f 2a 20 43 6f 64 65 20 77 68 69 63 68 20 65 78  /* Code which ex
1470: 65 63 75 74 65 73 20 77 68 65 6e 65 76 65 72 20  ecutes whenever 
1480: 74 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 0a 20  this symbol is. 
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 70            ** pop
14b0: 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ped from the sta
14c0: 63 6b 20 64 75 72 69 6e 67 20 65 72 72 6f 72 20  ck during error 
14d0: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
14e0: 69 6e 74 20 64 65 73 74 4c 69 6e 65 6e 6f 3b 20  int destLineno; 
14f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
1500: 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72   number for star
1510: 74 20 6f 66 20 64 65 73 74 72 75 63 74 6f 72 20  t of destructor 
1520: 2a 2f 0a 20 20 63 68 61 72 20 2a 64 61 74 61 74  */.  char *datat
1530: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ype;          /*
1540: 20 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6f   The data type o
1550: 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65  f information he
1560: 6c 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 20  ld by this.     
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1580: 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e        ** object.
1590: 20 4f 6e 6c 79 20 75 73 65 64 20 69 66 20 74 79   Only used if ty
15a0: 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe==NONTERMINAL 
15b0: 2a 2f 0a 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20  */.  int dtnum; 
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15d0: 20 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6e   The data type n
15e0: 75 6d 62 65 72 2e 20 20 49 6e 20 74 68 65 20 70  umber.  In the p
15f0: 61 72 73 65 72 2c 20 74 68 65 20 76 61 6c 75 65  arser, the value
1600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1610: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1620: 74 61 63 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e  tack is a union.
1630: 20 20 54 68 65 20 2e 79 79 25 64 20 65 6c 65 6d    The .yy%d elem
1640: 65 6e 74 20 6f 66 20 74 68 69 73 0a 20 20 20 20  ent of this.    
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 20 20 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20         ** union 
1670: 69 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 64  is the correct d
1680: 61 74 61 20 74 79 70 65 20 66 6f 72 20 74 68 69  ata type for thi
1690: 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 2f 2a  s object */.  /*
16a0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
16b0: 69 65 6c 64 73 20 61 72 65 20 75 73 65 64 20 62  ields are used b
16c0: 79 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 73  y MULTITERMINALs
16d0: 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e   only */.  int n
16e0: 73 75 62 73 79 6d 3b 20 20 20 20 20 20 20 20 20  subsym;         
16f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1700: 20 63 6f 6e 73 74 69 74 75 65 6e 74 20 73 79 6d   constituent sym
1710: 62 6f 6c 73 20 69 6e 20 74 68 65 20 4d 55 4c 54  bols in the MULT
1720: 49 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  I */.  struct sy
1730: 6d 62 6f 6c 20 2a 2a 73 75 62 73 79 6d 3b 20 20  mbol **subsym;  
1740: 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6e 73  /* Array of cons
1750: 74 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20  tituent symbols 
1760: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70  */.};../* Each p
1770: 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 69  roduction rule i
1780: 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 69 73  n the grammar is
1790: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 66   stored in the f
17a0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75  ollowing.** stru
17b0: 63 74 75 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63  cture.  */.struc
17c0: 74 20 72 75 6c 65 20 7b 0a 20 20 73 74 72 75 63  t rule {.  struc
17d0: 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20  t symbol *lhs;  
17e0: 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64      /* Left-hand
17f0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 72 75 6c   side of the rul
1800: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1810: 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20  r *lhsalias;    
1820: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65  /* Alias for the
1830: 20 4c 48 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f   LHS (NULL if no
1840: 6e 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 68 73  ne) */.  int lhs
1850: 53 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20  Start;          
1860: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 65 66    /* True if lef
1870: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 74  t-hand side is t
1880: 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  he start symbol 
1890: 2a 2f 0a 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e  */.  int rulelin
18a0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
18b0: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72   Line number for
18c0: 20 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69   the rule */.  i
18d0: 6e 74 20 6e 72 68 73 3b 20 20 20 20 20 20 20 20  nt nrhs;        
18e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18f0: 72 20 6f 66 20 52 48 53 20 73 79 6d 62 6f 6c 73  r of RHS symbols
1900: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
1910: 62 6f 6c 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f  bol **rhs;     /
1920: 2a 20 54 68 65 20 52 48 53 20 73 79 6d 62 6f 6c  * The RHS symbol
1930: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
1940: 72 20 2a 2a 72 68 73 61 6c 69 61 73 3b 20 20 20  r **rhsalias;   
1950: 2f 2a 20 41 6e 20 61 6c 69 61 73 20 66 6f 72 20  /* An alias for 
1960: 65 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20  each RHS symbol 
1970: 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a  (NULL if none) *
1980: 2f 0a 20 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20  /.  int line;   
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19a0: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 61 74 20 77  Line number at w
19b0: 68 69 63 68 20 63 6f 64 65 20 62 65 67 69 6e 73  hich code begins
19c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
19d0: 20 2a 63 6f 64 65 3b 20 20 20 20 20 20 20 20 2f   *code;        /
19e0: 2a 20 54 68 65 20 63 6f 64 65 20 65 78 65 63 75  * The code execu
19f0: 74 65 64 20 77 68 65 6e 20 74 68 69 73 20 72 75  ted when this ru
1a00: 6c 65 20 69 73 20 72 65 64 75 63 65 64 20 2a 2f  le is reduced */
1a10: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
1a20: 20 2a 70 72 65 63 73 79 6d 3b 20 20 2f 2a 20 50   *precsym;  /* P
1a30: 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c  recedence symbol
1a40: 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65 20 2a   for this rule *
1a50: 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20 20  /.  int index;  
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a70: 41 6e 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  An index number 
1a80: 66 6f 72 20 74 68 69 73 20 72 75 6c 65 20 2a 2f  for this rule */
1a90: 0a 20 20 42 6f 6f 6c 65 61 6e 20 63 61 6e 52 65  .  Boolean canRe
1aa0: 64 75 63 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  duce;       /* T
1ab0: 72 75 65 20 69 66 20 74 68 69 73 20 72 75 6c 65  rue if this rule
1ac0: 20 69 73 20 65 76 65 72 20 72 65 64 75 63 65 64   is ever reduced
1ad0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
1ae0: 65 20 2a 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f  e *nextlhs;    /
1af0: 2a 20 4e 65 78 74 20 72 75 6c 65 20 77 69 74 68  * Next rule with
1b00: 20 74 68 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f   the same LHS */
1b10: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
1b20: 6e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e  next;       /* N
1b30: 65 78 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20  ext rule in the 
1b40: 67 6c 6f 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d  global list */.}
1b50: 3b 0a 0a 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72  ;../* A configur
1b60: 61 74 69 6f 6e 20 69 73 20 61 20 70 72 6f 64 75  ation is a produ
1b70: 63 74 69 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68  ction rule of th
1b80: 65 20 67 72 61 6d 6d 61 72 20 74 6f 67 65 74 68  e grammar togeth
1b90: 65 72 20 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72  er with.** a mar
1ba0: 6b 20 28 64 6f 74 29 20 73 68 6f 77 69 6e 67 20  k (dot) showing 
1bb0: 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 61 74  how much of that
1bc0: 20 72 75 6c 65 20 68 61 73 20 62 65 65 6e 20 70   rule has been p
1bd0: 72 6f 63 65 73 73 65 64 20 73 6f 20 66 61 72 2e  rocessed so far.
1be0: 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
1bf0: 6e 73 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  ns also contain 
1c00: 61 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69  a follow-set whi
1c10: 63 68 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ch is a list of 
1c20: 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62  terminal.** symb
1c30: 6f 6c 73 20 77 68 69 63 68 20 61 72 65 20 61 6c  ols which are al
1c40: 6c 6f 77 65 64 20 74 6f 20 69 6d 6d 65 64 69 61  lowed to immedia
1c50: 74 65 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20  tely follow the 
1c60: 65 6e 64 20 6f 66 20 74 68 65 20 72 75 6c 65 2e  end of the rule.
1c70: 0a 2a 2a 20 45 76 65 72 79 20 63 6f 6e 66 69 67  .** Every config
1c80: 75 72 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72  uration is recor
1c90: 64 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e  ded as an instan
1ca0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1cb0: 69 6e 67 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66 67  ing: */.enum cfg
1cc0: 73 74 61 74 75 73 20 7b 0a 20 20 43 4f 4d 50 4c  status {.  COMPL
1cd0: 45 54 45 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45 54  ETE,.  INCOMPLET
1ce0: 45 0a 7d 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  E.};.struct conf
1cf0: 69 67 20 7b 0a 20 20 73 74 72 75 63 74 20 72 75  ig {.  struct ru
1d00: 6c 65 20 2a 72 70 3b 20 20 20 20 20 20 20 20 20  le *rp;         
1d10: 2f 2a 20 54 68 65 20 72 75 6c 65 20 75 70 6f 6e  /* The rule upon
1d20: 20 77 68 69 63 68 20 74 68 65 20 63 6f 6e 66 69   which the confi
1d30: 67 75 72 61 74 69 6f 6e 20 69 73 20 62 61 73 65  guration is base
1d40: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20  d */.  int dot; 
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 2f 2a 20 54 68 65 20 70 61 72 73 65 20 70 6f 69  /* The parse poi
1d70: 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77  nt */.  char *fw
1d80: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1d90: 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66   /* Follow-set f
1da0: 6f 72 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72  or this configur
1db0: 61 74 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20  ation only */.  
1dc0: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70  struct plink *fp
1dd0: 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c  lp;      /* Foll
1de0: 6f 77 2d 73 65 74 20 66 6f 72 77 61 72 64 20 70  ow-set forward p
1df0: 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
1e00: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69   */.  struct pli
1e10: 6e 6b 20 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f  nk *bplp;      /
1e20: 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63  * Follow-set bac
1e30: 6b 77 61 72 64 73 20 70 72 6f 70 61 67 61 74 69  kwards propagati
1e40: 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74  on links */.  st
1e50: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
1e60: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1e70: 72 20 74 6f 20 73 74 61 74 65 20 77 68 69 63 68  r to state which
1e80: 20 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 2a   contains this *
1e90: 2f 0a 20 20 65 6e 75 6d 20 63 66 67 73 74 61 74  /.  enum cfgstat
1ea0: 75 73 20 73 74 61 74 75 73 3b 20 20 20 2f 2a 20  us status;   /* 
1eb0: 75 73 65 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c  used during foll
1ec0: 6f 77 73 65 74 20 61 6e 64 20 73 68 69 66 74 20  owset and shift 
1ed0: 63 6f 6d 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a  computations */.
1ee0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
1ef0: 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65  *next;     /* Ne
1f00: 78 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  xt configuration
1f10: 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 2a 2f   in the state */
1f20: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
1f30: 20 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *bp;       /* T
1f40: 68 65 20 6e 65 78 74 20 62 61 73 69 73 20 63 6f  he next basis co
1f50: 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d  nfiguration */.}
1f60: 3b 0a 0a 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e  ;..enum e_action
1f70: 20 7b 0a 20 20 53 48 49 46 54 2c 0a 20 20 41 43   {.  SHIFT,.  AC
1f80: 43 45 50 54 2c 0a 20 20 52 45 44 55 43 45 2c 0a  CEPT,.  REDUCE,.
1f90: 20 20 45 52 52 4f 52 2c 0a 20 20 53 53 43 4f 4e    ERROR,.  SSCON
1fa0: 46 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20 20  FLICT,          
1fb0: 20 20 20 20 2f 2a 20 41 20 73 68 69 66 74 2f 73      /* A shift/s
1fc0: 68 69 66 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  hift conflict */
1fd0: 0a 20 20 53 52 43 4f 4e 46 4c 49 43 54 2c 20 20  .  SRCONFLICT,  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1ff0: 61 73 20 61 20 72 65 64 75 63 65 2c 20 62 75 74  as a reduce, but
2000: 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c   part of a confl
2010: 69 63 74 20 2a 2f 0a 20 20 52 52 43 4f 4e 46 4c  ict */.  RRCONFL
2020: 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  ICT,            
2030: 20 20 2f 2a 20 57 61 73 20 61 20 72 65 64 75 63    /* Was a reduc
2040: 65 2c 20 62 75 74 20 70 61 72 74 20 6f 66 20 61  e, but part of a
2050: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53   conflict */.  S
2060: 48 5f 52 45 53 4f 4c 56 45 44 2c 20 20 20 20 20  H_RESOLVED,     
2070: 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61          /* Was a
2080: 20 73 68 69 66 74 2e 20 20 50 72 65 63 65 64 65   shift.  Precede
2090: 6e 63 65 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e  nce resolved con
20a0: 66 6c 69 63 74 20 2a 2f 0a 20 20 52 44 5f 52 45  flict */.  RD_RE
20b0: 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20 20  SOLVED,         
20c0: 20 20 20 20 2f 2a 20 57 61 73 20 72 65 64 75 63      /* Was reduc
20d0: 65 2e 20 20 50 72 65 63 65 64 65 6e 63 65 20 72  e.  Precedence r
20e0: 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74  esolved conflict
20f0: 20 2a 2f 0a 20 20 4e 4f 54 5f 55 53 45 44 20 20   */.  NOT_USED  
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2110: 2a 20 44 65 6c 65 74 65 64 20 62 79 20 63 6f 6d  * Deleted by com
2120: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a  pression */.};..
2130: 2f 2a 20 45 76 65 72 79 20 73 68 69 66 74 20 6f  /* Every shift o
2140: 72 20 72 65 64 75 63 65 20 6f 70 65 72 61 74 69  r reduce operati
2150: 6f 6e 20 69 73 20 73 74 6f 72 65 64 20 61 73 20  on is stored as 
2160: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
2170: 77 69 6e 67 20 2a 2f 0a 73 74 72 75 63 74 20 61  wing */.struct a
2180: 63 74 69 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74  ction {.  struct
2190: 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20 20   symbol *sp;    
21a0: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 2d 61     /* The look-a
21b0: 68 65 61 64 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20  head symbol */. 
21c0: 20 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74   enum e_action t
21d0: 79 70 65 3b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  ype;.  union {. 
21e0: 20 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20     struct state 
21f0: 2a 73 74 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  *stp;     /* The
2200: 20 6e 65 77 20 73 74 61 74 65 2c 20 69 66 20 61   new state, if a
2210: 20 73 68 69 66 74 20 2a 2f 0a 20 20 20 20 73 74   shift */.    st
2220: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 20 20  ruct rule *rp;  
2230: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65       /* The rule
2240: 2c 20 69 66 20 61 20 72 65 64 75 63 65 20 2a 2f  , if a reduce */
2250: 0a 20 20 7d 20 78 3b 0a 20 20 73 74 72 75 63 74  .  } x;.  struct
2260: 20 61 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20 20   action *next;  
2270: 20 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f     /* Next actio
2280: 6e 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  n for this state
2290: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74   */.  struct act
22a0: 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 2f  ion *collide;  /
22b0: 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20 77 69  * Next action wi
22c0: 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
22d0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20   */.};../* Each 
22e0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e  state of the gen
22f0: 65 72 61 74 65 64 20 70 61 72 73 65 72 27 73 20  erated parser's 
2300: 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63  finite state mac
2310: 68 69 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f 64  hine.** is encod
2320: 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63  ed as an instanc
2330: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2340: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ng structure. */
2350: 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 7b 0a  .struct state {.
2360: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
2370: 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *bp;       /* Th
2380: 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  e basis configur
2390: 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20  ations for this 
23a0: 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  state */.  struc
23b0: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20  t config *cfp;  
23c0: 20 20 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66 69      /* All confi
23d0: 67 75 72 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  gurations in thi
23e0: 73 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 73  s set */.  int s
23f0: 74 61 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20  tatenum;        
2400: 20 20 20 20 2f 2a 20 53 65 71 75 65 6e 74 69 61      /* Sequentia
2410: 6c 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  l number for thi
2420: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72  s state */.  str
2430: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 20  uct action *ap; 
2440: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
2450: 66 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68  f actions for th
2460: 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e  is state */.  in
2470: 74 20 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74 41 63  t nTknAct, nNtAc
2480: 74 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  t;     /* Number
2490: 20 6f 66 20 61 63 74 69 6f 6e 73 20 6f 6e 20 74   of actions on t
24a0: 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e  erminals and non
24b0: 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69  terminals */.  i
24c0: 6e 74 20 69 54 6b 6e 4f 66 73 74 2c 20 69 4e 74  nt iTknOfst, iNt
24d0: 4f 66 73 74 3b 20 20 20 2f 2a 20 79 79 5f 61 63  Ofst;   /* yy_ac
24e0: 74 69 6f 6e 5b 5d 20 6f 66 66 73 65 74 20 66 6f  tion[] offset fo
24f0: 72 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20  r terminals and 
2500: 6e 6f 6e 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e  nonterms */.  in
2510: 74 20 69 44 66 6c 74 3b 20 20 20 20 20 20 20 20  t iDflt;        
2520: 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c         /* Defaul
2530: 74 20 61 63 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23  t action */.};.#
2540: 64 65 66 69 6e 65 20 4e 4f 5f 4f 46 46 53 45 54  define NO_OFFSET
2550: 20 28 2d 32 31 34 37 34 38 33 36 34 37 29 0a 0a   (-2147483647)..
2560: 2f 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 70  /* A followset p
2570: 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 20  ropagation link 
2580: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
2590: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6f  he contents of o
25a0: 6e 65 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61 74  ne.** configurat
25b0: 69 6f 6e 20 66 6f 6c 6c 6f 77 73 65 74 20 73 68  ion followset sh
25c0: 6f 75 6c 64 20 62 65 20 70 72 6f 70 61 67 61 74  ould be propagat
25d0: 65 64 20 74 6f 20 61 6e 6f 74 68 65 72 20 77 68  ed to another wh
25e0: 65 6e 65 76 65 72 0a 2a 2a 20 74 68 65 20 66 69  enever.** the fi
25f0: 72 73 74 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a  rst changes. */.
2600: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 7b 0a 20  struct plink {. 
2610: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
2620: 63 66 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  cfp;      /* The
2630: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74   configuration t
2640: 6f 20 77 68 69 63 68 20 6c 69 6e 6b 65 64 20 2a  o which linked *
2650: 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  /.  struct plink
2660: 20 2a 6e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20   *next;      /* 
2670: 54 68 65 20 6e 65 78 74 20 70 72 6f 70 61 67 61  The next propaga
2680: 74 65 20 6c 69 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f  te link */.};../
2690: 2a 20 54 68 65 20 73 74 61 74 65 20 76 65 63 74  * The state vect
26a0: 6f 72 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  or for the entir
26b0: 65 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  e parser generat
26c0: 6f 72 20 69 73 20 72 65 63 6f 72 64 65 64 20 61  or is recorded a
26d0: 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 2e 20 20 28  s.** follows.  (
26e0: 4c 45 4d 4f 4e 20 75 73 65 73 20 6e 6f 20 67 6c  LEMON uses no gl
26f0: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61  obal variables a
2700: 6e 64 20 6d 61 6b 65 73 20 6c 69 74 74 6c 65 20  nd makes little 
2710: 75 73 65 20 6f 66 0a 2a 2a 20 73 74 61 74 69 63  use of.** static
2720: 20 76 61 72 69 61 62 6c 65 73 2e 20 20 46 69 65   variables.  Fie
2730: 6c 64 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  lds in the follo
2740: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 63  wing structure c
2750: 61 6e 20 62 65 20 74 68 6f 75 67 68 74 0a 2a 2a  an be thought.**
2760: 20 6f 66 20 61 73 20 62 65 67 69 6e 20 67 6c 6f   of as begin glo
2770: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 69 6e  bal variables in
2780: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 29 20 2a   the program.) *
2790: 2f 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 7b  /.struct lemon {
27a0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
27b0: 2a 2a 73 6f 72 74 65 64 3b 20 20 20 2f 2a 20 54  **sorted;   /* T
27c0: 61 62 6c 65 20 6f 66 20 73 74 61 74 65 73 20 73  able of states s
27d0: 6f 72 74 65 64 20 62 79 20 73 74 61 74 65 20 6e  orted by state n
27e0: 75 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72 75 63  umber */.  struc
27f0: 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20 20  t rule *rule;   
2800: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
2810: 6c 6c 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e  ll rules */.  in
2820: 74 20 6e 73 74 61 74 65 3b 20 20 20 20 20 20 20  t nstate;       
2830: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2840: 20 6f 66 20 73 74 61 74 65 73 20 2a 2f 0a 20 20   of states */.  
2850: 69 6e 74 20 6e 72 75 6c 65 3b 20 20 20 20 20 20  int nrule;      
2860: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2870: 65 72 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a 20  er of rules */. 
2880: 20 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20 20   int nsymbol;   
2890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
28a0: 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20  ber of terminal 
28b0: 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20  and nonterminal 
28c0: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74  symbols */.  int
28d0: 20 6e 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20   nterminal;     
28e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
28f0: 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  of terminal symb
2900: 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ols */.  struct 
2910: 73 79 6d 62 6f 6c 20 2a 2a 73 79 6d 62 6f 6c 73  symbol **symbols
2920: 3b 20 2f 2a 20 53 6f 72 74 65 64 20 61 72 72 61  ; /* Sorted arra
2930: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  y of pointers to
2940: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e   symbols */.  in
2950: 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20 20  t errorcnt;     
2960: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2970: 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20   of errors */.  
2980: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65  struct symbol *e
2990: 72 72 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65 20  rrsym;   /* The 
29a0: 65 72 72 6f 72 20 73 79 6d 62 6f 6c 20 2a 2f 0a  error symbol */.
29b0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
29c0: 2a 77 69 6c 64 63 61 72 64 3b 20 2f 2a 20 54 6f  *wildcard; /* To
29d0: 6b 65 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73  ken that matches
29e0: 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 63   anything */.  c
29f0: 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20  har *name;      
2a00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2a10: 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
2a20: 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61   parser */.  cha
2a30: 72 20 2a 61 72 67 3b 20 20 20 20 20 20 20 20 20  r *arg;         
2a40: 20 20 20 20 20 20 2f 2a 20 44 65 63 6c 61 72 61        /* Declara
2a50: 74 69 6f 6e 20 6f 66 20 74 68 65 20 33 74 68 20  tion of the 3th 
2a60: 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 72 73  argument to pars
2a70: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f  er */.  char *to
2a80: 6b 65 6e 74 79 70 65 3b 20 20 20 20 20 20 20 20  kentype;        
2a90: 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 72 6d   /* Type of term
2aa0: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 69 6e 20  inal symbols in 
2ab0: 74 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b  the parser stack
2ac0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 76 61 72 74   */.  char *vart
2ad0: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ype;           /
2ae0: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 74 79  * The default ty
2af0: 70 65 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e  pe of non-termin
2b00: 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  al symbols */.  
2b10: 63 68 61 72 20 2a 73 74 61 72 74 3b 20 20 20 20  char *start;    
2b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2b30: 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 73 79   of the start sy
2b40: 6d 62 6f 6c 20 66 6f 72 20 74 68 65 20 67 72 61  mbol for the gra
2b50: 6d 6d 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mmar */.  char *
2b60: 73 74 61 63 6b 73 69 7a 65 3b 20 20 20 20 20 20  stacksize;      
2b70: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
2b80: 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a  e parser stack *
2b90: 2f 0a 20 20 63 68 61 72 20 2a 69 6e 63 6c 75 64  /.  char *includ
2ba0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2bb0: 43 6f 64 65 20 74 6f 20 70 75 74 20 61 74 20 74  Code to put at t
2bc0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
2bd0: 43 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  C file */.  char
2be0: 20 2a 65 72 72 6f 72 3b 20 20 20 20 20 20 20 20   *error;        
2bf0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20       /* Code to 
2c00: 65 78 65 63 75 74 65 20 77 68 65 6e 20 61 6e 20  execute when an 
2c10: 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f  error is seen */
2c20: 0a 20 20 63 68 61 72 20 2a 6f 76 65 72 66 6c 6f  .  char *overflo
2c30: 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  w;          /* C
2c40: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f  ode to execute o
2c50: 6e 20 61 20 73 74 61 63 6b 20 6f 76 65 72 66 6c  n a stack overfl
2c60: 6f 77 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 61  ow */.  char *fa
2c70: 69 6c 75 72 65 3b 20 20 20 20 20 20 20 20 20 20  ilure;          
2c80: 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63   /* Code to exec
2c90: 75 74 65 20 6f 6e 20 70 61 72 73 65 72 20 66 61  ute on parser fa
2ca0: 69 6c 75 72 65 20 2a 2f 0a 20 20 63 68 61 72 20  ilure */.  char 
2cb0: 2a 61 63 63 65 70 74 3b 20 20 20 20 20 20 20 20  *accept;        
2cc0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65      /* Code to e
2cd0: 78 65 63 75 74 65 20 77 68 65 6e 20 74 68 65 20  xecute when the 
2ce0: 70 61 72 73 65 72 20 65 78 63 65 70 74 73 20 2a  parser excepts *
2cf0: 2f 0a 20 20 63 68 61 72 20 2a 65 78 74 72 61 63  /.  char *extrac
2d00: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ode;         /* 
2d10: 43 6f 64 65 20 61 70 70 65 6e 64 65 64 20 74 6f  Code appended to
2d20: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 66   the generated f
2d30: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74  ile */.  char *t
2d40: 6f 6b 65 6e 64 65 73 74 3b 20 20 20 20 20 20 20  okendest;       
2d50: 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65    /* Code to exe
2d60: 63 75 74 65 20 74 6f 20 64 65 73 74 72 6f 79 20  cute to destroy 
2d70: 74 6f 6b 65 6e 20 64 61 74 61 20 2a 2f 0a 20 20  token data */.  
2d80: 63 68 61 72 20 2a 76 61 72 64 65 73 74 3b 20 20  char *vardest;  
2d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
2da0: 20 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74   for the default
2db0: 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 64 65   non-terminal de
2dc0: 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63 68  structor */.  ch
2dd0: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20  ar *filename;   
2de0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2df0: 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
2e00: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e   */.  char *outn
2e10: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
2e20: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 75  * Name of the cu
2e30: 72 72 65 6e 74 20 6f 75 74 70 75 74 20 66 69 6c  rrent output fil
2e40: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  e */.  char *tok
2e50: 65 6e 70 72 65 66 69 78 3b 20 20 20 20 20 20 20  enprefix;       
2e60: 2f 2a 20 41 20 70 72 65 66 69 78 20 61 64 64 65  /* A prefix adde
2e70: 64 20 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73  d to token names
2e80: 20 69 6e 20 74 68 65 20 2e 68 20 66 69 6c 65 20   in the .h file 
2e90: 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69  */.  int nconfli
2ea0: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct;           /*
2eb0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 73 69   Number of parsi
2ec0: 6e 67 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a  ng conflicts */.
2ed0: 20 20 69 6e 74 20 6e 65 78 70 65 63 74 65 64 3b    int nexpected;
2ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2ef0: 6d 62 65 72 20 6f 66 20 65 78 70 65 63 74 65 64  mber of expected
2f00: 20 70 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63   parsing conflic
2f10: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 6c  ts */.  int tabl
2f20: 65 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  esize;          
2f30: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
2f40: 70 61 72 73 65 20 74 61 62 6c 65 73 20 2a 2f 0a  parse tables */.
2f50: 20 20 69 6e 74 20 62 61 73 69 73 66 6c 61 67 3b    int basisflag;
2f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
2f70: 69 6e 74 20 6f 6e 6c 79 20 62 61 73 69 73 20 63  int only basis c
2f80: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f  onfigurations */
2f90: 0a 20 20 69 6e 74 20 68 61 73 5f 66 61 6c 6c 62  .  int has_fallb
2fa0: 61 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ack;        /* T
2fb0: 72 75 65 20 69 66 20 61 6e 79 20 25 66 61 6c 6c  rue if any %fall
2fc0: 62 61 63 6b 20 69 73 20 73 65 65 6e 20 69 6e 20  back is seen in 
2fd0: 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20  the grammar */. 
2fe0: 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c   int nolinenosfl
2ff0: 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ag;       /* Tru
3000: 65 20 69 66 20 23 6c 69 6e 65 20 73 74 61 74 65  e if #line state
3010: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 6e 6f 74  ments should not
3020: 20 62 65 20 70 72 69 6e 74 65 64 20 2a 2f 0a 20   be printed */. 
3030: 20 63 68 61 72 20 2a 61 72 67 76 30 3b 20 20 20   char *argv0;   
3040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
3050: 65 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  e of the program
3060: 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20   */.};..#define 
3070: 4d 65 6d 6f 72 79 43 68 65 63 6b 28 58 29 20 69  MemoryCheck(X) i
3080: 66 28 28 58 29 3d 3d 30 29 7b 20 5c 0a 20 20 65  f((X)==0){ \.  e
3090: 78 74 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72  xtern void memor
30a0: 79 5f 65 72 72 6f 72 28 29 3b 20 5c 0a 20 20 6d  y_error(); \.  m
30b0: 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c  emory_error(); \
30c0: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
30d0: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
30e0: 69 6c 65 20 22 74 61 62 6c 65 2e 68 22 20 2a 2a  ile "table.h" **
30f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
3110: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20  ./*.** All code 
3120: 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68 61 73  in this file has
3130: 20 62 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61   been automatica
3140: 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  lly generated.**
3150: 20 66 72 6f 6d 20 61 20 73 70 65 63 69 66 69 63   from a specific
3160: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c  ation in the fil
3170: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
3180: 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62    "table.q".** b
3190: 79 20 74 68 65 20 61 73 73 6f 63 69 61 74 69 76  y the associativ
31a0: 65 20 61 72 72 61 79 20 63 6f 64 65 20 62 75 69  e array code bui
31b0: 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d 20 22 61  lding program "a
31c0: 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  agen"..** Do not
31d0: 20 65 64 69 74 20 74 68 69 73 20 66 69 6c 65 21   edit this file!
31e0: 20 20 49 6e 73 74 65 61 64 2c 20 65 64 69 74 20    Instead, edit 
31f0: 74 68 65 20 73 70 65 63 69 66 69 63 61 74 69 6f  the specificatio
3200: 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  n.** file, then 
3210: 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a  rerun aagen..*/.
3220: 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70  /*.** Code for p
3230: 72 6f 63 65 73 73 69 6e 67 20 74 61 62 6c 65 73  rocessing tables
3240: 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
3250: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
3260: 2a 2f 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 66  */./* Routines f
3270: 6f 72 20 68 61 6e 64 6c 69 6e 67 20 61 20 73 74  or handling a st
3280: 72 69 6e 67 73 20 2a 2f 0a 0a 63 6f 6e 73 74 20  rings */..const 
3290: 63 68 61 72 20 2a 53 74 72 73 61 66 65 28 63 6f  char *Strsafe(co
32a0: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 76 6f  nst char *);..vo
32b0: 69 64 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28  id Strsafe_init(
32c0: 76 6f 69 64 29 3b 0a 69 6e 74 20 53 74 72 73 61  void);.int Strsa
32d0: 66 65 5f 69 6e 73 65 72 74 28 63 6f 6e 73 74 20  fe_insert(const 
32e0: 63 68 61 72 20 2a 29 3b 0a 63 6f 6e 73 74 20 63  char *);.const c
32f0: 68 61 72 20 2a 53 74 72 73 61 66 65 5f 66 69 6e  har *Strsafe_fin
3300: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  d(const char *);
3310: 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f  ../* Routines fo
3320: 72 20 68 61 6e 64 6c 69 6e 67 20 73 79 6d 62 6f  r handling symbo
3330: 6c 73 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  ls of the gramma
3340: 72 20 2a 2f 0a 0a 73 74 72 75 63 74 20 73 79 6d  r */..struct sym
3350: 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28  bol *Symbol_new(
3360: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 69  const char *);.i
3370: 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 63 6f  nt Symbolcmpp(co
3380: 6e 73 74 20 76 6f 69 64 20 2a 2c 20 63 6f 6e 73  nst void *, cons
3390: 74 20 76 6f 69 64 20 2a 29 3b 0a 76 6f 69 64 20  t void *);.void 
33a0: 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 76 6f 69 64  Symbol_init(void
33b0: 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e  );.int Symbol_in
33c0: 73 65 72 74 28 73 74 72 75 63 74 20 73 79 6d 62  sert(struct symb
33d0: 6f 6c 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ol *, const char
33e0: 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62   *);.struct symb
33f0: 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28  ol *Symbol_find(
3400: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 73  const char *);.s
3410: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
3420: 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74 29 3b 0a 69  mbol_Nth(int);.i
3430: 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28  nt Symbol_count(
3440: 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20 73 79  void);.struct sy
3450: 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72  mbol **Symbol_ar
3460: 72 61 79 6f 66 28 76 6f 69 64 29 3b 0a 0a 2f 2a  rayof(void);../*
3470: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 6d 61 6e   Routines to man
3480: 61 67 65 20 74 68 65 20 73 74 61 74 65 20 74 61  age the state ta
3490: 62 6c 65 20 2a 2f 0a 0a 69 6e 74 20 43 6f 6e 66  ble */..int Conf
34a0: 69 67 63 6d 70 28 63 6f 6e 73 74 20 63 68 61 72  igcmp(const char
34b0: 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   *, const char *
34c0: 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  );.struct state 
34d0: 2a 53 74 61 74 65 5f 6e 65 77 28 76 6f 69 64 29  *State_new(void)
34e0: 3b 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69  ;.void State_ini
34f0: 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53 74 61  t(void);.int Sta
3500: 74 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74  te_insert(struct
3510: 20 73 74 61 74 65 20 2a 2c 20 73 74 72 75 63 74   state *, struct
3520: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75   config *);.stru
3530: 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f  ct state *State_
3540: 66 69 6e 64 28 73 74 72 75 63 74 20 63 6f 6e 66  find(struct conf
3550: 69 67 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 74  ig *);.struct st
3560: 61 74 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61  ate **State_arra
3570: 79 6f 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a  yof(/*  */);../*
3580: 20 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 66   Routines used f
3590: 6f 72 20 65 66 66 69 63 69 65 6e 63 79 20 69 6e  or efficiency in
35a0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 20   Configlist_add 
35b0: 2a 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74  */..void Configt
35c0: 61 62 6c 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b  able_init(void);
35d0: 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c 65  .int Configtable
35e0: 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 63  _insert(struct c
35f0: 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75 63 74  onfig *);.struct
3600: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74   config *Configt
3610: 61 62 6c 65 5f 66 69 6e 64 28 73 74 72 75 63 74  able_find(struct
3620: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64   config *);.void
3630: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65   Configtable_cle
3640: 61 72 28 69 6e 74 28 2a 29 28 73 74 72 75 63 74  ar(int(*)(struct
3650: 20 63 6f 6e 66 69 67 20 2a 29 29 3b 0a 0a 2f 2a   config *));../*
3660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3670: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
3680: 22 61 63 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a  "action.c" *****
3690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
36b0: 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65  * Routines proce
36c0: 73 73 69 6e 67 20 70 61 72 73 65 72 20 61 63 74  ssing parser act
36d0: 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  ions in the LEMO
36e0: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
36f0: 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 63  or..*/../* Alloc
3700: 61 74 65 20 61 20 6e 65 77 20 70 61 72 73 65 72  ate a new parser
3710: 20 61 63 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69   action */.stati
3720: 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  c struct action 
3730: 2a 41 63 74 69 6f 6e 5f 6e 65 77 28 76 6f 69 64  *Action_new(void
3740: 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  ){.  static stru
3750: 63 74 20 61 63 74 69 6f 6e 20 2a 66 72 65 65 6c  ct action *freel
3760: 69 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  ist = 0;.  struc
3770: 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 61 63 74  t action *newact
3780: 69 6f 6e 3b 0a 0a 20 20 69 66 28 20 66 72 65 65  ion;..  if( free
3790: 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  list==0 ){.    i
37a0: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d  nt i;.    int am
37b0: 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 66 72 65  t = 100;.    fre
37c0: 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20  elist = (struct 
37d0: 61 63 74 69 6f 6e 20 2a 29 63 61 6c 6c 6f 63 28  action *)calloc(
37e0: 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  amt, sizeof(stru
37f0: 63 74 20 61 63 74 69 6f 6e 29 29 3b 0a 20 20 20  ct action));.   
3800: 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30   if( freelist==0
3810: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
3820: 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65  f(stderr,"Unable
3830: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
3840: 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 70 61  ory for a new pa
3850: 72 73 65 72 20 61 63 74 69 6f 6e 2e 22 29 3b 0a  rser action.");.
3860: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
3870: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
3880: 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20  ; i<amt-1; i++) 
3890: 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74  freelist[i].next
38a0: 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31   = &freelist[i+1
38b0: 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b  ];.    freelist[
38c0: 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b  amt-1].next = 0;
38d0: 0a 20 20 7d 0a 20 20 6e 65 77 61 63 74 69 6f 6e  .  }.  newaction
38e0: 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66   = freelist;.  f
38f0: 72 65 65 6c 69 73 74 20 3d 20 66 72 65 65 6c 69  reelist = freeli
3900: 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75  st->next;.  retu
3910: 72 6e 20 6e 65 77 61 63 74 69 6f 6e 3b 0a 7d 0a  rn newaction;.}.
3920: 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
3930: 61 63 74 69 6f 6e 73 20 66 6f 72 20 73 6f 72 74  actions for sort
3940: 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 52  ing purposes.  R
3950: 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20  eturn negative, 
3960: 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20 70 6f 73 69  zero, or.** posi
3970: 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73  tive if the firs
3980: 74 20 61 63 74 69 6f 6e 20 69 73 20 6c 65 73 73  t action is less
3990: 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
39a0: 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
39b0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 0a 2a 2f  .** the first.*/
39c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 74 69  .static int acti
39d0: 6f 6e 63 6d 70 28 0a 20 20 73 74 72 75 63 74 20  oncmp(.  struct 
39e0: 61 63 74 69 6f 6e 20 2a 61 70 31 2c 0a 20 20 73  action *ap1,.  s
39f0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
3a00: 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  2.){.  int rc;. 
3a10: 20 72 63 20 3d 20 61 70 31 2d 3e 73 70 2d 3e 69   rc = ap1->sp->i
3a20: 6e 64 65 78 20 2d 20 61 70 32 2d 3e 73 70 2d 3e  ndex - ap2->sp->
3a30: 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 72 63 3d  index;.  if( rc=
3a40: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 28  =0 ){.    rc = (
3a50: 69 6e 74 29 61 70 31 2d 3e 74 79 70 65 20 2d 20  int)ap1->type - 
3a60: 28 69 6e 74 29 61 70 32 2d 3e 74 79 70 65 3b 0a  (int)ap2->type;.
3a70: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20    }.  if( rc==0 
3a80: 26 26 20 61 70 31 2d 3e 74 79 70 65 3d 3d 52 45  && ap1->type==RE
3a90: 44 55 43 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  DUCE ){.    rc =
3aa0: 20 61 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65   ap1->x.rp->inde
3ab0: 78 20 2d 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69  x - ap2->x.rp->i
3ac0: 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
3ad0: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  rc==0 ){.    rc 
3ae0: 3d 20 61 70 32 20 2d 20 61 70 31 3b 0a 20 20 7d  = ap2 - ap1;.  }
3af0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3b00: 0a 2f 2a 20 53 6f 72 74 20 70 61 72 73 65 72 20  ./* Sort parser 
3b10: 61 63 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  actions */.stati
3b20: 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  c struct action 
3b30: 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 0a 20 20  *Action_sort(.  
3b40: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
3b50: 70 0a 29 7b 0a 20 20 61 70 20 3d 20 28 73 74 72  p.){.  ap = (str
3b60: 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 6d 73 6f  uct action *)mso
3b70: 72 74 28 28 63 68 61 72 20 2a 29 61 70 2c 28 63  rt((char *)ap,(c
3b80: 68 61 72 20 2a 2a 29 26 61 70 2d 3e 6e 65 78 74  har **)&ap->next
3b90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bb0: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
3bc0: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
3bd0: 29 61 63 74 69 6f 6e 63 6d 70 29 3b 0a 20 20 72  )actioncmp);.  r
3be0: 65 74 75 72 6e 20 61 70 3b 0a 7d 0a 0a 76 6f 69  eturn ap;.}..voi
3bf0: 64 20 41 63 74 69 6f 6e 5f 61 64 64 28 0a 20 20  d Action_add(.  
3c00: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 2a  struct action **
3c10: 61 70 70 2c 0a 20 20 65 6e 75 6d 20 65 5f 61 63  app,.  enum e_ac
3c20: 74 69 6f 6e 20 74 79 70 65 2c 0a 20 20 73 74 72  tion type,.  str
3c30: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 0a  uct symbol *sp,.
3c40: 20 20 63 68 61 72 20 2a 61 72 67 0a 29 7b 0a 20    char *arg.){. 
3c50: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
3c60: 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e 65 77  newaction;.  new
3c70: 61 63 74 69 6f 6e 20 3d 20 41 63 74 69 6f 6e 5f  action = Action_
3c80: 6e 65 77 28 29 3b 0a 20 20 6e 65 77 61 63 74 69  new();.  newacti
3c90: 6f 6e 2d 3e 6e 65 78 74 20 3d 20 2a 61 70 70 3b  on->next = *app;
3ca0: 0a 20 20 2a 61 70 70 20 3d 20 6e 65 77 61 63 74  .  *app = newact
3cb0: 69 6f 6e 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e  ion;.  newaction
3cc0: 2d 3e 74 79 70 65 20 3d 20 74 79 70 65 3b 0a 20  ->type = type;. 
3cd0: 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 73 70 20 3d   newaction->sp =
3ce0: 20 73 70 3b 0a 20 20 69 66 28 20 74 79 70 65 3d   sp;.  if( type=
3cf0: 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 6e 65  =SHIFT ){.    ne
3d00: 77 61 63 74 69 6f 6e 2d 3e 78 2e 73 74 70 20 3d  waction->x.stp =
3d10: 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a   (struct state *
3d20: 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )arg;.  }else{. 
3d30: 20 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78 2e     newaction->x.
3d40: 72 70 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c  rp = (struct rul
3d50: 65 20 2a 29 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f  e *)arg;.  }.}./
3d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d70: 2a 2a 2a 2a 2a 2a 20 4e 65 77 20 63 6f 64 65 20  ****** New code 
3d80: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
3d90: 20 22 61 63 74 74 61 62 22 20 6d 6f 64 75 6c 65   "acttab" module
3da0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a   ***********/./*
3db0: 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20  .** This module 
3dc0: 69 6d 70 6c 65 6d 65 6e 74 73 20 72 6f 75 74 69  implements routi
3dd0: 6e 65 73 20 75 73 65 20 74 6f 20 63 6f 6e 73 74  nes use to const
3de0: 72 75 63 74 20 74 68 65 20 79 79 5f 61 63 74 69  ruct the yy_acti
3df0: 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a  on[] table..*/..
3e00: 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65 20  /*.** The state 
3e10: 6f 66 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  of the yy_action
3e20: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
3e30: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6e 20  struction is an 
3e40: 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20 74  instance of.** t
3e50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
3e60: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
3e70: 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c  e yy_action tabl
3e80: 65 20 6d 61 70 73 20 74 68 65 20 70 61 69 72 20  e maps the pair 
3e90: 28 73 74 61 74 65 5f 6e 75 6d 62 65 72 2c 20 6c  (state_number, l
3ea0: 6f 6f 6b 61 68 65 61 64 29 20 69 6e 74 6f 20 61  ookahead) into a
3eb0: 6e 0a 2a 2a 20 61 63 74 69 6f 6e 5f 6e 75 6d 62  n.** action_numb
3ec0: 65 72 2e 20 20 54 68 65 20 74 61 62 6c 65 20 69  er.  The table i
3ed0: 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e  s an array of in
3ee0: 74 65 67 65 72 73 20 70 61 69 72 73 2e 20 20 54  tegers pairs.  T
3ef0: 68 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 0a  he state_number.
3f00: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 61 6e  ** determines an
3f10: 20 69 6e 69 74 69 61 6c 20 6f 66 66 73 65 74 20   initial offset 
3f20: 69 6e 74 6f 20 74 68 65 20 79 79 5f 61 63 74 69  into the yy_acti
3f30: 6f 6e 20 61 72 72 61 79 2e 20 20 54 68 65 20 6c  on array.  The l
3f40: 6f 6f 6b 61 68 65 61 64 0a 2a 2a 20 76 61 6c 75  ookahead.** valu
3f50: 65 20 69 73 20 74 68 65 6e 20 61 64 64 65 64 20  e is then added 
3f60: 74 6f 20 74 68 69 73 20 69 6e 69 74 69 61 6c 20  to this initial 
3f70: 6f 66 66 73 65 74 20 74 6f 20 67 65 74 20 61 6e  offset to get an
3f80: 20 69 6e 64 65 78 20 58 20 69 6e 74 6f 20 74 68   index X into th
3f90: 65 0a 2a 2a 20 79 79 5f 61 63 74 69 6f 6e 20 61  e.** yy_action a
3fa0: 72 72 61 79 2e 20 49 66 20 74 68 65 20 61 41 63  rray. If the aAc
3fb0: 74 69 6f 6e 5b 58 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[X].lookahea
3fc0: 64 20 65 71 75 61 6c 73 20 74 68 65 20 76 61 6c  d equals the val
3fd0: 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 66 20  ue of the.** of 
3fe0: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e  the lookahead in
3ff0: 70 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  put, then the va
4000: 6c 75 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f  lue of the actio
4010: 6e 5f 6e 75 6d 62 65 72 20 6f 75 74 70 75 74 20  n_number output 
4020: 69 73 0a 2a 2a 20 61 41 63 74 69 6f 6e 5b 58 5d  is.** aAction[X]
4030: 2e 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  .action.  If the
4040: 20 6c 6f 6f 6b 61 68 65 61 64 73 20 64 6f 20 6e   lookaheads do n
4050: 6f 74 20 6d 61 74 63 68 20 74 68 65 6e 20 74 68  ot match then th
4060: 65 0a 2a 2a 20 64 65 66 61 75 6c 74 20 61 63 74  e.** default act
4070: 69 6f 6e 20 66 6f 72 20 74 68 65 20 73 74 61 74  ion for the stat
4080: 65 5f 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75  e_number is retu
4090: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  rned..**.** All 
40a0: 61 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  actions associat
40b0: 65 64 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ed with a single
40c0: 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 61 72   state_number ar
40d0: 65 20 66 69 72 73 74 20 65 6e 74 65 72 65 64 0a  e first entered.
40e0: 2a 2a 20 69 6e 74 6f 20 61 4c 6f 6f 6b 61 68 65  ** into aLookahe
40f0: 61 64 5b 5d 20 75 73 69 6e 67 20 6d 75 6c 74 69  ad[] using multi
4100: 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20 61 63 74  ple calls to act
4110: 74 61 62 5f 61 63 74 69 6f 6e 28 29 2e 20 20 54  tab_action().  T
4120: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 63 74 69  hen the .** acti
4130: 6f 6e 73 20 66 6f 72 20 74 68 61 74 20 73 69 6e  ons for that sin
4140: 67 6c 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72  gle state_number
4150: 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 74 6f   are placed into
4160: 20 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 0a   the aAction[] .
4170: 2a 2a 20 61 72 72 61 79 20 77 69 74 68 20 61 20  ** array with a 
4180: 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 61  single call to a
4190: 63 74 74 61 62 5f 69 6e 73 65 72 74 28 29 2e 20  cttab_insert(). 
41a0: 20 54 68 65 20 61 63 74 74 61 62 5f 69 6e 73 65   The acttab_inse
41b0: 72 74 28 29 20 63 61 6c 6c 0a 2a 2a 20 61 6c 73  rt() call.** als
41c0: 6f 20 72 65 73 65 74 73 20 74 68 65 20 61 4c 6f  o resets the aLo
41d0: 6f 6b 61 68 65 61 64 5b 5d 20 61 72 72 61 79 20  okahead[] array 
41e0: 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66  in preparation f
41f0: 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 73  or the next.** s
4200: 74 61 74 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a  tate number..*/.
4210: 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64  struct lookahead
4220: 5f 61 63 74 69 6f 6e 20 7b 0a 20 20 69 6e 74 20  _action {.  int 
4230: 6c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  lookahead;      
4240: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
4250: 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  of the lookahead
4260: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20   token */.  int 
4270: 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  action;         
4280: 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e         /* Action
4290: 20 74 6f 20 74 61 6b 65 20 6f 6e 20 74 68 65 20   to take on the 
42a0: 67 69 76 65 6e 20 6c 6f 6f 6b 61 68 65 61 64 20  given lookahead 
42b0: 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74  */.};.typedef st
42c0: 72 75 63 74 20 61 63 74 74 61 62 20 61 63 74 74  ruct acttab actt
42d0: 61 62 3b 0a 73 74 72 75 63 74 20 61 63 74 74 61  ab;.struct actta
42e0: 62 20 7b 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f  b {.  int nActio
42f0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
4300: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4310: 75 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 41  used slots in aA
4320: 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ction[] */.  int
4330: 20 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20   nActionAlloc;  
4340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f            /* Slo
4350: 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ts allocated for
4360: 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20   aAction[] */.  
4370: 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64  struct lookahead
4380: 5f 61 63 74 69 6f 6e 0a 20 20 20 20 2a 61 41 63  _action.    *aAc
4390: 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  tion,           
43a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 79 79         /* The yy
43b0: 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20  _action[] table 
43c0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
43d0: 6f 6e 20 2a 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b  on */.    *aLook
43e0: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
43f0: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
4400: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
4410: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e   set */.  int mn
4420: 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  Lookahead;      
4430: 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75         /* Minimu
4440: 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c  m aLookahead[].l
4450: 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e  ookahead */.  in
4460: 74 20 6d 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20  t mnAction;     
4470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
4480: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
4490: 77 69 74 68 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64  with mnLookahead
44a0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b   */.  int mxLook
44b0: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
44c0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 4c     /* Maximum aL
44d0: 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61  ookahead[].looka
44e0: 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  head */.  int nL
44f0: 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20  ookahead;       
4500: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73         /* Used s
4510: 6c 6f 74 73 20 69 6e 20 61 4c 6f 6f 6b 61 68 65  lots in aLookahe
4520: 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  ad[] */.  int nL
4530: 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 3b 20 20  ookaheadAlloc;  
4540: 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20         /* Slots 
4550: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61 4c 6f  allocated in aLo
4560: 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 7d 3b 0a  okahead[] */.};.
4570: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ./* Return the n
4580: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
4590: 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f   in the yy_actio
45a0: 6e 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69  n table */.#defi
45b0: 6e 65 20 61 63 74 74 61 62 5f 73 69 7a 65 28 58  ne acttab_size(X
45c0: 29 20 28 28 58 29 2d 3e 6e 41 63 74 69 6f 6e 29  ) ((X)->nAction)
45d0: 0a 0a 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66  ../* The value f
45e0: 6f 72 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72  or the N-th entr
45f0: 79 20 69 6e 20 79 79 5f 61 63 74 69 6f 6e 20 2a  y in yy_action *
4600: 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61 62  /.#define acttab
4610: 5f 79 79 61 63 74 69 6f 6e 28 58 2c 4e 29 20 20  _yyaction(X,N)  
4620: 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d  ((X)->aAction[N]
4630: 2e 61 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65  .action)../* The
4640: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e   value for the N
4650: 2d 74 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f  -th entry in yy_
4660: 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 23 64 65  lookahead */.#de
4670: 66 69 6e 65 20 61 63 74 74 61 62 5f 79 79 6c 6f  fine acttab_yylo
4680: 6f 6b 61 68 65 61 64 28 58 2c 4e 29 20 20 28 28  okahead(X,N)  ((
4690: 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 6c  X)->aAction[N].l
46a0: 6f 6f 6b 61 68 65 61 64 29 0a 0a 2f 2a 20 46 72  ookahead)../* Fr
46b0: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73  ee all memory as
46c0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
46d0: 65 20 67 69 76 65 6e 20 61 63 74 74 61 62 20 2a  e given acttab *
46e0: 2f 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 66 72  /.void acttab_fr
46f0: 65 65 28 61 63 74 74 61 62 20 2a 70 29 7b 0a 20  ee(acttab *p){. 
4700: 20 66 72 65 65 28 20 70 2d 3e 61 41 63 74 69 6f   free( p->aActio
4710: 6e 20 29 3b 0a 20 20 66 72 65 65 28 20 70 2d 3e  n );.  free( p->
4720: 61 4c 6f 6f 6b 61 68 65 61 64 20 29 3b 0a 20 20  aLookahead );.  
4730: 66 72 65 65 28 20 70 20 29 3b 0a 7d 0a 0a 2f 2a  free( p );.}../*
4740: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
4750: 61 63 74 74 61 62 20 73 74 72 75 63 74 75 72 65  acttab structure
4760: 20 2a 2f 0a 61 63 74 74 61 62 20 2a 61 63 74 74   */.acttab *actt
4770: 61 62 5f 61 6c 6c 6f 63 28 76 6f 69 64 29 7b 0a  ab_alloc(void){.
4780: 20 20 61 63 74 74 61 62 20 2a 70 20 3d 20 28 61    acttab *p = (a
4790: 63 74 74 61 62 20 2a 29 20 63 61 6c 6c 6f 63 28  cttab *) calloc(
47a0: 20 31 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29   1, sizeof(*p) )
47b0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
47c0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
47d0: 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c  rr,"Unable to al
47e0: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
47f0: 72 20 61 20 6e 65 77 20 61 63 74 74 61 62 2e 22  r a new acttab."
4800: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
4810: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20    }.  memset(p, 
4820: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
4830: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
4840: 2a 20 41 64 64 20 61 20 6e 65 77 20 61 63 74 69  * Add a new acti
4850: 6f 6e 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  on to the curren
4860: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  t transaction se
4870: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t.  .**.** This 
4880: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4890: 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
48a0: 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 61 20  lookahead for a 
48b0: 70 61 72 74 69 63 75 6c 61 72 0a 2a 2a 20 73 74  particular.** st
48c0: 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 61 63 74  ate..*/.void act
48d0: 74 61 62 5f 61 63 74 69 6f 6e 28 61 63 74 74 61  tab_action(actta
48e0: 62 20 2a 70 2c 20 69 6e 74 20 6c 6f 6f 6b 61 68  b *p, int lookah
48f0: 65 61 64 2c 20 69 6e 74 20 61 63 74 69 6f 6e 29  ead, int action)
4900: 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b  {.  if( p->nLook
4910: 61 68 65 61 64 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61  ahead>=p->nLooka
4920: 68 65 61 64 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  headAlloc ){.   
4930: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c   p->nLookaheadAl
4940: 6c 6f 63 20 2b 3d 20 32 35 3b 0a 20 20 20 20 70  loc += 25;.    p
4950: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 28  ->aLookahead = (
4960: 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64  struct lookahead
4970: 5f 61 63 74 69 6f 6e 20 2a 29 20 72 65 61 6c 6c  _action *) reall
4980: 6f 63 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  oc( p->aLookahea
4990: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49b0: 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 6f 6f 6b 61  sizeof(p->aLooka
49c0: 68 65 61 64 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f  head[0])*p->nLoo
49d0: 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29 3b 0a 20  kaheadAlloc );. 
49e0: 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61     if( p->aLooka
49f0: 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  head==0 ){.     
4a00: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
4a10: 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e  "malloc failed\n
4a20: 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  ");.      exit(1
4a30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
4a40: 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  f( p->nLookahead
4a50: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6d 78  ==0 ){.    p->mx
4a60: 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b  Lookahead = look
4a70: 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e  ahead;.    p->mn
4a80: 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b  Lookahead = look
4a90: 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e  ahead;.    p->mn
4aa0: 41 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b  Action = action;
4ab0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
4ac0: 28 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64  ( p->mxLookahead
4ad0: 3c 6c 6f 6f 6b 61 68 65 61 64 20 29 20 70 2d 3e  <lookahead ) p->
4ae0: 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f  mxLookahead = lo
4af0: 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 69 66 28  okahead;.    if(
4b00: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3e   p->mnLookahead>
4b10: 6c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20  lookahead ){.   
4b20: 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61     p->mnLookahea
4b30: 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20  d = lookahead;. 
4b40: 20 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e       p->mnAction
4b50: 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d   = action;.    }
4b60: 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61  .  }.  p->aLooka
4b70: 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  head[p->nLookahe
4b80: 61 64 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20  ad].lookahead = 
4b90: 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 70 2d 3e  lookahead;.  p->
4ba0: 61 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c  aLookahead[p->nL
4bb0: 6f 6f 6b 61 68 65 61 64 5d 2e 61 63 74 69 6f 6e  ookahead].action
4bc0: 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 70 2d 3e   = action;.  p->
4bd0: 6e 4c 6f 6f 6b 61 68 65 61 64 2b 2b 3b 0a 7d 0a  nLookahead++;.}.
4be0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 74  ./*.** Add the t
4bf0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62  ransaction set b
4c00: 75 69 6c 74 20 75 70 20 77 69 74 68 20 70 72 69  uilt up with pri
4c10: 6f 72 20 63 61 6c 6c 73 20 74 6f 20 61 63 74 74  or calls to actt
4c20: 61 62 5f 61 63 74 69 6f 6e 28 29 0a 2a 2a 20 69  ab_action().** i
4c30: 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
4c40: 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20 54  action table.  T
4c50: 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 74 72  hen reset the tr
4c60: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62 61  ansaction set ba
4c70: 63 6b 0a 2a 2a 20 74 6f 20 61 6e 20 65 6d 70 74  ck.** to an empt
4c80: 79 20 73 65 74 20 69 6e 20 70 72 65 70 61 72 61  y set in prepara
4c90: 74 69 6f 6e 20 66 6f 72 20 61 20 6e 65 77 20 72  tion for a new r
4ca0: 6f 75 6e 64 20 6f 66 20 61 63 74 74 61 62 5f 61  ound of acttab_a
4cb0: 63 74 69 6f 6e 28 29 20 63 61 6c 6c 73 2e 0a 2a  ction() calls..*
4cc0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4cd0: 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  offset into the 
4ce0: 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20  action table of 
4cf0: 74 68 65 20 6e 65 77 20 74 72 61 6e 73 61 63 74  the new transact
4d00: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74 74  ion..*/.int actt
4d10: 61 62 5f 69 6e 73 65 72 74 28 61 63 74 74 61 62  ab_insert(acttab
4d20: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a   *p){.  int i, j
4d30: 2c 20 6b 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74  , k, n;.  assert
4d40: 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e  ( p->nLookahead>
4d50: 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  0 );..  /* Make 
4d60: 73 75 72 65 20 77 65 20 68 61 76 65 20 65 6e 6f  sure we have eno
4d70: 75 67 68 20 73 70 61 63 65 20 74 6f 20 68 6f 6c  ugh space to hol
4d80: 64 20 74 68 65 20 65 78 70 61 6e 64 65 64 20 61  d the expanded a
4d90: 63 74 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2a  ction table.  **
4da0: 20 69 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61   in the worst ca
4db0: 73 65 2e 20 20 54 68 65 20 77 6f 72 73 74 20 63  se.  The worst c
4dc0: 61 73 65 20 6f 63 63 75 72 73 20 69 66 20 74 68  ase occurs if th
4dd0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  e transaction se
4de0: 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61  t.  ** must be a
4df0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63  ppended to the c
4e00: 75 72 72 65 6e 74 20 61 63 74 69 6f 6e 20 74 61  urrent action ta
4e10: 62 6c 65 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 70  ble.  */.  n = p
4e20: 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mxLookahead + 
4e30: 31 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 41 63 74  1;.  if( p->nAct
4e40: 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d 3e 6e 41  ion + n >= p->nA
4e50: 63 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  ctionAlloc ){.  
4e60: 20 20 69 6e 74 20 6f 6c 64 41 6c 6c 6f 63 20 3d    int oldAlloc =
4e70: 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63   p->nActionAlloc
4e80: 3b 0a 20 20 20 20 70 2d 3e 6e 41 63 74 69 6f 6e  ;.    p->nAction
4e90: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69  Alloc = p->nActi
4ea0: 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e 6e 41 63 74  on + n + p->nAct
4eb0: 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32 30 3b 0a 20  ionAlloc + 20;. 
4ec0: 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 20 3d 20     p->aAction = 
4ed0: 28 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61  (struct lookahea
4ee0: 64 5f 61 63 74 69 6f 6e 20 2a 29 20 72 65 61 6c  d_action *) real
4ef0: 6c 6f 63 28 20 70 2d 3e 61 41 63 74 69 6f 6e 2c  loc( p->aAction,
4f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4f10: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
4f20: 66 28 70 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 29  f(p->aAction[0])
4f30: 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63  *p->nActionAlloc
4f40: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41  );.    if( p->aA
4f50: 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ction==0 ){.    
4f60: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
4f70: 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c  ,"malloc failed\
4f80: 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  n");.      exit(
4f90: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  1);.    }.    fo
4fa0: 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63 3b 20 69 3c  r(i=oldAlloc; i<
4fb0: 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b  p->nActionAlloc;
4fc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
4fd0: 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61  aAction[i].looka
4fe0: 68 65 61 64 20 3d 20 2d 31 3b 0a 20 20 20 20 20  head = -1;.     
4ff0: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 61   p->aAction[i].a
5000: 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  ction = -1;.    
5010: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e  }.  }..  /* Scan
5020: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 61 63   the existing ac
5030: 74 69 6f 6e 20 74 61 62 6c 65 20 6c 6f 6f 6b 69  tion table looki
5040: 6e 67 20 66 6f 72 20 61 6e 20 6f 66 66 73 65 74  ng for an offset
5050: 20 74 68 61 74 20 69 73 20 61 20 0a 20 20 2a 2a   that is a .  **
5060: 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68   duplicate of th
5070: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
5080: 63 74 69 6f 6e 20 73 65 74 2e 20 20 46 61 6c 6c  ction set.  Fall
5090: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
50a0: 0a 20 20 2a 2a 20 69 66 20 61 6e 64 20 77 68 65  .  ** if and whe
50b0: 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  n the duplicate 
50c0: 69 73 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20  is found..  **. 
50d0: 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64   ** i is the ind
50e0: 65 78 20 69 6e 20 70 2d 3e 61 41 63 74 69 6f 6e  ex in p->aAction
50f0: 5b 5d 20 77 68 65 72 65 20 70 2d 3e 6d 6e 4c 6f  [] where p->mnLo
5100: 6f 6b 61 68 65 61 64 20 69 73 20 69 6e 73 65 72  okahead is inser
5110: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ted..  */.  for(
5120: 69 3d 70 2d 3e 6e 41 63 74 69 6f 6e 2d 31 3b 20  i=p->nAction-1; 
5130: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
5140: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69  if( p->aAction[i
5150: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 70 2d 3e  ].lookahead==p->
5160: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20  mnLookahead ){. 
5170: 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6c 6f 6f 6b       /* All look
5180: 61 68 65 61 64 73 20 61 6e 64 20 61 63 74 69 6f  aheads and actio
5190: 6e 73 20 69 6e 20 74 68 65 20 61 4c 6f 6f 6b 61  ns in the aLooka
51a0: 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74 69  head[] transacti
51b0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74  on.      ** must
51c0: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
51d0: 68 65 20 63 61 6e 64 69 64 61 74 65 20 61 41 63  he candidate aAc
51e0: 74 69 6f 6e 5b 69 5d 20 65 6e 74 72 79 2e 20 2a  tion[i] entry. *
51f0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  /.      if( p->a
5200: 41 63 74 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e  Action[i].action
5210: 21 3d 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 29 20  !=p->mnAction ) 
5220: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
5230: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c  for(j=0; j<p->nL
5240: 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a  ookahead; j++){.
5250: 20 20 20 20 20 20 20 20 6b 20 3d 20 70 2d 3e 61          k = p->a
5260: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f  Lookahead[j].loo
5270: 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f  kahead - p->mnLo
5280: 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20  okahead + i;.   
5290: 20 20 20 20 20 69 66 28 20 6b 3c 30 20 7c 7c 20       if( k<0 || 
52a0: 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20  k>=p->nAction ) 
52b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
52c0: 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  f( p->aLookahead
52d0: 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 21 3d 70  [j].lookahead!=p
52e0: 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f  ->aAction[k].loo
52f0: 6b 61 68 65 61 64 20 29 20 62 72 65 61 6b 3b 0a  kahead ) break;.
5300: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
5310: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 61 63 74  Lookahead[j].act
5320: 69 6f 6e 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b  ion!=p->aAction[
5330: 6b 5d 2e 61 63 74 69 6f 6e 20 29 20 62 72 65 61  k].action ) brea
5340: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5350: 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61   if( j<p->nLooka
5360: 68 65 61 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  head ) continue;
5370: 0a 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 70 6f  ..      /* No po
5380: 73 73 69 62 6c 65 20 6c 6f 6f 6b 61 68 65 61 64  ssible lookahead
5390: 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 20 6e   value that is n
53a0: 6f 74 20 69 6e 20 74 68 65 20 61 4c 6f 6f 6b 61  ot in the aLooka
53b0: 68 65 61 64 5b 5d 0a 20 20 20 20 20 20 2a 2a 20  head[].      ** 
53c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
53d0: 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68 20  llowed to match 
53e0: 61 41 63 74 69 6f 6e 5b 69 5d 20 2a 2f 0a 20 20  aAction[i] */.  
53f0: 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20      n = 0;.     
5400: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
5410: 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Action; j++){.  
5420: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63        if( p->aAc
5430: 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[j].lookahea
5440: 64 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  d<0 ) continue;.
5450: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
5460: 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68  Action[j].lookah
5470: 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b  ead==j+p->mnLook
5480: 61 68 65 61 64 2d 69 20 29 20 6e 2b 2b 3b 0a 20  ahead-i ) n++;. 
5490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
54a0: 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61   n==p->nLookahea
54b0: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  d ){.        bre
54c0: 61 6b 3b 20 20 2f 2a 20 41 6e 20 65 78 61 63 74  ak;  /* An exact
54d0: 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 20   match is found 
54e0: 61 74 20 6f 66 66 73 65 74 20 69 20 2a 2f 0a 20  at offset i */. 
54f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5500: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 78 69  ..  /* If no exi
5510: 73 74 69 6e 67 20 6f 66 66 73 65 74 73 20 65 78  sting offsets ex
5520: 61 63 74 6c 79 20 6d 61 74 63 68 20 74 68 65 20  actly match the 
5530: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
5540: 69 6f 6e 2c 20 66 69 6e 64 20 61 6e 0a 20 20 2a  ion, find an.  *
5550: 2a 20 61 6e 20 65 6d 70 74 79 20 6f 66 66 73 65  * an empty offse
5560: 74 20 69 6e 20 74 68 65 20 61 41 63 74 69 6f 6e  t in the aAction
5570: 5b 5d 20 74 61 62 6c 65 20 69 6e 20 77 68 69 63  [] table in whic
5580: 68 20 77 65 20 63 61 6e 20 61 64 64 20 74 68 65  h we can add the
5590: 0a 20 20 2a 2a 20 61 4c 6f 6f 6b 61 68 65 61 64  .  ** aLookahead
55a0: 5b 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  [] transaction..
55b0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 3c 30 20 29    */.  if( i<0 )
55c0: 7b 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f  {.    /* Look fo
55d0: 72 20 68 6f 6c 65 73 20 69 6e 20 74 68 65 20 61  r holes in the a
55e0: 41 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 74  Action[] table t
55f0: 68 61 74 20 66 69 74 20 74 68 65 20 63 75 72 72  hat fit the curr
5600: 65 6e 74 0a 20 20 20 20 2a 2a 20 61 4c 6f 6f 6b  ent.    ** aLook
5610: 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74  ahead[] transact
5620: 69 6f 6e 2e 20 20 4c 65 61 76 65 20 69 20 73 65  ion.  Leave i se
5630: 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
5640: 6f 66 20 74 68 65 20 68 6f 6c 65 2e 0a 20 20 20  of the hole..   
5650: 20 2a 2a 20 49 66 20 6e 6f 20 68 6f 6c 65 73 20   ** If no holes 
5660: 61 72 65 20 66 6f 75 6e 64 2c 20 69 20 69 73 20  are found, i is 
5670: 6c 65 66 74 20 61 74 20 70 2d 3e 6e 41 63 74 69  left at p->nActi
5680: 6f 6e 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  on, which means 
5690: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
56a0: 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61  action will be a
56b0: 70 70 65 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  ppended. */.    
56c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 41  for(i=0; i<p->nA
56d0: 63 74 69 6f 6e 41 6c 6c 6f 63 20 2d 20 70 2d 3e  ctionAlloc - p->
56e0: 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b 20 69 2b 2b  mxLookahead; i++
56f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
5700: 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61  aAction[i].looka
5710: 68 65 61 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  head<0 ){.      
5720: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
5730: 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29  nLookahead; j++)
5740: 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20  {.          k = 
5750: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
5760: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e  .lookahead - p->
5770: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b  mnLookahead + i;
5780: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6b  .          if( k
5790: 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  <0 ) break;.    
57a0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63        if( p->aAc
57b0: 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[k].lookahea
57c0: 64 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  d>=0 ) break;.  
57d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
57e0: 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68  if( j<p->nLookah
57f0: 65 61 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ead ) continue;.
5800: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
5810: 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a   j<p->nAction; j
5820: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
5830: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d  f( p->aAction[j]
5840: 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d  .lookahead==j+p-
5850: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69 20 29  >mnLookahead-i )
5860: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5870: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  }.        if( j=
5880: 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 7b 0a 20  =p->nAction ){. 
5890: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20           break; 
58a0: 20 2f 2a 20 46 69 74 73 20 69 6e 20 65 6d 70 74   /* Fits in empt
58b0: 79 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 20 20 20  y slots */.     
58c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
58d0: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65   }.  }.  /* Inse
58e0: 72 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  rt transaction s
58f0: 65 74 20 61 74 20 69 6e 64 65 78 20 69 2e 20 2a  et at index i. *
5900: 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70  /.  for(j=0; j<p
5910: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b  ->nLookahead; j+
5920: 2b 29 7b 0a 20 20 20 20 6b 20 3d 20 70 2d 3e 61  +){.    k = p->a
5930: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f  Lookahead[j].loo
5940: 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f  kahead - p->mnLo
5950: 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20  okahead + i;.   
5960: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 20 3d   p->aAction[k] =
5970: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a   p->aLookahead[j
5980: 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 2d  ];.    if( k>=p-
5990: 3e 6e 41 63 74 69 6f 6e 20 29 20 70 2d 3e 6e 41  >nAction ) p->nA
59a0: 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b 0a 20 20 7d  ction = k+1;.  }
59b0: 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  .  p->nLookahead
59c0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 74 75   = 0;..  /* Retu
59d0: 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 74 68  rn the offset th
59e0: 61 74 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  at is added to t
59f0: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e 20  he lookahead in 
5a00: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
5a10: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 6e 74 6f  .  ** index into
5a20: 20 79 79 5f 61 63 74 69 6f 6e 20 6f 66 20 74 68   yy_action of th
5a30: 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 65  e action */.  re
5a40: 74 75 72 6e 20 69 20 2d 20 70 2d 3e 6d 6e 4c 6f  turn i - p->mnLo
5a50: 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 2a 2a  okahead;.}../***
5a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a70: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
5a80: 65 20 22 62 75 69 6c 64 2e 63 22 20 2a 2a 2a 2a  e "build.c" ****
5a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
5ab0: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 63 6f 6e   Routines to con
5ac0: 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20 66 69  struction the fi
5ad0: 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69  nite state machi
5ae0: 6e 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e  ne for the LEMON
5af0: 0a 2a 2a 20 70 61 72 73 65 72 20 67 65 6e 65 72  .** parser gener
5b00: 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e  ator..*/../* Fin
5b10: 64 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73  d a precedence s
5b20: 79 6d 62 6f 6c 20 6f 66 20 65 76 65 72 79 20 72  ymbol of every r
5b30: 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  ule in the gramm
5b40: 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 6f 73 65  ar..** .** Those
5b50: 20 72 75 6c 65 73 20 77 68 69 63 68 20 68 61 76   rules which hav
5b60: 65 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73  e a precedence s
5b70: 79 6d 62 6f 6c 20 63 6f 64 65 64 20 69 6e 20 74  ymbol coded in t
5b80: 68 65 20 69 6e 70 75 74 0a 2a 2a 20 67 72 61 6d  he input.** gram
5b90: 6d 61 72 20 75 73 69 6e 67 20 74 68 65 20 22 5b  mar using the "[
5ba0: 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74 72 75  symbol]" constru
5bb0: 63 74 20 77 69 6c 6c 20 61 6c 72 65 61 64 79 20  ct will already 
5bc0: 68 61 76 65 20 74 68 65 0a 2a 2a 20 72 70 2d 3e  have the.** rp->
5bd0: 70 72 65 63 73 79 6d 20 66 69 65 6c 64 20 66 69  precsym field fi
5be0: 6c 6c 65 64 2e 20 20 4f 74 68 65 72 20 72 75 6c  lled.  Other rul
5bf0: 65 73 20 74 61 6b 65 20 61 73 20 74 68 65 69 72  es take as their
5c00: 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73   precedence.** s
5c10: 79 6d 62 6f 6c 20 74 68 65 20 66 69 72 73 74 20  ymbol the first 
5c20: 52 48 53 20 73 79 6d 62 6f 6c 20 77 69 74 68 20  RHS symbol with 
5c30: 61 20 64 65 66 69 6e 65 64 20 70 72 65 63 65 64  a defined preced
5c40: 65 6e 63 65 2e 20 20 49 66 20 74 68 65 72 65 0a  ence.  If there.
5c50: 2a 2a 20 61 72 65 20 6e 6f 74 20 52 48 53 20 73  ** are not RHS s
5c60: 79 6d 62 6f 6c 73 20 77 69 74 68 20 61 20 64 65  ymbols with a de
5c70: 66 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65  fined precedence
5c80: 2c 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65  , the precedence
5c90: 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66 69 65 6c 64  .** symbol field
5ca0: 20 69 73 20 6c 65 66 74 20 62 6c 61 6e 6b 2e 0a   is left blank..
5cb0: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c 65  */.void FindRule
5cc0: 50 72 65 63 65 64 65 6e 63 65 73 28 73 74 72 75  Precedences(stru
5cd0: 63 74 20 6c 65 6d 6f 6e 20 2a 78 70 29 0a 7b 0a  ct lemon *xp).{.
5ce0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
5cf0: 70 3b 0a 20 20 66 6f 72 28 72 70 3d 78 70 2d 3e  p;.  for(rp=xp->
5d00: 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
5d10: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  >next){.    if( 
5d20: 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30 20 29  rp->precsym==0 )
5d30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  {.      int i, j
5d40: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
5d50: 20 69 3c 72 70 2d 3e 6e 72 68 73 20 26 26 20 72   i<rp->nrhs && r
5d60: 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30 3b 20 69  p->precsym==0; i
5d70: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
5d80: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
5d90: 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
5da0: 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70       if( sp->typ
5db0: 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
5dc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
5dd0: 72 28 6a 3d 30 3b 20 6a 3c 73 70 2d 3e 6e 73 75  r(j=0; j<sp->nsu
5de0: 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  bsym; j++){.    
5df0: 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e          if( sp->
5e00: 73 75 62 73 79 6d 5b 6a 5d 2d 3e 70 72 65 63 3e  subsym[j]->prec>
5e10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
5e20: 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20      rp->precsym 
5e30: 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 3b  = sp->subsym[j];
5e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
5e50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
5e60: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
5e70: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
5e80: 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b  ( sp->prec>=0 ){
5e90: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70  .          rp->p
5ea0: 72 65 63 73 79 6d 20 3d 20 72 70 2d 3e 72 68 73  recsym = rp->rhs
5eb0: 5b 69 5d 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 0a  [i];..}.      }.
5ec0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5ed0: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61  rn;.}../* Find a
5ee0: 6c 6c 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20  ll nonterminals 
5ef0: 77 68 69 63 68 20 77 69 6c 6c 20 67 65 6e 65 72  which will gener
5f00: 61 74 65 20 74 68 65 20 65 6d 70 74 79 20 73 74  ate the empty st
5f10: 72 69 6e 67 2e 0a 2a 2a 20 54 68 65 6e 20 67 6f  ring..** Then go
5f20: 20 62 61 63 6b 20 61 6e 64 20 63 6f 6d 70 75 74   back and comput
5f30: 65 20 74 68 65 20 66 69 72 73 74 20 73 65 74 73  e the first sets
5f40: 20 6f 66 20 65 76 65 72 79 20 6e 6f 6e 74 65 72   of every nonter
5f50: 6d 69 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 66 69  minal..** The fi
5f60: 72 73 74 20 73 65 74 20 69 73 20 74 68 65 20 73  rst set is the s
5f70: 65 74 20 6f 66 20 61 6c 6c 20 74 65 72 6d 69 6e  et of all termin
5f80: 61 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68  al symbols which
5f90: 20 63 61 6e 20 62 65 67 69 6e 0a 2a 2a 20 61 20   can begin.** a 
5fa0: 73 74 72 69 6e 67 20 67 65 6e 65 72 61 74 65 64  string generated
5fb0: 20 62 79 20 74 68 61 74 20 6e 6f 6e 74 65 72 6d   by that nonterm
5fc0: 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69  inal..*/.void Fi
5fd0: 6e 64 46 69 72 73 74 53 65 74 73 28 73 74 72 75  ndFirstSets(stru
5fe0: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
5ff0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
6000: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
6010: 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b  .  int progress;
6020: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ..  for(i=0; i<l
6030: 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
6040: 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79  +){.    lemp->sy
6050: 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61  mbols[i]->lambda
6060: 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a   = LEMON_FALSE;.
6070: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6c 65 6d 70    }.  for(i=lemp
6080: 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 3c 6c  ->nterminal; i<l
6090: 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
60a0: 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79  +){.    lemp->sy
60b0: 6d 62 6f 6c 73 5b 69 5d 2d 3e 66 69 72 73 74 73  mbols[i]->firsts
60c0: 65 74 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20  et = SetNew();. 
60d0: 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 63   }..  /* First c
60e0: 6f 6d 70 75 74 65 20 61 6c 6c 20 6c 61 6d 62 64  ompute all lambd
60f0: 61 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20  as */.  do{.    
6100: 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  progress = 0;.  
6110: 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
6120: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
6130: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
6140: 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61   rp->lhs->lambda
6150: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6160: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
6170: 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
6180: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
6190: 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72  mbol *sp = rp->r
61a0: 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  hs[i];.         
61b0: 69 66 28 20 73 70 2d 3e 74 79 70 65 21 3d 54 45  if( sp->type!=TE
61c0: 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 6c 61  RMINAL || sp->la
61d0: 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53  mbda==LEMON_FALS
61e0: 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  E ) break;.     
61f0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d   }.      if( i==
6200: 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20  rp->nrhs ){.    
6210: 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d      rp->lhs->lam
6220: 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45  bda = LEMON_TRUE
6230: 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 67 72 65  ;.        progre
6240: 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ss = 1;.      }.
6250: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
6260: 70 72 6f 67 72 65 73 73 20 29 3b 0a 0a 20 20 2f  progress );..  /
6270: 2a 20 4e 6f 77 20 63 6f 6d 70 75 74 65 20 61 6c  * Now compute al
6280: 6c 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a  l first sets */.
6290: 20 20 64 6f 7b 0a 20 20 20 20 73 74 72 75 63 74    do{.    struct
62a0: 20 73 79 6d 62 6f 6c 20 2a 73 31 2c 20 2a 73 32   symbol *s1, *s2
62b0: 3b 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d  ;.    progress =
62c0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c   0;.    for(rp=l
62d0: 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
62e0: 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
62f0: 20 20 20 73 31 20 3d 20 72 70 2d 3e 6c 68 73 3b     s1 = rp->lhs;
6300: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
6310: 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
6320: 7b 0a 20 20 20 20 20 20 20 20 73 32 20 3d 20 72  {.        s2 = r
6330: 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
6340: 20 20 20 69 66 28 20 73 32 2d 3e 74 79 70 65 3d     if( s2->type=
6350: 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  =TERMINAL ){.   
6360: 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20         progress 
6370: 2b 3d 20 53 65 74 41 64 64 28 73 31 2d 3e 66 69  += SetAdd(s1->fi
6380: 72 73 74 73 65 74 2c 73 32 2d 3e 69 6e 64 65 78  rstset,s2->index
6390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
63a0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
63b0: 65 20 69 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d  e if( s2->type==
63c0: 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
63d0: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
63e0: 3d 30 3b 20 6a 3c 73 32 2d 3e 6e 73 75 62 73 79  =0; j<s2->nsubsy
63f0: 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; j++){.       
6400: 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d       progress +=
6410: 20 53 65 74 41 64 64 28 73 31 2d 3e 66 69 72 73   SetAdd(s1->firs
6420: 74 73 65 74 2c 73 32 2d 3e 73 75 62 73 79 6d 5b  tset,s2->subsym[
6430: 6a 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  j]->index);.    
6440: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6450: 20 20 62 72 65 61 6b 3b 0a 09 7d 65 6c 73 65 20    break;..}else 
6460: 69 66 28 20 73 31 3d 3d 73 32 20 29 7b 0a 20 20  if( s1==s2 ){.  
6470: 20 20 20 20 20 20 20 20 69 66 28 20 73 31 2d 3e          if( s1->
6480: 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41  lambda==LEMON_FA
6490: 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 7d 65  LSE ) break;..}e
64a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
64b0: 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 55 6e  rogress += SetUn
64c0: 69 6f 6e 28 73 31 2d 3e 66 69 72 73 74 73 65 74  ion(s1->firstset
64d0: 2c 73 32 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a  ,s2->firstset);.
64e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 32            if( s2
64f0: 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f  ->lambda==LEMON_
6500: 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09  FALSE ) break;..
6510: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
6520: 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65    }while( progre
6530: 73 73 20 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ss );.  return;.
6540: 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c  }../* Compute al
6550: 6c 20 4c 52 28 30 29 20 73 74 61 74 65 73 20 66  l LR(0) states f
6560: 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20  or the grammar. 
6570: 20 4c 69 6e 6b 73 0a 2a 2a 20 61 72 65 20 61 64   Links.** are ad
6580: 64 65 64 20 74 6f 20 62 65 74 77 65 65 6e 20 73  ded to between s
6590: 6f 6d 65 20 73 74 61 74 65 73 20 73 6f 20 74 68  ome states so th
65a0: 61 74 20 74 68 65 20 4c 52 28 31 29 20 66 6f 6c  at the LR(1) fol
65b0: 6c 6f 77 20 73 65 74 73 0a 2a 2a 20 63 61 6e 20  low sets.** can 
65c0: 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61 74 65  be computed late
65d0: 72 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 73 74  r..*/.PRIVATE st
65e0: 72 75 63 74 20 73 74 61 74 65 20 2a 67 65 74 73  ruct state *gets
65f0: 74 61 74 65 28 73 74 72 75 63 74 20 6c 65 6d 6f  tate(struct lemo
6600: 6e 20 2a 29 3b 20 20 2f 2a 20 66 6f 72 77 61 72  n *);  /* forwar
6610: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 76  d reference */.v
6620: 6f 69 64 20 46 69 6e 64 53 74 61 74 65 73 28 73  oid FindStates(s
6630: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
6640: 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79  p).{.  struct sy
6650: 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75  mbol *sp;.  stru
6660: 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20  ct rule *rp;..  
6670: 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28  Configlist_init(
6680: 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  );..  /* Find th
6690: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a  e start symbol *
66a0: 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74  /.  if( lemp->st
66b0: 61 72 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20  art ){.    sp = 
66c0: 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70  Symbol_find(lemp
66d0: 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66  ->start);.    if
66e0: 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ( sp==0 ){.     
66f0: 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
6700: 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65  filename,0,."The
6710: 20 73 70 65 63 69 66 69 65 64 20 73 74 61 72 74   specified start
6720: 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 69   symbol \"%s\" i
6730: 73 20 6e 6f 74 20 5c 0a 69 6e 20 61 20 6e 6f 6e  s not \.in a non
6740: 74 65 72 6d 69 6e 61 6c 20 6f 66 20 74 68 65 20  terminal of the 
6750: 67 72 61 6d 6d 61 72 2e 20 20 5c 22 25 73 5c 22  grammar.  \"%s\"
6760: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 73   will be used as
6770: 20 74 68 65 20 73 74 61 72 74 20 5c 0a 73 79 6d   the start \.sym
6780: 62 6f 6c 20 69 6e 73 74 65 61 64 2e 22 2c 6c 65  bol instead.",le
6790: 6d 70 2d 3e 73 74 61 72 74 2c 6c 65 6d 70 2d 3e  mp->start,lemp->
67a0: 72 75 6c 65 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29  rule->lhs->name)
67b0: 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72  ;.      lemp->er
67c0: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
67d0: 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d  sp = lemp->rule-
67e0: 3e 6c 68 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  >lhs;.    }.  }e
67f0: 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65  lse{.    sp = le
6800: 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20  mp->rule->lhs;. 
6810: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
6820: 72 65 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  re the start sym
6830: 62 6f 6c 20 64 6f 65 73 6e 27 74 20 6f 63 63 75  bol doesn't occu
6840: 72 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  r on the right-h
6850: 61 6e 64 20 73 69 64 65 20 6f 66 0a 20 20 2a 2a  and side of.  **
6860: 20 61 6e 79 20 72 75 6c 65 2e 20 20 52 65 70 6f   any rule.  Repo
6870: 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69  rt an error if i
6880: 74 20 64 6f 65 73 2e 20 20 28 59 41 43 43 20 77  t does.  (YACC w
6890: 6f 75 6c 64 20 67 65 6e 65 72 61 74 65 20 61 20  ould generate a 
68a0: 6e 65 77 0a 20 20 2a 2a 20 73 74 61 72 74 20 73  new.  ** start s
68b0: 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73 20 63 61  ymbol in this ca
68c0: 73 65 2e 29 20 2a 2f 0a 20 20 66 6f 72 28 72 70  se.) */.  for(rp
68d0: 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
68e0: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
68f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
6900: 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
6910: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  s; i++){.      i
6920: 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d 3d 3d 73  f( rp->rhs[i]==s
6930: 70 20 29 7b 20 20 20 2f 2a 20 46 49 58 20 4d 45  p ){   /* FIX ME
6940: 3a 20 20 44 65 61 6c 20 77 69 74 68 20 6d 75 6c  :  Deal with mul
6950: 74 69 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20  titerminals */. 
6960: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
6970: 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30  lemp->filename,0
6980: 2c 0a 22 54 68 65 20 73 74 61 72 74 20 73 79 6d  ,."The start sym
6990: 62 6f 6c 20 5c 22 25 73 5c 22 20 6f 63 63 75 72  bol \"%s\" occur
69a0: 73 20 6f 6e 20 74 68 65 20 5c 0a 72 69 67 68 74  s on the \.right
69b0: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20  -hand side of a 
69c0: 72 75 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20  rule. This will 
69d0: 72 65 73 75 6c 74 20 69 6e 20 61 20 70 61 72 73  result in a pars
69e0: 65 72 20 77 68 69 63 68 20 5c 0a 64 6f 65 73 20  er which \.does 
69f0: 6e 6f 74 20 77 6f 72 6b 20 70 72 6f 70 65 72 6c  not work properl
6a00: 79 2e 22 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  y.",sp->name);. 
6a10: 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72         lemp->err
6a20: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
6a30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
6a40: 20 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69   The basis confi
6a50: 67 75 72 61 74 69 6f 6e 20 73 65 74 20 66 6f 72  guration set for
6a60: 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65   the first state
6a70: 0a 20 20 2a 2a 20 69 73 20 61 6c 6c 20 72 75 6c  .  ** is all rul
6a80: 65 73 20 77 68 69 63 68 20 68 61 76 65 20 74 68  es which have th
6a90: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 61  e start symbol a
6aa0: 73 20 74 68 65 69 72 0a 20 20 2a 2a 20 6c 65 66  s their.  ** lef
6ab0: 74 2d 68 61 6e 64 20 73 69 64 65 20 2a 2f 0a 20  t-hand side */. 
6ac0: 20 66 6f 72 28 72 70 3d 73 70 2d 3e 72 75 6c 65   for(rp=sp->rule
6ad0: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
6ae0: 74 6c 68 73 29 7b 0a 20 20 20 20 73 74 72 75 63  tlhs){.    struc
6af0: 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 70  t config *newcfp
6b00: 3b 0a 20 20 20 20 72 70 2d 3e 6c 68 73 53 74 61  ;.    rp->lhsSta
6b10: 72 74 20 3d 20 31 3b 0a 20 20 20 20 6e 65 77 63  rt = 1;.    newc
6b20: 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f  fp = Configlist_
6b30: 61 64 64 62 61 73 69 73 28 72 70 2c 30 29 3b 0a  addbasis(rp,0);.
6b40: 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66      SetAdd(newcf
6b50: 70 2d 3e 66 77 73 2c 30 29 3b 0a 20 20 7d 0a 0a  p->fws,0);.  }..
6b60: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
6b70: 20 66 69 72 73 74 20 73 74 61 74 65 2e 20 20 41   first state.  A
6b80: 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 20  ll other states 
6b90: 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 6f 6d  will be.  ** com
6ba0: 70 75 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61  puted automatica
6bb0: 6c 6c 79 20 64 75 72 69 6e 67 20 74 68 65 20 63  lly during the c
6bc0: 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66 20 74 68  omputation of th
6bd0: 65 20 66 69 72 73 74 20 6f 6e 65 2e 0a 20 20 2a  e first one..  *
6be0: 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70  * The returned p
6bf0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69  ointer to the fi
6c00: 72 73 74 20 73 74 61 74 65 20 69 73 20 6e 6f 74  rst state is not
6c10: 20 75 73 65 64 2e 20 2a 2f 0a 20 20 28 76 6f 69   used. */.  (voi
6c20: 64 29 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29  d)getstate(lemp)
6c30: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
6c40: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
6c50: 65 72 20 74 6f 20 61 20 73 74 61 74 65 20 77 68  er to a state wh
6c60: 69 63 68 20 69 73 20 64 65 73 63 72 69 62 65 64  ich is described
6c70: 20 62 79 20 74 68 65 20 63 6f 6e 66 69 67 75 72   by the configur
6c80: 61 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20 77 68  ation.** list wh
6c90: 69 63 68 20 68 61 73 20 62 65 65 6e 20 62 75 69  ich has been bui
6ca0: 6c 74 20 66 72 6f 6d 20 63 61 6c 6c 73 20 74 6f  lt from calls to
6cb0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 2e   Configlist_add.
6cc0: 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64  .*/.PRIVATE void
6cd0: 20 62 75 69 6c 64 73 68 69 66 74 73 28 73 74 72   buildshifts(str
6ce0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20 73 74 72  uct lemon *, str
6cf0: 75 63 74 20 73 74 61 74 65 20 2a 29 3b 20 2f 2a  uct state *); /*
6d00: 20 46 6f 72 77 64 20 72 65 66 20 2a 2f 0a 50 52   Forwd ref */.PR
6d10: 49 56 41 54 45 20 73 74 72 75 63 74 20 73 74 61  IVATE struct sta
6d20: 74 65 20 2a 67 65 74 73 74 61 74 65 28 73 74 72  te *getstate(str
6d30: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
6d40: 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .{.  struct conf
6d50: 69 67 20 2a 63 66 70 2c 20 2a 62 70 3b 0a 20 20  ig *cfp, *bp;.  
6d60: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
6d70: 70 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74  p;..  /* Extract
6d80: 20 74 68 65 20 73 6f 72 74 65 64 20 62 61 73 69   the sorted basi
6d90: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 73 74 61  s of the new sta
6da0: 74 65 2e 20 20 54 68 65 20 62 61 73 69 73 20 77  te.  The basis w
6db0: 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20  as constructed. 
6dc0: 20 2a 2a 20 62 79 20 70 72 69 6f 72 20 63 61 6c   ** by prior cal
6dd0: 6c 73 20 74 6f 20 22 43 6f 6e 66 69 67 6c 69 73  ls to "Configlis
6de0: 74 5f 61 64 64 62 61 73 69 73 28 29 22 2e 20 2a  t_addbasis()". *
6df0: 2f 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73  /.  Configlist_s
6e00: 6f 72 74 62 61 73 69 73 28 29 3b 0a 20 20 62 70  ortbasis();.  bp
6e10: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61   = Configlist_ba
6e20: 73 69 73 28 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  sis();..  /* Get
6e30: 20 61 20 73 74 61 74 65 20 77 69 74 68 20 74 68   a state with th
6e40: 65 20 73 61 6d 65 20 62 61 73 69 73 20 2a 2f 0a  e same basis */.
6e50: 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f 66 69    stp = State_fi
6e60: 6e 64 28 62 70 29 3b 0a 20 20 69 66 28 20 73 74  nd(bp);.  if( st
6e70: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 73 74  p ){.    /* A st
6e80: 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ate with the sam
6e90: 65 20 62 61 73 69 73 20 61 6c 72 65 61 64 79 20  e basis already 
6ea0: 65 78 69 73 74 73 21 20 20 43 6f 70 79 20 61 6c  exists!  Copy al
6eb0: 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74  l the follow-set
6ec0: 0a 20 20 20 20 2a 2a 20 70 72 6f 70 61 67 61 74  .    ** propagat
6ed0: 69 6f 6e 20 6c 69 6e 6b 73 20 66 72 6f 6d 20 74  ion links from t
6ee0: 68 65 20 73 74 61 74 65 20 75 6e 64 65 72 20 63  he state under c
6ef0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 74 6f  onstruction into
6f00: 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 65 65   the.    ** pree
6f10: 78 69 73 74 69 6e 67 20 73 74 61 74 65 2c 20 74  xisting state, t
6f20: 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
6f30: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 65  nter to the pree
6f40: 78 69 73 74 69 6e 67 20 73 74 61 74 65 20 2a 2f  xisting state */
6f50: 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .    struct conf
6f60: 69 67 20 2a 78 2c 20 2a 79 3b 0a 20 20 20 20 66  ig *x, *y;.    f
6f70: 6f 72 28 78 3d 62 70 2c 20 79 3d 73 74 70 2d 3e  or(x=bp, y=stp->
6f80: 62 70 3b 20 78 20 26 26 20 79 3b 20 78 3d 78 2d  bp; x && y; x=x-
6f90: 3e 62 70 2c 20 79 3d 79 2d 3e 62 70 29 7b 0a 20  >bp, y=y->bp){. 
6fa0: 20 20 20 20 20 50 6c 69 6e 6b 5f 63 6f 70 79 28       Plink_copy(
6fb0: 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e 62 70 6c 70  &y->bplp,x->bplp
6fc0: 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 64  );.      Plink_d
6fd0: 65 6c 65 74 65 28 78 2d 3e 66 70 6c 70 29 3b 0a  elete(x->fplp);.
6fe0: 20 20 20 20 20 20 78 2d 3e 66 70 6c 70 20 3d 20        x->fplp = 
6ff0: 78 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20  x->bplp = 0;.   
7000: 20 7d 0a 20 20 20 20 63 66 70 20 3d 20 43 6f 6e   }.    cfp = Con
7010: 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29  figlist_return()
7020: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74  ;.    Configlist
7030: 5f 65 61 74 28 63 66 70 29 3b 0a 20 20 7d 65 6c  _eat(cfp);.  }el
7040: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
7050: 72 65 61 6c 6c 79 20 69 73 20 61 20 6e 65 77 20  really is a new 
7060: 73 74 61 74 65 2e 20 20 43 6f 6e 73 74 72 75 63  state.  Construc
7070: 74 20 61 6c 6c 20 74 68 65 20 64 65 74 61 69 6c  t all the detail
7080: 73 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c  s */.    Configl
7090: 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c 65 6d 70  ist_closure(lemp
70a0: 29 3b 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  );    /* Compute
70b0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
70c0: 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20  on closure */.  
70d0: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72    Configlist_sor
70e0: 74 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f  t();           /
70f0: 2a 20 53 6f 72 74 20 74 68 65 20 63 6f 6e 66 69  * Sort the confi
7100: 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65  guration closure
7110: 20 2a 2f 0a 20 20 20 20 63 66 70 20 3d 20 43 6f   */.    cfp = Co
7120: 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28  nfiglist_return(
7130: 29 3b 20 20 20 2f 2a 20 47 65 74 20 61 20 70 6f  );   /* Get a po
7140: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6e  inter to the con
7150: 66 69 67 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20  fig list */.    
7160: 73 74 70 20 3d 20 53 74 61 74 65 5f 6e 65 77 28  stp = State_new(
7170: 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );           /* 
7180: 41 20 6e 65 77 20 73 74 61 74 65 20 73 74 72 75  A new state stru
7190: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 4d 65 6d  cture */.    Mem
71a0: 6f 72 79 43 68 65 63 6b 28 73 74 70 29 3b 0a 20  oryCheck(stp);. 
71b0: 20 20 20 73 74 70 2d 3e 62 70 20 3d 20 62 70 3b     stp->bp = bp;
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71d0: 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  /* Remember the 
71e0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 61  configuration ba
71f0: 73 69 73 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e  sis */.    stp->
7200: 63 66 70 20 3d 20 63 66 70 3b 20 20 20 20 20 20  cfp = cfp;      
7210: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d          /* Remem
7220: 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ber the configur
7230: 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f  ation closure */
7240: 0a 20 20 20 20 73 74 70 2d 3e 73 74 61 74 65 6e  .    stp->staten
7250: 75 6d 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  um = lemp->nstat
7260: 65 2b 2b 3b 20 2f 2a 20 45 76 65 72 79 20 73 74  e++; /* Every st
7270: 61 74 65 20 67 65 74 73 20 61 20 73 65 71 75 65  ate gets a seque
7280: 6e 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  nce number */.  
7290: 20 20 73 74 70 2d 3e 61 70 20 3d 20 30 3b 20 20    stp->ap = 0;  
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
72b0: 2a 20 4e 6f 20 61 63 74 69 6f 6e 73 2c 20 79 65  * No actions, ye
72c0: 74 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 5f  t. */.    State_
72d0: 69 6e 73 65 72 74 28 73 74 70 2c 73 74 70 2d 3e  insert(stp,stp->
72e0: 62 70 29 3b 20 20 20 2f 2a 20 41 64 64 20 74 6f  bp);   /* Add to
72f0: 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c 65   the state table
7300: 20 2a 2f 0a 20 20 20 20 62 75 69 6c 64 73 68 69   */.    buildshi
7310: 66 74 73 28 6c 65 6d 70 2c 73 74 70 29 3b 20 20  fts(lemp,stp);  
7320: 20 20 20 20 20 2f 2a 20 52 65 63 75 72 73 69 76       /* Recursiv
7330: 65 6c 79 20 63 6f 6d 70 75 74 65 20 73 75 63 63  ely compute succ
7340: 65 73 73 6f 72 20 73 74 61 74 65 73 20 2a 2f 0a  essor states */.
7350: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 74 70    }.  return stp
7360: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7370: 6e 20 74 72 75 65 20 69 66 20 74 77 6f 20 73 79  n true if two sy
7380: 6d 62 6f 6c 73 20 61 72 65 20 74 68 65 20 73 61  mbols are the sa
7390: 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 61 6d 65 5f  me..*/.int same_
73a0: 73 79 6d 62 6f 6c 28 73 74 72 75 63 74 20 73 79  symbol(struct sy
73b0: 6d 62 6f 6c 20 2a 61 2c 20 73 74 72 75 63 74 20  mbol *a, struct 
73c0: 73 79 6d 62 6f 6c 20 2a 62 29 0a 7b 0a 20 20 69  symbol *b).{.  i
73d0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 3d 3d 62  nt i;.  if( a==b
73e0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
73f0: 66 28 20 61 2d 3e 74 79 70 65 21 3d 4d 55 4c 54  f( a->type!=MULT
7400: 49 54 45 52 4d 49 4e 41 4c 20 29 20 72 65 74 75  ITERMINAL ) retu
7410: 72 6e 20 30 3b 0a 20 20 69 66 28 20 62 2d 3e 74  rn 0;.  if( b->t
7420: 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype!=MULTITERMIN
7430: 41 4c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  AL ) return 0;. 
7440: 20 69 66 28 20 61 2d 3e 6e 73 75 62 73 79 6d 21   if( a->nsubsym!
7450: 3d 62 2d 3e 6e 73 75 62 73 79 6d 20 29 20 72 65  =b->nsubsym ) re
7460: 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d  turn 0;.  for(i=
7470: 30 3b 20 69 3c 61 2d 3e 6e 73 75 62 73 79 6d 3b  0; i<a->nsubsym;
7480: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
7490: 2d 3e 73 75 62 73 79 6d 5b 69 5d 21 3d 62 2d 3e  ->subsym[i]!=b->
74a0: 73 75 62 73 79 6d 5b 69 5d 20 29 20 72 65 74 75  subsym[i] ) retu
74b0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
74c0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73  rn 1;.}../* Cons
74d0: 74 72 75 63 74 20 61 6c 6c 20 73 75 63 63 65 73  truct all succes
74e0: 73 6f 72 20 73 74 61 74 65 73 20 74 6f 20 74 68  sor states to th
74f0: 65 20 67 69 76 65 6e 20 73 74 61 74 65 2e 20 20  e given state.  
7500: 41 20 22 73 75 63 63 65 73 73 6f 72 22 0a 2a 2a  A "successor".**
7510: 20 73 74 61 74 65 20 69 73 20 61 6e 79 20 73 74   state is any st
7520: 61 74 65 20 77 68 69 63 68 20 63 61 6e 20 62 65  ate which can be
7530: 20 72 65 61 63 68 65 64 20 62 79 20 61 20 73 68   reached by a sh
7540: 69 66 74 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50  ift action..*/.P
7550: 52 49 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c  RIVATE void buil
7560: 64 73 68 69 66 74 73 28 73 74 72 75 63 74 20 6c  dshifts(struct l
7570: 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75  emon *lemp, stru
7580: 63 74 20 73 74 61 74 65 20 2a 73 74 70 29 0a 7b  ct state *stp).{
7590: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
75a0: 20 2a 63 66 70 3b 20 20 2f 2a 20 46 6f 72 20 6c   *cfp;  /* For l
75b0: 6f 6f 70 69 6e 67 20 74 68 72 75 20 74 68 65 20  ooping thru the 
75c0: 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f  config closure o
75d0: 66 20 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72  f "stp" */.  str
75e0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 63 66 70  uct config *bcfp
75f0: 3b 20 2f 2a 20 46 6f 72 20 74 68 65 20 69 6e 6e  ; /* For the inn
7600: 65 72 20 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69  er loop on confi
7610: 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74  g closure of "st
7620: 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63  p" */.  struct c
7630: 6f 6e 66 69 67 20 2a 6e 65 77 63 66 67 3b 20 20  onfig *newcfg;  
7640: 2f 2a 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  /* */.  struct s
7650: 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20 2f 2a 20  ymbol *sp;   /* 
7660: 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67  Symbol following
7670: 20 74 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66   the dot in conf
7680: 69 67 75 72 61 74 69 6f 6e 20 22 63 66 70 22 20  iguration "cfp" 
7690: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
76a0: 6f 6c 20 2a 62 73 70 3b 20 20 2f 2a 20 53 79 6d  ol *bsp;  /* Sym
76b0: 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  bol following th
76c0: 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75  e dot in configu
76d0: 72 61 74 69 6f 6e 20 22 62 63 66 70 22 20 2a 2f  ration "bcfp" */
76e0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
76f0: 2a 6e 65 77 73 74 70 3b 20 2f 2a 20 41 20 70 6f  *newstp; /* A po
7700: 69 6e 74 65 72 20 74 6f 20 61 20 73 75 63 63 65  inter to a succe
7710: 73 73 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20  ssor state */.. 
7720: 20 2f 2a 20 45 61 63 68 20 63 6f 6e 66 69 67 75   /* Each configu
7730: 72 61 74 69 6f 6e 20 62 65 63 6f 6d 65 73 20 63  ration becomes c
7740: 6f 6d 70 6c 65 74 65 20 61 66 74 65 72 20 69 74  omplete after it
7750: 20 63 6f 6e 74 69 62 75 74 65 73 20 74 6f 20 61   contibutes to a
7760: 20 73 75 63 63 65 73 73 6f 72 0a 20 20 2a 2a 20   successor.  ** 
7770: 73 74 61 74 65 2e 20 20 49 6e 69 74 69 61 6c 6c  state.  Initiall
7780: 79 2c 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61  y, all configura
7790: 74 69 6f 6e 73 20 61 72 65 20 69 6e 63 6f 6d 70  tions are incomp
77a0: 6c 65 74 65 20 2a 2f 0a 20 20 66 6f 72 28 63 66  lete */.  for(cf
77b0: 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b  p=stp->cfp; cfp;
77c0: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 20   cfp=cfp->next) 
77d0: 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e  cfp->status = IN
77e0: 43 4f 4d 50 4c 45 54 45 3b 0a 0a 20 20 2f 2a 20  COMPLETE;..  /* 
77f0: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
7800: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
7810: 6f 66 20 74 68 65 20 73 74 61 74 65 20 22 73 74  of the state "st
7820: 70 22 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d  p" */.  for(cfp=
7830: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
7840: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  fp=cfp->next){. 
7850: 20 20 20 69 66 28 20 63 66 70 2d 3e 73 74 61 74     if( cfp->stat
7860: 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63  us==COMPLETE ) c
7870: 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41  ontinue;    /* A
7880: 6c 72 65 61 64 79 20 75 73 65 64 20 62 79 20 69  lready used by i
7890: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nner loop */.   
78a0: 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3e 3d 63   if( cfp->dot>=c
78b0: 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63  fp->rp->nrhs ) c
78c0: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 43 61 6e  ontinue;  /* Can
78d0: 27 74 20 73 68 69 66 74 20 74 68 69 73 20 63 6f  't shift this co
78e0: 6e 66 69 67 20 2a 2f 0a 20 20 20 20 43 6f 6e 66  nfig */.    Conf
78f0: 69 67 6c 69 73 74 5f 72 65 73 65 74 28 29 3b 20  iglist_reset(); 
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7910: 20 20 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68       /* Reset th
7920: 65 20 6e 65 77 20 63 6f 6e 66 69 67 20 73 65 74  e new config set
7930: 20 2a 2f 0a 20 20 20 20 73 70 20 3d 20 63 66 70   */.    sp = cfp
7940: 2d 3e 72 70 2d 3e 72 68 73 5b 63 66 70 2d 3e 64  ->rp->rhs[cfp->d
7950: 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  ot];            
7960: 20 2f 2a 20 53 79 6d 62 6f 6c 20 61 66 74 65 72   /* Symbol after
7970: 20 74 68 65 20 64 6f 74 20 2a 2f 0a 0a 20 20 20   the dot */..   
7980: 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 63 6f   /* For every co
7990: 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 6e 20 74  nfiguration in t
79a0: 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20 77  he state "stp" w
79b0: 68 69 63 68 20 68 61 73 20 74 68 65 20 73 79 6d  hich has the sym
79c0: 62 6f 6c 20 22 73 70 22 0a 20 20 20 20 2a 2a 20  bol "sp".    ** 
79d0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 73 20 64 6f  following its do
79e0: 74 2c 20 61 64 64 20 74 68 65 20 73 61 6d 65 20  t, add the same 
79f0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f  configuration to
7a00: 20 74 68 65 20 62 61 73 69 73 20 73 65 74 20 75   the basis set u
7a10: 6e 64 65 72 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  nder.    ** cons
7a20: 74 72 75 63 74 69 6f 6e 20 62 75 74 20 77 69 74  truction but wit
7a30: 68 20 74 68 65 20 64 6f 74 20 73 68 69 66 74 65  h the dot shifte
7a40: 64 20 6f 6e 65 20 73 79 6d 62 6f 6c 20 74 6f 20  d one symbol to 
7a50: 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  the right. */.  
7a60: 20 20 66 6f 72 28 62 63 66 70 3d 63 66 70 3b 20    for(bcfp=cfp; 
7a70: 62 63 66 70 3b 20 62 63 66 70 3d 62 63 66 70 2d  bcfp; bcfp=bcfp-
7a80: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
7a90: 28 20 62 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d  ( bcfp->status==
7aa0: 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69  COMPLETE ) conti
7ab0: 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61  nue;    /* Alrea
7ac0: 64 79 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20  dy used */.     
7ad0: 20 69 66 28 20 62 63 66 70 2d 3e 64 6f 74 3e 3d   if( bcfp->dot>=
7ae0: 62 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29  bcfp->rp->nrhs )
7af0: 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 43 61   continue; /* Ca
7b00: 6e 27 74 20 73 68 69 66 74 20 74 68 69 73 20 6f  n't shift this o
7b10: 6e 65 20 2a 2f 0a 20 20 20 20 20 20 62 73 70 20  ne */.      bsp 
7b20: 3d 20 62 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b  = bcfp->rp->rhs[
7b30: 62 63 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20  bcfp->dot];     
7b40: 20 20 20 20 20 20 2f 2a 20 47 65 74 20 73 79 6d        /* Get sym
7b50: 62 6f 6c 20 61 66 74 65 72 20 64 6f 74 20 2a 2f  bol after dot */
7b60: 0a 20 20 20 20 20 20 69 66 28 20 21 73 61 6d 65  .      if( !same
7b70: 5f 73 79 6d 62 6f 6c 28 62 73 70 2c 73 70 29 20  _symbol(bsp,sp) 
7b80: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20  ) continue;     
7b90: 20 2f 2a 20 4d 75 73 74 20 62 65 20 73 61 6d 65   /* Must be same
7ba0: 20 61 73 20 66 6f 72 20 22 63 66 70 22 20 2a 2f   as for "cfp" */
7bb0: 0a 20 20 20 20 20 20 62 63 66 70 2d 3e 73 74 61  .      bcfp->sta
7bc0: 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 20  tus = COMPLETE; 
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7be0: 20 2f 2a 20 4d 61 72 6b 20 74 68 69 73 20 63 6f   /* Mark this co
7bf0: 6e 66 69 67 20 61 73 20 75 73 65 64 20 2a 2f 0a  nfig as used */.
7c00: 20 20 20 20 20 20 6e 65 77 63 66 67 20 3d 20 43        newcfg = C
7c10: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73  onfiglist_addbas
7c20: 69 73 28 62 63 66 70 2d 3e 72 70 2c 62 63 66 70  is(bcfp->rp,bcfp
7c30: 2d 3e 64 6f 74 2b 31 29 3b 0a 20 20 20 20 20 20  ->dot+1);.      
7c40: 50 6c 69 6e 6b 5f 61 64 64 28 26 6e 65 77 63 66  Plink_add(&newcf
7c50: 67 2d 3e 62 70 6c 70 2c 62 63 66 70 29 3b 0a 20  g->bplp,bcfp);. 
7c60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
7c70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7c80: 65 20 73 74 61 74 65 20 64 65 73 63 72 69 62 65  e state describe
7c90: 64 20 62 79 20 74 68 65 20 62 61 73 69 73 20 63  d by the basis c
7ca0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74  onfiguration set
7cb0: 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63  .    ** construc
7cc0: 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 63 65  ted in the prece
7cd0: 64 69 6e 67 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  ding loop */.   
7ce0: 20 6e 65 77 73 74 70 20 3d 20 67 65 74 73 74 61   newstp = getsta
7cf0: 74 65 28 6c 65 6d 70 29 3b 0a 0a 20 20 20 20 2f  te(lemp);..    /
7d00: 2a 20 54 68 65 20 73 74 61 74 65 20 22 6e 65 77  * The state "new
7d10: 73 74 70 22 20 69 73 20 72 65 61 63 68 65 64 20  stp" is reached 
7d20: 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 20 22  from the state "
7d30: 73 74 70 22 20 62 79 20 61 20 73 68 69 66 74 20  stp" by a shift 
7d40: 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e  action.    ** on
7d50: 20 74 68 65 20 73 79 6d 62 6f 6c 20 22 73 70 22   the symbol "sp"
7d60: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 70 2d 3e   */.    if( sp->
7d70: 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
7d80: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  NAL ){.      int
7d90: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
7da0: 30 3b 20 69 3c 73 70 2d 3e 6e 73 75 62 73 79 6d  0; i<sp->nsubsym
7db0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
7dc0: 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d  Action_add(&stp-
7dd0: 3e 61 70 2c 53 48 49 46 54 2c 73 70 2d 3e 73 75  >ap,SHIFT,sp->su
7de0: 62 73 79 6d 5b 69 5d 2c 28 63 68 61 72 2a 29 6e  bsym[i],(char*)n
7df0: 65 77 73 74 70 29 3b 0a 20 20 20 20 20 20 7d 0a  ewstp);.      }.
7e00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7e10: 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70   Action_add(&stp
7e20: 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70 2c 28 63  ->ap,SHIFT,sp,(c
7e30: 68 61 72 20 2a 29 6e 65 77 73 74 70 29 3b 0a 20  har *)newstp);. 
7e40: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
7e50: 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
7e60: 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
7e70: 73 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 4c 69  s.*/.void FindLi
7e80: 6e 6b 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  nks(struct lemon
7e90: 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20   *lemp).{.  int 
7ea0: 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  i;.  struct conf
7eb0: 69 67 20 2a 63 66 70 2c 20 2a 6f 74 68 65 72 3b  ig *cfp, *other;
7ec0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
7ed0: 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 70  *stp;.  struct p
7ee0: 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a  link *plp;..  /*
7ef0: 20 48 6f 75 73 65 6b 65 65 70 69 6e 67 20 64 65   Housekeeping de
7f00: 74 61 69 6c 3a 0a 20 20 2a 2a 20 41 64 64 20 74  tail:.  ** Add t
7f10: 6f 20 65 76 65 72 79 20 70 72 6f 70 61 67 61 74  o every propagat
7f20: 65 20 6c 69 6e 6b 20 61 20 70 6f 69 6e 74 65 72  e link a pointer
7f30: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61   back to the sta
7f40: 74 65 20 74 6f 0a 20 20 2a 2a 20 77 68 69 63 68  te to.  ** which
7f50: 20 74 68 65 20 6c 69 6e 6b 20 69 73 20 61 74 74   the link is att
7f60: 61 63 68 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28  ached. */.  for(
7f70: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
7f80: 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
7f90: 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
7fa0: 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66  d[i];.    for(cf
7fb0: 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b  p=stp->cfp; cfp;
7fc0: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
7fd0: 0a 20 20 20 20 20 20 63 66 70 2d 3e 73 74 70 20  .      cfp->stp 
7fe0: 3d 20 73 74 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  = stp;.    }.  }
7ff0: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61  ..  /* Convert a
8000: 6c 6c 20 62 61 63 6b 6c 69 6e 6b 73 20 69 6e 74  ll backlinks int
8010: 6f 20 66 6f 72 77 61 72 64 20 6c 69 6e 6b 73 2e  o forward links.
8020: 20 20 4f 6e 6c 79 20 74 68 65 20 66 6f 72 77 61    Only the forwa
8030: 72 64 0a 20 20 2a 2a 20 6c 69 6e 6b 73 20 61 72  rd.  ** links ar
8040: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 66 6f  e used in the fo
8050: 6c 6c 6f 77 2d 73 65 74 20 63 6f 6d 70 75 74 61  llow-set computa
8060: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  tion. */.  for(i
8070: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
8080: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
8090: 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
80a0: 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70  [i];.    for(cfp
80b0: 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20  =stp->cfp; cfp; 
80c0: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
80d0: 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d 63 66        for(plp=cf
80e0: 70 2d 3e 62 70 6c 70 3b 20 70 6c 70 3b 20 70 6c  p->bplp; plp; pl
80f0: 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=plp->next){.  
8100: 20 20 20 20 20 20 6f 74 68 65 72 20 3d 20 70 6c        other = pl
8110: 70 2d 3e 63 66 70 3b 0a 20 20 20 20 20 20 20 20  p->cfp;.        
8120: 50 6c 69 6e 6b 5f 61 64 64 28 26 6f 74 68 65 72  Plink_add(&other
8130: 2d 3e 66 70 6c 70 2c 63 66 70 29 3b 0a 20 20 20  ->fplp,cfp);.   
8140: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
8150: 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c  ../* Compute all
8160: 20 66 6f 6c 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a   followsets..**.
8170: 2a 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 69  ** A followset i
8180: 73 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c  s the set of all
8190: 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63   symbols which c
81a0: 61 6e 20 63 6f 6d 65 20 69 6d 6d 65 64 69 61 74  an come immediat
81b0: 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 61 20 63  ely.** after a c
81c0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f  onfiguration..*/
81d0: 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77  .void FindFollow
81e0: 53 65 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f  Sets(struct lemo
81f0: 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74  n *lemp).{.  int
8200: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   i;.  struct con
8210: 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75  fig *cfp;.  stru
8220: 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 20  ct plink *plp;. 
8230: 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 20   int progress;. 
8240: 20 69 6e 74 20 63 68 61 6e 67 65 3b 0a 0a 20 20   int change;..  
8250: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
8260: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
8270: 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d     for(cfp=lemp-
8280: 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b  >sorted[i]->cfp;
8290: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
82a0: 65 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d  ext){.      cfp-
82b0: 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50  >status = INCOMP
82c0: 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LETE;.    }.  }.
82d0: 20 20 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f    .  do{.    pro
82e0: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66  gress = 0;.    f
82f0: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
8300: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
8310: 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70      for(cfp=lemp
8320: 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70  ->sorted[i]->cfp
8330: 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e  ; cfp; cfp=cfp->
8340: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  next){.        i
8350: 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d  f( cfp->status==
8360: 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69  COMPLETE ) conti
8370: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  nue;.        for
8380: 28 70 6c 70 3d 63 66 70 2d 3e 66 70 6c 70 3b 20  (plp=cfp->fplp; 
8390: 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65  plp; plp=plp->ne
83a0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  xt){.          c
83b0: 68 61 6e 67 65 20 3d 20 53 65 74 55 6e 69 6f 6e  hange = SetUnion
83c0: 28 70 6c 70 2d 3e 63 66 70 2d 3e 66 77 73 2c 63  (plp->cfp->fws,c
83d0: 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 20 20  fp->fws);.      
83e0: 20 20 20 20 69 66 28 20 63 68 61 6e 67 65 20 29      if( change )
83f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 6c  {.            pl
8400: 70 2d 3e 63 66 70 2d 3e 73 74 61 74 75 73 20 3d  p->cfp->status =
8410: 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20   INCOMPLETE;.   
8420: 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73           progres
8430: 73 20 3d 20 31 3b 0a 09 20 20 7d 0a 09 7d 0a 20  s = 1;..  }..}. 
8440: 20 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74         cfp->stat
8450: 75 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 0a 20  us = COMPLETE;. 
8460: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8470: 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20  while( progress 
8480: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
8490: 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63   resolve_conflic
84a0: 74 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  t(struct action 
84b0: 2a 2c 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  *,struct action 
84c0: 2a 2c 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  *, struct symbol
84d0: 20 2a 29 3b 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65   *);../* Compute
84e0: 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69   the reduce acti
84f0: 6f 6e 73 2c 20 61 6e 64 20 72 65 73 6f 6c 76 65  ons, and resolve
8500: 20 63 6f 6e 66 6c 69 63 74 73 2e 0a 2a 2f 0a 76   conflicts..*/.v
8510: 6f 69 64 20 46 69 6e 64 41 63 74 69 6f 6e 73 28  oid FindActions(
8520: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
8530: 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 6a 3b  mp).{.  int i,j;
8540: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
8550: 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20   *cfp;.  struct 
8560: 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
8570: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
8580: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
8590: 72 70 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c  rp;..  /* Add al
85a0: 6c 20 6f 66 20 74 68 65 20 72 65 64 75 63 65 20  l of the reduce 
85b0: 61 63 74 69 6f 6e 73 20 0a 20 20 2a 2a 20 41 20  actions .  ** A 
85c0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 69 73  reduce action is
85d0: 20 61 64 64 65 64 20 66 6f 72 20 65 61 63 68 20   added for each 
85e0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 66  element of the f
85f0: 6f 6c 6c 6f 77 73 65 74 20 6f 66 0a 20 20 2a 2a  ollowset of.  **
8600: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
8610: 20 77 68 69 63 68 20 68 61 73 20 69 74 73 20 64   which has its d
8620: 6f 74 20 61 74 20 74 68 65 20 65 78 74 72 65 6d  ot at the extrem
8630: 65 20 72 69 67 68 74 2e 0a 20 20 2a 2f 0a 20 20  e right..  */.  
8640: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
8650: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 20 20  >nstate; i++){  
8660: 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
8670: 6c 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 20 20  l states */.    
8680: 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
8690: 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63  ed[i];.    for(c
86a0: 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70  fp=stp->cfp; cfp
86b0: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
86c0: 7b 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  {  /* Loop over 
86d0: 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  all configuratio
86e0: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ns */.      if( 
86f0: 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 3d 3d 63  cfp->rp->nrhs==c
8700: 66 70 2d 3e 64 6f 74 20 29 7b 20 20 20 20 20 20  fp->dot ){      
8710: 20 20 2f 2a 20 49 73 20 64 6f 74 20 61 74 20 65    /* Is dot at e
8720: 78 74 72 65 6d 65 20 72 69 67 68 74 3f 20 2a 2f  xtreme right? */
8730: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
8740: 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; j<lemp->ntermi
8750: 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nal; j++){.     
8760: 20 20 20 20 20 69 66 28 20 53 65 74 46 69 6e 64       if( SetFind
8770: 28 63 66 70 2d 3e 66 77 73 2c 6a 29 20 29 7b 0a  (cfp->fws,j) ){.
8780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8790: 64 64 20 61 20 72 65 64 75 63 65 20 61 63 74 69  dd a reduce acti
87a0: 6f 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  on to the state 
87b0: 22 73 74 70 22 20 77 68 69 63 68 20 77 69 6c 6c  "stp" which will
87c0: 20 72 65 64 75 63 65 20 62 79 20 74 68 65 0a 20   reduce by the. 
87d0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 75             ** ru
87e0: 6c 65 20 22 63 66 70 2d 3e 72 70 22 20 69 66 20  le "cfp->rp" if 
87f0: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 73 79  the lookahead sy
8800: 6d 62 6f 6c 20 69 73 20 22 6c 65 6d 70 2d 3e 73  mbol is "lemp->s
8810: 79 6d 62 6f 6c 73 5b 6a 5d 22 20 2a 2f 0a 20 20  ymbols[j]" */.  
8820: 20 20 20 20 20 20 20 20 20 20 41 63 74 69 6f 6e            Action
8830: 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 52 45  _add(&stp->ap,RE
8840: 44 55 43 45 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  DUCE,lemp->symbo
8850: 6c 73 5b 6a 5d 2c 28 63 68 61 72 20 2a 29 63 66  ls[j],(char *)cf
8860: 70 2d 3e 72 70 29 3b 0a 20 20 20 20 20 20 20 20  p->rp);.        
8870: 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20    }..}.      }. 
8880: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
8890: 64 64 20 74 68 65 20 61 63 63 65 70 74 69 6e 67  dd the accepting
88a0: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 66 28 20   token */.  if( 
88b0: 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20  lemp->start ){. 
88c0: 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66     sp = Symbol_f
88d0: 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29  ind(lemp->start)
88e0: 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20  ;.    if( sp==0 
88f0: 29 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c  ) sp = lemp->rul
8900: 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65 6c 73 65 7b  e->lhs;.  }else{
8910: 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
8920: 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 20  rule->lhs;.  }. 
8930: 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20 66   /* Add to the f
8940: 69 72 73 74 20 73 74 61 74 65 20 28 77 68 69 63  irst state (whic
8950: 68 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  h is always the 
8960: 73 74 61 72 74 69 6e 67 20 73 74 61 74 65 20 6f  starting state o
8970: 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 69 74  f the.  ** finit
8980: 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 29  e state machine)
8990: 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20 41 43   an action to AC
89a0: 43 45 50 54 20 69 66 20 74 68 65 20 6c 6f 6f 6b  CEPT if the look
89b0: 61 68 65 61 64 20 69 73 20 74 68 65 0a 20 20 2a  ahead is the.  *
89c0: 2a 20 73 74 61 72 74 20 6e 6f 6e 74 65 72 6d 69  * start nontermi
89d0: 6e 61 6c 2e 20 20 2a 2f 0a 20 20 41 63 74 69 6f  nal.  */.  Actio
89e0: 6e 5f 61 64 64 28 26 6c 65 6d 70 2d 3e 73 6f 72  n_add(&lemp->sor
89f0: 74 65 64 5b 30 5d 2d 3e 61 70 2c 41 43 43 45 50  ted[0]->ap,ACCEP
8a00: 54 2c 73 70 2c 30 29 3b 0a 0a 20 20 2f 2a 20 52  T,sp,0);..  /* R
8a10: 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73  esolve conflicts
8a20: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
8a30: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
8a40: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
8a50: 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 6e 61 70  action *ap, *nap
8a60: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  ;.    struct sta
8a70: 74 65 20 2a 73 74 70 3b 0a 20 20 20 20 73 74 70  te *stp;.    stp
8a80: 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
8a90: 69 5d 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72  i];.    /* asser
8aa0: 74 28 20 73 74 70 2d 3e 61 70 20 29 3b 20 2a 2f  t( stp->ap ); */
8ab0: 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41  .    stp->ap = A
8ac0: 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e  ction_sort(stp->
8ad0: 61 70 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  ap);.    for(ap=
8ae0: 73 74 70 2d 3e 61 70 3b 20 61 70 20 26 26 20 61  stp->ap; ap && a
8af0: 70 2d 3e 6e 65 78 74 3b 20 61 70 3d 61 70 2d 3e  p->next; ap=ap->
8b00: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66 6f 72  next){.      for
8b10: 28 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 6e  (nap=ap->next; n
8b20: 61 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d 3d 61  ap && nap->sp==a
8b30: 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70 2d 3e  p->sp; nap=nap->
8b40: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  next){.         
8b50: 2f 2a 20 54 68 65 20 74 77 6f 20 61 63 74 69 6f  /* The two actio
8b60: 6e 73 20 22 61 70 22 20 61 6e 64 20 22 6e 61 70  ns "ap" and "nap
8b70: 22 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  " have the same 
8b80: 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20 20  lookahead..     
8b90: 20 20 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75      ** Figure ou
8ba0: 74 20 77 68 69 63 68 20 6f 6e 65 20 73 68 6f 75  t which one shou
8bb0: 6c 64 20 62 65 20 75 73 65 64 20 2a 2f 0a 20 20  ld be used */.  
8bc0: 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e 63 6f         lemp->nco
8bd0: 6e 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f 6c 76  nflict += resolv
8be0: 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c 6e 61  e_conflict(ap,na
8bf0: 70 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 29 3b  p,lemp->errsym);
8c00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8c10: 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20   }..  /* Report 
8c20: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 65 61 63  an error for eac
8c30: 68 20 72 75 6c 65 20 74 68 61 74 20 63 61 6e 20  h rule that can 
8c40: 6e 65 76 65 72 20 62 65 20 72 65 64 75 63 65 64  never be reduced
8c50: 2e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65  . */.  for(rp=le
8c60: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
8c70: 3d 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 63  =rp->next) rp->c
8c80: 61 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e  anReduce = LEMON
8c90: 5f 46 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d  _FALSE;.  for(i=
8ca0: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
8cb0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  e; i++){.    str
8cc0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
8cd0: 20 20 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d      for(ap=lemp-
8ce0: 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20  >sorted[i]->ap; 
8cf0: 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
8d00: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  {.      if( ap->
8d10: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 20 61  type==REDUCE ) a
8d20: 70 2d 3e 78 2e 72 70 2d 3e 63 61 6e 52 65 64 75  p->x.rp->canRedu
8d30: 63 65 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b  ce = LEMON_TRUE;
8d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
8d50: 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
8d60: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
8d70: 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 61  {.    if( rp->ca
8d80: 6e 52 65 64 75 63 65 20 29 20 63 6f 6e 74 69 6e  nReduce ) contin
8d90: 75 65 3b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67  ue;.    ErrorMsg
8da0: 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
8db0: 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 22 54 68  rp->ruleline,"Th
8dc0: 69 73 20 72 75 6c 65 20 63 61 6e 20 6e 6f 74 20  is rule can not 
8dd0: 62 65 20 72 65 64 75 63 65 64 2e 5c 6e 22 29 3b  be reduced.\n");
8de0: 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
8df0: 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  cnt++;.  }.}../*
8e00: 20 52 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c   Resolve a confl
8e10: 69 63 74 20 62 65 74 77 65 65 6e 20 74 68 65 20  ict between the 
8e20: 74 77 6f 20 67 69 76 65 6e 20 61 63 74 69 6f 6e  two given action
8e30: 73 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 6f  s.  If the.** co
8e40: 6e 66 6c 69 63 74 20 63 61 6e 27 74 20 62 65 20  nflict can't be 
8e50: 72 65 73 6f 6c 76 65 64 2c 20 72 65 74 75 72 6e  resolved, return
8e60: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
8e70: 20 4e 4f 20 4c 4f 4e 47 45 52 20 54 52 55 45 3a   NO LONGER TRUE:
8e80: 0a 2a 2a 20 20 20 54 6f 20 72 65 73 6f 6c 76 65  .**   To resolve
8e90: 20 61 20 63 6f 6e 66 6c 69 63 74 2c 20 66 69 72   a conflict, fir
8ea0: 73 74 20 6c 6f 6f 6b 20 74 6f 20 73 65 65 20 69  st look to see i
8eb0: 66 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 0a  f either action.
8ec0: 2a 2a 20 20 20 69 73 20 6f 6e 20 61 6e 20 65 72  **   is on an er
8ed0: 72 6f 72 20 72 75 6c 65 2e 20 20 49 6e 20 74 68  ror rule.  In th
8ee0: 61 74 20 63 61 73 65 2c 20 74 61 6b 65 20 74 68  at case, take th
8ef0: 65 20 61 63 74 69 6f 6e 20 77 68 69 63 68 0a 2a  e action which.*
8f00: 2a 20 20 20 69 73 20 6e 6f 74 20 61 73 73 6f 63  *   is not assoc
8f10: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 65  iated with the e
8f20: 72 72 6f 72 20 72 75 6c 65 2e 20 20 49 66 20 6e  rror rule.  If n
8f30: 65 69 74 68 65 72 20 6f 72 20 62 6f 74 68 0a 2a  either or both.*
8f40: 2a 20 20 20 61 63 74 69 6f 6e 73 20 61 72 65 20  *   actions are 
8f50: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8f60: 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2c 20 74  an error rule, t
8f70: 68 65 6e 20 74 72 79 20 74 6f 0a 2a 2a 20 20 20  hen try to.**   
8f80: 75 73 65 20 70 72 65 63 65 64 65 6e 63 65 20 74  use precedence t
8f90: 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 63 6f  o resolve the co
8fa0: 6e 66 6c 69 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  nflict..**.** If
8fb0: 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 20 69   either action i
8fc0: 73 20 61 20 53 48 49 46 54 2c 20 74 68 65 6e 20  s a SHIFT, then 
8fd0: 69 74 20 6d 75 73 74 20 62 65 20 61 70 78 2e 20  it must be apx. 
8fe0: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
8ff0: 6e 20 77 6f 6e 27 74 20 77 6f 72 6b 20 69 66 20  n won't work if 
9000: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43  apx->type==REDUC
9010: 45 20 61 6e 64 20 61 70 79 2d 3e 74 79 70 65 3d  E and apy->type=
9020: 3d 53 48 49 46 54 2e 0a 2a 2f 0a 73 74 61 74 69  =SHIFT..*/.stati
9030: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f  c int resolve_co
9040: 6e 66 6c 69 63 74 28 0a 20 20 73 74 72 75 63 74  nflict(.  struct
9050: 20 61 63 74 69 6f 6e 20 2a 61 70 78 2c 0a 20 20   action *apx,.  
9060: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
9070: 70 79 2c 0a 20 20 73 74 72 75 63 74 20 73 79 6d  py,.  struct sym
9080: 62 6f 6c 20 2a 65 72 72 73 79 6d 20 20 20 2f 2a  bol *errsym   /*
9090: 20 54 68 65 20 65 72 72 6f 72 20 73 79 6d 62 6f   The error symbo
90a0: 6c 20 28 69 66 20 64 65 66 69 6e 65 64 2e 20 20  l (if defined.  
90b0: 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73 65 29 20  NULL otherwise) 
90c0: 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 73  */.){.  struct s
90d0: 79 6d 62 6f 6c 20 2a 73 70 78 2c 20 2a 73 70 79  ymbol *spx, *spy
90e0: 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d  ;.  int errcnt =
90f0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70   0;.  assert( ap
9100: 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e 73 70 20 29  x->sp==apy->sp )
9110: 3b 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  ;  /* Otherwise 
9120: 74 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 6e  there would be n
9130: 6f 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  o conflict */.  
9140: 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53  if( apx->type==S
9150: 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70  HIFT && apy->typ
9160: 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20  e==SHIFT ){.    
9170: 61 70 79 2d 3e 74 79 70 65 20 3d 20 53 53 43 4f  apy->type = SSCO
9180: 4e 46 4c 49 43 54 3b 0a 20 20 20 20 65 72 72 63  NFLICT;.    errc
9190: 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nt++;.  }.  if( 
91a0: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54  apx->type==SHIFT
91b0: 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52   && apy->type==R
91c0: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78  EDUCE ){.    spx
91d0: 20 3d 20 61 70 78 2d 3e 73 70 3b 0a 20 20 20 20   = apx->sp;.    
91e0: 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d  spy = apy->x.rp-
91f0: 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66  >precsym;.    if
9200: 28 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d  ( spy==0 || spx-
9210: 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70 79 2d 3e  >prec<0 || spy->
9220: 70 72 65 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  prec<0 ){.      
9230: 2f 2a 20 4e 6f 74 20 65 6e 6f 75 67 68 20 70 72  /* Not enough pr
9240: 65 63 65 64 65 6e 63 65 20 69 6e 66 6f 72 6d 61  ecedence informa
9250: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  tion. */.      a
9260: 70 79 2d 3e 74 79 70 65 20 3d 20 53 52 43 4f 4e  py->type = SRCON
9270: 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72  FLICT;.      err
9280: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  cnt++;.    }else
9290: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73   if( spx->prec>s
92a0: 70 79 2d 3e 70 72 65 63 20 29 7b 20 20 20 20 2f  py->prec ){    /
92b0: 2a 20 4c 6f 77 65 72 20 70 72 65 63 65 64 65 6e  * Lower preceden
92c0: 63 65 20 77 69 6e 73 20 2a 2f 0a 20 20 20 20 20  ce wins */.     
92d0: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f   apy->type = RD_
92e0: 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65  RESOLVED;.    }e
92f0: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
9300: 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20  c<spy->prec ){. 
9310: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d       apx->type =
9320: 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   SH_RESOLVED;.  
9330: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
9340: 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63  >prec==spy->prec
9350: 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d   && spx->assoc==
9360: 52 49 47 48 54 20 29 7b 20 2f 2a 20 55 73 65 20  RIGHT ){ /* Use 
9370: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
9380: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44    apy->type = RD
9390: 5f 52 45 53 4f 4c 56 45 44 3b 20 20 20 20 20 20  _RESOLVED;      
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93b0: 20 20 20 20 20 20 20 2f 2a 20 61 73 73 6f 63 69         /* associ
93c0: 61 74 69 76 69 74 79 20 2a 2f 0a 20 20 20 20 7d  ativity */.    }
93d0: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
93e0: 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26  ec==spy->prec &&
93f0: 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4c 45 46   spx->assoc==LEF
9400: 54 20 29 7b 20 20 2f 2a 20 74 6f 20 62 72 65 61  T ){  /* to brea
9410: 6b 20 74 69 65 20 2a 2f 0a 20 20 20 20 20 20 61  k tie */.      a
9420: 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52 45  px->type = SH_RE
9430: 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73  SOLVED;.    }els
9440: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
9450: 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d   spx->prec==spy-
9460: 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73  >prec && spx->as
9470: 73 6f 63 3d 3d 4e 4f 4e 45 20 29 3b 0a 20 20 20  soc==NONE );.   
9480: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 53     apy->type = S
9490: 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20  RCONFLICT;.     
94a0: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d   errcnt++;.    }
94b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70 78  .  }else if( apx
94c0: 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26  ->type==REDUCE &
94d0: 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44  & apy->type==RED
94e0: 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d  UCE ){.    spx =
94f0: 20 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72 65 63   apx->x.rp->prec
9500: 73 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d 20 61  sym;.    spy = a
9510: 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79  py->x.rp->precsy
9520: 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 78 3d 3d  m;.    if( spx==
9530: 30 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c 20 73  0 || spy==0 || s
9540: 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a 20 20  px->prec<0 ||.  
9550: 20 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 7c 7c    spy->prec<0 ||
9560: 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d   spx->prec==spy-
9570: 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61  >prec ){.      a
9580: 70 79 2d 3e 74 79 70 65 20 3d 20 52 52 43 4f 4e  py->type = RRCON
9590: 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72  FLICT;.      err
95a0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  cnt++;.    }else
95b0: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73   if( spx->prec>s
95c0: 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20  py->prec ){.    
95d0: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44    apy->type = RD
95e0: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
95f0: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
9600: 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a  ec<spy->prec ){.
9610: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20        apx->type 
9620: 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20  = RD_RESOLVED;. 
9630: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
9640: 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20    assert( .     
9650: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 5f 52   apx->type==SH_R
9660: 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20  ESOLVED ||.     
9670: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44 5f 52   apx->type==RD_R
9680: 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20  ESOLVED ||.     
9690: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 53 43 4f   apx->type==SSCO
96a0: 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20  NFLICT ||.      
96b0: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e  apx->type==SRCON
96c0: 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61  FLICT ||.      a
96d0: 70 78 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46  px->type==RRCONF
96e0: 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70  LICT ||.      ap
96f0: 79 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f  y->type==SH_RESO
9700: 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70  LVED ||.      ap
9710: 79 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f  y->type==RD_RESO
9720: 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70  LVED ||.      ap
9730: 79 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e 46 4c  y->type==SSCONFL
9740: 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  ICT ||.      apy
9750: 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46 4c 49  ->type==SRCONFLI
9760: 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d  CT ||.      apy-
9770: 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c 49 43  >type==RRCONFLIC
9780: 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f 2a 20  T.    );.    /* 
9790: 54 68 65 20 52 45 44 55 43 45 2f 53 48 49 46 54  The REDUCE/SHIFT
97a0: 20 63 61 73 65 20 63 61 6e 6e 6f 74 20 68 61 70   case cannot hap
97b0: 70 65 6e 20 62 65 63 61 75 73 65 20 53 48 49 46  pen because SHIF
97c0: 54 73 20 63 6f 6d 65 20 62 65 66 6f 72 65 0a 20  Ts come before. 
97d0: 20 20 20 2a 2a 20 52 45 44 55 43 45 73 20 6f 6e     ** REDUCEs on
97e0: 20 74 68 65 20 6c 69 73 74 2e 20 20 49 66 20 77   the list.  If w
97f0: 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
9800: 6e 74 20 69 74 20 6d 75 73 74 20 62 65 20 62 65  nt it must be be
9810: 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65  cause.    ** the
9820: 20 70 61 72 73 65 72 20 63 6f 6e 66 6c 69 63 74   parser conflict
9830: 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
9840: 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20  n resolved. */. 
9850: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63   }.  return errc
9860: 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  nt;.}./*********
9870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
9880: 6d 20 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66  m the file "conf
9890: 69 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  iglist.c" ******
98a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
98b0: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ***/./*.** Routi
98c0: 6e 65 73 20 74 6f 20 70 72 6f 63 65 73 73 69 6e  nes to processin
98d0: 67 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  g a configuratio
98e0: 6e 20 6c 69 73 74 20 61 6e 64 20 62 75 69 6c 64  n list and build
98f0: 69 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a 20 69  ing a state.** i
9900: 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
9910: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
9920: 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
9930: 63 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69 73 74  config *freelist
9940: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c 69   = 0;      /* Li
9950: 73 74 20 6f 66 20 66 72 65 65 20 63 6f 6e 66 69  st of free confi
9960: 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  gurations */.sta
9970: 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69  tic struct confi
9980: 67 20 2a 63 75 72 72 65 6e 74 20 3d 20 30 3b 20  g *current = 0; 
9990: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
99a0: 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72  list of configur
99b0: 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
99c0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
99d0: 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b  *currentend = 0;
99e0: 20 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c 69     /* Last on li
99f0: 73 74 20 6f 66 20 63 6f 6e 66 69 67 73 20 2a 2f  st of configs */
9a00: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
9a10: 6f 6e 66 69 67 20 2a 62 61 73 69 73 20 3d 20 30  onfig *basis = 0
9a20: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70  ;         /* Top
9a30: 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69   of list of basi
9a40: 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61  s configs */.sta
9a50: 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69  tic struct confi
9a60: 67 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d 20 30  g **basisend = 0
9a70: 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20  ;     /* End of 
9a80: 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f  list of basis co
9a90: 6e 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65 74  nfigs */../* Ret
9aa0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
9ab0: 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61   a new configura
9ac0: 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20  tion */.PRIVATE 
9ad0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
9ae0: 65 77 63 6f 6e 66 69 67 28 29 7b 0a 20 20 73 74  ewconfig(){.  st
9af0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77  ruct config *new
9b00: 63 66 67 3b 0a 20 20 69 66 28 20 66 72 65 65 6c  cfg;.  if( freel
9b10: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ist==0 ){.    in
9b20: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74  t i;.    int amt
9b30: 20 3d 20 33 3b 0a 20 20 20 20 66 72 65 65 6c 69   = 3;.    freeli
9b40: 73 74 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e  st = (struct con
9b50: 66 69 67 20 2a 29 63 61 6c 6c 6f 63 28 20 61 6d  fig *)calloc( am
9b60: 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  t, sizeof(struct
9b70: 20 63 6f 6e 66 69 67 29 20 29 3b 0a 20 20 20 20   config) );.    
9b80: 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20  if( freelist==0 
9b90: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
9ba0: 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20  (stderr,"Unable 
9bb0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
9bc0: 72 79 20 66 6f 72 20 61 20 6e 65 77 20 63 6f 6e  ry for a new con
9bd0: 66 69 67 75 72 61 74 69 6f 6e 2e 22 29 3b 0a 20  figuration.");. 
9be0: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
9bf0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
9c00: 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66   i<amt-1; i++) f
9c10: 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20  reelist[i].next 
9c20: 3d 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d  = &freelist[i+1]
9c30: 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b 61  ;.    freelist[a
9c40: 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a  mt-1].next = 0;.
9c50: 20 20 7d 0a 20 20 6e 65 77 63 66 67 20 3d 20 66    }.  newcfg = f
9c60: 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c  reelist;.  freel
9c70: 69 73 74 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e  ist = freelist->
9c80: 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e  next;.  return n
9c90: 65 77 63 66 67 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  ewcfg;.}../* The
9ca0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22   configuration "
9cb0: 6f 6c 64 22 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  old" is no longe
9cc0: 72 20 75 73 65 64 20 2a 2f 0a 50 52 49 56 41 54  r used */.PRIVAT
9cd0: 45 20 76 6f 69 64 20 64 65 6c 65 74 65 63 6f 6e  E void deletecon
9ce0: 66 69 67 28 73 74 72 75 63 74 20 63 6f 6e 66 69  fig(struct confi
9cf0: 67 20 2a 6f 6c 64 29 0a 7b 0a 20 20 6f 6c 64 2d  g *old).{.  old-
9d00: 3e 6e 65 78 74 20 3d 20 66 72 65 65 6c 69 73 74  >next = freelist
9d10: 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20 6f  ;.  freelist = o
9d20: 6c 64 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61  ld;.}../* Initia
9d30: 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69 67  lized the config
9d40: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75 69  uration list bui
9d50: 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  lder */.void Con
9d60: 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 7b 0a  figlist_init(){.
9d70: 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20    current = 0;. 
9d80: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63   currentend = &c
9d90: 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69 73 20  urrent;.  basis 
9da0: 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20  = 0;.  basisend 
9db0: 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66  = &basis;.  Conf
9dc0: 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 29 3b 0a  igtable_init();.
9dd0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
9de0: 49 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20  Initialized the 
9df0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
9e00: 73 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f  st builder */.vo
9e10: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65  id Configlist_re
9e20: 73 65 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74  set(){.  current
9e30: 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65   = 0;.  currente
9e40: 6e 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20  nd = &current;. 
9e50: 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61   basis = 0;.  ba
9e60: 73 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b  sisend = &basis;
9e70: 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63  .  Configtable_c
9e80: 6c 65 61 72 28 30 29 3b 0a 20 20 72 65 74 75 72  lear(0);.  retur
9e90: 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 6e 6f  n;.}../* Add ano
9ea0: 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69  ther configurati
9eb0: 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67  on to the config
9ec0: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
9ed0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
9ee0: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 0a 20  onfiglist_add(. 
9ef0: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
9f00: 2c 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65  ,    /* The rule
9f10: 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 20 20 20   */.  int dot   
9f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
9f30: 65 78 20 69 6e 74 6f 20 74 68 65 20 52 48 53 20  ex into the RHS 
9f40: 6f 66 20 74 68 65 20 72 75 6c 65 20 77 68 65 72  of the rule wher
9f50: 65 20 74 68 65 20 64 6f 74 20 67 6f 65 73 20 2a  e the dot goes *
9f60: 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  /.){.  struct co
9f70: 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c  nfig *cfp, model
9f80: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
9f90: 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20  rentend!=0 );.  
9fa0: 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20  model.rp = rp;. 
9fb0: 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74   model.dot = dot
9fc0: 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67  ;.  cfp = Config
9fd0: 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65  table_find(&mode
9fe0: 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30  l);.  if( cfp==0
9ff0: 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65   ){.    cfp = ne
a000: 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63  wconfig();.    c
a010: 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20  fp->rp = rp;.   
a020: 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b   cfp->dot = dot;
a030: 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20  .    cfp->fws = 
a040: 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66  SetNew();.    cf
a050: 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20  p->stp = 0;.    
a060: 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d  cfp->fplp = cfp-
a070: 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63  >bplp = 0;.    c
a080: 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  fp->next = 0;.  
a090: 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20    cfp->bp = 0;. 
a0a0: 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d     *currentend =
a0b0: 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e   cfp;.    curren
a0c0: 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78  tend = &cfp->nex
a0d0: 74 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62  t;.    Configtab
a0e0: 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a  le_insert(cfp);.
a0f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70    }.  return cfp
a100: 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62 61  ;.}../* Add a ba
a110: 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  sis configuratio
a120: 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75  n to the configu
a130: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73  ration list */.s
a140: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
a150: 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69  nfiglist_addbasi
a160: 73 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72  s(struct rule *r
a170: 70 2c 20 69 6e 74 20 64 6f 74 29 0a 7b 0a 20 20  p, int dot).{.  
a180: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
a190: 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73  fp, model;..  as
a1a0: 73 65 72 74 28 20 62 61 73 69 73 65 6e 64 21 3d  sert( basisend!=
a1b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  0 );.  assert( c
a1c0: 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a  urrentend!=0 );.
a1d0: 20 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b    model.rp = rp;
a1e0: 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64  .  model.dot = d
a1f0: 6f 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66  ot;.  cfp = Conf
a200: 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f  igtable_find(&mo
a210: 64 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d  del);.  if( cfp=
a220: 3d 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20  =0 ){.    cfp = 
a230: 6e 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20  newconfig();.   
a240: 20 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20   cfp->rp = rp;. 
a250: 20 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f     cfp->dot = do
a260: 74 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20  t;.    cfp->fws 
a270: 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20  = SetNew();.    
a280: 63 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20  cfp->stp = 0;.  
a290: 20 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66    cfp->fplp = cf
a2a0: 70 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20  p->bplp = 0;.   
a2b0: 20 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a   cfp->next = 0;.
a2c0: 20 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b      cfp->bp = 0;
a2d0: 0a 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64  .    *currentend
a2e0: 20 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72   = cfp;.    curr
a2f0: 65 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e  entend = &cfp->n
a300: 65 78 74 3b 0a 20 20 20 20 2a 62 61 73 69 73 65  ext;.    *basise
a310: 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 62 61  nd = cfp;.    ba
a320: 73 69 73 65 6e 64 20 3d 20 26 63 66 70 2d 3e 62  sisend = &cfp->b
a330: 70 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62  p;.    Configtab
a340: 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a  le_insert(cfp);.
a350: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70    }.  return cfp
a360: 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20  ;.}../* Compute 
a370: 74 68 65 20 63 6c 6f 73 75 72 65 20 6f 66 20 74  the closure of t
a380: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
a390: 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f   list */.void Co
a3a0: 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65  nfiglist_closure
a3b0: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
a3c0: 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  emp).{.  struct 
a3d0: 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6e 65  config *cfp, *ne
a3e0: 77 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 72  wcfp;.  struct r
a3f0: 75 6c 65 20 2a 72 70 2c 20 2a 6e 65 77 72 70 3b  ule *rp, *newrp;
a400: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
a410: 20 2a 73 70 2c 20 2a 78 73 70 3b 0a 20 20 69 6e   *sp, *xsp;.  in
a420: 74 20 69 2c 20 64 6f 74 3b 0a 0a 20 20 61 73 73  t i, dot;..  ass
a430: 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21  ert( currentend!
a440: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 63 66 70 3d  =0 );.  for(cfp=
a450: 63 75 72 72 65 6e 74 3b 20 63 66 70 3b 20 63 66  current; cfp; cf
a460: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=cfp->next){.  
a470: 20 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a    rp = cfp->rp;.
a480: 20 20 20 20 64 6f 74 20 3d 20 63 66 70 2d 3e 64      dot = cfp->d
a490: 6f 74 3b 0a 20 20 20 20 69 66 28 20 64 6f 74 3e  ot;.    if( dot>
a4a0: 3d 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74  =rp->nrhs ) cont
a4b0: 69 6e 75 65 3b 0a 20 20 20 20 73 70 20 3d 20 72  inue;.    sp = r
a4c0: 70 2d 3e 72 68 73 5b 64 6f 74 5d 3b 0a 20 20 20  p->rhs[dot];.   
a4d0: 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e   if( sp->type==N
a4e0: 4f 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  ONTERMINAL ){.  
a4f0: 20 20 20 20 69 66 28 20 73 70 2d 3e 72 75 6c 65      if( sp->rule
a500: 3d 3d 30 20 26 26 20 73 70 21 3d 6c 65 6d 70 2d  ==0 && sp!=lemp-
a510: 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20  >errsym ){.     
a520: 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
a530: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 6c  ->filename,rp->l
a540: 69 6e 65 2c 22 4e 6f 6e 74 65 72 6d 69 6e 61 6c  ine,"Nonterminal
a550: 20 5c 22 25 73 5c 22 20 68 61 73 20 6e 6f 20 72   \"%s\" has no r
a560: 75 6c 65 73 2e 22 2c 0a 20 20 20 20 20 20 20 20  ules.",.        
a570: 20 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20    sp->name);.   
a580: 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
a590: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  cnt++;.      }. 
a5a0: 20 20 20 20 20 66 6f 72 28 6e 65 77 72 70 3d 73       for(newrp=s
a5b0: 70 2d 3e 72 75 6c 65 3b 20 6e 65 77 72 70 3b 20  p->rule; newrp; 
a5c0: 6e 65 77 72 70 3d 6e 65 77 72 70 2d 3e 6e 65 78  newrp=newrp->nex
a5d0: 74 6c 68 73 29 7b 0a 20 20 20 20 20 20 20 20 6e  tlhs){.        n
a5e0: 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69  ewcfp = Configli
a5f0: 73 74 5f 61 64 64 28 6e 65 77 72 70 2c 30 29 3b  st_add(newrp,0);
a600: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 64  .        for(i=d
a610: 6f 74 2b 31 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  ot+1; i<rp->nrhs
a620: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
a630: 20 20 78 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b    xsp = rp->rhs[
a640: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
a650: 28 20 78 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52  ( xsp->type==TER
a660: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
a670: 20 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63       SetAdd(newc
a680: 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 69 6e 64  fp->fws,xsp->ind
a690: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ex);.           
a6a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
a6b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 73 70 2d    }else if( xsp-
a6c0: 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
a6d0: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
a6e0: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
a6f0: 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
a700: 6b 3c 78 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20  k<xsp->nsubsym; 
a710: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
a720: 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66      SetAdd(newcf
a730: 70 2d 3e 66 77 73 2c 20 78 73 70 2d 3e 73 75 62  p->fws, xsp->sub
a740: 73 79 6d 5b 6b 5d 2d 3e 69 6e 64 65 78 29 3b 0a  sym[k]->index);.
a750: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
a760: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a770: 0a 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20  ..  }else{.     
a780: 20 20 20 20 20 20 20 53 65 74 55 6e 69 6f 6e 28         SetUnion(
a790: 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d  newcfp->fws,xsp-
a7a0: 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20  >firstset);.    
a7b0: 20 20 20 20 20 20 20 20 69 66 28 20 78 73 70 2d          if( xsp-
a7c0: 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46  >lambda==LEMON_F
a7d0: 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 20  ALSE ) break;.. 
a7e0: 20 7d 0a 09 7d 0a 20 20 20 20 20 20 20 20 69 66   }..}.        if
a7f0: 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20  ( i==rp->nrhs ) 
a800: 50 6c 69 6e 6b 5f 61 64 64 28 26 63 66 70 2d 3e  Plink_add(&cfp->
a810: 66 70 6c 70 2c 6e 65 77 63 66 70 29 3b 0a 20 20  fplp,newcfp);.  
a820: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a830: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
a840: 53 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75  Sort the configu
a850: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76  ration list */.v
a860: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73  oid Configlist_s
a870: 6f 72 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74  ort(){.  current
a880: 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69   = (struct confi
a890: 67 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20  g *)msort((char 
a8a0: 2a 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72 20  *)current,(char 
a8b0: 2a 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 6e 65  **)&(current->ne
a8c0: 78 74 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a  xt),Configcmp);.
a8d0: 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30    currentend = 0
a8e0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
a8f0: 2a 20 53 6f 72 74 20 74 68 65 20 62 61 73 69 73  * Sort the basis
a900: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
a910: 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  ist */.void Conf
a920: 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73  iglist_sortbasis
a930: 28 29 7b 0a 20 20 62 61 73 69 73 20 3d 20 28 73  (){.  basis = (s
a940: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d  truct config *)m
a950: 73 6f 72 74 28 28 63 68 61 72 20 2a 29 63 75 72  sort((char *)cur
a960: 72 65 6e 74 2c 28 63 68 61 72 20 2a 2a 29 26 28  rent,(char **)&(
a970: 63 75 72 72 65 6e 74 2d 3e 62 70 29 2c 43 6f 6e  current->bp),Con
a980: 66 69 67 63 6d 70 29 3b 0a 20 20 62 61 73 69 73  figcmp);.  basis
a990: 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  end = 0;.  retur
a9a0: 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  n;.}../* Return 
a9b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
a9c0: 20 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e   head of the con
a9d0: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
a9e0: 61 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  and.** reset the
a9f0: 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20   list */.struct 
aa00: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
aa10: 73 74 5f 72 65 74 75 72 6e 28 29 7b 0a 20 20 73  st_return(){.  s
aa20: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c  truct config *ol
aa30: 64 3b 0a 20 20 6f 6c 64 20 3d 20 63 75 72 72 65  d;.  old = curre
aa40: 6e 74 3b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20  nt;.  current = 
aa50: 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20  0;.  currentend 
aa60: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c  = 0;.  return ol
aa70: 64 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  d;.}../* Return 
aa80: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
aa90: 20 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e   head of the con
aaa0: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
aab0: 61 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  and.** reset the
aac0: 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20   list */.struct 
aad0: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
aae0: 73 74 5f 62 61 73 69 73 28 29 7b 0a 20 20 73 74  st_basis(){.  st
aaf0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64  ruct config *old
ab00: 3b 0a 20 20 6f 6c 64 20 3d 20 62 61 73 69 73 3b  ;.  old = basis;
ab10: 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20  .  basis = 0;.  
ab20: 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20  basisend = 0;.  
ab30: 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f  return old;.}../
ab40: 2a 20 46 72 65 65 20 61 6c 6c 20 65 6c 65 6d 65  * Free all eleme
ab50: 6e 74 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e  nts of the given
ab60: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
ab70: 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  ist */.void Conf
ab80: 69 67 6c 69 73 74 5f 65 61 74 28 73 74 72 75 63  iglist_eat(struc
ab90: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b  t config *cfp).{
aba0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
abb0: 20 2a 6e 65 78 74 63 66 70 3b 0a 20 20 66 6f 72   *nextcfp;.  for
abc0: 28 3b 20 63 66 70 3b 20 63 66 70 3d 6e 65 78 74  (; cfp; cfp=next
abd0: 63 66 70 29 7b 0a 20 20 20 20 6e 65 78 74 63 66  cfp){.    nextcf
abe0: 70 20 3d 20 63 66 70 2d 3e 6e 65 78 74 3b 0a 20  p = cfp->next;. 
abf0: 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e     assert( cfp->
ac00: 66 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 61  fplp==0 );.    a
ac10: 73 73 65 72 74 28 20 63 66 70 2d 3e 62 70 6c 70  ssert( cfp->bplp
ac20: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 63  ==0 );.    if( c
ac30: 66 70 2d 3e 66 77 73 20 29 20 53 65 74 46 72 65  fp->fws ) SetFre
ac40: 65 28 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20  e(cfp->fws);.   
ac50: 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 63 66   deleteconfig(cf
ac60: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
ac70: 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
ac80: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
ac90: 66 69 6c 65 20 22 65 72 72 6f 72 2e 63 22 20 2a  file "error.c" *
aca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
acb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
acc0: 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72  /./*.** Code for
acd0: 20 70 72 69 6e 74 69 6e 67 20 65 72 72 6f 72 20   printing error 
ace0: 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a 76 6f 69  message..*/..voi
acf0: 64 20 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74  d ErrorMsg(const
ad00: 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c   char *filename,
ad10: 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e   int lineno, con
ad20: 73 74 20 63 68 61 72 20 2a 66 6f 72 6d 61 74 2c  st char *format,
ad30: 20 2e 2e 2e 29 7b 0a 20 20 66 70 72 69 6e 74 66   ...){.  fprintf
ad40: 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
ad50: 20 22 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 6c 69   ", filename, li
ad60: 6e 65 6e 6f 29 3b 0a 20 20 76 61 5f 73 74 61 72  neno);.  va_star
ad70: 74 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20  t(ap, format);. 
ad80: 20 76 66 70 72 69 6e 74 66 28 73 74 64 65 72 72   vfprintf(stderr
ad90: 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76  ,format,ap);.  v
ada0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66 70 72  a_end(ap);.  fpr
adb0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e  intf(stderr, "\n
adc0: 22 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ");.}./*********
add0: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
ade0: 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63 22 20 2a   file "main.c" *
adf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ae00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ae10: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20  ***/./*.** Main 
ae20: 70 72 6f 67 72 61 6d 20 66 69 6c 65 20 66 6f 72  program file for
ae30: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
ae40: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
ae50: 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f 75  ./* Report an ou
ae60: 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64  t-of-memory cond
ae70: 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72 74 2e  ition and abort.
ae80: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a    This function.
ae90: 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f 73 74 6c  ** is used mostl
aea0: 79 20 62 79 20 74 68 65 20 22 4d 65 6d 6f 72 79  y by the "Memory
aeb0: 43 68 65 63 6b 22 20 6d 61 63 72 6f 20 69 6e 20  Check" macro in 
aec0: 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64  struct.h.*/.void
aed0: 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 7b   memory_error(){
aee0: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
aef0: 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
af00: 2e 20 20 41 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e  .  Aborting...\n
af10: 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d  ");.  exit(1);.}
af20: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 44 65  ..static int nDe
af30: 66 69 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 2f  fine = 0;      /
af40: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 2d 44 20 6f  * Number of -D o
af50: 70 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 63 6f  ptions on the co
af60: 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a 73 74  mmand line */.st
af70: 61 74 69 63 20 63 68 61 72 20 2a 2a 61 7a 44 65  atic char **azDe
af80: 66 69 6e 65 20 3d 20 30 3b 20 20 2f 2a 20 4e 61  fine = 0;  /* Na
af90: 6d 65 20 6f 66 20 74 68 65 20 2d 44 20 6d 61 63  me of the -D mac
afa0: 72 6f 73 20 2a 2f 0a 0a 2f 2a 20 54 68 69 73 20  ros */../* This 
afb0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
afc0: 64 20 77 69 74 68 20 74 68 65 20 61 72 67 75 6d  d with the argum
afd0: 65 6e 74 20 74 6f 20 65 61 63 68 20 2d 44 20 63  ent to each -D c
afe0: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
aff0: 6f 6e 2e 0a 2a 2a 20 41 64 64 20 74 68 65 20 6d  on..** Add the m
b000: 61 63 72 6f 20 64 65 66 69 6e 65 64 20 74 6f 20  acro defined to 
b010: 74 68 65 20 61 7a 44 65 66 69 6e 65 20 61 72 72  the azDefine arr
b020: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
b030: 69 64 20 68 61 6e 64 6c 65 5f 44 5f 6f 70 74 69  id handle_D_opti
b040: 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  on(char *z){.  c
b050: 68 61 72 20 2a 2a 70 61 7a 3b 0a 20 20 6e 44 65  har **paz;.  nDe
b060: 66 69 6e 65 2b 2b 3b 0a 20 20 61 7a 44 65 66 69  fine++;.  azDefi
b070: 6e 65 20 3d 20 28 63 68 61 72 20 2a 2a 29 20 72  ne = (char **) r
b080: 65 61 6c 6c 6f 63 28 61 7a 44 65 66 69 6e 65 2c  ealloc(azDefine,
b090: 20 73 69 7a 65 6f 66 28 61 7a 44 65 66 69 6e 65   sizeof(azDefine
b0a0: 5b 30 5d 29 2a 6e 44 65 66 69 6e 65 29 3b 0a 20  [0])*nDefine);. 
b0b0: 20 69 66 28 20 61 7a 44 65 66 69 6e 65 3d 3d 30   if( azDefine==0
b0c0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
b0d0: 73 74 64 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d  stderr,"out of m
b0e0: 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65  emory\n");.    e
b0f0: 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 70 61  xit(1);.  }.  pa
b100: 7a 20 3d 20 26 61 7a 44 65 66 69 6e 65 5b 6e 44  z = &azDefine[nD
b110: 65 66 69 6e 65 2d 31 5d 3b 0a 20 20 2a 70 61 7a  efine-1];.  *paz
b120: 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c   = (char *) mall
b130: 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
b140: 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28 20 2a 70  z)+1 );.  if( *p
b150: 61 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  az==0 ){.    fpr
b160: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6f 75 74  intf(stderr,"out
b170: 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a   of memory\n");.
b180: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
b190: 0a 20 20 73 74 72 63 70 79 28 2a 70 61 7a 2c 20  .  strcpy(*paz, 
b1a0: 7a 29 3b 0a 20 20 66 6f 72 28 7a 3d 2a 70 61 7a  z);.  for(z=*paz
b1b0: 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 3d 27 3b  ; *z && *z!='=';
b1c0: 20 7a 2b 2b 29 7b 7d 0a 20 20 2a 7a 20 3d 20 30   z++){}.  *z = 0
b1d0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72  ;.}..static char
b1e0: 20 2a 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e   *user_templaten
b1f0: 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  ame = NULL;.stat
b200: 69 63 20 76 6f 69 64 20 68 61 6e 64 6c 65 5f 54  ic void handle_T
b210: 5f 6f 70 74 69 6f 6e 28 63 68 61 72 20 2a 7a 29  _option(char *z)
b220: 7b 0a 20 20 75 73 65 72 5f 74 65 6d 70 6c 61 74  {.  user_templat
b230: 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29  ename = (char *)
b240: 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74   malloc( lemonSt
b250: 72 6c 65 6e 28 7a 29 2b 31 20 29 3b 0a 20 20 69  rlen(z)+1 );.  i
b260: 66 28 20 75 73 65 72 5f 74 65 6d 70 6c 61 74 65  f( user_template
b270: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  name==0 ){.    m
b280: 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20  emory_error();. 
b290: 20 7d 0a 20 20 73 74 72 63 70 79 28 75 73 65 72   }.  strcpy(user
b2a0: 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 20 7a  _templatename, z
b2b0: 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6d 61 69  );.}../* The mai
b2c0: 6e 20 70 72 6f 67 72 61 6d 2e 20 20 50 61 72 73  n program.  Pars
b2d0: 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  e the command li
b2e0: 6e 65 20 61 6e 64 20 64 6f 20 69 74 2e 2e 2e 20  ne and do it... 
b2f0: 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20  */.int main(int 
b300: 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
b310: 76 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  v).{.  static in
b320: 74 20 76 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 20  t version = 0;. 
b330: 20 73 74 61 74 69 63 20 69 6e 74 20 72 70 66 6c   static int rpfl
b340: 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ag = 0;.  static
b350: 20 69 6e 74 20 62 61 73 69 73 66 6c 61 67 20 3d   int basisflag =
b360: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
b370: 20 63 6f 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20   compress = 0;. 
b380: 20 73 74 61 74 69 63 20 69 6e 74 20 71 75 69 65   static int quie
b390: 74 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  t = 0;.  static 
b3a0: 69 6e 74 20 73 74 61 74 69 73 74 69 63 73 20 3d  int statistics =
b3b0: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
b3c0: 20 6d 68 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73   mhflag = 0;.  s
b3d0: 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 69 6e 65  tatic int noline
b3e0: 6e 6f 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73  nosflag = 0;.  s
b3f0: 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f  tatic struct s_o
b400: 70 74 69 6f 6e 73 20 6f 70 74 69 6f 6e 73 5b 5d  ptions options[]
b410: 20 3d 20 7b 0a 20 20 20 20 7b 4f 50 54 5f 46 4c   = {.    {OPT_FL
b420: 41 47 2c 20 22 62 22 2c 20 28 63 68 61 72 2a 29  AG, "b", (char*)
b430: 26 62 61 73 69 73 66 6c 61 67 2c 20 22 50 72 69  &basisflag, "Pri
b440: 6e 74 20 6f 6e 6c 79 20 74 68 65 20 62 61 73 69  nt only the basi
b450: 73 20 69 6e 20 72 65 70 6f 72 74 2e 22 7d 2c 0a  s in report."},.
b460: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
b470: 63 22 2c 20 28 63 68 61 72 2a 29 26 63 6f 6d 70  c", (char*)&comp
b480: 72 65 73 73 2c 20 22 44 6f 6e 27 74 20 63 6f 6d  ress, "Don't com
b490: 70 72 65 73 73 20 74 68 65 20 61 63 74 69 6f 6e  press the action
b4a0: 20 74 61 62 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b   table."},.    {
b4b0: 4f 50 54 5f 46 53 54 52 2c 20 22 44 22 2c 20 28  OPT_FSTR, "D", (
b4c0: 63 68 61 72 2a 29 68 61 6e 64 6c 65 5f 44 5f 6f  char*)handle_D_o
b4d0: 70 74 69 6f 6e 2c 20 22 44 65 66 69 6e 65 20 61  ption, "Define a
b4e0: 6e 20 25 69 66 64 65 66 20 6d 61 63 72 6f 2e 22  n %ifdef macro."
b4f0: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52  },.    {OPT_FSTR
b500: 2c 20 22 54 22 2c 20 28 63 68 61 72 2a 29 68 61  , "T", (char*)ha
b510: 6e 64 6c 65 5f 54 5f 6f 70 74 69 6f 6e 2c 20 22  ndle_T_option, "
b520: 53 70 65 63 69 66 79 20 61 20 74 65 6d 70 6c 61  Specify a templa
b530: 74 65 20 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20  te file."},.    
b540: 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 67 22 2c 20  {OPT_FLAG, "g", 
b550: 28 63 68 61 72 2a 29 26 72 70 66 6c 61 67 2c 20  (char*)&rpflag, 
b560: 22 50 72 69 6e 74 20 67 72 61 6d 6d 61 72 20 77  "Print grammar w
b570: 69 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 2e 22  ithout actions."
b580: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
b590: 2c 20 22 6d 22 2c 20 28 63 68 61 72 2a 29 26 6d  , "m", (char*)&m
b5a0: 68 66 6c 61 67 2c 20 22 4f 75 74 70 75 74 20 61  hflag, "Output a
b5b0: 20 6d 61 6b 65 68 65 61 64 65 72 73 20 63 6f 6d   makeheaders com
b5c0: 70 61 74 69 62 6c 65 20 66 69 6c 65 2e 22 7d 2c  patible file."},
b5d0: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
b5e0: 22 6c 22 2c 20 28 63 68 61 72 2a 29 26 6e 6f 6c  "l", (char*)&nol
b5f0: 69 6e 65 6e 6f 73 66 6c 61 67 2c 20 22 44 6f 20  inenosflag, "Do 
b600: 6e 6f 74 20 70 72 69 6e 74 20 23 6c 69 6e 65 20  not print #line 
b610: 73 74 61 74 65 6d 65 6e 74 73 2e 22 7d 2c 0a 20  statements."},. 
b620: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71     {OPT_FLAG, "q
b630: 22 2c 20 28 63 68 61 72 2a 29 26 71 75 69 65 74  ", (char*)&quiet
b640: 2c 20 22 28 51 75 69 65 74 29 20 44 6f 6e 27 74  , "(Quiet) Don't
b650: 20 70 72 69 6e 74 20 74 68 65 20 72 65 70 6f 72   print the repor
b660: 74 20 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b  t file."},.    {
b670: 4f 50 54 5f 46 4c 41 47 2c 20 22 73 22 2c 20 28  OPT_FLAG, "s", (
b680: 63 68 61 72 2a 29 26 73 74 61 74 69 73 74 69 63  char*)&statistic
b690: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6b0: 20 20 20 20 20 20 22 50 72 69 6e 74 20 70 61 72        "Print par
b6c0: 73 65 72 20 73 74 61 74 73 20 74 6f 20 73 74 61  ser stats to sta
b6d0: 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 22 7d 2c  ndard output."},
b6e0: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
b6f0: 22 78 22 2c 20 28 63 68 61 72 2a 29 26 76 65 72  "x", (char*)&ver
b700: 73 69 6f 6e 2c 20 22 50 72 69 6e 74 20 74 68 65  sion, "Print the
b710: 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 2e   version number.
b720: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
b730: 47 2c 30 2c 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20  G,0,0,0}.  };.  
b740: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 69  int i;.  int exi
b750: 74 63 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20  tcode;.  struct 
b760: 6c 65 6d 6f 6e 20 6c 65 6d 3b 0a 0a 20 20 61 74  lemon lem;..  at
b770: 65 78 69 74 28 4c 65 6d 6f 6e 41 74 45 78 69 74  exit(LemonAtExit
b780: 29 3b 0a 0a 20 20 4f 70 74 49 6e 69 74 28 61 72  );..  OptInit(ar
b790: 67 76 2c 6f 70 74 69 6f 6e 73 2c 73 74 64 65 72  gv,options,stder
b7a0: 72 29 3b 0a 20 20 69 66 28 20 76 65 72 73 69 6f  r);.  if( versio
b7b0: 6e 20 29 7b 0a 20 20 20 20 20 70 72 69 6e 74 66  n ){.     printf
b7c0: 28 22 4c 65 6d 6f 6e 20 76 65 72 73 69 6f 6e 20  ("Lemon version 
b7d0: 31 2e 30 5c 6e 22 29 3b 0a 20 20 20 20 20 65 78  1.0\n");.     ex
b7e0: 69 74 28 30 29 3b 20 0a 20 20 7d 0a 20 20 69 66  it(0); .  }.  if
b7f0: 28 20 4f 70 74 4e 41 72 67 73 28 29 21 3d 31 20  ( OptNArgs()!=1 
b800: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
b810: 74 64 65 72 72 2c 22 45 78 61 63 74 6c 79 20 6f  tderr,"Exactly o
b820: 6e 65 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 75  ne filename argu
b830: 6d 65 6e 74 20 69 73 20 72 65 71 75 69 72 65 64  ment is required
b840: 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  .\n");.    exit(
b850: 31 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  1);.  }.  memset
b860: 28 26 6c 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  (&lem, 0, sizeof
b870: 28 6c 65 6d 29 29 3b 0a 20 20 6c 65 6d 2e 65 72  (lem));.  lem.er
b880: 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 20 20 6c 65  rorcnt = 0;.  le
b890: 6d 2e 6e 65 78 70 65 63 74 65 64 20 3d 20 2d 31  m.nexpected = -1
b8a0: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
b8b0: 7a 65 20 74 68 65 20 6d 61 63 68 69 6e 65 20 2a  ze the machine *
b8c0: 2f 0a 20 20 53 74 72 73 61 66 65 5f 69 6e 69 74  /.  Strsafe_init
b8d0: 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69 6e 69  ();.  Symbol_ini
b8e0: 74 28 29 3b 0a 20 20 53 74 61 74 65 5f 69 6e 69  t();.  State_ini
b8f0: 74 28 29 3b 0a 20 20 6c 65 6d 2e 61 72 67 76 30  t();.  lem.argv0
b900: 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 6c 65   = argv[0];.  le
b910: 6d 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 4f 70 74  m.filename = Opt
b920: 41 72 67 28 30 29 3b 0a 20 20 6c 65 6d 2e 62 61  Arg(0);.  lem.ba
b930: 73 69 73 66 6c 61 67 20 3d 20 62 61 73 69 73 66  sisflag = basisf
b940: 6c 61 67 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c 69 6e  lag;.  lem.nolin
b950: 65 6e 6f 73 66 6c 61 67 20 3d 20 6e 6f 6c 69 6e  enosflag = nolin
b960: 65 6e 6f 73 66 6c 61 67 3b 0a 20 20 53 79 6d 62  enosflag;.  Symb
b970: 6f 6c 5f 6e 65 77 28 22 24 22 29 3b 0a 20 20 6c  ol_new("$");.  l
b980: 65 6d 2e 65 72 72 73 79 6d 20 3d 20 53 79 6d 62  em.errsym = Symb
b990: 6f 6c 5f 6e 65 77 28 22 65 72 72 6f 72 22 29 3b  ol_new("error");
b9a0: 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 2d 3e 75  .  lem.errsym->u
b9b0: 73 65 43 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  seCnt = 0;..  /*
b9c0: 20 50 61 72 73 65 20 74 68 65 20 69 6e 70 75 74   Parse the input
b9d0: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 61 72 73 65   file */.  Parse
b9e0: 28 26 6c 65 6d 29 3b 0a 20 20 69 66 28 20 6c 65  (&lem);.  if( le
b9f0: 6d 2e 65 72 72 6f 72 63 6e 74 20 29 20 65 78 69  m.errorcnt ) exi
ba00: 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 29 3b  t(lem.errorcnt);
ba10: 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 72 75 6c 65  .  if( lem.nrule
ba20: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
ba30: 74 66 28 73 74 64 65 72 72 2c 22 45 6d 70 74 79  tf(stderr,"Empty
ba40: 20 67 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a 20   grammar.\n");. 
ba50: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
ba60: 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 61 6e 64 20  .  /* Count and 
ba70: 69 6e 64 65 78 20 74 68 65 20 73 79 6d 62 6f 6c  index the symbol
ba80: 73 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72  s of the grammar
ba90: 20 2a 2f 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f   */.  lem.nsymbo
baa0: 6c 20 3d 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74  l = Symbol_count
bab0: 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77  ();.  Symbol_new
bac0: 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20  ("{default}");. 
bad0: 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20 53   lem.symbols = S
bae0: 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 3b  ymbol_arrayof();
baf0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6c  .  for(i=0; i<=l
bb00: 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  em.nsymbol; i++)
bb10: 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d   lem.symbols[i]-
bb20: 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 71 73  >index = i;.  qs
bb30: 6f 72 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c  ort(lem.symbols,
bb40: 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2b 31 2c 73 69  lem.nsymbol+1,si
bb50: 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
bb60: 6f 6c 2a 29 2c 20 53 79 6d 62 6f 6c 63 6d 70 70  ol*), Symbolcmpp
bb70: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
bb80: 3d 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  =lem.nsymbol; i+
bb90: 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69  +) lem.symbols[i
bba0: 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20  ]->index = i;.  
bbb0: 66 6f 72 28 69 3d 31 3b 20 69 73 75 70 70 65 72  for(i=1; isupper
bbc0: 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  (lem.symbols[i]-
bbd0: 3e 6e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29 3b  >name[0]); i++);
bbe0: 0a 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c  .  lem.nterminal
bbf0: 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65   = i;..  /* Gene
bc00: 72 61 74 65 20 61 20 72 65 70 72 69 6e 74 20 6f  rate a reprint o
bc10: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2c 20 69  f the grammar, i
bc20: 66 20 72 65 71 75 65 73 74 65 64 20 6f 6e 20 74  f requested on t
bc30: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
bc40: 2a 2f 0a 20 20 69 66 28 20 72 70 66 6c 61 67 20  */.  if( rpflag 
bc50: 29 7b 0a 20 20 20 20 52 65 70 72 69 6e 74 28 26  ){.    Reprint(&
bc60: 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lem);.  }else{. 
bc70: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
bc80: 20 74 68 65 20 73 69 7a 65 20 66 6f 72 20 61 6c   the size for al
bc90: 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64 20 66 69 72  l follow and fir
bca0: 73 74 20 73 65 74 73 20 2a 2f 0a 20 20 20 20 53  st sets */.    S
bcb0: 65 74 53 69 7a 65 28 6c 65 6d 2e 6e 74 65 72 6d  etSize(lem.nterm
bcc0: 69 6e 61 6c 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a  inal+1);..    /*
bcd0: 20 46 69 6e 64 20 74 68 65 20 70 72 65 63 65 64   Find the preced
bce0: 65 6e 63 65 20 66 6f 72 20 65 76 65 72 79 20 70  ence for every p
bcf0: 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 28  roduction rule (
bd00: 74 68 61 74 20 68 61 73 20 6f 6e 65 29 20 2a 2f  that has one) */
bd10: 0a 20 20 20 20 46 69 6e 64 52 75 6c 65 50 72 65  .    FindRulePre
bd20: 63 65 64 65 6e 63 65 73 28 26 6c 65 6d 29 3b 0a  cedences(&lem);.
bd30: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
bd40: 74 68 65 20 6c 61 6d 62 64 61 2d 6e 6f 6e 74 65  the lambda-nonte
bd50: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 74 68 65 20  rminals and the 
bd60: 66 69 72 73 74 2d 73 65 74 73 20 66 6f 72 20 65  first-sets for e
bd70: 76 65 72 79 0a 20 20 20 20 2a 2a 20 6e 6f 6e 74  very.    ** nont
bd80: 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20 20 20 46  erminal */.    F
bd90: 69 6e 64 46 69 72 73 74 53 65 74 73 28 26 6c 65  indFirstSets(&le
bda0: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
bdb0: 75 74 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74  ute all LR(0) st
bdc0: 61 74 65 73 2e 20 20 41 6c 73 6f 20 72 65 63 6f  ates.  Also reco
bdd0: 72 64 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72  rd follow-set pr
bde0: 6f 70 61 67 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  opagation.    **
bdf0: 20 6c 69 6e 6b 73 20 73 6f 20 74 68 61 74 20 74   links so that t
be00: 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 61  he follow-set ca
be10: 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61  n be computed la
be20: 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65 6d 2e 6e  ter */.    lem.n
be30: 73 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 46  state = 0;.    F
be40: 69 6e 64 53 74 61 74 65 73 28 26 6c 65 6d 29 3b  indStates(&lem);
be50: 0a 20 20 20 20 6c 65 6d 2e 73 6f 72 74 65 64 20  .    lem.sorted 
be60: 3d 20 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28  = State_arrayof(
be70: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 69 65 20 75  );..    /* Tie u
be80: 70 20 6c 6f 6f 73 65 20 65 6e 64 73 20 6f 6e 20  p loose ends on 
be90: 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  the propagation 
bea0: 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20 20 46 69 6e  links */.    Fin
beb0: 64 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b 0a 0a 20  dLinks(&lem);.. 
bec0: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
bed0: 65 20 66 6f 6c 6c 6f 77 20 73 65 74 20 6f 66 20  e follow set of 
bee0: 65 76 65 72 79 20 72 65 64 75 63 69 62 6c 65 20  every reducible 
bef0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f  configuration */
bf00: 0a 20 20 20 20 46 69 6e 64 46 6f 6c 6c 6f 77 53  .    FindFollowS
bf10: 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ets(&lem);..    
bf20: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61  /* Compute the a
bf30: 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a  ction tables */.
bf40: 20 20 20 20 46 69 6e 64 41 63 74 69 6f 6e 73 28      FindActions(
bf50: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  &lem);..    /* C
bf60: 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63 74 69  ompress the acti
bf70: 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  on tables */.   
bf80: 20 69 66 28 20 63 6f 6d 70 72 65 73 73 3d 3d 30   if( compress==0
bf90: 20 29 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65   ) CompressTable
bfa0: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
bfb0: 20 52 65 6f 72 64 65 72 20 61 6e 64 20 72 65 6e   Reorder and ren
bfc0: 75 6d 62 65 72 20 74 68 65 20 73 74 61 74 65 73  umber the states
bfd0: 20 73 6f 20 74 68 61 74 20 73 74 61 74 65 73 20   so that states 
bfe0: 77 69 74 68 20 66 65 77 65 72 20 63 68 6f 69 63  with fewer choic
bff0: 65 73 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 20  es.    ** occur 
c000: 61 74 20 74 68 65 20 65 6e 64 2e 20 2a 2f 0a 20  at the end. */. 
c010: 20 20 20 52 65 73 6f 72 74 53 74 61 74 65 73 28     ResortStates(
c020: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  &lem);..    /* G
c030: 65 6e 65 72 61 74 65 20 61 20 72 65 70 6f 72 74  enerate a report
c040: 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 67   of the parser g
c050: 65 6e 65 72 61 74 65 64 2e 20 20 28 74 68 65 20  enerated.  (the 
c060: 22 79 2e 6f 75 74 70 75 74 22 20 66 69 6c 65 29  "y.output" file)
c070: 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 71 75 69   */.    if( !qui
c080: 65 74 20 29 20 52 65 70 6f 72 74 4f 75 74 70 75  et ) ReportOutpu
c090: 74 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  t(&lem);..    /*
c0a0: 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 6f   Generate the so
c0b0: 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68  urce code for th
c0c0: 65 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 20 20  e parser */.    
c0d0: 52 65 70 6f 72 74 54 61 62 6c 65 28 26 6c 65 6d  ReportTable(&lem
c0e0: 2c 20 6d 68 66 6c 61 67 29 3b 0a 0a 20 20 20 20  , mhflag);..    
c0f0: 2f 2a 20 50 72 6f 64 75 63 65 20 61 20 68 65 61  /* Produce a hea
c100: 64 65 72 20 66 69 6c 65 20 66 6f 72 20 75 73 65  der file for use
c110: 20 62 79 20 74 68 65 20 73 63 61 6e 6e 65 72 2e   by the scanner.
c120: 20 20 28 54 68 69 73 20 73 74 65 70 20 69 73 0a    (This step is.
c130: 20 20 20 20 2a 2a 20 6f 6d 69 74 74 65 64 20 69      ** omitted i
c140: 66 20 74 68 65 20 22 2d 6d 22 20 6f 70 74 69 6f  f the "-m" optio
c150: 6e 20 69 73 20 75 73 65 64 20 62 65 63 61 75 73  n is used becaus
c160: 65 20 6d 61 6b 65 68 65 61 64 65 72 73 20 77 69  e makeheaders wi
c170: 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61  ll.    ** genera
c180: 74 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  te the file for 
c190: 75 73 2e 29 20 2a 2f 0a 20 20 20 20 69 66 28 20  us.) */.    if( 
c1a0: 21 6d 68 66 6c 61 67 20 29 20 52 65 70 6f 72 74  !mhflag ) Report
c1b0: 48 65 61 64 65 72 28 26 6c 65 6d 29 3b 0a 20 20  Header(&lem);.  
c1c0: 7d 0a 20 20 69 66 28 20 73 74 61 74 69 73 74 69  }.  if( statisti
c1d0: 63 73 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  cs ){.    printf
c1e0: 28 22 50 61 72 73 65 72 20 73 74 61 74 69 73 74  ("Parser statist
c1f0: 69 63 73 3a 20 25 64 20 74 65 72 6d 69 6e 61 6c  ics: %d terminal
c200: 73 2c 20 25 64 20 6e 6f 6e 74 65 72 6d 69 6e 61  s, %d nontermina
c210: 6c 73 2c 20 25 64 20 72 75 6c 65 73 5c 6e 22 2c  ls, %d rules\n",
c220: 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 74 65 72 6d  .      lem.nterm
c230: 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 73 79 6d 62 6f  inal, lem.nsymbo
c240: 6c 20 2d 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61  l - lem.ntermina
c250: 6c 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20  l, lem.nrule);. 
c260: 20 20 20 70 72 69 6e 74 66 28 22 20 20 20 20 20     printf("     
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
c280: 20 73 74 61 74 65 73 2c 20 25 64 20 70 61 72 73   states, %d pars
c290: 65 72 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  er table entries
c2a0: 2c 20 25 64 20 63 6f 6e 66 6c 69 63 74 73 5c 6e  , %d conflicts\n
c2b0: 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 73 74  ",.      lem.nst
c2c0: 61 74 65 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69  ate, lem.tablesi
c2d0: 7a 65 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63  ze, lem.nconflic
c2e0: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65  t);.  }.  if( le
c2f0: 6d 2e 6e 65 78 70 65 63 74 65 64 20 3c 20 30 20  m.nexpected < 0 
c300: 29 20 7b 0a 20 20 20 20 6c 65 6d 2e 6e 65 78 70  ) {.    lem.nexp
c310: 65 63 74 65 64 20 3d 20 30 3b 20 20 2f 2a 20 67  ected = 0;  /* g
c320: 72 61 6d 6d 61 72 20 64 69 64 6e 27 74 20 68 61  rammar didn't ha
c330: 76 65 20 61 6e 20 25 65 78 70 65 63 74 20 64 65  ve an %expect de
c340: 63 6c 61 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  claration. */.  
c350: 7d 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 63 6f 6e  }.  if( lem.ncon
c360: 66 6c 69 63 74 20 21 3d 20 6c 65 6d 2e 6e 65 78  flict != lem.nex
c370: 70 65 63 74 65 64 20 29 7b 0a 20 20 20 20 66 70  pected ){.    fp
c380: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 64  rintf(stderr,"%d
c390: 20 70 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63   parsing conflic
c3a0: 74 73 20 28 25 64 20 65 78 70 65 63 74 65 64 29  ts (%d expected)
c3b0: 2e 5c 6e 22 2c 6c 65 6d 2e 6e 63 6f 6e 66 6c 69  .\n",lem.nconfli
c3c0: 63 74 2c 6c 65 6d 2e 6e 65 78 70 65 63 74 65 64  ct,lem.nexpected
c3d0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 72 65 74  );.  }..  /* ret
c3e0: 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73  urn 0 on success
c3f0: 2c 20 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20  , 1 on failure. 
c400: 2a 2f 0a 20 20 65 78 69 74 63 6f 64 65 20 3d 20  */.  exitcode = 
c410: 28 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3e  ((lem.errorcnt >
c420: 20 30 29 20 7c 7c 20 28 6c 65 6d 2e 6e 63 6f 6e   0) || (lem.ncon
c430: 66 6c 69 63 74 20 21 3d 20 6c 65 6d 2e 6e 65 78  flict != lem.nex
c440: 70 65 63 74 65 64 29 29 20 3f 20 31 20 3a 20 30  pected)) ? 1 : 0
c450: 3b 0a 20 20 73 75 63 63 65 73 73 66 75 6c 5f 65  ;.  successful_e
c460: 78 69 74 20 3d 20 28 65 78 69 74 63 6f 64 65 20  xit = (exitcode 
c470: 3d 3d 20 30 29 3b 0a 20 20 65 78 69 74 28 65 78  == 0);.  exit(ex
c480: 69 74 63 6f 64 65 29 3b 0a 20 20 72 65 74 75 72  itcode);.  retur
c490: 6e 20 28 65 78 69 74 63 6f 64 65 29 3b 0a 7d 0a  n (exitcode);.}.
c4a0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
c4b0: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
c4c0: 69 6c 65 20 22 6d 73 6f 72 74 2e 63 22 20 2a 2a  ile "msort.c" **
c4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
c4f0: 2a 0a 2a 2a 20 41 20 67 65 6e 65 72 69 63 20 6d  *.** A generic m
c500: 65 72 67 65 2d 73 6f 72 74 20 70 72 6f 67 72 61  erge-sort progra
c510: 6d 2e 0a 2a 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a  m..**.** USAGE:.
c520: 2a 2a 20 4c 65 74 20 22 70 74 72 22 20 62 65 20  ** Let "ptr" be 
c530: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 73 6f 6d  a pointer to som
c540: 65 20 73 74 72 75 63 74 75 72 65 20 77 68 69 63  e structure whic
c550: 68 20 69 73 20 61 74 20 74 68 65 20 68 65 61 64  h is at the head
c560: 20 6f 66 0a 2a 2a 20 61 20 6e 75 6c 6c 2d 74 65   of.** a null-te
c570: 72 6d 69 6e 61 74 65 64 20 6c 69 73 74 2e 20 20  rminated list.  
c580: 54 68 65 6e 20 74 6f 20 73 6f 72 74 20 74 68 65  Then to sort the
c590: 20 6c 69 73 74 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a   list call:.**.*
c5a0: 2a 20 20 20 20 20 70 74 72 20 3d 20 6d 73 6f 72  *     ptr = msor
c5b0: 74 28 70 74 72 2c 26 28 70 74 72 2d 3e 6e 65 78  t(ptr,&(ptr->nex
c5c0: 74 29 2c 63 6d 70 66 6e 63 29 3b 0a 2a 2a 0a 2a  t),cmpfnc);.**.*
c5d0: 2a 20 49 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  * In the above, 
c5e0: 22 63 6d 70 66 6e 63 22 20 69 73 20 61 20 70 6f  "cmpfnc" is a po
c5f0: 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
c600: 69 6f 6e 20 77 68 69 63 68 20 63 6f 6d 70 61 72  ion which compar
c610: 65 73 0a 2a 2a 20 74 77 6f 20 69 6e 73 74 61 6e  es.** two instan
c620: 63 65 73 20 6f 66 20 74 68 65 20 73 74 72 75 63  ces of the struc
c630: 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 73  ture and returns
c640: 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 73 20   an integer, as 
c650: 69 6e 0a 2a 2a 20 73 74 72 63 6d 70 2e 20 20 54  in.** strcmp.  T
c660: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
c670: 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
c680: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74  to the pointer t
c690: 6f 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  o the.** second 
c6a0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c  element of the l
c6b0: 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 54 68 69  inked list.  Thi
c6c0: 73 20 61 64 64 72 65 73 73 20 69 73 20 75 73 65  s address is use
c6d0: 64 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20  d to compute.** 
c6e0: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
c6f0: 65 20 22 6e 65 78 74 22 20 66 69 65 6c 64 20 77  e "next" field w
c700: 69 74 68 69 6e 20 74 68 65 20 73 74 72 75 63 74  ithin the struct
c710: 75 72 65 2e 20 20 54 68 65 20 6f 66 66 73 65 74  ure.  The offset
c720: 20 74 6f 0a 2a 2a 20 74 68 65 20 22 6e 65 78 74   to.** the "next
c730: 22 20 66 69 65 6c 64 20 6d 75 73 74 20 62 65 20  " field must be 
c740: 63 6f 6e 73 74 61 6e 74 20 66 6f 72 20 61 6c 6c  constant for all
c750: 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74   structures in t
c760: 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  he list..**.** T
c770: 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
c780: 72 6e 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  rns a new pointe
c790: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 68  r which is the h
c7a0: 65 61 64 20 6f 66 20 74 68 65 20 6c 69 73 74 0a  ead of the list.
c7b0: 2a 2a 20 61 66 74 65 72 20 73 6f 72 74 69 6e 67  ** after sorting
c7c0: 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47 4f 52 49 54 48  ..**.** ALGORITH
c7d0: 4d 3a 0a 2a 2a 20 4d 65 72 67 65 2d 73 6f 72 74  M:.** Merge-sort
c7e0: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
c7f0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
c800: 74 68 65 20 6e 65 78 74 20 73 74 72 75 63 74 75  the next structu
c810: 72 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  re in the linked
c820: 20 6c 69 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e   list..*/.#defin
c830: 65 20 4e 45 58 54 28 41 29 20 28 2a 28 63 68 61  e NEXT(A) (*(cha
c840: 72 2a 2a 29 28 28 28 75 6e 73 69 67 6e 65 64 20  r**)(((unsigned 
c850: 6c 6f 6e 67 29 41 29 2b 6f 66 66 73 65 74 29 29  long)A)+offset))
c860: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a  ../*.** Inputs:.
c870: 2a 2a 20 20 20 61 3a 20 20 20 20 20 20 20 41 20  **   a:       A 
c880: 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72  sorted, null-ter
c890: 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c  minated linked l
c8a0: 69 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75  ist.  (May be nu
c8b0: 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a 20 20 20 20  ll)..**   b:    
c8c0: 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c     A sorted, nul
c8d0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e  l-terminated lin
c8e0: 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20  ked list.  (May 
c8f0: 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 63  be null)..**   c
c900: 6d 70 3a 20 20 20 20 20 41 20 70 6f 69 6e 74 65  mp:     A pointe
c910: 72 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  r to the compari
c920: 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  son function..**
c930: 20 20 20 6f 66 66 73 65 74 3a 20 20 4f 66 66 73     offset:  Offs
c940: 65 74 20 69 6e 20 74 68 65 20 73 74 72 75 63 74  et in the struct
c950: 75 72 65 20 74 6f 20 74 68 65 20 22 6e 65 78 74  ure to the "next
c960: 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52  " field..**.** R
c970: 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20  eturn Value:.** 
c980: 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74    A pointer to t
c990: 68 65 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72  he head of a sor
c9a0: 74 65 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ted list contain
c9b0: 69 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73  ing the elements
c9c0: 0a 2a 2a 20 20 20 6f 66 20 62 6f 74 68 20 61 20  .**   of both a 
c9d0: 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 69 64  and b..**.** Sid
c9e0: 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20  e effects:.**   
c9f0: 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74  The "next" point
ca00: 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73  ers for elements
ca10: 20 69 6e 20 74 68 65 20 6c 69 73 74 73 20 61 20   in the lists a 
ca20: 61 6e 64 20 62 20 61 72 65 0a 2a 2a 20 20 20 63  and b are.**   c
ca30: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  hanged..*/.stati
ca40: 63 20 63 68 61 72 20 2a 6d 65 72 67 65 28 0a 20  c char *merge(. 
ca50: 20 63 68 61 72 20 2a 61 2c 0a 20 20 63 68 61 72   char *a,.  char
ca60: 20 2a 62 2c 0a 20 20 69 6e 74 20 28 2a 63 6d 70   *b,.  int (*cmp
ca70: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
ca80: 6e 73 74 20 63 68 61 72 2a 29 2c 0a 20 20 69 6e  nst char*),.  in
ca90: 74 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 63 68  t offset.){.  ch
caa0: 61 72 20 2a 70 74 72 2c 20 2a 68 65 61 64 3b 0a  ar *ptr, *head;.
cab0: 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20  .  if( a==0 ){. 
cac0: 20 20 20 68 65 61 64 20 3d 20 62 3b 0a 20 20 7d     head = b;.  }
cad0: 65 6c 73 65 20 69 66 28 20 62 3d 3d 30 20 29 7b  else if( b==0 ){
cae0: 0a 20 20 20 20 68 65 61 64 20 3d 20 61 3b 0a 20  .    head = a;. 
caf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
cb00: 28 2a 63 6d 70 29 28 61 2c 62 29 3c 3d 30 20 29  (*cmp)(a,b)<=0 )
cb10: 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b  {.      ptr = a;
cb20: 0a 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28  .      a = NEXT(
cb30: 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  a);.    }else{. 
cb40: 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20       ptr = b;.  
cb50: 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b      b = NEXT(b);
cb60: 0a 20 20 20 20 7d 0a 20 20 20 20 68 65 61 64 20  .    }.    head 
cb70: 3d 20 70 74 72 3b 0a 20 20 20 20 77 68 69 6c 65  = ptr;.    while
cb80: 28 20 61 20 26 26 20 62 20 29 7b 0a 20 20 20 20  ( a && b ){.    
cb90: 20 20 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62    if( (*cmp)(a,b
cba0: 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )<=0 ){.        
cbb0: 4e 45 58 54 28 70 74 72 29 20 3d 20 61 3b 0a 20  NEXT(ptr) = a;. 
cbc0: 20 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a         ptr = a;.
cbd0: 20 20 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54          a = NEXT
cbe0: 28 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (a);.      }else
cbf0: 7b 0a 20 20 20 20 20 20 20 20 4e 45 58 54 28 70  {.        NEXT(p
cc00: 74 72 29 20 3d 20 62 3b 0a 20 20 20 20 20 20 20  tr) = b;.       
cc10: 20 70 74 72 20 3d 20 62 3b 0a 20 20 20 20 20 20   ptr = b;.      
cc20: 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20    b = NEXT(b);. 
cc30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
cc40: 20 69 66 28 20 61 20 29 20 4e 45 58 54 28 70 74   if( a ) NEXT(pt
cc50: 72 29 20 3d 20 61 3b 0a 20 20 20 20 65 6c 73 65  r) = a;.    else
cc60: 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20      NEXT(ptr) = 
cc70: 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  b;.  }.  return 
cc80: 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  head;.}../*.** I
cc90: 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 6c 69 73 74  nputs:.**   list
cca0: 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74  :      Pointer t
ccb0: 6f 20 61 20 73 69 6e 67 6c 79 2d 6c 69 6e 6b 65  o a singly-linke
ccc0: 64 20 6c 69 73 74 20 6f 66 20 73 74 72 75 63 74  d list of struct
ccd0: 75 72 65 73 2e 0a 2a 2a 20 20 20 6e 65 78 74 3a  ures..**   next:
cce0: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
ccf0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
cd00: 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f  second element o
cd10: 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 20 20  f the list..**  
cd20: 20 63 6d 70 3a 20 20 20 20 20 20 20 41 20 63 6f   cmp:       A co
cd30: 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
cd40: 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  n..**.** Return 
cd50: 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f  Value:.**   A po
cd60: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
cd70: 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20 6c 69  d of a sorted li
cd80: 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  st containing th
cd90: 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  e elements.**   
cda0: 6f 72 67 69 6e 61 6c 6c 79 20 69 6e 20 6c 69 73  orginally in lis
cdb0: 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66  t..**.** Side ef
cdc0: 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20  fects:.**   The 
cdd0: 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20  "next" pointers 
cde0: 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  for elements in 
cdf0: 6c 69 73 74 20 61 72 65 20 63 68 61 6e 67 65 64  list are changed
ce00: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 49 53  ..*/.#define LIS
ce10: 54 53 49 5a 45 20 33 30 0a 73 74 61 74 69 63 20  TSIZE 30.static 
ce20: 63 68 61 72 20 2a 6d 73 6f 72 74 28 0a 20 20 63  char *msort(.  c
ce30: 68 61 72 20 2a 6c 69 73 74 2c 0a 20 20 63 68 61  har *list,.  cha
ce40: 72 20 2a 2a 6e 65 78 74 2c 0a 20 20 69 6e 74 20  r **next,.  int 
ce50: 28 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61  (*cmp)(const cha
ce60: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a  r*,const char*).
ce70: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  ){.  unsigned lo
ce80: 6e 67 20 6f 66 66 73 65 74 3b 0a 20 20 63 68 61  ng offset;.  cha
ce90: 72 20 2a 65 70 3b 0a 20 20 63 68 61 72 20 2a 73  r *ep;.  char *s
cea0: 65 74 5b 4c 49 53 54 53 49 5a 45 5d 3b 0a 20 20  et[LISTSIZE];.  
ceb0: 69 6e 74 20 69 3b 0a 20 20 6f 66 66 73 65 74 20  int i;.  offset 
cec0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  = (unsigned long
ced0: 29 6e 65 78 74 20 2d 20 28 75 6e 73 69 67 6e 65  )next - (unsigne
cee0: 64 20 6c 6f 6e 67 29 6c 69 73 74 3b 0a 20 20 66  d long)list;.  f
cef0: 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49  or(i=0; i<LISTSI
cf00: 5a 45 3b 20 69 2b 2b 29 20 73 65 74 5b 69 5d 20  ZE; i++) set[i] 
cf10: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 6c 69  = 0;.  while( li
cf20: 73 74 20 29 7b 0a 20 20 20 20 65 70 20 3d 20 6c  st ){.    ep = l
cf30: 69 73 74 3b 0a 20 20 20 20 6c 69 73 74 20 3d 20  ist;.    list = 
cf40: 4e 45 58 54 28 6c 69 73 74 29 3b 0a 20 20 20 20  NEXT(list);.    
cf50: 4e 45 58 54 28 65 70 29 20 3d 20 30 3b 0a 20 20  NEXT(ep) = 0;.  
cf60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53    for(i=0; i<LIS
cf70: 54 53 49 5a 45 2d 31 20 26 26 20 73 65 74 5b 69  TSIZE-1 && set[i
cf80: 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ]!=0; i++){.    
cf90: 20 20 65 70 20 3d 20 6d 65 72 67 65 28 65 70 2c    ep = merge(ep,
cfa0: 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65  set[i],cmp,offse
cfb0: 74 29 3b 0a 20 20 20 20 20 20 73 65 74 5b 69 5d  t);.      set[i]
cfc0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
cfd0: 73 65 74 5b 69 5d 20 3d 20 65 70 3b 0a 20 20 7d  set[i] = ep;.  }
cfe0: 0a 20 20 65 70 20 3d 20 30 3b 0a 20 20 66 6f 72  .  ep = 0;.  for
cff0: 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45  (i=0; i<LISTSIZE
d000: 3b 20 69 2b 2b 29 20 69 66 28 20 73 65 74 5b 69  ; i++) if( set[i
d010: 5d 20 29 20 65 70 20 3d 20 6d 65 72 67 65 28 73  ] ) ep = merge(s
d020: 65 74 5b 69 5d 2c 65 70 2c 63 6d 70 2c 6f 66 66  et[i],ep,cmp,off
d030: 73 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  set);.  return e
d040: 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  p;.}./**********
d050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
d060: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70  rom the file "op
d070: 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  tion.c" ********
d080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d090: 2a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  **/.static char 
d0a0: 2a 2a 61 72 67 76 3b 0a 73 74 61 74 69 63 20 73  **argv;.static s
d0b0: 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20  truct s_options 
d0c0: 2a 6f 70 3b 0a 73 74 61 74 69 63 20 46 49 4c 45  *op;.static FILE
d0d0: 20 2a 65 72 72 73 74 72 65 61 6d 3b 0a 0a 23 64   *errstream;..#d
d0e0: 65 66 69 6e 65 20 49 53 4f 50 54 28 58 29 20 28  efine ISOPT(X) (
d0f0: 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c 7c 28 58 29  (X)[0]=='-'||(X)
d100: 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74 72 63 68 72  [0]=='+'||strchr
d110: 28 28 58 29 2c 27 3d 27 29 21 3d 30 29 0a 0a 2f  ((X),'=')!=0)../
d120: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63  *.** Print the c
d130: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 69 74 68  ommand line with
d140: 20 61 20 63 61 72 72 6f 74 20 70 6f 69 6e 74 69   a carrot pointi
d150: 6e 67 20 74 6f 20 74 68 65 20 6b 2d 74 68 20 63  ng to the k-th c
d160: 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20 74  haracter.** of t
d170: 68 65 20 6e 2d 74 68 20 66 69 65 6c 64 2e 0a 2a  he n-th field..*
d180: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 72  /.static void er
d190: 72 6c 69 6e 65 28 69 6e 74 20 6e 2c 20 69 6e 74  rline(int n, int
d1a0: 20 6b 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b   k, FILE *err).{
d1b0: 0a 20 20 69 6e 74 20 73 70 63 6e 74 2c 20 69 3b  .  int spcnt, i;
d1c0: 0a 20 20 69 66 28 20 61 72 67 76 5b 30 5d 20 29  .  if( argv[0] )
d1d0: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
d1e0: 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 70  ",argv[0]);.  sp
d1f0: 63 6e 74 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  cnt = lemonStrle
d200: 6e 28 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b 0a  n(argv[0]) + 1;.
d210: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26    for(i=1; i<n &
d220: 26 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b  & argv[i]; i++){
d230: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
d240: 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b  ," %s",argv[i]);
d250: 0a 20 20 20 20 73 70 63 6e 74 20 2b 3d 20 6c 65  .    spcnt += le
d260: 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76 5b 69  monStrlen(argv[i
d270: 5d 29 2b 31 3b 0a 20 20 7d 0a 20 20 73 70 63 6e  ])+1;.  }.  spcn
d280: 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b 20  t += k;.  for(; 
d290: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 20 66 70  argv[i]; i++) fp
d2a0: 72 69 6e 74 66 28 65 72 72 2c 22 20 25 73 22 2c  rintf(err," %s",
d2b0: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 69 66 28 20  argv[i]);.  if( 
d2c0: 73 70 63 6e 74 3c 32 30 20 29 7b 0a 20 20 20 20  spcnt<20 ){.    
d2d0: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25  fprintf(err,"\n%
d2e0: 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c 73 70  *s^-- here\n",sp
d2f0: 63 6e 74 2c 22 22 29 3b 0a 20 20 7d 65 6c 73 65  cnt,"");.  }else
d300: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72  {.    fprintf(er
d310: 72 2c 22 5c 6e 25 2a 73 68 65 72 65 20 2d 2d 5e  r,"\n%*shere --^
d320: 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c 22 22 29 3b  \n",spcnt-7,"");
d330: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
d340: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
d350: 66 20 74 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d 73  f the N-th non-s
d360: 77 69 74 63 68 20 61 72 67 75 6d 65 6e 74 2e 20  witch argument. 
d370: 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
d380: 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   N is out of ran
d390: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
d3a0: 74 20 61 72 67 69 6e 64 65 78 28 69 6e 74 20 6e  t argindex(int n
d3b0: 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ).{.  int i;.  i
d3c0: 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b  nt dashdash = 0;
d3d0: 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20 26  .  if( argv!=0 &
d3e0: 26 20 2a 61 72 67 76 21 3d 30 20 29 7b 0a 20 20  & *argv!=0 ){.  
d3f0: 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b    for(i=1; argv[
d400: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
d410: 69 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20  if( dashdash || 
d420: 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20  !ISOPT(argv[i]) 
d430: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
d440: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
d450: 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20          n--;.   
d460: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
d470: 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d  trcmp(argv[i],"-
d480: 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73  -")==0 ) dashdas
d490: 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  h = 1;.    }.  }
d4a0: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
d4b0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 65 6d 73  .static char ems
d4c0: 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c  g[] = "Command l
d4d0: 69 6e 65 20 73 79 6e 74 61 78 20 65 72 72 6f 72  ine syntax error
d4e0: 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  : ";../*.** Proc
d4f0: 65 73 73 20 61 20 66 6c 61 67 20 63 6f 6d 6d 61  ess a flag comma
d500: 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd line argument
d510: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d520: 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 6e 74 20  handleflags(int 
d530: 69 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a  i, FILE *err).{.
d540: 20 20 69 6e 74 20 76 3b 0a 20 20 69 6e 74 20 65    int v;.  int e
d550: 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  rrcnt = 0;.  int
d560: 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f   j;.  for(j=0; o
d570: 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29  p[j].label; j++)
d580: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  {.    if( strncm
d590: 70 28 26 61 72 67 76 5b 69 5d 5b 31 5d 2c 6f 70  p(&argv[i][1],op
d5a0: 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c 65 6d 6f 6e 53  [j].label,lemonS
d5b0: 74 72 6c 65 6e 28 6f 70 5b 6a 5d 2e 6c 61 62 65  trlen(op[j].labe
d5c0: 6c 29 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  l))==0 ) break;.
d5d0: 20 20 7d 0a 20 20 76 20 3d 20 61 72 67 76 5b 69    }.  v = argv[i
d5e0: 5d 5b 30 5d 3d 3d 27 2d 27 20 3f 20 31 20 3a 20  ][0]=='-' ? 1 : 
d5f0: 30 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c  0;.  if( op[j].l
d600: 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  abel==0 ){.    i
d610: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
d620: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75  fprintf(err,"%su
d630: 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e  ndefined option.
d640: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
d650: 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72   errline(i,1,err
d660: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72  );.    }.    err
d670: 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69  cnt++;.  }else i
d680: 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f  f( op[j].type==O
d690: 50 54 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a  PT_FLAG ){.    *
d6a0: 28 28 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67  ((int*)op[j].arg
d6b0: 29 20 3d 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69  ) = v;.  }else i
d6c0: 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f  f( op[j].type==O
d6d0: 50 54 5f 46 46 4c 41 47 20 29 7b 0a 20 20 20 20  PT_FFLAG ){.    
d6e0: 28 2a 28 76 6f 69 64 28 2a 29 28 69 6e 74 29 29  (*(void(*)(int))
d6f0: 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 76 29 3b  (op[j].arg))(v);
d700: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b  .  }else if( op[
d710: 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 53 54  j].type==OPT_FST
d720: 52 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64  R ){.    (*(void
d730: 28 2a 29 28 63 68 61 72 20 2a 29 29 28 6f 70 5b  (*)(char *))(op[
d740: 6a 5d 2e 61 72 67 29 29 28 26 61 72 67 76 5b 69  j].arg))(&argv[i
d750: 5d 5b 32 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ][2]);.  }else{.
d760: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
d770: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
d780: 2c 22 25 73 6d 69 73 73 69 6e 67 20 61 72 67 75  ,"%smissing argu
d790: 6d 65 6e 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c  ment on switch.\
d7a0: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
d7b0: 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29  errline(i,1,err)
d7c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63  ;.    }.    errc
d7d0: 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nt++;.  }.  retu
d7e0: 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a  rn errcnt;.}../*
d7f0: 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 63 6f  .** Process a co
d800: 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 77 69 74 63  mmand line switc
d810: 68 20 77 68 69 63 68 20 68 61 73 20 61 6e 20 61  h which has an a
d820: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
d830: 69 63 20 69 6e 74 20 68 61 6e 64 6c 65 73 77 69  ic int handleswi
d840: 74 63 68 28 69 6e 74 20 69 2c 20 46 49 4c 45 20  tch(int i, FILE 
d850: 2a 65 72 72 29 0a 7b 0a 20 20 69 6e 74 20 6c 76  *err).{.  int lv
d860: 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20 64   = 0;.  double d
d870: 76 20 3d 20 30 2e 30 3b 0a 20 20 63 68 61 72 20  v = 0.0;.  char 
d880: 2a 73 76 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20  *sv = 0, *end;. 
d890: 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 69 6e 74   char *cp;.  int
d8a0: 20 6a 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74   j;.  int errcnt
d8b0: 20 3d 20 30 3b 0a 20 20 63 70 20 3d 20 73 74 72   = 0;.  cp = str
d8c0: 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29  chr(argv[i],'=')
d8d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 70 21 3d  ;.  assert( cp!=
d8e0: 30 20 29 3b 0a 20 20 2a 63 70 20 3d 20 30 3b 0a  0 );.  *cp = 0;.
d8f0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d    for(j=0; op[j]
d900: 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  .label; j++){.  
d910: 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
d920: 76 5b 69 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c  v[i],op[j].label
d930: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
d940: 7d 0a 20 20 2a 63 70 20 3d 20 27 3d 27 3b 0a 20  }.  *cp = '=';. 
d950: 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c   if( op[j].label
d960: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65  ==0 ){.    if( e
d970: 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  rr ){.      fpri
d980: 6e 74 66 28 65 72 72 2c 22 25 73 75 6e 64 65 66  ntf(err,"%sundef
d990: 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c  ined option.\n",
d9a0: 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72  emsg);.      err
d9b0: 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20  line(i,0,err);. 
d9c0: 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b     }.    errcnt+
d9d0: 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
d9e0: 63 70 2b 2b 3b 0a 20 20 20 20 73 77 69 74 63 68  cp++;.    switch
d9f0: 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a  ( op[j].type ){.
da00: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
da10: 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20  LAG:.      case 
da20: 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20  OPT_FFLAG:.     
da30: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
da40: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
da50: 65 72 72 2c 22 25 73 6f 70 74 69 6f 6e 20 72 65  err,"%soption re
da60: 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65  quires an argume
da70: 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20  nt.\n",emsg);.  
da80: 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28          errline(
da90: 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20 20 20 20  i,0,err);.      
daa0: 20 20 7d 0a 20 20 20 20 20 20 20 20 65 72 72 63    }.        errc
dab0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72  nt++;.        br
dac0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
dad0: 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63  OPT_DBL:.      c
dae0: 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20  ase OPT_FDBL:.  
daf0: 20 20 20 20 20 20 64 76 20 3d 20 73 74 72 74 6f        dv = strto
db00: 64 28 63 70 2c 26 65 6e 64 29 3b 0a 20 20 20 20  d(cp,&end);.    
db10: 20 20 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a      if( *end ){.
db20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72            if( er
db30: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
db40: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
db50: 69 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65  illegal characte
db60: 72 20 69 6e 20 66 6c 6f 61 74 69 6e 67 2d 70 6f  r in floating-po
db70: 69 6e 74 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22  int argument.\n"
db80: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  ,emsg);.        
db90: 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 28 28      errline(i,((
dba0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 65 6e  unsigned long)en
dbb0: 64 29 2d 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  d)-(unsigned lon
dbc0: 67 29 61 72 67 76 5b 69 5d 2c 65 72 72 29 3b 0a  g)argv[i],err);.
dbd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
dbe0: 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a        errcnt++;.
dbf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dc00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
dc10: 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20  ase OPT_INT:.   
dc20: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54     case OPT_FINT
dc30: 3a 0a 20 20 20 20 20 20 20 20 6c 76 20 3d 20 73  :.        lv = s
dc40: 74 72 74 6f 6c 28 63 70 2c 26 65 6e 64 2c 30 29  trtol(cp,&end,0)
dc50: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 65  ;.        if( *e
dc60: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
dc70: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
dc80: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65         fprintf(e
dc90: 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63 68  rr,"%sillegal ch
dca0: 61 72 61 63 74 65 72 20 69 6e 20 69 6e 74 65 67  aracter in integ
dcb0: 65 72 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c  er argument.\n",
dcc0: 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  emsg);.         
dcd0: 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 28 28 75     errline(i,((u
dce0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 65 6e 64  nsigned long)end
dcf0: 29 2d 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  )-(unsigned long
dd00: 29 61 72 67 76 5b 69 5d 2c 65 72 72 29 3b 0a 20  )argv[i],err);. 
dd10: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
dd20: 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20       errcnt++;. 
dd30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dd40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
dd50: 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20  se OPT_STR:.    
dd60: 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a    case OPT_FSTR:
dd70: 0a 20 20 20 20 20 20 20 20 73 76 20 3d 20 63 70  .        sv = cp
dd80: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
dd90: 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
dda0: 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b  h( op[j].type ){
ddb0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
ddc0: 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65  FLAG:.      case
ddd0: 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20   OPT_FFLAG:.    
dde0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ddf0: 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20   case OPT_DBL:. 
de00: 20 20 20 20 20 20 20 2a 28 64 6f 75 62 6c 65 2a         *(double*
de10: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 64  )(op[j].arg) = d
de20: 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  v;.        break
de30: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
de40: 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 28  _FDBL:.        (
de50: 2a 28 76 6f 69 64 28 2a 29 28 64 6f 75 62 6c 65  *(void(*)(double
de60: 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 64  ))(op[j].arg))(d
de70: 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  v);.        brea
de80: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
de90: 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 2a  T_INT:.        *
dea0: 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67  (int*)(op[j].arg
deb0: 29 20 3d 20 6c 76 3b 0a 20 20 20 20 20 20 20 20  ) = lv;.        
dec0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ded0: 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20  e OPT_FINT:.    
dee0: 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 69      (*(void(*)(i
def0: 6e 74 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29  nt))(op[j].arg))
df00: 28 28 69 6e 74 29 6c 76 29 3b 0a 20 20 20 20 20  ((int)lv);.     
df10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
df20: 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20  case OPT_STR:.  
df30: 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 28        *(char**)(
df40: 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 73 76 3b  op[j].arg) = sv;
df50: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
df60: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
df70: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 28 2a 28  STR:.        (*(
df80: 76 6f 69 64 28 2a 29 28 63 68 61 72 20 2a 29 29  void(*)(char *))
df90: 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 73 76 29  (op[j].arg))(sv)
dfa0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
dfb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
dfc0: 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 69  urn errcnt;.}..i
dfd0: 6e 74 20 4f 70 74 49 6e 69 74 28 63 68 61 72 20  nt OptInit(char 
dfe0: 2a 2a 61 2c 20 73 74 72 75 63 74 20 73 5f 6f 70  **a, struct s_op
dff0: 74 69 6f 6e 73 20 2a 6f 2c 20 46 49 4c 45 20 2a  tions *o, FILE *
e000: 65 72 72 29 0a 7b 0a 20 20 69 6e 74 20 65 72 72  err).{.  int err
e010: 63 6e 74 20 3d 20 30 3b 0a 20 20 61 72 67 76 20  cnt = 0;.  argv 
e020: 3d 20 61 3b 0a 20 20 6f 70 20 3d 20 6f 3b 0a 20  = a;.  op = o;. 
e030: 20 65 72 72 73 74 72 65 61 6d 20 3d 20 65 72 72   errstream = err
e040: 3b 0a 20 20 69 66 28 20 61 72 67 76 20 26 26 20  ;.  if( argv && 
e050: 2a 61 72 67 76 20 26 26 20 6f 70 20 29 7b 0a 20  *argv && op ){. 
e060: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
e070: 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20  r(i=1; argv[i]; 
e080: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
e090: 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b 27 20  argv[i][0]=='+' 
e0a0: 7c 7c 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27  || argv[i][0]=='
e0b0: 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72  -' ){.        er
e0c0: 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 66 6c  rcnt += handlefl
e0d0: 61 67 73 28 69 2c 65 72 72 29 3b 0a 20 20 20 20  ags(i,err);.    
e0e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
e0f0: 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 20  hr(argv[i],'=') 
e100: 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e  ){.        errcn
e110: 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77 69 74 63  t += handleswitc
e120: 68 28 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20  h(i,err);.      
e130: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
e140: 28 20 65 72 72 63 6e 74 3e 30 20 29 7b 0a 20 20  ( errcnt>0 ){.  
e150: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 56    fprintf(err,"V
e160: 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  alid command lin
e170: 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 5c 22  e options for \"
e180: 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a 61 29  %s\" are:\n",*a)
e190: 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e 74 28 29  ;.    OptPrint()
e1a0: 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
e1b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
e1c0: 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67 73 28 29  ..int OptNArgs()
e1d0: 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  {.  int cnt = 0;
e1e0: 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68 20  .  int dashdash 
e1f0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
e200: 69 66 28 20 61 72 67 76 21 3d 30 20 26 26 20 61  if( argv!=0 && a
e210: 72 67 76 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20  rgv[0]!=0 ){.   
e220: 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69   for(i=1; argv[i
e230: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
e240: 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21  f( dashdash || !
e250: 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29  ISOPT(argv[i]) )
e260: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
e270: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d  ( strcmp(argv[i]
e280: 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68  ,"--")==0 ) dash
e290: 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  dash = 1;.    }.
e2a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6e 74    }.  return cnt
e2b0: 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f 70 74 41 72  ;.}..char *OptAr
e2c0: 67 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74  g(int n).{.  int
e2d0: 20 69 3b 0a 20 20 69 20 3d 20 61 72 67 69 6e 64   i;.  i = argind
e2e0: 65 78 28 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex(n);.  return 
e2f0: 69 3e 3d 30 20 3f 20 61 72 67 76 5b 69 5d 20 3a  i>=0 ? argv[i] :
e300: 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 45   0;.}..void OptE
e310: 72 72 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e  rr(int n).{.  in
e320: 74 20 69 3b 0a 20 20 69 20 3d 20 61 72 67 69 6e  t i;.  i = argin
e330: 64 65 78 28 6e 29 3b 0a 20 20 69 66 28 20 69 3e  dex(n);.  if( i>
e340: 3d 30 20 29 20 65 72 72 6c 69 6e 65 28 69 2c 30  =0 ) errline(i,0
e350: 2c 65 72 72 73 74 72 65 61 6d 29 3b 0a 7d 0a 0a  ,errstream);.}..
e360: 76 6f 69 64 20 4f 70 74 50 72 69 6e 74 28 29 7b  void OptPrint(){
e370: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
e380: 6d 61 78 2c 20 6c 65 6e 3b 0a 20 20 6d 61 78 20  max, len;.  max 
e390: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
e3a0: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b  op[i].label; i++
e3b0: 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d  ){.    len = lem
e3c0: 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c  onStrlen(op[i].l
e3d0: 61 62 65 6c 29 20 2b 20 31 3b 0a 20 20 20 20 73  abel) + 1;.    s
e3e0: 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70  witch( op[i].typ
e3f0: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
e400: 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
e410: 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
e420: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e430: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e       case OPT_IN
e440: 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  T:.      case OP
e450: 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20  T_FINT:.        
e460: 6c 65 6e 20 2b 3d 20 39 3b 20 20 20 20 20 20 20  len += 9;       
e470: 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 69  /* length of "<i
e480: 6e 74 65 67 65 72 3e 22 20 2a 2f 0a 20 20 20 20  nteger>" */.    
e490: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e4a0: 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20   case OPT_DBL:. 
e4b0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44       case OPT_FD
e4c0: 42 4c 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20  BL:.        len 
e4d0: 2b 3d 20 36 3b 20 20 20 20 20 20 20 2f 2a 20 6c  += 6;       /* l
e4e0: 65 6e 67 74 68 20 6f 66 20 22 3c 72 65 61 6c 3e  ength of "<real>
e4f0: 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  " */.        bre
e500: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
e510: 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61  PT_STR:.      ca
e520: 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20  se OPT_FSTR:.   
e530: 20 20 20 20 20 6c 65 6e 20 2b 3d 20 38 3b 20 20       len += 8;  
e540: 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f       /* length o
e550: 66 20 22 3c 73 74 72 69 6e 67 3e 22 20 2a 2f 0a  f "<string>" */.
e560: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e570: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 65 6e     }.    if( len
e580: 3e 6d 61 78 20 29 20 6d 61 78 20 3d 20 6c 65 6e  >max ) max = len
e590: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
e5a0: 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b   op[i].label; i+
e5b0: 2b 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20  +){.    switch( 
e5c0: 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[i].type ){.  
e5d0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
e5e0: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
e5f0: 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
e600: 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65   fprintf(errstre
e610: 61 6d 2c 22 20 20 2d 25 2d 2a 73 20 20 25 73 5c  am,"  -%-*s  %s\
e620: 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e 6c 61 62  n",max,op[i].lab
e630: 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65  el,op[i].message
e640: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
e650: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
e660: 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65  _INT:.      case
e670: 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20   OPT_FINT:.     
e680: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74     fprintf(errst
e690: 72 65 61 6d 2c 22 20 20 25 73 3d 3c 69 6e 74 65  ream,"  %s=<inte
e6a0: 67 65 72 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f  ger>%*s  %s\n",o
e6b0: 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20  p[i].label,.    
e6c0: 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d        (int)(max-
e6d0: 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69  lemonStrlen(op[i
e6e0: 5d 2e 6c 61 62 65 6c 29 2d 39 29 2c 22 22 2c 6f  ].label)-9),"",o
e6f0: 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20  p[i].message);. 
e700: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e710: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c      case OPT_DBL
e720: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
e730: 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 66  _FDBL:.        f
e740: 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d  printf(errstream
e750: 2c 22 20 20 25 73 3d 3c 72 65 61 6c 3e 25 2a 73  ,"  %s=<real>%*s
e760: 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61    %s\n",op[i].la
e770: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  bel,.          (
e780: 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74  int)(max-lemonSt
e790: 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c  rlen(op[i].label
e7a0: 29 2d 36 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65  )-6),"",op[i].me
e7b0: 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
e7c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
e7d0: 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20  e OPT_STR:.     
e7e0: 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a   case OPT_FSTR:.
e7f0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
e800: 65 72 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d  errstream,"  %s=
e810: 3c 73 74 72 69 6e 67 3e 25 2a 73 20 20 25 73 5c  <string>%*s  %s\
e820: 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a  n",op[i].label,.
e830: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
e840: 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  max-lemonStrlen(
e850: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 38 29 2c  op[i].label)-8),
e860: 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65  "",op[i].message
e870: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
e880: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
e890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e8a0: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
e8b0: 66 69 6c 65 20 22 70 61 72 73 65 2e 63 22 20 2a  file "parse.c" *
e8c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e8d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
e8e0: 2a 2a 20 49 6e 70 75 74 20 66 69 6c 65 20 70 61  ** Input file pa
e8f0: 72 73 65 72 20 66 6f 72 20 74 68 65 20 4c 45 4d  rser for the LEM
e900: 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
e910: 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68 65 20  tor..*/../* The 
e920: 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72  state of the par
e930: 73 65 72 20 2a 2f 0a 65 6e 75 6d 20 65 5f 73 74  ser */.enum e_st
e940: 61 74 65 20 7b 0a 20 20 49 4e 49 54 49 41 4c 49  ate {.  INITIALI
e950: 5a 45 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  ZE,.  WAITING_FO
e960: 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c 0a  R_DECL_OR_RULE,.
e970: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45    WAITING_FOR_DE
e980: 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a 20 20 57 41  CL_KEYWORD,.  WA
e990: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
e9a0: 52 47 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  RG,.  WAITING_FO
e9b0: 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
e9c0: 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  BOL,.  WAITING_F
e9d0: 4f 52 5f 41 52 52 4f 57 2c 0a 20 20 49 4e 5f 52  OR_ARROW,.  IN_R
e9e0: 48 53 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f  HS,.  LHS_ALIAS_
e9f0: 31 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f 32  1,.  LHS_ALIAS_2
ea00: 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f 33 2c  ,.  LHS_ALIAS_3,
ea10: 0a 20 20 52 48 53 5f 41 4c 49 41 53 5f 31 2c 0a  .  RHS_ALIAS_1,.
ea20: 20 20 52 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20    RHS_ALIAS_2,. 
ea30: 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
ea40: 5f 31 2c 0a 20 20 50 52 45 43 45 44 45 4e 43 45  _1,.  PRECEDENCE
ea50: 5f 4d 41 52 4b 5f 32 2c 0a 20 20 52 45 53 59 4e  _MARK_2,.  RESYN
ea60: 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
ea70: 4f 52 2c 0a 20 20 52 45 53 59 4e 43 5f 41 46 54  OR,.  RESYNC_AFT
ea80: 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 2c 0a 20  ER_DECL_ERROR,. 
ea90: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53   WAITING_FOR_DES
eaa0: 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a  TRUCTOR_SYMBOL,.
eab0: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41    WAITING_FOR_DA
eac0: 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 2c 0a 20  TATYPE_SYMBOL,. 
ead0: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c   WAITING_FOR_FAL
eae0: 4c 42 41 43 4b 5f 49 44 2c 0a 20 20 57 41 49 54  LBACK_ID,.  WAIT
eaf0: 49 4e 47 5f 46 4f 52 5f 45 58 50 45 43 54 5f 56  ING_FOR_EXPECT_V
eb00: 41 4c 55 45 2c 0a 20 20 57 41 49 54 49 4e 47 5f  ALUE,.  WAITING_
eb10: 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 0a  FOR_WILDCARD_ID.
eb20: 7d 3b 0a 73 74 72 75 63 74 20 70 73 74 61 74 65  };.struct pstate
eb30: 20 7b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 6e   {.  char *filen
eb40: 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  ame;       /* Na
eb50: 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  me of the input 
eb60: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  file */.  int to
eb70: 6b 65 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20  kenlineno;      
eb80: 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 61 74  /* Linenumber at
eb90: 20 77 68 69 63 68 20 63 75 72 72 65 6e 74 20 74   which current t
eba0: 6f 6b 65 6e 20 73 74 61 72 74 73 20 2a 2f 0a 20  oken starts */. 
ebb0: 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20   int errorcnt;  
ebc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ebd0: 20 6f 66 20 65 72 72 6f 72 73 20 73 6f 20 66 61   of errors so fa
ebe0: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  r */.  char *tok
ebf0: 65 6e 73 74 61 72 74 3b 20 20 20 20 20 2f 2a 20  enstart;     /* 
ec00: 54 65 78 74 20 6f 66 20 63 75 72 72 65 6e 74 20  Text of current 
ec10: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63  token */.  struc
ec20: 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20 20 20  t lemon *gp;    
ec30: 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 74 61 74 65   /* Global state
ec40: 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 65 6e 75   vector */.  enu
ec50: 6d 20 65 5f 73 74 61 74 65 20 73 74 61 74 65 3b  m e_state state;
ec60: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
ec70: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72 73  tate of the pars
ec80: 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  er */.  struct s
ec90: 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b  ymbol *fallback;
eca0: 20 20 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62 61     /* The fallba
ecb0: 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74  ck token */.  st
ecc0: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73  ruct symbol *lhs
ecd0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74  ;        /* Left
ece0: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63 75  -hand side of cu
ecf0: 72 72 65 6e 74 20 72 75 6c 65 20 2a 2f 0a 20 20  rrent rule */.  
ed00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 68 73 61  const char *lhsa
ed10: 6c 69 61 73 3b 20 20 20 20 20 20 2f 2a 20 41 6c  lias;      /* Al
ed20: 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20  ias for the LHS 
ed30: 2a 2f 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20 20  */.  int nrhs;  
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 69 67  /* Number of rig
ed60: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 73 79 6d  ht-hand side sym
ed70: 62 6f 6c 73 20 73 65 65 6e 20 2a 2f 0a 20 20 73  bols seen */.  s
ed80: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 72 68  truct symbol *rh
ed90: 73 5b 4d 41 58 52 48 53 5d 3b 20 20 2f 2a 20 52  s[MAXRHS];  /* R
eda0: 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  HS symbols */.  
edb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 6c 69 61  const char *alia
edc0: 73 5b 4d 41 58 52 48 53 5d 3b 20 2f 2a 20 41 6c  s[MAXRHS]; /* Al
edd0: 69 61 73 65 73 20 66 6f 72 20 65 61 63 68 20 52  iases for each R
ede0: 48 53 20 73 79 6d 62 6f 6c 20 28 6f 72 20 4e 55  HS symbol (or NU
edf0: 4c 4c 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  LL) */.  struct 
ee00: 72 75 6c 65 20 2a 70 72 65 76 72 75 6c 65 3b 20  rule *prevrule; 
ee10: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
ee20: 72 75 6c 65 20 70 61 72 73 65 64 20 2a 2f 0a 20  rule parsed */. 
ee30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 65 63   const char *dec
ee40: 6c 6b 65 79 77 6f 72 64 3b 20 20 20 2f 2a 20 4b  lkeyword;   /* K
ee50: 65 79 77 6f 72 64 20 6f 66 20 61 20 64 65 63 6c  eyword of a decl
ee60: 61 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61  aration */.  cha
ee70: 72 20 2a 2a 64 65 63 6c 61 72 67 73 6c 6f 74 3b  r **declargslot;
ee80: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
ee90: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
eea0: 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
eeb0: 20 62 65 20 70 75 74 20 2a 2f 0a 20 20 69 6e 74   be put */.  int
eec0: 20 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f   insertLineMacro
eed0: 3b 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 23  ;       /* Add #
eee0: 6c 69 6e 65 20 62 65 66 6f 72 65 20 64 65 63 6c  line before decl
eef0: 61 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 20 2a  aration insert *
ef00: 2f 0a 20 20 69 6e 74 20 2a 64 65 63 6c 6c 69 6e  /.  int *decllin
ef10: 65 6e 6f 73 6c 6f 74 3b 20 20 20 20 20 20 20 2f  enoslot;       /
ef20: 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
ef30: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6c 69 6e   declaration lin
ef40: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 65 6e  e number */.  en
ef50: 75 6d 20 65 5f 61 73 73 6f 63 20 64 65 63 6c 61  um e_assoc decla
ef60: 73 73 6f 63 3b 20 20 20 20 2f 2a 20 41 73 73 69  ssoc;    /* Assi
ef70: 67 6e 20 74 68 69 73 20 61 73 73 6f 63 69 61 74  gn this associat
ef80: 69 6f 6e 20 74 6f 20 64 65 63 6c 20 61 72 67 75  ion to decl argu
ef90: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 70  ments */.  int p
efa0: 72 65 63 63 6f 75 6e 74 65 72 3b 20 20 20 20 20  reccounter;     
efb0: 20 20 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20        /* Assign 
efc0: 74 68 69 73 20 70 72 65 63 65 64 65 6e 63 65 20  this precedence 
efd0: 74 6f 20 64 65 63 6c 20 61 72 67 75 6d 65 6e 74  to decl argument
efe0: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  s */.  struct ru
eff0: 6c 65 20 2a 66 69 72 73 74 72 75 6c 65 3b 20 20  le *firstrule;  
f000: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
f010: 66 69 72 73 74 20 72 75 6c 65 20 69 6e 20 74 68  first rule in th
f020: 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 73  e grammar */.  s
f030: 74 72 75 63 74 20 72 75 6c 65 20 2a 6c 61 73 74  truct rule *last
f040: 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 6f 69  rule;     /* Poi
f050: 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 6f 73 74  nter to the most
f060: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
f070: 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20   rule */.};../* 
f080: 50 61 72 73 65 20 61 20 73 69 6e 67 6c 65 20 74  Parse a single t
f090: 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76  oken */.static v
f0a0: 6f 69 64 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65  oid parseonetoke
f0b0: 6e 28 73 74 72 75 63 74 20 70 73 74 61 74 65 20  n(struct pstate 
f0c0: 2a 70 73 70 29 0a 7b 0a 20 20 63 68 61 72 20 2a  *psp).{.  char *
f0d0: 65 6e 64 70 74 72 3b 0a 20 20 63 6f 6e 73 74 20  endptr;.  const 
f0e0: 63 68 61 72 20 2a 78 3b 0a 20 20 78 20 3d 20 53  char *x;.  x = S
f0f0: 74 72 73 61 66 65 28 70 73 70 2d 3e 74 6f 6b 65  trsafe(psp->toke
f100: 6e 73 74 61 72 74 29 3b 20 20 20 20 20 2f 2a 20  nstart);     /* 
f110: 53 61 76 65 20 74 68 65 20 74 6f 6b 65 6e 20 70  Save the token p
f120: 65 72 6d 61 6e 65 6e 74 6c 79 20 2a 2f 0a 23 69  ermanently */.#i
f130: 66 20 30 0a 20 20 70 72 69 6e 74 66 28 22 25 73  f 0.  printf("%s
f140: 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b 25 73 5d 20  :%d: Token=[%s] 
f150: 73 74 61 74 65 3d 25 64 5c 6e 22 2c 70 73 70 2d  state=%d\n",psp-
f160: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
f170: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
f180: 78 2c 70 73 70 2d 3e 73 74 61 74 65 29 3b 0a 23  x,psp->state);.#
f190: 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28 20  endif.  switch( 
f1a0: 70 73 70 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20  psp->state ){.  
f1b0: 20 20 63 61 73 65 20 49 4e 49 54 49 41 4c 49 5a    case INITIALIZ
f1c0: 45 3a 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72  E:.      psp->pr
f1d0: 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20  evrule = 0;.    
f1e0: 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74    psp->preccount
f1f0: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73  er = 0;.      ps
f200: 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70  p->firstrule = p
f210: 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 30  sp->lastrule = 0
f220: 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d  ;.      psp->gp-
f230: 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20  >nrule = 0;.    
f240: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 74    /* Fall thru t
f250: 6f 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20  o next case */. 
f260: 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
f270: 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
f280: 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
f290: 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20 20 20 20  =='%' ){.       
f2a0: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
f2b0: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b  ITING_FOR_DECL_K
f2c0: 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20 7d 65  EYWORD;.      }e
f2d0: 6c 73 65 20 69 66 28 20 69 73 6c 6f 77 65 72 28  lse if( islower(
f2e0: 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
f2f0: 20 70 73 70 2d 3e 6c 68 73 20 3d 20 53 79 6d 62   psp->lhs = Symb
f300: 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
f310: 20 20 20 70 73 70 2d 3e 6e 72 68 73 20 3d 20 30     psp->nrhs = 0
f320: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c  ;.        psp->l
f330: 68 73 61 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  hsalias = 0;.   
f340: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
f350: 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52  = WAITING_FOR_AR
f360: 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROW;.      }else
f370: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27 20 29   if( x[0]=='{' )
f380: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  {.        if( ps
f390: 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20 29  p->prevrule==0 )
f3a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
f3b0: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
f3c0: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
f3d0: 65 6e 6f 2c 0a 22 54 68 65 72 65 20 69 73 20 6e  eno,."There is n
f3e0: 6f 20 70 72 69 6f 72 20 72 75 6c 65 20 6f 70 6f  o prior rule opo
f3f0: 6e 20 77 68 69 63 68 20 74 6f 20 61 74 74 61 63  n which to attac
f400: 68 20 74 68 65 20 63 6f 64 65 20 5c 0a 66 72 61  h the code \.fra
f410: 67 6d 65 6e 74 20 77 68 69 63 68 20 62 65 67 69  gment which begi
f420: 6e 73 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 2e  ns on this line.
f430: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ");.          ps
f440: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 09  p->errorcnt++;..
f450: 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70  }else if( psp->p
f460: 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65 21 3d 30  revrule->code!=0
f470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72   ){.          Er
f480: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
f490: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
f4a0: 69 6e 65 6e 6f 2c 0a 22 43 6f 64 65 20 66 72 61  ineno,."Code fra
f4b0: 67 6d 65 6e 74 20 62 65 67 69 6e 6e 69 6e 67 20  gment beginning 
f4c0: 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20  on this line is 
f4d0: 6e 6f 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a  not the first \.
f4e0: 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72  to follow the pr
f4f0: 65 76 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a  evious rule.");.
f500: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
f510: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f520: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f530: 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c      psp->prevrul
f540: 65 2d 3e 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74  e->line = psp->t
f550: 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20  okenlineno;.    
f560: 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72        psp->prevr
f570: 75 6c 65 2d 3e 63 6f 64 65 20 3d 20 26 78 5b 31  ule->code = &x[1
f580: 5d 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73  ];..}.      }els
f590: 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 5b 27 20  e if( x[0]=='[' 
f5a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
f5b0: 73 74 61 74 65 20 3d 20 50 52 45 43 45 44 45 4e  state = PRECEDEN
f5c0: 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20 20 20 20  CE_MARK_1;.     
f5d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f5e0: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
f5f0: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
f600: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
f610: 20 20 20 22 54 6f 6b 65 6e 20 5c 22 25 73 5c 22     "Token \"%s\"
f620: 20 73 68 6f 75 6c 64 20 62 65 20 65 69 74 68 65   should be eithe
f630: 72 20 5c 22 25 25 5c 22 20 6f 72 20 61 20 6e 6f  r \"%%\" or a no
f640: 6e 74 65 72 6d 69 6e 61 6c 20 6e 61 6d 65 2e 22  nterminal name."
f650: 2c 0a 20 20 20 20 20 20 20 20 20 20 78 29 3b 0a  ,.          x);.
f660: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
f670: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
f680: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f690: 20 20 63 61 73 65 20 50 52 45 43 45 44 45 4e 43    case PRECEDENC
f6a0: 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20 20 20 20  E_MARK_1:.      
f6b0: 69 66 28 20 21 69 73 75 70 70 65 72 28 78 5b 30  if( !isupper(x[0
f6c0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]) ){.        Er
f6d0: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
f6e0: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
f6f0: 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
f700: 20 22 54 68 65 20 70 72 65 63 65 64 65 6e 63 65   "The precedence
f710: 20 73 79 6d 62 6f 6c 20 6d 75 73 74 20 62 65 20   symbol must be 
f720: 61 20 74 65 72 6d 69 6e 61 6c 2e 22 29 3b 0a 20  a terminal.");. 
f730: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
f740: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  rcnt++;.      }e
f750: 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65  lse if( psp->pre
f760: 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  vrule==0 ){.    
f770: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
f780: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
f790: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
f7a0: 20 20 20 20 20 20 20 22 54 68 65 72 65 20 69 73         "There is
f7b0: 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20 74   no prior rule t
f7c0: 6f 20 61 73 73 69 67 6e 20 70 72 65 63 65 64 65  o assign precede
f7d0: 6e 63 65 20 5c 22 5b 25 73 5d 5c 22 2e 22 2c 78  nce \"[%s]\".",x
f7e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
f7f0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
f800: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d    }else if( psp-
f810: 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73  >prevrule->precs
f820: 79 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ym!=0 ){.       
f830: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
f840: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
f850: 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72 65 63 65  enlineno,."Prece
f860: 64 65 6e 63 65 20 6d 61 72 6b 20 6f 6e 20 74 68  dence mark on th
f870: 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74  is line is not t
f880: 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f  he first \.to fo
f890: 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f 75  llow the previou
f8a0: 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20  s rule.");.     
f8b0: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
f8c0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ++;.      }else{
f8d0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72  .        psp->pr
f8e0: 65 76 72 75 6c 65 2d 3e 70 72 65 63 73 79 6d 20  evrule->precsym 
f8f0: 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
f900: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
f910: 73 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43  sp->state = PREC
f920: 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3b 0a 20  EDENCE_MARK_2;. 
f930: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f940: 63 61 73 65 20 50 52 45 43 45 44 45 4e 43 45 5f  case PRECEDENCE_
f950: 4d 41 52 4b 5f 32 3a 0a 20 20 20 20 20 20 69 66  MARK_2:.      if
f960: 28 20 78 5b 30 5d 21 3d 27 5d 27 20 29 7b 0a 20  ( x[0]!=']' ){. 
f970: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f980: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f990: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f9a0: 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69            "Missi
f9b0: 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20 70 72 65 63  ng \"]\" on prec
f9c0: 65 64 65 6e 63 65 20 6d 61 72 6b 2e 22 29 3b 0a  edence mark.");.
f9d0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
f9e0: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
f9f0: 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74  .      psp->stat
fa00: 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
fa10: 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
fa20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
fa30: 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
fa40: 41 52 52 4f 57 3a 0a 20 20 20 20 20 20 69 66 28  ARROW:.      if(
fa50: 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b   x[0]==':' && x[
fa60: 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d  1]==':' && x[2]=
fa70: 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='=' ){.        
fa80: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f  psp->state = IN_
fa90: 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  RHS;.      }else
faa0: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 29   if( x[0]=='(' )
fab0: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
fac0: 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53  tate = LHS_ALIAS
fad0: 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _1;.      }else{
fae0: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
faf0: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
fb00: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
fb10: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 45 78 70  ,.          "Exp
fb20: 65 63 74 65 64 20 74 6f 20 73 65 65 20 61 20 5c  ected to see a \
fb30: 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ":\" following t
fb40: 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c 20 5c 22  he LHS symbol \"
fb50: 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20  %s\".",.        
fb60: 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65    psp->lhs->name
fb70: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
fb80: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
fb90: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
fba0: 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
fbb0: 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  LE_ERROR;.      
fbc0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
fbd0: 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41     case LHS_ALIA
fbe0: 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 69  S_1:.      if( i
fbf0: 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a  salpha(x[0]) ){.
fc00: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73          psp->lhs
fc10: 61 6c 69 61 73 20 3d 20 78 3b 0a 20 20 20 20 20  alias = x;.     
fc20: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
fc30: 4c 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20  LHS_ALIAS_2;.   
fc40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fc50: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
fc60: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
fc70: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
fc80: 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73 20       "\"%s\" is 
fc90: 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69 61  not a valid alia
fca0: 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20 5c 22  s for the LHS \"
fcb0: 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %s\"\n",.       
fcc0: 20 20 20 78 2c 70 73 70 2d 3e 6c 68 73 2d 3e 6e     x,psp->lhs->n
fcd0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ame);.        ps
fce0: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
fcf0: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
fd00: 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
fd10: 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
fd20: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
fd30: 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41  ;.    case LHS_A
fd40: 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66  LIAS_2:.      if
fd50: 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20  ( x[0]==')' ){. 
fd60: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
fd70: 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3b  e = LHS_ALIAS_3;
fd80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fd90: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
fda0: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
fdb0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
fdc0: 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e           "Missin
fdd0: 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e  g \")\" followin
fde0: 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65  g LHS alias name
fdf0: 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c   \"%s\".",psp->l
fe00: 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  hsalias);.      
fe10: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
fe20: 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
fe30: 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
fe40: 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
fe50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
fe60: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c  reak;.    case L
fe70: 48 53 5f 41 4c 49 41 53 5f 33 3a 0a 20 20 20 20  HS_ALIAS_3:.    
fe80: 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20    if( x[0]==':' 
fe90: 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20  && x[1]==':' && 
fea0: 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20  x[2]=='=' ){.   
feb0: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
fec0: 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20  = IN_RHS;.      
fed0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
fee0: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
fef0: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
ff00: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
ff10: 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 2d 3e 5c    "Missing \"->\
ff20: 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 5c 22 25  " following: \"%
ff30: 73 28 25 73 29 5c 22 2e 22 2c 0a 20 20 20 20 20  s(%s)\".",.     
ff40: 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e        psp->lhs->
ff50: 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68 73 61 6c 69  name,psp->lhsali
ff60: 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  as);.        psp
ff70: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
ff80: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
ff90: 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
ffa0: 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
ffb0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
ffc0: 0a 20 20 20 20 63 61 73 65 20 49 4e 5f 52 48 53  .    case IN_RHS
ffd0: 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
ffe0: 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='.' ){.       
fff0: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
10000 3b 0a 20 20 20 20 20 20 20 20 72 70 20 3d 20 28  ;.        rp = (
10010 73 74 72 75 63 74 20 72 75 6c 65 20 2a 29 63 61  struct rule *)ca
10020 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
10030 75 63 74 20 72 75 6c 65 29 20 2b 20 0a 20 20 20  uct rule) + .   
10040 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
10050 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29  (struct symbol*)
10060 2a 70 73 70 2d 3e 6e 72 68 73 20 2b 20 73 69 7a  *psp->nrhs + siz
10070 65 6f 66 28 63 68 61 72 2a 29 2a 70 73 70 2d 3e  eof(char*)*psp->
10080 6e 72 68 73 2c 20 31 29 3b 0a 20 20 20 20 20 20  nrhs, 1);.      
10090 20 20 69 66 28 20 72 70 3d 3d 30 20 29 7b 0a 20    if( rp==0 ){. 
100a0 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
100b0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
100c0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
100d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43  ,.            "C
100e0 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 65 6e  an't allocate en
100f0 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66 6f 72 20  ough memory for 
10100 74 68 69 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20  this rule.");.  
10110 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
10120 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
10130 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
10140 20 3d 20 30 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20   = 0;..}else{.  
10150 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
10160 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 75 6c           rp->rul
10170 65 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b  eline = psp->tok
10180 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  enlineno;.      
10190 20 20 20 20 72 70 2d 3e 72 68 73 20 3d 20 28 73      rp->rhs = (s
101a0 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 2a 29 26  truct symbol**)&
101b0 72 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  rp[1];.         
101c0 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 20 3d 20   rp->rhsalias = 
101d0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 28  (const char**)&(
101e0 72 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68  rp->rhs[psp->nrh
101f0 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  s]);.          f
10200 6f 72 28 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e  or(i=0; i<psp->n
10210 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
10220 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69         rp->rhs[i
10230 5d 20 3d 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b  ] = psp->rhs[i];
10240 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d  .            rp-
10250 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70  >rhsalias[i] = p
10260 73 70 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a 09 20  sp->alias[i];.. 
10270 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d   }.          rp-
10280 3e 6c 68 73 20 3d 20 70 73 70 2d 3e 6c 68 73 3b  >lhs = psp->lhs;
10290 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c  .          rp->l
102a0 68 73 61 6c 69 61 73 20 3d 20 70 73 70 2d 3e 6c  hsalias = psp->l
102b0 68 73 61 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  hsalias;.       
102c0 20 20 20 72 70 2d 3e 6e 72 68 73 20 3d 20 70 73     rp->nrhs = ps
102d0 70 2d 3e 6e 72 68 73 3b 0a 20 20 20 20 20 20 20  p->nrhs;.       
102e0 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b     rp->code = 0;
102f0 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70  .          rp->p
10300 72 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20  recsym = 0;.    
10310 20 20 20 20 20 20 72 70 2d 3e 69 6e 64 65 78 20        rp->index 
10320 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65  = psp->gp->nrule
10330 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  ++;.          rp
10340 2d 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e  ->nextlhs = rp->
10350 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20  lhs->rule;.     
10360 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75       rp->lhs->ru
10370 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20  le = rp;.       
10380 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b     rp->next = 0;
10390 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
103a0 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30  sp->firstrule==0
103b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
103c0 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d  psp->firstrule =
103d0 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d   psp->lastrule =
103e0 20 72 70 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a 20   rp;..  }else{. 
103f0 20 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e             psp->
10400 6c 61 73 74 72 75 6c 65 2d 3e 6e 65 78 74 20 3d  lastrule->next =
10410 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20   rp;.           
10420 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d   psp->lastrule =
10430 20 72 70 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20   rp;..  }.      
10440 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c      psp->prevrul
10450 65 20 3d 20 72 70 3b 0a 09 7d 0a 20 20 20 20 20  e = rp;..}.     
10460 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
10470 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
10480 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20  _OR_RULE;.      
10490 7d 65 6c 73 65 20 69 66 28 20 69 73 61 6c 70 68  }else if( isalph
104a0 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  a(x[0]) ){.     
104b0 20 20 20 69 66 28 20 70 73 70 2d 3e 6e 72 68 73     if( psp->nrhs
104c0 3e 3d 4d 41 58 52 48 53 20 29 7b 0a 20 20 20 20  >=MAXRHS ){.    
104d0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
104e0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
104f0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
10500 20 20 20 20 20 20 20 20 20 20 20 22 54 6f 6f 20             "Too 
10510 6d 61 6e 79 20 73 79 6d 62 6f 6c 73 20 6f 6e 20  many symbols on 
10520 52 48 53 20 6f 66 20 72 75 6c 65 20 62 65 67 69  RHS of rule begi
10530 6e 6e 69 6e 67 20 61 74 20 5c 22 25 73 5c 22 2e  nning at \"%s\".
10540 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 78  ",.            x
10550 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
10560 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
10570 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
10580 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
10590 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 09 7d  R_RULE_ERROR;..}
105a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
105b0 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72  psp->rhs[psp->nr
105c0 68 73 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  hs] = Symbol_new
105d0 28 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  (x);.          p
105e0 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e  sp->alias[psp->n
105f0 72 68 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  rhs] = 0;.      
10600 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b      psp->nrhs++;
10610 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ..}.      }else 
10620 69 66 28 20 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c  if( (x[0]=='|' |
10630 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20  | x[0]=='/') && 
10640 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20  psp->nrhs>0 ){. 
10650 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
10660 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d  mbol *msp = psp-
10670 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31  >rhs[psp->nrhs-1
10680 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  ];.        if( m
10690 73 70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54  sp->type!=MULTIT
106a0 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
106b0 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
106c0 6f 6c 20 2a 6f 72 69 67 73 70 20 3d 20 6d 73 70  ol *origsp = msp
106d0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 20  ;.          msp 
106e0 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  = (struct symbol
106f0 20 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a   *) calloc(1,siz
10700 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20 20 20 20  eof(*msp));.    
10710 20 20 20 20 20 20 6d 65 6d 73 65 74 28 6d 73 70        memset(msp
10720 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6d 73 70  , 0, sizeof(*msp
10730 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73  ));.          ms
10740 70 2d 3e 74 79 70 65 20 3d 20 4d 55 4c 54 49 54  p->type = MULTIT
10750 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 20 20 20  ERMINAL;.       
10760 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 20     msp->nsubsym 
10770 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  = 1;.          m
10780 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73 74  sp->subsym = (st
10790 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20  ruct symbol **) 
107a0 63 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f 66 28  calloc(1,sizeof(
107b0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 29  struct symbol*))
107c0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d  ;.          msp-
107d0 3e 73 75 62 73 79 6d 5b 30 5d 20 3d 20 6f 72 69  >subsym[0] = ori
107e0 67 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  gsp;.          m
107f0 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f 72 69 67 73  sp->name = origs
10800 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  p->name;.       
10810 20 20 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d     psp->rhs[psp-
10820 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d 73 70 3b 0a  >nrhs-1] = msp;.
10830 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10840 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b 2b    msp->nsubsym++
10850 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73  ;.        msp->s
10860 75 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74 20  ubsym = (struct 
10870 73 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61 6c 6c  symbol **) reall
10880 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c 0a  oc(msp->subsym,.
10890 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
108a0 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29  (struct symbol*)
108b0 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29 3b 0a  *msp->nsubsym);.
108c0 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62          msp->sub
108d0 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73 79 6d  sym[msp->nsubsym
108e0 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  -1] = Symbol_new
108f0 28 26 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  (&x[1]);.       
10900 20 69 66 28 20 69 73 6c 6f 77 65 72 28 78 5b 31   if( islower(x[1
10910 5d 29 20 7c 7c 20 69 73 6c 6f 77 65 72 28 6d 73  ]) || islower(ms
10920 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61  p->subsym[0]->na
10930 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  me[0]) ){.      
10940 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
10950 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
10960 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
10970 20 20 20 20 20 20 20 20 20 22 43 61 6e 6e 6f 74           "Cannot
10980 20 66 6f 72 6d 20 61 20 63 6f 6d 70 6f 75 6e 64   form a compound
10990 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 6e 6f   containing a no
109a0 6e 2d 74 65 72 6d 69 6e 61 6c 22 29 3b 0a 20 20  n-terminal");.  
109b0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
109c0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
109d0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
109e0 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 26 26 20  f( x[0]=='(' && 
109f0 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20  psp->nrhs>0 ){. 
10a00 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
10a10 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 31 3b  e = RHS_ALIAS_1;
10a20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10a30 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
10a40 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
10a50 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
10a60 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
10a70 6c 20 63 68 61 72 61 63 74 65 72 20 6f 6e 20 52  l character on R
10a80 48 53 20 6f 66 20 72 75 6c 65 3a 20 5c 22 25 73  HS of rule: \"%s
10a90 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  \".",x);.       
10aa0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
10ab0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
10ac0 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
10ad0 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
10ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
10af0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 48  eak;.    case RH
10b00 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20  S_ALIAS_1:.     
10b10 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30   if( isalpha(x[0
10b20 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  ]) ){.        ps
10b30 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72  p->alias[psp->nr
10b40 68 73 2d 31 5d 20 3d 20 78 3b 0a 20 20 20 20 20  hs-1] = x;.     
10b50 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
10b60 52 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20  RHS_ALIAS_2;.   
10b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10b80 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
10b90 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
10ba0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
10bb0 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73 20       "\"%s\" is 
10bc0 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69 61  not a valid alia
10bd0 73 20 66 6f 72 20 74 68 65 20 52 48 53 20 73 79  s for the RHS sy
10be0 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a  mbol \"%s\"\n",.
10bf0 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d            x,psp-
10c00 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31  >rhs[psp->nrhs-1
10c10 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
10c20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
10c30 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
10c40 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
10c50 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
10c60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
10c70 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52  reak;.    case R
10c80 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20  HS_ALIAS_2:.    
10c90 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20    if( x[0]==')' 
10ca0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
10cb0 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a  state = IN_RHS;.
10cc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10cd0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
10ce0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
10cf0 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
10d00 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67          "Missing
10d10 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67   \")\" following
10d20 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65 20   LHS alias name 
10d30 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68  \"%s\".",psp->lh
10d40 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20  salias);.       
10d50 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
10d60 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
10d70 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
10d80 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
10d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
10da0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
10db0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b  ITING_FOR_DECL_K
10dc0 45 59 57 4f 52 44 3a 0a 20 20 20 20 20 20 69 66  EYWORD:.      if
10dd0 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20  ( isalpha(x[0]) 
10de0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
10df0 64 65 63 6c 6b 65 79 77 6f 72 64 20 3d 20 78 3b  declkeyword = x;
10e00 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65  .        psp->de
10e10 63 6c 61 72 67 73 6c 6f 74 20 3d 20 30 3b 0a 20  clargslot = 0;. 
10e20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
10e30 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20 30 3b 0a  linenoslot = 0;.
10e40 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
10e50 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 31  ertLineMacro = 1
10e60 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
10e70 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
10e80 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20  OR_DECL_ARG;.   
10e90 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
10ea0 78 2c 22 6e 61 6d 65 22 29 3d 3d 30 20 29 7b 0a  x,"name")==0 ){.
10eb0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
10ec0 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
10ed0 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65 29 3b 0a 20  sp->gp->name);. 
10ee0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
10ef0 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
10f00 30 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  0;..}else if( st
10f10 72 63 6d 70 28 78 2c 22 69 6e 63 6c 75 64 65 22  rcmp(x,"include"
10f20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
10f30 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
10f40 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
10f50 69 6e 63 6c 75 64 65 29 3b 0a 09 7d 65 6c 73 65  include);..}else
10f60 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 63   if( strcmp(x,"c
10f70 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ode")==0 ){.    
10f80 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
10f90 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
10fa0 67 70 2d 3e 65 78 74 72 61 63 6f 64 65 29 3b 0a  gp->extracode);.
10fb0 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d  .}else if( strcm
10fc0 70 28 78 2c 22 74 6f 6b 65 6e 5f 64 65 73 74 72  p(x,"token_destr
10fd0 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20  uctor")==0 ){.  
10fe0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
10ff0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d  largslot = &psp-
11000 3e 67 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a  >gp->tokendest;.
11010 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d  .}else if( strcm
11020 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 64 65 73  p(x,"default_des
11030 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a  tructor")==0 ){.
11040 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
11050 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73  eclargslot = &ps
11060 70 2d 3e 67 70 2d 3e 76 61 72 64 65 73 74 3b 0a  p->gp->vardest;.
11070 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d  .}else if( strcm
11080 70 28 78 2c 22 74 6f 6b 65 6e 5f 70 72 65 66 69  p(x,"token_prefi
11090 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
110a0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
110b0 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d  slot = &psp->gp-
110c0 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20  >tokenprefix;.  
110d0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
110e0 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30  ertLineMacro = 0
110f0 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
11100 63 6d 70 28 78 2c 22 73 79 6e 74 61 78 5f 65 72  cmp(x,"syntax_er
11110 72 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ror")==0 ){.    
11120 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
11130 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
11140 67 70 2d 3e 65 72 72 6f 72 29 3b 0a 09 7d 65 6c  gp->error);..}el
11150 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
11160 22 70 61 72 73 65 5f 61 63 63 65 70 74 22 29 3d  "parse_accept")=
11170 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11180 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
11190 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61 63   = &(psp->gp->ac
111a0 63 65 70 74 29 3b 0a 09 7d 65 6c 73 65 20 69 66  cept);..}else if
111b0 28 20 73 74 72 63 6d 70 28 78 2c 22 70 61 72 73  ( strcmp(x,"pars
111c0 65 5f 66 61 69 6c 75 72 65 22 29 3d 3d 30 20 29  e_failure")==0 )
111d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
111e0 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
111f0 28 70 73 70 2d 3e 67 70 2d 3e 66 61 69 6c 75 72  (psp->gp->failur
11200 65 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73  e);..}else if( s
11210 74 72 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f 6f  trcmp(x,"stack_o
11220 76 65 72 66 6c 6f 77 22 29 3d 3d 30 20 29 7b 0a  verflow")==0 ){.
11230 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
11240 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
11250 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66 6c 6f 77  sp->gp->overflow
11260 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
11270 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 65   if( strcmp(x,"e
11280 78 74 72 61 5f 61 72 67 75 6d 65 6e 74 22 29 3d  xtra_argument")=
11290 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
112a0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
112b0 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61 72   = &(psp->gp->ar
112c0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  g);.          ps
112d0 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
112e0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
112f0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
11300 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70 65 22 29  (x,"token_type")
11310 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11320 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
11330 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 74  t = &(psp->gp->t
11340 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20 20 20 20  okentype);.     
11350 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74       psp->insert
11360 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20  LineMacro = 0;. 
11370 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
11380 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66 61 75   strcmp(x,"defau
11390 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a  lt_type")==0 ){.
113a0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
113b0 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
113c0 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79 70 65 29  sp->gp->vartype)
113d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
113e0 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
113f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
11400 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
11410 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22 29 3d 3d  ,"stack_size")==
11420 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
11430 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
11440 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61  = &(psp->gp->sta
11450 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  cksize);.       
11460 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
11470 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20  neMacro = 0;.   
11480 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
11490 74 72 63 6d 70 28 78 2c 22 73 74 61 72 74 5f 73  trcmp(x,"start_s
114a0 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  ymbol")==0 ){.  
114b0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
114c0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
114d0 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20  ->gp->start);.  
114e0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
114f0 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30  ertLineMacro = 0
11500 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
11510 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6c 65  if( strcmp(x,"le
11520 66 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ft")==0 ){.     
11530 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f       psp->precco
11540 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20  unter++;.       
11550 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f     psp->declasso
11560 63 20 3d 20 4c 45 46 54 3b 0a 20 20 20 20 20 20  c = LEFT;.      
11570 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
11580 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45   WAITING_FOR_PRE
11590 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a  CEDENCE_SYMBOL;.
115a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
115b0 28 20 73 74 72 63 6d 70 28 78 2c 22 72 69 67 68  ( strcmp(x,"righ
115c0 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
115d0 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75      psp->preccou
115e0 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nter++;.        
115f0 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63    psp->declassoc
11600 20 3d 20 52 49 47 48 54 3b 0a 20 20 20 20 20 20   = RIGHT;.      
11610 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
11620 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45   WAITING_FOR_PRE
11630 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a  CEDENCE_SYMBOL;.
11640 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
11650 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 6f 6e 61  ( strcmp(x,"nona
11660 73 73 6f 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ssoc")==0 ){.   
11670 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63         psp->prec
11680 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20  counter++;.     
11690 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73       psp->declas
116a0 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20 20 20 20  soc = NONE;.    
116b0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
116c0 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50   = WAITING_FOR_P
116d0 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c  RECEDENCE_SYMBOL
116e0 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
116f0 63 6d 70 28 78 2c 22 64 65 73 74 72 75 63 74 6f  cmp(x,"destructo
11700 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
11710 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
11720 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53   WAITING_FOR_DES
11730 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3b 0a  TRUCTOR_SYMBOL;.
11740 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d  .}else if( strcm
11750 70 28 78 2c 22 74 79 70 65 22 29 3d 3d 30 20 29  p(x,"type")==0 )
11760 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
11770 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
11780 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59  _FOR_DATATYPE_SY
11790 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65  MBOL;.        }e
117a0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
117b0 2c 22 66 61 6c 6c 62 61 63 6b 22 29 3d 3d 30 20  ,"fallback")==0 
117c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
117d0 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ->fallback = 0;.
117e0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
117f0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
11800 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3b 0a  OR_FALLBACK_ID;.
11810 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
11820 28 20 73 74 72 63 6d 70 28 78 2c 22 77 69 6c 64  ( strcmp(x,"wild
11830 63 61 72 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20  card")==0 ){.   
11840 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11850 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
11860 57 49 4c 44 43 41 52 44 5f 49 44 3b 0a 20 20 20  WILDCARD_ID;.   
11870 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
11880 74 72 63 6d 70 28 78 2c 22 65 78 70 65 63 74 22  trcmp(x,"expect"
11890 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
118a0 20 20 69 66 20 28 70 73 70 2d 3e 67 70 2d 3e 6e    if (psp->gp->n
118b0 65 78 70 65 63 74 65 64 20 3e 3d 20 30 29 20 7b  expected >= 0) {
118c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 72 72  .            Err
118d0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
118e0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
118f0 6e 65 6e 6f 2c 20 22 4d 75 6c 74 69 70 6c 65 20  neno, "Multiple 
11900 25 65 78 70 65 63 74 20 64 65 63 6c 61 72 61 74  %expect declarat
11910 69 6f 6e 73 2e 22 29 3b 0a 20 20 20 20 20 20 20  ions.");.       
11920 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11930 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
11940 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
11950 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
11960 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
11970 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
11980 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11990 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
119a0 45 58 50 45 43 54 5f 56 41 4c 55 45 3b 0a 20 20  EXPECT_VALUE;.  
119b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
119c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
119d0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
119e0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
119f0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
11a00 20 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e          "Unknown
11a10 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79   declaration key
11a20 77 6f 72 64 3a 20 5c 22 25 25 25 73 5c 22 2e 22  word: \"%%%s\"."
11a30 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ,x);.          p
11a40 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11a50 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
11a60 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
11a70 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a  TER_DECL_ERROR;.
11a80 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .}.      }else{.
11a90 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11aa0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
11ab0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
11ac0 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65  .          "Ille
11ad0 67 61 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  gal declaration 
11ae0 6b 65 79 77 6f 72 64 3a 20 5c 22 25 73 5c 22 2e  keyword: \"%s\".
11af0 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ",x);.        ps
11b00 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
11b10 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11b20 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
11b30 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  _DECL_ERROR;.   
11b40 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
11b50 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
11b60 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f  NG_FOR_DESTRUCTO
11b70 52 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20  R_SYMBOL:.      
11b80 69 66 28 20 21 69 73 61 6c 70 68 61 28 78 5b 30  if( !isalpha(x[0
11b90 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]) ){.        Er
11ba0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
11bb0 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
11bc0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
11bd0 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69   "Symbol name mi
11be0 73 73 69 6e 67 20 61 66 74 65 72 20 25 64 65 73  ssing after %des
11bf0 74 72 75 63 74 6f 72 20 6b 65 79 77 6f 72 64 22  tructor keyword"
11c00 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
11c10 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
11c20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
11c30 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
11c40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
11c50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
11c60 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
11c70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
11c80 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64  ;.        psp->d
11c90 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73 70  eclargslot = &sp
11ca0 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20  ->destructor;.  
11cb0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c        psp->decll
11cc0 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20 26 73 70 2d  inenoslot = &sp-
11cd0 3e 64 65 73 74 4c 69 6e 65 6e 6f 3b 0a 20 20 20  >destLineno;.   
11ce0 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74       psp->insert
11cf0 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20  LineMacro = 1;. 
11d00 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11d10 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
11d20 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20  DECL_ARG;.      
11d30 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
11d40 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
11d50 46 4f 52 5f 45 58 50 45 43 54 5f 56 41 4c 55 45  FOR_EXPECT_VALUE
11d60 3a 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 67  :.        psp->g
11d70 70 2d 3e 6e 65 78 70 65 63 74 65 64 20 3d 20 28  p->nexpected = (
11d80 69 6e 74 29 20 73 74 72 74 6f 6c 28 78 2c 20 26  int) strtol(x, &
11d90 65 6e 64 70 74 72 2c 20 31 30 29 3b 0a 20 20 20  endptr, 10);.   
11da0 20 20 20 20 20 69 66 28 20 28 2a 65 6e 64 70 74       if( (*endpt
11db0 72 20 21 3d 20 27 5c 30 27 29 20 7c 7c 20 28 65  r != '\0') || (e
11dc0 6e 64 70 74 72 20 3d 3d 20 78 29 20 29 20 7b 0a  ndptr == x) ) {.
11dd0 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
11de0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
11df0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
11e00 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  o,.            "
11e10 49 6e 74 65 67 65 72 20 65 78 70 65 63 74 65 64  Integer expected
11e20 20 61 66 74 65 72 20 25 25 65 78 70 65 63 74 20   after %%expect 
11e30 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20 20  keyword");.     
11e40 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11e50 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  nt++;.        } 
11e60 65 6c 73 65 20 69 66 20 28 70 73 70 2d 3e 67 70  else if (psp->gp
11e70 2d 3e 6e 65 78 70 65 63 74 65 64 20 3c 20 30 29  ->nexpected < 0)
11e80 20 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72   {.          Err
11e90 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
11ea0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
11eb0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
11ec0 20 20 22 49 6e 74 65 67 65 72 20 63 61 6e 27 74    "Integer can't
11ed0 20 62 65 20 6e 65 67 61 74 69 76 65 20 61 66 74   be negative aft
11ee0 65 72 20 25 25 65 78 70 65 63 74 20 6b 65 79 77  er %%expect keyw
11ef0 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ord");.         
11f00 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
11f10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11f20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
11f30 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
11f40 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
11f50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
11f60 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44  se WAITING_FOR_D
11f70 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3a 0a  ATATYPE_SYMBOL:.
11f80 20 20 20 20 20 20 69 66 28 20 21 69 73 61 6c 70        if( !isalp
11f90 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ha(x[0]) ){.    
11fa0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
11fb0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
11fc0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
11fd0 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e         "Symbol n
11fe0 61 6d 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65  ame missing afte
11ff0 72 20 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65  r %destructor ke
12000 79 77 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20  yword");.       
12010 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
12020 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
12030 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
12040 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a  TER_DECL_ERROR;.
12050 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12060 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
12070 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f  ol *sp = Symbol_
12080 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
12090 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
120a0 20 3d 20 26 73 70 2d 3e 64 61 74 61 74 79 70 65   = &sp->datatype
120b0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69  ;.        psp->i
120c0 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
120d0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
120e0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
120f0 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20  _FOR_DECL_ARG;. 
12100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
12110 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
12120 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45  TING_FOR_PRECEDE
12130 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20  NCE_SYMBOL:.    
12140 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
12150 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
12160 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
12170 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
12180 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
12190 28 20 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20  ( isupper(x[0]) 
121a0 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
121b0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20  t symbol *sp;.  
121c0 20 20 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f        sp = Symbo
121d0 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
121e0 20 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d    if( sp->prec>=
121f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
12200 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
12210 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
12220 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
12230 20 20 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25 73      "Symbol \"%s
12240 5c 22 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  \" has already b
12250 65 20 67 69 76 65 6e 20 61 20 70 72 65 63 65 64  e given a preced
12260 65 6e 63 65 2e 22 2c 78 29 3b 0a 20 20 20 20 20  ence.",x);.     
12270 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
12280 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20  nt++;..}else{.  
12290 20 20 20 20 20 20 20 20 73 70 2d 3e 70 72 65 63          sp->prec
122a0 20 3d 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e   = psp->preccoun
122b0 74 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ter;.          s
122c0 70 2d 3e 61 73 73 6f 63 20 3d 20 70 73 70 2d 3e  p->assoc = psp->
122d0 64 65 63 6c 61 73 73 6f 63 3b 0a 09 7d 0a 20 20  declassoc;..}.  
122e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
122f0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
12300 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
12310 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
12320 20 20 20 20 20 20 22 43 61 6e 27 74 20 61 73 73        "Can't ass
12330 69 67 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65  ign a precedence
12340 20 74 6f 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b   to \"%s\".",x);
12350 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
12360 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
12370 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
12380 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
12390 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3a 0a 20 20  FOR_DECL_ARG:.  
123a0 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b      if( x[0]=='{
123b0 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27 20  ' || x[0]=='\"' 
123c0 7c 7c 20 69 73 61 6c 6e 75 6d 28 78 5b 30 5d 29  || isalnum(x[0])
123d0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
123e0 74 20 63 68 61 72 20 2a 7a 4f 6c 64 2c 20 2a 7a  t char *zOld, *z
123f0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 63 68 61  New;.        cha
12400 72 20 2a 7a 42 75 66 2c 20 2a 7a 3b 0a 20 20 20  r *zBuf, *z;.   
12410 20 20 20 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 6e       int nOld, n
12420 2c 20 6e 4c 69 6e 65 2c 20 6e 4e 65 77 2c 20 6e  , nLine, nNew, n
12430 42 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e  Back;.        in
12440 74 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 3b 0a  t addLineMacro;.
12450 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 4c 69          char zLi
12460 6e 65 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20  ne[50];.        
12470 7a 4e 65 77 20 3d 20 78 3b 0a 20 20 20 20 20 20  zNew = x;.      
12480 20 20 69 66 28 20 7a 4e 65 77 5b 30 5d 3d 3d 27    if( zNew[0]=='
12490 22 27 20 7c 7c 20 7a 4e 65 77 5b 30 5d 3d 3d 27  "' || zNew[0]=='
124a0 7b 27 20 29 20 7a 4e 65 77 2b 2b 3b 0a 20 20 20  {' ) zNew++;.   
124b0 20 20 20 20 20 6e 4e 65 77 20 3d 20 6c 65 6d 6f       nNew = lemo
124c0 6e 53 74 72 6c 65 6e 28 7a 4e 65 77 29 3b 0a 20  nStrlen(zNew);. 
124d0 20 20 20 20 20 20 20 69 66 28 20 2a 70 73 70 2d         if( *psp-
124e0 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 29 7b 0a  >declargslot ){.
124f0 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20 3d            zOld =
12500 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c   *psp->declargsl
12510 6f 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ot;.        }els
12520 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c  e{.          zOl
12530 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  d = "";.        
12540 7d 0a 20 20 20 20 20 20 20 20 6e 4f 6c 64 20 3d  }.        nOld =
12550 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4f 6c   lemonStrlen(zOl
12560 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20  d);.        n = 
12570 6e 4f 6c 64 20 2b 20 6e 4e 65 77 20 2b 20 32 30  nOld + nNew + 20
12580 3b 0a 20 20 20 20 20 20 20 20 61 64 64 4c 69 6e  ;.        addLin
12590 65 4d 61 63 72 6f 20 3d 20 21 70 73 70 2d 3e 67  eMacro = !psp->g
125a0 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
125b0 20 26 26 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c   && psp->insertL
125c0 69 6e 65 4d 61 63 72 6f 20 26 26 0a 20 20 20 20  ineMacro &&.    
125d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125e0 20 20 20 20 28 70 73 70 2d 3e 64 65 63 6c 6c 69      (psp->declli
125f0 6e 65 6e 6f 73 6c 6f 74 3d 3d 30 20 7c 7c 20 70  nenoslot==0 || p
12600 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
12610 6f 74 5b 30 5d 21 3d 30 29 3b 0a 20 20 20 20 20  ot[0]!=0);.     
12620 20 20 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61     if( addLineMa
12630 63 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  cro ){.         
12640 20 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65   for(z=psp->file
12650 6e 61 6d 65 2c 20 6e 42 61 63 6b 3d 30 3b 20 2a  name, nBack=0; *
12660 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; z++){.       
12670 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c       if( *z=='\\
12680 27 20 29 20 6e 42 61 63 6b 2b 2b 3b 0a 20 20 20  ' ) nBack++;.   
12690 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
126a0 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65     sprintf(zLine
126b0 2c 20 22 23 6c 69 6e 65 20 25 64 20 22 2c 20 70  , "#line %d ", p
126c0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 29  sp->tokenlineno)
126d0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e  ;.          nLin
126e0 65 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  e = lemonStrlen(
126f0 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  zLine);.        
12700 20 20 6e 20 2b 3d 20 6e 4c 69 6e 65 20 2b 20 6c    n += nLine + l
12710 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 73 70 2d 3e  emonStrlen(psp->
12720 66 69 6c 65 6e 61 6d 65 29 20 2b 20 6e 42 61 63  filename) + nBac
12730 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
12740 20 20 20 20 20 2a 70 73 70 2d 3e 64 65 63 6c 61       *psp->decla
12750 72 67 73 6c 6f 74 20 3d 20 28 63 68 61 72 20 2a  rgslot = (char *
12760 29 20 72 65 61 6c 6c 6f 63 28 2a 70 73 70 2d 3e  ) realloc(*psp->
12770 64 65 63 6c 61 72 67 73 6c 6f 74 2c 20 6e 29 3b  declargslot, n);
12780 0a 20 20 20 20 20 20 20 20 7a 42 75 66 20 3d 20  .        zBuf = 
12790 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f  *psp->declargslo
127a0 74 20 2b 20 6e 4f 6c 64 3b 0a 20 20 20 20 20 20  t + nOld;.      
127b0 20 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61 63    if( addLineMac
127c0 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ro ){.          
127d0 69 66 28 20 6e 4f 6c 64 20 26 26 20 7a 42 75 66  if( nOld && zBuf
127e0 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20  [-1]!='\n' ){.  
127f0 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66            *(zBuf
12800 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20  ++) = '\n';.    
12810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12820 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a    memcpy(zBuf, z
12830 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20  Line, nLine);.  
12840 20 20 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20          zBuf += 
12850 6e 4c 69 6e 65 3b 0a 20 20 20 20 20 20 20 20 20  nLine;.         
12860 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22 27   *(zBuf++) = '"'
12870 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
12880 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 3b  z=psp->filename;
12890 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20   *z; z++){.     
128a0 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27         if( *z=='
128b0 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  \\' ){.         
128c0 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
128d0 20 27 5c 5c 27 3b 0a 20 20 20 20 20 20 20 20 20   '\\';.         
128e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
128f0 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 2a 7a 3b   *(zBuf++) = *z;
12900 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
12910 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29         *(zBuf++)
12920 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 20 20   = '"';.        
12930 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c    *(zBuf++) = '\
12940 6e 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n';.        }.  
12950 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 64        if( psp->d
12960 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 26 26  ecllinenoslot &&
12970 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f   psp->decllineno
12980 73 6c 6f 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  slot[0]==0 ){.  
12990 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
129a0 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 20 3d  llinenoslot[0] =
129b0 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
129c0 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  o;.        }.   
129d0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66       memcpy(zBuf
129e0 2c 20 7a 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20  , zNew, nNew);. 
129f0 20 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e         zBuf += n
12a00 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 2a 7a 42  New;.        *zB
12a10 75 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  uf = 0;.        
12a20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
12a30 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
12a40 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  _RULE;.      }el
12a50 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
12a60 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
12a70 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
12a80 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
12a90 49 6c 6c 65 67 61 6c 20 61 72 67 75 6d 65 6e 74  Illegal argument
12aa0 20 74 6f 20 25 25 25 73 3a 20 25 73 22 2c 70 73   to %%%s: %s",ps
12ab0 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 2c 78  p->declkeyword,x
12ac0 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
12ad0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
12ae0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
12af0 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
12b00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
12b10 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
12b20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
12b30 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3a  FOR_FALLBACK_ID:
12b40 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
12b50 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
12b60 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
12b70 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
12b80 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  _RULE;.      }el
12b90 73 65 20 69 66 28 20 21 69 73 75 70 70 65 72 28  se if( !isupper(
12ba0 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
12bb0 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
12bc0 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f  ilename, psp->to
12bd0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
12be0 20 20 20 20 20 22 25 25 66 61 6c 6c 62 61 63 6b       "%%fallback
12bf0 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22   argument \"%s\"
12c00 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b   should be a tok
12c10 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  en", x);.       
12c20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
12c30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12c40 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
12c50 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f  mbol *sp = Symbo
12c60 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
12c70 20 20 69 66 28 20 70 73 70 2d 3e 66 61 6c 6c 62    if( psp->fallb
12c80 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ack==0 ){.      
12c90 20 20 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63      psp->fallbac
12ca0 6b 20 3d 20 73 70 3b 0a 20 20 20 20 20 20 20 20  k = sp;.        
12cb0 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 66 61  }else if( sp->fa
12cc0 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
12cd0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
12ce0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d  ->filename, psp-
12cf0 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
12d00 20 20 20 20 20 20 20 20 20 20 22 4d 6f 72 65 20            "More 
12d10 74 68 61 6e 20 6f 6e 65 20 66 61 6c 6c 62 61 63  than one fallbac
12d20 6b 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 6f  k assigned to to
12d30 6b 65 6e 20 25 73 22 2c 20 78 29 3b 0a 20 20 20  ken %s", x);.   
12d40 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
12d50 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
12d60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12d70 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20   sp->fallback = 
12d80 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3b 0a 20  psp->fallback;. 
12d90 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 67 70           psp->gp
12da0 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 3d  ->has_fallback =
12db0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
12dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
12dd0 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
12de0 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44  ING_FOR_WILDCARD
12df0 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20 78  _ID:.      if( x
12e00 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
12e10 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
12e20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
12e30 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
12e40 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 75 70   }else if( !isup
12e50 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  per(x[0]) ){.   
12e60 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
12e70 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70  p->filename, psp
12e80 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
12e90 20 20 20 20 20 20 20 20 20 22 25 25 77 69 6c 64           "%%wild
12ea0 63 61 72 64 20 61 72 67 75 6d 65 6e 74 20 5c 22  card argument \"
12eb0 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61  %s\" should be a
12ec0 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20   token", x);.   
12ed0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
12ee0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
12ef0 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
12f00 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53  t symbol *sp = S
12f10 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
12f20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 67        if( psp->g
12f30 70 2d 3e 77 69 6c 64 63 61 72 64 3d 3d 30 20 29  p->wildcard==0 )
12f40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
12f50 3e 67 70 2d 3e 77 69 6c 64 63 61 72 64 20 3d 20  >gp->wildcard = 
12f60 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  sp;.        }els
12f70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  e{.          Err
12f80 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
12f90 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ame, psp->tokenl
12fa0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
12fb0 20 20 20 22 45 78 74 72 61 20 77 69 6c 64 63 61     "Extra wildca
12fc0 72 64 20 74 6f 20 74 6f 6b 65 6e 3a 20 25 73 22  rd to token: %s"
12fd0 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , x);.          
12fe0 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
12ff0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13000 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
13010 20 20 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f      case RESYNC_
13020 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
13030 3a 0a 2f 2a 20 20 20 20 20 20 69 66 28 20 78 5b  :./*      if( x[
13040 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73  0]=='.' ) psp->s
13050 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
13060 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
13070 0a 2a 2a 20 20 20 20 20 20 62 72 65 61 6b 3b 20  .**      break; 
13080 2a 2f 0a 20 20 20 20 63 61 73 65 20 52 45 53 59  */.    case RESY
13090 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
130a0 52 4f 52 3a 0a 20 20 20 20 20 20 69 66 28 20 78  ROR:.      if( x
130b0 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e  [0]=='.' ) psp->
130c0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
130d0 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
130e0 3b 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  ;.      if( x[0]
130f0 3d 3d 27 25 27 20 29 20 70 73 70 2d 3e 73 74 61  =='%' ) psp->sta
13100 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
13110 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20  _DECL_KEYWORD;. 
13120 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
13130 7d 0a 0a 2f 2a 20 52 75 6e 20 74 68 65 20 70 72  }../* Run the pr
13140 65 70 72 6f 63 65 73 73 6f 72 20 6f 76 65 72 20  eprocessor over 
13150 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 74  the input file t
13160 65 78 74 2e 20 20 54 68 65 20 67 6c 6f 62 61 6c  ext.  The global
13170 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 61 7a   variables.** az
13180 44 65 66 69 6e 65 5b 30 5d 20 74 68 72 6f 75 67  Define[0] throug
13190 68 20 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69  h azDefine[nDefi
131a0 6e 65 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74  ne-1] contains t
131b0 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  he names of all 
131c0 64 65 66 69 6e 65 64 0a 2a 2a 20 6d 61 63 72 6f  defined.** macro
131d0 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
131e0 20 6c 6f 6f 6b 73 20 66 6f 72 20 22 25 69 66 64   looks for "%ifd
131f0 65 66 22 20 61 6e 64 20 22 25 69 66 6e 64 65 66  ef" and "%ifndef
13200 22 20 61 6e 64 20 22 25 65 6e 64 69 66 22 20 61  " and "%endif" a
13210 6e 64 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73 20 74  nd.** comments t
13220 68 65 6d 20 6f 75 74 2e 20 20 54 65 78 74 20 69  hem out.  Text i
13230 6e 20 62 65 74 77 65 65 6e 20 69 73 20 61 6c 73  n between is als
13240 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 20  o commented out 
13250 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
13260 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
13270 72 65 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28  reprocess_input(
13280 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
13290 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 69 6e  i, j, k, n;.  in
132a0 74 20 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20  t exclude = 0;. 
132b0 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a   int start = 0;.
132c0 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 31    int lineno = 1
132d0 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 5f 6c 69  ;.  int start_li
132e0 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28  neno = 1;.  for(
132f0 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  i=0; z[i]; i++){
13300 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
13310 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n' ) lineno++;.
13320 20 20 20 20 69 66 28 20 7a 5b 69 5d 21 3d 27 25      if( z[i]!='%
13330 27 20 7c 7c 20 28 69 3e 30 20 26 26 20 7a 5b 69  ' || (i>0 && z[i
13340 2d 31 5d 21 3d 27 5c 6e 27 29 20 29 20 63 6f 6e  -1]!='\n') ) con
13350 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
13360 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 65  trncmp(&z[i],"%e
13370 6e 64 69 66 22 2c 36 29 3d 3d 30 20 26 26 20 69  ndif",6)==0 && i
13380 73 73 70 61 63 65 28 7a 5b 69 2b 36 5d 29 20 29  sspace(z[i+6]) )
13390 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78 63 6c  {.      if( excl
133a0 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ude ){.        e
133b0 78 63 6c 75 64 65 2d 2d 3b 0a 20 20 20 20 20 20  xclude--;.      
133c0 20 20 69 66 28 20 65 78 63 6c 75 64 65 3d 3d 30    if( exclude==0
133d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
133e0 72 28 6a 3d 73 74 61 72 74 3b 20 6a 3c 69 3b 20  r(j=start; j<i; 
133f0 6a 2b 2b 29 20 69 66 28 20 7a 5b 6a 5d 21 3d 27  j++) if( z[j]!='
13400 5c 6e 27 20 29 20 7a 5b 6a 5d 20 3d 20 27 20 27  \n' ) z[j] = ' '
13410 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13420 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
13430 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21  i; z[j] && z[j]!
13440 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d  ='\n'; j++) z[j]
13450 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 65 6c 73   = ' ';.    }els
13460 65 20 69 66 28 20 28 73 74 72 6e 63 6d 70 28 26  e if( (strncmp(&
13470 7a 5b 69 5d 2c 22 25 69 66 64 65 66 22 2c 36 29  z[i],"%ifdef",6)
13480 3d 3d 30 20 26 26 20 69 73 73 70 61 63 65 28 7a  ==0 && isspace(z
13490 5b 69 2b 36 5d 29 29 0a 20 20 20 20 20 20 20 20  [i+6])).        
134a0 20 20 7c 7c 20 28 73 74 72 6e 63 6d 70 28 26 7a    || (strncmp(&z
134b0 5b 69 5d 2c 22 25 69 66 6e 64 65 66 22 2c 37 29  [i],"%ifndef",7)
134c0 3d 3d 30 20 26 26 20 69 73 73 70 61 63 65 28 7a  ==0 && isspace(z
134d0 5b 69 2b 37 5d 29 29 20 29 7b 0a 20 20 20 20 20  [i+7])) ){.     
134e0 20 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a   if( exclude ){.
134f0 20 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 2b          exclude+
13500 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
13510 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b          for(j=i+
13520 37 3b 20 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29  7; isspace(z[j])
13530 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  ; j++){}.       
13540 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6a 2b 6e 5d   for(n=0; z[j+n]
13550 20 26 26 20 21 69 73 73 70 61 63 65 28 7a 5b 6a   && !isspace(z[j
13560 2b 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 20  +n]); n++){}.   
13570 20 20 20 20 20 65 78 63 6c 75 64 65 20 3d 20 31       exclude = 1
13580 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d  ;.        for(k=
13590 30 3b 20 6b 3c 6e 44 65 66 69 6e 65 3b 20 6b 2b  0; k<nDefine; k+
135a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
135b0 28 20 73 74 72 6e 63 6d 70 28 61 7a 44 65 66 69  ( strncmp(azDefi
135c0 6e 65 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e 29 3d 3d  ne[k],&z[j],n)==
135d0 30 20 26 26 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  0 && lemonStrlen
135e0 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 29 3d 3d 6e  (azDefine[k])==n
135f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13600 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20 20  exclude = 0;.   
13610 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
13620 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13630 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
13640 28 20 7a 5b 69 2b 33 5d 3d 3d 27 6e 27 20 29 20  ( z[i+3]=='n' ) 
13650 65 78 63 6c 75 64 65 20 3d 20 21 65 78 63 6c 75  exclude = !exclu
13660 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  de;.        if( 
13670 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20  exclude ){.     
13680 20 20 20 20 20 73 74 61 72 74 20 3d 20 69 3b 0a       start = i;.
13690 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 5f            start_
136a0 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b  lineno = lineno;
136b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
136c0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69   }.      for(j=i
136d0 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d  ; z[j] && z[j]!=
136e0 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20  '\n'; j++) z[j] 
136f0 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 7d  = ' ';.    }.  }
13700 0a 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29  .  if( exclude )
13710 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
13720 64 65 72 72 2c 22 75 6e 74 65 72 6d 69 6e 61 74  derr,"unterminat
13730 65 64 20 25 25 69 66 64 65 66 20 73 74 61 72 74  ed %%ifdef start
13740 69 6e 67 20 6f 6e 20 6c 69 6e 65 20 25 64 5c 6e  ing on line %d\n
13750 22 2c 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 29  ", start_lineno)
13760 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
13770 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20 73 70 69 74   }.}../* In spit
13780 65 20 6f 66 20 69 74 73 20 6e 61 6d 65 2c 20 74  e of its name, t
13790 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
137a0 72 65 61 6c 6c 79 20 61 20 73 63 61 6e 6e 65 72  really a scanner
137b0 2e 20 20 49 74 20 72 65 61 64 0a 2a 2a 20 69 6e  .  It read.** in
137c0 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e 70 75   the entire inpu
137d0 74 20 66 69 6c 65 20 28 61 6c 6c 20 61 74 20 6f  t file (all at o
137e0 6e 63 65 29 20 74 68 65 6e 20 74 6f 6b 65 6e 69  nce) then tokeni
137f0 7a 65 73 20 69 74 2e 20 20 45 61 63 68 0a 2a 2a  zes it.  Each.**
13800 20 74 6f 6b 65 6e 20 69 73 20 70 61 73 73 65 64   token is passed
13810 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
13820 20 22 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 22   "parseonetoken"
13830 20 77 68 69 63 68 20 62 75 69 6c 64 73 20 61 6c   which builds al
13840 6c 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72  l.** the appropr
13850 69 61 74 65 20 64 61 74 61 20 73 74 72 75 63 74  iate data struct
13860 75 72 65 73 20 69 6e 20 74 68 65 20 67 6c 6f 62  ures in the glob
13870 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72 20  al state vector 
13880 22 67 70 22 2e 0a 2a 2f 0a 76 6f 69 64 20 50 61  "gp"..*/.void Pa
13890 72 73 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  rse(struct lemon
138a0 20 2a 67 70 29 0a 7b 0a 20 20 73 74 72 75 63 74   *gp).{.  struct
138b0 20 70 73 74 61 74 65 20 70 73 3b 0a 20 20 46 49   pstate ps;.  FI
138c0 4c 45 20 2a 66 70 3b 0a 20 20 63 68 61 72 20 2a  LE *fp;.  char *
138d0 66 69 6c 65 62 75 66 3b 0a 20 20 69 6e 74 20 66  filebuf;.  int f
138e0 69 6c 65 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c  ilesize;.  int l
138f0 69 6e 65 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a  ineno;.  int c;.
13900 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78    char *cp, *nex
13910 74 63 70 3b 0a 20 20 69 6e 74 20 73 74 61 72 74  tcp;.  int start
13920 6c 69 6e 65 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d  line = 0;..  mem
13930 73 65 74 28 26 70 73 2c 20 27 5c 30 27 2c 20 73  set(&ps, '\0', s
13940 69 7a 65 6f 66 28 70 73 29 29 3b 0a 20 20 70 73  izeof(ps));.  ps
13950 2e 67 70 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66  .gp = gp;.  ps.f
13960 69 6c 65 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69  ilename = gp->fi
13970 6c 65 6e 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72  lename;.  ps.err
13980 6f 72 63 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e  orcnt = 0;.  ps.
13990 73 74 61 74 65 20 3d 20 49 4e 49 54 49 41 4c 49  state = INITIALI
139a0 5a 45 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  ZE;..  /* Begin 
139b0 62 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 69  by reading the i
139c0 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66  nput file */.  f
139d0 70 20 3d 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c  p = fopen(ps.fil
139e0 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69  ename,"rb");.  i
139f0 66 28 20 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20  f( fp==0 ){.    
13a00 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65  ErrorMsg(ps.file
13a10 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70  name,0,"Can't op
13a20 65 6e 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72  en this file for
13a30 20 72 65 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20   reading.");.   
13a40 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b   gp->errorcnt++;
13a50 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
13a60 0a 20 20 66 73 65 65 6b 28 66 70 2c 30 2c 32 29  .  fseek(fp,0,2)
13a70 3b 0a 20 20 66 69 6c 65 73 69 7a 65 20 3d 20 66  ;.  filesize = f
13a80 74 65 6c 6c 28 66 70 29 3b 0a 20 20 72 65 77 69  tell(fp);.  rewi
13a90 6e 64 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75  nd(fp);.  filebu
13aa0 66 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c  f = (char *)mall
13ab0 6f 63 28 20 66 69 6c 65 73 69 7a 65 2b 31 20 29  oc( filesize+1 )
13ac0 3b 0a 20 20 69 66 28 20 66 69 6c 65 62 75 66 3d  ;.  if( filebuf=
13ad0 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d  =0 ){.    ErrorM
13ae0 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30  sg(ps.filename,0
13af0 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65  ,"Can't allocate
13b00 20 25 64 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f   %d of memory to
13b10 20 68 6f 6c 64 20 74 68 69 73 20 66 69 6c 65 2e   hold this file.
13b20 22 2c 0a 20 20 20 20 20 20 66 69 6c 65 73 69 7a  ",.      filesiz
13b30 65 2b 31 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72  e+1);.    gp->er
13b40 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65  rorcnt++;.    re
13b50 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
13b60 66 72 65 61 64 28 66 69 6c 65 62 75 66 2c 31 2c  fread(filebuf,1,
13b70 66 69 6c 65 73 69 7a 65 2c 66 70 29 21 3d 66 69  filesize,fp)!=fi
13b80 6c 65 73 69 7a 65 20 29 7b 0a 20 20 20 20 45 72  lesize ){.    Er
13b90 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
13ba0 6d 65 2c 30 2c 22 43 61 6e 27 74 20 72 65 61 64  me,0,"Can't read
13bb0 20 69 6e 20 61 6c 6c 20 25 64 20 62 79 74 65 73   in all %d bytes
13bc0 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 22 2c   of this file.",
13bd0 0a 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65 29  .      filesize)
13be0 3b 0a 20 20 20 20 66 72 65 65 28 66 69 6c 65 62  ;.    free(fileb
13bf0 75 66 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72  uf);.    gp->err
13c00 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  orcnt++;.    ret
13c10 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73  urn;.  }.  fclos
13c20 65 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66  e(fp);.  filebuf
13c30 5b 66 69 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a  [filesize] = 0;.
13c40 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 69 6e  .  /* Make an in
13c50 69 74 69 61 6c 20 70 61 73 73 20 74 68 72 6f 75  itial pass throu
13c60 67 68 20 74 68 65 20 66 69 6c 65 20 74 6f 20 68  gh the file to h
13c70 61 6e 64 6c 65 20 25 69 66 64 65 66 20 61 6e 64  andle %ifdef and
13c80 20 25 69 66 6e 64 65 66 20 2a 2f 0a 20 20 70 72   %ifndef */.  pr
13c90 65 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 66  eprocess_input(f
13ca0 69 6c 65 62 75 66 29 3b 0a 0a 20 20 2f 2a 20 4e  ilebuf);..  /* N
13cb0 6f 77 20 73 63 61 6e 20 74 68 65 20 74 65 78 74  ow scan the text
13cc0 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69   of the input fi
13cd0 6c 65 20 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d  le */.  lineno =
13ce0 20 31 3b 0a 20 20 66 6f 72 28 63 70 3d 66 69 6c   1;.  for(cp=fil
13cf0 65 62 75 66 3b 20 28 63 3d 20 2a 63 70 29 21 3d  ebuf; (c= *cp)!=
13d00 30 3b 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d  0; ){.    if( c=
13d10 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
13d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
13d30 2a 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  * Keep track of 
13d40 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  the line number 
13d50 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 73 70 61  */.    if( isspa
13d60 63 65 28 63 29 20 29 7b 20 63 70 2b 2b 3b 20 63  ce(c) ){ cp++; c
13d70 6f 6e 74 69 6e 75 65 3b 20 7d 20 20 2f 2a 20 53  ontinue; }  /* S
13d80 6b 69 70 20 61 6c 6c 20 77 68 69 74 65 20 73 70  kip all white sp
13d90 61 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 63  ace */.    if( c
13da0 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d  =='/' && cp[1]==
13db0 27 2f 27 20 29 7b 20 20 20 20 20 20 20 20 20 20  '/' ){          
13dc0 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c  /* Skip C++ styl
13dd0 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20  e comments */.  
13de0 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20      cp+=2;.     
13df0 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29   while( (c= *cp)
13e00 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29  !=0 && c!='\n' )
13e10 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e   cp++;.      con
13e20 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
13e30 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63   if( c=='/' && c
13e40 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 20 20  p[1]=='*' ){    
13e50 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 20        /* Skip C 
13e60 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a  style comments *
13e70 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20  /.      cp+=2;. 
13e80 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20       while( (c= 
13e90 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d 27  *cp)!=0 && (c!='
13ea0 2f 27 20 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a  /' || cp[-1]!='*
13eb0 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ') ){.        if
13ec0 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  ( c=='\n' ) line
13ed0 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 70  no++;.        cp
13ee0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
13ef0 20 20 69 66 28 20 63 20 29 20 63 70 2b 2b 3b 0a    if( c ) cp++;.
13f00 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
13f10 20 20 20 20 7d 0a 20 20 20 20 70 73 2e 74 6f 6b      }.    ps.tok
13f20 65 6e 73 74 61 72 74 20 3d 20 63 70 3b 20 20 20  enstart = cp;   
13f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f40 4d 61 72 6b 20 74 68 65 20 62 65 67 69 6e 6e 69  Mark the beginni
13f50 6e 67 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20  ng of the token 
13f60 2a 2f 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 6c  */.    ps.tokenl
13f70 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20  ineno = lineno; 
13f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
13f90 65 6e 75 6d 62 65 72 20 6f 6e 20 77 68 69 63 68  enumber on which
13fa0 20 74 6f 6b 65 6e 20 62 65 67 69 6e 73 20 2a 2f   token begins */
13fb0 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 22 27  .    if( c=='\"'
13fc0 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
13fd0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e          /* Strin
13fe0 67 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20  g literals */.  
13ff0 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20      cp++;.      
14000 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
14010 3d 30 20 26 26 20 63 21 3d 27 5c 22 27 20 29 7b  =0 && c!='\"' ){
14020 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
14030 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
14040 0a 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20  .        cp++;. 
14050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14060 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
14070 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c   ErrorMsg(ps.fil
14080 65 6e 61 6d 65 2c 73 74 61 72 74 6c 69 6e 65 2c  ename,startline,
14090 0a 22 53 74 72 69 6e 67 20 73 74 61 72 74 69 6e  ."String startin
140a0 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69  g on this line i
140b0 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64  s not terminated
140c0 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64 20   before the end 
140d0 6f 66 20 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a  of the file.");.
140e0 20 20 20 20 20 20 20 20 70 73 2e 65 72 72 6f 72          ps.error
140f0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e  cnt++;.        n
14100 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20  extcp = cp;.    
14110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14120 20 6e 65 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a   nextcp = cp+1;.
14130 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
14140 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 7b 20  e if( c=='{' ){ 
14150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14160 20 41 20 62 6c 6f 63 6b 20 6f 66 20 43 20 63 6f   A block of C co
14170 64 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  de */.      int 
14180 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 63 70 2b  level;.      cp+
14190 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6c 65 76  +;.      for(lev
141a0 65 6c 3d 31 3b 20 28 63 3d 20 2a 63 70 29 21 3d  el=1; (c= *cp)!=
141b0 30 20 26 26 20 28 6c 65 76 65 6c 3e 31 20 7c 7c  0 && (level>1 ||
141c0 20 63 21 3d 27 7d 27 29 3b 20 63 70 2b 2b 29 7b   c!='}'); cp++){
141d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
141e0 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
141f0 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
14200 28 20 63 3d 3d 27 7b 27 20 29 20 6c 65 76 65 6c  ( c=='{' ) level
14210 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65  ++;.        else
14220 20 69 66 28 20 63 3d 3d 27 7d 27 20 29 20 6c 65   if( c=='}' ) le
14230 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 65  vel--;.        e
14240 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f 27 20 26  lse if( c=='/' &
14250 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20  & cp[1]=='*' ){ 
14260 20 2f 2a 20 53 6b 69 70 20 63 6f 6d 6d 65 6e 74   /* Skip comment
14270 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  s */.          i
14280 6e 74 20 70 72 65 76 63 3b 0a 20 20 20 20 20 20  nt prevc;.      
14290 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b      cp = &cp[2];
142a0 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63  .          prevc
142b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
142c0 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
142d0 3d 30 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c  =0 && (c!='/' ||
142e0 20 70 72 65 76 63 21 3d 27 2a 27 29 20 29 7b 0a   prevc!='*') ){.
142f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
14300 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f  c=='\n' ) lineno
14310 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
14320 70 72 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20  prevc = c;.     
14330 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 09 20 20         cp++;..  
14340 7d 0a 09 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  }..}else if( c==
14350 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f  '/' && cp[1]=='/
14360 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 43 2b  ' ){  /* Skip C+
14370 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73  + style comments
14380 20 74 6f 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20   too */.        
14390 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20    cp = &cp[2];. 
143a0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
143b0 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63  (c= *cp)!=0 && c
143c0 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20  !='\n' ) cp++;. 
143d0 20 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29           if( c )
143e0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 09 7d 65 6c 73   lineno++;..}els
143f0 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c  e if( c=='\'' ||
14400 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f   c=='\"' ){    /
14410 2a 20 53 74 72 69 6e 67 20 61 20 63 68 61 72 61  * String a chara
14420 63 74 65 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f  cter literals */
14430 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 73  .          int s
14440 74 61 72 74 63 68 61 72 2c 20 70 72 65 76 63 3b  tartchar, prevc;
14450 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74  .          start
14460 63 68 61 72 20 3d 20 63 3b 0a 20 20 20 20 20 20  char = c;.      
14470 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20      prevc = 0;. 
14480 20 20 20 20 20 20 20 20 20 66 6f 72 28 63 70 2b           for(cp+
14490 2b 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  +; (c= *cp)!=0 &
144a0 26 20 28 63 21 3d 73 74 61 72 74 63 68 61 72 20  & (c!=startchar 
144b0 7c 7c 20 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b  || prevc=='\\');
144c0 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   cp++){.        
144d0 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
144e0 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ) lineno++;.    
144f0 20 20 20 20 20 20 20 20 69 66 28 20 70 72 65 76          if( prev
14500 63 3d 3d 27 5c 5c 27 20 29 20 70 72 65 76 63 20  c=='\\' ) prevc 
14510 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
14520 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20   else           
14530 20 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 09 20     prevc = c;.. 
14540 20 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20   }..}.      }.  
14550 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
14560 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
14570 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 70 73 2e  (ps.filename,ps.
14580 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20  tokenlineno,."C 
14590 63 6f 64 65 20 73 74 61 72 74 69 6e 67 20 6f 6e  code starting on
145a0 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f   this line is no
145b0 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66  t terminated bef
145c0 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ore the end of t
145d0 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20  he file.");.    
145e0 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b      ps.errorcnt+
145f0 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63  +;.        nextc
14600 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65  p = cp;.      }e
14610 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  lse{.        nex
14620 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20  tcp = cp+1;.    
14630 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
14640 28 20 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b 20  ( isalnum(c) ){ 
14650 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 65 6e           /* Iden
14660 74 69 66 69 65 72 73 20 2a 2f 0a 20 20 20 20 20  tifiers */.     
14670 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29   while( (c= *cp)
14680 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28  !=0 && (isalnum(
14690 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20  c) || c=='_') ) 
146a0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74  cp++;.      next
146b0 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c  cp = cp;.    }el
146c0 73 65 20 69 66 28 20 63 3d 3d 27 3a 27 20 26 26  se if( c==':' &&
146d0 20 63 70 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 63   cp[1]==':' && c
146e0 70 5b 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20  p[2]=='=' ){ /* 
146f0 54 68 65 20 6f 70 65 72 61 74 6f 72 20 22 3a 3a  The operator "::
14700 3d 22 20 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b  =" */.      cp +
14710 3d 20 33 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  = 3;.      nextc
14720 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73  p = cp;.    }els
14730 65 20 69 66 28 20 28 63 3d 3d 27 2f 27 20 7c 7c  e if( (c=='/' ||
14740 20 63 3d 3d 27 7c 27 29 20 26 26 20 69 73 61 6c   c=='|') && isal
14750 70 68 61 28 63 70 5b 31 5d 29 20 29 7b 0a 20 20  pha(cp[1]) ){.  
14760 20 20 20 20 63 70 20 2b 3d 20 32 3b 0a 20 20 20      cp += 2;.   
14770 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a     while( (c = *
14780 63 70 29 21 3d 30 20 26 26 20 28 69 73 61 6c 6e  cp)!=0 && (isaln
14790 75 6d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29  um(c) || c=='_')
147a0 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e   ) cp++;.      n
147b0 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20  extcp = cp;.    
147c0 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20  }else{          
147d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147e0 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e  /* All other (on
147f0 65 20 63 68 61 72 61 63 74 65 72 29 20 6f 70 65  e character) ope
14800 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  rators */.      
14810 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74  cp++;.      next
14820 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20  cp = cp;.    }. 
14830 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20     c = *cp;.    
14840 2a 63 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *cp = 0;        
14850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14860 2f 2a 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74  /* Null terminat
14870 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20  e the token */. 
14880 20 20 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e     parseonetoken
14890 28 26 70 73 29 3b 20 20 20 20 20 20 20 20 20 20  (&ps);          
148a0 20 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20     /* Parse the 
148b0 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70  token */.    *cp
148c0 20 3d 20 63 3b 20 20 20 20 20 20 20 20 20 20 20   = c;           
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
148e0 52 65 73 74 6f 72 65 20 74 68 65 20 62 75 66 66  Restore the buff
148f0 65 72 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e  er */.    cp = n
14900 65 78 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65  extcp;.  }.  fre
14910 65 28 66 69 6c 65 62 75 66 29 3b 20 20 20 20 20  e(filebuf);     
14920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14930 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 62 75  * Release the bu
14940 66 66 65 72 20 61 66 74 65 72 20 70 61 72 73 69  ffer after parsi
14950 6e 67 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65  ng */.  gp->rule
14960 20 3d 20 70 73 2e 66 69 72 73 74 72 75 6c 65 3b   = ps.firstrule;
14970 0a 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20  .  gp->errorcnt 
14980 3d 20 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d  = ps.errorcnt;.}
14990 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
149a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
149b0 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69  om the file "pli
149c0 6e 6b 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nk.c" **********
149d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
149e0 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63  ** Routines proc
149f0 65 73 73 69 6e 67 20 63 6f 6e 66 69 67 75 72 61  essing configura
14a00 74 69 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20  tion follow-set 
14a10 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
14a20 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f  s.** in the LEMO
14a30 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
14a40 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  or..*/.static st
14a50 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e  ruct plink *plin
14a60 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a  k_freelist = 0;.
14a70 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
14a80 65 77 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75  ew plink */.stru
14a90 63 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f  ct plink *Plink_
14aa0 6e 65 77 28 29 7b 0a 20 20 73 74 72 75 63 74 20  new(){.  struct 
14ab0 70 6c 69 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a  plink *newlink;.
14ac0 0a 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65  .  if( plink_fre
14ad0 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
14ae0 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61  int i;.    int a
14af0 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 70 6c  mt = 100;.    pl
14b00 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 28  ink_freelist = (
14b10 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 63  struct plink *)c
14b20 61 6c 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65  alloc( amt, size
14b30 6f 66 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 29  of(struct plink)
14b40 20 29 3b 0a 20 20 20 20 69 66 28 20 70 6c 69 6e   );.    if( plin
14b50 6b 5f 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b  k_freelist==0 ){
14b60 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
14b70 74 64 65 72 72 2c 0a 20 20 20 20 20 20 22 55 6e  tderr,.      "Un
14b80 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
14b90 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65   memory for a ne
14ba0 77 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f  w follow-set pro
14bb0 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e  pagation link.\n
14bc0 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  ");.      exit(1
14bd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
14be0 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69  (i=0; i<amt-1; i
14bf0 2b 2b 29 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  ++) plink_freeli
14c00 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 70 6c  st[i].next = &pl
14c10 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 2b 31  ink_freelist[i+1
14c20 5d 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65  ];.    plink_fre
14c30 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78  elist[amt-1].nex
14c40 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77  t = 0;.  }.  new
14c50 6c 69 6e 6b 20 3d 20 70 6c 69 6e 6b 5f 66 72 65  link = plink_fre
14c60 65 6c 69 73 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66  elist;.  plink_f
14c70 72 65 65 6c 69 73 74 20 3d 20 70 6c 69 6e 6b 5f  reelist = plink_
14c80 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a  freelist->next;.
14c90 20 20 72 65 74 75 72 6e 20 6e 65 77 6c 69 6e 6b    return newlink
14ca0 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c  ;.}../* Add a pl
14cb0 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c  ink to a plink l
14cc0 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  ist */.void Plin
14cd0 6b 5f 61 64 64 28 73 74 72 75 63 74 20 70 6c 69  k_add(struct pli
14ce0 6e 6b 20 2a 2a 70 6c 70 70 2c 20 73 74 72 75 63  nk **plpp, struc
14cf0 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b  t config *cfp).{
14d00 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
14d10 2a 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c  *newlink;.  newl
14d20 69 6e 6b 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77 28  ink = Plink_new(
14d30 29 3b 0a 20 20 6e 65 77 6c 69 6e 6b 2d 3e 6e 65  );.  newlink->ne
14d40 78 74 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70  xt = *plpp;.  *p
14d50 6c 70 70 20 3d 20 6e 65 77 6c 69 6e 6b 3b 0a 20  lpp = newlink;. 
14d60 20 6e 65 77 6c 69 6e 6b 2d 3e 63 66 70 20 3d 20   newlink->cfp = 
14d70 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73  cfp;.}../* Trans
14d80 66 65 72 20 65 76 65 72 79 20 70 6c 69 6e 6b 20  fer every plink 
14d90 6f 6e 20 74 68 65 20 6c 69 73 74 20 22 66 72 6f  on the list "fro
14da0 6d 22 20 74 6f 20 74 68 65 20 6c 69 73 74 20 22  m" to the list "
14db0 74 6f 22 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  to" */.void Plin
14dc0 6b 5f 63 6f 70 79 28 73 74 72 75 63 74 20 70 6c  k_copy(struct pl
14dd0 69 6e 6b 20 2a 2a 74 6f 2c 20 73 74 72 75 63 74  ink **to, struct
14de0 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d 29 0a 7b 0a   plink *from).{.
14df0 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
14e00 6e 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28  nextpl;.  while(
14e10 20 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78   from ){.    nex
14e20 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74  tpl = from->next
14e30 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74  ;.    from->next
14e40 20 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20   = *to;.    *to 
14e50 3d 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d  = from;.    from
14e60 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d   = nextpl;.  }.}
14e70 0a 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72  ../* Delete ever
14e80 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c  y plink on the l
14e90 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  ist */.void Plin
14ea0 6b 5f 64 65 6c 65 74 65 28 73 74 72 75 63 74 20  k_delete(struct 
14eb0 70 6c 69 6e 6b 20 2a 70 6c 70 29 0a 7b 0a 20 20  plink *plp).{.  
14ec0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
14ed0 78 74 70 6c 3b 0a 0a 20 20 77 68 69 6c 65 28 20  xtpl;..  while( 
14ee0 70 6c 70 20 29 7b 0a 20 20 20 20 6e 65 78 74 70  plp ){.    nextp
14ef0 6c 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20  l = plp->next;. 
14f00 20 20 20 70 6c 70 2d 3e 6e 65 78 74 20 3d 20 70     plp->next = p
14f10 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20  link_freelist;. 
14f20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73     plink_freelis
14f30 74 20 3d 20 70 6c 70 3b 0a 20 20 20 20 70 6c 70  t = plp;.    plp
14f40 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d   = nextpl;.  }.}
14f50 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
14f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
14f70 68 65 20 66 69 6c 65 20 22 72 65 70 6f 72 74 2e  he file "report.
14f80 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
14f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
14fa0 2a 0a 2a 2a 20 50 72 6f 63 65 64 75 72 65 73 20  *.** Procedures 
14fb0 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 72  for generating r
14fc0 65 70 6f 72 74 73 20 61 6e 64 20 74 61 62 6c 65  eports and table
14fd0 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  s in the LEMON p
14fe0 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
14ff0 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  .*/../* Generate
15000 20 61 20 66 69 6c 65 6e 61 6d 65 20 77 69 74 68   a filename with
15010 20 74 68 65 20 67 69 76 65 6e 20 73 75 66 66 69   the given suffi
15020 78 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  x.  Space to hol
15030 64 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f  d the.** name co
15040 6d 65 73 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  mes from malloc(
15050 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
15060 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
15070 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
15080 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61 72 20  */.PRIVATE char 
15090 2a 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 73  *file_makename(s
150a0 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
150b0 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  p, const char *s
150c0 75 66 66 69 78 29 0a 7b 0a 20 20 63 68 61 72 20  uffix).{.  char 
150d0 2a 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63  *name;.  char *c
150e0 70 3b 0a 0a 20 20 6e 61 6d 65 20 3d 20 28 63 68  p;..  name = (ch
150f0 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f  ar*)malloc( lemo
15100 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69  nStrlen(lemp->fi
15110 6c 65 6e 61 6d 65 29 20 2b 20 6c 65 6d 6f 6e 53  lename) + lemonS
15120 74 72 6c 65 6e 28 73 75 66 66 69 78 29 20 2b 20  trlen(suffix) + 
15130 35 20 29 3b 0a 20 20 69 66 28 20 6e 61 6d 65 3d  5 );.  if( name=
15140 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
15150 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
15160 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
15170 6f 72 20 61 20 66 69 6c 65 6e 61 6d 65 2e 5c 6e  or a filename.\n
15180 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
15190 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 6e 61  .  }.  strcpy(na
151a0 6d 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  me,lemp->filenam
151b0 65 29 3b 0a 20 20 63 70 20 3d 20 73 74 72 72 63  e);.  cp = strrc
151c0 68 72 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20  hr(name,'.');.  
151d0 69 66 28 20 63 70 20 29 20 2a 63 70 20 3d 20 30  if( cp ) *cp = 0
151e0 3b 0a 20 20 73 74 72 63 61 74 28 6e 61 6d 65 2c  ;.  strcat(name,
151f0 73 75 66 66 69 78 29 3b 0a 20 20 72 65 74 75 72  suffix);.  retur
15200 6e 20 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 20 4f 70  n name;.}../* Op
15210 65 6e 20 61 20 66 69 6c 65 20 77 69 74 68 20 61  en a file with a
15220 20 6e 61 6d 65 20 62 61 73 65 64 20 6f 6e 20 74   name based on t
15230 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
15240 6e 70 75 74 20 66 69 6c 65 2c 0a 2a 2a 20 62 75  nput file,.** bu
15250 74 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  t with a differe
15260 6e 74 20 28 73 70 65 63 69 66 69 65 64 29 20 73  nt (specified) s
15270 75 66 66 69 78 2c 20 61 6e 64 20 72 65 74 75 72  uffix, and retur
15280 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
15290 6f 20 74 68 65 20 73 74 72 65 61 6d 20 2a 2f 0a  o the stream */.
152a0 50 52 49 56 41 54 45 20 46 49 4c 45 20 2a 66 69  PRIVATE FILE *fi
152b0 6c 65 5f 6f 70 65 6e 28 0a 20 20 73 74 72 75 63  le_open(.  struc
152c0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20  t lemon *lemp,. 
152d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 66   const char *suf
152e0 66 69 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  fix,.  const cha
152f0 72 20 2a 6d 6f 64 65 0a 29 7b 0a 20 20 46 49 4c  r *mode.){.  FIL
15300 45 20 2a 66 70 3b 0a 0a 20 20 69 66 28 20 6c 65  E *fp;..  if( le
15310 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 29 20 66 72  mp->outname ) fr
15320 65 65 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  ee(lemp->outname
15330 29 3b 0a 20 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61  );.  lemp->outna
15340 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61  me = file_makena
15350 6d 65 28 6c 65 6d 70 2c 20 73 75 66 66 69 78 29  me(lemp, suffix)
15360 3b 0a 20 20 66 70 20 3d 20 66 6f 70 65 6e 28 6c  ;.  fp = fopen(l
15370 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 2c 6d 6f 64  emp->outname,mod
15380 65 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20  e);.  if( fp==0 
15390 26 26 20 2a 6d 6f 64 65 3d 3d 27 77 27 20 29 7b  && *mode=='w' ){
153a0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
153b0 65 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20  err,"Can't open 
153c0 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c  file \"%s\".\n",
153d0 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a  lemp->outname);.
153e0 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
153f0 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
15400 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64   0;.  }..  /* Ad
15410 64 20 66 69 6c 65 73 20 77 65 20 63 72 65 61 74  d files we creat
15420 65 20 74 6f 20 61 20 6c 69 73 74 2c 20 73 6f 20  e to a list, so 
15430 77 65 20 63 61 6e 20 64 65 6c 65 74 65 20 74 68  we can delete th
15440 65 6d 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  em if we fail. T
15450 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 6f 20 6b  his.  ** is to k
15460 65 65 70 20 6d 61 6b 65 66 69 6c 65 73 20 66 72  eep makefiles fr
15470 6f 6d 20 67 65 74 74 69 6e 67 20 63 6f 6e 66 75  om getting confu
15480 73 65 64 2e 20 57 65 20 64 6f 6e 27 74 20 69 6e  sed. We don't in
15490 63 6c 75 64 65 20 2e 6f 75 74 20 66 69 6c 65 73  clude .out files
154a0 2c 0a 20 20 2a 2a 20 74 68 6f 75 67 68 3a 20 74  ,.  ** though: t
154b0 68 69 73 20 69 73 20 64 65 62 75 67 20 69 6e 66  his is debug inf
154c0 6f 72 6d 61 74 69 6f 6e 2c 20 61 6e 64 20 79 6f  ormation, and yo
154d0 75 20 64 6f 6e 27 74 20 77 61 6e 74 20 69 74 20  u don't want it 
154e0 64 65 6c 65 74 65 64 20 69 66 20 74 68 65 72 65  deleted if there
154f0 0a 20 20 2a 2a 20 77 61 73 20 61 6e 20 65 72 72  .  ** was an err
15500 6f 72 20 79 6f 75 20 6e 65 65 64 20 74 6f 20 74  or you need to t
15510 72 61 63 6b 20 64 6f 77 6e 2e 0a 20 20 2a 2f 0a  rack down..  */.
15520 20 20 69 66 28 28 20 2a 6d 6f 64 65 3d 3d 27 77    if(( *mode=='w
15530 27 20 29 20 26 26 20 28 73 74 72 63 6d 70 28 73  ' ) && (strcmp(s
15540 75 66 66 69 78 2c 20 22 2e 6f 75 74 22 29 20 21  uffix, ".out") !
15550 3d 20 30 29 29 7b 0a 20 20 20 20 63 6f 6e 73 74  = 0)){.    const
15560 20 63 68 61 72 20 2a 2a 70 74 72 20 3d 20 28 63   char **ptr = (c
15570 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 0a 20 20  onst char **).  
15580 20 20 20 20 20 20 72 65 61 6c 6c 6f 63 28 6d 61        realloc(ma
15590 64 65 5f 66 69 6c 65 73 2c 20 73 69 7a 65 6f 66  de_files, sizeof
155a0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29   (const char **)
155b0 20 2a 20 28 6d 61 64 65 5f 66 69 6c 65 73 5f 63   * (made_files_c
155c0 6f 75 6e 74 20 2b 20 31 29 29 3b 0a 20 20 20 20  ount + 1));.    
155d0 63 68 61 72 20 2a 66 6e 61 6d 65 20 3d 20 73 74  char *fname = st
155e0 72 64 75 70 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61  rdup(lemp->outna
155f0 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 28 70 74  me);.    if ((pt
15600 72 20 3d 3d 20 4e 55 4c 4c 29 20 7c 7c 20 28 66  r == NULL) || (f
15610 6e 61 6d 65 20 3d 3d 20 4e 55 4c 4c 29 29 20 7b  name == NULL)) {
15620 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 70 74  .        free(pt
15630 72 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  r);.        free
15640 28 66 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  (fname);.       
15650 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b   memory_error();
15660 0a 20 20 20 20 7d 0a 20 20 20 20 6d 61 64 65 5f  .    }.    made_
15670 66 69 6c 65 73 20 3d 20 70 74 72 3b 0a 20 20 20  files = ptr;.   
15680 20 6d 61 64 65 5f 66 69 6c 65 73 5b 6d 61 64 65   made_files[made
15690 5f 66 69 6c 65 73 5f 63 6f 75 6e 74 2b 2b 5d 20  _files_count++] 
156a0 3d 20 66 6e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  = fname;.  }.  r
156b0 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f 2a 20  eturn fp;.}../* 
156c0 44 75 70 6c 69 63 61 74 65 20 74 68 65 20 69 6e  Duplicate the in
156d0 70 75 74 20 66 69 6c 65 20 77 69 74 68 6f 75 74  put file without
156e0 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64 20 77 69   comments and wi
156f0 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 20 0a 2a  thout actions .*
15700 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f 0a 76 6f  * on rules */.vo
15710 69 64 20 52 65 70 72 69 6e 74 28 73 74 72 75 63  id Reprint(struc
15720 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
15730 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
15740 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  rp;.  struct sym
15750 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69  bol *sp;.  int i
15760 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20 6c 65 6e  , j, maxlen, len
15770 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73 6b 69 70  , ncolumns, skip
15780 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f 2f 20 52  ;.  printf("// R
15790 65 70 72 69 6e 74 20 6f 66 20 69 6e 70 75 74 20  eprint of input 
157a0 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 2f 2f  file \"%s\".\n//
157b0 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c 65 6d   Symbols:\n",lem
157c0 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
157d0 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a 20 20 66  maxlen = 10;.  f
157e0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
157f0 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
15800 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79     sp = lemp->sy
15810 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 6c 65  mbols[i];.    le
15820 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  n = lemonStrlen(
15830 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69  sp->name);.    i
15840 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29 20  f( len>maxlen ) 
15850 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20  maxlen = len;.  
15860 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 37  }.  ncolumns = 7
15870 36 2f 28 6d 61 78 6c 65 6e 2b 35 29 3b 0a 20 20  6/(maxlen+5);.  
15880 69 66 28 20 6e 63 6f 6c 75 6d 6e 73 3c 31 20 29  if( ncolumns<1 )
15890 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20   ncolumns = 1;. 
158a0 20 73 6b 69 70 20 3d 20 28 6c 65 6d 70 2d 3e 6e   skip = (lemp->n
158b0 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f 6c 75 6d 6e  symbol + ncolumn
158c0 73 20 2d 20 31 29 2f 6e 63 6f 6c 75 6d 6e 73 3b  s - 1)/ncolumns;
158d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 6b  .  for(i=0; i<sk
158e0 69 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 72  ip; i++){.    pr
158f0 69 6e 74 66 28 22 2f 2f 22 29 3b 0a 20 20 20 20  intf("//");.    
15900 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c 65 6d 70 2d  for(j=i; j<lemp-
15910 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 3d 73 6b 69  >nsymbol; j+=ski
15920 70 29 7b 0a 20 20 20 20 20 20 73 70 20 3d 20 6c  p){.      sp = l
15930 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b  emp->symbols[j];
15940 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
15950 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20 29 3b 0a 20  p->index==j );. 
15960 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 33       printf(" %3
15970 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d 61 78 6c  d %-*.*s",j,maxl
15980 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70 2d 3e 6e 61  en,maxlen,sp->na
15990 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
159a0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
159b0 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
159c0 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
159d0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 70 72 69 6e  >next){.    prin
159e0 74 66 28 22 25 73 22 2c 72 70 2d 3e 6c 68 73 2d  tf("%s",rp->lhs-
159f0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a 20 20  >name);.    /*  
15a00 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69    if( rp->lhsali
15a10 61 73 20 29 20 70 72 69 6e 74 66 28 22 28 25 73  as ) printf("(%s
15a20 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29  )",rp->lhsalias)
15a30 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28  ; */.    printf(
15a40 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20 66 6f 72  " ::=");.    for
15a50 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
15a60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 70  ; i++){.      sp
15a70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
15a80 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 73       printf(" %s
15a90 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ", sp->name);.  
15aa0 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
15ab0 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
15ac0 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  ){.        for(j
15ad0 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79  =1; j<sp->nsubsy
15ae0 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; j++){.       
15af0 20 20 20 70 72 69 6e 74 66 28 22 7c 25 73 22 2c     printf("|%s",
15b00 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e   sp->subsym[j]->
15b10 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  name);.        }
15b20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
15b30 2a 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69  * if( rp->rhsali
15b40 61 73 5b 69 5d 20 29 20 70 72 69 6e 74 66 28 22  as[i] ) printf("
15b50 28 25 73 29 22 2c 72 70 2d 3e 72 68 73 61 6c 69  (%s)",rp->rhsali
15b60 61 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20 20 20 7d  as[i]); */.    }
15b70 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2e 22 29  .    printf(".")
15b80 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72  ;.    if( rp->pr
15b90 65 63 73 79 6d 20 29 20 70 72 69 6e 74 66 28 22  ecsym ) printf("
15ba0 20 5b 25 73 5d 22 2c 72 70 2d 3e 70 72 65 63 73   [%s]",rp->precs
15bb0 79 6d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f  ym->name);.    /
15bc0 2a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29  * if( rp->code )
15bd0 20 70 72 69 6e 74 66 28 22 5c 6e 20 20 20 20 25   printf("\n    %
15be0 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 20 2a 2f  s",rp->code); */
15bf0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22  .    printf("\n"
15c00 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 43  );.  }.}..void C
15c10 6f 6e 66 69 67 50 72 69 6e 74 28 46 49 4c 45 20  onfigPrint(FILE 
15c20 2a 66 70 2c 20 73 74 72 75 63 74 20 63 6f 6e 66  *fp, struct conf
15c30 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20 73 74 72  ig *cfp).{.  str
15c40 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
15c50 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
15c60 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  p;.  int i, j;. 
15c70 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20   rp = cfp->rp;. 
15c80 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 73 20   fprintf(fp,"%s 
15c90 3a 3a 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61  ::=",rp->lhs->na
15ca0 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  me);.  for(i=0; 
15cb0 69 3c 3d 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b  i<=rp->nrhs; i++
15cc0 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 63 66  ){.    if( i==cf
15cd0 70 2d 3e 64 6f 74 20 29 20 66 70 72 69 6e 74 66  p->dot ) fprintf
15ce0 28 66 70 2c 22 20 2a 22 29 3b 0a 20 20 20 20 69  (fp," *");.    i
15cf0 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29  f( i==rp->nrhs )
15d00 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 70 20 3d   break;.    sp =
15d10 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
15d20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73   fprintf(fp," %s
15d30 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ", sp->name);.  
15d40 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
15d50 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
15d60 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  .      for(j=1; 
15d70 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a  j<sp->nsubsym; j
15d80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
15d90 69 6e 74 66 28 66 70 2c 22 7c 25 73 22 2c 73 70  intf(fp,"|%s",sp
15da0 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d  ->subsym[j]->nam
15db0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
15dc0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 23 64 65 66  }.  }.}../* #def
15dd0 69 6e 65 20 54 45 53 54 20 2a 2f 0a 23 69 66 20  ine TEST */.#if 
15de0 30 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 65 74  0./* Print a set
15df0 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64   */.PRIVATE void
15e00 20 53 65 74 50 72 69 6e 74 28 6f 75 74 2c 73 65   SetPrint(out,se
15e10 74 2c 6c 65 6d 70 29 0a 46 49 4c 45 20 2a 6f 75  t,lemp).FILE *ou
15e20 74 3b 0a 63 68 61 72 20 2a 73 65 74 3b 0a 73 74  t;.char *set;.st
15e30 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
15e40 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  ;.{.  int i;.  c
15e50 68 61 72 20 2a 73 70 61 63 65 72 3b 0a 20 20 73  har *spacer;.  s
15e60 70 61 63 65 72 20 3d 20 22 22 3b 0a 20 20 66 70  pacer = "";.  fp
15e70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 5b  rintf(out,"%12s[
15e80 22 2c 22 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ","");.  for(i=0
15e90 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; i<lemp->ntermi
15ea0 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nal; i++){.    i
15eb0 66 28 20 53 65 74 46 69 6e 64 28 73 65 74 2c 69  f( SetFind(set,i
15ec0 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ) ){.      fprin
15ed0 74 66 28 6f 75 74 2c 22 25 73 25 73 22 2c 73 70  tf(out,"%s%s",sp
15ee0 61 63 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  acer,lemp->symbo
15ef0 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ls[i]->name);.  
15f00 20 20 20 20 73 70 61 63 65 72 20 3d 20 22 20 22      spacer = " "
15f10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
15f20 72 69 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e 22 29  rintf(out,"]\n")
15f30 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20  ;.}../* Print a 
15f40 70 6c 69 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a 50  plink chain */.P
15f50 52 49 56 41 54 45 20 76 6f 69 64 20 50 6c 69 6e  RIVATE void Plin
15f60 6b 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2c 74  kPrint(out,plp,t
15f70 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73  ag).FILE *out;.s
15f80 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70  truct plink *plp
15f90 3b 0a 63 68 61 72 20 2a 74 61 67 3b 0a 7b 0a 20  ;.char *tag;.{. 
15fa0 20 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20   while( plp ){. 
15fb0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
15fc0 25 31 32 73 25 73 20 28 73 74 61 74 65 20 25 32  %12s%s (state %2
15fd0 64 29 20 22 2c 22 22 2c 74 61 67 2c 70 6c 70 2d  d) ","",tag,plp-
15fe0 3e 63 66 70 2d 3e 73 74 70 2d 3e 73 74 61 74 65  >cfp->stp->state
15ff0 6e 75 6d 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67  num);.    Config
16000 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e 63  Print(out,plp->c
16010 66 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  fp);.    fprintf
16020 28 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  (out,"\n");.    
16030 70 6c 70 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b  plp = plp->next;
16040 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
16050 2a 20 50 72 69 6e 74 20 61 6e 20 61 63 74 69 6f  * Print an actio
16060 6e 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  n to the given f
16070 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
16080 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
16090 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 77 61 73 20  .** nothing was 
160a0 61 63 74 75 61 6c 6c 79 20 70 72 69 6e 74 65 64  actually printed
160b0 2e 0a 2a 2f 0a 69 6e 74 20 50 72 69 6e 74 41 63  ..*/.int PrintAc
160c0 74 69 6f 6e 28 73 74 72 75 63 74 20 61 63 74 69  tion(struct acti
160d0 6f 6e 20 2a 61 70 2c 20 46 49 4c 45 20 2a 66 70  on *ap, FILE *fp
160e0 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20  , int indent){. 
160f0 20 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 31 3b   int result = 1;
16100 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74  .  switch( ap->t
16110 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
16120 53 48 49 46 54 3a 0a 20 20 20 20 20 20 66 70 72  SHIFT:.      fpr
16130 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69  intf(fp,"%*s shi
16140 66 74 20 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61  ft  %d",indent,a
16150 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e  p->sp->name,ap->
16160 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29  x.stp->statenum)
16170 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16180 20 20 20 63 61 73 65 20 52 45 44 55 43 45 3a 0a     case REDUCE:.
16190 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
161a0 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25 64 22  ,"%*s reduce %d"
161b0 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e  ,indent,ap->sp->
161c0 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69  name,ap->x.rp->i
161d0 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  ndex);.      bre
161e0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 43 43  ak;.    case ACC
161f0 45 50 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e  EPT:.      fprin
16200 74 66 28 66 70 2c 22 25 2a 73 20 61 63 63 65 70  tf(fp,"%*s accep
16210 74 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70  t",indent,ap->sp
16220 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  ->name);.      b
16230 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45  reak;.    case E
16240 52 52 4f 52 3a 0a 20 20 20 20 20 20 66 70 72 69  RROR:.      fpri
16250 6e 74 66 28 66 70 2c 22 25 2a 73 20 65 72 72 6f  ntf(fp,"%*s erro
16260 72 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70  r",indent,ap->sp
16270 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  ->name);.      b
16280 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
16290 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 63  RCONFLICT:.    c
162a0 61 73 65 20 52 52 43 4f 4e 46 4c 49 43 54 3a 0a  ase RRCONFLICT:.
162b0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
162c0 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25 2d 33  ,"%*s reduce %-3
162d0 64 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e  d ** Parsing con
162e0 66 6c 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20  flict **",.     
162f0 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70     indent,ap->sp
16300 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d  ->name,ap->x.rp-
16310 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62  >index);.      b
16320 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
16330 53 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20  SCONFLICT:.     
16340 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
16350 20 73 68 69 66 74 20 20 25 64 20 2a 2a 20 50 61   shift  %d ** Pa
16360 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a  rsing conflict *
16370 2a 22 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 64  *", .        ind
16380 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
16390 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74  ,ap->x.stp->stat
163a0 65 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  enum);.      bre
163b0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f  ak;.    case SH_
163c0 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61  RESOLVED:.    ca
163d0 73 65 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a  se RD_RESOLVED:.
163e0 20 20 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45      case NOT_USE
163f0 44 3a 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20  D:.      result 
16400 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
16410 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
16420 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e  esult;.}../* Gen
16430 65 72 61 74 65 20 74 68 65 20 22 79 2e 6f 75 74  erate the "y.out
16440 70 75 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f  put" log file */
16450 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70  .void ReportOutp
16460 75 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  ut(struct lemon 
16470 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69  *lemp).{.  int i
16480 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
16490 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
164a0 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73  config *cfp;.  s
164b0 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
164c0 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20  ;.  FILE *fp;.. 
164d0 20 66 70 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28   fp = file_open(
164e0 6c 65 6d 70 2c 22 2e 6f 75 74 22 2c 22 77 62 22  lemp,".out","wb"
164f0 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 29  );.  if( fp==0 )
16500 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
16510 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
16520 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
16530 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
16540 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  [i];.    fprintf
16550 28 66 70 2c 22 53 74 61 74 65 20 25 64 3a 5c 6e  (fp,"State %d:\n
16560 22 2c 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29  ",stp->statenum)
16570 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e  ;.    if( lemp->
16580 62 61 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d  basisflag ) cfp=
16590 73 74 70 2d 3e 62 70 3b 0a 20 20 20 20 65 6c 73  stp->bp;.    els
165a0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
165b0 20 20 20 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b     cfp=stp->cfp;
165c0 0a 20 20 20 20 77 68 69 6c 65 28 20 63 66 70 20  .    while( cfp 
165d0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 62 75  ){.      char bu
165e0 66 5b 32 30 5d 3b 0a 20 20 20 20 20 20 69 66 28  f[20];.      if(
165f0 20 63 66 70 2d 3e 64 6f 74 3d 3d 63 66 70 2d 3e   cfp->dot==cfp->
16600 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20  rp->nrhs ){.    
16610 20 20 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c      sprintf(buf,
16620 22 28 25 64 29 22 2c 63 66 70 2d 3e 72 70 2d 3e  "(%d)",cfp->rp->
16630 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20  index);.        
16640 66 70 72 69 6e 74 66 28 66 70 2c 22 20 20 20 20  fprintf(fp,"    
16650 25 35 73 20 22 2c 62 75 66 29 3b 0a 20 20 20 20  %5s ",buf);.    
16660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16670 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 20 20   fprintf(fp,"   
16680 20 20 20 20 20 20 20 22 29 3b 0a 20 20 20 20 20         ");.     
16690 20 7d 0a 20 20 20 20 20 20 43 6f 6e 66 69 67 50   }.      ConfigP
166a0 72 69 6e 74 28 66 70 2c 63 66 70 29 3b 0a 20 20  rint(fp,cfp);.  
166b0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
166c0 5c 6e 22 29 3b 0a 23 69 66 20 30 0a 20 20 20 20  \n");.#if 0.    
166d0 20 20 53 65 74 50 72 69 6e 74 28 66 70 2c 63 66    SetPrint(fp,cf
166e0 70 2d 3e 66 77 73 2c 6c 65 6d 70 29 3b 0a 20 20  p->fws,lemp);.  
166f0 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66      PlinkPrint(f
16700 70 2c 63 66 70 2d 3e 66 70 6c 70 2c 22 54 6f 20  p,cfp->fplp,"To 
16710 20 22 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b   ");.      Plink
16720 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 62 70  Print(fp,cfp->bp
16730 6c 70 2c 22 46 72 6f 6d 22 29 3b 0a 23 65 6e 64  lp,"From");.#end
16740 69 66 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6d  if.      if( lem
16750 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29 20 63  p->basisflag ) c
16760 66 70 3d 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20  fp=cfp->bp;.    
16770 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
16780 20 20 20 20 20 20 20 20 63 66 70 3d 63 66 70 2d          cfp=cfp-
16790 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  >next;.    }.   
167a0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22   fprintf(fp,"\n"
167b0 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74  );.    for(ap=st
167c0 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
167d0 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
167e0 66 28 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 61  f( PrintAction(a
167f0 70 2c 66 70 2c 33 30 29 20 29 20 66 70 72 69 6e  p,fp,30) ) fprin
16800 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20  tf(fp,"\n");.   
16810 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66   }.    fprintf(f
16820 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66  p,"\n");.  }.  f
16830 70 72 69 6e 74 66 28 66 70 2c 20 22 2d 2d 2d 2d  printf(fp, "----
16840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16870 5c 6e 22 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  \n");.  fprintf(
16880 66 70 2c 20 22 53 79 6d 62 6f 6c 73 3a 5c 6e 22  fp, "Symbols:\n"
16890 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
168a0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
168b0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  ++){.    int j;.
168c0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
168d0 6c 20 2a 73 70 3b 0a 0a 20 20 20 20 73 70 20 3d  l *sp;..    sp =
168e0 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
168f0 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66  ];.    fprintf(f
16900 70 2c 20 22 20 20 25 33 64 3a 20 25 73 22 2c 20  p, "  %3d: %s", 
16910 69 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  i, sp->name);.  
16920 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
16930 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  NONTERMINAL ){. 
16940 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
16950 20 22 3a 22 29 3b 0a 20 20 20 20 20 20 69 66 28   ":");.      if(
16960 20 73 70 2d 3e 6c 61 6d 62 64 61 20 29 7b 0a 20   sp->lambda ){. 
16970 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
16980 70 2c 20 22 20 3c 6c 61 6d 62 64 61 3e 22 29 3b  p, " <lambda>");
16990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
169a0 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e  or(j=0; j<lemp->
169b0 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b  nterminal; j++){
169c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d  .        if( sp-
169d0 3e 66 69 72 73 74 73 65 74 20 26 26 20 53 65 74  >firstset && Set
169e0 46 69 6e 64 28 73 70 2d 3e 66 69 72 73 74 73 65  Find(sp->firstse
169f0 74 2c 20 6a 29 20 29 7b 0a 20 20 20 20 20 20 20  t, j) ){.       
16a00 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22     fprintf(fp, "
16a10 20 25 73 22 2c 20 6c 65 6d 70 2d 3e 73 79 6d 62   %s", lemp->symb
16a20 6f 6c 73 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  ols[j]->name);. 
16a30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16a40 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
16a50 74 66 28 66 70 2c 20 22 5c 6e 22 29 3b 0a 20 20  tf(fp, "\n");.  
16a60 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a  }.  fclose(fp);.
16a70 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
16a80 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 66  Search for the f
16a90 69 6c 65 20 22 6e 61 6d 65 22 20 77 68 69 63 68  ile "name" which
16aa0 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20   is in the same 
16ab0 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20  directory as.** 
16ac0 74 68 65 20 65 78 61 63 75 74 61 62 6c 65 20 2a  the exacutable *
16ad0 2f 0a 50 52 49 56 41 54 45 20 63 68 61 72 20 2a  /.PRIVATE char *
16ae0 70 61 74 68 73 65 61 72 63 68 28 63 68 61 72 20  pathsearch(char 
16af0 2a 61 72 67 76 30 2c 20 63 68 61 72 20 2a 6e 61  *argv0, char *na
16b00 6d 65 2c 20 69 6e 74 20 6d 6f 64 65 6d 61 73 6b  me, int modemask
16b10 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ).{.  const char
16b20 20 2a 70 61 74 68 6c 69 73 74 3b 0a 20 20 63 68   *pathlist;.  ch
16b30 61 72 20 2a 70 61 74 68 62 75 66 70 74 72 3b 0a  ar *pathbufptr;.
16b40 20 20 63 68 61 72 20 2a 70 61 74 68 62 75 66 3b    char *pathbuf;
16b50 0a 20 20 63 68 61 72 20 2a 70 61 74 68 2c 2a 63  .  char *path,*c
16b60 70 3b 0a 20 20 63 68 61 72 20 63 3b 0a 0a 23 69  p;.  char c;..#i
16b70 66 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20  fdef __WIN32__. 
16b80 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 61 72   cp = strrchr(ar
16b90 67 76 30 2c 27 5c 5c 27 29 3b 0a 23 65 6c 73 65  gv0,'\\');.#else
16ba0 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72 28  .  cp = strrchr(
16bb0 61 72 67 76 30 2c 27 2f 27 29 3b 0a 23 65 6e 64  argv0,'/');.#end
16bc0 69 66 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20  if.  if( cp ){. 
16bd0 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20     c = *cp;.    
16be0 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 70 61 74  *cp = 0;.    pat
16bf0 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c  h = (char *)mall
16c00 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
16c10 61 72 67 76 30 29 20 2b 20 6c 65 6d 6f 6e 53 74  argv0) + lemonSt
16c20 72 6c 65 6e 28 6e 61 6d 65 29 20 2b 20 32 20 29  rlen(name) + 2 )
16c30 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68 20 29  ;.    if( path )
16c40 20 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25   sprintf(path,"%
16c50 73 2f 25 73 22 2c 61 72 67 76 30 2c 6e 61 6d 65  s/%s",argv0,name
16c60 29 3b 0a 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a  );.    *cp = c;.
16c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 61 74    }else{.    pat
16c80 68 6c 69 73 74 20 3d 20 67 65 74 65 6e 76 28 22  hlist = getenv("
16c90 50 41 54 48 22 29 3b 0a 20 20 20 20 69 66 28 20  PATH");.    if( 
16ca0 70 61 74 68 6c 69 73 74 3d 3d 30 20 29 20 70 61  pathlist==0 ) pa
16cb0 74 68 6c 69 73 74 20 3d 20 22 2e 3a 2f 62 69 6e  thlist = ".:/bin
16cc0 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20 20 20 20  :/usr/bin";.    
16cd0 70 61 74 68 62 75 66 20 3d 20 28 63 68 61 72 20  pathbuf = (char 
16ce0 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e  *) malloc( lemon
16cf0 53 74 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29  Strlen(pathlist)
16d00 20 2b 20 31 20 29 3b 0a 20 20 20 20 70 61 74 68   + 1 );.    path
16d10 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f   = (char *)mallo
16d20 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70  c( lemonStrlen(p
16d30 61 74 68 6c 69 73 74 29 2b 6c 65 6d 6f 6e 53 74  athlist)+lemonSt
16d40 72 6c 65 6e 28 6e 61 6d 65 29 2b 32 20 29 3b 0a  rlen(name)+2 );.
16d50 20 20 20 20 69 66 28 20 28 70 61 74 68 62 75 66      if( (pathbuf
16d60 20 21 3d 20 30 29 20 26 26 20 28 70 61 74 68 21   != 0) && (path!
16d70 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 70 61 74  =0) ){.      pat
16d80 68 62 75 66 70 74 72 20 3d 20 70 61 74 68 62 75  hbufptr = pathbu
16d90 66 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28  f;.      strcpy(
16da0 70 61 74 68 62 75 66 2c 20 70 61 74 68 6c 69 73  pathbuf, pathlis
16db0 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
16dc0 20 2a 70 61 74 68 62 75 66 20 29 7b 0a 20 20 20   *pathbuf ){.   
16dd0 20 20 20 20 20 63 70 20 3d 20 73 74 72 63 68 72       cp = strchr
16de0 28 70 61 74 68 62 75 66 2c 27 3a 27 29 3b 0a 20  (pathbuf,':');. 
16df0 20 20 20 20 20 20 20 69 66 28 20 63 70 3d 3d 30         if( cp==0
16e00 20 29 20 63 70 20 3d 20 26 70 61 74 68 62 75 66   ) cp = &pathbuf
16e10 5b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74  [lemonStrlen(pat
16e20 68 62 75 66 29 5d 3b 0a 20 20 20 20 20 20 20 20  hbuf)];.        
16e30 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20 20  c = *cp;.       
16e40 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 20 20   *cp = 0;.      
16e50 20 20 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22    sprintf(path,"
16e60 25 73 2f 25 73 22 2c 70 61 74 68 62 75 66 2c 6e  %s/%s",pathbuf,n
16e70 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 63  ame);.        *c
16e80 70 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 69  p = c;.        i
16e90 66 28 20 63 3d 3d 30 20 29 20 70 61 74 68 62 75  f( c==0 ) pathbu
16ea0 66 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  f[0] = 0;.      
16eb0 20 20 65 6c 73 65 20 70 61 74 68 62 75 66 20 3d    else pathbuf =
16ec0 20 26 63 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20   &cp[1];.       
16ed0 20 69 66 28 20 61 63 63 65 73 73 28 70 61 74 68   if( access(path
16ee0 2c 6d 6f 64 65 6d 61 73 6b 29 3d 3d 30 20 29 20  ,modemask)==0 ) 
16ef0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
16f00 20 20 20 20 20 66 72 65 65 28 70 61 74 68 62 75       free(pathbu
16f10 66 70 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  fptr);.    }.  }
16f20 0a 20 20 72 65 74 75 72 6e 20 70 61 74 68 3b 0a  .  return path;.
16f30 7d 0a 0a 2f 2a 20 47 69 76 65 6e 20 61 6e 20 61  }../* Given an a
16f40 63 74 69 6f 6e 2c 20 63 6f 6d 70 75 74 65 20 74  ction, compute t
16f50 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
16f60 20 66 6f 72 20 74 68 61 74 20 61 63 74 69 6f 6e   for that action
16f70 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 74 6f 20  .** which is to 
16f80 62 65 20 70 75 74 20 69 6e 20 74 68 65 20 61 63  be put in the ac
16f90 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68  tion table of th
16fa0 65 20 67 65 6e 65 72 61 74 65 64 20 6d 61 63 68  e generated mach
16fb0 69 6e 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ine..** Return n
16fc0 65 67 61 74 69 76 65 20 69 66 20 6e 6f 20 61 63  egative if no ac
16fd0 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 67  tion should be g
16fe0 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 50 52 49  enerated..*/.PRI
16ff0 56 41 54 45 20 69 6e 74 20 63 6f 6d 70 75 74 65  VATE int compute
17000 5f 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 6c  _action(struct l
17010 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75  emon *lemp, stru
17020 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 29 0a 7b  ct action *ap).{
17030 0a 20 20 69 6e 74 20 61 63 74 3b 0a 20 20 73 77  .  int act;.  sw
17040 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29  itch( ap->type )
17050 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49 46 54  {.    case SHIFT
17060 3a 20 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 73  :  act = ap->x.s
17070 74 70 2d 3e 73 74 61 74 65 6e 75 6d 3b 20 20 20  tp->statenum;   
17080 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
17090 20 20 20 20 63 61 73 65 20 52 45 44 55 43 45 3a      case REDUCE:
170a0 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 72 70 2d   act = ap->x.rp-
170b0 3e 69 6e 64 65 78 20 2b 20 6c 65 6d 70 2d 3e 6e  >index + lemp->n
170c0 73 74 61 74 65 3b 20 62 72 65 61 6b 3b 0a 20 20  state; break;.  
170d0 20 20 63 61 73 65 20 45 52 52 4f 52 3a 20 20 61    case ERROR:  a
170e0 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  ct = lemp->nstat
170f0 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b  e + lemp->nrule;
17100 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17110 63 61 73 65 20 41 43 43 45 50 54 3a 20 61 63 74  case ACCEPT: act
17120 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20   = lemp->nstate 
17130 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20  + lemp->nrule + 
17140 31 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  1; break;.    de
17150 66 61 75 6c 74 3a 20 20 20 20 20 61 63 74 20 3d  fault:     act =
17160 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   -1; break;.  }.
17170 20 20 72 65 74 75 72 6e 20 61 63 74 3b 0a 7d 0a    return act;.}.
17180 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 53 49 5a  .#define LINESIZ
17190 45 20 31 30 30 30 0a 2f 2a 20 54 68 65 20 6e 65  E 1000./* The ne
171a0 78 74 20 63 6c 75 73 74 65 72 20 6f 66 20 72 6f  xt cluster of ro
171b0 75 74 69 6e 65 73 20 61 72 65 20 66 6f 72 20 72  utines are for r
171c0 65 61 64 69 6e 67 20 74 68 65 20 74 65 6d 70 6c  eading the templ
171d0 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  ate file.** and 
171e0 77 72 69 74 69 6e 67 20 74 68 65 20 72 65 73 75  writing the resu
171f0 6c 74 73 20 74 6f 20 74 68 65 20 67 65 6e 65 72  lts to the gener
17200 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a 2f  ated parser */./
17210 2a 20 54 68 65 20 66 69 72 73 74 20 66 75 6e 63  * The first func
17220 74 69 6f 6e 20 74 72 61 6e 73 66 65 72 73 20 64  tion transfers d
17230 61 74 61 20 66 72 6f 6d 20 22 69 6e 22 20 74 6f  ata from "in" to
17240 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a 2a 2a 20   "out" until.** 
17250 61 20 6c 69 6e 65 20 69 73 20 73 65 65 6e 20 77  a line is seen w
17260 68 69 63 68 20 62 65 67 69 6e 73 20 77 69 74 68  hich begins with
17270 20 22 25 25 22 2e 20 20 54 68 65 20 6c 69 6e 65   "%%".  The line
17280 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 74 72   number is.** tr
17290 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20  acked..**.** if 
172a0 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e 20 61 6e  name!=0, then an
172b0 79 20 77 6f 72 64 20 74 68 61 74 20 62 65 67 69  y word that begi
172c0 6e 20 77 69 74 68 20 22 50 61 72 73 65 22 20 69  n with "Parse" i
172d0 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 2a 2a 20  s changed to.** 
172e0 62 65 67 69 6e 20 77 69 74 68 20 2a 6e 61 6d 65  begin with *name
172f0 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50 52 49   instead..*/.PRI
17300 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 78  VATE void tplt_x
17310 66 65 72 28 63 68 61 72 20 2a 6e 61 6d 65 2c 20  fer(char *name, 
17320 46 49 4c 45 20 2a 69 6e 2c 20 46 49 4c 45 20 2a  FILE *in, FILE *
17330 6f 75 74 2c 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f  out, int *lineno
17340 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 69 53 74  ).{.  int i, iSt
17350 61 72 74 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65  art;.  char line
17360 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 77 68  [LINESIZE];.  wh
17370 69 6c 65 28 20 66 67 65 74 73 28 6c 69 6e 65 2c  ile( fgets(line,
17380 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 20 26 26 20  LINESIZE,in) && 
17390 28 6c 69 6e 65 5b 30 5d 21 3d 27 25 27 20 7c 7c  (line[0]!='%' ||
173a0 20 6c 69 6e 65 5b 31 5d 21 3d 27 25 27 29 20 29   line[1]!='%') )
173b0 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b  {.    (*lineno)+
173c0 2b 3b 0a 20 20 20 20 69 53 74 61 72 74 20 3d 20  +;.    iStart = 
173d0 30 3b 0a 20 20 20 20 69 66 28 20 6e 61 6d 65 20  0;.    if( name 
173e0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
173f0 3b 20 6c 69 6e 65 5b 69 5d 3b 20 69 2b 2b 29 7b  ; line[i]; i++){
17400 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 69 6e  .        if( lin
17410 65 5b 69 5d 3d 3d 27 50 27 20 26 26 20 73 74 72  e[i]=='P' && str
17420 6e 63 6d 70 28 26 6c 69 6e 65 5b 69 5d 2c 22 50  ncmp(&line[i],"P
17430 61 72 73 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20  arse",5)==0.    
17440 20 20 20 20 20 20 26 26 20 28 69 3d 3d 30 20 7c        && (i==0 |
17450 7c 20 21 69 73 61 6c 70 68 61 28 6c 69 6e 65 5b  | !isalpha(line[
17460 69 2d 31 5d 29 29 0a 20 20 20 20 20 20 20 20 29  i-1])).        )
17470 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
17480 69 3e 69 53 74 61 72 74 20 29 20 66 70 72 69 6e  i>iStart ) fprin
17490 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2d  tf(out,"%.*s",i-
174a0 69 53 74 61 72 74 2c 26 6c 69 6e 65 5b 69 53 74  iStart,&line[iSt
174b0 61 72 74 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  art]);.         
174c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73   fprintf(out,"%s
174d0 22 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ",name);.       
174e0 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20     i += 4;.     
174f0 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 2b       iStart = i+
17500 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
17510 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
17520 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c  printf(out,"%s",
17530 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a  &line[iStart]);.
17540 20 20 7d 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6e 65    }.}../* The ne
17550 78 74 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  xt function find
17560 73 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66  s the template f
17570 69 6c 65 20 61 6e 64 20 6f 70 65 6e 73 20 69 74  ile and opens it
17580 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61  , returning.** a
17590 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
175a0 6f 70 65 6e 65 64 20 66 69 6c 65 2e 20 2a 2f 0a  opened file. */.
175b0 50 52 49 56 41 54 45 20 46 49 4c 45 20 2a 74 70  PRIVATE FILE *tp
175c0 6c 74 5f 6f 70 65 6e 28 73 74 72 75 63 74 20 6c  lt_open(struct l
175d0 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
175e0 73 74 61 74 69 63 20 63 68 61 72 20 74 65 6d 70  static char temp
175f0 6c 61 74 65 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65  latename[] = "le
17600 6d 70 61 72 2e 63 22 3b 0a 20 20 63 68 61 72 20  mpar.c";.  char 
17610 62 75 66 5b 31 30 30 30 5d 3b 0a 20 20 46 49 4c  buf[1000];.  FIL
17620 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 74  E *in;.  char *t
17630 70 6c 74 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20  pltname;.  char 
17640 2a 63 70 3b 0a 0a 20 20 2f 2a 20 66 69 72 73 74  *cp;..  /* first
17650 2c 20 73 65 65 20 69 66 20 75 73 65 72 20 73 70  , see if user sp
17660 65 63 69 66 69 65 64 20 61 20 74 65 6d 70 6c 61  ecified a templa
17670 74 65 20 66 69 6c 65 6e 61 6d 65 20 6f 6e 20 74  te filename on t
17680 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e  he command line.
17690 20 2a 2f 0a 20 20 69 66 20 28 75 73 65 72 5f 74   */.  if (user_t
176a0 65 6d 70 6c 61 74 65 6e 61 6d 65 20 21 3d 20 30  emplatename != 0
176b0 29 20 7b 0a 20 20 20 20 69 66 28 20 61 63 63 65  ) {.    if( acce
176c0 73 73 28 75 73 65 72 5f 74 65 6d 70 6c 61 74 65  ss(user_template
176d0 6e 61 6d 65 2c 30 30 34 29 3d 3d 2d 31 20 29 7b  name,004)==-1 ){
176e0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
176f0 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69 6e  tderr,"Can't fin
17700 64 20 74 68 65 20 70 61 72 73 65 72 20 64 72 69  d the parser dri
17710 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  ver template fil
17720 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20  e \"%s\".\n",.  
17730 20 20 20 20 20 20 75 73 65 72 5f 74 65 6d 70 6c        user_templ
17740 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  atename);.      
17750 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
17760 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
17770 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d  ;.    }.    in =
17780 20 66 6f 70 65 6e 28 75 73 65 72 5f 74 65 6d 70   fopen(user_temp
17790 6c 61 74 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a  latename,"rb");.
177a0 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b      if( in==0 ){
177b0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
177c0 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f 70 65  tderr,"Can't ope
177d0 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66  n the template f
177e0 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 75  ile \"%s\".\n",u
177f0 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65  ser_templatename
17800 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65  );.      lemp->e
17810 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
17820 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
17830 0a 20 20 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a  .    return in;.
17840 20 20 7d 0a 0a 20 20 63 70 20 3d 20 73 74 72 72    }..  cp = strr
17850 63 68 72 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  chr(lemp->filena
17860 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63  me,'.');.  if( c
17870 70 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  p ){.    sprintf
17880 28 62 75 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28  (buf,"%.*s.lt",(
17890 69 6e 74 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69  int)(cp-lemp->fi
178a0 6c 65 6e 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69  lename),lemp->fi
178b0 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  lename);.  }else
178c0 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 62 75  {.    sprintf(bu
178d0 66 2c 22 25 73 2e 6c 74 22 2c 6c 65 6d 70 2d 3e  f,"%s.lt",lemp->
178e0 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  filename);.  }. 
178f0 20 69 66 28 20 61 63 63 65 73 73 28 62 75 66 2c   if( access(buf,
17900 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74  004)==0 ){.    t
17910 70 6c 74 6e 61 6d 65 20 3d 20 62 75 66 3b 0a 20  pltname = buf;. 
17920 20 7d 65 6c 73 65 20 69 66 28 20 61 63 63 65 73   }else if( acces
17930 73 28 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30  s(templatename,0
17940 30 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70  04)==0 ){.    tp
17950 6c 74 6e 61 6d 65 20 3d 20 74 65 6d 70 6c 61 74  ltname = templat
17960 65 6e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ename;.  }else{.
17970 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 70      tpltname = p
17980 61 74 68 73 65 61 72 63 68 28 6c 65 6d 70 2d 3e  athsearch(lemp->
17990 61 72 67 76 30 2c 74 65 6d 70 6c 61 74 65 6e 61  argv0,templatena
179a0 6d 65 2c 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  me,0);.  }.  if(
179b0 20 74 70 6c 74 6e 61 6d 65 3d 3d 30 20 29 7b 0a   tpltname==0 ){.
179c0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
179d0 72 72 2c 22 43 61 6e 27 74 20 66 69 6e 64 20 74  rr,"Can't find t
179e0 68 65 20 70 61 72 73 65 72 20 64 72 69 76 65 72  he parser driver
179f0 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c   template file \
17a00 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 74  "%s\".\n",.    t
17a10 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20  emplatename);.  
17a20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
17a30 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ++;.    return 0
17a40 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70  ;.  }.  in = fop
17a50 65 6e 28 74 70 6c 74 6e 61 6d 65 2c 22 72 62 22  en(tpltname,"rb"
17a60 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  );.  if( in==0 )
17a70 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
17a80 64 65 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e  derr,"Can't open
17a90 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69   the template fi
17aa0 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 74 65  le \"%s\".\n",te
17ab0 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20  mplatename);.   
17ac0 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
17ad0 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  +;.    return 0;
17ae0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e  .  }.  return in
17af0 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20  ;.}../* Print a 
17b00 23 6c 69 6e 65 20 64 69 72 65 63 74 69 76 65 20  #line directive 
17b10 6c 69 6e 65 20 74 6f 20 74 68 65 20 6f 75 74 70  line to the outp
17b20 75 74 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56  ut file. */.PRIV
17b30 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 6c 69  ATE void tplt_li
17b40 6e 65 64 69 72 28 46 49 4c 45 20 2a 6f 75 74 2c  nedir(FILE *out,
17b50 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 68 61   int lineno, cha
17b60 72 20 2a 66 69 6c 65 6e 61 6d 65 29 0a 7b 0a 20  r *filename).{. 
17b70 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 6c   fprintf(out,"#l
17b80 69 6e 65 20 25 64 20 5c 22 22 2c 6c 69 6e 65 6e  ine %d \"",linen
17b90 6f 29 3b 0a 20 20 77 68 69 6c 65 28 20 2a 66 69  o);.  while( *fi
17ba0 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69 66  lename ){.    if
17bb0 28 20 2a 66 69 6c 65 6e 61 6d 65 20 3d 3d 20 27  ( *filename == '
17bc0 5c 5c 27 20 29 20 70 75 74 63 28 27 5c 5c 27 2c  \\' ) putc('\\',
17bd0 6f 75 74 29 3b 0a 20 20 20 20 70 75 74 63 28 2a  out);.    putc(*
17be0 66 69 6c 65 6e 61 6d 65 2c 6f 75 74 29 3b 0a 20  filename,out);. 
17bf0 20 20 20 66 69 6c 65 6e 61 6d 65 2b 2b 3b 0a 20     filename++;. 
17c00 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
17c10 2c 22 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20  ,"\"\n");.}../* 
17c20 50 72 69 6e 74 20 61 20 73 74 72 69 6e 67 20 74  Print a string t
17c30 6f 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 6b  o the file and k
17c40 65 65 70 20 74 68 65 20 6c 69 6e 65 6e 75 6d 62  eep the linenumb
17c50 65 72 20 75 70 20 74 6f 20 64 61 74 65 20 2a 2f  er up to date */
17c60 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 70  .PRIVATE void tp
17c70 6c 74 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a 6f  lt_print(FILE *o
17c80 75 74 2c 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ut, struct lemon
17c90 20 2a 6c 65 6d 70 2c 20 63 68 61 72 20 2a 73 74   *lemp, char *st
17ca0 72 2c 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 29 0a  r, int *lineno).
17cb0 7b 0a 20 20 69 66 28 20 73 74 72 3d 3d 30 20 29  {.  if( str==0 )
17cc0 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65   return;.  while
17cd0 28 20 2a 73 74 72 20 29 7b 0a 20 20 20 20 70 75  ( *str ){.    pu
17ce0 74 63 28 2a 73 74 72 2c 6f 75 74 29 3b 0a 20 20  tc(*str,out);.  
17cf0 20 20 69 66 28 20 2a 73 74 72 3d 3d 27 5c 6e 27    if( *str=='\n'
17d00 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a   ) (*lineno)++;.
17d10 20 20 20 20 73 74 72 2b 2b 3b 0a 20 20 7d 0a 20      str++;.  }. 
17d20 20 69 66 28 20 73 74 72 5b 2d 31 5d 21 3d 27 5c   if( str[-1]!='\
17d30 6e 27 20 29 7b 0a 20 20 20 20 70 75 74 63 28 27  n' ){.    putc('
17d40 5c 6e 27 2c 6f 75 74 29 3b 0a 20 20 20 20 28 2a  \n',out);.    (*
17d50 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 7d 0a 20  lineno)++;.  }. 
17d60 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69   if (!lemp->noli
17d70 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 0a 20 20 20  nenosflag) {.   
17d80 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70   (*lineno)++; tp
17d90 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a  lt_linedir(out,*
17da0 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74  lineno,lemp->out
17db0 6e 61 6d 65 29 3b 20 0a 20 20 7d 0a 20 20 72 65  name); .  }.  re
17dc0 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
17dd0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
17de0 74 69 6e 65 20 65 6d 69 74 73 20 63 6f 64 65 20  tine emits code 
17df0 66 6f 72 20 74 68 65 20 64 65 73 74 72 75 63 74  for the destruct
17e00 6f 72 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 79  or for the.** sy
17e10 6d 62 6f 6c 20 73 70 0a 2a 2f 0a 76 6f 69 64 20  mbol sp.*/.void 
17e20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  emit_destructor_
17e30 63 6f 64 65 28 0a 20 20 46 49 4c 45 20 2a 6f 75  code(.  FILE *ou
17e40 74 2c 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  t,.  struct symb
17e50 6f 6c 20 2a 73 70 2c 0a 20 20 73 74 72 75 63 74  ol *sp,.  struct
17e60 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20   lemon *lemp,.  
17e70 69 6e 74 20 2a 6c 69 6e 65 6e 6f 0a 29 7b 0a 20  int *lineno.){. 
17e80 63 68 61 72 20 2a 63 70 20 3d 20 30 3b 0a 0a 20  char *cp = 0;.. 
17e90 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45  if( sp->type==TE
17ea0 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 63 70 20  RMINAL ){.   cp 
17eb0 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73  = lemp->tokendes
17ec0 74 3b 0a 20 20 20 69 66 28 20 63 70 3d 3d 30 20  t;.   if( cp==0 
17ed0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 66 70 72  ) return;.   fpr
17ee0 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b  intf(out,"{\n");
17ef0 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d   (*lineno)++;. }
17f00 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 64 65 73  else if( sp->des
17f10 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 63 70  tructor ){.   cp
17f20 20 3d 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f   = sp->destructo
17f30 72 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75  r;.   fprintf(ou
17f40 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65  t,"{\n"); (*line
17f50 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 20 28 21 6c  no)++;.   if (!l
17f60 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c  emp->nolinenosfl
17f70 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  ag) { (*lineno)+
17f80 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28  +; tplt_linedir(
17f90 6f 75 74 2c 73 70 2d 3e 64 65 73 74 4c 69 6e 65  out,sp->destLine
17fa0 6e 6f 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  no,lemp->filenam
17fb0 65 29 3b 20 7d 0a 20 7d 65 6c 73 65 20 69 66 28  e); }. }else if(
17fc0 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29   lemp->vardest )
17fd0 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e  {.   cp = lemp->
17fe0 76 61 72 64 65 73 74 3b 0a 20 20 20 69 66 28 20  vardest;.   if( 
17ff0 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  cp==0 ) return;.
18000 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
18010 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29  {\n"); (*lineno)
18020 2b 2b 3b 0a 20 7d 65 6c 73 65 7b 0a 20 20 20 61  ++;. }else{.   a
18030 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20  ssert( 0 );  /* 
18040 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20 2a 2f  Cannot happen */
18050 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a 63 70 3b 20  . }. for(; *cp; 
18060 63 70 2b 2b 29 7b 0a 20 20 20 69 66 28 20 2a 63  cp++){.   if( *c
18070 70 3d 3d 27 24 27 20 26 26 20 63 70 5b 31 5d 3d  p=='$' && cp[1]=
18080 3d 27 24 27 20 29 7b 0a 20 20 20 20 20 66 70 72  ='$' ){.     fpr
18090 69 6e 74 66 28 6f 75 74 2c 22 28 79 79 70 6d 69  intf(out,"(yypmi
180a0 6e 6f 72 2d 3e 79 79 25 64 29 22 2c 73 70 2d 3e  nor->yy%d)",sp->
180b0 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 63 70 2b  dtnum);.     cp+
180c0 2b 3b 0a 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  +;.     continue
180d0 3b 0a 20 20 20 7d 0a 20 20 20 69 66 28 20 2a 63  ;.   }.   if( *c
180e0 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65  p=='\n' ) (*line
180f0 6e 6f 29 2b 2b 3b 0a 20 20 20 66 70 75 74 63 28  no)++;.   fputc(
18100 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20 66 70  *cp,out);. }. fp
18110 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b  rintf(out,"\n");
18120 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 69   (*lineno)++;. i
18130 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65  f (!lemp->noline
18140 6e 6f 73 66 6c 61 67 29 20 7b 20 0a 20 20 20 28  nosflag) { .   (
18150 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74  *lineno)++; tplt
18160 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69  _linedir(out,*li
18170 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  neno,lemp->outna
18180 6d 65 29 3b 20 0a 20 7d 0a 20 66 70 72 69 6e 74  me); . }. fprint
18190 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a  f(out,"}\n"); (*
181a0 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 72 65 74 75  lineno)++;. retu
181b0 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rn;.}../*.** Ret
181c0 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65  urn TRUE (non-ze
181d0 72 6f 29 20 69 66 20 74 68 65 20 67 69 76 65 6e  ro) if the given
181e0 20 73 79 6d 62 6f 6c 20 68 61 73 20 61 20 64 65   symbol has a de
181f0 73 74 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69 6e 74  structor..*/.int
18200 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28   has_destructor(
18210 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
18220 70 2c 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p, struct lemon 
18230 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 72  *lemp).{.  int r
18240 65 74 3b 0a 20 20 69 66 28 20 73 70 2d 3e 74 79  et;.  if( sp->ty
18250 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  pe==TERMINAL ){.
18260 20 20 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e      ret = lemp->
18270 74 6f 6b 65 6e 64 65 73 74 21 3d 30 3b 0a 20 20  tokendest!=0;.  
18280 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 20 3d  }else{.    ret =
18290 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 21 3d   lemp->vardest!=
182a0 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63  0 || sp->destruc
182b0 74 6f 72 21 3d 30 3b 0a 20 20 7d 0a 20 20 72 65  tor!=0;.  }.  re
182c0 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
182d0 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74 20 74  ** Append text t
182e0 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  o a dynamically 
182f0 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69 6e 67  allocated string
18300 2e 20 20 49 66 20 7a 54 65 78 74 20 69 73 20 30  .  If zText is 0
18310 20 74 68 65 6e 0a 2a 2a 20 72 65 73 65 74 20 74   then.** reset t
18320 68 65 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20  he string to be 
18330 65 6d 70 74 79 20 61 67 61 69 6e 2e 20 20 41 6c  empty again.  Al
18340 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20  ways return the 
18350 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 0a 2a 2a  complete text.**
18360 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 28   of the string (
18370 77 68 69 63 68 20 69 73 20 6f 76 65 72 77 72 69  which is overwri
18380 74 74 65 6e 20 77 69 74 68 20 65 61 63 68 20 63  tten with each c
18390 61 6c 6c 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62 79  all)..**.** n by
183a0 74 65 73 20 6f 66 20 7a 54 65 78 74 20 61 72 65  tes of zText are
183b0 20 73 74 6f 72 65 64 2e 20 20 49 66 20 6e 3d 3d   stored.  If n==
183c0 30 20 74 68 65 6e 20 61 6c 6c 20 6f 66 20 7a 54  0 then all of zT
183d0 65 78 74 20 75 70 20 74 6f 20 74 68 65 20 66 69  ext up to the fi
183e0 72 73 74 0a 2a 2a 20 5c 30 30 30 20 74 65 72 6d  rst.** \000 term
183f0 69 6e 61 74 6f 72 20 69 73 20 73 74 6f 72 65 64  inator is stored
18400 2e 20 20 7a 54 65 78 74 20 63 61 6e 20 63 6f 6e  .  zText can con
18410 74 61 69 6e 20 75 70 20 74 6f 20 74 77 6f 20 69  tain up to two i
18420 6e 73 74 61 6e 63 65 73 20 6f 66 0a 2a 2a 20 25  nstances of.** %
18430 64 2e 20 20 54 68 65 20 76 61 6c 75 65 73 20 6f  d.  The values o
18440 66 20 70 31 20 61 6e 64 20 70 32 20 61 72 65 20  f p1 and p2 are 
18450 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
18460 20 66 69 72 73 74 20 61 6e 64 20 73 65 63 6f 6e   first and secon
18470 64 0a 2a 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a 20 49  d.** %d..**.** I
18480 66 20 6e 3d 3d 2d 31 2c 20 74 68 65 6e 20 74 68  f n==-1, then th
18490 65 20 70 72 65 76 69 6f 75 73 20 63 68 61 72 61  e previous chara
184a0 63 74 65 72 20 69 73 20 6f 76 65 72 77 72 69 74  cter is overwrit
184b0 74 65 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ten..*/.PRIVATE 
184c0 63 68 61 72 20 2a 61 70 70 65 6e 64 5f 73 74 72  char *append_str
184d0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
184e0 78 74 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 70  xt, int n, int p
184f0 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 73 74  1, int p2){.  st
18500 61 74 69 63 20 63 68 61 72 20 65 6d 70 74 79 5b  atic char empty[
18510 31 5d 20 3d 20 7b 20 30 20 7d 3b 0a 20 20 73 74  1] = { 0 };.  st
18520 61 74 69 63 20 63 68 61 72 20 2a 7a 20 3d 20 30  atic char *z = 0
18530 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  ;.  static int a
18540 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 73 74  lloced = 0;.  st
18550 61 74 69 63 20 69 6e 74 20 75 73 65 64 20 3d 20  atic int used = 
18560 30 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68  0;.  int c;.  ch
18570 61 72 20 7a 49 6e 74 5b 34 30 5d 3b 0a 20 20 69  ar zInt[40];.  i
18580 66 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20  f( zText==0 ){. 
18590 20 20 20 75 73 65 64 20 3d 20 30 3b 0a 20 20 20     used = 0;.   
185a0 20 72 65 74 75 72 6e 20 7a 3b 0a 20 20 7d 0a 20   return z;.  }. 
185b0 20 69 66 28 20 6e 3c 3d 30 20 29 7b 0a 20 20 20   if( n<=0 ){.   
185c0 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
185d0 20 20 75 73 65 64 20 2b 3d 20 6e 3b 0a 20 20 20    used += n;.   
185e0 20 20 20 61 73 73 65 72 74 28 20 75 73 65 64 3e     assert( used>
185f0 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
18600 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  n = lemonStrlen(
18610 7a 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20 69 66  zText);.  }.  if
18620 28 20 6e 2b 73 69 7a 65 6f 66 28 7a 49 6e 74 29  ( n+sizeof(zInt)
18630 2a 32 2b 75 73 65 64 20 3e 3d 20 61 6c 6c 6f 63  *2+used >= alloc
18640 65 64 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 65  ed ){.    alloce
18650 64 20 3d 20 6e 20 2b 20 73 69 7a 65 6f 66 28 7a  d = n + sizeof(z
18660 49 6e 74 29 2a 32 20 2b 20 75 73 65 64 20 2b 20  Int)*2 + used + 
18670 32 30 30 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68  200;.    z = (ch
18680 61 72 20 2a 29 20 72 65 61 6c 6c 6f 63 28 7a 2c  ar *) realloc(z,
18690 20 20 61 6c 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a    alloced);.  }.
186a0 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
186b0 75 72 6e 20 65 6d 70 74 79 3b 0a 20 20 77 68 69  urn empty;.  whi
186c0 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20  le( n-- > 0 ){. 
186d0 20 20 20 63 20 3d 20 2a 28 7a 54 65 78 74 2b 2b     c = *(zText++
186e0 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 25  );.    if( c=='%
186f0 27 20 26 26 20 6e 3e 30 20 26 26 20 7a 54 65 78  ' && n>0 && zTex
18700 74 5b 30 5d 3d 3d 27 64 27 20 29 7b 0a 20 20 20  t[0]=='d' ){.   
18710 20 20 20 73 70 72 69 6e 74 66 28 7a 49 6e 74 2c     sprintf(zInt,
18720 20 22 25 64 22 2c 20 70 31 29 3b 0a 20 20 20 20   "%d", p1);.    
18730 20 20 70 31 20 3d 20 70 32 3b 0a 20 20 20 20 20    p1 = p2;.     
18740 20 73 74 72 63 70 79 28 26 7a 5b 75 73 65 64 5d   strcpy(&z[used]
18750 2c 20 7a 49 6e 74 29 3b 0a 20 20 20 20 20 20 75  , zInt);.      u
18760 73 65 64 20 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c  sed += lemonStrl
18770 65 6e 28 26 7a 5b 75 73 65 64 5d 29 3b 0a 20 20  en(&z[used]);.  
18780 20 20 20 20 7a 54 65 78 74 2b 2b 3b 0a 20 20 20      zText++;.   
18790 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73     n--;.    }els
187a0 65 7b 0a 20 20 20 20 20 20 7a 5b 75 73 65 64 2b  e{.      z[used+
187b0 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20  +] = c;.    }.  
187c0 7d 0a 20 20 7a 5b 75 73 65 64 5d 20 3d 20 30 3b  }.  z[used] = 0;
187d0 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
187e0 2f 2a 0a 2a 2a 20 7a 43 6f 64 65 20 69 73 20 61  /*.** zCode is a
187f0 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
18800 74 68 65 20 61 63 74 69 6f 6e 20 61 73 73 6f 63  the action assoc
18810 69 61 74 65 64 20 77 69 74 68 20 61 20 72 75 6c  iated with a rul
18820 65 2e 20 20 45 78 70 61 6e 64 0a 2a 2a 20 74 68  e.  Expand.** th
18830 65 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 69  e symbols in thi
18840 73 20 73 74 72 69 6e 67 20 73 6f 20 74 68 61 74  s string so that
18850 20 74 68 65 20 72 65 66 65 72 20 74 6f 20 65 6c   the refer to el
18860 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ements of the pa
18870 72 73 65 72 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a  rser.** stack..*
18880 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 74  /.PRIVATE void t
18890 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28 73 74  ranslate_code(st
188a0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
188b0 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72  , struct rule *r
188c0 70 29 7b 0a 20 20 63 68 61 72 20 2a 63 70 2c 20  p){.  char *cp, 
188d0 2a 78 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *xp;.  int i;.  
188e0 63 68 61 72 20 6c 68 73 75 73 65 64 20 3d 20 30  char lhsused = 0
188f0 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  ;    /* True if 
18900 74 68 65 20 4c 48 53 20 65 6c 65 6d 65 6e 74 20  the LHS element 
18910 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f  has been used */
18920 0a 20 20 63 68 61 72 20 75 73 65 64 5b 4d 41 58  .  char used[MAX
18930 52 48 53 5d 3b 20 20 20 2f 2a 20 54 72 75 65 20  RHS];   /* True 
18940 66 6f 72 20 65 61 63 68 20 52 48 53 20 65 6c 65  for each RHS ele
18950 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 75 73  ment which is us
18960 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30  ed */..  for(i=0
18970 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
18980 2b 29 20 75 73 65 64 5b 69 5d 20 3d 20 30 3b 0a  +) used[i] = 0;.
18990 20 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 0a 0a    lhsused = 0;..
189a0 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d    if( rp->code==
189b0 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
189c0 63 68 61 72 20 6e 65 77 6c 69 6e 65 73 74 72 5b  char newlinestr[
189d0 32 5d 20 3d 20 7b 20 27 5c 6e 27 2c 20 27 5c 30  2] = { '\n', '\0
189e0 27 20 7d 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64  ' };.    rp->cod
189f0 65 20 3d 20 6e 65 77 6c 69 6e 65 73 74 72 3b 0a  e = newlinestr;.
18a00 20 20 20 20 72 70 2d 3e 6c 69 6e 65 20 3d 20 72      rp->line = r
18a10 70 2d 3e 72 75 6c 65 6c 69 6e 65 3b 0a 20 20 7d  p->ruleline;.  }
18a20 0a 0a 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30  ..  append_str(0
18a30 2c 30 2c 30 2c 30 29 3b 0a 0a 20 20 2f 2a 20 54  ,0,0,0);..  /* T
18a40 68 69 73 20 63 6f 6e 73 74 20 63 61 73 74 20 69  his const cast i
18a50 73 20 77 72 6f 6e 67 20 62 75 74 20 68 61 72 6d  s wrong but harm
18a60 6c 65 73 73 2c 20 69 66 20 77 65 27 72 65 20 63  less, if we're c
18a70 61 72 65 66 75 6c 2e 20 2a 2f 0a 20 20 66 6f 72  areful. */.  for
18a80 28 63 70 3d 28 63 68 61 72 20 2a 29 72 70 2d 3e  (cp=(char *)rp->
18a90 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29  code; *cp; cp++)
18aa0 7b 0a 20 20 20 20 69 66 28 20 69 73 61 6c 70 68  {.    if( isalph
18ab0 61 28 2a 63 70 29 20 26 26 20 28 63 70 3d 3d 72  a(*cp) && (cp==r
18ac0 70 2d 3e 63 6f 64 65 20 7c 7c 20 28 21 69 73 61  p->code || (!isa
18ad0 6c 6e 75 6d 28 63 70 5b 2d 31 5d 29 20 26 26 20  lnum(cp[-1]) && 
18ae0 63 70 5b 2d 31 5d 21 3d 27 5f 27 29 29 20 29 7b  cp[-1]!='_')) ){
18af0 0a 20 20 20 20 20 20 63 68 61 72 20 73 61 76 65  .      char save
18b00 64 3b 0a 20 20 20 20 20 20 66 6f 72 28 78 70 3d  d;.      for(xp=
18b10 20 26 63 70 5b 31 5d 3b 20 69 73 61 6c 6e 75 6d   &cp[1]; isalnum
18b20 28 2a 78 70 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f  (*xp) || *xp=='_
18b30 27 3b 20 78 70 2b 2b 29 3b 0a 20 20 20 20 20 20  '; xp++);.      
18b40 73 61 76 65 64 20 3d 20 2a 78 70 3b 0a 20 20 20  saved = *xp;.   
18b50 20 20 20 2a 78 70 20 3d 20 30 3b 0a 20 20 20 20     *xp = 0;.    
18b60 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69    if( rp->lhsali
18b70 61 73 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c  as && strcmp(cp,
18b80 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3d 3d 30  rp->lhsalias)==0
18b90 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
18ba0 6e 64 5f 73 74 72 28 22 79 79 67 6f 74 6f 6d 69  nd_str("yygotomi
18bb0 6e 6f 72 2e 79 79 25 64 22 2c 30 2c 72 70 2d 3e  nor.yy%d",0,rp->
18bc0 6c 68 73 2d 3e 64 74 6e 75 6d 2c 30 29 3b 0a 20  lhs->dtnum,0);. 
18bd0 20 20 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a         cp = xp;.
18be0 20 20 20 20 20 20 20 20 6c 68 73 75 73 65 64 20          lhsused 
18bf0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
18c00 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
18c10 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
18c20 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
18c30 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  f( rp->rhsalias[
18c40 69 5d 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c  i] && strcmp(cp,
18c50 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29  rp->rhsalias[i])
18c60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
18c70 20 20 20 69 66 28 20 63 70 21 3d 72 70 2d 3e 63     if( cp!=rp->c
18c80 6f 64 65 20 26 26 20 63 70 5b 2d 31 5d 3d 3d 27  ode && cp[-1]=='
18c90 40 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  @' ){.          
18ca0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 72      /* If the ar
18cb0 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  gument is of the
18cc0 20 66 6f 72 6d 20 40 58 20 74 68 65 6e 20 73 75   form @X then su
18cd0 62 73 74 69 74 75 74 65 64 0a 20 20 20 20 20 20  bstituted.      
18ce0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74          ** the t
18cf0 6f 6b 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58  oken number of X
18d00 2c 20 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20  , not the value 
18d10 6f 66 20 58 20 2a 2f 0a 20 20 20 20 20 20 20 20  of X */.        
18d20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72        append_str
18d30 28 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 61 6a 6f  ("yymsp[%d].majo
18d40 72 22 2c 2d 31 2c 69 2d 72 70 2d 3e 6e 72 68 73  r",-1,i-rp->nrhs
18d50 2b 31 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20  +1,0);.         
18d60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18d70 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
18d80 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e  ymbol *sp = rp->
18d90 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  rhs[i];.        
18da0 20 20 20 20 20 20 69 6e 74 20 64 74 6e 75 6d 3b        int dtnum;
18db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
18dc0 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c  f( sp->type==MUL
18dd0 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  TITERMINAL ){.  
18de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 74                dt
18df0 6e 75 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d  num = sp->subsym
18e00 5b 30 5d 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20  [0]->dtnum;.    
18e10 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
18e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18e30 20 64 74 6e 75 6d 20 3d 20 73 70 2d 3e 64 74 6e   dtnum = sp->dtn
18e40 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  um;.            
18e50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
18e60 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79    append_str("yy
18e70 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79  msp[%d].minor.yy
18e80 25 64 22 2c 30 2c 69 2d 72 70 2d 3e 6e 72 68 73  %d",0,i-rp->nrhs
18e90 2b 31 2c 20 64 74 6e 75 6d 29 3b 0a 20 20 20 20  +1, dtnum);.    
18ea0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18eb0 20 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20        cp = xp;. 
18ec0 20 20 20 20 20 20 20 20 20 20 20 75 73 65 64 5b             used[
18ed0 69 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  i] = 1;.        
18ee0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
18ef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
18f00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
18f10 78 70 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20  xp = saved;.    
18f20 7d 0a 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72  }.    append_str
18f30 28 63 70 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20  (cp, 1, 0, 0);. 
18f40 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a   } /* End loop *
18f50 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  /..  /* Check to
18f60 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4c   make sure the L
18f70 48 53 20 68 61 73 20 62 65 65 6e 20 75 73 65 64  HS has been used
18f80 20 2a 2f 0a 20 20 69 66 28 20 72 70 2d 3e 6c 68   */.  if( rp->lh
18f90 73 61 6c 69 61 73 20 26 26 20 21 6c 68 73 75 73  salias && !lhsus
18fa0 65 64 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d  ed ){.    ErrorM
18fb0 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  sg(lemp->filenam
18fc0 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a  e,rp->ruleline,.
18fd0 20 20 20 20 20 20 22 4c 61 62 65 6c 20 5c 22 25        "Label \"%
18fe0 73 5c 22 20 66 6f 72 20 5c 22 25 73 28 25 73 29  s\" for \"%s(%s)
18ff0 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  \" is never used
19000 2e 22 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e  .",.        rp->
19010 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e 6c 68 73  lhsalias,rp->lhs
19020 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c  ->name,rp->lhsal
19030 69 61 73 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e  ias);.    lemp->
19040 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a  errorcnt++;.  }.
19050 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 64  .  /* Generate d
19060 65 73 74 72 75 63 74 6f 72 20 63 6f 64 65 20 66  estructor code f
19070 6f 72 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77  or RHS symbols w
19080 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65  hich are not use
19090 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 72 65  d in the.  ** re
190a0 64 75 63 65 20 63 6f 64 65 20 2a 2f 0a 20 20 66  duce code */.  f
190b0 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
190c0 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  hs; i++){.    if
190d0 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  ( rp->rhsalias[i
190e0 5d 20 26 26 20 21 75 73 65 64 5b 69 5d 20 29 7b  ] && !used[i] ){
190f0 0a 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28  .      ErrorMsg(
19100 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72  lemp->filename,r
19110 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20  p->ruleline,.   
19120 20 20 20 20 20 22 4c 61 62 65 6c 20 25 73 20 66       "Label %s f
19130 6f 72 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73  or \"%s(%s)\" is
19140 20 6e 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20   never used.",. 
19150 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c         rp->rhsal
19160 69 61 73 5b 69 5d 2c 72 70 2d 3e 72 68 73 5b 69  ias[i],rp->rhs[i
19170 5d 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 72 68 73 61  ]->name,rp->rhsa
19180 6c 69 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20  lias[i]);.      
19190 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
191a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
191b0 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 3d  rp->rhsalias[i]=
191c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
191d0 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28 72  has_destructor(r
191e0 70 2d 3e 72 68 73 5b 69 5d 2c 6c 65 6d 70 29 20  p->rhs[i],lemp) 
191f0 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
19200 64 5f 73 74 72 28 22 20 20 79 79 5f 64 65 73 74  d_str("  yy_dest
19210 72 75 63 74 6f 72 28 79 79 70 50 61 72 73 65 72  ructor(yypParser
19220 2c 25 64 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d  ,%d,&yymsp[%d].m
19230 69 6e 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20  inor);\n", 0,.  
19240 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73           rp->rhs
19250 5b 69 5d 2d 3e 69 6e 64 65 78 2c 69 2d 72 70 2d  [i]->index,i-rp-
19260 3e 6e 72 68 73 2b 31 29 3b 0a 20 20 20 20 20 20  >nrhs+1);.      
19270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
19280 2a 20 4e 6f 20 64 65 73 74 72 75 63 74 6f 72 20  * No destructor 
19290 64 65 66 69 6e 65 64 20 66 6f 72 20 74 68 69 73  defined for this
192a0 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 7d   term */.      }
192b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
192c0 20 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20   rp->code ){.   
192d0 20 63 70 20 3d 20 61 70 70 65 6e 64 5f 73 74 72   cp = append_str
192e0 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 72  (0,0,0,0);.    r
192f0 70 2d 3e 63 6f 64 65 20 3d 20 53 74 72 73 61 66  p->code = Strsaf
19300 65 28 63 70 3f 63 70 3a 22 22 29 3b 0a 20 20 7d  e(cp?cp:"");.  }
19310 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72  .}../* .** Gener
19320 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
19330 78 65 63 75 74 65 73 20 77 68 65 6e 20 74 68 65  xecutes when the
19340 20 72 75 6c 65 20 22 72 70 22 20 69 73 20 72 65   rule "rp" is re
19350 64 75 63 65 64 2e 20 20 57 72 69 74 65 0a 2a 2a  duced.  Write.**
19360 20 74 68 65 20 63 6f 64 65 20 74 6f 20 22 6f 75   the code to "ou
19370 74 22 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6c  t".  Make sure l
19380 69 6e 65 6e 6f 20 73 74 61 79 73 20 75 70 2d 74  ineno stays up-t
19390 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 50 52 49 56 41  o-date..*/.PRIVA
193a0 54 45 20 76 6f 69 64 20 65 6d 69 74 5f 63 6f 64  TE void emit_cod
193b0 65 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 0a  e(.  FILE *out,.
193c0 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
193d0 70 2c 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f  p,.  struct lemo
193e0 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 2a  n *lemp,.  int *
193f0 6c 69 6e 65 6e 6f 0a 29 7b 0a 20 63 6f 6e 73 74  lineno.){. const
19400 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 2f 2a 20   char *cp;.. /* 
19410 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
19420 20 64 6f 20 74 68 65 20 72 65 64 75 63 65 20 61   do the reduce a
19430 63 74 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70  ction */. if( rp
19440 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 69 66 20  ->code ){.   if 
19450 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f  (!lemp->nolineno
19460 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e  sflag) { (*linen
19470 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64  o)++; tplt_lined
19480 69 72 28 6f 75 74 2c 72 70 2d 3e 6c 69 6e 65 2c  ir(out,rp->line,
19490 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
194a0 20 7d 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75   }.   fprintf(ou
194b0 74 2c 22 7b 25 73 22 2c 72 70 2d 3e 63 6f 64 65  t,"{%s",rp->code
194c0 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d  );.   for(cp=rp-
194d0 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b  >code; *cp; cp++
194e0 29 7b 0a 20 20 20 20 20 69 66 28 20 2a 63 70 3d  ){.     if( *cp=
194f0 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f  ='\n' ) (*lineno
19500 29 2b 2b 3b 0a 20 20 20 7d 20 2f 2a 20 45 6e 64  )++;.   } /* End
19510 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 66 70 72 69   loop */.   fpri
19520 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20  ntf(out,"}\n"); 
19530 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
19540 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e  if (!lemp->nolin
19550 65 6e 6f 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69  enosflag) { (*li
19560 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69  neno)++; tplt_li
19570 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e  nedir(out,*linen
19580 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29  o,lemp->outname)
19590 3b 20 7d 0a 20 7d 20 2f 2a 20 45 6e 64 20 69 66  ; }. } /* End if
195a0 28 20 72 70 2d 3e 63 6f 64 65 20 29 20 2a 2f 0a  ( rp->code ) */.
195b0 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  . return;.}../*.
195c0 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 64 65 66  ** Print the def
195d0 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 75  inition of the u
195e0 6e 69 6f 6e 20 75 73 65 64 20 66 6f 72 20 74 68  nion used for th
195f0 65 20 70 61 72 73 65 72 27 73 20 64 61 74 61 20  e parser's data 
19600 73 74 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 75  stack..** This u
19610 6e 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 66 69  nion contains fi
19620 65 6c 64 73 20 66 6f 72 20 65 76 65 72 79 20 70  elds for every p
19630 6f 73 73 69 62 6c 65 20 64 61 74 61 20 74 79 70  ossible data typ
19640 65 20 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e for tokens.** 
19650 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73  and nonterminals
19660 2e 20 20 49 6e 20 74 68 65 20 70 72 6f 63 65 73  .  In the proces
19670 73 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61  s of computing a
19680 6e 64 20 70 72 69 6e 74 69 6e 67 20 74 68 69 73  nd printing this
19690 0a 2a 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20  .** union, also 
196a0 73 65 74 20 74 68 65 20 22 2e 64 74 6e 75 6d 22  set the ".dtnum"
196b0 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20   field of every 
196c0 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e  terminal and non
196d0 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62  terminal.** symb
196e0 6f 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72 69 6e  ol..*/.void prin
196f0 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 0a 20  t_stack_union(. 
19700 20 46 49 4c 45 20 2a 6f 75 74 2c 20 20 20 20 20   FILE *out,     
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19720 54 68 65 20 6f 75 74 70 75 74 20 73 74 72 65 61  The output strea
19730 6d 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 65  m */.  struct le
19740 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 20 20 20 20 20  mon *lemp,      
19750 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69     /* The main i
19760 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f  nfo structure fo
19770 72 20 74 68 69 73 20 70 61 72 73 65 72 20 2a 2f  r this parser */
19780 0a 20 20 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 2c  .  int *plineno,
19790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
197a0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
197b0 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
197c0 20 20 69 6e 74 20 6d 68 66 6c 61 67 20 20 20 20    int mhflag    
197d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
197e0 20 54 72 75 65 20 69 66 20 67 65 6e 65 72 61 74   True if generat
197f0 69 6e 67 20 6d 61 6b 65 68 65 61 64 65 72 73 20  ing makeheaders 
19800 6f 75 74 70 75 74 20 2a 2f 0a 29 7b 0a 20 20 69  output */.){.  i
19810 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69  nt lineno = *pli
19820 6e 65 6e 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20  neno;    /* The 
19830 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  line number of t
19840 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63  he output */.  c
19850 68 61 72 20 2a 2a 74 79 70 65 73 3b 20 20 20 20  har **types;    
19860 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 68 61           /* A ha
19870 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61  sh table of data
19880 74 79 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61  types */.  int a
19890 72 72 61 79 73 69 7a 65 3b 20 20 20 20 20 20 20  rraysize;       
198a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
198b0 74 68 65 20 22 74 79 70 65 73 22 20 61 72 72 61  the "types" arra
198c0 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74  y */.  int maxdt
198d0 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 20  length;         
198e0 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67   /* Maximum leng
198f0 74 68 20 6f 66 20 61 6e 79 20 22 2e 64 61 74 61  th of any ".data
19900 74 79 70 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a  type" field. */.
19910 20 20 63 68 61 72 20 2a 73 74 64 64 74 3b 20 20    char *stddt;  
19920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
19930 74 61 6e 64 61 72 64 69 7a 65 64 20 6e 61 6d 65  tandardized name
19940 20 66 6f 72 20 61 20 64 61 74 61 74 79 70 65 20   for a datatype 
19950 2a 2f 0a 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20  */.  int i,j;   
19960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19970 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
19980 2a 2f 0a 20 20 69 6e 74 20 68 61 73 68 3b 20 20  */.  int hash;  
19990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
199a0 2a 20 46 6f 72 20 68 61 73 68 69 6e 67 20 74 68  * For hashing th
199b0 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 79 70 65  e name of a type
199c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
199d0 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   *name;         
199e0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70  /* Name of the p
199f0 61 72 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41  arser */..  /* A
19a00 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
19a10 69 61 6c 69 7a 65 20 74 79 70 65 73 5b 5d 20 61  ialize types[] a
19a20 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73 74 64 64  nd allocate stdd
19a30 74 5b 5d 20 2a 2f 0a 20 20 61 72 72 61 79 73 69  t[] */.  arraysi
19a40 7a 65 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  ze = lemp->nsymb
19a50 6f 6c 20 2a 20 32 3b 0a 20 20 74 79 70 65 73 20  ol * 2;.  types 
19a60 3d 20 28 63 68 61 72 2a 2a 29 63 61 6c 6c 6f 63  = (char**)calloc
19a70 28 20 61 72 72 61 79 73 69 7a 65 2c 20 73 69 7a  ( arraysize, siz
19a80 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 20 20  eof(char*) );.  
19a90 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79  for(i=0; i<array
19aa0 73 69 7a 65 3b 20 69 2b 2b 29 20 74 79 70 65 73  size; i++) types
19ab0 5b 69 5d 20 3d 20 30 3b 0a 20 20 6d 61 78 64 74  [i] = 0;.  maxdt
19ac0 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 69 66  length = 0;.  if
19ad0 28 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 20  ( lemp->vartype 
19ae0 29 7b 0a 20 20 20 20 6d 61 78 64 74 6c 65 6e 67  ){.    maxdtleng
19af0 74 68 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  th = lemonStrlen
19b00 28 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 29 3b  (lemp->vartype);
19b10 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
19b20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
19b30 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c   i++){.    int l
19b40 65 6e 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  en;.    struct s
19b50 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
19b60 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
19b70 20 20 69 66 28 20 73 70 2d 3e 64 61 74 61 74 79    if( sp->dataty
19b80 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  pe==0 ) continue
19b90 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f  ;.    len = lemo
19ba0 6e 53 74 72 6c 65 6e 28 73 70 2d 3e 64 61 74 61  nStrlen(sp->data
19bb0 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20 6c  type);.    if( l
19bc0 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74 68 20 29  en>maxdtlength )
19bd0 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c   maxdtlength = l
19be0 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64 64 74 20  en;.  }.  stddt 
19bf0 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28  = (char*)malloc(
19c00 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a 32 20 2b   maxdtlength*2 +
19c10 20 31 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65   1 );.  if( type
19c20 73 3d 3d 30 20 7c 7c 20 73 74 64 64 74 3d 3d 30  s==0 || stddt==0
19c30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
19c40 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d  stderr,"Out of m
19c50 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20  emory.\n");.    
19c60 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20  exit(1);.  }..  
19c70 2f 2a 20 42 75 69 6c 64 20 61 20 68 61 73 68 20  /* Build a hash 
19c80 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70  table of datatyp
19c90 65 73 2e 20 54 68 65 20 22 2e 64 74 6e 75 6d 22  es. The ".dtnum"
19ca0 20 66 69 65 6c 64 20 6f 66 20 65 61 63 68 20 73   field of each s
19cb0 79 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69  ymbol.  ** is fi
19cc0 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 74 68 65  lled in with the
19cd0 20 68 61 73 68 20 69 6e 64 65 78 20 70 6c 75 73   hash index plus
19ce0 20 31 2e 20 20 41 20 22 2e 64 74 6e 75 6d 22 20   1.  A ".dtnum" 
19cf0 76 61 6c 75 65 20 6f 66 20 30 20 69 73 0a 20 20  value of 0 is.  
19d00 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 65 72 6d  ** used for term
19d10 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49  inal symbols.  I
19d20 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 25 64  f there is no %d
19d30 65 66 61 75 6c 74 5f 74 79 70 65 20 64 65 66 69  efault_type defi
19d40 6e 65 64 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20  ned then.  ** 0 
19d50 69 73 20 61 6c 73 6f 20 75 73 65 64 20 61 73 20  is also used as 
19d60 74 68 65 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65  the .dtnum value
19d70 20 66 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   for nonterminal
19d80 73 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 73  s which do not s
19d90 70 65 63 69 66 79 0a 20 20 2a 2a 20 61 20 64 61  pecify.  ** a da
19da0 74 61 74 79 70 65 20 75 73 69 6e 67 20 74 68 65  tatype using the
19db0 20 25 74 79 70 65 20 64 69 72 65 63 74 69 76 65   %type directive
19dc0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
19dd0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
19de0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  l; i++){.    str
19df0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
19e00 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
19e10 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 3b  ];.    char *cp;
19e20 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d  .    if( sp==lem
19e30 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20  p->errsym ){.   
19e40 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61     sp->dtnum = a
19e50 72 72 61 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20  rraysize+1;.    
19e60 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
19e70 7d 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  }.    if( sp->ty
19e80 70 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe!=NONTERMINAL 
19e90 7c 7c 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65  || (sp->datatype
19ea0 3d 3d 30 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72  ==0 && lemp->var
19eb0 74 79 70 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  type==0) ){.    
19ec0 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b    sp->dtnum = 0;
19ed0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
19ee0 0a 20 20 20 20 7d 0a 20 20 20 20 63 70 20 3d 20  .    }.    cp = 
19ef0 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20  sp->datatype;.  
19f00 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70    if( cp==0 ) cp
19f10 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65   = lemp->vartype
19f20 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20  ;.    j = 0;.   
19f30 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
19f40 2a 63 70 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20  *cp) ) cp++;.   
19f50 20 77 68 69 6c 65 28 20 2a 63 70 20 29 20 73 74   while( *cp ) st
19f60 64 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b  ddt[j++] = *cp++
19f70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30  ;.    while( j>0
19f80 20 26 26 20 69 73 73 70 61 63 65 28 73 74 64 64   && isspace(stdd
19f90 74 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20  t[j-1]) ) j--;. 
19fa0 20 20 20 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b     stddt[j] = 0;
19fb0 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74  .    if( lemp->t
19fc0 6f 6b 65 6e 74 79 70 65 20 26 26 20 73 74 72 63  okentype && strc
19fd0 6d 70 28 73 74 64 64 74 2c 20 6c 65 6d 70 2d 3e  mp(stddt, lemp->
19fe0 74 6f 6b 65 6e 74 79 70 65 29 3d 3d 30 20 29 7b  tokentype)==0 ){
19ff0 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d  .      sp->dtnum
1a000 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 0;.      cont
1a010 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
1a020 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 66 6f  hash = 0;.    fo
1a030 72 28 6a 3d 30 3b 20 73 74 64 64 74 5b 6a 5d 3b  r(j=0; stddt[j];
1a040 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 68 61 73   j++){.      has
1a050 68 20 3d 20 68 61 73 68 2a 35 33 20 2b 20 73 74  h = hash*53 + st
1a060 64 64 74 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20  ddt[j];.    }.  
1a070 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 20 26    hash = (hash &
1a080 20 30 78 37 66 66 66 66 66 66 66 29 25 61 72 72   0x7fffffff)%arr
1a090 61 79 73 69 7a 65 3b 0a 20 20 20 20 77 68 69 6c  aysize;.    whil
1a0a0 65 28 20 74 79 70 65 73 5b 68 61 73 68 5d 20 29  e( types[hash] )
1a0b0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
1a0c0 6d 70 28 74 79 70 65 73 5b 68 61 73 68 5d 2c 73  mp(types[hash],s
1a0d0 74 64 64 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tddt)==0 ){.    
1a0e0 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
1a0f0 68 61 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20  hash + 1;.      
1a100 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1a110 0a 20 20 20 20 20 20 68 61 73 68 2b 2b 3b 0a 20  .      hash++;. 
1a120 20 20 20 20 20 69 66 28 20 68 61 73 68 3e 3d 61       if( hash>=a
1a130 72 72 61 79 73 69 7a 65 20 29 20 68 61 73 68 20  rraysize ) hash 
1a140 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
1a150 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d  f( types[hash]==
1a160 30 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64  0 ){.      sp->d
1a170 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b  tnum = hash + 1;
1a180 0a 20 20 20 20 20 20 74 79 70 65 73 5b 68 61 73  .      types[has
1a190 68 5d 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c  h] = (char*)mall
1a1a0 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
1a1b0 73 74 64 64 74 29 2b 31 20 29 3b 0a 20 20 20 20  stddt)+1 );.    
1a1c0 20 20 69 66 28 20 74 79 70 65 73 5b 68 61 73 68    if( types[hash
1a1d0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
1a1e0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
1a1f0 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e  Out of memory.\n
1a200 22 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74  ");.        exit
1a210 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (1);.      }.   
1a220 20 20 20 73 74 72 63 70 79 28 74 79 70 65 73 5b     strcpy(types[
1a230 68 61 73 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20  hash],stddt);.  
1a240 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
1a250 69 6e 74 20 6f 75 74 20 74 68 65 20 64 65 66 69  int out the defi
1a260 6e 69 74 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45  nition of YYTOKE
1a270 4e 54 59 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f  NTYPE and YYMINO
1a280 52 54 59 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20  RTYPE */.  name 
1a290 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c  = lemp->name ? l
1a2a0 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72  emp->name : "Par
1a2b0 73 65 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20  se";.  lineno = 
1a2c0 2a 70 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20  *plineno;.  if( 
1a2d0 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74  mhflag ){ fprint
1a2e0 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52  f(out,"#if INTER
1a2f0 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  FACE\n"); lineno
1a300 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ++; }.  fprintf(
1a310 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 54  out,"#define %sT
1a320 4f 4b 45 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e  OKENTYPE %s\n",n
1a330 61 6d 65 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74  ame,.    lemp->t
1a340 6f 6b 65 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74  okentype?lemp->t
1a350 6f 6b 65 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22  okentype:"void*"
1a360 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1a370 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70  if( mhflag ){ fp
1a380 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69  rintf(out,"#endi
1a390 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  f\n"); lineno++;
1a3a0 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
1a3b0 2c 22 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20  ,"typedef union 
1a3c0 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  {\n"); lineno++;
1a3d0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1a3e0 20 20 69 6e 74 20 79 79 69 6e 69 74 3b 5c 6e 22    int yyinit;\n"
1a3f0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1a400 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 73  printf(out,"  %s
1a410 54 4f 4b 45 4e 54 59 50 45 20 79 79 30 3b 5c 6e  TOKENTYPE yy0;\n
1a420 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ",name); lineno+
1a430 2b 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  +;.  for(i=0; i<
1a440 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29 7b  arraysize; i++){
1a450 0a 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 69  .    if( types[i
1a460 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
1a470 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1a480 2c 22 20 20 25 73 20 79 79 25 64 3b 5c 6e 22 2c  ,"  %s yy%d;\n",
1a490 74 79 70 65 73 5b 69 5d 2c 69 2b 31 29 3b 20 6c  types[i],i+1); l
1a4a0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65  ineno++;.    fre
1a4b0 65 28 74 79 70 65 73 5b 69 5d 29 3b 0a 20 20 7d  e(types[i]);.  }
1a4c0 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72  .  if( lemp->err
1a4d0 73 79 6d 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20  sym->useCnt ){. 
1a4e0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1a4f0 20 20 69 6e 74 20 79 79 25 64 3b 5c 6e 22 2c 6c    int yy%d;\n",l
1a500 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e  emp->errsym->dtn
1a510 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  um); lineno++;. 
1a520 20 7d 0a 20 20 66 72 65 65 28 73 74 64 64 74 29   }.  free(stddt)
1a530 3b 0a 20 20 66 72 65 65 28 74 79 70 65 73 29 3b  ;.  free(types);
1a540 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1a550 7d 20 59 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e  } YYMINORTYPE;\n
1a560 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1a570 2a 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e  *plineno = linen
1a580 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  o;.}../*.** Retu
1a590 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  rn the name of a
1a5a0 20 43 20 64 61 74 61 74 79 70 65 20 61 62 6c 65   C datatype able
1a5b0 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 76 61   to represent va
1a5c0 6c 75 65 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20  lues between.** 
1a5d0 6c 77 72 20 61 6e 64 20 75 70 72 2c 20 69 6e 63  lwr and upr, inc
1a5e0 6c 75 73 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  lusive..*/.stati
1a5f0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69  c const char *mi
1a600 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28  nimum_size_type(
1a610 69 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72  int lwr, int upr
1a620 29 7b 0a 20 20 69 66 28 20 6c 77 72 3e 3d 30 20  ){.  if( lwr>=0 
1a630 29 7b 0a 20 20 20 20 69 66 28 20 75 70 72 3c 3d  ){.    if( upr<=
1a640 32 35 35 20 29 7b 0a 20 20 20 20 20 20 72 65 74  255 ){.      ret
1a650 75 72 6e 20 22 75 6e 73 69 67 6e 65 64 20 63 68  urn "unsigned ch
1a660 61 72 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ar";.    }else i
1a670 66 28 20 75 70 72 3c 36 35 35 33 35 20 29 7b 0a  f( upr<65535 ){.
1a680 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e        return "un
1a690 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74  signed short int
1a6a0 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ";.    }else{.  
1a6b0 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69      return "unsi
1a6c0 67 6e 65 64 20 69 6e 74 22 3b 0a 20 20 20 20 7d  gned int";.    }
1a6d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72  .  }else if( lwr
1a6e0 3e 3d 2d 31 32 37 20 26 26 20 75 70 72 3c 3d 31  >=-127 && upr<=1
1a6f0 32 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  27 ){.    return
1a700 20 22 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a   "signed char";.
1a710 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e    }else if( lwr>
1a720 3d 2d 33 32 37 36 37 20 26 26 20 75 70 72 3c 33  =-32767 && upr<3
1a730 32 37 36 37 20 29 7b 0a 20 20 20 20 72 65 74 75  2767 ){.    retu
1a740 72 6e 20 22 73 68 6f 72 74 22 3b 0a 20 20 7d 65  rn "short";.  }e
1a750 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
1a760 22 69 6e 74 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  "int";.  }.}../*
1a770 0a 2a 2a 20 45 61 63 68 20 73 74 61 74 65 20 63  .** Each state c
1a780 6f 6e 74 61 69 6e 73 20 61 20 73 65 74 20 6f 66  ontains a set of
1a790 20 74 6f 6b 65 6e 20 74 72 61 6e 73 61 63 74 69   token transacti
1a7a0 6f 6e 20 61 6e 64 20 61 20 73 65 74 20 6f 66 0a  on and a set of.
1a7b0 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 74  ** nonterminal t
1a7c0 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 20 45 61  ransactions.  Ea
1a7d0 63 68 20 6f 66 20 74 68 65 73 65 20 73 65 74 73  ch of these sets
1a7e0 20 6d 61 6b 65 73 20 61 6e 20 69 6e 73 74 61 6e   makes an instan
1a7f0 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ce.** of the fol
1a800 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1a810 2e 20 20 41 6e 20 61 72 72 61 79 20 6f 66 20 74  .  An array of t
1a820 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20  hese structures 
1a830 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6f 72  is used.** to or
1a840 64 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e  der the creation
1a850 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
1a860 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74  he yy_action[] t
1a870 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  able..*/.struct 
1a880 61 78 73 65 74 20 7b 0a 20 20 73 74 72 75 63 74  axset {.  struct
1a890 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20 2f   state *stp;   /
1a8a0 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
1a8b0 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20   state */.  int 
1a8c0 69 73 54 6b 6e 3b 20 20 20 20 20 20 20 20 20 20  isTkn;          
1a8d0 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
1a8e0 74 6f 6b 65 6e 73 2e 20 20 46 61 6c 73 65 20 66  tokens.  False f
1a8f0 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73  or non-terminals
1a900 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f   */.  int nActio
1a910 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
1a920 6d 62 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20  mber of actions 
1a930 2a 2f 0a 20 20 69 6e 74 20 69 4f 72 64 65 72 3b  */.  int iOrder;
1a940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
1a950 67 69 6e 61 6c 20 6f 72 64 65 72 20 6f 66 20 61  ginal order of a
1a960 63 74 69 6f 6e 20 73 65 74 73 20 2a 2f 0a 7d 3b  ction sets */.};
1a970 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1a980 74 6f 20 61 78 73 65 74 20 73 74 72 75 63 74 75  to axset structu
1a990 72 65 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20  res for sorting 
1a9a0 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74  purposes.*/.stat
1a9b0 69 63 20 69 6e 74 20 61 78 73 65 74 5f 63 6f 6d  ic int axset_com
1a9c0 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20  pare(const void 
1a9d0 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  *a, const void *
1a9e0 62 29 7b 0a 20 20 73 74 72 75 63 74 20 61 78 73  b){.  struct axs
1a9f0 65 74 20 2a 70 31 20 3d 20 28 73 74 72 75 63 74  et *p1 = (struct
1aa00 20 61 78 73 65 74 2a 29 61 3b 0a 20 20 73 74 72   axset*)a;.  str
1aa10 75 63 74 20 61 78 73 65 74 20 2a 70 32 20 3d 20  uct axset *p2 = 
1aa20 28 73 74 72 75 63 74 20 61 78 73 65 74 2a 29 62  (struct axset*)b
1aa30 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d  ;.  int c;.  c =
1aa40 20 70 32 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20 70   p2->nAction - p
1aa50 31 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 20 20 69 66  1->nAction;.  if
1aa60 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20  ( c==0 ){.    c 
1aa70 3d 20 70 32 2d 3e 69 4f 72 64 65 72 20 2d 20 70  = p2->iOrder - p
1aa80 31 2d 3e 69 4f 72 64 65 72 3b 0a 20 20 7d 0a 20  1->iOrder;.  }. 
1aa90 20 61 73 73 65 72 74 28 20 63 21 3d 30 20 7c 7c   assert( c!=0 ||
1aaa0 20 70 31 3d 3d 70 32 20 29 3b 0a 20 20 72 65 74   p1==p2 );.  ret
1aab0 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn c;.}../*.** 
1aac0 57 72 69 74 65 20 74 65 78 74 20 6f 6e 20 22 6f  Write text on "o
1aad0 75 74 22 20 74 68 61 74 20 64 65 73 63 72 69 62  ut" that describ
1aae0 65 73 20 74 68 65 20 72 75 6c 65 20 22 72 70 22  es the rule "rp"
1aaf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ab00 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 46   writeRuleText(F
1ab10 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74  ILE *out, struct
1ab20 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20 20 69 6e   rule *rp){.  in
1ab30 74 20 6a 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  t j;.  fprintf(o
1ab40 75 74 2c 22 25 73 20 3a 3a 3d 22 2c 20 72 70 2d  ut,"%s ::=", rp-
1ab50 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66  >lhs->name);.  f
1ab60 6f 72 28 6a 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72  or(j=0; j<rp->nr
1ab70 68 73 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74  hs; j++){.    st
1ab80 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
1ab90 3d 20 72 70 2d 3e 72 68 73 5b 6a 5d 3b 0a 20 20  = rp->rhs[j];.  
1aba0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1abb0 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a  %s", sp->name);.
1abc0 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
1abd0 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
1abe0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  ){.      int k;.
1abf0 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b        for(k=1; k
1ac00 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b  <sp->nsubsym; k+
1ac10 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
1ac20 6e 74 66 28 6f 75 74 2c 22 7c 25 73 22 2c 73 70  ntf(out,"|%s",sp
1ac30 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d  ->subsym[k]->nam
1ac40 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1ac50 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e  }.  }.}.../* Gen
1ac60 65 72 61 74 65 20 43 20 73 6f 75 72 63 65 20 63  erate C source c
1ac70 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61 72 73  ode for the pars
1ac80 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72  er */.void Repor
1ac90 74 54 61 62 6c 65 28 0a 20 20 73 74 72 75 63 74  tTable(.  struct
1aca0 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20   lemon *lemp,.  
1acb0 69 6e 74 20 6d 68 66 6c 61 67 20 20 20 20 20 2f  int mhflag     /
1acc0 2a 20 4f 75 74 70 75 74 20 69 6e 20 6d 61 6b 65  * Output in make
1acd0 68 65 61 64 65 72 73 20 66 6f 72 6d 61 74 20 69  headers format i
1ace0 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 46  f true */.){.  F
1acf0 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20  ILE *out, *in;. 
1ad00 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53   char line[LINES
1ad10 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 20 6c 69 6e  IZE];.  int  lin
1ad20 65 6e 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 74  eno;.  struct st
1ad30 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
1ad40 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20  ct action *ap;. 
1ad50 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
1ad60 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 74 61  ;.  struct actta
1ad70 62 20 2a 70 41 63 74 74 61 62 3b 0a 20 20 69 6e  b *pActtab;.  in
1ad80 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20  t i, j, k, n;.  
1ad90 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65  const char *name
1ada0 3b 0a 20 20 69 6e 74 20 6d 6e 54 6b 6e 4f 66 73  ;.  int mnTknOfs
1adb0 74 2c 20 6d 78 54 6b 6e 4f 66 73 74 3b 0a 20 20  t, mxTknOfst;.  
1adc0 69 6e 74 20 6d 6e 4e 74 4f 66 73 74 2c 20 6d 78  int mnNtOfst, mx
1add0 4e 74 4f 66 73 74 3b 0a 20 20 73 74 72 75 63 74  NtOfst;.  struct
1ade0 20 61 78 73 65 74 20 2a 61 78 3b 0a 0a 20 20 69   axset *ax;..  i
1adf0 6e 20 3d 20 74 70 6c 74 5f 6f 70 65 6e 28 6c 65  n = tplt_open(le
1ae00 6d 70 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30  mp);.  if( in==0
1ae10 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 75 74   ) return;.  out
1ae20 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d   = file_open(lem
1ae30 70 2c 22 2e 63 22 2c 22 77 62 22 29 3b 0a 20 20  p,".c","wb");.  
1ae40 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20  if( out==0 ){.  
1ae50 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
1ae60 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1ae70 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 74 70  lineno = 1;.  tp
1ae80 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1ae90 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
1aea0 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
1aeb0 74 65 20 74 68 65 20 69 6e 63 6c 75 64 65 20 63  te the include c
1aec0 6f 64 65 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20  ode, if any */. 
1aed0 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
1aee0 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75  lemp,lemp->inclu
1aef0 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 69  de,&lineno);.  i
1af00 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20  f( mhflag ){.   
1af10 20 63 68 61 72 20 2a 6e 61 6d 65 20 3d 20 66 69   char *name = fi
1af20 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70  le_makename(lemp
1af30 2c 20 22 2e 68 22 29 3b 0a 20 20 20 20 66 70 72  , ".h");.    fpr
1af40 69 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63 6c 75  intf(out,"#inclu
1af50 64 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 6e 61  de \"%s\"\n", na
1af60 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
1af70 20 20 20 66 72 65 65 28 6e 61 6d 65 29 3b 0a 20     free(name);. 
1af80 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
1af90 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1afa0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1afb0 20 47 65 6e 65 72 61 74 65 20 23 64 65 66 69 6e   Generate #defin
1afc0 65 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e  es for all token
1afd0 73 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66 6c 61  s */.  if( mhfla
1afe0 67 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  g ){.    const c
1aff0 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 20  har *prefix;.   
1b000 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69   fprintf(out,"#i
1b010 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b  f INTERFACE\n");
1b020 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69   lineno++;.    i
1b030 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72  f( lemp->tokenpr
1b040 65 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20  efix ) prefix = 
1b050 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
1b060 78 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20  x;.    else     
1b070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1b080 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20  refix = "";.    
1b090 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d  for(i=1; i<lemp-
1b0a0 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29  >nterminal; i++)
1b0b0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1b0c0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25  out,"#define %s%
1b0d0 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66  -30s %2d\n",pref
1b0e0 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ix,lemp->symbols
1b0f0 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20  [i]->name,i);.  
1b100 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
1b110 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
1b120 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b  out,"#endif\n");
1b130 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1b140 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1b150 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1b160 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1b170 65 72 61 74 65 20 74 68 65 20 64 65 66 69 6e 65  erate the define
1b180 73 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  s */.  fprintf(o
1b190 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 43 4f  ut,"#define YYCO
1b1a0 44 45 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20  DETYPE %s\n",.  
1b1b0 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74    minimum_size_t
1b1c0 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79  ype(0, lemp->nsy
1b1d0 6d 62 6f 6c 2b 31 29 29 3b 20 6c 69 6e 65 6e 6f  mbol+1)); lineno
1b1e0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1b1f0 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 4f 43  t,"#define YYNOC
1b200 4f 44 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e  ODE %d\n",lemp->
1b210 6e 73 79 6d 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e  nsymbol+1);  lin
1b220 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1b230 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1b240 41 43 54 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22  ACTIONTYPE %s\n"
1b250 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69  ,.    minimum_si
1b260 7a 65 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d  ze_type(0, lemp-
1b270 3e 6e 73 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72  >nstate+lemp->nr
1b280 75 6c 65 2b 35 29 29 3b 20 20 6c 69 6e 65 6e 6f  ule+5));  lineno
1b290 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  ++;.  if( lemp->
1b2a0 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20  wildcard ){.    
1b2b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1b2c0 66 69 6e 65 20 59 59 57 49 4c 44 43 41 52 44 20  fine YYWILDCARD 
1b2d0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6c 65  %d\n",.       le
1b2e0 6d 70 2d 3e 77 69 6c 64 63 61 72 64 2d 3e 69 6e  mp->wildcard->in
1b2f0 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
1b300 20 20 7d 0a 20 20 70 72 69 6e 74 5f 73 74 61 63    }.  print_stac
1b310 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70  k_union(out,lemp
1b320 2c 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29  ,&lineno,mhflag)
1b330 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1b340 20 22 23 69 66 6e 64 65 66 20 59 59 53 54 41 43   "#ifndef YYSTAC
1b350 4b 44 45 50 54 48 5c 6e 22 29 3b 20 6c 69 6e 65  KDEPTH\n"); line
1b360 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70  no++;.  if( lemp
1b370 2d 3e 73 74 61 63 6b 73 69 7a 65 20 29 7b 0a 20  ->stacksize ){. 
1b380 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1b390 23 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44  #define YYSTACKD
1b3a0 45 50 54 48 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d  EPTH %s\n",lemp-
1b3b0 3e 73 74 61 63 6b 73 69 7a 65 29 3b 20 20 6c 69  >stacksize);  li
1b3c0 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  neno++;.  }else{
1b3d0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1b3e0 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54 41 43  ,"#define YYSTAC
1b3f0 4b 44 45 50 54 48 20 31 30 30 5c 6e 22 29 3b 20  KDEPTH 100\n"); 
1b400 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1b410 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
1b420 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e  endif\n"); linen
1b430 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61  o++;.  if( mhfla
1b440 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  g ){.    fprintf
1b450 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46  (out,"#if INTERF
1b460 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ACE\n"); lineno+
1b470 2b 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d 20  +;.  }.  name = 
1b480 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d  lemp->name ? lem
1b490 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65  p->name : "Parse
1b4a0 22 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 61  ";.  if( lemp->a
1b4b0 72 67 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67 5b  rg && lemp->arg[
1b4c0 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  0] ){.    int i;
1b4d0 0a 20 20 20 20 69 20 3d 20 6c 65 6d 6f 6e 53 74  .    i = lemonSt
1b4e0 72 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29 3b  rlen(lemp->arg);
1b4f0 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31  .    while( i>=1
1b500 20 26 26 20 69 73 73 70 61 63 65 28 6c 65 6d 70   && isspace(lemp
1b510 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 29 20 69 2d  ->arg[i-1]) ) i-
1b520 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e  -;.    while( i>
1b530 3d 31 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 6c  =1 && (isalnum(l
1b540 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 7c  emp->arg[i-1]) |
1b550 7c 20 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d  | lemp->arg[i-1]
1b560 3d 3d 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20 20  =='_') ) i--;.  
1b570 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1b580 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45  define %sARG_SDE
1b590 43 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c  CL %s;\n",name,l
1b5a0 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65  emp->arg);  line
1b5b0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1b5c0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1b5d0 73 41 52 47 5f 50 44 45 43 4c 20 2c 25 73 5c 6e  sARG_PDECL ,%s\n
1b5e0 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67  ",name,lemp->arg
1b5f0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1b600 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1b610 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54  define %sARG_FET
1b620 43 48 20 25 73 20 3d 20 79 79 70 50 61 72 73 65  CH %s = yypParse
1b630 72 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  r->%s\n",.      
1b640 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c             name,
1b650 6c 65 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d  lemp->arg,&lemp-
1b660 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e  >arg[i]);  linen
1b670 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1b680 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1b690 41 52 47 5f 53 54 4f 52 45 20 79 79 70 50 61 72  ARG_STORE yypPar
1b6a0 73 65 72 2d 3e 25 73 20 3d 20 25 73 5c 6e 22 2c  ser->%s = %s\n",
1b6b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b6c0 20 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72    name,&lemp->ar
1b6d0 67 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b  g[i],&lemp->arg[
1b6e0 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i]);  lineno++;.
1b6f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
1b700 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1b710 65 20 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e 22  e %sARG_SDECL\n"
1b720 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ,name);  lineno+
1b730 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
1b740 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
1b750 47 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29  G_PDECL\n",name)
1b760 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1b770 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1b780 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43  efine %sARG_FETC
1b790 48 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65  H\n",name); line
1b7a0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1b7b0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1b7c0 73 41 52 47 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61  sARG_STORE\n",na
1b7d0 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
1b7e0 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20   }.  if( mhflag 
1b7f0 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1b800 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20  ut,"#endif\n"); 
1b810 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1b820 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1b830 66 69 6e 65 20 59 59 4e 53 54 41 54 45 20 25 64  fine YYNSTATE %d
1b840 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  \n",lemp->nstate
1b850 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1b860 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1b870 66 69 6e 65 20 59 59 4e 52 55 4c 45 20 25 64 5c  fine YYNRULE %d\
1b880 6e 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b  n",lemp->nrule);
1b890 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66    lineno++;.  if
1b8a0 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e  ( lemp->errsym->
1b8b0 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20 66 70  useCnt ){.    fp
1b8c0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1b8d0 6e 65 20 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c  ne YYERRORSYMBOL
1b8e0 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72   %d\n",lemp->err
1b8f0 73 79 6d 2d 3e 69 6e 64 65 78 29 3b 20 20 6c 69  sym->index);  li
1b900 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1b910 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1b920 20 59 59 45 52 52 53 59 4d 44 54 20 79 79 25 64   YYERRSYMDT yy%d
1b930 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  \n",lemp->errsym
1b940 2d 3e 64 74 6e 75 6d 29 3b 20 20 6c 69 6e 65 6e  ->dtnum);  linen
1b950 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  o++;.  }.  if( l
1b960 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63  emp->has_fallbac
1b970 6b 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  k ){.    fprintf
1b980 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1b990 46 41 4c 4c 42 41 43 4b 20 31 5c 6e 22 29 3b 20  FALLBACK 1\n"); 
1b9a0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1b9b0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1b9c0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1b9d0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1b9e0 65 72 61 74 65 20 74 68 65 20 61 63 74 69 6f 6e  erate the action
1b9f0 20 74 61 62 6c 65 20 61 6e 64 20 69 74 73 20 61   table and its a
1ba00 73 73 6f 63 69 61 74 65 73 3a 0a 20 20 2a 2a 0a  ssociates:.  **.
1ba10 20 20 2a 2a 20 20 79 79 5f 61 63 74 69 6f 6e 5b    **  yy_action[
1ba20 5d 20 20 20 20 20 20 20 20 41 20 73 69 6e 67 6c  ]        A singl
1ba30 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  e table containi
1ba40 6e 67 20 61 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a  ng all actions..
1ba50 20 20 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61 68 65    **  yy_lookahe
1ba60 61 64 5b 5d 20 20 20 20 20 41 20 74 61 62 6c 65  ad[]     A table
1ba70 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1ba80 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 65 61  lookahead for ea
1ba90 63 68 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a  ch entry in.  **
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bab0 20 20 20 20 20 79 79 5f 61 63 74 69 6f 6e 2e 20       yy_action. 
1bac0 20 55 73 65 64 20 74 6f 20 64 65 74 65 63 74 20   Used to detect 
1bad0 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e  hash collisions.
1bae0 0a 20 20 2a 2a 20 20 79 79 5f 73 68 69 66 74 5f  .  **  yy_shift_
1baf0 6f 66 73 74 5b 5d 20 20 20 20 46 6f 72 20 65 61  ofst[]    For ea
1bb00 63 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66  ch state, the of
1bb10 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74  fset into yy_act
1bb20 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20  ion for.  **    
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb40 20 73 68 69 66 74 69 6e 67 20 74 65 72 6d 69 6e   shifting termin
1bb50 61 6c 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 72 65  als..  **  yy_re
1bb60 64 75 63 65 5f 6f 66 73 74 5b 5d 20 20 20 46 6f  duce_ofst[]   Fo
1bb70 72 20 65 61 63 68 20 73 74 61 74 65 2c 20 74 68  r each state, th
1bb80 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79  e offset into yy
1bb90 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a  _action for.  **
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbb0 20 20 20 20 20 73 68 69 66 74 69 6e 67 20 6e 6f       shifting no
1bbc0 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 61 66 74 65  n-terminals afte
1bbd0 72 20 61 20 72 65 64 75 63 65 2e 0a 20 20 2a 2a  r a reduce..  **
1bbe0 20 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 20    yy_default[]  
1bbf0 20 20 20 20 20 44 65 66 61 75 6c 74 20 61 63 74       Default act
1bc00 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 73 74 61  ion for each sta
1bc10 74 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 43  te..  */..  /* C
1bc20 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74 69 6f  ompute the actio
1bc30 6e 73 20 6f 6e 20 61 6c 6c 20 73 74 61 74 65 73  ns on all states
1bc40 20 61 6e 64 20 63 6f 75 6e 74 20 74 68 65 6d 20   and count them 
1bc50 75 70 20 2a 2f 0a 20 20 61 78 20 3d 20 28 73 74  up */.  ax = (st
1bc60 72 75 63 74 20 61 78 73 65 74 20 2a 29 20 63 61  ruct axset *) ca
1bc70 6c 6c 6f 63 28 6c 65 6d 70 2d 3e 6e 73 74 61 74  lloc(lemp->nstat
1bc80 65 2a 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30  e*2, sizeof(ax[0
1bc90 5d 29 29 3b 0a 20 20 69 66 28 20 61 78 3d 3d 30  ]));.  if( ax==0
1bca0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1bcb0 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66  stderr,"malloc f
1bcc0 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 65  ailed\n");.    e
1bcd0 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f  xit(1);.  }.  fo
1bce0 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1bcf0 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
1bd00 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
1bd10 74 65 64 5b 69 5d 3b 0a 20 20 20 20 61 78 5b 69  ted[i];.    ax[i
1bd20 2a 32 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20  *2].stp = stp;. 
1bd30 20 20 20 61 78 5b 69 2a 32 5d 2e 69 73 54 6b 6e     ax[i*2].isTkn
1bd40 20 3d 20 31 3b 0a 20 20 20 20 61 78 5b 69 2a 32   = 1;.    ax[i*2
1bd50 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d  ].nAction = stp-
1bd60 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20 61 78  >nTknAct;.    ax
1bd70 5b 69 2a 32 2b 31 5d 2e 73 74 70 20 3d 20 73 74  [i*2+1].stp = st
1bd80 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d  p;.    ax[i*2+1]
1bd90 2e 69 73 54 6b 6e 20 3d 20 30 3b 0a 20 20 20 20  .isTkn = 0;.    
1bda0 61 78 5b 69 2a 32 2b 31 5d 2e 6e 41 63 74 69 6f  ax[i*2+1].nActio
1bdb0 6e 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 3b  n = stp->nNtAct;
1bdc0 0a 20 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66 73 74  .  }.  mxTknOfst
1bdd0 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 30   = mnTknOfst = 0
1bde0 3b 0a 20 20 6d 78 4e 74 4f 66 73 74 20 3d 20 6d  ;.  mxNtOfst = m
1bdf0 6e 4e 74 4f 66 73 74 20 3d 20 30 3b 0a 0a 20 20  nNtOfst = 0;..  
1be00 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61  /* Compute the a
1be10 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20 49 6e  ction table.  In
1be20 20 6f 72 64 65 72 20 74 6f 20 74 72 79 20 74 6f   order to try to
1be30 20 6b 65 65 70 20 74 68 65 20 73 69 7a 65 20 6f   keep the size o
1be40 66 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 69 6f  f the.  ** actio
1be50 6e 20 74 61 62 6c 65 20 74 6f 20 61 20 6d 69 6e  n table to a min
1be60 69 6d 75 6d 2c 20 74 68 65 20 68 65 75 72 69 73  imum, the heuris
1be70 74 69 63 20 6f 66 20 70 6c 61 63 69 6e 67 20 74  tic of placing t
1be80 68 65 20 6c 61 72 67 65 73 74 20 61 63 74 69 6f  he largest actio
1be90 6e 0a 20 20 2a 2a 20 73 65 74 73 20 66 69 72 73  n.  ** sets firs
1bea0 74 20 69 73 20 75 73 65 64 2e 0a 20 20 2a 2f 0a  t is used..  */.
1beb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1bec0 70 2d 3e 6e 73 74 61 74 65 2a 32 3b 20 69 2b 2b  p->nstate*2; i++
1bed0 29 20 61 78 5b 69 5d 2e 69 4f 72 64 65 72 20 3d  ) ax[i].iOrder =
1bee0 20 69 3b 0a 20 20 71 73 6f 72 74 28 61 78 2c 20   i;.  qsort(ax, 
1bef0 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 2c 20  lemp->nstate*2, 
1bf00 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 2c 20 61  sizeof(ax[0]), a
1bf10 78 73 65 74 5f 63 6f 6d 70 61 72 65 29 3b 0a 20  xset_compare);. 
1bf20 20 70 41 63 74 74 61 62 20 3d 20 61 63 74 74 61   pActtab = actta
1bf30 62 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72  b_alloc();.  for
1bf40 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1bf50 74 61 74 65 2a 32 20 26 26 20 61 78 5b 69 5d 2e  tate*2 && ax[i].
1bf60 6e 41 63 74 69 6f 6e 3e 30 3b 20 69 2b 2b 29 7b  nAction>0; i++){
1bf70 0a 20 20 20 20 73 74 70 20 3d 20 61 78 5b 69 5d  .    stp = ax[i]
1bf80 2e 73 74 70 3b 0a 20 20 20 20 69 66 28 20 61 78  .stp;.    if( ax
1bf90 5b 69 5d 2e 69 73 54 6b 6e 20 29 7b 0a 20 20 20  [i].isTkn ){.   
1bfa0 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
1bfb0 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
1bfc0 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  xt){.        int
1bfd0 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20   action;.       
1bfe0 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64   if( ap->sp->ind
1bff0 65 78 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ex>=lemp->ntermi
1c000 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  nal ) continue;.
1c010 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 20 3d          action =
1c020 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28   compute_action(
1c030 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20  lemp, ap);.     
1c040 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20     if( action<0 
1c050 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1c060 20 20 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f      acttab_actio
1c070 6e 28 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73  n(pActtab, ap->s
1c080 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e  p->index, action
1c090 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c0a0 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d   stp->iTknOfst =
1c0b0 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70   acttab_insert(p
1c0c0 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20 20 69  Acttab);.      i
1c0d0 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74  f( stp->iTknOfst
1c0e0 3c 6d 6e 54 6b 6e 4f 66 73 74 20 29 20 6d 6e 54  <mnTknOfst ) mnT
1c0f0 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54  knOfst = stp->iT
1c100 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66  knOfst;.      if
1c110 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3e  ( stp->iTknOfst>
1c120 6d 78 54 6b 6e 4f 66 73 74 20 29 20 6d 78 54 6b  mxTknOfst ) mxTk
1c130 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b  nOfst = stp->iTk
1c140 6e 4f 66 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65  nOfst;.    }else
1c150 7b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73  {.      for(ap=s
1c160 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  tp->ap; ap; ap=a
1c170 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
1c180 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20    int action;.  
1c190 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70        if( ap->sp
1c1a0 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74  ->index<lemp->nt
1c1b0 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e  erminal ) contin
1c1c0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
1c1d0 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c  ap->sp->index==l
1c1e0 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 20 63  emp->nsymbol ) c
1c1f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1c200 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74   action = comput
1c210 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61  e_action(lemp, a
1c220 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
1c230 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69  action<0 ) conti
1c240 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74  nue;.        act
1c250 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74  tab_action(pActt
1c260 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  ab, ap->sp->inde
1c270 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20  x, action);.    
1c280 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69    }.      stp->i
1c290 4e 74 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f  NtOfst = acttab_
1c2a0 69 6e 73 65 72 74 28 70 41 63 74 74 61 62 29 3b  insert(pActtab);
1c2b0 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e  .      if( stp->
1c2c0 69 4e 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66 73 74  iNtOfst<mnNtOfst
1c2d0 20 29 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 73 74   ) mnNtOfst = st
1c2e0 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20  p->iNtOfst;.    
1c2f0 20 20 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66    if( stp->iNtOf
1c300 73 74 3e 6d 78 4e 74 4f 66 73 74 20 29 20 6d 78  st>mxNtOfst ) mx
1c310 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e  NtOfst = stp->iN
1c320 74 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  tOfst;.    }.  }
1c330 0a 20 20 66 72 65 65 28 61 78 29 3b 0a 0a 20 20  .  free(ax);..  
1c340 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79  /* Output the yy
1c350 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f  _action table */
1c360 0a 20 20 6e 20 3d 20 61 63 74 74 61 62 5f 73 69  .  n = acttab_si
1c370 7a 65 28 70 41 63 74 74 61 62 29 3b 0a 20 20 66  ze(pActtab);.  f
1c380 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1c390 69 6e 65 20 59 59 5f 41 43 54 54 41 42 5f 43 4f  ine YY_ACTTAB_CO
1c3a0 55 4e 54 20 28 25 64 29 5c 6e 22 2c 20 6e 29 3b  UNT (%d)\n", n);
1c3b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1c3c0 69 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63  intf(out,"static
1c3d0 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e 54   const YYACTIONT
1c3e0 59 50 45 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20  YPE yy_action[] 
1c3f0 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  = {\n"); lineno+
1c400 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  +;.  for(i=j=0; 
1c410 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
1c420 6e 74 20 61 63 74 69 6f 6e 20 3d 20 61 63 74 74  nt action = actt
1c430 61 62 5f 79 79 61 63 74 69 6f 6e 28 70 41 63 74  ab_yyaction(pAct
1c440 74 61 62 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  tab, i);.    if(
1c450 20 61 63 74 69 6f 6e 3c 30 20 29 20 61 63 74 69   action<0 ) acti
1c460 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  on = lemp->nstat
1c470 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20  e + lemp->nrule 
1c480 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  + 2;.    if( j==
1c490 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
1c4a0 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
1c4b0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1c4c0 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 61 63 74  ut, " %4d,", act
1c4d0 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d  ion);.    if( j=
1c4e0 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
1c4f0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1c500 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
1c510 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
1c520 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c530 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
1c540 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1c550 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
1c560 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  +;..  /* Output 
1c570 74 68 65 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64  the yy_lookahead
1c580 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69   table */.  fpri
1c590 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63 20  ntf(out,"static 
1c5a0 63 6f 6e 73 74 20 59 59 43 4f 44 45 54 59 50 45  const YYCODETYPE
1c5b0 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20   yy_lookahead[] 
1c5c0 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  = {\n"); lineno+
1c5d0 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  +;.  for(i=j=0; 
1c5e0 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
1c5f0 6e 74 20 6c 61 20 3d 20 61 63 74 74 61 62 5f 79  nt la = acttab_y
1c600 79 6c 6f 6f 6b 61 68 65 61 64 28 70 41 63 74 74  ylookahead(pActt
1c610 61 62 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ab, i);.    if( 
1c620 6c 61 3c 30 20 29 20 6c 61 20 3d 20 6c 65 6d 70  la<0 ) la = lemp
1c630 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a 20 20 20 20 69  ->nsymbol;.    i
1c640 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74  f( j==0 ) fprint
1c650 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a  f(out," /* %5d *
1c660 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72  / ", i);.    fpr
1c670 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c  intf(out, " %4d,
1c680 22 2c 20 6c 61 29 3b 0a 20 20 20 20 69 66 28 20  ", la);.    if( 
1c690 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29  j==9 || i==n-1 )
1c6a0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1c6b0 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65  out, "\n"); line
1c6c0 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20  no++;.      j = 
1c6d0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1c6e0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      j++;.    }. 
1c6f0 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
1c700 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  , "};\n"); linen
1c710 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  o++;..  /* Outpu
1c720 74 20 74 68 65 20 79 79 5f 73 68 69 66 74 5f 6f  t the yy_shift_o
1c730 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20  fst[] table */. 
1c740 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
1c750 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f  define YY_SHIFT_
1c760 55 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22  USE_DFLT (%d)\n"
1c770 2c 20 6d 6e 54 6b 6e 4f 66 73 74 2d 31 29 3b 20  , mnTknOfst-1); 
1c780 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20  lineno++;.  n = 
1c790 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20  lemp->nstate;.  
1c7a0 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65  while( n>0 && le
1c7b0 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d  mp->sorted[n-1]-
1c7c0 3e 69 54 6b 6e 4f 66 73 74 3d 3d 4e 4f 5f 4f 46  >iTknOfst==NO_OF
1c7d0 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70  FSET ) n--;.  fp
1c7e0 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
1c7f0 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 43 4f 55  ine YY_SHIFT_COU
1c800 4e 54 20 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29  NT (%d)\n", n-1)
1c810 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1c820 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
1c830 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d 49 4e  ine YY_SHIFT_MIN
1c840 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b     (%d)\n", mnTk
1c850 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  nOfst); lineno++
1c860 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1c870 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49   "#define YY_SHI
1c880 46 54 5f 4d 41 58 20 20 20 28 25 64 29 5c 6e 22  FT_MAX   (%d)\n"
1c890 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 3b 20 6c 69  , mxTknOfst); li
1c8a0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1c8b0 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63  f(out, "static c
1c8c0 6f 6e 73 74 20 25 73 20 79 79 5f 73 68 69 66 74  onst %s yy_shift
1c8d0 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20  _ofst[] = {\n", 
1c8e0 0a 20 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d  .          minim
1c8f0 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 54  um_size_type(mnT
1c900 6b 6e 4f 66 73 74 2d 31 2c 20 6d 78 54 6b 6e 4f  knOfst-1, mxTknO
1c910 66 73 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  fst)); lineno++;
1c920 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
1c930 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; i++){.    int
1c940 20 6f 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d   ofst;.    stp =
1c950 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
1c960 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70  ;.    ofst = stp
1c970 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20  ->iTknOfst;.    
1c980 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46  if( ofst==NO_OFF
1c990 53 45 54 20 29 20 6f 66 73 74 20 3d 20 6d 6e 54  SET ) ofst = mnT
1c9a0 6b 6e 4f 66 73 74 20 2d 20 31 3b 0a 20 20 20 20  knOfst - 1;.    
1c9b0 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e  if( j==0 ) fprin
1c9c0 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20  tf(out," /* %5d 
1c9d0 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70  */ ", i);.    fp
1c9e0 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64  rintf(out, " %4d
1c9f0 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ,", ofst);.    i
1ca00 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d  f( j==9 || i==n-
1ca10 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  1 ){.      fprin
1ca20 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c  tf(out, "\n"); l
1ca30 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a  ineno++;.      j
1ca40 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1ca50 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
1ca60 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  }.  }.  fprintf(
1ca70 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69  out, "};\n"); li
1ca80 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75  neno++;..  /* Ou
1ca90 74 70 75 74 20 74 68 65 20 79 79 5f 72 65 64 75  tput the yy_redu
1caa0 63 65 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20  ce_ofst[] table 
1cab0 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
1cac0 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45  , "#define YY_RE
1cad0 44 55 43 45 5f 55 53 45 5f 44 46 4c 54 20 28 25  DUCE_USE_DFLT (%
1cae0 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73 74 2d  d)\n", mnNtOfst-
1caf0 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  1); lineno++;.  
1cb00 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  n = lemp->nstate
1cb10 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  ;.  while( n>0 &
1cb20 26 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e  & lemp->sorted[n
1cb30 2d 31 5d 2d 3e 69 4e 74 4f 66 73 74 3d 3d 4e 4f  -1]->iNtOfst==NO
1cb40 5f 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20  _OFFSET ) n--;. 
1cb50 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
1cb60 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45  define YY_REDUCE
1cb70 5f 43 4f 55 4e 54 20 28 25 64 29 5c 6e 22 2c 20  _COUNT (%d)\n", 
1cb80 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  n-1); lineno++;.
1cb90 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1cba0 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43  #define YY_REDUC
1cbb0 45 5f 4d 49 4e 20 20 20 28 25 64 29 5c 6e 22 2c  E_MIN   (%d)\n",
1cbc0 20 6d 6e 4e 74 4f 66 73 74 29 3b 20 6c 69 6e 65   mnNtOfst); line
1cbd0 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1cbe0 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59  out, "#define YY
1cbf0 5f 52 45 44 55 43 45 5f 4d 41 58 20 20 20 28 25  _REDUCE_MAX   (%
1cc00 64 29 5c 6e 22 2c 20 6d 78 4e 74 4f 66 73 74 29  d)\n", mxNtOfst)
1cc10 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1cc20 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74  rintf(out, "stat
1cc30 69 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f 72  ic const %s yy_r
1cc40 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 3d 20 7b  educe_ofst[] = {
1cc50 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
1cc60 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
1cc70 65 28 6d 6e 4e 74 4f 66 73 74 2d 31 2c 20 6d 78  e(mnNtOfst-1, mx
1cc80 4e 74 4f 66 73 74 29 29 3b 20 6c 69 6e 65 6e 6f  NtOfst)); lineno
1cc90 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ++;.  for(i=j=0;
1cca0 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
1ccb0 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 73 74  int ofst;.    st
1ccc0 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
1ccd0 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20  [i];.    ofst = 
1cce0 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20  stp->iNtOfst;.  
1ccf0 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f    if( ofst==NO_O
1cd00 46 46 53 45 54 20 29 20 6f 66 73 74 20 3d 20 6d  FFSET ) ofst = m
1cd10 6e 4e 74 4f 66 73 74 20 2d 20 31 3b 0a 20 20 20  nNtOfst - 1;.   
1cd20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69   if( j==0 ) fpri
1cd30 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64  ntf(out," /* %5d
1cd40 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66   */ ", i);.    f
1cd50 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34  printf(out, " %4
1cd60 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20  d,", ofst);.    
1cd70 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e  if( j==9 || i==n
1cd80 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  -1 ){.      fpri
1cd90 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20  ntf(out, "\n"); 
1cda0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
1cdb0 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  j = 0;.    }else
1cdc0 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
1cdd0 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
1cde0 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c  (out, "};\n"); l
1cdf0 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f  ineno++;..  /* O
1ce00 75 74 70 75 74 20 74 68 65 20 64 65 66 61 75 6c  utput the defaul
1ce10 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a  t action table *
1ce20 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  /.  fprintf(out,
1ce30 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59   "static const Y
1ce40 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 64  YACTIONTYPE yy_d
1ce50 65 66 61 75 6c 74 5b 5d 20 3d 20 7b 5c 6e 22 29  efault[] = {\n")
1ce60 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20  ; lineno++;.  n 
1ce70 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a  = lemp->nstate;.
1ce80 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
1ce90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
1cea0 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
1ceb0 5d 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20  ];.    if( j==0 
1cec0 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20  ) fprintf(out," 
1ced0 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b  /* %5d */ ", i);
1cee0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1cef0 2c 20 22 20 25 34 64 2c 22 2c 20 73 74 70 2d 3e  , " %4d,", stp->
1cf00 69 44 66 6c 74 29 3b 0a 20 20 20 20 69 66 28 20  iDflt);.    if( 
1cf10 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29  j==9 || i==n-1 )
1cf20 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1cf30 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65  out, "\n"); line
1cf40 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20  no++;.      j = 
1cf50 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1cf60 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      j++;.    }. 
1cf70 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
1cf80 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  , "};\n"); linen
1cf90 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  o++;.  tplt_xfer
1cfa0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1cfb0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1cfc0 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
1cfd0 74 61 62 6c 65 20 6f 66 20 66 61 6c 6c 62 61 63  table of fallbac
1cfe0 6b 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20  k tokens..  */. 
1cff0 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66   if( lemp->has_f
1d000 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 69  allback ){.    i
1d010 6e 74 20 6d 78 20 3d 20 6c 65 6d 70 2d 3e 6e 74  nt mx = lemp->nt
1d020 65 72 6d 69 6e 61 6c 20 2d 20 31 3b 0a 20 20 20  erminal - 1;.   
1d030 20 77 68 69 6c 65 28 20 6d 78 3e 30 20 26 26 20   while( mx>0 && 
1d040 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6d 78  lemp->symbols[mx
1d050 5d 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29  ]->fallback==0 )
1d060 7b 20 6d 78 2d 2d 3b 20 7d 0a 20 20 20 20 66 6f  { mx--; }.    fo
1d070 72 28 69 3d 30 3b 20 69 3c 3d 6d 78 3b 20 69 2b  r(i=0; i<=mx; i+
1d080 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1d090 20 73 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c 65 6d   symbol *p = lem
1d0a0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
1d0b0 20 20 20 20 20 69 66 28 20 70 2d 3e 66 61 6c 6c       if( p->fall
1d0c0 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  back==0 ){.     
1d0d0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1d0e0 22 20 20 20 20 30 2c 20 20 2f 2a 20 25 31 30 73  "    0,  /* %10s
1d0f0 20 3d 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f 5c 6e   => nothing */\n
1d100 22 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  ", p->name);.   
1d110 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d120 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1d130 20 20 25 33 64 2c 20 20 2f 2a 20 25 31 30 73 20    %3d,  /* %10s 
1d140 3d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 20 70 2d 3e  => %s */\n", p->
1d150 66 61 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65 78 2c  fallback->index,
1d160 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 61  .          p->na
1d170 6d 65 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d  me, p->fallback-
1d180 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  >name);.      }.
1d190 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a        lineno++;.
1d1a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74 70 6c 74      }.  }.  tplt
1d1b0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1d1c0 2c 20 69 6e 2c 20 6f 75 74 2c 20 26 6c 69 6e 65  , in, out, &line
1d1d0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1d1e0 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74  ate a table cont
1d1f0 61 69 6e 69 6e 67 20 74 68 65 20 73 79 6d 62 6f  aining the symbo
1d200 6c 69 63 20 6e 61 6d 65 20 6f 66 20 65 76 65 72  lic name of ever
1d210 79 20 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a 20 20  y symbol.  */.  
1d220 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1d230 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
1d240 20 20 20 20 73 70 72 69 6e 74 66 28 6c 69 6e 65      sprintf(line
1d250 2c 22 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d 70 2d  ,"\"%s\",",lemp-
1d260 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d  >symbols[i]->nam
1d270 65 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  e);.    fprintf(
1d280 6f 75 74 2c 22 20 20 25 2d 31 35 73 22 2c 6c 69  out,"  %-15s",li
1d290 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 28 69 26  ne);.    if( (i&
1d2a0 33 29 3d 3d 33 20 29 7b 20 66 70 72 69 6e 74 66  3)==3 ){ fprintf
1d2b0 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65  (out,"\n"); line
1d2c0 6e 6f 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69 66  no++; }.  }.  if
1d2d0 28 20 28 69 26 33 29 21 3d 30 20 29 7b 20 66 70  ( (i&3)!=0 ){ fp
1d2e0 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b  rintf(out,"\n");
1d2f0 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 74   lineno++; }.  t
1d300 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1d310 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1d320 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1d330 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74  ate a table cont
1d340 61 69 6e 69 6e 67 20 61 20 74 65 78 74 20 73 74  aining a text st
1d350 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
1d360 62 65 73 20 65 76 65 72 79 0a 20 20 2a 2a 20 72  bes every.  ** r
1d370 75 6c 65 20 69 6e 20 74 68 65 20 72 75 6c 65 20  ule in the rule 
1d380 73 65 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d  set of the gramm
1d390 61 72 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  ar.  This inform
1d3a0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 0a 20 20  ation is used.  
1d3b0 2a 2a 20 77 68 65 6e 20 74 72 61 63 69 6e 67 20  ** when tracing 
1d3c0 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73 2e 0a  REDUCE actions..
1d3d0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
1d3e0 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
1d3f0 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 2c 20  p; rp=rp->next, 
1d400 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
1d410 28 20 72 70 2d 3e 69 6e 64 65 78 3d 3d 69 20 29  ( rp->index==i )
1d420 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1d430 74 2c 22 20 2f 2a 20 25 33 64 20 2a 2f 20 5c 22  t," /* %3d */ \"
1d440 22 2c 20 69 29 3b 0a 20 20 20 20 77 72 69 74 65  ", i);.    write
1d450 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70  RuleText(out, rp
1d460 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1d470 75 74 2c 22 5c 22 2c 5c 6e 22 29 3b 20 6c 69 6e  ut,"\",\n"); lin
1d480 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
1d490 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1d4a0 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1d4b0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1d4c0 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
1d4d0 63 75 74 65 73 20 65 76 65 72 79 20 74 69 6d 65  cutes every time
1d4e0 20 61 20 73 79 6d 62 6f 6c 20 69 73 20 70 6f 70   a symbol is pop
1d4f0 70 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  ped from.  ** th
1d500 65 20 73 74 61 63 6b 20 77 68 69 6c 65 20 70 72  e stack while pr
1d510 6f 63 65 73 73 69 6e 67 20 65 72 72 6f 72 73 20  ocessing errors 
1d520 6f 72 20 77 68 69 6c 65 20 64 65 73 74 72 6f 79  or while destroy
1d530 69 6e 67 20 74 68 65 20 70 61 72 73 65 72 2e 20  ing the parser. 
1d540 0a 20 20 2a 2a 20 28 49 6e 20 6f 74 68 65 72 20  .  ** (In other 
1d550 77 6f 72 64 73 2c 20 67 65 6e 65 72 61 74 65 20  words, generate 
1d560 74 68 65 20 25 64 65 73 74 72 75 63 74 6f 72 20  the %destructor 
1d570 61 63 74 69 6f 6e 73 29 0a 20 20 2a 2f 0a 20 20  actions).  */.  
1d580 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64  if( lemp->tokend
1d590 65 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  est ){.    int o
1d5a0 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72  nce = 1;.    for
1d5b0 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1d5c0 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
1d5d0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
1d5e0 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d   *sp = lemp->sym
1d5f0 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69  bols[i];.      i
1d600 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e  f( sp==0 || sp->
1d610 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 29  type!=TERMINAL )
1d620 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1d630 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20   if( once ){.   
1d640 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1d650 2c 20 22 20 20 20 20 20 20 2f 2a 20 54 45 52 4d  , "      /* TERM
1d660 49 4e 41 4c 20 44 65 73 74 72 75 63 74 6f 72 20  INAL Destructor 
1d670 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  */\n"); lineno++
1d680 3b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d  ;.        once =
1d690 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1d6a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1d6b0 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25     case %d: /* %
1d6c0 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64  s */\n", sp->ind
1d6d0 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c  ex, sp->name); l
1d6e0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ineno++;.    }. 
1d6f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65     for(i=0; i<le
1d700 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 26 26 20 6c  mp->nsymbol && l
1d710 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
1d720 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 3b  >type!=TERMINAL;
1d730 20 69 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 69   i++);.    if( i
1d740 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29  <lemp->nsymbol )
1d750 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65 73  {.      emit_des
1d760 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74  tructor_code(out
1d770 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
1d780 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b  ],lemp,&lineno);
1d790 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1d7a0 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b  ut,"      break;
1d7b0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1d7c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1d7d0 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29 7b  lemp->vardest ){
1d7e0 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62  .    struct symb
1d7f0 6f 6c 20 2a 64 66 6c 74 5f 73 70 20 3d 20 30 3b  ol *dflt_sp = 0;
1d800 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20  .    int once = 
1d810 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  1;.    for(i=0; 
1d820 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
1d830 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
1d840 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
1d850 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
1d860 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d  ];.      if( sp=
1d870 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d  =0 || sp->type==
1d880 54 45 52 4d 49 4e 41 4c 20 7c 7c 0a 20 20 20 20  TERMINAL ||.    
1d890 20 20 20 20 20 20 73 70 2d 3e 69 6e 64 65 78 3c        sp->index<
1d8a0 3d 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75  =0 || sp->destru
1d8b0 63 74 6f 72 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ctor!=0 ) contin
1d8c0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e  ue;.      if( on
1d8d0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  ce ){.        fp
1d8e0 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20  rintf(out, "    
1d8f0 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 4e 4f 4e    /* Default NON
1d900 2d 54 45 52 4d 49 4e 41 4c 20 44 65 73 74 72 75  -TERMINAL Destru
1d910 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e  ctor */\n"); lin
1d920 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6f  eno++;.        o
1d930 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nce = 0;.      }
1d940 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1d950 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a  ut,"    case %d:
1d960 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73 70   /* %s */\n", sp
1d970 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d  ->index, sp->nam
1d980 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
1d990 20 20 20 20 64 66 6c 74 5f 73 70 20 3d 20 73 70      dflt_sp = sp
1d9a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1d9b0 64 66 6c 74 5f 73 70 21 3d 30 20 29 7b 0a 20 20  dflt_sp!=0 ){.  
1d9c0 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63      emit_destruc
1d9d0 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 64 66 6c  tor_code(out,dfl
1d9e0 74 5f 73 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e  t_sp,lemp,&linen
1d9f0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  o);.    }.    fp
1da00 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
1da10 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
1da20 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72  eno++;.  }.  for
1da30 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1da40 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
1da50 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1da60 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
1da70 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73  ls[i];.    if( s
1da80 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65  p==0 || sp->type
1da90 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70  ==TERMINAL || sp
1daa0 2d 3e 64 65 73 74 72 75 63 74 6f 72 3d 3d 30 20  ->destructor==0 
1dab0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1dac0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1dad0 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20   case %d: /* %s 
1dae0 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78  */\n", sp->index
1daf0 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e  , sp->name); lin
1db00 65 6e 6f 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 43  eno++;..    /* C
1db10 6f 6d 62 69 6e 65 20 64 75 70 6c 69 63 61 74 65  ombine duplicate
1db20 20 64 65 73 74 72 75 63 74 6f 72 73 20 69 6e 74   destructors int
1db30 6f 20 61 20 73 69 6e 67 6c 65 20 63 61 73 65 20  o a single case 
1db40 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31  */.    for(j=i+1
1db50 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; j<lemp->nsymbo
1db60 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; j++){.      s
1db70 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
1db80 32 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  2 = lemp->symbol
1db90 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  s[j];.      if( 
1dba0 73 70 32 20 26 26 20 73 70 32 2d 3e 74 79 70 65  sp2 && sp2->type
1dbb0 21 3d 54 45 52 4d 49 4e 41 4c 20 26 26 20 73 70  !=TERMINAL && sp
1dbc0 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 0a 20 20  2->destructor.  
1dbd0 20 20 20 20 20 20 20 20 26 26 20 73 70 32 2d 3e          && sp2->
1dbe0 64 74 6e 75 6d 3d 3d 73 70 2d 3e 64 74 6e 75 6d  dtnum==sp->dtnum
1dbf0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 74  .          && st
1dc00 72 63 6d 70 28 73 70 2d 3e 64 65 73 74 72 75 63  rcmp(sp->destruc
1dc10 74 6f 72 2c 73 70 32 2d 3e 64 65 73 74 72 75 63  tor,sp2->destruc
1dc20 74 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tor)==0 ){.     
1dc30 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1dc40 22 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a  "    case %d: /*
1dc50 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20   %s */\n",.     
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 73 70 32 2d              sp2-
1dc70 3e 69 6e 64 65 78 2c 20 73 70 32 2d 3e 6e 61 6d  >index, sp2->nam
1dc80 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
1dc90 20 20 20 20 20 20 20 73 70 32 2d 3e 64 65 73 74         sp2->dest
1dca0 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20  ructor = 0;.    
1dcb0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65    }.    }..    e
1dcc0 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  mit_destructor_c
1dcd0 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79  ode(out,lemp->sy
1dce0 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c  mbols[i],lemp,&l
1dcf0 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69  ineno);.    fpri
1dd00 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62  ntf(out,"      b
1dd10 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
1dd20 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
1dd30 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1dd40 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1dd50 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1dd60 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
1dd70 74 65 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  tes whenever the
1dd80 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 6f 76   parser stack ov
1dd90 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 74 70 6c  erflows */.  tpl
1dda0 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
1ddb0 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77 2c  ,lemp->overflow,
1ddc0 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74  &lineno);.  tplt
1ddd0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1dde0 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1ddf0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1de00 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 72 75   the table of ru
1de10 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a  le information .
1de20 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20    **.  ** Note: 
1de30 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64  This code depend
1de40 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
1de50 61 74 20 72 75 6c 65 73 20 61 72 65 20 6e 75 6d  at rules are num
1de60 62 65 72 0a 20 20 2a 2a 20 73 65 71 75 65 6e 74  ber.  ** sequent
1de70 75 61 6c 6c 79 20 62 65 67 69 6e 6e 69 6e 67 20  ually beginning 
1de80 77 69 74 68 20 30 2e 0a 20 20 2a 2f 0a 20 20 66  with 0..  */.  f
1de90 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
1dea0 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
1deb0 74 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  t){.    fprintf(
1dec0 6f 75 74 2c 22 20 20 7b 20 25 64 2c 20 25 64 20  out,"  { %d, %d 
1ded0 7d 2c 5c 6e 22 2c 72 70 2d 3e 6c 68 73 2d 3e 69  },\n",rp->lhs->i
1dee0 6e 64 65 78 2c 72 70 2d 3e 6e 72 68 73 29 3b 20  ndex,rp->nrhs); 
1def0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1df00 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1df10 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1df20 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1df30 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
1df40 65 78 65 63 75 74 69 6f 6e 20 64 75 72 69 6e 67  execution during
1df50 20 65 61 63 68 20 52 45 44 55 43 45 20 61 63 74   each REDUCE act
1df60 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d  ion */.  for(rp=
1df70 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
1df80 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
1df90 20 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65    translate_code
1dfa0 28 6c 65 6d 70 2c 20 72 70 29 3b 0a 20 20 7d 0a  (lemp, rp);.  }.
1dfb0 20 20 2f 2a 20 46 69 72 73 74 20 6f 75 74 70 75    /* First outpu
1dfc0 74 20 72 75 6c 65 73 20 6f 74 68 65 72 20 74 68  t rules other th
1dfd0 61 6e 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20  an the default: 
1dfe0 72 75 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 72 70  rule */.  for(rp
1dff0 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
1e000 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
1e010 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a     struct rule *
1e020 72 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  rp2;            
1e030 20 20 20 2f 2a 20 4f 74 68 65 72 20 72 75 6c 65     /* Other rule
1e040 73 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  s with the same 
1e050 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  action */.    if
1e060 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 20  ( rp->code==0 ) 
1e070 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
1e080 28 20 72 70 2d 3e 63 6f 64 65 5b 30 5d 3d 3d 27  ( rp->code[0]=='
1e090 5c 6e 27 20 26 26 20 72 70 2d 3e 63 6f 64 65 5b  \n' && rp->code[
1e0a0 31 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  1]==0 ) continue
1e0b0 3b 20 2f 2a 20 57 69 6c 6c 20 62 65 20 64 65 66  ; /* Will be def
1e0c0 61 75 6c 74 3a 20 2a 2f 0a 20 20 20 20 66 70 72  ault: */.    fpr
1e0d0 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
1e0e0 63 61 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72  case %d: /* ", r
1e0f0 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 77  p->index);.    w
1e100 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74  riteRuleText(out
1e110 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e  , rp);.    fprin
1e120 74 66 28 6f 75 74 2c 20 22 20 2a 2f 5c 6e 22 29  tf(out, " */\n")
1e130 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1e140 66 6f 72 28 72 70 32 3d 72 70 2d 3e 6e 65 78 74  for(rp2=rp->next
1e150 3b 20 72 70 32 3b 20 72 70 32 3d 72 70 32 2d 3e  ; rp2; rp2=rp2->
1e160 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
1e170 20 72 70 32 2d 3e 63 6f 64 65 3d 3d 72 70 2d 3e   rp2->code==rp->
1e180 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  code ){.        
1e190 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1e1a0 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 22     case %d: /* "
1e1b0 2c 20 72 70 32 2d 3e 69 6e 64 65 78 29 3b 0a 20  , rp2->index);. 
1e1c0 20 20 20 20 20 20 20 77 72 69 74 65 52 75 6c 65         writeRule
1e1d0 54 65 78 74 28 6f 75 74 2c 20 72 70 32 29 3b 0a  Text(out, rp2);.
1e1e0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1e1f0 6f 75 74 2c 22 20 2a 2f 20 79 79 74 65 73 74 63  out," */ yytestc
1e200 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d 25 64  ase(yyruleno==%d
1e210 29 3b 5c 6e 22 2c 20 72 70 32 2d 3e 69 6e 64 65  );\n", rp2->inde
1e220 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  x); lineno++;.  
1e230 20 20 20 20 20 20 72 70 32 2d 3e 63 6f 64 65 20        rp2->code 
1e240 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1e250 20 7d 0a 20 20 20 20 65 6d 69 74 5f 63 6f 64 65   }.    emit_code
1e260 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c 69  (out,rp,lemp,&li
1e270 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e  neno);.    fprin
1e280 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20  tf(out,"        
1e290 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65  break;\n"); line
1e2a0 6e 6f 2b 2b 3b 0a 20 20 20 20 72 70 2d 3e 63 6f  no++;.    rp->co
1e2b0 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  de = 0;.  }.  /*
1e2c0 20 46 69 6e 61 6c 6c 79 2c 20 6f 75 74 70 75 74   Finally, output
1e2d0 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20 72 75   the default: ru
1e2e0 6c 65 2e 20 20 57 65 20 63 68 6f 6f 73 65 20 61  le.  We choose a
1e2f0 73 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20 61  s the default: a
1e300 6c 6c 0a 20 20 2a 2a 20 65 6d 70 74 79 20 61 63  ll.  ** empty ac
1e310 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 66 70 72 69  tions. */.  fpri
1e320 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 64  ntf(out,"      d
1e330 65 66 61 75 6c 74 3a 5c 6e 22 29 3b 20 6c 69 6e  efault:\n"); lin
1e340 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 72 70 3d  eno++;.  for(rp=
1e350 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
1e360 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
1e370 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d    if( rp->code==
1e380 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1e390 20 20 61 73 73 65 72 74 28 20 72 70 2d 3e 63 6f    assert( rp->co
1e3a0 64 65 5b 30 5d 3d 3d 27 5c 6e 27 20 26 26 20 72  de[0]=='\n' && r
1e3b0 70 2d 3e 63 6f 64 65 5b 31 5d 3d 3d 30 20 29 3b  p->code[1]==0 );
1e3c0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1e3d0 2c 22 20 20 20 20 20 20 2f 2a 20 28 25 64 29 20  ,"      /* (%d) 
1e3e0 22 2c 20 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20  ", rp->index);. 
1e3f0 20 20 20 77 72 69 74 65 52 75 6c 65 54 65 78 74     writeRuleText
1e400 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66  (out, rp);.    f
1e410 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f  printf(out, " */
1e420 20 79 79 74 65 73 74 63 61 73 65 28 79 79 72 75   yytestcase(yyru
1e430 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72  leno==%d);\n", r
1e440 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e  p->index); linen
1e450 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  o++;.  }.  fprin
1e460 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20  tf(out,"        
1e470 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65  break;\n"); line
1e480 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65  no++;.  tplt_xfe
1e490 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1e4a0 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1e4b0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1e4c0 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
1e4d0 20 69 66 20 61 20 70 61 72 73 65 20 66 61 69 6c   if a parse fail
1e4e0 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  s */.  tplt_prin
1e4f0 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
1e500 3e 66 61 69 6c 75 72 65 2c 26 6c 69 6e 65 6e 6f  >failure,&lineno
1e510 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
1e520 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1e530 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1e540 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
1e550 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
1e560 65 6e 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  en a syntax erro
1e570 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 74 70  r occurs */.  tp
1e580 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d  lt_print(out,lem
1e590 70 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 2c 26 6c  p,lemp->error,&l
1e5a0 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78  ineno);.  tplt_x
1e5b0 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1e5c0 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1e5d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1e5e0 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
1e5f0 65 73 20 77 68 65 6e 20 74 68 65 20 70 61 72 73  es when the pars
1e600 65 72 20 61 63 63 65 70 74 73 20 69 74 73 20 69  er accepts its i
1e610 6e 70 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f 70  nput */.  tplt_p
1e620 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
1e630 6d 70 2d 3e 61 63 63 65 70 74 2c 26 6c 69 6e 65  mp->accept,&line
1e640 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  no);.  tplt_xfer
1e650 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1e660 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1e670 2f 2a 20 41 70 70 65 6e 64 20 61 6e 79 20 61 64  /* Append any ad
1e680 64 69 74 69 6f 6e 20 63 6f 64 65 20 74 68 65 20  dition code the 
1e690 75 73 65 72 20 64 65 73 69 72 65 73 20 2a 2f 0a  user desires */.
1e6a0 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
1e6b0 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74 72  ,lemp,lemp->extr
1e6c0 61 63 6f 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  acode,&lineno);.
1e6d0 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20  .  fclose(in);. 
1e6e0 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
1e6f0 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65  return;.}../* Ge
1e700 6e 65 72 61 74 65 20 61 20 68 65 61 64 65 72 20  nerate a header 
1e710 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 72  file for the par
1e720 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f  ser */.void Repo
1e730 72 74 48 65 61 64 65 72 28 73 74 72 75 63 74 20  rtHeader(struct 
1e740 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
1e750 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b   FILE *out, *in;
1e760 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
1e770 72 65 66 69 78 3b 0a 20 20 63 68 61 72 20 6c 69  refix;.  char li
1e780 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20  ne[LINESIZE];.  
1e790 63 68 61 72 20 70 61 74 74 65 72 6e 5b 4c 49 4e  char pattern[LIN
1e7a0 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b  ESIZE];.  int i;
1e7b0 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f  ..  if( lemp->to
1e7c0 6b 65 6e 70 72 65 66 69 78 20 29 20 70 72 65 66  kenprefix ) pref
1e7d0 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  ix = lemp->token
1e7e0 70 72 65 66 69 78 3b 0a 20 20 65 6c 73 65 20 20  prefix;.  else  
1e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e800 20 20 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20    prefix = "";. 
1e810 20 69 6e 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28   in = file_open(
1e820 6c 65 6d 70 2c 22 2e 68 22 2c 22 72 62 22 29 3b  lemp,".h","rb");
1e830 0a 20 20 69 66 28 20 69 6e 20 29 7b 0a 20 20 20  .  if( in ){.   
1e840 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70   for(i=1; i<lemp
1e850 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20 66  ->nterminal && f
1e860 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49  gets(line,LINESI
1e870 5a 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20  ZE,in); i++){.  
1e880 20 20 20 20 73 70 72 69 6e 74 66 28 70 61 74 74      sprintf(patt
1e890 65 72 6e 2c 22 23 64 65 66 69 6e 65 20 25 73 25  ern,"#define %s%
1e8a0 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66  -30s %2d\n",pref
1e8b0 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ix,lemp->symbols
1e8c0 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20  [i]->name,i);.  
1e8d0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6c      if( strcmp(l
1e8e0 69 6e 65 2c 70 61 74 74 65 72 6e 29 20 29 20 62  ine,pattern) ) b
1e8f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1e900 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
1e910 69 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65  if( i==lemp->nte
1e920 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  rminal ){.      
1e930 2f 2a 20 4e 6f 20 63 68 61 6e 67 65 20 69 6e 20  /* No change in 
1e940 74 68 65 20 66 69 6c 65 2e 20 20 44 6f 6e 27 74  the file.  Don't
1e950 20 72 65 77 72 69 74 65 20 69 74 2e 20 2a 2f 0a   rewrite it. */.
1e960 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
1e970 20 20 7d 0a 20 20 7d 0a 20 20 6f 75 74 20 3d 20    }.  }.  out = 
1e980 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22  file_open(lemp,"
1e990 2e 68 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28  .h","wb");.  if(
1e9a0 20 6f 75 74 20 29 7b 0a 20 20 20 20 66 6f 72 28   out ){.    for(
1e9b0 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65  i=1; i<lemp->nte
1e9c0 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  rminal; i++){.  
1e9d0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1e9e0 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73  "#define %s%-30s
1e9f0 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c   %2d\n",prefix,l
1ea00 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
1ea10 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 7d 0a  >name,i);.    }.
1ea20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
1ea30 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b    .  }.  return;
1ea40 0a 7d 0a 0a 2f 2a 20 52 65 64 75 63 65 20 74 68  .}../* Reduce th
1ea50 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 63  e size of the ac
1ea60 74 69 6f 6e 20 74 61 62 6c 65 73 2c 20 69 66 20  tion tables, if 
1ea70 70 6f 73 73 69 62 6c 65 2c 20 62 79 20 6d 61 6b  possible, by mak
1ea80 69 6e 67 20 75 73 65 0a 2a 2a 20 6f 66 20 64 65  ing use.** of de
1ea90 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  faults..**.** In
1eaa0 20 74 68 69 73 20 76 65 72 73 69 6f 6e 2c 20 77   this version, w
1eab0 65 20 74 61 6b 65 20 74 68 65 20 6d 6f 73 74 20  e take the most 
1eac0 66 72 65 71 75 65 6e 74 20 52 45 44 55 43 45 20  frequent REDUCE 
1ead0 61 63 74 69 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a  action and make.
1eae0 2a 2a 20 69 74 20 74 68 65 20 64 65 66 61 75 6c  ** it the defaul
1eaf0 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65 72  t.  Except, ther
1eb00 65 20 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20  e is no default 
1eb10 69 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 20  if the wildcard 
1eb20 74 6f 6b 65 6e 0a 2a 2a 20 69 73 20 61 20 70 6f  token.** is a po
1eb30 73 73 69 62 6c 65 20 6c 6f 6f 6b 2d 61 68 65 61  ssible look-ahea
1eb40 64 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d 70 72  d..*/.void Compr
1eb50 65 73 73 54 61 62 6c 65 73 28 73 74 72 75 63 74  essTables(struct
1eb60 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a   lemon *lemp).{.
1eb70 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
1eb80 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63  stp;.  struct ac
1eb90 74 69 6f 6e 20 2a 61 70 2c 20 2a 61 70 32 3b 0a  tion *ap, *ap2;.
1eba0 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
1ebb0 70 2c 20 2a 72 70 32 2c 20 2a 72 62 65 73 74 3b  p, *rp2, *rbest;
1ebc0 0a 20 20 69 6e 74 20 6e 62 65 73 74 2c 20 6e 3b  .  int nbest, n;
1ebd0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
1ebe0 75 73 65 73 57 69 6c 64 63 61 72 64 3b 0a 0a 20  usesWildcard;.. 
1ebf0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1ec00 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
1ec10 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
1ec20 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6e  sorted[i];.    n
1ec30 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 72 62  best = 0;.    rb
1ec40 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 75 73 65  est = 0;.    use
1ec50 73 57 69 6c 64 63 61 72 64 20 3d 20 30 3b 0a 0a  sWildcard = 0;..
1ec60 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
1ec70 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
1ec80 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
1ec90 61 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20  ap->type==SHIFT 
1eca0 26 26 20 61 70 2d 3e 73 70 3d 3d 6c 65 6d 70 2d  && ap->sp==lemp-
1ecb0 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20  >wildcard ){.   
1ecc0 20 20 20 20 20 75 73 65 73 57 69 6c 64 63 61 72       usesWildcar
1ecd0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
1ece0 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
1ecf0 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e 74  e!=REDUCE ) cont
1ed00 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 70 20 3d  inue;.      rp =
1ed10 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20   ap->x.rp;.     
1ed20 20 69 66 28 20 72 70 2d 3e 6c 68 73 53 74 61 72   if( rp->lhsStar
1ed30 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
1ed40 20 20 20 20 69 66 28 20 72 70 3d 3d 72 62 65 73      if( rp==rbes
1ed50 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
1ed60 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20      n = 1;.     
1ed70 20 66 6f 72 28 61 70 32 3d 61 70 2d 3e 6e 65 78   for(ap2=ap->nex
1ed80 74 3b 20 61 70 32 3b 20 61 70 32 3d 61 70 32 2d  t; ap2; ap2=ap2-
1ed90 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
1eda0 69 66 28 20 61 70 32 2d 3e 74 79 70 65 21 3d 52  if( ap2->type!=R
1edb0 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65  EDUCE ) continue
1edc0 3b 0a 20 20 20 20 20 20 20 20 72 70 32 20 3d 20  ;.        rp2 = 
1edd0 61 70 32 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20  ap2->x.rp;.     
1ede0 20 20 20 69 66 28 20 72 70 32 3d 3d 72 62 65 73     if( rp2==rbes
1edf0 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
1ee00 20 20 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72        if( rp2==r
1ee10 70 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d  p ) n++;.      }
1ee20 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 62 65  .      if( n>nbe
1ee30 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 62  st ){.        nb
1ee40 65 73 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  est = n;.       
1ee50 20 72 62 65 73 74 20 3d 20 72 70 3b 0a 20 20 20   rbest = rp;.   
1ee60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 0a 20 20 20     }.    }. .   
1ee70 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b 65 20   /* Do not make 
1ee80 61 20 64 65 66 61 75 6c 74 20 69 66 20 74 68 65  a default if the
1ee90 20 6e 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73   number of rules
1eea0 20 74 6f 20 64 65 66 61 75 6c 74 0a 20 20 20 20   to default.    
1eeb0 2a 2a 20 69 73 20 6e 6f 74 20 61 74 20 6c 65 61  ** is not at lea
1eec0 73 74 20 31 20 6f 72 20 69 66 20 74 68 65 20 77  st 1 or if the w
1eed0 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e 20 69 73  ildcard token is
1eee0 20 61 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20   a possible.    
1eef0 2a 2a 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20  ** lookahead..  
1ef00 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 62 65    */.    if( nbe
1ef10 73 74 3c 31 20 7c 7c 20 75 73 65 73 57 69 6c 64  st<1 || usesWild
1ef20 63 61 72 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  card ) continue;
1ef30 0a 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e  ...    /* Combin
1ef40 65 20 6d 61 74 63 68 69 6e 67 20 52 45 44 55 43  e matching REDUC
1ef50 45 20 61 63 74 69 6f 6e 73 20 69 6e 74 6f 20 61  E actions into a
1ef60 20 73 69 6e 67 6c 65 20 64 65 66 61 75 6c 74 20   single default 
1ef70 2a 2f 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74  */.    for(ap=st
1ef80 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
1ef90 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
1efa0 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44  f( ap->type==RED
1efb0 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d  UCE && ap->x.rp=
1efc0 3d 72 62 65 73 74 20 29 20 62 72 65 61 6b 3b 0a  =rbest ) break;.
1efd0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1efe0 28 20 61 70 20 29 3b 0a 20 20 20 20 61 70 2d 3e  ( ap );.    ap->
1eff0 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
1f000 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20  "{default}");.  
1f010 20 20 66 6f 72 28 61 70 3d 61 70 2d 3e 6e 65 78    for(ap=ap->nex
1f020 74 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  t; ap; ap=ap->ne
1f030 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  xt){.      if( a
1f040 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  p->type==REDUCE 
1f050 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65  && ap->x.rp==rbe
1f060 73 74 20 29 20 61 70 2d 3e 74 79 70 65 20 3d 20  st ) ap->type = 
1f070 4e 4f 54 5f 55 53 45 44 3b 0a 20 20 20 20 7d 0a  NOT_USED;.    }.
1f080 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63      stp->ap = Ac
1f090 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61  tion_sort(stp->a
1f0a0 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  p);.  }.}.../*.*
1f0b0 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74  * Compare two st
1f0c0 61 74 65 73 20 66 6f 72 20 73 6f 72 74 69 6e 67  ates for sorting
1f0d0 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20   purposes.  The 
1f0e0 73 6d 61 6c 6c 65 72 20 73 74 61 74 65 20 69 73  smaller state is
1f0f0 20 74 68 65 0a 2a 2a 20 6f 6e 65 20 77 69 74 68   the.** one with
1f100 20 74 68 65 20 6d 6f 73 74 20 6e 6f 6e 2d 74 65   the most non-te
1f110 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2e 20  rminal actions. 
1f120 20 49 66 20 74 68 65 79 20 68 61 76 65 20 74 68   If they have th
1f130 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
1f140 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c   of non-terminal
1f150 20 61 63 74 69 6f 6e 73 2c 20 74 68 65 6e 20 74   actions, then t
1f160 68 65 20 73 6d 61 6c 6c 65 72 20 69 73 20 74 68  he smaller is th
1f170 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d  e one with the m
1f180 6f 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 61 63 74  ost.** token act
1f190 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
1f1a0 69 6e 74 20 73 74 61 74 65 52 65 73 6f 72 74 43  int stateResortC
1f1b0 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69  ompare(const voi
1f1c0 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64  d *a, const void
1f1d0 20 2a 62 29 7b 0a 20 20 63 6f 6e 73 74 20 73 74   *b){.  const st
1f1e0 72 75 63 74 20 73 74 61 74 65 20 2a 70 41 20 3d  ruct state *pA =
1f1f0 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20   *(const struct 
1f200 73 74 61 74 65 2a 2a 29 61 3b 0a 20 20 63 6f 6e  state**)a;.  con
1f210 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65 20  st struct state 
1f220 2a 70 42 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74  *pB = *(const st
1f230 72 75 63 74 20 73 74 61 74 65 2a 2a 29 62 3b 0a  ruct state**)b;.
1f240 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d 20    int n;..  n = 
1f250 70 42 2d 3e 6e 4e 74 41 63 74 20 2d 20 70 41 2d  pB->nNtAct - pA-
1f260 3e 6e 4e 74 41 63 74 3b 0a 20 20 69 66 28 20 6e  >nNtAct;.  if( n
1f270 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  ==0 ){.    n = p
1f280 42 2d 3e 6e 54 6b 6e 41 63 74 20 2d 20 70 41 2d  B->nTknAct - pA-
1f290 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20 69 66  >nTknAct;.    if
1f2a0 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
1f2b0 6e 20 3d 20 70 42 2d 3e 73 74 61 74 65 6e 75 6d  n = pB->statenum
1f2c0 20 2d 20 70 41 2d 3e 73 74 61 74 65 6e 75 6d 3b   - pA->statenum;
1f2d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
1f2e0 65 72 74 28 20 6e 21 3d 30 20 29 3b 0a 20 20 72  ert( n!=0 );.  r
1f2f0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn n;.}.../*.
1f300 2a 2a 20 52 65 6e 75 6d 62 65 72 20 61 6e 64 20  ** Renumber and 
1f310 72 65 73 6f 72 74 20 73 74 61 74 65 73 20 73 6f  resort states so
1f320 20 74 68 61 74 20 73 74 61 74 65 73 20 77 69 74   that states wit
1f330 68 20 66 65 77 65 72 20 63 68 6f 69 63 65 73 0a  h fewer choices.
1f340 2a 2a 20 6f 63 63 75 72 20 61 74 20 74 68 65 20  ** occur at the 
1f350 65 6e 64 2e 20 20 45 78 63 65 70 74 2c 20 6b 65  end.  Except, ke
1f360 65 70 20 73 74 61 74 65 20 30 20 61 73 20 74 68  ep state 0 as th
1f370 65 20 66 69 72 73 74 20 73 74 61 74 65 2e 0a 2a  e first state..*
1f380 2f 0a 76 6f 69 64 20 52 65 73 6f 72 74 53 74 61  /.void ResortSta
1f390 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  tes(struct lemon
1f3a0 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20   *lemp).{.  int 
1f3b0 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
1f3c0 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74  e *stp;.  struct
1f3d0 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 0a 20 20   action *ap;..  
1f3e0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1f3f0 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
1f400 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
1f410 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 73 74  orted[i];.    st
1f420 70 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20 73 74 70  p->nTknAct = stp
1f430 2d 3e 6e 4e 74 41 63 74 20 3d 20 30 3b 0a 20 20  ->nNtAct = 0;.  
1f440 20 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 6c    stp->iDflt = l
1f450 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65  emp->nstate + le
1f460 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20 20 73  mp->nrule;.    s
1f470 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 4e  tp->iTknOfst = N
1f480 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 73 74  O_OFFSET;.    st
1f490 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f  p->iNtOfst = NO_
1f4a0 4f 46 46 53 45 54 3b 0a 20 20 20 20 66 6f 72 28  OFFSET;.    for(
1f4b0 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
1f4c0 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
1f4d0 20 20 20 20 69 66 28 20 63 6f 6d 70 75 74 65 5f      if( compute_
1f4e0 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 3e  action(lemp,ap)>
1f4f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
1f500 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c  ( ap->sp->index<
1f510 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  lemp->nterminal 
1f520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 70  ){.          stp
1f530 2d 3e 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20 20 20  ->nTknAct++;.   
1f540 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
1f550 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d  p->sp->index<lem
1f560 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20  p->nsymbol ){.  
1f570 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 4e 74          stp->nNt
1f580 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  Act++;.        }
1f590 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f5a0 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 63 6f 6d  stp->iDflt = com
1f5b0 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70  pute_action(lemp
1f5c0 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  , ap);.        }
1f5d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f5e0 20 7d 0a 20 20 71 73 6f 72 74 28 26 6c 65 6d 70   }.  qsort(&lemp
1f5f0 2d 3e 73 6f 72 74 65 64 5b 31 5d 2c 20 6c 65 6d  ->sorted[1], lem
1f600 70 2d 3e 6e 73 74 61 74 65 2d 31 2c 20 73 69 7a  p->nstate-1, siz
1f610 65 6f 66 28 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  eof(lemp->sorted
1f620 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 20 73 74  [0]),.        st
1f630 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65  ateResortCompare
1f640 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1f650 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
1f660 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 6f  +){.    lemp->so
1f670 72 74 65 64 5b 69 5d 2d 3e 73 74 61 74 65 6e 75  rted[i]->statenu
1f680 6d 20 3d 20 69 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  m = i;.  }.}.../
1f690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f6a0 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
1f6b0 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  "set.c" ********
1f6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f6d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
1f6e0 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70 75 6c 61  .** Set manipula
1f6f0 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 66 6f  tion routines fo
1f700 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
1f710 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
1f720 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 7a  ..static int siz
1f730 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74 20 74  e = 0;../* Set t
1f740 68 65 20 73 65 74 20 73 69 7a 65 20 2a 2f 0a 76  he set size */.v
1f750 6f 69 64 20 53 65 74 53 69 7a 65 28 69 6e 74 20  oid SetSize(int 
1f760 6e 29 0a 7b 0a 20 20 73 69 7a 65 20 3d 20 6e 2b  n).{.  size = n+
1f770 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  1;.}../* Allocat
1f780 65 20 61 20 6e 65 77 20 73 65 74 20 2a 2f 0a 63  e a new set */.c
1f790 68 61 72 20 2a 53 65 74 4e 65 77 28 29 7b 0a 20  har *SetNew(){. 
1f7a0 20 63 68 61 72 20 2a 73 3b 0a 20 20 73 20 3d 20   char *s;.  s = 
1f7b0 28 63 68 61 72 2a 29 63 61 6c 6c 6f 63 28 20 73  (char*)calloc( s
1f7c0 69 7a 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73  ize, 1);.  if( s
1f7d0 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65 72  ==0 ){.    exter
1f7e0 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72  n void memory_er
1f7f0 72 6f 72 28 29 3b 0a 20 20 20 20 6d 65 6d 6f 72  ror();.    memor
1f800 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20  y_error();.  }. 
1f810 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a   return s;.}../*
1f820 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65   Deallocate a se
1f830 74 20 2a 2f 0a 76 6f 69 64 20 53 65 74 46 72 65  t */.void SetFre
1f840 65 28 63 68 61 72 20 2a 73 29 0a 7b 0a 20 20 66  e(char *s).{.  f
1f850 72 65 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64  ree(s);.}../* Ad
1f860 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
1f870 74 6f 20 74 68 65 20 73 65 74 2e 20 20 52 65 74  to the set.  Ret
1f880 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1f890 65 6c 65 6d 65 6e 74 20 77 61 73 20 61 64 64 65  element was adde
1f8a0 64 0a 2a 2a 20 61 6e 64 20 46 41 4c 53 45 20 69  d.** and FALSE i
1f8b0 66 20 69 74 20 77 61 73 20 61 6c 72 65 61 64 79  f it was already
1f8c0 20 74 68 65 72 65 2e 20 2a 2f 0a 69 6e 74 20 53   there. */.int S
1f8d0 65 74 41 64 64 28 63 68 61 72 20 2a 73 2c 20 69  etAdd(char *s, i
1f8e0 6e 74 20 65 29 0a 7b 0a 20 20 69 6e 74 20 72 76  nt e).{.  int rv
1f8f0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 3e 3d 30  ;.  assert( e>=0
1f900 20 26 26 20 65 3c 73 69 7a 65 20 29 3b 0a 20 20   && e<size );.  
1f910 72 76 20 3d 20 73 5b 65 5d 3b 0a 20 20 73 5b 65  rv = s[e];.  s[e
1f920 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 1;.  return 
1f930 21 72 76 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 65  !rv;.}../* Add e
1f940 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
1f950 73 32 20 74 6f 20 73 31 2e 20 20 52 65 74 75 72  s2 to s1.  Retur
1f960 6e 20 54 52 55 45 20 69 66 20 73 31 20 63 68 61  n TRUE if s1 cha
1f970 6e 67 65 73 2e 20 2a 2f 0a 69 6e 74 20 53 65 74  nges. */.int Set
1f980 55 6e 69 6f 6e 28 63 68 61 72 20 2a 73 31 2c 20  Union(char *s1, 
1f990 63 68 61 72 20 2a 73 32 29 0a 7b 0a 20 20 69 6e  char *s2).{.  in
1f9a0 74 20 69 2c 20 70 72 6f 67 72 65 73 73 3b 0a 20  t i, progress;. 
1f9b0 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20   progress = 0;. 
1f9c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
1f9d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1f9e0 73 32 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  s2[i]==0 ) conti
1f9f0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 31 5b  nue;.    if( s1[
1fa00 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  i]==0 ){.      p
1fa10 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20  rogress = 1;.   
1fa20 20 20 20 73 31 5b 69 5d 20 3d 20 31 3b 0a 20 20     s1[i] = 1;.  
1fa30 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1fa40 20 70 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f 2a 2a   progress;.}./**
1fa50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fa60 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
1fa70 6c 65 20 22 74 61 62 6c 65 2e 63 22 20 2a 2a 2a  le "table.c" ***
1fa80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fa90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
1faa0 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69   All code in thi
1fab0 73 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  s file has been 
1fac0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
1fad0 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  nerated.** from 
1fae0 61 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  a specification 
1faf0 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20  in the file.**  
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 22 74 61 62              "tab
1fb10 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20  le.q".** by the 
1fb20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
1fb30 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20  y code building 
1fb40 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e  program "aagen".
1fb50 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20  .** Do not edit 
1fb60 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74  this file!  Inst
1fb70 65 61 64 2c 20 65 64 69 74 20 74 68 65 20 73 70  ead, edit the sp
1fb80 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66  ecification.** f
1fb90 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20  ile, then rerun 
1fba0 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  aagen..*/./*.** 
1fbb0 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73  Code for process
1fbc0 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68  ing tables in th
1fbd0 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
1fbe0 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 50 52  enerator..*/..PR
1fbf0 49 56 41 54 45 20 69 6e 74 20 73 74 72 68 61 73  IVATE int strhas
1fc00 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 29  h(const char *x)
1fc10 0a 7b 0a 20 20 69 6e 74 20 68 20 3d 20 30 3b 0a  .{.  int h = 0;.
1fc20 20 20 77 68 69 6c 65 28 20 2a 78 29 20 68 20 3d    while( *x) h =
1fc30 20 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b 0a   h*13 + *(x++);.
1fc40 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f    return h;.}../
1fc50 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74 72  * Works like str
1fc60 64 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20 53  dup, sort of.  S
1fc70 61 76 65 20 61 20 73 74 72 69 6e 67 20 69 6e 20  ave a string in 
1fc80 6d 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79 2c  malloced memory,
1fc90 20 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74 72   but.** keep str
1fca0 69 6e 67 73 20 69 6e 20 61 20 74 61 62 6c 65 20  ings in a table 
1fcb0 73 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  so that the same
1fcc0 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 69   string is not i
1fcd0 6e 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f  n more.** than o
1fce0 6e 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 6f 6e  ne place..*/.con
1fcf0 73 74 20 63 68 61 72 20 2a 53 74 72 73 61 66 65  st char *Strsafe
1fd00 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 79 29 0a  (const char *y).
1fd10 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1fd20 7a 3b 0a 20 20 63 68 61 72 20 2a 63 70 79 3b 0a  z;.  char *cpy;.
1fd30 0a 20 20 69 66 28 20 79 3d 3d 30 20 29 20 72 65  .  if( y==0 ) re
1fd40 74 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20 53 74  turn 0;.  z = St
1fd50 72 73 61 66 65 5f 66 69 6e 64 28 79 29 3b 0a 20  rsafe_find(y);. 
1fd60 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 28 63 70   if( z==0 && (cp
1fd70 79 3d 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63  y=(char *)malloc
1fd80 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 79 29  ( lemonStrlen(y)
1fd90 2b 31 20 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  +1 ))!=0 ){.    
1fda0 73 74 72 63 70 79 28 63 70 79 2c 79 29 3b 0a 20  strcpy(cpy,y);. 
1fdb0 20 20 20 7a 20 3d 20 63 70 79 3b 0a 20 20 20 20     z = cpy;.    
1fdc0 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28 7a  Strsafe_insert(z
1fdd0 29 3b 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72 79 43  );.  }.  MemoryC
1fde0 68 65 63 6b 28 7a 29 3b 0a 20 20 72 65 74 75 72  heck(z);.  retur
1fdf0 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65  n z;.}../* There
1fe00 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
1fe10 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1fe20 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  g structure for 
1fe30 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74  each.** associat
1fe40 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
1fe50 65 20 22 78 31 22 2e 0a 2a 2f 0a 73 74 72 75 63  e "x1"..*/.struc
1fe60 74 20 73 5f 78 31 20 7b 0a 20 20 69 6e 74 20 73  t s_x1 {.  int s
1fe70 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1fe80 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
1fe90 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c   of available sl
1fea0 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ots. */.        
1feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fec0 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61    /*   Must be a
1fed0 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61   power of 2 grea
1fee0 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20  ter than or */. 
1fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff00 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71           /*   eq
1ff10 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e  ual to 1 */.  in
1ff20 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  t count;        
1ff30 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1ff40 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f  of currently slo
1ff50 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73  ts filled */.  s
1ff60 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a  truct s_x1node *
1ff70 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  tbl;  /* The dat
1ff80 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f  a stored here */
1ff90 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f  .  struct s_x1no
1ffa0 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73  de **ht;  /* Has
1ffb0 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b  h table for look
1ffc0 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68  ups */.};../* Th
1ffd0 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
1ffe0 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
1fff0 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20  cture for every 
20000 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20  data element.** 
20010 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76  in an associativ
20020 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
20030 22 78 31 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  "x1"..*/.typedef
20040 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
20050 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
20060 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 2f 2a  *data;        /*
20070 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73   The data */.  s
20080 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a  truct s_x1node *
20090 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20  next;   /* Next 
200a0 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
200b0 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74  ame hash */.  st
200c0 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a  ruct s_x1node **
200d0 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f  from;  /* Previo
200e0 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e  us link */.} x1n
200f0 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  ode;../* There i
20100 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61  s only one insta
20110 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  nce of the array
20120 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66  , which is the f
20130 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74  ollowing */.stat
20140 69 63 20 73 74 72 75 63 74 20 73 5f 78 31 20 2a  ic struct s_x1 *
20150 78 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  x1a;../* Allocat
20160 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74  e a new associat
20170 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69  ive array */.voi
20180 64 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29  d Strsafe_init()
20190 7b 0a 20 20 69 66 28 20 78 31 61 20 29 20 72 65  {.  if( x1a ) re
201a0 74 75 72 6e 3b 0a 20 20 78 31 61 20 3d 20 28 73  turn;.  x1a = (s
201b0 74 72 75 63 74 20 73 5f 78 31 2a 29 6d 61 6c 6c  truct s_x1*)mall
201c0 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
201d0 74 20 73 5f 78 31 29 20 29 3b 0a 20 20 69 66 28  t s_x1) );.  if(
201e0 20 78 31 61 20 29 7b 0a 20 20 20 20 78 31 61 2d   x1a ){.    x1a-
201f0 3e 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  >size = 1024;.  
20200 20 20 78 31 61 2d 3e 63 6f 75 6e 74 20 3d 20 30    x1a->count = 0
20210 3b 0a 20 20 20 20 78 31 61 2d 3e 74 62 6c 20 3d  ;.    x1a->tbl =
20220 20 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63   (x1node*)malloc
20230 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66  ( .      (sizeof
20240 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x1node) + sizeo
20250 66 28 78 31 6e 6f 64 65 2a 29 29 2a 31 30 32 34  f(x1node*))*1024
20260 20 29 3b 0a 20 20 20 20 69 66 28 20 78 31 61 2d   );.    if( x1a-
20270 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >tbl==0 ){.     
20280 20 66 72 65 65 28 78 31 61 29 3b 0a 20 20 20 20   free(x1a);.    
20290 20 20 78 31 61 20 3d 20 30 3b 0a 20 20 20 20 7d    x1a = 0;.    }
202a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
202b0 69 3b 0a 20 20 20 20 20 20 78 31 61 2d 3e 68 74  i;.      x1a->ht
202c0 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 78   = (x1node**)&(x
202d0 31 61 2d 3e 74 62 6c 5b 31 30 32 34 5d 29 3b 0a  1a->tbl[1024]);.
202e0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
202f0 3c 31 30 32 34 3b 20 69 2b 2b 29 20 78 31 61 2d  <1024; i++) x1a-
20300 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  >ht[i] = 0;.    
20310 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72  }.  }.}./* Inser
20320 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
20330 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20  nto the array.  
20340 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
20350 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72  uccessful..** Pr
20360 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68  ior data with th
20370 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f  e same key is NO
20380 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f  T overwritten */
20390 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73  .int Strsafe_ins
203a0 65 72 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ert(const char *
203b0 64 61 74 61 29 0a 7b 0a 20 20 78 31 6e 6f 64 65  data).{.  x1node
203c0 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20   *np;.  int h;. 
203d0 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20   int ph;..  if( 
203e0 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x1a==0 ) return 
203f0 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73  0;.  ph = strhas
20400 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70  h(data);.  h = p
20410 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31  h & (x1a->size-1
20420 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68  );.  np = x1a->h
20430 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
20440 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  p ){.    if( str
20450 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74  cmp(np->data,dat
20460 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  a)==0 ){.      /
20470 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  * An existing en
20480 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
20490 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20  e key is found. 
204a0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  */.      /* Fail
204b0 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69   because overwri
204c0 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73  te is not allows
204d0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
204e0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 0;.    }.    n
204f0 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
20500 7d 0a 20 20 69 66 28 20 78 31 61 2d 3e 63 6f 75  }.  if( x1a->cou
20510 6e 74 3e 3d 78 31 61 2d 3e 73 69 7a 65 20 29 7b  nt>=x1a->size ){
20520 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
20530 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
20540 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20  ble bigger */.  
20550 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20    int i,size;.  
20560 20 20 73 74 72 75 63 74 20 73 5f 78 31 20 61 72    struct s_x1 ar
20570 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73  ray;.    array.s
20580 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 31 61  ize = size = x1a
20590 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72  ->size*2;.    ar
205a0 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31 61 2d  ray.count = x1a-
205b0 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61  >count;.    arra
205c0 79 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a  y.tbl = (x1node*
205d0 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28  )malloc(.      (
205e0 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b  sizeof(x1node) +
205f0 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29   sizeof(x1node*)
20600 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66  )*size );.    if
20610 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29  ( array.tbl==0 )
20620 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46   return 0;  /* F
20630 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f  ail due to mallo
20640 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20  c failure */.   
20650 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 31 6e   array.ht = (x1n
20660 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62  ode**)&(array.tb
20670 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f  l[size]);.    fo
20680 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69  r(i=0; i<size; i
20690 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20  ++) array.ht[i] 
206a0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
206b0 3b 20 69 3c 78 31 61 2d 3e 63 6f 75 6e 74 3b 20  ; i<x1a->count; 
206c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 31 6e 6f  i++){.      x1no
206d0 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e  de *oldnp, *newn
206e0 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d  p;.      oldnp =
206f0 20 26 28 78 31 61 2d 3e 74 62 6c 5b 69 5d 29 3b   &(x1a->tbl[i]);
20700 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72 68 61  .      h = strha
20710 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20  sh(oldnp->data) 
20720 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20  & (size-1);.    
20730 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61    newnp = &(arra
20740 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  y.tbl[i]);.     
20750 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d   if( array.ht[h]
20760 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e   ) array.ht[h]->
20770 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e  from = &(newnp->
20780 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77  next);.      new
20790 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79  np->next = array
207a0 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65  .ht[h];.      ne
207b0 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e  wnp->data = oldn
207c0 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e  p->data;.      n
207d0 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61  ewnp->from = &(a
207e0 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20  rray.ht[h]);.   
207f0 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d     array.ht[h] =
20800 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20   newnp;.    }.  
20810 20 20 66 72 65 65 28 78 31 61 2d 3e 74 62 6c 29    free(x1a->tbl)
20820 3b 0a 20 20 20 20 2a 78 31 61 20 3d 20 61 72 72  ;.    *x1a = arr
20830 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73  ay;.  }.  /* Ins
20840 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61  ert the new data
20850 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28   */.  h = ph & (
20860 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x1a->size-1);.  
20870 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b  np = &(x1a->tbl[
20880 78 31 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a  x1a->count++]);.
20890 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74    np->data = dat
208a0 61 3b 0a 20 20 69 66 28 20 78 31 61 2d 3e 68 74  a;.  if( x1a->ht
208b0 5b 68 5d 20 29 20 78 31 61 2d 3e 68 74 5b 68 5d  [h] ) x1a->ht[h]
208c0 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e  ->from = &(np->n
208d0 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74  ext);.  np->next
208e0 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x1a->ht[h];. 
208f0 20 78 31 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70   x1a->ht[h] = np
20900 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26  ;.  np->from = &
20910 28 78 31 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20  (x1a->ht[h]);.  
20920 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20  return 1;.}../* 
20930 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
20940 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65   to data assigne
20950 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b  d to the given k
20960 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ey.  Return NULL
20970 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b  .** if no such k
20980 65 79 2e 20 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ey. */.const cha
20990 72 20 2a 53 74 72 73 61 66 65 5f 66 69 6e 64 28  r *Strsafe_find(
209a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 29  const char *key)
209b0 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 31  .{.  int h;.  x1
209c0 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28  node *np;..  if(
209d0 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x1a==0 ) return
209e0 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73   0;.  h = strhas
209f0 68 28 6b 65 79 29 20 26 20 28 78 31 61 2d 3e 73  h(key) & (x1a->s
20a00 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
20a10 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  1a->ht[h];.  whi
20a20 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
20a30 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74  ( strcmp(np->dat
20a40 61 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61  a,key)==0 ) brea
20a50 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e  k;.    np = np->
20a60 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  next;.  }.  retu
20a70 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61  rn np ? np->data
20a80 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75   : 0;.}../* Retu
20a90 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
20aa0 74 68 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f 72  the (terminal or
20ab0 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73 79   nonterminal) sy
20ac0 6d 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72 65  mbol "x"..** Cre
20ad0 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c  ate a new symbol
20ae0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
20af0 66 69 72 73 74 20 74 69 6d 65 20 22 78 22 20 68  first time "x" h
20b00 61 73 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a 2f  as been seen..*/
20b10 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
20b20 53 79 6d 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73 74  Symbol_new(const
20b30 20 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20 73 74   char *x).{.  st
20b40 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
20b50 0a 0a 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f  ..  sp = Symbol_
20b60 66 69 6e 64 28 78 29 3b 0a 20 20 69 66 28 20 73  find(x);.  if( s
20b70 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 70 20 3d  p==0 ){.    sp =
20b80 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20   (struct symbol 
20b90 2a 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65  *)calloc(1, size
20ba0 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
20bb0 29 20 29 3b 0a 20 20 20 20 4d 65 6d 6f 72 79 43  ) );.    MemoryC
20bc0 68 65 63 6b 28 73 70 29 3b 0a 20 20 20 20 73 70  heck(sp);.    sp
20bd0 2d 3e 6e 61 6d 65 20 3d 20 53 74 72 73 61 66 65  ->name = Strsafe
20be0 28 78 29 3b 0a 20 20 20 20 73 70 2d 3e 74 79 70  (x);.    sp->typ
20bf0 65 20 3d 20 69 73 75 70 70 65 72 28 2a 78 29 20  e = isupper(*x) 
20c00 3f 20 54 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e  ? TERMINAL : NON
20c10 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 73 70  TERMINAL;.    sp
20c20 2d 3e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20  ->rule = 0;.    
20c30 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30  sp->fallback = 0
20c40 3b 0a 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d  ;.    sp->prec =
20c50 20 2d 31 3b 0a 20 20 20 20 73 70 2d 3e 61 73 73   -1;.    sp->ass
20c60 6f 63 20 3d 20 55 4e 4b 3b 0a 20 20 20 20 73 70  oc = UNK;.    sp
20c70 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 30 3b 0a  ->firstset = 0;.
20c80 20 20 20 20 73 70 2d 3e 6c 61 6d 62 64 61 20 3d      sp->lambda =
20c90 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20   LEMON_FALSE;.  
20ca0 20 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72    sp->destructor
20cb0 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 65   = 0;.    sp->de
20cc0 73 74 4c 69 6e 65 6e 6f 20 3d 20 30 3b 0a 20 20  stLineno = 0;.  
20cd0 20 20 73 70 2d 3e 64 61 74 61 74 79 70 65 20 3d    sp->datatype =
20ce0 20 30 3b 0a 20 20 20 20 73 70 2d 3e 75 73 65 43   0;.    sp->useC
20cf0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 53 79 6d 62  nt = 0;.    Symb
20d00 6f 6c 5f 69 6e 73 65 72 74 28 73 70 2c 73 70 2d  ol_insert(sp,sp-
20d10 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 70  >name);.  }.  sp
20d20 2d 3e 75 73 65 43 6e 74 2b 2b 3b 0a 20 20 72 65  ->useCnt++;.  re
20d30 74 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a 20 43  turn sp;.}../* C
20d40 6f 6d 70 61 72 65 20 74 77 6f 20 73 79 6d 62 6f  ompare two symbo
20d50 6c 73 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 70  ls for working p
20d60 75 72 70 6f 73 65 73 0a 2a 2a 0a 2a 2a 20 53 79  urposes.**.** Sy
20d70 6d 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69 6e  mbols that begin
20d80 20 77 69 74 68 20 75 70 70 65 72 20 63 61 73 65   with upper case
20d90 20 6c 65 74 74 65 72 73 20 28 74 65 72 6d 69 6e   letters (termin
20da0 61 6c 73 20 6f 72 20 74 6f 6b 65 6e 73 29 0a 2a  als or tokens).*
20db0 2a 20 6d 75 73 74 20 73 6f 72 74 20 62 65 66 6f  * must sort befo
20dc0 72 65 20 73 79 6d 62 6f 6c 73 20 74 68 61 74 20  re symbols that 
20dd0 62 65 67 69 6e 20 77 69 74 68 20 6c 6f 77 65 72  begin with lower
20de0 20 63 61 73 65 20 6c 65 74 74 65 72 73 0a 2a 2a   case letters.**
20df0 20 28 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 29   (non-terminals)
20e00 2e 20 20 4f 74 68 65 72 20 74 68 61 6e 20 74 68  .  Other than th
20e10 61 74 2c 20 74 68 65 20 6f 72 64 65 72 20 64 6f  at, the order do
20e20 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 0a 2a  es not matter..*
20e30 2a 0a 2a 2a 20 57 65 20 66 69 6e 64 20 65 78 70  *.** We find exp
20e40 65 72 69 6d 65 6e 74 61 6c 6c 79 20 74 68 61 74  erimentally that
20e50 20 6c 65 61 76 69 6e 67 20 74 68 65 20 73 79 6d   leaving the sym
20e60 62 6f 6c 73 20 69 6e 20 74 68 65 69 72 20 6f 72  bols in their or
20e70 69 67 69 6e 61 6c 0a 2a 2a 20 6f 72 64 65 72 20  iginal.** order 
20e80 28 74 68 65 20 6f 72 64 65 72 20 74 68 65 79 20  (the order they 
20e90 61 70 70 65 61 72 65 64 20 69 6e 20 74 68 65 20  appeared in the 
20ea0 67 72 61 6d 6d 61 72 20 66 69 6c 65 29 20 67 69  grammar file) gi
20eb0 76 65 73 20 74 68 65 0a 2a 2a 20 73 6d 61 6c 6c  ves the.** small
20ec0 65 73 74 20 70 61 72 73 65 72 20 74 61 62 6c 65  est parser table
20ed0 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a  s in SQLite..*/.
20ee0 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 63  int Symbolcmpp(c
20ef0 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 61 2c 20 63  onst void *_a, c
20f00 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 62 29 0a 7b  onst void *_b).{
20f10 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
20f20 73 79 6d 62 6f 6c 20 2a 2a 61 20 3d 20 28 63 6f  symbol **a = (co
20f30 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f  nst struct symbo
20f40 6c 20 2a 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e 73  l **) _a;.  cons
20f50 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  t struct symbol 
20f60 2a 2a 62 20 3d 20 28 63 6f 6e 73 74 20 73 74 72  **b = (const str
20f70 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 5f  uct symbol **) _
20f80 62 3b 0a 20 20 69 6e 74 20 69 31 20 3d 20 28 2a  b;.  int i1 = (*
20f90 2a 61 29 2e 69 6e 64 65 78 20 2b 20 31 30 30 30  *a).index + 1000
20fa0 30 30 30 30 2a 28 28 2a 2a 61 29 2e 6e 61 6d 65  0000*((**a).name
20fb0 5b 30 5d 3e 27 5a 27 29 3b 0a 20 20 69 6e 74 20  [0]>'Z');.  int 
20fc0 69 32 20 3d 20 28 2a 2a 62 29 2e 69 6e 64 65 78  i2 = (**b).index
20fd0 20 2b 20 31 30 30 30 30 30 30 30 2a 28 28 2a 2a   + 10000000*((**
20fe0 62 29 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 29 3b  b).name[0]>'Z');
20ff0 0a 20 20 61 73 73 65 72 74 28 20 69 31 21 3d 69  .  assert( i1!=i
21000 32 20 7c 7c 20 73 74 72 63 6d 70 28 28 2a 2a 61  2 || strcmp((**a
21010 29 2e 6e 61 6d 65 2c 28 2a 2a 62 29 2e 6e 61 6d  ).name,(**b).nam
21020 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  e)==0 );.  retur
21030 6e 20 69 31 2d 69 32 3b 0a 7d 0a 0a 2f 2a 20 54  n i1-i2;.}../* T
21040 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
21050 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
21060 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
21070 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f  for each.** asso
21080 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
21090 20 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 73   type "x2"..*/.s
210a0 74 72 75 63 74 20 73 5f 78 32 20 7b 0a 20 20 69  truct s_x2 {.  i
210b0 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
210c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
210d0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
210e0 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20  e slots. */.    
210f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21100 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20        /*   Must 
21110 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
21120 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
21130 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
21140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21150 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a    equal to 1 */.
21160 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20    int count;    
21170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
21180 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79  ber of currently
21190 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f   slots filled */
211a0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f  .  struct s_x2no
211b0 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65  de *tbl;  /* The
211c0 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72   data stored her
211d0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  e */.  struct s_
211e0 78 32 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a  x2node **ht;  /*
211f0 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   Hash table for 
21200 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f  lookups */.};../
21210 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
21220 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
21230 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76  structure for ev
21240 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ery data element
21250 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69  .** in an associ
21260 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
21270 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 74 79 70  ype "x2"..*/.typ
21280 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 32  edef struct s_x2
21290 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20  node {.  struct 
212a0 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 20 20 20  symbol *data;   
212b0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
212c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b  .  const char *k
212d0 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ey;         /* T
212e0 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75  he key */.  stru
212f0 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 6e 65 78  ct s_x2node *nex
21300 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  t;   /* Next ent
21310 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
21320 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63   hash */.  struc
21330 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 66 72 6f  t s_x2node **fro
21340 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  m;  /* Previous 
21350 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 32 6e 6f 64 65  link */.} x2node
21360 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
21370 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  nly one instance
21380 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77   of the array, w
21390 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c  hich is the foll
213a0 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  owing */.static 
213b0 73 74 72 75 63 74 20 73 5f 78 32 20 2a 78 32 61  struct s_x2 *x2a
213c0 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  ;../* Allocate a
213d0 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65   new associative
213e0 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53   array */.void S
213f0 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 7b 0a 20 20  ymbol_init(){.  
21400 69 66 28 20 78 32 61 20 29 20 72 65 74 75 72 6e  if( x2a ) return
21410 3b 0a 20 20 78 32 61 20 3d 20 28 73 74 72 75 63  ;.  x2a = (struc
21420 74 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28 20  t s_x2*)malloc( 
21430 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f  sizeof(struct s_
21440 78 32 29 20 29 3b 0a 20 20 69 66 28 20 78 32 61  x2) );.  if( x2a
21450 20 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73 69 7a   ){.    x2a->siz
21460 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 32 61  e = 128;.    x2a
21470 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ->count = 0;.   
21480 20 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78 32 6e   x2a->tbl = (x2n
21490 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20  ode*)malloc( .  
214a0 20 20 20 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f      (sizeof(x2no
214b0 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e  de) + sizeof(x2n
214c0 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a 20 20  ode*))*128 );.  
214d0 20 20 69 66 28 20 78 32 61 2d 3e 74 62 6c 3d 3d    if( x2a->tbl==
214e0 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
214f0 78 32 61 29 3b 0a 20 20 20 20 20 20 78 32 61 20  x2a);.      x2a 
21500 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
21510 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
21520 20 20 20 78 32 61 2d 3e 68 74 20 3d 20 28 78 32     x2a->ht = (x2
21530 6e 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e 74 62  node**)&(x2a->tb
21540 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66  l[128]);.      f
21550 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69  or(i=0; i<128; i
21560 2b 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x2a->ht[i] =
21570 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
21580 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  /* Insert a new 
21590 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
215a0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54  array.  Return T
215b0 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75  RUE if successfu
215c0 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61  l..** Prior data
215d0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
215e0 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72  ey is NOT overwr
215f0 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d  itten */.int Sym
21600 62 6f 6c 5f 69 6e 73 65 72 74 28 73 74 72 75 63  bol_insert(struc
21610 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 2c 20  t symbol *data, 
21620 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 29  const char *key)
21630 0a 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b  .{.  x2node *np;
21640 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20  .  int h;.  int 
21650 70 68 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d  ph;..  if( x2a==
21660 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
21670 70 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79  ph = strhash(key
21680 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
21690 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  2a->size-1);.  n
216a0 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x2a->ht[h];.
216b0 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
216c0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70     if( strcmp(np
216d0 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b  ->key,key)==0 ){
216e0 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69  .      /* An exi
216f0 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68  sting entry with
21700 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
21710 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20   found. */.     
21720 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65   /* Fail because
21730 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f   overwrite is no
21740 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20  t allows. */.   
21750 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
21760 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e   }.    np = np->
21770 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  next;.  }.  if( 
21780 78 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d  x2a->count>=x2a-
21790 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  >size ){.    /* 
217a0 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  Need to make the
217b0 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67   hash table bigg
217c0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  er */.    int i,
217d0 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74  size;.    struct
217e0 20 73 5f 78 32 20 61 72 72 61 79 3b 0a 20 20 20   s_x2 array;.   
217f0 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69   array.size = si
21800 7a 65 20 3d 20 78 32 61 2d 3e 73 69 7a 65 2a 32  ze = x2a->size*2
21810 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e  ;.    array.coun
21820 74 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a  t = x2a->count;.
21830 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20      array.tbl = 
21840 28 78 32 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x2node*)malloc(
21850 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
21860 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  2node) + sizeof(
21870 78 32 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29  x2node*))*size )
21880 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e  ;.    if( array.
21890 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tbl==0 ) return 
218a0 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20  0;  /* Fail due 
218b0 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  to malloc failur
218c0 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68  e */.    array.h
218d0 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28  t = (x2node**)&(
218e0 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29  array.tbl[size])
218f0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
21900 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
21910 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  y.ht[i] = 0;.   
21920 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 32 61 2d   for(i=0; i<x2a-
21930 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  >count; i++){.  
21940 20 20 20 20 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e      x2node *oldn
21950 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20  p, *newnp;.     
21960 20 6f 6c 64 6e 70 20 3d 20 26 28 78 32 61 2d 3e   oldnp = &(x2a->
21970 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68  tbl[i]);.      h
21980 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70   = strhash(oldnp
21990 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a 65 2d 31  ->key) & (size-1
219a0 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
219b0 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
219c0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
219d0 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
219e0 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
219f0 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
21a00 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
21a10 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
21a20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20       newnp->key 
21a30 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20  = oldnp->key;.  
21a40 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
21a50 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
21a60 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
21a70 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
21a80 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
21a90 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
21aa0 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 32 61    }.    free(x2a
21ab0 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 32 61  ->tbl);.    *x2a
21ac0 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
21ad0 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
21ae0 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
21af0 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d  ph & (x2a->size-
21b00 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 32 61  1);.  np = &(x2a
21b10 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74  ->tbl[x2a->count
21b20 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20  ++]);.  np->key 
21b30 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74  = key;.  np->dat
21b40 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
21b50 78 32 61 2d 3e 68 74 5b 68 5d 20 29 20 78 32 61  x2a->ht[h] ) x2a
21b60 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
21b70 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
21b80 70 2d 3e 6e 65 78 74 20 3d 20 78 32 61 2d 3e 68  p->next = x2a->h
21b90 74 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e 68 74 5b  t[h];.  x2a->ht[
21ba0 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
21bb0 72 6f 6d 20 3d 20 26 28 78 32 61 2d 3e 68 74 5b  rom = &(x2a->ht[
21bc0 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
21bd0 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
21be0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
21bf0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
21c00 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
21c10 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
21c20 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74   such key. */.st
21c30 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d  ruct symbol *Sym
21c40 62 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63  bol_find(const c
21c50 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 69 6e  har *key).{.  in
21c60 74 20 68 3b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e  t h;.  x2node *n
21c70 70 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30  p;..  if( x2a==0
21c80 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68   ) return 0;.  h
21c90 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 20   = strhash(key) 
21ca0 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x2a->size-1);
21cb0 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b  .  np = x2a->ht[
21cc0 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
21cd0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
21ce0 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d  p(np->key,key)==
21cf0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e  0 ) break;.    n
21d00 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
21d10 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20  }.  return np ? 
21d20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a  np->data : 0;.}.
21d30 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ./* Return the n
21d40 2d 74 68 20 64 61 74 61 2e 20 20 52 65 74 75 72  -th data.  Retur
21d50 6e 20 4e 55 4c 4c 20 69 66 20 6e 20 69 73 20 6f  n NULL if n is o
21d60 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 2a 2f 0a  ut of range. */.
21d70 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
21d80 79 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74 20 6e 29  ymbol_Nth(int n)
21d90 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  .{.  struct symb
21da0 6f 6c 20 2a 64 61 74 61 3b 0a 20 20 69 66 28 20  ol *data;.  if( 
21db0 78 32 61 20 26 26 20 6e 3e 30 20 26 26 20 6e 3c  x2a && n>0 && n<
21dc0 3d 78 32 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a 20  =x2a->count ){. 
21dd0 20 20 20 64 61 74 61 20 3d 20 78 32 61 2d 3e 74     data = x2a->t
21de0 62 6c 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20 20  bl[n-1].data;.  
21df0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20  }else{.    data 
21e00 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
21e10 6e 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52 65  n data;.}../* Re
21e20 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
21e30 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 69 6e   the array */.in
21e40 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29  t Symbol_count()
21e50 0a 7b 0a 20 20 72 65 74 75 72 6e 20 78 32 61 20  .{.  return x2a 
21e60 3f 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3a 20 30  ? x2a->count : 0
21e70 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
21e80 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74  n array of point
21e90 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20  ers to all data 
21ea0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
21eb0 20 54 68 65 20 61 72 72 61 79 20 69 73 20 6f 62   The array is ob
21ec0 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
21ed0 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  oc.  Return NULL
21ee0 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   if memory alloc
21ef0 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d  ation.** problem
21f00 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72 72  s, or if the arr
21f10 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  ay is empty. */.
21f20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
21f30 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29  Symbol_arrayof()
21f40 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  .{.  struct symb
21f50 6f 6c 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e  ol **array;.  in
21f60 74 20 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20  t i,size;.  if( 
21f70 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x2a==0 ) return 
21f80 30 3b 0a 20 20 73 69 7a 65 20 3d 20 78 32 61 2d  0;.  size = x2a-
21f90 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20  >count;.  array 
21fa0 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  = (struct symbol
21fb0 20 2a 2a 29 63 61 6c 6c 6f 63 28 73 69 7a 65 2c   **)calloc(size,
21fc0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
21fd0 79 6d 62 6f 6c 20 2a 29 29 3b 0a 20 20 69 66 28  ymbol *));.  if(
21fe0 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f   array ){.    fo
21ff0 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69  r(i=0; i<size; i
22000 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78  ++) array[i] = x
22010 32 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b  2a->tbl[i].data;
22020 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72  .  }.  return ar
22030 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61  ray;.}../* Compa
22040 72 65 20 74 77 6f 20 63 6f 6e 66 69 67 75 72 61  re two configura
22050 74 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43 6f 6e  tions */.int Con
22060 66 69 67 63 6d 70 28 63 6f 6e 73 74 20 63 68 61  figcmp(const cha
22070 72 20 2a 5f 61 2c 63 6f 6e 73 74 20 63 68 61 72  r *_a,const char
22080 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f 6e 73 74 20   *_b).{.  const 
22090 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61  struct config *a
220a0 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69   = (struct confi
220b0 67 20 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e 73 74  g *) _a;.  const
220c0 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
220d0 62 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66  b = (struct conf
220e0 69 67 20 2a 29 20 5f 62 3b 0a 20 20 69 6e 74 20  ig *) _b;.  int 
220f0 78 3b 0a 20 20 78 20 3d 20 61 2d 3e 72 70 2d 3e  x;.  x = a->rp->
22100 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69  index - b->rp->i
22110 6e 64 65 78 3b 0a 20 20 69 66 28 20 78 3d 3d 30  ndex;.  if( x==0
22120 20 29 20 78 20 3d 20 61 2d 3e 64 6f 74 20 2d 20   ) x = a->dot - 
22130 62 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e  b->dot;.  return
22140 20 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72   x;.}../* Compar
22150 65 20 74 77 6f 20 73 74 61 74 65 73 20 2a 2f 0a  e two states */.
22160 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 61 74  PRIVATE int stat
22170 65 63 6d 70 28 73 74 72 75 63 74 20 63 6f 6e 66  ecmp(struct conf
22180 69 67 20 2a 61 2c 20 73 74 72 75 63 74 20 63 6f  ig *a, struct co
22190 6e 66 69 67 20 2a 62 29 0a 7b 0a 20 20 69 6e 74  nfig *b).{.  int
221a0 20 72 63 3b 0a 20 20 66 6f 72 28 72 63 3d 30 3b   rc;.  for(rc=0;
221b0 20 72 63 3d 3d 30 20 26 26 20 61 20 26 26 20 62   rc==0 && a && b
221c0 3b 20 20 61 3d 61 2d 3e 62 70 2c 20 62 3d 62 2d  ;  a=a->bp, b=b-
221d0 3e 62 70 29 7b 0a 20 20 20 20 72 63 20 3d 20 61  >bp){.    rc = a
221e0 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d  ->rp->index - b-
221f0 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 20 20  >rp->index;.    
22200 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d  if( rc==0 ) rc =
22210 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74   a->dot - b->dot
22220 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
22230 30 20 29 7b 0a 20 20 20 20 69 66 28 20 61 20 29  0 ){.    if( a )
22240 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 69 66 28   rc = 1;.    if(
22250 20 62 20 29 20 72 63 20 3d 20 2d 31 3b 0a 20 20   b ) rc = -1;.  
22260 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
22270 0a 0a 2f 2a 20 48 61 73 68 20 61 20 73 74 61 74  ../* Hash a stat
22280 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74  e */.PRIVATE int
22290 20 73 74 61 74 65 68 61 73 68 28 73 74 72 75 63   statehash(struc
222a0 74 20 63 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20  t config *a).{. 
222b0 20 69 6e 74 20 68 3d 30 3b 0a 20 20 77 68 69 6c   int h=0;.  whil
222c0 65 28 20 61 20 29 7b 0a 20 20 20 20 68 20 3d 20  e( a ){.    h = 
222d0 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69  h*571 + a->rp->i
222e0 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74  ndex*37 + a->dot
222f0 3b 0a 20 20 20 20 61 20 3d 20 61 2d 3e 62 70 3b  ;.    a = a->bp;
22300 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 3b  .  }.  return h;
22310 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  .}../* Allocate 
22320 61 20 6e 65 77 20 73 74 61 74 65 20 73 74 72 75  a new state stru
22330 63 74 75 72 65 20 2a 2f 0a 73 74 72 75 63 74 20  cture */.struct 
22340 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77  state *State_new
22350 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74  ().{.  struct st
22360 61 74 65 20 2a 6e 65 77 73 74 61 74 65 3b 0a 20  ate *newstate;. 
22370 20 6e 65 77 73 74 61 74 65 20 3d 20 28 73 74 72   newstate = (str
22380 75 63 74 20 73 74 61 74 65 20 2a 29 63 61 6c 6c  uct state *)call
22390 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72  oc(1, sizeof(str
223a0 75 63 74 20 73 74 61 74 65 29 20 29 3b 0a 20 20  uct state) );.  
223b0 4d 65 6d 6f 72 79 43 68 65 63 6b 28 6e 65 77 73  MemoryCheck(news
223c0 74 61 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  tate);.  return 
223d0 6e 65 77 73 74 61 74 65 3b 0a 7d 0a 0a 2f 2a 20  newstate;.}../* 
223e0 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
223f0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
22400 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
22410 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73   for each.** ass
22420 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
22430 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a  f type "x3"..*/.
22440 73 74 72 75 63 74 20 73 5f 78 33 20 7b 0a 20 20  struct s_x3 {.  
22450 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
22460 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
22470 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
22480 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20  le slots. */.   
22490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224a0 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74         /*   Must
224b0 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
224c0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
224d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
224e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
224f0 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f     equal to 1 */
22500 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20  .  int count;   
22510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22520 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c  mber of currentl
22530 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a  y slots filled *
22540 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e  /.  struct s_x3n
22550 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68  ode *tbl;  /* Th
22560 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65  e data stored he
22570 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  re */.  struct s
22580 5f 78 33 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f  _x3node **ht;  /
22590 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
225a0 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a   lookups */.};..
225b0 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
225c0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
225d0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
225e0 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e  very data elemen
225f0 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63  t.** in an assoc
22600 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
22610 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 74 79  type "x3"..*/.ty
22620 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78  pedef struct s_x
22630 33 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74  3node {.  struct
22640 20 73 74 61 74 65 20 2a 64 61 74 61 3b 20 20 20   state *data;   
22650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22660 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
22670 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b  struct config *k
22680 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
22690 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79        /* The key
226a0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
226b0 33 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f  3node *next;   /
226c0 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74  * Next entry wit
226d0 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20  h the same hash 
226e0 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33  */.  struct s_x3
226f0 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a  node **from;  /*
22700 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a   Previous link *
22710 2f 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20  /.} x3node;../* 
22720 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e  There is only on
22730 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
22740 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69  e array, which i
22750 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
22760 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
22770 20 73 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20   s_x3 *x3a;../* 
22780 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61  Allocate a new a
22790 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
227a0 20 2a 2f 0a 76 6f 69 64 20 53 74 61 74 65 5f 69   */.void State_i
227b0 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 33 61  nit(){.  if( x3a
227c0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 33 61   ) return;.  x3a
227d0 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 33 2a   = (struct s_x3*
227e0 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
227f0 73 74 72 75 63 74 20 73 5f 78 33 29 20 29 3b 0a  struct s_x3) );.
22800 20 20 69 66 28 20 78 33 61 20 29 7b 0a 20 20 20    if( x3a ){.   
22810 20 78 33 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38   x3a->size = 128
22820 3b 0a 20 20 20 20 78 33 61 2d 3e 63 6f 75 6e 74  ;.    x3a->count
22830 20 3d 20 30 3b 0a 20 20 20 20 78 33 61 2d 3e 74   = 0;.    x3a->t
22840 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d 61  bl = (x3node*)ma
22850 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69  lloc( .      (si
22860 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73  zeof(x3node) + s
22870 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 2a  izeof(x3node*))*
22880 31 32 38 20 29 3b 0a 20 20 20 20 69 66 28 20 78  128 );.    if( x
22890 33 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20  3a->tbl==0 ){.  
228a0 20 20 20 20 66 72 65 65 28 78 33 61 29 3b 0a 20      free(x3a);. 
228b0 20 20 20 20 20 78 33 61 20 3d 20 30 3b 0a 20 20       x3a = 0;.  
228c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
228d0 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 33 61 2d  nt i;.      x3a-
228e0 3e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29  >ht = (x3node**)
228f0 26 28 78 33 61 2d 3e 74 62 6c 5b 31 32 38 5d 29  &(x3a->tbl[128])
22900 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
22910 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 33 61   i<128; i++) x3a
22920 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  ->ht[i] = 0;.   
22930 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65   }.  }.}./* Inse
22940 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
22950 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20  into the array. 
22960 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
22970 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50  successful..** P
22980 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74  rior data with t
22990 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e  he same key is N
229a0 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a  OT overwritten *
229b0 2f 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65  /.int State_inse
229c0 72 74 28 73 74 72 75 63 74 20 73 74 61 74 65 20  rt(struct state 
229d0 2a 64 61 74 61 2c 20 73 74 72 75 63 74 20 63 6f  *data, struct co
229e0 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 78  nfig *key).{.  x
229f0 33 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74  3node *np;.  int
22a00 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20   h;.  int ph;.. 
22a10 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65   if( x3a==0 ) re
22a20 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73  turn 0;.  ph = s
22a30 74 61 74 65 68 61 73 68 28 6b 65 79 29 3b 0a 20  tatehash(key);. 
22a40 20 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e   h = ph & (x3a->
22a50 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
22a60 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x3a->ht[h];.  wh
22a70 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
22a80 66 28 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e  f( statecmp(np->
22a90 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20  key,key)==0 ){. 
22aa0 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
22ab0 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74  ing entry with t
22ac0 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66  he same key is f
22ad0 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  ound. */.      /
22ae0 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f  * Fail because o
22af0 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20  verwrite is not 
22b00 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  allows. */.     
22b10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
22b20 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
22b30 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 33  xt;.  }.  if( x3
22b40 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61 2d 3e 73  a->count>=x3a->s
22b50 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ize ){.    /* Ne
22b60 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68  ed to make the h
22b70 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72  ash table bigger
22b80 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69   */.    int i,si
22b90 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  ze;.    struct s
22ba0 5f 78 33 20 61 72 72 61 79 3b 0a 20 20 20 20 61  _x3 array;.    a
22bb0 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65  rray.size = size
22bc0 20 3d 20 78 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a   = x3a->size*2;.
22bd0 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20      array.count 
22be0 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x3a->count;.  
22bf0 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78    array.tbl = (x
22c00 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20  3node*)malloc(. 
22c10 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 33 6e       (sizeof(x3n
22c20 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 33  ode) + sizeof(x3
22c30 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a  node*))*size );.
22c40 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62      if( array.tb
22c50 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
22c60 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f    /* Fail due to
22c70 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
22c80 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20  */.    array.ht 
22c90 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 61 72  = (x3node**)&(ar
22ca0 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a  ray.tbl[size]);.
22cb0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
22cc0 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e  ize; i++) array.
22cd0 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66  ht[i] = 0;.    f
22ce0 6f 72 28 69 3d 30 3b 20 69 3c 78 33 61 2d 3e 63  or(i=0; i<x3a->c
22cf0 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ount; i++){.    
22d00 20 20 78 33 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c    x3node *oldnp,
22d10 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f   *newnp;.      o
22d20 6c 64 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62  ldnp = &(x3a->tb
22d30 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d  l[i]);.      h =
22d40 20 73 74 61 74 65 68 61 73 68 28 6f 6c 64 6e 70   statehash(oldnp
22d50 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a 65 2d 31  ->key) & (size-1
22d60 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
22d70 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
22d80 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
22d90 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
22da0 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
22db0 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
22dc0 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
22dd0 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
22de0 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20       newnp->key 
22df0 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20  = oldnp->key;.  
22e00 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
22e10 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
22e20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
22e30 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
22e40 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
22e50 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
22e60 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 33 61    }.    free(x3a
22e70 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 33 61  ->tbl);.    *x3a
22e80 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
22e90 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
22ea0 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
22eb0 70 68 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d  ph & (x3a->size-
22ec0 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 33 61  1);.  np = &(x3a
22ed0 2d 3e 74 62 6c 5b 78 33 61 2d 3e 63 6f 75 6e 74  ->tbl[x3a->count
22ee0 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20  ++]);.  np->key 
22ef0 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74  = key;.  np->dat
22f00 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
22f10 78 33 61 2d 3e 68 74 5b 68 5d 20 29 20 78 33 61  x3a->ht[h] ) x3a
22f20 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
22f30 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
22f40 70 2d 3e 6e 65 78 74 20 3d 20 78 33 61 2d 3e 68  p->next = x3a->h
22f50 74 5b 68 5d 3b 0a 20 20 78 33 61 2d 3e 68 74 5b  t[h];.  x3a->ht[
22f60 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
22f70 72 6f 6d 20 3d 20 26 28 78 33 61 2d 3e 68 74 5b  rom = &(x3a->ht[
22f80 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
22f90 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
22fa0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
22fb0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
22fc0 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
22fd0 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
22fe0 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74   such key. */.st
22ff0 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74  ruct state *Stat
23000 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20 63 6f  e_find(struct co
23010 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 69  nfig *key).{.  i
23020 6e 74 20 68 3b 0a 20 20 78 33 6e 6f 64 65 20 2a  nt h;.  x3node *
23030 6e 70 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d  np;..  if( x3a==
23040 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
23050 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65  h = statehash(ke
23060 79 29 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d  y) & (x3a->size-
23070 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e  1);.  np = x3a->
23080 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
23090 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
230a0 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b  atecmp(np->key,k
230b0 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ey)==0 ) break;.
230c0 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
230d0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
230e0 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20  np ? np->data : 
230f0 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  0;.}../* Return 
23100 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
23110 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61  ters to all data
23120 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
23130 2a 20 54 68 65 20 61 72 72 61 79 20 69 73 20 6f  * The array is o
23140 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
23150 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  loc.  Return NUL
23160 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  L if memory allo
23170 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65  cation.** proble
23180 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72  ms, or if the ar
23190 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f  ray is empty. */
231a0 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a  .struct state **
231b0 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28 29 0a  State_arrayof().
231c0 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
231d0 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20   **array;.  int 
231e0 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20 78 33  i,size;.  if( x3
231f0 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
23200 0a 20 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e 63  .  size = x3a->c
23210 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20  ount;.  array = 
23220 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a  (struct state **
23230 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
23240 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 2a  struct state *)*
23250 73 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 61 72  size );.  if( ar
23260 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ray ){.    for(i
23270 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29  =0; i<size; i++)
23280 20 61 72 72 61 79 5b 69 5d 20 3d 20 78 33 61 2d   array[i] = x3a-
23290 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20  >tbl[i].data;.  
232a0 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 72 61 79  }.  return array
232b0 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 63  ;.}../* Hash a c
232c0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a  onfiguration */.
232d0 50 52 49 56 41 54 45 20 69 6e 74 20 63 6f 6e 66  PRIVATE int conf
232e0 69 67 68 61 73 68 28 73 74 72 75 63 74 20 63 6f  ighash(struct co
232f0 6e 66 69 67 20 2a 61 29 0a 7b 0a 20 20 69 6e 74  nfig *a).{.  int
23300 20 68 3d 30 3b 0a 20 20 68 20 3d 20 68 2a 35 37   h=0;.  h = h*57
23310 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78  1 + a->rp->index
23320 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20  *37 + a->dot;.  
23330 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20  return h;.}../* 
23340 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
23350 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
23360 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
23370 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73   for each.** ass
23380 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
23390 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a  f type "x4"..*/.
233a0 73 74 72 75 63 74 20 73 5f 78 34 20 7b 0a 20 20  struct s_x4 {.  
233b0 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
233c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
233d0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
233e0 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20  le slots. */.   
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23400 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74         /*   Must
23410 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
23420 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
23430 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
23440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23450 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f     equal to 1 */
23460 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20  .  int count;   
23470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
23480 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c  mber of currentl
23490 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a  y slots filled *
234a0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e  /.  struct s_x4n
234b0 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68  ode *tbl;  /* Th
234c0 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65  e data stored he
234d0 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  re */.  struct s
234e0 5f 78 34 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f  _x4node **ht;  /
234f0 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
23500 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a   lookups */.};..
23510 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
23520 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
23530 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
23540 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e  very data elemen
23550 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63  t.** in an assoc
23560 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
23570 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 74 79  type "x4"..*/.ty
23580 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78  pedef struct s_x
23590 34 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74  4node {.  struct
235a0 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b 20 20   config *data;  
235b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235c0 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
235d0 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65   struct s_x4node
235e0 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78   *next;   /* Nex
235f0 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  t entry with the
23600 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20   same hash */.  
23610 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20  struct s_x4node 
23620 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76  **from;  /* Prev
23630 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78  ious link */.} x
23640 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65  4node;../* There
23650 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73   is only one ins
23660 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72  tance of the arr
23670 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  ay, which is the
23680 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74   following */.st
23690 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 34  atic struct s_x4
236a0 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63   *x4a;../* Alloc
236b0 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69  ate a new associ
236c0 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76  ative array */.v
236d0 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  oid Configtable_
236e0 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 34  init(){.  if( x4
236f0 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 34  a ) return;.  x4
23700 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 34  a = (struct s_x4
23710 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
23720 28 73 74 72 75 63 74 20 73 5f 78 34 29 20 29 3b  (struct s_x4) );
23730 0a 20 20 69 66 28 20 78 34 61 20 29 7b 0a 20 20  .  if( x4a ){.  
23740 20 20 78 34 61 2d 3e 73 69 7a 65 20 3d 20 36 34    x4a->size = 64
23750 3b 0a 20 20 20 20 78 34 61 2d 3e 63 6f 75 6e 74  ;.    x4a->count
23760 20 3d 20 30 3b 0a 20 20 20 20 78 34 61 2d 3e 74   = 0;.    x4a->t
23770 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 6d 61  bl = (x4node*)ma
23780 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69  lloc( .      (si
23790 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73  zeof(x4node) + s
237a0 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 2a  izeof(x4node*))*
237b0 36 34 20 29 3b 0a 20 20 20 20 69 66 28 20 78 34  64 );.    if( x4
237c0 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
237d0 20 20 20 66 72 65 65 28 78 34 61 29 3b 0a 20 20     free(x4a);.  
237e0 20 20 20 20 78 34 61 20 3d 20 30 3b 0a 20 20 20      x4a = 0;.   
237f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
23800 74 20 69 3b 0a 20 20 20 20 20 20 78 34 61 2d 3e  t i;.      x4a->
23810 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26  ht = (x4node**)&
23820 28 78 34 61 2d 3e 74 62 6c 5b 36 34 5d 29 3b 0a  (x4a->tbl[64]);.
23830 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
23840 3c 36 34 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68  <64; i++) x4a->h
23850 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  t[i] = 0;.    }.
23860 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20    }.}./* Insert 
23870 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
23880 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65  o the array.  Re
23890 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63  turn TRUE if suc
238a0 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f  cessful..** Prio
238b0 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20  r data with the 
238c0 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20  same key is NOT 
238d0 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69  overwritten */.i
238e0 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69  nt Configtable_i
238f0 6e 73 65 72 74 28 73 74 72 75 63 74 20 63 6f 6e  nsert(struct con
23900 66 69 67 20 2a 64 61 74 61 29 0a 7b 0a 20 20 78  fig *data).{.  x
23910 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74  4node *np;.  int
23920 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20   h;.  int ph;.. 
23930 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72 65   if( x4a==0 ) re
23940 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 63  turn 0;.  ph = c
23950 6f 6e 66 69 67 68 61 73 68 28 64 61 74 61 29 3b  onfighash(data);
23960 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 34 61  .  h = ph & (x4a
23970 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
23980 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x4a->ht[h];.  
23990 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
239a0 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28 28   if( Configcmp((
239b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6e 70  const char *) np
239c0 2d 3e 64 61 74 61 2c 28 63 6f 6e 73 74 20 63 68  ->data,(const ch
239d0 61 72 20 2a 29 20 64 61 74 61 29 3d 3d 30 20 29  ar *) data)==0 )
239e0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  {.      /* An ex
239f0 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74  isting entry wit
23a00 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
23a10 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20  s found. */.    
23a20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73    /* Fail becaus
23a30 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e  e overwrite is n
23a40 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20  ot allows. */.  
23a50 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
23a60 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d    }.    np = np-
23a70 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  >next;.  }.  if(
23a80 20 78 34 61 2d 3e 63 6f 75 6e 74 3e 3d 78 34 61   x4a->count>=x4a
23a90 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a  ->size ){.    /*
23aa0 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68   Need to make th
23ab0 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67  e hash table big
23ac0 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ger */.    int i
23ad0 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63  ,size;.    struc
23ae0 74 20 73 5f 78 34 20 61 72 72 61 79 3b 0a 20 20  t s_x4 array;.  
23af0 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73    array.size = s
23b00 69 7a 65 20 3d 20 78 34 61 2d 3e 73 69 7a 65 2a  ize = x4a->size*
23b10 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75  2;.    array.cou
23b20 6e 74 20 3d 20 78 34 61 2d 3e 63 6f 75 6e 74 3b  nt = x4a->count;
23b30 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d  .    array.tbl =
23b40 20 28 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63   (x4node*)malloc
23b50 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28  (.      (sizeof(
23b60 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x4node) + sizeof
23b70 28 78 34 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20  (x4node*))*size 
23b80 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79  );.    if( array
23b90 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  .tbl==0 ) return
23ba0 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65   0;  /* Fail due
23bb0 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   to malloc failu
23bc0 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e  re */.    array.
23bd0 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26  ht = (x4node**)&
23be0 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d  (array.tbl[size]
23bf0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
23c00 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  i<size; i++) arr
23c10 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  ay.ht[i] = 0;.  
23c20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61    for(i=0; i<x4a
23c30 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20  ->count; i++){. 
23c40 20 20 20 20 20 78 34 6e 6f 64 65 20 2a 6f 6c 64       x4node *old
23c50 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20  np, *newnp;.    
23c60 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 34 61 2d    oldnp = &(x4a-
23c70 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >tbl[i]);.      
23c80 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 6f  h = confighash(o
23c90 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 73  ldnp->data) & (s
23ca0 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65  ize-1);.      ne
23cb0 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62  wnp = &(array.tb
23cc0 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  l[i]);.      if(
23cd0 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61   array.ht[h] ) a
23ce0 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  rray.ht[h]->from
23cf0 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74   = &(newnp->next
23d00 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  );.      newnp->
23d10 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b  next = array.ht[
23d20 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  h];.      newnp-
23d30 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64  >data = oldnp->d
23d40 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  ata;.      newnp
23d50 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79  ->from = &(array
23d60 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61  .ht[h]);.      a
23d70 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77  rray.ht[h] = new
23d80 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  np;.    }.    fr
23d90 65 65 28 78 34 61 2d 3e 74 62 6c 29 3b 0a 20 20  ee(x4a->tbl);.  
23da0 20 20 2a 78 34 61 20 3d 20 61 72 72 61 79 3b 0a    *x4a = array;.
23db0 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20    }.  /* Insert 
23dc0 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a  the new data */.
23dd0 20 20 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d    h = ph & (x4a-
23de0 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
23df0 20 26 28 78 34 61 2d 3e 74 62 6c 5b 78 34 61 2d   &(x4a->tbl[x4a-
23e00 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70  >count++]);.  np
23e10 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20  ->data = data;. 
23e20 20 69 66 28 20 78 34 61 2d 3e 68 74 5b 68 5d 20   if( x4a->ht[h] 
23e30 29 20 78 34 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72  ) x4a->ht[h]->fr
23e40 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29  om = &(np->next)
23e50 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78  ;.  np->next = x
23e60 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 34 61  4a->ht[h];.  x4a
23e70 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20  ->ht[h] = np;.  
23e80 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 34 61  np->from = &(x4a
23e90 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75  ->ht[h]);.  retu
23ea0 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  rn 1;.}../* Retu
23eb0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
23ec0 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f  data assigned to
23ed0 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20   the given key. 
23ee0 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20   Return NULL.** 
23ef0 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20  if no such key. 
23f00 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
23f10 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69   *Configtable_fi
23f20 6e 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  nd(struct config
23f30 20 2a 6b 65 79 29 0a 7b 0a 20 20 69 6e 74 20 68   *key).{.  int h
23f40 3b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a  ;.  x4node *np;.
23f50 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20  .  if( x4a==0 ) 
23f60 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20  return 0;.  h = 
23f70 63 6f 6e 66 69 67 68 61 73 68 28 6b 65 79 29 20  confighash(key) 
23f80 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x4a->size-1);
23f90 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b  .  np = x4a->ht[
23fa0 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
23fb0 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69  ){.    if( Confi
23fc0 67 63 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72  gcmp((const char
23fd0 20 2a 29 20 6e 70 2d 3e 64 61 74 61 2c 28 63 6f   *) np->data,(co
23fe0 6e 73 74 20 63 68 61 72 20 2a 29 20 6b 65 79 29  nst char *) key)
23ff0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
24000 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
24010 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20    }.  return np 
24020 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a  ? np->data : 0;.
24030 7d 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20 61 6c 6c  }../* Remove all
24040 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 74   data from the t
24050 61 62 6c 65 2e 20 20 50 61 73 73 20 65 61 63 68  able.  Pass each
24060 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 75 6e   data to the fun
24070 63 74 69 6f 6e 20 22 66 22 0a 2a 2a 20 61 73 20  ction "f".** as 
24080 69 74 20 69 73 20 72 65 6d 6f 76 65 64 2e 20 20  it is removed.  
24090 28 22 66 22 20 6d 61 79 20 62 65 20 6e 75 6c 6c  ("f" may be null
240a0 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 73   to avoid this s
240b0 74 65 70 2e 29 20 2a 2f 0a 76 6f 69 64 20 43 6f  tep.) */.void Co
240c0 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28  nfigtable_clear(
240d0 69 6e 74 28 2a 66 29 28 73 74 72 75 63 74 20 63  int(*f)(struct c
240e0 6f 6e 66 69 67 20 2a 29 29 0a 7b 0a 20 20 69 6e  onfig *)).{.  in
240f0 74 20 69 3b 0a 20 20 69 66 28 20 78 34 61 3d 3d  t i;.  if( x4a==
24100 30 20 7c 7c 20 78 34 61 2d 3e 63 6f 75 6e 74 3d  0 || x4a->count=
24110 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
24120 66 28 20 66 20 29 20 66 6f 72 28 69 3d 30 3b 20  f( f ) for(i=0; 
24130 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b  i<x4a->count; i+
24140 2b 29 20 28 2a 66 29 28 78 34 61 2d 3e 74 62 6c  +) (*f)(x4a->tbl
24150 5b 69 5d 2e 64 61 74 61 29 3b 0a 20 20 66 6f 72  [i].data);.  for
24160 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 73 69 7a  (i=0; i<x4a->siz
24170 65 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b  e; i++) x4a->ht[
24180 69 5d 20 3d 20 30 3b 0a 20 20 78 34 61 2d 3e 63  i] = 0;.  x4a->c
24190 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  ount = 0;.  retu
241a0 72 6e 3b 0a 7d 0a                                rn;.}.