/ Hex Artifact Content
Login

Artifact 445f18999b700d83b83a5d9be00c596546c21052:


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 23 69 66 64 65 66 20 5f 5f 63 70 6c 75 73  _.#ifdef __cplus
0220: 70 6c 75 73 0a 65 78 74 65 72 6e 20 22 43 22 20  plus.extern "C" 
0230: 7b 0a 23 65 6e 64 69 66 0a 65 78 74 65 72 6e 20  {.#endif.extern 
0240: 69 6e 74 20 61 63 63 65 73 73 28 63 6f 6e 73 74  int access(const
0250: 20 63 68 61 72 20 2a 70 61 74 68 2c 20 69 6e 74   char *path, int
0260: 20 6d 6f 64 65 29 3b 0a 23 69 66 64 65 66 20 5f   mode);.#ifdef _
0270: 5f 63 70 6c 75 73 70 6c 75 73 0a 7d 0a 23 65 6e  _cplusplus.}.#en
0280: 64 69 66 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75  dif.#else.#inclu
0290: 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 65  de <unistd.h>.#e
02a0: 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66 69 6e 65  ndif../* #define
02b0: 20 50 52 49 56 41 54 45 20 73 74 61 74 69 63 20   PRIVATE static 
02c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 49 56 41  */.#define PRIVA
02d0: 54 45 0a 0a 23 69 66 64 65 66 20 54 45 53 54 0a  TE..#ifdef TEST.
02e0: 23 64 65 66 69 6e 65 20 4d 41 58 52 48 53 20 35  #define MAXRHS 5
02f0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6c 6f         /* Set lo
0300: 77 20 74 6f 20 65 78 65 72 63 69 73 65 20 65 78  w to exercise ex
0310: 63 65 70 74 69 6f 6e 20 63 6f 64 65 20 2a 2f 0a  ception code */.
0320: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 41  #else.#define MA
0330: 58 52 48 53 20 31 30 30 30 0a 23 65 6e 64 69 66  XRHS 1000.#endif
0340: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 6f  ..static int sho
0350: 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c  wPrecedenceConfl
0360: 69 63 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ict = 0;.static 
0370: 63 68 61 72 20 2a 6d 73 6f 72 74 28 63 68 61 72  char *msort(char
0380: 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 28 2a 29 28  *,char**,int(*)(
0390: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
03a0: 74 20 63 68 61 72 2a 29 29 3b 0a 0a 2f 2a 0a 2a  t char*));../*.*
03b0: 2a 20 43 6f 6d 70 69 6c 65 72 73 20 61 72 65 20  * Compilers are 
03c0: 67 65 74 74 69 6e 67 20 69 6e 63 72 65 61 73 69  getting increasi
03d0: 6e 67 6c 79 20 70 65 64 61 6e 74 69 63 20 61 62  ngly pedantic ab
03e0: 6f 75 74 20 74 79 70 65 20 63 6f 6e 76 65 72 73  out type convers
03f0: 69 6f 6e 73 0a 2a 2a 20 61 73 20 43 20 65 76 6f  ions.** as C evo
0400: 6c 76 65 73 20 65 76 65 72 20 63 6c 6f 73 65 72  lves ever closer
0410: 20 74 6f 20 41 64 61 2e 2e 2e 2e 20 20 54 6f 20   to Ada....  To 
0420: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
0430: 6c 61 74 65 73 74 20 70 72 6f 62 6c 65 6d 73 0a  latest problems.
0440: 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64 65  ** we have to de
0450: 66 69 6e 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  fine the followi
0460: 6e 67 20 76 61 72 69 61 6e 74 20 6f 66 20 73 74  ng variant of st
0470: 72 6c 65 6e 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  rlen()..*/.#defi
0480: 6e 65 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 58  ne lemonStrlen(X
0490: 29 20 20 20 28 28 69 6e 74 29 73 74 72 6c 65 6e  )   ((int)strlen
04a0: 28 58 29 29 0a 0a 2f 2a 20 61 20 66 65 77 20 66  (X))../* a few f
04b0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
04c0: 6f 6e 73 2e 2e 2e 20 2a 2f 0a 73 74 72 75 63 74  ons... */.struct
04d0: 20 72 75 6c 65 3b 0a 73 74 72 75 63 74 20 6c 65   rule;.struct le
04e0: 6d 6f 6e 3b 0a 73 74 72 75 63 74 20 61 63 74 69  mon;.struct acti
04f0: 6f 6e 3b 0a 0a 73 74 61 74 69 63 20 73 74 72 75  on;..static stru
0500: 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f  ct action *Actio
0510: 6e 5f 6e 65 77 28 76 6f 69 64 29 3b 0a 73 74 61  n_new(void);.sta
0520: 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69 6f  tic struct actio
0530: 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73  n *Action_sort(s
0540: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b  truct action *);
0550: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
0560: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 62 75 69  om the file "bui
0570: 6c 64 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ld.h" **********
0580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64  **********/.void
05a0: 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65   FindRulePrecede
05b0: 6e 63 65 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e  nces();.void Fin
05c0: 64 46 69 72 73 74 53 65 74 73 28 29 3b 0a 76 6f  dFirstSets();.vo
05d0: 69 64 20 46 69 6e 64 53 74 61 74 65 73 28 29 3b  id FindStates();
05e0: 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28  .void FindLinks(
05f0: 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c  );.void FindFoll
0600: 6f 77 53 65 74 73 28 29 3b 0a 76 6f 69 64 20 46  owSets();.void F
0610: 69 6e 64 41 63 74 69 6f 6e 73 28 29 3b 0a 0a 2f  indActions();../
0620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
0630: 68 65 20 66 69 6c 65 20 22 63 6f 6e 66 69 67 6c  he file "configl
0640: 69 73 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ist.h" *********
0650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0660: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 43  ********/.void C
0670: 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 76  onfiglist_init(v
0680: 6f 69 64 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e  oid);.struct con
0690: 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f  fig *Configlist_
06a0: 61 64 64 28 73 74 72 75 63 74 20 72 75 6c 65 20  add(struct rule 
06b0: 2a 2c 20 69 6e 74 29 3b 0a 73 74 72 75 63 74 20  *, int);.struct 
06c0: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
06d0: 73 74 5f 61 64 64 62 61 73 69 73 28 73 74 72 75  st_addbasis(stru
06e0: 63 74 20 72 75 6c 65 20 2a 2c 20 69 6e 74 29 3b  ct rule *, int);
06f0: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
0700: 5f 63 6c 6f 73 75 72 65 28 73 74 72 75 63 74 20  _closure(struct 
0710: 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 43  lemon *);.void C
0720: 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 76  onfiglist_sort(v
0730: 6f 69 64 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  oid);.void Confi
0740: 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28  glist_sortbasis(
0750: 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20 63 6f  void);.struct co
0760: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
0770: 5f 72 65 74 75 72 6e 28 76 6f 69 64 29 3b 0a 73  _return(void);.s
0780: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
0790: 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 76  nfiglist_basis(v
07a0: 6f 69 64 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  oid);.void Confi
07b0: 67 6c 69 73 74 5f 65 61 74 28 73 74 72 75 63 74  glist_eat(struct
07c0: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64   config *);.void
07d0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65   Configlist_rese
07e0: 74 28 76 6f 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  t(void);../*****
07f0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
0800: 6c 65 20 22 65 72 72 6f 72 2e 68 22 20 2a 2a 2a  le "error.h" ***
0810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0830: 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 45 72 72 6f 72  ****/.void Error
0840: 4d 73 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Msg(const char *
0850: 2c 20 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  , int,const char
0860: 20 2a 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a 2a   *, ...);../****
0870: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
0880: 20 22 6f 70 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a   "option.h" ****
0890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
08a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
08b0: 2a 2a 2a 2a 2a 2a 2f 0a 65 6e 75 6d 20 6f 70 74  ******/.enum opt
08c0: 69 6f 6e 5f 74 79 70 65 20 7b 20 4f 50 54 5f 46  ion_type { OPT_F
08d0: 4c 41 47 3d 31 2c 20 20 4f 50 54 5f 49 4e 54 2c  LAG=1,  OPT_INT,
08e0: 20 20 4f 50 54 5f 44 42 4c 2c 20 20 4f 50 54 5f    OPT_DBL,  OPT_
08f0: 53 54 52 2c 0a 20 20 20 20 20 20 20 20 20 4f 50  STR,.         OP
0900: 54 5f 46 46 4c 41 47 2c 20 4f 50 54 5f 46 49 4e  T_FFLAG, OPT_FIN
0910: 54 2c 20 4f 50 54 5f 46 44 42 4c 2c 20 4f 50 54  T, OPT_FDBL, OPT
0920: 5f 46 53 54 52 7d 3b 0a 73 74 72 75 63 74 20 73  _FSTR};.struct s
0930: 5f 6f 70 74 69 6f 6e 73 20 7b 0a 20 20 65 6e 75  _options {.  enu
0940: 6d 20 6f 70 74 69 6f 6e 5f 74 79 70 65 20 74 79  m option_type ty
0950: 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pe;.  const char
0960: 20 2a 6c 61 62 65 6c 3b 0a 20 20 63 68 61 72 20   *label;.  char 
0970: 2a 61 72 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68  *arg;.  const ch
0980: 61 72 20 2a 6d 65 73 73 61 67 65 3b 0a 7d 3b 0a  ar *message;.};.
0990: 69 6e 74 20 20 20 20 4f 70 74 49 6e 69 74 28 63  int    OptInit(c
09a0: 68 61 72 2a 2a 2c 73 74 72 75 63 74 20 73 5f 6f  har**,struct s_o
09b0: 70 74 69 6f 6e 73 2a 2c 46 49 4c 45 2a 29 3b 0a  ptions*,FILE*);.
09c0: 69 6e 74 20 20 20 20 4f 70 74 4e 41 72 67 73 28  int    OptNArgs(
09d0: 76 6f 69 64 29 3b 0a 63 68 61 72 20 20 2a 4f 70  void);.char  *Op
09e0: 74 41 72 67 28 69 6e 74 29 3b 0a 76 6f 69 64 20  tArg(int);.void 
09f0: 20 20 4f 70 74 45 72 72 28 69 6e 74 29 3b 0a 76    OptErr(int);.v
0a00: 6f 69 64 20 20 20 4f 70 74 50 72 69 6e 74 28 76  oid   OptPrint(v
0a10: 6f 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  oid);../********
0a20: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
0a30: 70 61 72 73 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  parse.h" *******
0a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a60: 2a 2a 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 73  **/.void Parse(s
0a70: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
0a80: 70 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  p);../********* 
0a90: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70  From the file "p
0aa0: 6c 69 6e 6b 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  link.h" ********
0ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
0ad0: 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 50  .struct plink *P
0ae0: 6c 69 6e 6b 5f 6e 65 77 28 76 6f 69 64 29 3b 0a  link_new(void);.
0af0: 76 6f 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 73  void Plink_add(s
0b00: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20  truct plink **, 
0b10: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
0b20: 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70  ;.void Plink_cop
0b30: 79 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  y(struct plink *
0b40: 2a 2c 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  *, struct plink 
0b50: 2a 29 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 64  *);.void Plink_d
0b60: 65 6c 65 74 65 28 73 74 72 75 63 74 20 70 6c 69  elete(struct pli
0b70: 6e 6b 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  nk *);../*******
0b80: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0b90: 65 20 22 72 65 70 6f 72 74 2e 68 22 20 2a 2a 2a  e "report.h" ***
0ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0bc0: 2a 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74  **/.void Reprint
0bd0: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29  (struct lemon *)
0be0: 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74  ;.void ReportOut
0bf0: 70 75 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  put(struct lemon
0c00: 20 2a 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74   *);.void Report
0c10: 54 61 62 6c 65 28 73 74 72 75 63 74 20 6c 65 6d  Table(struct lem
0c20: 6f 6e 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64  on *, int);.void
0c30: 20 52 65 70 6f 72 74 48 65 61 64 65 72 28 73 74   ReportHeader(st
0c40: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76  ruct lemon *);.v
0c50: 6f 69 64 20 43 6f 6d 70 72 65 73 73 54 61 62 6c  oid CompressTabl
0c60: 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  es(struct lemon 
0c70: 2a 29 3b 0a 76 6f 69 64 20 52 65 73 6f 72 74 53  *);.void ResortS
0c80: 74 61 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d  tates(struct lem
0c90: 6f 6e 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  on *);../*******
0ca0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0cb0: 65 20 22 73 65 74 2e 68 22 20 2a 2a 2a 2a 2a 2a  e "set.h" ******
0cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ce0: 2a 2a 2f 0a 76 6f 69 64 20 20 53 65 74 53 69 7a  **/.void  SetSiz
0cf0: 65 28 69 6e 74 29 3b 20 20 20 20 20 20 20 20 20  e(int);         
0d00: 20 20 20 20 2f 2a 20 41 6c 6c 20 73 65 74 73 20      /* All sets 
0d10: 77 69 6c 6c 20 62 65 20 6f 66 20 73 69 7a 65 20  will be of size 
0d20: 4e 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65  N */.char *SetNe
0d30: 77 28 76 6f 69 64 29 3b 20 20 20 20 20 20 20 20  w(void);        
0d40: 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20         /* A new 
0d50: 73 65 74 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20  set for element 
0d60: 30 2e 2e 4e 20 2a 2f 0a 76 6f 69 64 20 20 53 65  0..N */.void  Se
0d70: 74 46 72 65 65 28 63 68 61 72 2a 29 3b 20 20 20  tFree(char*);   
0d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 61            /* Dea
0d90: 6c 6c 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f  llocate a set */
0da0: 0a 69 6e 74 20 53 65 74 41 64 64 28 63 68 61 72  .int SetAdd(char
0db0: 2a 2c 69 6e 74 29 3b 20 20 20 20 20 20 20 20 20  *,int);         
0dc0: 20 20 20 2f 2a 20 41 64 64 20 65 6c 65 6d 65 6e     /* Add elemen
0dd0: 74 20 74 6f 20 61 20 73 65 74 20 2a 2f 0a 69 6e  t to a set */.in
0de0: 74 20 53 65 74 55 6e 69 6f 6e 28 63 68 61 72 20  t SetUnion(char 
0df0: 2a 2c 63 68 61 72 20 2a 29 3b 20 20 20 20 2f 2a  *,char *);    /*
0e00: 20 41 20 3c 2d 20 41 20 55 20 42 2c 20 74 68 72   A <- A U B, thr
0e10: 75 20 65 6c 65 6d 65 6e 74 20 4e 20 2a 2f 0a 23  u element N */.#
0e20: 64 65 66 69 6e 65 20 53 65 74 46 69 6e 64 28 58  define SetFind(X
0e30: 2c 59 29 20 28 58 5b 59 5d 29 20 20 20 20 20 20  ,Y) (X[Y])      
0e40: 20 2f 2a 20 54 72 75 65 20 69 66 20 59 20 69 73   /* True if Y is
0e50: 20 69 6e 20 73 65 74 20 58 20 2a 2f 0a 0a 2f 2a   in set X */../*
0e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
0e70: 68 65 20 66 69 6c 65 20 22 73 74 72 75 63 74 2e  he file "struct.
0e80: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
0e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
0eb0: 50 72 69 6e 63 69 70 61 6c 20 64 61 74 61 20 73  Principal data s
0ec0: 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68  tructures for th
0ed0: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
0ee0: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 74 79  enerator..*/..ty
0ef0: 70 65 64 65 66 20 65 6e 75 6d 20 7b 4c 45 4d 4f  pedef enum {LEMO
0f00: 4e 5f 46 41 4c 53 45 3d 30 2c 20 4c 45 4d 4f 4e  N_FALSE=0, LEMON
0f10: 5f 54 52 55 45 7d 20 42 6f 6f 6c 65 61 6e 3b 0a  _TRUE} Boolean;.
0f20: 0a 2f 2a 20 53 79 6d 62 6f 6c 73 20 28 74 65 72  ./* Symbols (ter
0f30: 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65  minals and nonte
0f40: 72 6d 69 6e 61 6c 73 29 20 6f 66 20 74 68 65 20  rminals) of the 
0f50: 67 72 61 6d 6d 61 72 20 61 72 65 20 73 74 6f 72  grammar are stor
0f60: 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c  ed.** in the fol
0f70: 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 65 6e 75 6d 20  lowing: */.enum 
0f80: 73 79 6d 62 6f 6c 5f 74 79 70 65 20 7b 0a 20 20  symbol_type {.  
0f90: 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 4e 4f 4e 54  TERMINAL,.  NONT
0fa0: 45 52 4d 49 4e 41 4c 2c 0a 20 20 4d 55 4c 54 49  ERMINAL,.  MULTI
0fb0: 54 45 52 4d 49 4e 41 4c 0a 7d 3b 0a 65 6e 75 6d  TERMINAL.};.enum
0fc0: 20 65 5f 61 73 73 6f 63 20 7b 0a 20 20 20 20 4c   e_assoc {.    L
0fd0: 45 46 54 2c 0a 20 20 20 20 52 49 47 48 54 2c 0a  EFT,.    RIGHT,.
0fe0: 20 20 20 20 4e 4f 4e 45 2c 0a 20 20 20 20 55 4e      NONE,.    UN
0ff0: 4b 0a 7d 3b 0a 73 74 72 75 63 74 20 73 79 6d 62  K.};.struct symb
1000: 6f 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ol {.  const cha
1010: 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  r *name;        
1020: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
1030: 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  ymbol */.  int i
1040: 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
1050: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
1060: 62 65 72 20 66 6f 72 20 74 68 69 73 20 73 79 6d  ber for this sym
1070: 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 73 79  bol */.  enum sy
1080: 6d 62 6f 6c 5f 74 79 70 65 20 74 79 70 65 3b 20  mbol_type type; 
1090: 20 20 2f 2a 20 53 79 6d 62 6f 6c 73 20 61 72 65    /* Symbols are
10a0: 20 61 6c 6c 20 65 69 74 68 65 72 20 54 45 52 4d   all either TERM
10b0: 49 4e 41 4c 53 20 6f 72 20 4e 54 73 20 2a 2f 0a  INALS or NTs */.
10c0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
10d0: 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  ule;       /* Li
10e0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 72 75 6c  nked list of rul
10f0: 65 73 20 6f 66 20 74 68 69 73 20 28 69 66 20 61  es of this (if a
1100: 6e 20 4e 54 29 20 2a 2f 0a 20 20 73 74 72 75 63  n NT) */.  struc
1110: 74 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61  t symbol *fallba
1120: 63 6b 3b 20 2f 2a 20 66 61 6c 6c 62 61 63 6b 20  ck; /* fallback 
1130: 74 6f 6b 65 6e 20 69 6e 20 63 61 73 65 20 74 68  token in case th
1140: 69 73 20 74 6f 6b 65 6e 20 64 6f 65 73 6e 27 74  is token doesn't
1150: 20 70 61 72 73 65 20 2a 2f 0a 20 20 69 6e 74 20   parse */.  int 
1160: 70 72 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  prec;           
1170: 20 20 20 20 20 2f 2a 20 50 72 65 63 65 64 65 6e       /* Preceden
1180: 63 65 20 69 66 20 64 65 66 69 6e 65 64 20 28 2d  ce if defined (-
1190: 31 20 6f 74 68 65 72 77 69 73 65 29 20 2a 2f 0a  1 otherwise) */.
11a0: 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 61    enum e_assoc a
11b0: 73 73 6f 63 3b 20 20 20 20 20 20 2f 2a 20 41 73  ssoc;      /* As
11c0: 73 6f 63 69 61 74 69 76 69 74 79 20 69 66 20 70  sociativity if p
11d0: 72 65 63 65 64 65 6e 63 65 20 69 73 20 64 65 66  recedence is def
11e0: 69 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ined */.  char *
11f0: 66 69 72 73 74 73 65 74 3b 20 20 20 20 20 20 20  firstset;       
1200: 20 20 20 2f 2a 20 46 69 72 73 74 2d 73 65 74 20     /* First-set 
1210: 66 6f 72 20 61 6c 6c 20 72 75 6c 65 73 20 6f 66  for all rules of
1220: 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a   this symbol */.
1230: 20 20 42 6f 6f 6c 65 61 6e 20 6c 61 6d 62 64 61    Boolean lambda
1240: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
1250: 75 65 20 69 66 20 4e 54 20 61 6e 64 20 63 61 6e  ue if NT and can
1260: 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 6d 70   generate an emp
1270: 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69  ty string */.  i
1280: 6e 74 20 75 73 65 43 6e 74 3b 20 20 20 20 20 20  nt useCnt;      
1290: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12a0: 72 20 6f 66 20 74 69 6d 65 73 20 75 73 65 64 20  r of times used 
12b0: 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65 73 74 72  */.  char *destr
12c0: 75 63 74 6f 72 3b 20 20 20 20 20 20 20 20 2f 2a  uctor;        /*
12d0: 20 43 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   Code which exec
12e0: 75 74 65 73 20 77 68 65 6e 65 76 65 72 20 74 68  utes whenever th
12f0: 69 73 20 73 79 6d 62 6f 6c 20 69 73 0a 20 20 20  is symbol is.   
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1310: 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 70 70 65          ** poppe
1320: 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  d from the stack
1330: 20 64 75 72 69 6e 67 20 65 72 72 6f 72 20 70 72   during error pr
1340: 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e  ocessing */.  in
1350: 74 20 64 65 73 74 4c 69 6e 65 6e 6f 3b 20 20 20  t destLineno;   
1360: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
1370: 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72 74 20  umber for start 
1380: 6f 66 20 64 65 73 74 72 75 63 74 6f 72 20 2a 2f  of destructor */
1390: 0a 20 20 63 68 61 72 20 2a 64 61 74 61 74 79 70  .  char *datatyp
13a0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
13b0: 68 65 20 64 61 74 61 20 74 79 70 65 20 6f 66 20  he data type of 
13c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c 64  information held
13d0: 20 62 79 20 74 68 69 73 0a 20 20 20 20 20 20 20   by this.       
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f      ** object. O
1400: 6e 6c 79 20 75 73 65 64 20 69 66 20 74 79 70 65  nly used if type
1410: 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f  ==NONTERMINAL */
1420: 0a 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20 20  .  int dtnum;   
1430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1440: 68 65 20 64 61 74 61 20 74 79 70 65 20 6e 75 6d  he data type num
1450: 62 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61 72  ber.  In the par
1460: 73 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a 20  ser, the value. 
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61            ** sta
1490: 63 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20 20  ck is a union.  
14a0: 54 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65 6e  The .yy%d elemen
14b0: 74 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20 20  t of this.      
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d0: 20 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20 69 73       ** union is
14e0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 64 61 74   the correct dat
14f0: 61 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20  a type for this 
1500: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 2f 2a 20 54  object */.  /* T
1510: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1520: 6c 64 73 20 61 72 65 20 75 73 65 64 20 62 79 20  lds are used by 
1530: 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 73 20 6f  MULTITERMINALs o
1540: 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 75  nly */.  int nsu
1550: 62 73 79 6d 3b 20 20 20 20 20 20 20 20 20 20 20  bsym;           
1560: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1570: 6f 6e 73 74 69 74 75 65 6e 74 20 73 79 6d 62 6f  onstituent symbo
1580: 6c 73 20 69 6e 20 74 68 65 20 4d 55 4c 54 49 20  ls in the MULTI 
1590: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
15a0: 6f 6c 20 2a 2a 73 75 62 73 79 6d 3b 20 20 2f 2a  ol **subsym;  /*
15b0: 20 41 72 72 61 79 20 6f 66 20 63 6f 6e 73 74 69   Array of consti
15c0: 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 2a 2f  tuent symbols */
15d0: 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70 72 6f  .};../* Each pro
15e0: 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 69 6e 20  duction rule in 
15f0: 74 68 65 20 67 72 61 6d 6d 61 72 20 69 73 20 73  the grammar is s
1600: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 66 6f 6c  tored in the fol
1610: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
1620: 75 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63 74 20  ure.  */.struct 
1630: 72 75 6c 65 20 7b 0a 20 20 73 74 72 75 63 74 20  rule {.  struct 
1640: 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20  symbol *lhs;    
1650: 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73    /* Left-hand s
1660: 69 64 65 20 6f 66 20 74 68 65 20 72 75 6c 65 20  ide of the rule 
1670: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1680: 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 2f 2a  *lhsalias;    /*
1690: 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c   Alias for the L
16a0: 48 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65  HS (NULL if none
16b0: 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 68 73 53 74  ) */.  int lhsSt
16c0: 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  art;            
16d0: 2f 2a 20 54 72 75 65 20 69 66 20 6c 65 66 74 2d  /* True if left-
16e0: 68 61 6e 64 20 73 69 64 65 20 69 73 20 74 68 65  hand side is the
16f0: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f   start symbol */
1700: 0a 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e 65 3b  .  int ruleline;
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1720: 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ine number for t
1730: 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74  he rule */.  int
1740: 20 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20 20   nrhs;          
1750: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1760: 6f 66 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a  of RHS symbols *
1770: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
1780: 6c 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f 2a 20  l **rhs;     /* 
1790: 54 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 73 20  The RHS symbols 
17a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
17b0: 2a 2a 72 68 73 61 6c 69 61 73 3b 20 20 20 2f 2a  **rhsalias;   /*
17c0: 20 41 6e 20 61 6c 69 61 73 20 66 6f 72 20 65 61   An alias for ea
17d0: 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 4e  ch RHS symbol (N
17e0: 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a  ULL if none) */.
17f0: 20 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20 20 20    int line;     
1800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1810: 6e 65 20 6e 75 6d 62 65 72 20 61 74 20 77 68 69  ne number at whi
1820: 63 68 20 63 6f 64 65 20 62 65 67 69 6e 73 20 2a  ch code begins *
1830: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1840: 63 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  code;        /* 
1850: 54 68 65 20 63 6f 64 65 20 65 78 65 63 75 74 65  The code execute
1860: 64 20 77 68 65 6e 20 74 68 69 73 20 72 75 6c 65  d when this rule
1870: 20 69 73 20 72 65 64 75 63 65 64 20 2a 2f 0a 20   is reduced */. 
1880: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1890: 70 72 65 63 73 79 6d 3b 20 20 2f 2a 20 50 72 65  precsym;  /* Pre
18a0: 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 66  cedence symbol f
18b0: 6f 72 20 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a  or this rule */.
18c0: 20 20 69 6e 74 20 69 6e 64 65 78 3b 20 20 20 20    int index;    
18d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
18e0: 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 66 6f   index number fo
18f0: 72 20 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20  r this rule */. 
1900: 20 42 6f 6f 6c 65 61 6e 20 63 61 6e 52 65 64 75   Boolean canRedu
1910: 63 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ce;       /* Tru
1920: 65 20 69 66 20 74 68 69 73 20 72 75 6c 65 20 69  e if this rule i
1930: 73 20 65 76 65 72 20 72 65 64 75 63 65 64 20 2a  s ever reduced *
1940: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
1950: 2a 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20  *nextlhs;    /* 
1960: 4e 65 78 74 20 72 75 6c 65 20 77 69 74 68 20 74  Next rule with t
1970: 68 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20  he same LHS */. 
1980: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65   struct rule *ne
1990: 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  xt;       /* Nex
19a0: 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 6c  t rule in the gl
19b0: 6f 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a  obal list */.};.
19c0: 0a 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72 61 74  ./* A configurat
19d0: 69 6f 6e 20 69 73 20 61 20 70 72 6f 64 75 63 74  ion is a product
19e0: 69 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68 65 20  ion rule of the 
19f0: 67 72 61 6d 6d 61 72 20 74 6f 67 65 74 68 65 72  grammar together
1a00: 20 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20   with.** a mark 
1a10: 28 64 6f 74 29 20 73 68 6f 77 69 6e 67 20 68 6f  (dot) showing ho
1a20: 77 20 6d 75 63 68 20 6f 66 20 74 68 61 74 20 72  w much of that r
1a30: 75 6c 65 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ule has been pro
1a40: 63 65 73 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a  cessed so far..*
1a50: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  * Configurations
1a60: 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20   also contain a 
1a70: 66 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69 63 68  follow-set which
1a80: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 65   is a list of te
1a90: 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c  rminal.** symbol
1aa0: 73 20 77 68 69 63 68 20 61 72 65 20 61 6c 6c 6f  s which are allo
1ab0: 77 65 64 20 74 6f 20 69 6d 6d 65 64 69 61 74 65  wed to immediate
1ac0: 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e  ly follow the en
1ad0: 64 20 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a  d of the rule..*
1ae0: 2a 20 45 76 65 72 79 20 63 6f 6e 66 69 67 75 72  * Every configur
1af0: 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65  ation is recorde
1b00: 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  d as an instance
1b10: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1b20: 67 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66 67 73 74  g: */.enum cfgst
1b30: 61 74 75 73 20 7b 0a 20 20 43 4f 4d 50 4c 45 54  atus {.  COMPLET
1b40: 45 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45 54 45 0a  E,.  INCOMPLETE.
1b50: 7d 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  };.struct config
1b60: 20 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65   {.  struct rule
1b70: 20 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a   *rp;         /*
1b80: 20 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77   The rule upon w
1b90: 68 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75  hich the configu
1ba0: 72 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20  ration is based 
1bb0: 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20  */.  int dot;   
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bd0: 20 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74   The parse point
1be0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b   */.  char *fws;
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c00: 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72  * Follow-set for
1c10: 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74   this configurat
1c20: 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ion only */.  st
1c30: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70  ruct plink *fplp
1c40: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ;      /* Follow
1c50: 2d 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f  -set forward pro
1c60: 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a  pagation links *
1c70: 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  /.  struct plink
1c80: 20 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20   *bplp;      /* 
1c90: 46 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77  Follow-set backw
1ca0: 61 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e  ards propagation
1cb0: 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75   links */.  stru
1cc0: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
1cd0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1ce0: 74 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63  to state which c
1cf0: 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a  ontains this */.
1d00: 20 20 65 6e 75 6d 20 63 66 67 73 74 61 74 75 73    enum cfgstatus
1d10: 20 73 74 61 74 75 73 3b 20 20 20 2f 2a 20 75 73   status;   /* us
1d20: 65 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c 6f 77  ed during follow
1d30: 73 65 74 20 61 6e 64 20 73 68 69 66 74 20 63 6f  set and shift co
1d40: 6d 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  mputations */.  
1d50: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
1d60: 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74  ext;     /* Next
1d70: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69   configuration i
1d80: 6e 20 74 68 65 20 73 74 61 74 65 20 2a 2f 0a 20  n the state */. 
1d90: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
1da0: 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  bp;       /* The
1db0: 20 6e 65 78 74 20 62 61 73 69 73 20 63 6f 6e 66   next basis conf
1dc0: 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a  iguration */.};.
1dd0: 0a 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 7b  .enum e_action {
1de0: 0a 20 20 53 48 49 46 54 2c 0a 20 20 41 43 43 45  .  SHIFT,.  ACCE
1df0: 50 54 2c 0a 20 20 52 45 44 55 43 45 2c 0a 20 20  PT,.  REDUCE,.  
1e00: 45 52 52 4f 52 2c 0a 20 20 53 53 43 4f 4e 46 4c  ERROR,.  SSCONFL
1e10: 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  ICT,            
1e20: 20 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68 69    /* A shift/shi
1e30: 66 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ft conflict */. 
1e40: 20 53 52 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20   SRCONFLICT,    
1e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73            /* Was
1e60: 20 61 20 72 65 64 75 63 65 2c 20 62 75 74 20 70   a reduce, but p
1e70: 61 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c 69 63  art of a conflic
1e80: 74 20 2a 2f 0a 20 20 52 52 43 4f 4e 46 4c 49 43  t */.  RRCONFLIC
1e90: 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T,              
1ea0: 2f 2a 20 57 61 73 20 61 20 72 65 64 75 63 65 2c  /* Was a reduce,
1eb0: 20 62 75 74 20 70 61 72 74 20 6f 66 20 61 20 63   but part of a c
1ec0: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53 48 5f  onflict */.  SH_
1ed0: 52 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20  RESOLVED,       
1ee0: 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 73        /* Was a s
1ef0: 68 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e 63  hift.  Precedenc
1f00: 65 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c  e resolved confl
1f10: 69 63 74 20 2a 2f 0a 20 20 52 44 5f 52 45 53 4f  ict */.  RD_RESO
1f20: 4c 56 45 44 2c 20 20 20 20 20 20 20 20 20 20 20  LVED,           
1f30: 20 20 2f 2a 20 57 61 73 20 72 65 64 75 63 65 2e    /* Was reduce.
1f40: 20 20 50 72 65 63 65 64 65 6e 63 65 20 72 65 73    Precedence res
1f50: 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a  olved conflict *
1f60: 2f 0a 20 20 4e 4f 54 5f 55 53 45 44 20 20 20 20  /.  NOT_USED    
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f80: 44 65 6c 65 74 65 64 20 62 79 20 63 6f 6d 70 72  Deleted by compr
1f90: 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ession */.};../*
1fa0: 20 45 76 65 72 79 20 73 68 69 66 74 20 6f 72 20   Every shift or 
1fb0: 72 65 64 75 63 65 20 6f 70 65 72 61 74 69 6f 6e  reduce operation
1fc0: 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 6f 6e   is stored as on
1fd0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1fe0: 6e 67 20 2a 2f 0a 73 74 72 75 63 74 20 61 63 74  ng */.struct act
1ff0: 69 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ion {.  struct s
2000: 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20 20 20 20  ymbol *sp;      
2010: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 2d 61 68 65   /* The look-ahe
2020: 61 64 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 65  ad symbol */.  e
2030: 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79 70  num e_action typ
2040: 65 3b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  e;.  union {.   
2050: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
2060: 74 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  tp;     /* The n
2070: 65 77 20 73 74 61 74 65 2c 20 69 66 20 61 20 73  ew state, if a s
2080: 68 69 66 74 20 2a 2f 0a 20 20 20 20 73 74 72 75  hift */.    stru
2090: 63 74 20 72 75 6c 65 20 2a 72 70 3b 20 20 20 20  ct rule *rp;    
20a0: 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 2c 20     /* The rule, 
20b0: 69 66 20 61 20 72 65 64 75 63 65 20 2a 2f 0a 20  if a reduce */. 
20c0: 20 7d 20 78 3b 0a 20 20 73 74 72 75 63 74 20 61   } x;.  struct a
20d0: 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20 20 20 20  ction *next;    
20e0: 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20   /* Next action 
20f0: 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20 2a  for this state *
2100: 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  /.  struct actio
2110: 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 2f 2a 20  n *collide;  /* 
2120: 4e 65 78 74 20 61 63 74 69 6f 6e 20 77 69 74 68  Next action with
2130: 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
2140: 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 73 74  /.};../* Each st
2150: 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ate of the gener
2160: 61 74 65 64 20 70 61 72 73 65 72 27 73 20 66 69  ated parser's fi
2170: 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69  nite state machi
2180: 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f 64 65 64  ne.** is encoded
2190: 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   as an instance 
21a0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
21b0: 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 73   structure. */.s
21c0: 74 72 75 63 74 20 73 74 61 74 65 20 7b 0a 20 20  truct state {.  
21d0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
21e0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
21f0: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
2200: 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74  ions for this st
2210: 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
2220: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 20 20  config *cfp;    
2230: 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66 69 67 75    /* All configu
2240: 72 61 74 69 6f 6e 73 20 69 6e 20 74 68 69 73 20  rations in this 
2250: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 73 74 61  set */.  int sta
2260: 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  tenum;          
2270: 20 20 2f 2a 20 53 65 71 75 65 6e 74 69 61 6c 20    /* Sequential 
2280: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
2290: 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  state */.  struc
22a0: 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 20 20 20  t action *ap;   
22b0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
22c0: 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73  actions for this
22d0: 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20   state */.  int 
22e0: 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74 41 63 74 3b  nTknAct, nNtAct;
22f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2300: 66 20 61 63 74 69 6f 6e 73 20 6f 6e 20 74 65 72  f actions on ter
2310: 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65  minals and nonte
2320: 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e 74  rminals */.  int
2330: 20 69 54 6b 6e 4f 66 73 74 2c 20 69 4e 74 4f 66   iTknOfst, iNtOf
2340: 73 74 3b 20 20 20 2f 2a 20 79 79 5f 61 63 74 69  st;   /* yy_acti
2350: 6f 6e 5b 5d 20 6f 66 66 73 65 74 20 66 6f 72 20  on[] offset for 
2360: 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f  terminals and no
2370: 6e 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  nterms */.  int 
2380: 69 44 66 6c 74 3b 20 20 20 20 20 20 20 20 20 20  iDflt;          
2390: 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20       /* Default 
23a0: 61 63 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 64 65  action */.};.#de
23b0: 66 69 6e 65 20 4e 4f 5f 4f 46 46 53 45 54 20 28  fine NO_OFFSET (
23c0: 2d 32 31 34 37 34 38 33 36 34 37 29 0a 0a 2f 2a  -2147483647)../*
23d0: 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 70 72 6f   A followset pro
23e0: 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 20 69 6e  pagation link in
23f0: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
2400: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6f 6e 65   contents of one
2410: 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  .** configuratio
2420: 6e 20 66 6f 6c 6c 6f 77 73 65 74 20 73 68 6f 75  n followset shou
2430: 6c 64 20 62 65 20 70 72 6f 70 61 67 61 74 65 64  ld be propagated
2440: 20 74 6f 20 61 6e 6f 74 68 65 72 20 77 68 65 6e   to another when
2450: 65 76 65 72 0a 2a 2a 20 74 68 65 20 66 69 72 73  ever.** the firs
2460: 74 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 73 74  t changes. */.st
2470: 72 75 63 74 20 70 6c 69 6e 6b 20 7b 0a 20 20 73  ruct plink {.  s
2480: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
2490: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  p;      /* The c
24a0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20  onfiguration to 
24b0: 77 68 69 63 68 20 6c 69 6e 6b 65 64 20 2a 2f 0a  which linked */.
24c0: 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
24d0: 6e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 54 68  next;      /* Th
24e0: 65 20 6e 65 78 74 20 70 72 6f 70 61 67 61 74 65  e next propagate
24f0: 20 6c 69 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20   link */.};../* 
2500: 54 68 65 20 73 74 61 74 65 20 76 65 63 74 6f 72  The state vector
2510: 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
2520: 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
2530: 20 69 73 20 72 65 63 6f 72 64 65 64 20 61 73 0a   is recorded as.
2540: 2a 2a 20 66 6f 6c 6c 6f 77 73 2e 20 20 28 4c 45  ** follows.  (LE
2550: 4d 4f 4e 20 75 73 65 73 20 6e 6f 20 67 6c 6f 62  MON uses no glob
2560: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64  al variables and
2570: 20 6d 61 6b 65 73 20 6c 69 74 74 6c 65 20 75 73   makes little us
2580: 65 20 6f 66 0a 2a 2a 20 73 74 61 74 69 63 20 76  e of.** static v
2590: 61 72 69 61 62 6c 65 73 2e 20 20 46 69 65 6c 64  ariables.  Field
25a0: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
25b0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  ng structure can
25c0: 20 62 65 20 74 68 6f 75 67 68 74 0a 2a 2a 20 6f   be thought.** o
25d0: 66 20 61 73 20 62 65 67 69 6e 20 67 6c 6f 62 61  f as begin globa
25e0: 6c 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74  l variables in t
25f0: 68 65 20 70 72 6f 67 72 61 6d 2e 29 20 2a 2f 0a  he program.) */.
2600: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 7b 0a 20  struct lemon {. 
2610: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a   struct state **
2620: 73 6f 72 74 65 64 3b 20 20 20 2f 2a 20 54 61 62  sorted;   /* Tab
2630: 6c 65 20 6f 66 20 73 74 61 74 65 73 20 73 6f 72  le of states sor
2640: 74 65 64 20 62 79 20 73 74 61 74 65 20 6e 75 6d  ted by state num
2650: 62 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ber */.  struct 
2660: 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20 20 20 20  rule *rule;     
2670: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
2680: 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20   rules */.  int 
2690: 6e 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20  nstate;         
26a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
26b0: 66 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 69 6e  f states */.  in
26c0: 74 20 6e 72 75 6c 65 3b 20 20 20 20 20 20 20 20  t nrule;        
26d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
26e0: 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69   of rules */.  i
26f0: 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20 20 20 20  nt nsymbol;     
2700: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2710: 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 61 6e  r of terminal an
2720: 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 73 79  d nonterminal sy
2730: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  mbols */.  int n
2740: 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20 20 20  terminal;       
2750: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2760: 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c   terminal symbol
2770: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  s */.  struct sy
2780: 6d 62 6f 6c 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20  mbol **symbols; 
2790: 2f 2a 20 53 6f 72 74 65 64 20 61 72 72 61 79 20  /* Sorted array 
27a0: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  of pointers to s
27b0: 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  ymbols */.  int 
27c0: 65 72 72 6f 72 63 6e 74 3b 20 20 20 20 20 20 20  errorcnt;       
27d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
27e0: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73 74  f errors */.  st
27f0: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65 72 72  ruct symbol *err
2800: 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65 20 65 72  sym;   /* The er
2810: 72 6f 72 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20  ror symbol */.  
2820: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 77  struct symbol *w
2830: 69 6c 64 63 61 72 64 3b 20 2f 2a 20 54 6f 6b 65  ildcard; /* Toke
2840: 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61  n that matches a
2850: 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 63 68 61  nything */.  cha
2860: 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  r *name;        
2870: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2880: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 70   the generated p
2890: 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  arser */.  char 
28a0: 2a 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  *arg;           
28b0: 20 20 20 20 2f 2a 20 44 65 63 6c 61 72 61 74 69      /* Declarati
28c0: 6f 6e 20 6f 66 20 74 68 65 20 33 74 68 20 61 72  on of the 3th ar
28d0: 67 75 6d 65 6e 74 20 74 6f 20 70 61 72 73 65 72  gument to parser
28e0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65   */.  char *toke
28f0: 6e 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 2f  ntype;         /
2900: 2a 20 54 79 70 65 20 6f 66 20 74 65 72 6d 69 6e  * Type of termin
2910: 61 6c 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68  al symbols in th
2920: 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a  e parser stack *
2930: 2f 0a 20 20 63 68 61 72 20 2a 76 61 72 74 79 70  /.  char *vartyp
2940: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2950: 54 68 65 20 64 65 66 61 75 6c 74 20 74 79 70 65  The default type
2960: 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c   of non-terminal
2970: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68   symbols */.  ch
2980: 61 72 20 2a 73 74 61 72 74 3b 20 20 20 20 20 20  ar *start;      
2990: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
29a0: 66 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62  f the start symb
29b0: 6f 6c 20 66 6f 72 20 74 68 65 20 67 72 61 6d 6d  ol for the gramm
29c0: 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74  ar */.  char *st
29d0: 61 63 6b 73 69 7a 65 3b 20 20 20 20 20 20 20 20  acksize;        
29e0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
29f0: 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a  parser stack */.
2a00: 20 20 63 68 61 72 20 2a 69 6e 63 6c 75 64 65 3b    char *include;
2a10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2a20: 64 65 20 74 6f 20 70 75 74 20 61 74 20 74 68 65  de to put at the
2a30: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 43 20   start of the C 
2a40: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2a50: 65 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20  error;          
2a60: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
2a70: 65 63 75 74 65 20 77 68 65 6e 20 61 6e 20 65 72  ecute when an er
2a80: 72 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  ror is seen */. 
2a90: 20 63 68 61 72 20 2a 6f 76 65 72 66 6c 6f 77 3b   char *overflow;
2aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64            /* Cod
2ab0: 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e 20  e to execute on 
2ac0: 61 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77  a stack overflow
2ad0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 61 69 6c   */.  char *fail
2ae0: 75 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ure;           /
2af0: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
2b00: 65 20 6f 6e 20 70 61 72 73 65 72 20 66 61 69 6c  e on parser fail
2b10: 75 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ure */.  char *a
2b20: 63 63 65 70 74 3b 20 20 20 20 20 20 20 20 20 20  ccept;          
2b30: 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65    /* Code to exe
2b40: 63 75 74 65 20 77 68 65 6e 20 74 68 65 20 70 61  cute when the pa
2b50: 72 73 65 72 20 65 78 63 65 70 74 73 20 2a 2f 0a  rser excepts */.
2b60: 20 20 63 68 61 72 20 2a 65 78 74 72 61 63 6f 64    char *extracod
2b70: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  e;         /* Co
2b80: 64 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  de appended to t
2b90: 68 65 20 67 65 6e 65 72 61 74 65 64 20 66 69 6c  he generated fil
2ba0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  e */.  char *tok
2bb0: 65 6e 64 65 73 74 3b 20 20 20 20 20 20 20 20 20  endest;         
2bc0: 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75  /* Code to execu
2bd0: 74 65 20 74 6f 20 64 65 73 74 72 6f 79 20 74 6f  te to destroy to
2be0: 6b 65 6e 20 64 61 74 61 20 2a 2f 0a 20 20 63 68  ken data */.  ch
2bf0: 61 72 20 2a 76 61 72 64 65 73 74 3b 20 20 20 20  ar *vardest;    
2c00: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 66         /* Code f
2c10: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 6e  or the default n
2c20: 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 64 65 73 74  on-terminal dest
2c30: 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72  ructor */.  char
2c40: 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20   *filename;     
2c50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2c60: 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a  the input file *
2c70: 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e 61 6d  /.  char *outnam
2c80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2c90: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72  Name of the curr
2ca0: 65 6e 74 20 6f 75 74 70 75 74 20 66 69 6c 65 20  ent output file 
2cb0: 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e  */.  char *token
2cc0: 70 72 65 66 69 78 3b 20 20 20 20 20 20 20 2f 2a  prefix;       /*
2cd0: 20 41 20 70 72 65 66 69 78 20 61 64 64 65 64 20   A prefix added 
2ce0: 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73 20 69  to token names i
2cf0: 6e 20 74 68 65 20 2e 68 20 66 69 6c 65 20 2a 2f  n the .h file */
2d00: 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69 63 74  .  int nconflict
2d10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
2d20: 75 6d 62 65 72 20 6f 66 20 70 61 72 73 69 6e 67  umber of parsing
2d30: 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20   conflicts */.  
2d40: 69 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b 20 20  int tablesize;  
2d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2d60: 20 6f 66 20 74 68 65 20 70 61 72 73 65 20 74 61   of the parse ta
2d70: 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 61  bles */.  int ba
2d80: 73 69 73 66 6c 61 67 3b 20 20 20 20 20 20 20 20  sisflag;        
2d90: 20 20 20 2f 2a 20 50 72 69 6e 74 20 6f 6e 6c 79     /* Print only
2da0: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
2db0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 68  tions */.  int h
2dc0: 61 73 5f 66 61 6c 6c 62 61 63 6b 3b 20 20 20 20  as_fallback;    
2dd0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2de0: 6e 79 20 25 66 61 6c 6c 62 61 63 6b 20 69 73 20  ny %fallback is 
2df0: 73 65 65 6e 20 69 6e 20 74 68 65 20 67 72 61 6d  seen in the gram
2e00: 6d 61 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 6c  mar */.  int nol
2e10: 69 6e 65 6e 6f 73 66 6c 61 67 3b 20 20 20 20 20  inenosflag;     
2e20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 23 6c 69    /* True if #li
2e30: 6e 65 20 73 74 61 74 65 6d 65 6e 74 73 20 73 68  ne statements sh
2e40: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 72 69 6e  ould not be prin
2e50: 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ted */.  char *a
2e60: 72 67 76 30 3b 20 20 20 20 20 20 20 20 20 20 20  rgv0;           
2e70: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2e80: 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a   program */.};..
2e90: 23 64 65 66 69 6e 65 20 4d 65 6d 6f 72 79 43 68  #define MemoryCh
2ea0: 65 63 6b 28 58 29 20 69 66 28 28 58 29 3d 3d 30  eck(X) if((X)==0
2eb0: 29 7b 20 5c 0a 20 20 65 78 74 65 72 6e 20 76 6f  ){ \.  extern vo
2ec0: 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  id memory_error(
2ed0: 29 3b 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f 65 72  ); \.  memory_er
2ee0: 72 6f 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a  ror(); \.}../***
2ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
2f00: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74 61 62  om the file "tab
2f10: 6c 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le.h" **********
2f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f30: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41  *******/./*.** A
2f40: 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20  ll code in this 
2f50: 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75  file has been au
2f60: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65  tomatically gene
2f70: 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20  rated.** from a 
2f80: 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e  specification in
2f90: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20   the file.**    
2fa0: 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
2fb0: 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73  .q".** by the as
2fc0: 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
2fd0: 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72  code building pr
2fe0: 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a  ogram "aagen"..*
2ff0: 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68  * Do not edit th
3000: 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61  is file!  Instea
3010: 64 2c 20 65 64 69 74 20 74 68 65 20 73 70 65 63  d, edit the spec
3020: 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c  ification.** fil
3030: 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61  e, then rerun aa
3040: 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f  gen..*/./*.** Co
3050: 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  de for processin
3060: 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  g tables in the 
3070: 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
3080: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 2f 2a 20 52 6f  erator..*/./* Ro
3090: 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c  utines for handl
30a0: 69 6e 67 20 61 20 73 74 72 69 6e 67 73 20 2a 2f  ing a strings */
30b0: 0a 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74  ..const char *St
30c0: 72 73 61 66 65 28 63 6f 6e 73 74 20 63 68 61 72  rsafe(const char
30d0: 20 2a 29 3b 0a 0a 76 6f 69 64 20 53 74 72 73 61   *);..void Strsa
30e0: 66 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69  fe_init(void);.i
30f0: 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72  nt Strsafe_inser
3100: 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  t(const char *);
3110: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72  .const char *Str
3120: 73 61 66 65 5f 66 69 6e 64 28 63 6f 6e 73 74 20  safe_find(const 
3130: 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 20 52 6f 75  char *);../* Rou
3140: 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69  tines for handli
3150: 6e 67 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68  ng symbols of th
3160: 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a 73 74  e grammar */..st
3170: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d  ruct symbol *Sym
3180: 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73 74 20 63 68  bol_new(const ch
3190: 61 72 20 2a 29 3b 0a 69 6e 74 20 53 79 6d 62 6f  ar *);.int Symbo
31a0: 6c 63 6d 70 70 28 63 6f 6e 73 74 20 76 6f 69 64  lcmpp(const void
31b0: 20 2a 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   *, const void *
31c0: 29 3b 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69  );.void Symbol_i
31d0: 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53  nit(void);.int S
31e0: 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 74 72  ymbol_insert(str
31f0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2c 20 63 6f  uct symbol *, co
3200: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72  nst char *);.str
3210: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
3220: 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68  ol_find(const ch
3230: 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 79  ar *);.struct sy
3240: 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68  mbol *Symbol_Nth
3250: 28 69 6e 74 29 3b 0a 69 6e 74 20 53 79 6d 62 6f  (int);.int Symbo
3260: 6c 5f 63 6f 75 6e 74 28 76 6f 69 64 29 3b 0a 73  l_count(void);.s
3270: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53  truct symbol **S
3280: 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 76 6f  ymbol_arrayof(vo
3290: 69 64 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65  id);../* Routine
32a0: 73 20 74 6f 20 6d 61 6e 61 67 65 20 74 68 65 20  s to manage the 
32b0: 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 0a  state table */..
32c0: 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 63 6f  int Configcmp(co
32d0: 6e 73 74 20 63 68 61 72 20 2a 2c 20 63 6f 6e 73  nst char *, cons
32e0: 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72 75 63  t char *);.struc
32f0: 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e  t state *State_n
3300: 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20 53  ew(void);.void S
3310: 74 61 74 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b  tate_init(void);
3320: 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72  .int State_inser
3330: 74 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  t(struct state *
3340: 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
3350: 2a 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65  *);.struct state
3360: 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 73 74 72   *State_find(str
3370: 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73  uct config *);.s
3380: 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74  truct state **St
3390: 61 74 65 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20  ate_arrayof(/*  
33a0: 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65  */);../* Routine
33b0: 73 20 75 73 65 64 20 66 6f 72 20 65 66 66 69 63  s used for effic
33c0: 69 65 6e 63 79 20 69 6e 20 43 6f 6e 66 69 67 6c  iency in Configl
33d0: 69 73 74 5f 61 64 64 20 2a 2f 0a 0a 76 6f 69 64  ist_add */..void
33e0: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69   Configtable_ini
33f0: 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 43 6f 6e  t(void);.int Con
3400: 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
3410: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
3420: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
3430: 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e  *Configtable_fin
3440: 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  d(struct config 
3450: 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74  *);.void Configt
3460: 61 62 6c 65 5f 63 6c 65 61 72 28 69 6e 74 28 2a  able_clear(int(*
3470: 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  )(struct config 
3480: 2a 29 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *));../*********
3490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
34a0: 68 65 20 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e  he file "action.
34b0: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
34c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34d0: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  **/./*.** Routin
34e0: 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20 70 61  es processing pa
34f0: 72 73 65 72 20 61 63 74 69 6f 6e 73 20 69 6e 20  rser actions in 
3500: 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
3510: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
3520: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
3530: 77 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 20  w parser action 
3540: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
3550: 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f   action *Action_
3560: 6e 65 77 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  new(void){.  sta
3570: 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69 6f  tic struct actio
3580: 6e 20 2a 66 72 65 65 6c 69 73 74 20 3d 20 30 3b  n *freelist = 0;
3590: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
35a0: 20 2a 6e 65 77 61 63 74 69 6f 6e 3b 0a 0a 20 20   *newaction;..  
35b0: 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20  if( freelist==0 
35c0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
35d0: 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b    int amt = 100;
35e0: 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20  .    freelist = 
35f0: 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  (struct action *
3600: 29 63 61 6c 6c 6f 63 28 61 6d 74 2c 20 73 69 7a  )calloc(amt, siz
3610: 65 6f 66 28 73 74 72 75 63 74 20 61 63 74 69 6f  eof(struct actio
3620: 6e 29 29 3b 0a 20 20 20 20 69 66 28 20 66 72 65  n));.    if( fre
3630: 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
3640: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
3650: 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  ,"Unable to allo
3660: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
3670: 61 20 6e 65 77 20 70 61 72 73 65 72 20 61 63 74  a new parser act
3680: 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65 78  ion.");.      ex
3690: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
36a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d   for(i=0; i<amt-
36b0: 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69 73 74  1; i++) freelist
36c0: 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65 65  [i].next = &free
36d0: 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66  list[i+1];.    f
36e0: 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e  reelist[amt-1].n
36f0: 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ext = 0;.  }.  n
3700: 65 77 61 63 74 69 6f 6e 20 3d 20 66 72 65 65 6c  ewaction = freel
3710: 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20  ist;.  freelist 
3720: 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74  = freelist->next
3730: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 61 63  ;.  return newac
3740: 74 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70  tion;.}../* Comp
3750: 61 72 65 20 74 77 6f 20 61 63 74 69 6f 6e 73 20  are two actions 
3760: 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70  for sorting purp
3770: 6f 73 65 73 2e 20 20 52 65 74 75 72 6e 20 6e 65  oses.  Return ne
3780: 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
3790: 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 69 66 20  .** positive if 
37a0: 74 68 65 20 66 69 72 73 74 20 61 63 74 69 6f 6e  the first action
37b0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
37c0: 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
37d0: 74 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ter than.** the 
37e0: 66 69 72 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20  first.*/.static 
37f0: 69 6e 74 20 61 63 74 69 6f 6e 63 6d 70 28 0a 20  int actioncmp(. 
3800: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
3810: 61 70 31 2c 0a 20 20 73 74 72 75 63 74 20 61 63  ap1,.  struct ac
3820: 74 69 6f 6e 20 2a 61 70 32 0a 29 7b 0a 20 20 69  tion *ap2.){.  i
3830: 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 61 70  nt rc;.  rc = ap
3840: 31 2d 3e 73 70 2d 3e 69 6e 64 65 78 20 2d 20 61  1->sp->index - a
3850: 70 32 2d 3e 73 70 2d 3e 69 6e 64 65 78 3b 0a 20  p2->sp->index;. 
3860: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
3870: 20 20 72 63 20 3d 20 28 69 6e 74 29 61 70 31 2d    rc = (int)ap1-
3880: 3e 74 79 70 65 20 2d 20 28 69 6e 74 29 61 70 32  >type - (int)ap2
3890: 2d 3e 74 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66  ->type;.  }.  if
38a0: 28 20 72 63 3d 3d 30 20 26 26 20 61 70 31 2d 3e  ( rc==0 && ap1->
38b0: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a  type==REDUCE ){.
38c0: 20 20 20 20 72 63 20 3d 20 61 70 31 2d 3e 78 2e      rc = ap1->x.
38d0: 72 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d  rp->index - ap2-
38e0: 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20  >x.rp->index;.  
38f0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  }.  if( rc==0 ){
3900: 0a 20 20 20 20 72 63 20 3d 20 28 69 6e 74 29 20  .    rc = (int) 
3910: 28 61 70 32 20 2d 20 61 70 31 29 3b 0a 20 20 7d  (ap2 - ap1);.  }
3920: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3930: 0a 2f 2a 20 53 6f 72 74 20 70 61 72 73 65 72 20  ./* Sort parser 
3940: 61 63 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  actions */.stati
3950: 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  c struct action 
3960: 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 0a 20 20  *Action_sort(.  
3970: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
3980: 70 0a 29 7b 0a 20 20 61 70 20 3d 20 28 73 74 72  p.){.  ap = (str
3990: 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 6d 73 6f  uct action *)mso
39a0: 72 74 28 28 63 68 61 72 20 2a 29 61 70 2c 28 63  rt((char *)ap,(c
39b0: 68 61 72 20 2a 2a 29 26 61 70 2d 3e 6e 65 78 74  har **)&ap->next
39c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39e0: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
39f0: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
3a00: 29 61 63 74 69 6f 6e 63 6d 70 29 3b 0a 20 20 72  )actioncmp);.  r
3a10: 65 74 75 72 6e 20 61 70 3b 0a 7d 0a 0a 76 6f 69  eturn ap;.}..voi
3a20: 64 20 41 63 74 69 6f 6e 5f 61 64 64 28 0a 20 20  d Action_add(.  
3a30: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 2a  struct action **
3a40: 61 70 70 2c 0a 20 20 65 6e 75 6d 20 65 5f 61 63  app,.  enum e_ac
3a50: 74 69 6f 6e 20 74 79 70 65 2c 0a 20 20 73 74 72  tion type,.  str
3a60: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 0a  uct symbol *sp,.
3a70: 20 20 63 68 61 72 20 2a 61 72 67 0a 29 7b 0a 20    char *arg.){. 
3a80: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
3a90: 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e 65 77  newaction;.  new
3aa0: 61 63 74 69 6f 6e 20 3d 20 41 63 74 69 6f 6e 5f  action = Action_
3ab0: 6e 65 77 28 29 3b 0a 20 20 6e 65 77 61 63 74 69  new();.  newacti
3ac0: 6f 6e 2d 3e 6e 65 78 74 20 3d 20 2a 61 70 70 3b  on->next = *app;
3ad0: 0a 20 20 2a 61 70 70 20 3d 20 6e 65 77 61 63 74  .  *app = newact
3ae0: 69 6f 6e 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e  ion;.  newaction
3af0: 2d 3e 74 79 70 65 20 3d 20 74 79 70 65 3b 0a 20  ->type = type;. 
3b00: 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 73 70 20 3d   newaction->sp =
3b10: 20 73 70 3b 0a 20 20 69 66 28 20 74 79 70 65 3d   sp;.  if( type=
3b20: 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 6e 65  =SHIFT ){.    ne
3b30: 77 61 63 74 69 6f 6e 2d 3e 78 2e 73 74 70 20 3d  waction->x.stp =
3b40: 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a   (struct state *
3b50: 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )arg;.  }else{. 
3b60: 20 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78 2e     newaction->x.
3b70: 72 70 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c  rp = (struct rul
3b80: 65 20 2a 29 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f  e *)arg;.  }.}./
3b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ba0: 2a 2a 2a 2a 2a 2a 20 4e 65 77 20 63 6f 64 65 20  ****** New code 
3bb0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
3bc0: 20 22 61 63 74 74 61 62 22 20 6d 6f 64 75 6c 65   "acttab" module
3bd0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a   ***********/./*
3be0: 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20  .** This module 
3bf0: 69 6d 70 6c 65 6d 65 6e 74 73 20 72 6f 75 74 69  implements routi
3c00: 6e 65 73 20 75 73 65 20 74 6f 20 63 6f 6e 73 74  nes use to const
3c10: 72 75 63 74 20 74 68 65 20 79 79 5f 61 63 74 69  ruct the yy_acti
3c20: 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a  on[] table..*/..
3c30: 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65 20  /*.** The state 
3c40: 6f 66 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  of the yy_action
3c50: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
3c60: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6e 20  struction is an 
3c70: 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20 74  instance of.** t
3c80: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
3c90: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
3ca0: 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c  e yy_action tabl
3cb0: 65 20 6d 61 70 73 20 74 68 65 20 70 61 69 72 20  e maps the pair 
3cc0: 28 73 74 61 74 65 5f 6e 75 6d 62 65 72 2c 20 6c  (state_number, l
3cd0: 6f 6f 6b 61 68 65 61 64 29 20 69 6e 74 6f 20 61  ookahead) into a
3ce0: 6e 0a 2a 2a 20 61 63 74 69 6f 6e 5f 6e 75 6d 62  n.** action_numb
3cf0: 65 72 2e 20 20 54 68 65 20 74 61 62 6c 65 20 69  er.  The table i
3d00: 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e  s an array of in
3d10: 74 65 67 65 72 73 20 70 61 69 72 73 2e 20 20 54  tegers pairs.  T
3d20: 68 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 0a  he state_number.
3d30: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 61 6e  ** determines an
3d40: 20 69 6e 69 74 69 61 6c 20 6f 66 66 73 65 74 20   initial offset 
3d50: 69 6e 74 6f 20 74 68 65 20 79 79 5f 61 63 74 69  into the yy_acti
3d60: 6f 6e 20 61 72 72 61 79 2e 20 20 54 68 65 20 6c  on array.  The l
3d70: 6f 6f 6b 61 68 65 61 64 0a 2a 2a 20 76 61 6c 75  ookahead.** valu
3d80: 65 20 69 73 20 74 68 65 6e 20 61 64 64 65 64 20  e is then added 
3d90: 74 6f 20 74 68 69 73 20 69 6e 69 74 69 61 6c 20  to this initial 
3da0: 6f 66 66 73 65 74 20 74 6f 20 67 65 74 20 61 6e  offset to get an
3db0: 20 69 6e 64 65 78 20 58 20 69 6e 74 6f 20 74 68   index X into th
3dc0: 65 0a 2a 2a 20 79 79 5f 61 63 74 69 6f 6e 20 61  e.** yy_action a
3dd0: 72 72 61 79 2e 20 49 66 20 74 68 65 20 61 41 63  rray. If the aAc
3de0: 74 69 6f 6e 5b 58 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[X].lookahea
3df0: 64 20 65 71 75 61 6c 73 20 74 68 65 20 76 61 6c  d equals the val
3e00: 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 66 20  ue of the.** of 
3e10: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e  the lookahead in
3e20: 70 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  put, then the va
3e30: 6c 75 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f  lue of the actio
3e40: 6e 5f 6e 75 6d 62 65 72 20 6f 75 74 70 75 74 20  n_number output 
3e50: 69 73 0a 2a 2a 20 61 41 63 74 69 6f 6e 5b 58 5d  is.** aAction[X]
3e60: 2e 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  .action.  If the
3e70: 20 6c 6f 6f 6b 61 68 65 61 64 73 20 64 6f 20 6e   lookaheads do n
3e80: 6f 74 20 6d 61 74 63 68 20 74 68 65 6e 20 74 68  ot match then th
3e90: 65 0a 2a 2a 20 64 65 66 61 75 6c 74 20 61 63 74  e.** default act
3ea0: 69 6f 6e 20 66 6f 72 20 74 68 65 20 73 74 61 74  ion for the stat
3eb0: 65 5f 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75  e_number is retu
3ec0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  rned..**.** All 
3ed0: 61 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  actions associat
3ee0: 65 64 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ed with a single
3ef0: 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 61 72   state_number ar
3f00: 65 20 66 69 72 73 74 20 65 6e 74 65 72 65 64 0a  e first entered.
3f10: 2a 2a 20 69 6e 74 6f 20 61 4c 6f 6f 6b 61 68 65  ** into aLookahe
3f20: 61 64 5b 5d 20 75 73 69 6e 67 20 6d 75 6c 74 69  ad[] using multi
3f30: 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20 61 63 74  ple calls to act
3f40: 74 61 62 5f 61 63 74 69 6f 6e 28 29 2e 20 20 54  tab_action().  T
3f50: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 63 74 69  hen the .** acti
3f60: 6f 6e 73 20 66 6f 72 20 74 68 61 74 20 73 69 6e  ons for that sin
3f70: 67 6c 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72  gle state_number
3f80: 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 74 6f   are placed into
3f90: 20 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 0a   the aAction[] .
3fa0: 2a 2a 20 61 72 72 61 79 20 77 69 74 68 20 61 20  ** array with a 
3fb0: 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 61  single call to a
3fc0: 63 74 74 61 62 5f 69 6e 73 65 72 74 28 29 2e 20  cttab_insert(). 
3fd0: 20 54 68 65 20 61 63 74 74 61 62 5f 69 6e 73 65   The acttab_inse
3fe0: 72 74 28 29 20 63 61 6c 6c 0a 2a 2a 20 61 6c 73  rt() call.** als
3ff0: 6f 20 72 65 73 65 74 73 20 74 68 65 20 61 4c 6f  o resets the aLo
4000: 6f 6b 61 68 65 61 64 5b 5d 20 61 72 72 61 79 20  okahead[] array 
4010: 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66  in preparation f
4020: 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 73  or the next.** s
4030: 74 61 74 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a  tate number..*/.
4040: 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64  struct lookahead
4050: 5f 61 63 74 69 6f 6e 20 7b 0a 20 20 69 6e 74 20  _action {.  int 
4060: 6c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  lookahead;      
4070: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
4080: 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  of the lookahead
4090: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20   token */.  int 
40a0: 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  action;         
40b0: 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e         /* Action
40c0: 20 74 6f 20 74 61 6b 65 20 6f 6e 20 74 68 65 20   to take on the 
40d0: 67 69 76 65 6e 20 6c 6f 6f 6b 61 68 65 61 64 20  given lookahead 
40e0: 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74  */.};.typedef st
40f0: 72 75 63 74 20 61 63 74 74 61 62 20 61 63 74 74  ruct acttab actt
4100: 61 62 3b 0a 73 74 72 75 63 74 20 61 63 74 74 61  ab;.struct actta
4110: 62 20 7b 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f  b {.  int nActio
4120: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
4130: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4140: 75 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 41  used slots in aA
4150: 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ction[] */.  int
4160: 20 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20   nActionAlloc;  
4170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f            /* Slo
4180: 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ts allocated for
4190: 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20   aAction[] */.  
41a0: 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64  struct lookahead
41b0: 5f 61 63 74 69 6f 6e 0a 20 20 20 20 2a 61 41 63  _action.    *aAc
41c0: 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  tion,           
41d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 79 79         /* The yy
41e0: 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20  _action[] table 
41f0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4200: 6f 6e 20 2a 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b  on */.    *aLook
4210: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
4220: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
4230: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
4240: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e   set */.  int mn
4250: 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  Lookahead;      
4260: 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75         /* Minimu
4270: 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c  m aLookahead[].l
4280: 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e  ookahead */.  in
4290: 74 20 6d 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20  t mnAction;     
42a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
42b0: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
42c0: 77 69 74 68 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64  with mnLookahead
42d0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b   */.  int mxLook
42e0: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
42f0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 4c     /* Maximum aL
4300: 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61  ookahead[].looka
4310: 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  head */.  int nL
4320: 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20  ookahead;       
4330: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73         /* Used s
4340: 6c 6f 74 73 20 69 6e 20 61 4c 6f 6f 6b 61 68 65  lots in aLookahe
4350: 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  ad[] */.  int nL
4360: 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 3b 20 20  ookaheadAlloc;  
4370: 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20         /* Slots 
4380: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61 4c 6f  allocated in aLo
4390: 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 7d 3b 0a  okahead[] */.};.
43a0: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ./* Return the n
43b0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
43c0: 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f   in the yy_actio
43d0: 6e 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69  n table */.#defi
43e0: 6e 65 20 61 63 74 74 61 62 5f 73 69 7a 65 28 58  ne acttab_size(X
43f0: 29 20 28 28 58 29 2d 3e 6e 41 63 74 69 6f 6e 29  ) ((X)->nAction)
4400: 0a 0a 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66  ../* The value f
4410: 6f 72 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72  or the N-th entr
4420: 79 20 69 6e 20 79 79 5f 61 63 74 69 6f 6e 20 2a  y in yy_action *
4430: 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61 62  /.#define acttab
4440: 5f 79 79 61 63 74 69 6f 6e 28 58 2c 4e 29 20 20  _yyaction(X,N)  
4450: 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d  ((X)->aAction[N]
4460: 2e 61 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65  .action)../* The
4470: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e   value for the N
4480: 2d 74 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f  -th entry in yy_
4490: 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 23 64 65  lookahead */.#de
44a0: 66 69 6e 65 20 61 63 74 74 61 62 5f 79 79 6c 6f  fine acttab_yylo
44b0: 6f 6b 61 68 65 61 64 28 58 2c 4e 29 20 20 28 28  okahead(X,N)  ((
44c0: 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 6c  X)->aAction[N].l
44d0: 6f 6f 6b 61 68 65 61 64 29 0a 0a 2f 2a 20 46 72  ookahead)../* Fr
44e0: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73  ee all memory as
44f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
4500: 65 20 67 69 76 65 6e 20 61 63 74 74 61 62 20 2a  e given acttab *
4510: 2f 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 66 72  /.void acttab_fr
4520: 65 65 28 61 63 74 74 61 62 20 2a 70 29 7b 0a 20  ee(acttab *p){. 
4530: 20 66 72 65 65 28 20 70 2d 3e 61 41 63 74 69 6f   free( p->aActio
4540: 6e 20 29 3b 0a 20 20 66 72 65 65 28 20 70 2d 3e  n );.  free( p->
4550: 61 4c 6f 6f 6b 61 68 65 61 64 20 29 3b 0a 20 20  aLookahead );.  
4560: 66 72 65 65 28 20 70 20 29 3b 0a 7d 0a 0a 2f 2a  free( p );.}../*
4570: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
4580: 61 63 74 74 61 62 20 73 74 72 75 63 74 75 72 65  acttab structure
4590: 20 2a 2f 0a 61 63 74 74 61 62 20 2a 61 63 74 74   */.acttab *actt
45a0: 61 62 5f 61 6c 6c 6f 63 28 76 6f 69 64 29 7b 0a  ab_alloc(void){.
45b0: 20 20 61 63 74 74 61 62 20 2a 70 20 3d 20 28 61    acttab *p = (a
45c0: 63 74 74 61 62 20 2a 29 20 63 61 6c 6c 6f 63 28  cttab *) calloc(
45d0: 20 31 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29   1, sizeof(*p) )
45e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
45f0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
4600: 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c  rr,"Unable to al
4610: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
4620: 72 20 61 20 6e 65 77 20 61 63 74 74 61 62 2e 22  r a new acttab."
4630: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
4640: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20    }.  memset(p, 
4650: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
4660: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
4670: 2a 20 41 64 64 20 61 20 6e 65 77 20 61 63 74 69  * Add a new acti
4680: 6f 6e 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  on to the curren
4690: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  t transaction se
46a0: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t.  .**.** This 
46b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
46c0: 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
46d0: 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 61 20  lookahead for a 
46e0: 70 61 72 74 69 63 75 6c 61 72 0a 2a 2a 20 73 74  particular.** st
46f0: 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 61 63 74  ate..*/.void act
4700: 74 61 62 5f 61 63 74 69 6f 6e 28 61 63 74 74 61  tab_action(actta
4710: 62 20 2a 70 2c 20 69 6e 74 20 6c 6f 6f 6b 61 68  b *p, int lookah
4720: 65 61 64 2c 20 69 6e 74 20 61 63 74 69 6f 6e 29  ead, int action)
4730: 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b  {.  if( p->nLook
4740: 61 68 65 61 64 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61  ahead>=p->nLooka
4750: 68 65 61 64 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  headAlloc ){.   
4760: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c   p->nLookaheadAl
4770: 6c 6f 63 20 2b 3d 20 32 35 3b 0a 20 20 20 20 70  loc += 25;.    p
4780: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 28  ->aLookahead = (
4790: 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64  struct lookahead
47a0: 5f 61 63 74 69 6f 6e 20 2a 29 20 72 65 61 6c 6c  _action *) reall
47b0: 6f 63 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  oc( p->aLookahea
47c0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 6f 6f 6b 61  sizeof(p->aLooka
47f0: 68 65 61 64 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f  head[0])*p->nLoo
4800: 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29 3b 0a 20  kaheadAlloc );. 
4810: 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61     if( p->aLooka
4820: 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  head==0 ){.     
4830: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
4840: 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e  "malloc failed\n
4850: 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  ");.      exit(1
4860: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
4870: 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  f( p->nLookahead
4880: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6d 78  ==0 ){.    p->mx
4890: 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b  Lookahead = look
48a0: 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e  ahead;.    p->mn
48b0: 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b  Lookahead = look
48c0: 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e  ahead;.    p->mn
48d0: 41 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b  Action = action;
48e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
48f0: 28 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64  ( p->mxLookahead
4900: 3c 6c 6f 6f 6b 61 68 65 61 64 20 29 20 70 2d 3e  <lookahead ) p->
4910: 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f  mxLookahead = lo
4920: 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 69 66 28  okahead;.    if(
4930: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3e   p->mnLookahead>
4940: 6c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20  lookahead ){.   
4950: 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61     p->mnLookahea
4960: 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20  d = lookahead;. 
4970: 20 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e       p->mnAction
4980: 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d   = action;.    }
4990: 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61  .  }.  p->aLooka
49a0: 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  head[p->nLookahe
49b0: 61 64 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20  ad].lookahead = 
49c0: 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 70 2d 3e  lookahead;.  p->
49d0: 61 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c  aLookahead[p->nL
49e0: 6f 6f 6b 61 68 65 61 64 5d 2e 61 63 74 69 6f 6e  ookahead].action
49f0: 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 70 2d 3e   = action;.  p->
4a00: 6e 4c 6f 6f 6b 61 68 65 61 64 2b 2b 3b 0a 7d 0a  nLookahead++;.}.
4a10: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 74  ./*.** Add the t
4a20: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62  ransaction set b
4a30: 75 69 6c 74 20 75 70 20 77 69 74 68 20 70 72 69  uilt up with pri
4a40: 6f 72 20 63 61 6c 6c 73 20 74 6f 20 61 63 74 74  or calls to actt
4a50: 61 62 5f 61 63 74 69 6f 6e 28 29 0a 2a 2a 20 69  ab_action().** i
4a60: 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
4a70: 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20 54  action table.  T
4a80: 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 74 72  hen reset the tr
4a90: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62 61  ansaction set ba
4aa0: 63 6b 0a 2a 2a 20 74 6f 20 61 6e 20 65 6d 70 74  ck.** to an empt
4ab0: 79 20 73 65 74 20 69 6e 20 70 72 65 70 61 72 61  y set in prepara
4ac0: 74 69 6f 6e 20 66 6f 72 20 61 20 6e 65 77 20 72  tion for a new r
4ad0: 6f 75 6e 64 20 6f 66 20 61 63 74 74 61 62 5f 61  ound of acttab_a
4ae0: 63 74 69 6f 6e 28 29 20 63 61 6c 6c 73 2e 0a 2a  ction() calls..*
4af0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4b00: 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  offset into the 
4b10: 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20  action table of 
4b20: 74 68 65 20 6e 65 77 20 74 72 61 6e 73 61 63 74  the new transact
4b30: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74 74  ion..*/.int actt
4b40: 61 62 5f 69 6e 73 65 72 74 28 61 63 74 74 61 62  ab_insert(acttab
4b50: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a   *p){.  int i, j
4b60: 2c 20 6b 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74  , k, n;.  assert
4b70: 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e  ( p->nLookahead>
4b80: 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  0 );..  /* Make 
4b90: 73 75 72 65 20 77 65 20 68 61 76 65 20 65 6e 6f  sure we have eno
4ba0: 75 67 68 20 73 70 61 63 65 20 74 6f 20 68 6f 6c  ugh space to hol
4bb0: 64 20 74 68 65 20 65 78 70 61 6e 64 65 64 20 61  d the expanded a
4bc0: 63 74 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2a  ction table.  **
4bd0: 20 69 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61   in the worst ca
4be0: 73 65 2e 20 20 54 68 65 20 77 6f 72 73 74 20 63  se.  The worst c
4bf0: 61 73 65 20 6f 63 63 75 72 73 20 69 66 20 74 68  ase occurs if th
4c00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  e transaction se
4c10: 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61  t.  ** must be a
4c20: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63  ppended to the c
4c30: 75 72 72 65 6e 74 20 61 63 74 69 6f 6e 20 74 61  urrent action ta
4c40: 62 6c 65 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 70  ble.  */.  n = p
4c50: 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mxLookahead + 
4c60: 31 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 41 63 74  1;.  if( p->nAct
4c70: 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d 3e 6e 41  ion + n >= p->nA
4c80: 63 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  ctionAlloc ){.  
4c90: 20 20 69 6e 74 20 6f 6c 64 41 6c 6c 6f 63 20 3d    int oldAlloc =
4ca0: 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63   p->nActionAlloc
4cb0: 3b 0a 20 20 20 20 70 2d 3e 6e 41 63 74 69 6f 6e  ;.    p->nAction
4cc0: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69  Alloc = p->nActi
4cd0: 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e 6e 41 63 74  on + n + p->nAct
4ce0: 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32 30 3b 0a 20  ionAlloc + 20;. 
4cf0: 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 20 3d 20     p->aAction = 
4d00: 28 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61  (struct lookahea
4d10: 64 5f 61 63 74 69 6f 6e 20 2a 29 20 72 65 61 6c  d_action *) real
4d20: 6c 6f 63 28 20 70 2d 3e 61 41 63 74 69 6f 6e 2c  loc( p->aAction,
4d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4d40: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
4d50: 66 28 70 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 29  f(p->aAction[0])
4d60: 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63  *p->nActionAlloc
4d70: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41  );.    if( p->aA
4d80: 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ction==0 ){.    
4d90: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
4da0: 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c  ,"malloc failed\
4db0: 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  n");.      exit(
4dc0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  1);.    }.    fo
4dd0: 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63 3b 20 69 3c  r(i=oldAlloc; i<
4de0: 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b  p->nActionAlloc;
4df0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
4e00: 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61  aAction[i].looka
4e10: 68 65 61 64 20 3d 20 2d 31 3b 0a 20 20 20 20 20  head = -1;.     
4e20: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 61   p->aAction[i].a
4e30: 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  ction = -1;.    
4e40: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e  }.  }..  /* Scan
4e50: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 61 63   the existing ac
4e60: 74 69 6f 6e 20 74 61 62 6c 65 20 6c 6f 6f 6b 69  tion table looki
4e70: 6e 67 20 66 6f 72 20 61 6e 20 6f 66 66 73 65 74  ng for an offset
4e80: 20 74 68 61 74 20 69 73 20 61 20 0a 20 20 2a 2a   that is a .  **
4e90: 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68   duplicate of th
4ea0: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
4eb0: 63 74 69 6f 6e 20 73 65 74 2e 20 20 46 61 6c 6c  ction set.  Fall
4ec0: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
4ed0: 0a 20 20 2a 2a 20 69 66 20 61 6e 64 20 77 68 65  .  ** if and whe
4ee0: 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  n the duplicate 
4ef0: 69 73 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20  is found..  **. 
4f00: 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64   ** i is the ind
4f10: 65 78 20 69 6e 20 70 2d 3e 61 41 63 74 69 6f 6e  ex in p->aAction
4f20: 5b 5d 20 77 68 65 72 65 20 70 2d 3e 6d 6e 4c 6f  [] where p->mnLo
4f30: 6f 6b 61 68 65 61 64 20 69 73 20 69 6e 73 65 72  okahead is inser
4f40: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ted..  */.  for(
4f50: 69 3d 70 2d 3e 6e 41 63 74 69 6f 6e 2d 31 3b 20  i=p->nAction-1; 
4f60: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
4f70: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69  if( p->aAction[i
4f80: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 70 2d 3e  ].lookahead==p->
4f90: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20  mnLookahead ){. 
4fa0: 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6c 6f 6f 6b       /* All look
4fb0: 61 68 65 61 64 73 20 61 6e 64 20 61 63 74 69 6f  aheads and actio
4fc0: 6e 73 20 69 6e 20 74 68 65 20 61 4c 6f 6f 6b 61  ns in the aLooka
4fd0: 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74 69  head[] transacti
4fe0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74  on.      ** must
4ff0: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
5000: 68 65 20 63 61 6e 64 69 64 61 74 65 20 61 41 63  he candidate aAc
5010: 74 69 6f 6e 5b 69 5d 20 65 6e 74 72 79 2e 20 2a  tion[i] entry. *
5020: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  /.      if( p->a
5030: 41 63 74 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e  Action[i].action
5040: 21 3d 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 29 20  !=p->mnAction ) 
5050: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
5060: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c  for(j=0; j<p->nL
5070: 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a  ookahead; j++){.
5080: 20 20 20 20 20 20 20 20 6b 20 3d 20 70 2d 3e 61          k = p->a
5090: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f  Lookahead[j].loo
50a0: 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f  kahead - p->mnLo
50b0: 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20  okahead + i;.   
50c0: 20 20 20 20 20 69 66 28 20 6b 3c 30 20 7c 7c 20       if( k<0 || 
50d0: 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20  k>=p->nAction ) 
50e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
50f0: 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  f( p->aLookahead
5100: 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 21 3d 70  [j].lookahead!=p
5110: 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f  ->aAction[k].loo
5120: 6b 61 68 65 61 64 20 29 20 62 72 65 61 6b 3b 0a  kahead ) break;.
5130: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
5140: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 61 63 74  Lookahead[j].act
5150: 69 6f 6e 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b  ion!=p->aAction[
5160: 6b 5d 2e 61 63 74 69 6f 6e 20 29 20 62 72 65 61  k].action ) brea
5170: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5180: 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61   if( j<p->nLooka
5190: 68 65 61 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  head ) continue;
51a0: 0a 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 70 6f  ..      /* No po
51b0: 73 73 69 62 6c 65 20 6c 6f 6f 6b 61 68 65 61 64  ssible lookahead
51c0: 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 20 6e   value that is n
51d0: 6f 74 20 69 6e 20 74 68 65 20 61 4c 6f 6f 6b 61  ot in the aLooka
51e0: 68 65 61 64 5b 5d 0a 20 20 20 20 20 20 2a 2a 20  head[].      ** 
51f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
5200: 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68 20  llowed to match 
5210: 61 41 63 74 69 6f 6e 5b 69 5d 20 2a 2f 0a 20 20  aAction[i] */.  
5220: 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20      n = 0;.     
5230: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
5240: 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Action; j++){.  
5250: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63        if( p->aAc
5260: 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[j].lookahea
5270: 64 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  d<0 ) continue;.
5280: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
5290: 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68  Action[j].lookah
52a0: 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b  ead==j+p->mnLook
52b0: 61 68 65 61 64 2d 69 20 29 20 6e 2b 2b 3b 0a 20  ahead-i ) n++;. 
52c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
52d0: 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61   n==p->nLookahea
52e0: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  d ){.        bre
52f0: 61 6b 3b 20 20 2f 2a 20 41 6e 20 65 78 61 63 74  ak;  /* An exact
5300: 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 20   match is found 
5310: 61 74 20 6f 66 66 73 65 74 20 69 20 2a 2f 0a 20  at offset i */. 
5320: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5330: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 78 69  ..  /* If no exi
5340: 73 74 69 6e 67 20 6f 66 66 73 65 74 73 20 65 78  sting offsets ex
5350: 61 63 74 6c 79 20 6d 61 74 63 68 20 74 68 65 20  actly match the 
5360: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
5370: 69 6f 6e 2c 20 66 69 6e 64 20 61 6e 0a 20 20 2a  ion, find an.  *
5380: 2a 20 61 6e 20 65 6d 70 74 79 20 6f 66 66 73 65  * an empty offse
5390: 74 20 69 6e 20 74 68 65 20 61 41 63 74 69 6f 6e  t in the aAction
53a0: 5b 5d 20 74 61 62 6c 65 20 69 6e 20 77 68 69 63  [] table in whic
53b0: 68 20 77 65 20 63 61 6e 20 61 64 64 20 74 68 65  h we can add the
53c0: 0a 20 20 2a 2a 20 61 4c 6f 6f 6b 61 68 65 61 64  .  ** aLookahead
53d0: 5b 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  [] transaction..
53e0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 3c 30 20 29    */.  if( i<0 )
53f0: 7b 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f  {.    /* Look fo
5400: 72 20 68 6f 6c 65 73 20 69 6e 20 74 68 65 20 61  r holes in the a
5410: 41 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 74  Action[] table t
5420: 68 61 74 20 66 69 74 20 74 68 65 20 63 75 72 72  hat fit the curr
5430: 65 6e 74 0a 20 20 20 20 2a 2a 20 61 4c 6f 6f 6b  ent.    ** aLook
5440: 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74  ahead[] transact
5450: 69 6f 6e 2e 20 20 4c 65 61 76 65 20 69 20 73 65  ion.  Leave i se
5460: 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
5470: 6f 66 20 74 68 65 20 68 6f 6c 65 2e 0a 20 20 20  of the hole..   
5480: 20 2a 2a 20 49 66 20 6e 6f 20 68 6f 6c 65 73 20   ** If no holes 
5490: 61 72 65 20 66 6f 75 6e 64 2c 20 69 20 69 73 20  are found, i is 
54a0: 6c 65 66 74 20 61 74 20 70 2d 3e 6e 41 63 74 69  left at p->nActi
54b0: 6f 6e 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  on, which means 
54c0: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
54d0: 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61  action will be a
54e0: 70 70 65 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  ppended. */.    
54f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 41  for(i=0; i<p->nA
5500: 63 74 69 6f 6e 41 6c 6c 6f 63 20 2d 20 70 2d 3e  ctionAlloc - p->
5510: 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b 20 69 2b 2b  mxLookahead; i++
5520: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
5530: 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61  aAction[i].looka
5540: 68 65 61 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  head<0 ){.      
5550: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
5560: 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29  nLookahead; j++)
5570: 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20  {.          k = 
5580: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
5590: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e  .lookahead - p->
55a0: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b  mnLookahead + i;
55b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6b  .          if( k
55c0: 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  <0 ) break;.    
55d0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63        if( p->aAc
55e0: 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[k].lookahea
55f0: 64 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  d>=0 ) break;.  
5600: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5610: 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68  if( j<p->nLookah
5620: 65 61 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ead ) continue;.
5630: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
5640: 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a   j<p->nAction; j
5650: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
5660: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d  f( p->aAction[j]
5670: 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d  .lookahead==j+p-
5680: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69 20 29  >mnLookahead-i )
5690: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
56a0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  }.        if( j=
56b0: 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 7b 0a 20  =p->nAction ){. 
56c0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20           break; 
56d0: 20 2f 2a 20 46 69 74 73 20 69 6e 20 65 6d 70 74   /* Fits in empt
56e0: 79 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 20 20 20  y slots */.     
56f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5700: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65   }.  }.  /* Inse
5710: 72 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  rt transaction s
5720: 65 74 20 61 74 20 69 6e 64 65 78 20 69 2e 20 2a  et at index i. *
5730: 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70  /.  for(j=0; j<p
5740: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b  ->nLookahead; j+
5750: 2b 29 7b 0a 20 20 20 20 6b 20 3d 20 70 2d 3e 61  +){.    k = p->a
5760: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f  Lookahead[j].loo
5770: 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f  kahead - p->mnLo
5780: 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20  okahead + i;.   
5790: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 20 3d   p->aAction[k] =
57a0: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a   p->aLookahead[j
57b0: 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 2d  ];.    if( k>=p-
57c0: 3e 6e 41 63 74 69 6f 6e 20 29 20 70 2d 3e 6e 41  >nAction ) p->nA
57d0: 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b 0a 20 20 7d  ction = k+1;.  }
57e0: 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  .  p->nLookahead
57f0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 74 75   = 0;..  /* Retu
5800: 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 74 68  rn the offset th
5810: 61 74 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  at is added to t
5820: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e 20  he lookahead in 
5830: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
5840: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 6e 74 6f  .  ** index into
5850: 20 79 79 5f 61 63 74 69 6f 6e 20 6f 66 20 74 68   yy_action of th
5860: 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 65  e action */.  re
5870: 74 75 72 6e 20 69 20 2d 20 70 2d 3e 6d 6e 4c 6f  turn i - p->mnLo
5880: 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 2a 2a  okahead;.}../***
5890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
58a0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
58b0: 65 20 22 62 75 69 6c 64 2e 63 22 20 2a 2a 2a 2a  e "build.c" ****
58c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
58d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
58e0: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 63 6f 6e   Routines to con
58f0: 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20 66 69  struction the fi
5900: 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69  nite state machi
5910: 6e 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e  ne for the LEMON
5920: 0a 2a 2a 20 70 61 72 73 65 72 20 67 65 6e 65 72  .** parser gener
5930: 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e  ator..*/../* Fin
5940: 64 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73  d a precedence s
5950: 79 6d 62 6f 6c 20 6f 66 20 65 76 65 72 79 20 72  ymbol of every r
5960: 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  ule in the gramm
5970: 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 6f 73 65  ar..** .** Those
5980: 20 72 75 6c 65 73 20 77 68 69 63 68 20 68 61 76   rules which hav
5990: 65 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73  e a precedence s
59a0: 79 6d 62 6f 6c 20 63 6f 64 65 64 20 69 6e 20 74  ymbol coded in t
59b0: 68 65 20 69 6e 70 75 74 0a 2a 2a 20 67 72 61 6d  he input.** gram
59c0: 6d 61 72 20 75 73 69 6e 67 20 74 68 65 20 22 5b  mar using the "[
59d0: 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74 72 75  symbol]" constru
59e0: 63 74 20 77 69 6c 6c 20 61 6c 72 65 61 64 79 20  ct will already 
59f0: 68 61 76 65 20 74 68 65 0a 2a 2a 20 72 70 2d 3e  have the.** rp->
5a00: 70 72 65 63 73 79 6d 20 66 69 65 6c 64 20 66 69  precsym field fi
5a10: 6c 6c 65 64 2e 20 20 4f 74 68 65 72 20 72 75 6c  lled.  Other rul
5a20: 65 73 20 74 61 6b 65 20 61 73 20 74 68 65 69 72  es take as their
5a30: 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73   precedence.** s
5a40: 79 6d 62 6f 6c 20 74 68 65 20 66 69 72 73 74 20  ymbol the first 
5a50: 52 48 53 20 73 79 6d 62 6f 6c 20 77 69 74 68 20  RHS symbol with 
5a60: 61 20 64 65 66 69 6e 65 64 20 70 72 65 63 65 64  a defined preced
5a70: 65 6e 63 65 2e 20 20 49 66 20 74 68 65 72 65 0a  ence.  If there.
5a80: 2a 2a 20 61 72 65 20 6e 6f 74 20 52 48 53 20 73  ** are not RHS s
5a90: 79 6d 62 6f 6c 73 20 77 69 74 68 20 61 20 64 65  ymbols with a de
5aa0: 66 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65  fined precedence
5ab0: 2c 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65  , the precedence
5ac0: 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66 69 65 6c 64  .** symbol field
5ad0: 20 69 73 20 6c 65 66 74 20 62 6c 61 6e 6b 2e 0a   is left blank..
5ae0: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c 65  */.void FindRule
5af0: 50 72 65 63 65 64 65 6e 63 65 73 28 73 74 72 75  Precedences(stru
5b00: 63 74 20 6c 65 6d 6f 6e 20 2a 78 70 29 0a 7b 0a  ct lemon *xp).{.
5b10: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
5b20: 70 3b 0a 20 20 66 6f 72 28 72 70 3d 78 70 2d 3e  p;.  for(rp=xp->
5b30: 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
5b40: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  >next){.    if( 
5b50: 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30 20 29  rp->precsym==0 )
5b60: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  {.      int i, j
5b70: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
5b80: 20 69 3c 72 70 2d 3e 6e 72 68 73 20 26 26 20 72   i<rp->nrhs && r
5b90: 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30 3b 20 69  p->precsym==0; i
5ba0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
5bb0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
5bc0: 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
5bd0: 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70       if( sp->typ
5be0: 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
5bf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
5c00: 72 28 6a 3d 30 3b 20 6a 3c 73 70 2d 3e 6e 73 75  r(j=0; j<sp->nsu
5c10: 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  bsym; j++){.    
5c20: 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e          if( sp->
5c30: 73 75 62 73 79 6d 5b 6a 5d 2d 3e 70 72 65 63 3e  subsym[j]->prec>
5c40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
5c50: 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20      rp->precsym 
5c60: 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 3b  = sp->subsym[j];
5c70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
5c80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
5c90: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
5ca0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
5cb0: 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b  ( sp->prec>=0 ){
5cc0: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70  .          rp->p
5cd0: 72 65 63 73 79 6d 20 3d 20 72 70 2d 3e 72 68 73  recsym = rp->rhs
5ce0: 5b 69 5d 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 0a  [i];..}.      }.
5cf0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5d00: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61  rn;.}../* Find a
5d10: 6c 6c 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20  ll nonterminals 
5d20: 77 68 69 63 68 20 77 69 6c 6c 20 67 65 6e 65 72  which will gener
5d30: 61 74 65 20 74 68 65 20 65 6d 70 74 79 20 73 74  ate the empty st
5d40: 72 69 6e 67 2e 0a 2a 2a 20 54 68 65 6e 20 67 6f  ring..** Then go
5d50: 20 62 61 63 6b 20 61 6e 64 20 63 6f 6d 70 75 74   back and comput
5d60: 65 20 74 68 65 20 66 69 72 73 74 20 73 65 74 73  e the first sets
5d70: 20 6f 66 20 65 76 65 72 79 20 6e 6f 6e 74 65 72   of every nonter
5d80: 6d 69 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 66 69  minal..** The fi
5d90: 72 73 74 20 73 65 74 20 69 73 20 74 68 65 20 73  rst set is the s
5da0: 65 74 20 6f 66 20 61 6c 6c 20 74 65 72 6d 69 6e  et of all termin
5db0: 61 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68  al symbols which
5dc0: 20 63 61 6e 20 62 65 67 69 6e 0a 2a 2a 20 61 20   can begin.** a 
5dd0: 73 74 72 69 6e 67 20 67 65 6e 65 72 61 74 65 64  string generated
5de0: 20 62 79 20 74 68 61 74 20 6e 6f 6e 74 65 72 6d   by that nonterm
5df0: 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69  inal..*/.void Fi
5e00: 6e 64 46 69 72 73 74 53 65 74 73 28 73 74 72 75  ndFirstSets(stru
5e10: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
5e20: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
5e30: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
5e40: 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b  .  int progress;
5e50: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ..  for(i=0; i<l
5e60: 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
5e70: 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79  +){.    lemp->sy
5e80: 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61  mbols[i]->lambda
5e90: 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a   = LEMON_FALSE;.
5ea0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6c 65 6d 70    }.  for(i=lemp
5eb0: 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 3c 6c  ->nterminal; i<l
5ec0: 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
5ed0: 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79  +){.    lemp->sy
5ee0: 6d 62 6f 6c 73 5b 69 5d 2d 3e 66 69 72 73 74 73  mbols[i]->firsts
5ef0: 65 74 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20  et = SetNew();. 
5f00: 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 63   }..  /* First c
5f10: 6f 6d 70 75 74 65 20 61 6c 6c 20 6c 61 6d 62 64  ompute all lambd
5f20: 61 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20  as */.  do{.    
5f30: 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  progress = 0;.  
5f40: 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
5f50: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
5f60: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
5f70: 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61   rp->lhs->lambda
5f80: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5f90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
5fa0: 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
5fb0: 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
5fc0: 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68  bol *sp = rp->rh
5fd0: 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  s[i];.        as
5fe0: 73 65 72 74 28 20 73 70 2d 3e 74 79 70 65 3d 3d  sert( sp->type==
5ff0: 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73  NONTERMINAL || s
6000: 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e  p->lambda==LEMON
6010: 5f 46 41 4c 53 45 20 29 3b 0a 20 20 20 20 20 20  _FALSE );.      
6020: 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61    if( sp->lambda
6030: 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20  ==LEMON_FALSE ) 
6040: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6050: 20 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e       if( i==rp->
6060: 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  nrhs ){.        
6070: 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20  rp->lhs->lambda 
6080: 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20  = LEMON_TRUE;.  
6090: 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d        progress =
60a0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
60b0: 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67  }.  }while( prog
60c0: 72 65 73 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  ress );..  /* No
60d0: 77 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69  w compute all fi
60e0: 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f  rst sets */.  do
60f0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  {.    struct sym
6100: 62 6f 6c 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20  bol *s1, *s2;.  
6110: 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a    progress = 0;.
6120: 20 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d      for(rp=lemp-
6130: 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
6140: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 73  ->next){.      s
6150: 31 20 3d 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20  1 = rp->lhs;.   
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 73 32 20 3d 20 72 70 2d 3e 72        s2 = rp->r
6190: 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hs[i];.        i
61a0: 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52  f( s2->type==TER
61b0: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
61c0: 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53     progress += S
61d0: 65 74 41 64 64 28 73 31 2d 3e 66 69 72 73 74 73  etAdd(s1->firsts
61e0: 65 74 2c 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20  et,s2->index);. 
61f0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
6200: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
6210: 28 20 73 32 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54  ( s2->type==MULT
6220: 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
6230: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
6240: 6a 3c 73 32 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a  j<s2->nsubsym; j
6250: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
6260: 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74   progress += Set
6270: 41 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74  Add(s1->firstset
6280: 2c 73 32 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e  ,s2->subsym[j]->
6290: 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20  index);.        
62a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
62b0: 65 61 6b 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  eak;..}else if( 
62c0: 73 31 3d 3d 73 32 20 29 7b 0a 20 20 20 20 20 20  s1==s2 ){.      
62d0: 20 20 20 20 69 66 28 20 73 31 2d 3e 6c 61 6d 62      if( s1->lamb
62e0: 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20  da==LEMON_FALSE 
62f0: 29 20 62 72 65 61 6b 3b 0a 09 7d 65 6c 73 65 7b  ) break;..}else{
6300: 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72  .          progr
6310: 65 73 73 20 2b 3d 20 53 65 74 55 6e 69 6f 6e 28  ess += SetUnion(
6320: 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d  s1->firstset,s2-
6330: 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20  >firstset);.    
6340: 20 20 20 20 20 20 69 66 28 20 73 32 2d 3e 6c 61        if( s2->la
6350: 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53  mbda==LEMON_FALS
6360: 45 20 29 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20  E ) break;..}.  
6370: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77      }.    }.  }w
6380: 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29  hile( progress )
6390: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
63a0: 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52  * Compute all LR
63b0: 28 30 29 20 73 74 61 74 65 73 20 66 6f 72 20 74  (0) states for t
63c0: 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 4c 69 6e  he grammar.  Lin
63d0: 6b 73 0a 2a 2a 20 61 72 65 20 61 64 64 65 64 20  ks.** are added 
63e0: 74 6f 20 62 65 74 77 65 65 6e 20 73 6f 6d 65 20  to between some 
63f0: 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20 74  states so that t
6400: 68 65 20 4c 52 28 31 29 20 66 6f 6c 6c 6f 77 20  he LR(1) follow 
6410: 73 65 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  sets.** can be c
6420: 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 2e 0a 2a  omputed later..*
6430: 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74  /.PRIVATE struct
6440: 20 73 74 61 74 65 20 2a 67 65 74 73 74 61 74 65   state *getstate
6450: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29  (struct lemon *)
6460: 3b 20 20 2f 2a 20 66 6f 72 77 61 72 64 20 72 65  ;  /* forward re
6470: 66 65 72 65 6e 63 65 20 2a 2f 0a 76 6f 69 64 20  ference */.void 
6480: 46 69 6e 64 53 74 61 74 65 73 28 73 74 72 75 63  FindStates(struc
6490: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
64a0: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
64b0: 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74 20 72   *sp;.  struct r
64c0: 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 43 6f 6e 66  ule *rp;..  Conf
64d0: 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 3b 0a 0a  iglist_init();..
64e0: 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 74    /* Find the st
64f0: 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20  art symbol */.  
6500: 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20  if( lemp->start 
6510: 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62  ){.    sp = Symb
6520: 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74  ol_find(lemp->st
6530: 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70  art);.    if( sp
6540: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 72 72  ==0 ){.      Err
6550: 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
6560: 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 70 65  name,0,."The spe
6570: 63 69 66 69 65 64 20 73 74 61 72 74 20 73 79 6d  cified start sym
6580: 62 6f 6c 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f  bol \"%s\" is no
6590: 74 20 5c 0a 69 6e 20 61 20 6e 6f 6e 74 65 72 6d  t \.in a nonterm
65a0: 69 6e 61 6c 20 6f 66 20 74 68 65 20 67 72 61 6d  inal of the gram
65b0: 6d 61 72 2e 20 20 5c 22 25 73 5c 22 20 77 69 6c  mar.  \"%s\" wil
65c0: 6c 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65  l be used as the
65d0: 20 73 74 61 72 74 20 5c 0a 73 79 6d 62 6f 6c 20   start \.symbol 
65e0: 69 6e 73 74 65 61 64 2e 22 2c 6c 65 6d 70 2d 3e  instead.",lemp->
65f0: 73 74 61 72 74 2c 6c 65 6d 70 2d 3e 72 75 6c 65  start,lemp->rule
6600: 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ->lhs->name);.  
6610: 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
6620: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 70 20 3d  nt++;.      sp =
6630: 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73   lemp->rule->lhs
6640: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
6650: 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
6660: 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 0a  rule->lhs;.  }..
6670: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
6680: 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  he start symbol 
6690: 64 6f 65 73 6e 27 74 20 6f 63 63 75 72 20 6f 6e  doesn't occur on
66a0: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
66b0: 73 69 64 65 20 6f 66 0a 20 20 2a 2a 20 61 6e 79  side of.  ** any
66c0: 20 72 75 6c 65 2e 20 20 52 65 70 6f 72 74 20 61   rule.  Report a
66d0: 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20 64 6f  n error if it do
66e0: 65 73 2e 20 20 28 59 41 43 43 20 77 6f 75 6c 64  es.  (YACC would
66f0: 20 67 65 6e 65 72 61 74 65 20 61 20 6e 65 77 0a   generate a new.
6700: 20 20 2a 2a 20 73 74 61 72 74 20 73 79 6d 62 6f    ** start symbo
6710: 6c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 29  l in this case.)
6720: 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d   */.  for(rp=lem
6730: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
6740: 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69  rp->next){.    i
6750: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
6760: 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
6770: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  ++){.      if( r
6780: 70 2d 3e 72 68 73 5b 69 5d 3d 3d 73 70 20 29 7b  p->rhs[i]==sp ){
6790: 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 44     /* FIX ME:  D
67a0: 65 61 6c 20 77 69 74 68 20 6d 75 6c 74 69 74 65  eal with multite
67b0: 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 20 20 20  rminals */.     
67c0: 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
67d0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54  ->filename,0,."T
67e0: 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  he start symbol 
67f0: 5c 22 25 73 5c 22 20 6f 63 63 75 72 73 20 6f 6e  \"%s\" occurs on
6800: 20 74 68 65 20 5c 0a 72 69 67 68 74 2d 68 61 6e   the \.right-han
6810: 64 20 73 69 64 65 20 6f 66 20 61 20 72 75 6c 65  d side of a rule
6820: 2e 20 54 68 69 73 20 77 69 6c 6c 20 72 65 73 75  . This will resu
6830: 6c 74 20 69 6e 20 61 20 70 61 72 73 65 72 20 77  lt in a parser w
6840: 68 69 63 68 20 5c 0a 64 6f 65 73 20 6e 6f 74 20  hich \.does not 
6850: 77 6f 72 6b 20 70 72 6f 70 65 72 6c 79 2e 22 2c  work properly.",
6860: 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
6870: 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
6880: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
6890: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
68a0: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
68b0: 74 69 6f 6e 20 73 65 74 20 66 6f 72 20 74 68 65  tion set for the
68c0: 20 66 69 72 73 74 20 73 74 61 74 65 0a 20 20 2a   first state.  *
68d0: 2a 20 69 73 20 61 6c 6c 20 72 75 6c 65 73 20 77  * is all rules w
68e0: 68 69 63 68 20 68 61 76 65 20 74 68 65 20 73 74  hich have the st
68f0: 61 72 74 20 73 79 6d 62 6f 6c 20 61 73 20 74 68  art symbol as th
6900: 65 69 72 0a 20 20 2a 2a 20 6c 65 66 74 2d 68 61  eir.  ** left-ha
6910: 6e 64 20 73 69 64 65 20 2a 2f 0a 20 20 66 6f 72  nd side */.  for
6920: 28 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 72 70  (rp=sp->rule; rp
6930: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 6c 68 73  ; rp=rp->nextlhs
6940: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f  ){.    struct co
6950: 6e 66 69 67 20 2a 6e 65 77 63 66 70 3b 0a 20 20  nfig *newcfp;.  
6960: 20 20 72 70 2d 3e 6c 68 73 53 74 61 72 74 20 3d    rp->lhsStart =
6970: 20 31 3b 0a 20 20 20 20 6e 65 77 63 66 70 20 3d   1;.    newcfp =
6980: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62   Configlist_addb
6990: 61 73 69 73 28 72 70 2c 30 29 3b 0a 20 20 20 20  asis(rp,0);.    
69a0: 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66  SetAdd(newcfp->f
69b0: 77 73 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ws,0);.  }..  /*
69c0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66 69 72   Compute the fir
69d0: 73 74 20 73 74 61 74 65 2e 20 20 41 6c 6c 20 6f  st state.  All o
69e0: 74 68 65 72 20 73 74 61 74 65 73 20 77 69 6c 6c  ther states will
69f0: 20 62 65 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65   be.  ** compute
6a00: 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
6a10: 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 70 75  during the compu
6a20: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  tation of the fi
6a30: 72 73 74 20 6f 6e 65 2e 0a 20 20 2a 2a 20 54 68  rst one..  ** Th
6a40: 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  e returned point
6a50: 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  er to the first 
6a60: 73 74 61 74 65 20 69 73 20 6e 6f 74 20 75 73 65  state is not use
6a70: 64 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  d. */.  (void)ge
6a80: 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 20 20  tstate(lemp);.  
6a90: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65  return;.}../* Re
6aa0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6ab0: 6f 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  o a state which 
6ac0: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
6ad0: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
6ae0: 6e 0a 2a 2a 20 6c 69 73 74 20 77 68 69 63 68 20  n.** list which 
6af0: 68 61 73 20 62 65 65 6e 20 62 75 69 6c 74 20 66  has been built f
6b00: 72 6f 6d 20 63 61 6c 6c 73 20 74 6f 20 43 6f 6e  rom calls to Con
6b10: 66 69 67 6c 69 73 74 5f 61 64 64 2e 0a 2a 2f 0a  figlist_add..*/.
6b20: 50 52 49 56 41 54 45 20 76 6f 69 64 20 62 75 69  PRIVATE void bui
6b30: 6c 64 73 68 69 66 74 73 28 73 74 72 75 63 74 20  ldshifts(struct 
6b40: 6c 65 6d 6f 6e 20 2a 2c 20 73 74 72 75 63 74 20  lemon *, struct 
6b50: 73 74 61 74 65 20 2a 29 3b 20 2f 2a 20 46 6f 72  state *); /* For
6b60: 77 64 20 72 65 66 20 2a 2f 0a 50 52 49 56 41 54  wd ref */.PRIVAT
6b70: 45 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  E struct state *
6b80: 67 65 74 73 74 61 74 65 28 73 74 72 75 63 74 20  getstate(struct 
6b90: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
6ba0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
6bb0: 63 66 70 2c 20 2a 62 70 3b 0a 20 20 73 74 72 75  cfp, *bp;.  stru
6bc0: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 0a  ct state *stp;..
6bd0: 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
6be0: 20 73 6f 72 74 65 64 20 62 61 73 69 73 20 6f 66   sorted basis of
6bf0: 20 74 68 65 20 6e 65 77 20 73 74 61 74 65 2e 20   the new state. 
6c00: 20 54 68 65 20 62 61 73 69 73 20 77 61 73 20 63   The basis was c
6c10: 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20  onstructed.  ** 
6c20: 62 79 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74  by prior calls t
6c30: 6f 20 22 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  o "Configlist_ad
6c40: 64 62 61 73 69 73 28 29 22 2e 20 2a 2f 0a 20 20  dbasis()". */.  
6c50: 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 62  Configlist_sortb
6c60: 61 73 69 73 28 29 3b 0a 20 20 62 70 20 3d 20 43  asis();.  bp = C
6c70: 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28  onfiglist_basis(
6c80: 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 73  );..  /* Get a s
6c90: 74 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61  tate with the sa
6ca0: 6d 65 20 62 61 73 69 73 20 2a 2f 0a 20 20 73 74  me basis */.  st
6cb0: 70 20 3d 20 53 74 61 74 65 5f 66 69 6e 64 28 62  p = State_find(b
6cc0: 70 29 3b 0a 20 20 69 66 28 20 73 74 70 20 29 7b  p);.  if( stp ){
6cd0: 0a 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65 20  .    /* A state 
6ce0: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 62 61  with the same ba
6cf0: 73 69 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  sis already exis
6d00: 74 73 21 20 20 43 6f 70 79 20 61 6c 6c 20 74 68  ts!  Copy all th
6d10: 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 0a 20 20 20  e follow-set.   
6d20: 20 2a 2a 20 70 72 6f 70 61 67 61 74 69 6f 6e 20   ** propagation 
6d30: 6c 69 6e 6b 73 20 66 72 6f 6d 20 74 68 65 20 73  links from the s
6d40: 74 61 74 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  tate under const
6d50: 72 75 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  ruction into the
6d60: 0a 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74  .    ** preexist
6d70: 69 6e 67 20 73 74 61 74 65 2c 20 74 68 65 6e 20  ing state, then 
6d80: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
6d90: 20 74 6f 20 74 68 65 20 70 72 65 65 78 69 73 74   to the preexist
6da0: 69 6e 67 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  ing state */.   
6db0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
6dc0: 78 2c 20 2a 79 3b 0a 20 20 20 20 66 6f 72 28 78  x, *y;.    for(x
6dd0: 3d 62 70 2c 20 79 3d 73 74 70 2d 3e 62 70 3b 20  =bp, y=stp->bp; 
6de0: 78 20 26 26 20 79 3b 20 78 3d 78 2d 3e 62 70 2c  x && y; x=x->bp,
6df0: 20 79 3d 79 2d 3e 62 70 29 7b 0a 20 20 20 20 20   y=y->bp){.     
6e00: 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 26 79 2d 3e   Plink_copy(&y->
6e10: 62 70 6c 70 2c 78 2d 3e 62 70 6c 70 29 3b 0a 20  bplp,x->bplp);. 
6e20: 20 20 20 20 20 50 6c 69 6e 6b 5f 64 65 6c 65 74       Plink_delet
6e30: 65 28 78 2d 3e 66 70 6c 70 29 3b 0a 20 20 20 20  e(x->fplp);.    
6e40: 20 20 78 2d 3e 66 70 6c 70 20 3d 20 78 2d 3e 62    x->fplp = x->b
6e50: 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  plp = 0;.    }. 
6e60: 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c     cfp = Configl
6e70: 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 0a 20 20  ist_return();.  
6e80: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74    Configlist_eat
6e90: 28 63 66 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  (cfp);.  }else{.
6ea0: 20 20 20 20 2f 2a 20 54 68 69 73 20 72 65 61 6c      /* This real
6eb0: 6c 79 20 69 73 20 61 20 6e 65 77 20 73 74 61 74  ly is a new stat
6ec0: 65 2e 20 20 43 6f 6e 73 74 72 75 63 74 20 61 6c  e.  Construct al
6ed0: 6c 20 74 68 65 20 64 65 74 61 69 6c 73 20 2a 2f  l the details */
6ee0: 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  .    Configlist_
6ef0: 63 6c 6f 73 75 72 65 28 6c 65 6d 70 29 3b 20 20  closure(lemp);  
6f00: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
6f10: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
6f20: 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 43 6f  losure */.    Co
6f30: 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 29 3b  nfiglist_sort();
6f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
6f50: 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  rt the configura
6f60: 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a  tion closure */.
6f70: 20 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67      cfp = Config
6f80: 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 20 20  list_return();  
6f90: 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65   /* Get a pointe
6fa0: 72 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 20  r to the config 
6fb0: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 73 74 70 20  list */.    stp 
6fc0: 3d 20 53 74 61 74 65 5f 6e 65 77 28 29 3b 20 20  = State_new();  
6fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65           /* A ne
6fe0: 77 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72  w state structur
6ff0: 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 6f 72 79 43  e */.    MemoryC
7000: 68 65 63 6b 28 73 74 70 29 3b 0a 20 20 20 20 73  heck(stp);.    s
7010: 74 70 2d 3e 62 70 20 3d 20 62 70 3b 20 20 20 20  tp->bp = bp;    
7020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
7030: 65 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66  emember the conf
7040: 69 67 75 72 61 74 69 6f 6e 20 62 61 73 69 73 20  iguration basis 
7050: 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 63 66 70 20  */.    stp->cfp 
7060: 3d 20 63 66 70 3b 20 20 20 20 20 20 20 20 20 20  = cfp;          
7070: 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20      /* Remember 
7080: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
7090: 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20  n closure */.   
70a0: 20 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 20 3d   stp->statenum =
70b0: 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b 3b   lemp->nstate++;
70c0: 20 2f 2a 20 45 76 65 72 79 20 73 74 61 74 65 20   /* Every state 
70d0: 67 65 74 73 20 61 20 73 65 71 75 65 6e 63 65 20  gets a sequence 
70e0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 73 74  number */.    st
70f0: 70 2d 3e 61 70 20 3d 20 30 3b 20 20 20 20 20 20  p->ap = 0;      
7100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
7110: 20 61 63 74 69 6f 6e 73 2c 20 79 65 74 2e 20 2a   actions, yet. *
7120: 2f 0a 20 20 20 20 53 74 61 74 65 5f 69 6e 73 65  /.    State_inse
7130: 72 74 28 73 74 70 2c 73 74 70 2d 3e 62 70 29 3b  rt(stp,stp->bp);
7140: 20 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65     /* Add to the
7150: 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a   state table */.
7160: 20 20 20 20 62 75 69 6c 64 73 68 69 66 74 73 28      buildshifts(
7170: 6c 65 6d 70 2c 73 74 70 29 3b 20 20 20 20 20 20  lemp,stp);      
7180: 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20   /* Recursively 
7190: 63 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 6f  compute successo
71a0: 72 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 7d 0a  r states */.  }.
71b0: 20 20 72 65 74 75 72 6e 20 73 74 70 3b 0a 7d 0a    return stp;.}.
71c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
71d0: 75 65 20 69 66 20 74 77 6f 20 73 79 6d 62 6f 6c  ue if two symbol
71e0: 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 0a  s are the same..
71f0: 2a 2f 0a 69 6e 74 20 73 61 6d 65 5f 73 79 6d 62  */.int same_symb
7200: 6f 6c 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  ol(struct symbol
7210: 20 2a 61 2c 20 73 74 72 75 63 74 20 73 79 6d 62   *a, struct symb
7220: 6f 6c 20 2a 62 29 0a 7b 0a 20 20 69 6e 74 20 69  ol *b).{.  int i
7230: 3b 0a 20 20 69 66 28 20 61 3d 3d 62 20 29 20 72  ;.  if( a==b ) r
7240: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 61  eturn 1;.  if( a
7250: 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52  ->type!=MULTITER
7260: 4d 49 4e 41 4c 20 29 20 72 65 74 75 72 6e 20 30  MINAL ) return 0
7270: 3b 0a 20 20 69 66 28 20 62 2d 3e 74 79 70 65 21  ;.  if( b->type!
7280: 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
7290: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
72a0: 20 61 2d 3e 6e 73 75 62 73 79 6d 21 3d 62 2d 3e   a->nsubsym!=b->
72b0: 6e 73 75 62 73 79 6d 20 29 20 72 65 74 75 72 6e  nsubsym ) return
72c0: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
72d0: 3c 61 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b  <a->nsubsym; i++
72e0: 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 73 75  ){.    if( a->su
72f0: 62 73 79 6d 5b 69 5d 21 3d 62 2d 3e 73 75 62 73  bsym[i]!=b->subs
7300: 79 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30  ym[i] ) return 0
7310: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
7320: 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63  ;.}../* Construc
7330: 74 20 61 6c 6c 20 73 75 63 63 65 73 73 6f 72 20  t all successor 
7340: 73 74 61 74 65 73 20 74 6f 20 74 68 65 20 67 69  states to the gi
7350: 76 65 6e 20 73 74 61 74 65 2e 20 20 41 20 22 73  ven state.  A "s
7360: 75 63 63 65 73 73 6f 72 22 0a 2a 2a 20 73 74 61  uccessor".** sta
7370: 74 65 20 69 73 20 61 6e 79 20 73 74 61 74 65 20  te is any state 
7380: 77 68 69 63 68 20 63 61 6e 20 62 65 20 72 65 61  which can be rea
7390: 63 68 65 64 20 62 79 20 61 20 73 68 69 66 74 20  ched by a shift 
73a0: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41  action..*/.PRIVA
73b0: 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69  TE void buildshi
73c0: 66 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  fts(struct lemon
73d0: 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 73   *lemp, struct s
73e0: 74 61 74 65 20 2a 73 74 70 29 0a 7b 0a 20 20 73  tate *stp).{.  s
73f0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
7400: 70 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  p;  /* For loopi
7410: 6e 67 20 74 68 72 75 20 74 68 65 20 63 6f 6e 66  ng thru the conf
7420: 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73  ig closure of "s
7430: 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  tp" */.  struct 
7440: 63 6f 6e 66 69 67 20 2a 62 63 66 70 3b 20 2f 2a  config *bcfp; /*
7450: 20 46 6f 72 20 74 68 65 20 69 6e 6e 65 72 20 6c   For the inner l
7460: 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69 67 20 63 6c  oop on config cl
7470: 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a  osure of "stp" *
7480: 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  /.  struct confi
7490: 67 20 2a 6e 65 77 63 66 67 3b 20 20 2f 2a 20 2a  g *newcfg;  /* *
74a0: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
74b0: 6c 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79 6d 62  l *sp;   /* Symb
74c0: 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ol following the
74d0: 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72   dot in configur
74e0: 61 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f 0a 20  ation "cfp" */. 
74f0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
7500: 62 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c 20  bsp;  /* Symbol 
7510: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f  following the do
7520: 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69  t in configurati
7530: 6f 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20 20 73  on "bcfp" */.  s
7540: 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77  truct state *new
7550: 73 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e 74 65  stp; /* A pointe
7560: 72 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72  r to a successor
7570: 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20   state */..  /* 
7580: 45 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69  Each configurati
7590: 6f 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d 70 6c  on becomes compl
75a0: 65 74 65 20 61 66 74 65 72 20 69 74 20 63 6f 6e  ete after it con
75b0: 74 69 62 75 74 65 73 20 74 6f 20 61 20 73 75 63  tibutes to a suc
75c0: 63 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74 61 74  cessor.  ** stat
75d0: 65 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c 20 61  e.  Initially, a
75e0: 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ll configuration
75f0: 73 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65 74 65  s are incomplete
7600: 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74   */.  for(cfp=st
7610: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
7620: 3d 63 66 70 2d 3e 6e 65 78 74 29 20 63 66 70 2d  =cfp->next) cfp-
7630: 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50  >status = INCOMP
7640: 4c 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  LETE;..  /* Loop
7650: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6e   through all con
7660: 66 69 67 75 72 61 74 69 6f 6e 73 20 6f 66 20 74  figurations of t
7670: 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20 2a  he state "stp" *
7680: 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d  /.  for(cfp=stp-
7690: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
76a0: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69  fp->next){.    i
76b0: 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d  f( cfp->status==
76c0: 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69  COMPLETE ) conti
76d0: 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61  nue;    /* Alrea
76e0: 64 79 20 75 73 65 64 20 62 79 20 69 6e 6e 65 72  dy used by inner
76f0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28   loop */.    if(
7700: 20 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d 3e   cfp->dot>=cfp->
7710: 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69  rp->nrhs ) conti
7720: 6e 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74 20 73  nue;  /* Can't s
7730: 68 69 66 74 20 74 68 69 73 20 63 6f 6e 66 69 67  hift this config
7740: 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69   */.    Configli
7750: 73 74 5f 72 65 73 65 74 28 29 3b 20 20 20 20 20  st_reset();     
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7770: 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 6e 65   /* Reset the ne
7780: 77 20 63 6f 6e 66 69 67 20 73 65 74 20 2a 2f 0a  w config set */.
7790: 20 20 20 20 73 70 20 3d 20 63 66 70 2d 3e 72 70      sp = cfp->rp
77a0: 2d 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74 5d 3b  ->rhs[cfp->dot];
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
77c0: 53 79 6d 62 6f 6c 20 61 66 74 65 72 20 74 68 65  Symbol after the
77d0: 20 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   dot */..    /* 
77e0: 46 6f 72 20 65 76 65 72 79 20 63 6f 6e 66 69 67  For every config
77f0: 75 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  uration in the s
7800: 74 61 74 65 20 22 73 74 70 22 20 77 68 69 63 68  tate "stp" which
7810: 20 68 61 73 20 74 68 65 20 73 79 6d 62 6f 6c 20   has the symbol 
7820: 22 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c  "sp".    ** foll
7830: 6f 77 69 6e 67 20 69 74 73 20 64 6f 74 2c 20 61  owing its dot, a
7840: 64 64 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 66  dd the same conf
7850: 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65  iguration to the
7860: 20 62 61 73 69 73 20 73 65 74 20 75 6e 64 65 72   basis set under
7870: 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63  .    ** construc
7880: 74 69 6f 6e 20 62 75 74 20 77 69 74 68 20 74 68  tion but with th
7890: 65 20 64 6f 74 20 73 68 69 66 74 65 64 20 6f 6e  e dot shifted on
78a0: 65 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68 65 20  e symbol to the 
78b0: 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 66 6f  right. */.    fo
78c0: 72 28 62 63 66 70 3d 63 66 70 3b 20 62 63 66 70  r(bcfp=cfp; bcfp
78d0: 3b 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e 65 78  ; bcfp=bcfp->nex
78e0: 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 63  t){.      if( bc
78f0: 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50  fp->status==COMP
7900: 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LETE ) continue;
7910: 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75      /* Already u
7920: 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  sed */.      if(
7930: 20 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63 66 70   bcfp->dot>=bcfp
7940: 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e  ->rp->nrhs ) con
7950: 74 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27 74 20  tinue; /* Can't 
7960: 73 68 69 66 74 20 74 68 69 73 20 6f 6e 65 20 2a  shift this one *
7970: 2f 0a 20 20 20 20 20 20 62 73 70 20 3d 20 62 63  /.      bsp = bc
7980: 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63 66 70  fp->rp->rhs[bcfp
7990: 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20  ->dot];         
79a0: 20 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f 6c 20    /* Get symbol 
79b0: 61 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20 20 20  after dot */.   
79c0: 20 20 20 69 66 28 20 21 73 61 6d 65 5f 73 79 6d     if( !same_sym
79d0: 62 6f 6c 28 62 73 70 2c 73 70 29 20 29 20 63 6f  bol(bsp,sp) ) co
79e0: 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 2f 2a 20  ntinue;      /* 
79f0: 4d 75 73 74 20 62 65 20 73 61 6d 65 20 61 73 20  Must be same as 
7a00: 66 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20 20 20  for "cfp" */.   
7a10: 20 20 20 62 63 66 70 2d 3e 73 74 61 74 75 73 20     bcfp->status 
7a20: 3d 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20 20 20  = COMPLETE;     
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7a40: 4d 61 72 6b 20 74 68 69 73 20 63 6f 6e 66 69 67  Mark this config
7a50: 20 61 73 20 75 73 65 64 20 2a 2f 0a 20 20 20 20   as used */.    
7a60: 20 20 6e 65 77 63 66 67 20 3d 20 43 6f 6e 66 69    newcfg = Confi
7a70: 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 62  glist_addbasis(b
7a80: 63 66 70 2d 3e 72 70 2c 62 63 66 70 2d 3e 64 6f  cfp->rp,bcfp->do
7a90: 74 2b 31 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e  t+1);.      Plin
7aa0: 6b 5f 61 64 64 28 26 6e 65 77 63 66 67 2d 3e 62  k_add(&newcfg->b
7ab0: 70 6c 70 2c 62 63 66 70 29 3b 0a 20 20 20 20 7d  plp,bcfp);.    }
7ac0: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 20 70  ..    /* Get a p
7ad0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74  ointer to the st
7ae0: 61 74 65 20 64 65 73 63 72 69 62 65 64 20 62 79  ate described by
7af0: 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69   the basis confi
7b00: 67 75 72 61 74 69 6f 6e 20 73 65 74 0a 20 20 20  guration set.   
7b10: 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65 64 20   ** constructed 
7b20: 69 6e 20 74 68 65 20 70 72 65 63 65 64 69 6e 67  in the preceding
7b30: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 6e 65 77   loop */.    new
7b40: 73 74 70 20 3d 20 67 65 74 73 74 61 74 65 28 6c  stp = getstate(l
7b50: 65 6d 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  emp);..    /* Th
7b60: 65 20 73 74 61 74 65 20 22 6e 65 77 73 74 70 22  e state "newstp"
7b70: 20 69 73 20 72 65 61 63 68 65 64 20 66 72 6f 6d   is reached from
7b80: 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22   the state "stp"
7b90: 20 62 79 20 61 20 73 68 69 66 74 20 61 63 74 69   by a shift acti
7ba0: 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  on.    ** on the
7bb0: 20 73 79 6d 62 6f 6c 20 22 73 70 22 20 2a 2f 0a   symbol "sp" */.
7bc0: 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
7bd0: 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
7be0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
7bf0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
7c00: 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b  <sp->nsubsym; i+
7c10: 2b 29 7b 0a 20 20 20 20 20 20 20 20 41 63 74 69  +){.        Acti
7c20: 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c  on_add(&stp->ap,
7c30: 53 48 49 46 54 2c 73 70 2d 3e 73 75 62 73 79 6d  SHIFT,sp->subsym
7c40: 5b 69 5d 2c 28 63 68 61 72 2a 29 6e 65 77 73 74  [i],(char*)newst
7c50: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
7c60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 41 63 74  }else{.      Act
7c70: 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70  ion_add(&stp->ap
7c80: 2c 53 48 49 46 54 2c 73 70 2c 28 63 68 61 72 20  ,SHIFT,sp,(char 
7c90: 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20 20 7d  *)newstp);.    }
7ca0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
7cb0: 6e 73 74 72 75 63 74 20 74 68 65 20 70 72 6f 70  nstruct the prop
7cc0: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2f  agation links.*/
7cd0: 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28  .void FindLinks(
7ce0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
7cf0: 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp).{.  int i;. 
7d00: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
7d10: 63 66 70 2c 20 2a 6f 74 68 65 72 3b 0a 20 20 73  cfp, *other;.  s
7d20: 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
7d30: 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  ;.  struct plink
7d40: 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f 75   *plp;..  /* Hou
7d50: 73 65 6b 65 65 70 69 6e 67 20 64 65 74 61 69 6c  sekeeping detail
7d60: 3a 0a 20 20 2a 2a 20 41 64 64 20 74 6f 20 65 76  :.  ** Add to ev
7d70: 65 72 79 20 70 72 6f 70 61 67 61 74 65 20 6c 69  ery propagate li
7d80: 6e 6b 20 61 20 70 6f 69 6e 74 65 72 20 62 61 63  nk a pointer bac
7d90: 6b 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74  k to the state t
7da0: 6f 0a 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65  o.  ** which the
7db0: 20 6c 69 6e 6b 20 69 73 20 61 74 74 61 63 68 65   link is attache
7dc0: 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  d. */.  for(i=0;
7dd0: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
7de0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
7df0: 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
7e00: 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74  ;.    for(cfp=st
7e10: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
7e20: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
7e30: 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 73 74     cfp->stp = st
7e40: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  p;.    }.  }..  
7e50: 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20 62  /* Convert all b
7e60: 61 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20 66 6f  acklinks into fo
7e70: 72 77 61 72 64 20 6c 69 6e 6b 73 2e 20 20 4f 6e  rward links.  On
7e80: 6c 79 20 74 68 65 20 66 6f 72 77 61 72 64 0a 20  ly the forward. 
7e90: 20 2a 2a 20 6c 69 6e 6b 73 20 61 72 65 20 75 73   ** links are us
7ea0: 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ed in the follow
7eb0: 2d 73 65 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e  -set computation
7ec0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
7ed0: 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
7ee0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
7ef0: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
7f00: 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70  .    for(cfp=stp
7f10: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
7f20: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
7f30: 20 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 62    for(plp=cfp->b
7f40: 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c  plp; plp; plp=pl
7f50: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
7f60: 20 20 6f 74 68 65 72 20 3d 20 70 6c 70 2d 3e 63    other = plp->c
7f70: 66 70 3b 0a 20 20 20 20 20 20 20 20 50 6c 69 6e  fp;.        Plin
7f80: 6b 5f 61 64 64 28 26 6f 74 68 65 72 2d 3e 66 70  k_add(&other->fp
7f90: 6c 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20 7d  lp,cfp);.      }
7fa0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
7fb0: 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 66 6f 6c   Compute all fol
7fc0: 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 41  lowsets..**.** A
7fd0: 20 66 6f 6c 6c 6f 77 73 65 74 20 69 73 20 74 68   followset is th
7fe0: 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 73 79 6d  e set of all sym
7ff0: 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20 63  bols which can c
8000: 6f 6d 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  ome immediately.
8010: 2a 2a 20 61 66 74 65 72 20 61 20 63 6f 6e 66 69  ** after a confi
8020: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  guration..*/.voi
8030: 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73  d FindFollowSets
8040: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
8050: 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  emp).{.  int i;.
8060: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
8070: 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 70  *cfp;.  struct p
8080: 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 20 20 69 6e 74  link *plp;.  int
8090: 20 70 72 6f 67 72 65 73 73 3b 0a 20 20 69 6e 74   progress;.  int
80a0: 20 63 68 61 6e 67 65 3b 0a 0a 20 20 66 6f 72 28   change;..  for(
80b0: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
80c0: 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66  ate; i++){.    f
80d0: 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72  or(cfp=lemp->sor
80e0: 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70  ted[i]->cfp; cfp
80f0: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
8100: 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61  {.      cfp->sta
8110: 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45  tus = INCOMPLETE
8120: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
8130: 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73   do{.    progres
8140: 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  s = 0;.    for(i
8150: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
8160: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
8170: 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f  for(cfp=lemp->so
8180: 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66  rted[i]->cfp; cf
8190: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
81a0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
81b0: 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50  fp->status==COMP
81c0: 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LETE ) continue;
81d0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 6c 70  .        for(plp
81e0: 3d 63 66 70 2d 3e 66 70 6c 70 3b 20 70 6c 70 3b  =cfp->fplp; plp;
81f0: 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b   plp=plp->next){
8200: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 6e 67  .          chang
8210: 65 20 3d 20 53 65 74 55 6e 69 6f 6e 28 70 6c 70  e = SetUnion(plp
8220: 2d 3e 63 66 70 2d 3e 66 77 73 2c 63 66 70 2d 3e  ->cfp->fws,cfp->
8230: 66 77 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  fws);.          
8240: 69 66 28 20 63 68 61 6e 67 65 20 29 7b 0a 20 20  if( change ){.  
8250: 20 20 20 20 20 20 20 20 20 20 70 6c 70 2d 3e 63            plp->c
8260: 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43  fp->status = INC
8270: 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 20  OMPLETE;.       
8280: 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20       progress = 
8290: 31 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20  1;..  }..}.     
82a0: 20 20 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d     cfp->status =
82b0: 20 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20   COMPLETE;.     
82c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
82d0: 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d  e( progress );.}
82e0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  ..static int res
82f0: 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 73 74  olve_conflict(st
8300: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 2c 73 74  ruct action *,st
8310: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a  ruct action *);.
8320: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  ./* Compute the 
8330: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 2c 20  reduce actions, 
8340: 61 6e 64 20 72 65 73 6f 6c 76 65 20 63 6f 6e 66  and resolve conf
8350: 6c 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46  licts..*/.void F
8360: 69 6e 64 41 63 74 69 6f 6e 73 28 73 74 72 75 63  indActions(struc
8370: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
8380: 0a 20 20 69 6e 74 20 69 2c 6a 3b 0a 20 20 73 74  .  int i,j;.  st
8390: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
83a0: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
83b0: 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
83c0: 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74  symbol *sp;.  st
83d0: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a  ruct rule *rp;..
83e0: 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 6f 66 20    /* Add all of 
83f0: 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f  the reduce actio
8400: 6e 73 20 0a 20 20 2a 2a 20 41 20 72 65 64 75 63  ns .  ** A reduc
8410: 65 20 61 63 74 69 6f 6e 20 69 73 20 61 64 64 65  e action is adde
8420: 64 20 66 6f 72 20 65 61 63 68 20 65 6c 65 6d 65  d for each eleme
8430: 6e 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  nt of the follow
8440: 73 65 74 20 6f 66 0a 20 20 2a 2a 20 61 20 63 6f  set of.  ** a co
8450: 6e 66 69 67 75 72 61 74 69 6f 6e 20 77 68 69 63  nfiguration whic
8460: 68 20 68 61 73 20 69 74 73 20 64 6f 74 20 61 74  h has its dot at
8470: 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
8480: 68 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ht..  */.  for(i
8490: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
84a0: 74 65 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c  te; i++){   /* L
84b0: 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73 74 61  oop over all sta
84c0: 74 65 73 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d  tes */.    stp =
84d0: 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
84e0: 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74  ;.    for(cfp=st
84f0: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
8500: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a  =cfp->next){  /*
8510: 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 63   Loop over all c
8520: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f  onfigurations */
8530: 0a 20 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e  .      if( cfp->
8540: 72 70 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e 64  rp->nrhs==cfp->d
8550: 6f 74 20 29 7b 20 20 20 20 20 20 20 20 2f 2a 20  ot ){        /* 
8560: 49 73 20 64 6f 74 20 61 74 20 65 78 74 72 65 6d  Is dot at extrem
8570: 65 20 72 69 67 68 74 3f 20 2a 2f 0a 20 20 20 20  e right? */.    
8580: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
8590: 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
85a0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
85b0: 69 66 28 20 53 65 74 46 69 6e 64 28 63 66 70 2d  if( SetFind(cfp-
85c0: 3e 66 77 73 2c 6a 29 20 29 7b 0a 20 20 20 20 20  >fws,j) ){.     
85d0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20         /* Add a 
85e0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 74 6f  reduce action to
85f0: 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22   the state "stp"
8600: 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65 64 75   which will redu
8610: 63 65 20 62 79 20 74 68 65 0a 20 20 20 20 20 20  ce by the.      
8620: 20 20 20 20 20 20 2a 2a 20 72 75 6c 65 20 22 63        ** rule "c
8630: 66 70 2d 3e 72 70 22 20 69 66 20 74 68 65 20 6c  fp->rp" if the l
8640: 6f 6f 6b 61 68 65 61 64 20 73 79 6d 62 6f 6c 20  ookahead symbol 
8650: 69 73 20 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  is "lemp->symbol
8660: 73 5b 6a 5d 22 20 2a 2f 0a 20 20 20 20 20 20 20  s[j]" */.       
8670: 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28       Action_add(
8680: 26 73 74 70 2d 3e 61 70 2c 52 45 44 55 43 45 2c  &stp->ap,REDUCE,
8690: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d  lemp->symbols[j]
86a0: 2c 28 63 68 61 72 20 2a 29 63 66 70 2d 3e 72 70  ,(char *)cfp->rp
86b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 09  );.          }..
86c0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
86d0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
86e0: 65 20 61 63 63 65 70 74 69 6e 67 20 74 6f 6b 65  e accepting toke
86f0: 6e 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d  n */.  if( lemp-
8700: 3e 73 74 61 72 74 20 29 7b 0a 20 20 20 20 73 70  >start ){.    sp
8710: 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c   = Symbol_find(l
8720: 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20  emp->start);.   
8730: 20 69 66 28 20 73 70 3d 3d 30 20 29 20 73 70 20   if( sp==0 ) sp 
8740: 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68  = lemp->rule->lh
8750: 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
8760: 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d  sp = lemp->rule-
8770: 3e 6c 68 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41  >lhs;.  }.  /* A
8780: 64 64 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  dd to the first 
8790: 73 74 61 74 65 20 28 77 68 69 63 68 20 69 73 20  state (which is 
87a0: 61 6c 77 61 79 73 20 74 68 65 20 73 74 61 72 74  always the start
87b0: 69 6e 67 20 73 74 61 74 65 20 6f 66 20 74 68 65  ing state of the
87c0: 0a 20 20 2a 2a 20 66 69 6e 69 74 65 20 73 74 61  .  ** finite sta
87d0: 74 65 20 6d 61 63 68 69 6e 65 29 20 61 6e 20 61  te machine) an a
87e0: 63 74 69 6f 6e 20 74 6f 20 41 43 43 45 50 54 20  ction to ACCEPT 
87f0: 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  if the lookahead
8800: 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 73 74 61   is the.  ** sta
8810: 72 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20  rt nonterminal. 
8820: 20 2a 2f 0a 20 20 41 63 74 69 6f 6e 5f 61 64 64   */.  Action_add
8830: 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30  (&lemp->sorted[0
8840: 5d 2d 3e 61 70 2c 41 43 43 45 50 54 2c 73 70 2c  ]->ap,ACCEPT,sp,
8850: 30 29 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76  0);..  /* Resolv
8860: 65 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20  e conflicts */. 
8870: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
8880: 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
8890: 20 20 20 20 73 74 72 75 63 74 20 61 63 74 69 6f      struct actio
88a0: 6e 20 2a 61 70 2c 20 2a 6e 61 70 3b 0a 20 20 20  n *ap, *nap;.   
88b0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
88c0: 74 70 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  tp;.    stp = le
88d0: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
88e0: 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 73 74     /* assert( st
88f0: 70 2d 3e 61 70 20 29 3b 20 2a 2f 0a 20 20 20 20  p->ap ); */.    
8900: 73 74 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e  stp->ap = Action
8910: 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a  _sort(stp->ap);.
8920: 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
8930: 61 70 3b 20 61 70 20 26 26 20 61 70 2d 3e 6e 65  ap; ap && ap->ne
8940: 78 74 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  xt; ap=ap->next)
8950: 7b 0a 20 20 20 20 20 20 66 6f 72 28 6e 61 70 3d  {.      for(nap=
8960: 61 70 2d 3e 6e 65 78 74 3b 20 6e 61 70 20 26 26  ap->next; nap &&
8970: 20 6e 61 70 2d 3e 73 70 3d 3d 61 70 2d 3e 73 70   nap->sp==ap->sp
8980: 3b 20 6e 61 70 3d 6e 61 70 2d 3e 6e 65 78 74 29  ; nap=nap->next)
8990: 7b 0a 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  {.         /* Th
89a0: 65 20 74 77 6f 20 61 63 74 69 6f 6e 73 20 22 61  e two actions "a
89b0: 70 22 20 61 6e 64 20 22 6e 61 70 22 20 68 61 76  p" and "nap" hav
89c0: 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 6f 6b 61  e the same looka
89d0: 68 65 61 64 2e 0a 20 20 20 20 20 20 20 20 20 2a  head..         *
89e0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69  * Figure out whi
89f0: 63 68 20 6f 6e 65 20 73 68 6f 75 6c 64 20 62 65  ch one should be
8a00: 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20   used */.       
8a10: 20 20 6c 65 6d 70 2d 3e 6e 63 6f 6e 66 6c 69 63    lemp->nconflic
8a20: 74 20 2b 3d 20 72 65 73 6f 6c 76 65 5f 63 6f 6e  t += resolve_con
8a30: 66 6c 69 63 74 28 61 70 2c 6e 61 70 29 3b 0a 20  flict(ap,nap);. 
8a40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8a50: 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20 61 6e  ..  /* Report an
8a60: 20 65 72 72 6f 72 20 66 6f 72 20 65 61 63 68 20   error for each 
8a70: 72 75 6c 65 20 74 68 61 74 20 63 61 6e 20 6e 65  rule that can ne
8a80: 76 65 72 20 62 65 20 72 65 64 75 63 65 64 2e 20  ver be reduced. 
8a90: 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
8aa0: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
8ab0: 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 63 61 6e  p->next) rp->can
8ac0: 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f 46  Reduce = LEMON_F
8ad0: 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ALSE;.  for(i=0;
8ae0: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
8af0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
8b00: 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20  t action *ap;.  
8b10: 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d 3e 73    for(ap=lemp->s
8b20: 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20 61 70  orted[i]->ap; ap
8b30: 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
8b40: 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
8b50: 70 65 3d 3d 52 45 44 55 43 45 20 29 20 61 70 2d  pe==REDUCE ) ap-
8b60: 3e 78 2e 72 70 2d 3e 63 61 6e 52 65 64 75 63 65  >x.rp->canReduce
8b70: 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20   = LEMON_TRUE;. 
8b80: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 72     }.  }.  for(r
8b90: 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
8ba0: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
8bb0: 20 20 20 20 69 66 28 20 72 70 2d 3e 63 61 6e 52      if( rp->canR
8bc0: 65 64 75 63 65 20 29 20 63 6f 6e 74 69 6e 75 65  educe ) continue
8bd0: 3b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c  ;.    ErrorMsg(l
8be0: 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70  emp->filename,rp
8bf0: 2d 3e 72 75 6c 65 6c 69 6e 65 2c 22 54 68 69 73  ->ruleline,"This
8c00: 20 72 75 6c 65 20 63 61 6e 20 6e 6f 74 20 62 65   rule can not be
8c10: 20 72 65 64 75 63 65 64 2e 5c 6e 22 29 3b 0a 20   reduced.\n");. 
8c20: 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
8c30: 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52  t++;.  }.}../* R
8c40: 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63  esolve a conflic
8c50: 74 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  t between the tw
8c60: 6f 20 67 69 76 65 6e 20 61 63 74 69 6f 6e 73 2e  o given actions.
8c70: 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 6f 6e 66    If the.** conf
8c80: 6c 69 63 74 20 63 61 6e 27 74 20 62 65 20 72 65  lict can't be re
8c90: 73 6f 6c 76 65 64 2c 20 72 65 74 75 72 6e 20 6e  solved, return n
8ca0: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4e  on-zero..**.** N
8cb0: 4f 20 4c 4f 4e 47 45 52 20 54 52 55 45 3a 0a 2a  O LONGER TRUE:.*
8cc0: 2a 20 20 20 54 6f 20 72 65 73 6f 6c 76 65 20 61  *   To resolve a
8cd0: 20 63 6f 6e 66 6c 69 63 74 2c 20 66 69 72 73 74   conflict, first
8ce0: 20 6c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20   look to see if 
8cf0: 65 69 74 68 65 72 20 61 63 74 69 6f 6e 0a 2a 2a  either action.**
8d00: 20 20 20 69 73 20 6f 6e 20 61 6e 20 65 72 72 6f     is on an erro
8d10: 72 20 72 75 6c 65 2e 20 20 49 6e 20 74 68 61 74  r rule.  In that
8d20: 20 63 61 73 65 2c 20 74 61 6b 65 20 74 68 65 20   case, take the 
8d30: 61 63 74 69 6f 6e 20 77 68 69 63 68 0a 2a 2a 20  action which.** 
8d40: 20 20 69 73 20 6e 6f 74 20 61 73 73 6f 63 69 61    is not associa
8d50: 74 65 64 20 77 69 74 68 20 74 68 65 20 65 72 72  ted with the err
8d60: 6f 72 20 72 75 6c 65 2e 20 20 49 66 20 6e 65 69  or rule.  If nei
8d70: 74 68 65 72 20 6f 72 20 62 6f 74 68 0a 2a 2a 20  ther or both.** 
8d80: 20 20 61 63 74 69 6f 6e 73 20 61 72 65 20 61 73    actions are as
8d90: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 6e  sociated with an
8da0: 20 65 72 72 6f 72 20 72 75 6c 65 2c 20 74 68 65   error rule, the
8db0: 6e 20 74 72 79 20 74 6f 0a 2a 2a 20 20 20 75 73  n try to.**   us
8dc0: 65 20 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20  e precedence to 
8dd0: 72 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6e 66  resolve the conf
8de0: 6c 69 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  lict..**.** If e
8df0: 69 74 68 65 72 20 61 63 74 69 6f 6e 20 69 73 20  ither action is 
8e00: 61 20 53 48 49 46 54 2c 20 74 68 65 6e 20 69 74  a SHIFT, then it
8e10: 20 6d 75 73 74 20 62 65 20 61 70 78 2e 20 20 54   must be apx.  T
8e20: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
8e30: 77 6f 6e 27 74 20 77 6f 72 6b 20 69 66 20 61 70  won't work if ap
8e40: 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  x->type==REDUCE 
8e50: 61 6e 64 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53  and apy->type==S
8e60: 48 49 46 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  HIFT..*/.static 
8e70: 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66  int resolve_conf
8e80: 6c 69 63 74 28 0a 20 20 73 74 72 75 63 74 20 61  lict(.  struct a
8e90: 63 74 69 6f 6e 20 2a 61 70 78 2c 0a 20 20 73 74  ction *apx,.  st
8ea0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 79  ruct action *apy
8eb0: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  .){.  struct sym
8ec0: 62 6f 6c 20 2a 73 70 78 2c 20 2a 73 70 79 3b 0a  bol *spx, *spy;.
8ed0: 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30    int errcnt = 0
8ee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70 78 2d  ;.  assert( apx-
8ef0: 3e 73 70 3d 3d 61 70 79 2d 3e 73 70 20 29 3b 20  >sp==apy->sp ); 
8f00: 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 74 68   /* Otherwise th
8f10: 65 72 65 20 77 6f 75 6c 64 20 62 65 20 6e 6f 20  ere would be no 
8f20: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 66  conflict */.  if
8f30: 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 49  ( apx->type==SHI
8f40: 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d  FT && apy->type=
8f50: 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 61 70  =SHIFT ){.    ap
8f60: 79 2d 3e 74 79 70 65 20 3d 20 53 53 43 4f 4e 46  y->type = SSCONF
8f70: 4c 49 43 54 3b 0a 20 20 20 20 65 72 72 63 6e 74  LICT;.    errcnt
8f80: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 70  ++;.  }.  if( ap
8f90: 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26  x->type==SHIFT &
8fa0: 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44  & apy->type==RED
8fb0: 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d  UCE ){.    spx =
8fc0: 20 61 70 78 2d 3e 73 70 3b 0a 20 20 20 20 73 70   apx->sp;.    sp
8fd0: 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70  y = apy->x.rp->p
8fe0: 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28 20  recsym;.    if( 
8ff0: 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70  spy==0 || spx->p
9000: 72 65 63 3c 30 20 7c 7c 20 73 70 79 2d 3e 70 72  rec<0 || spy->pr
9010: 65 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ec<0 ){.      /*
9020: 20 4e 6f 74 20 65 6e 6f 75 67 68 20 70 72 65 63   Not enough prec
9030: 65 64 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69  edence informati
9040: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 70 79  on. */.      apy
9050: 2d 3e 74 79 70 65 20 3d 20 53 52 43 4f 4e 46 4c  ->type = SRCONFL
9060: 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e  ICT;.      errcn
9070: 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t++;.    }else i
9080: 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73 70 79  f( spx->prec>spy
9090: 2d 3e 70 72 65 63 20 29 7b 20 20 20 20 2f 2a 20  ->prec ){    /* 
90a0: 68 69 67 68 65 72 20 70 72 65 63 65 64 65 6e 63  higher precedenc
90b0: 65 20 77 69 6e 73 20 2a 2f 0a 20 20 20 20 20 20  e wins */.      
90c0: 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52  apy->type = RD_R
90d0: 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c  ESOLVED;.    }el
90e0: 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63  se if( spx->prec
90f0: 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20  <spy->prec ){.  
9100: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20      apx->type = 
9110: 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20  SH_RESOLVED;.   
9120: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
9130: 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20  prec==spy->prec 
9140: 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 52  && spx->assoc==R
9150: 49 47 48 54 20 29 7b 20 2f 2a 20 55 73 65 20 6f  IGHT ){ /* Use o
9160: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
9170: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f   apy->type = RD_
9180: 52 45 53 4f 4c 56 45 44 3b 20 20 20 20 20 20 20  RESOLVED;       
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91a0: 20 20 20 20 20 20 2f 2a 20 61 73 73 6f 63 69 61        /* associa
91b0: 74 69 76 69 74 79 20 2a 2f 0a 20 20 20 20 7d 65  tivity */.    }e
91c0: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
91d0: 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20  c==spy->prec && 
91e0: 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4c 45 46 54  spx->assoc==LEFT
91f0: 20 29 7b 20 20 2f 2a 20 74 6f 20 62 72 65 61 6b   ){  /* to break
9200: 20 74 69 65 20 2a 2f 0a 20 20 20 20 20 20 61 70   tie */.      ap
9210: 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52 45 53  x->type = SH_RES
9220: 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65  OLVED;.    }else
9230: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9240: 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e  spx->prec==spy->
9250: 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73  prec && spx->ass
9260: 6f 63 3d 3d 4e 4f 4e 45 20 29 3b 0a 20 20 20 20  oc==NONE );.    
9270: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 53 52    apy->type = SR
9280: 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20  CONFLICT;.      
9290: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a  errcnt++;.    }.
92a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70 78 2d    }else if( apx-
92b0: 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26  >type==REDUCE &&
92c0: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44 55   apy->type==REDU
92d0: 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d 20  CE ){.    spx = 
92e0: 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73  apx->x.rp->precs
92f0: 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d 20 61 70  ym;.    spy = ap
9300: 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d  y->x.rp->precsym
9310: 3b 0a 20 20 20 20 69 66 28 20 73 70 78 3d 3d 30  ;.    if( spx==0
9320: 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70   || spy==0 || sp
9330: 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a 20 20 20  x->prec<0 ||.   
9340: 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 7c 7c 20   spy->prec<0 || 
9350: 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e  spx->prec==spy->
9360: 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70  prec ){.      ap
9370: 79 2d 3e 74 79 70 65 20 3d 20 52 52 43 4f 4e 46  y->type = RRCONF
9380: 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63  LICT;.      errc
9390: 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  nt++;.    }else 
93a0: 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73 70  if( spx->prec>sp
93b0: 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20  y->prec ){.     
93c0: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f   apy->type = RD_
93d0: 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65  RESOLVED;.    }e
93e0: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
93f0: 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20  c<spy->prec ){. 
9400: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d       apx->type =
9410: 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   RD_RESOLVED;.  
9420: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
9430: 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20   assert( .      
9440: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45  apx->type==SH_RE
9450: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
9460: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45  apx->type==RD_RE
9470: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
9480: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e  apx->type==SSCON
9490: 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61  FLICT ||.      a
94a0: 70 78 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46  px->type==SRCONF
94b0: 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70  LICT ||.      ap
94c0: 78 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c  x->type==RRCONFL
94d0: 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  ICT ||.      apy
94e0: 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c  ->type==SH_RESOL
94f0: 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  VED ||.      apy
9500: 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c  ->type==RD_RESOL
9510: 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  VED ||.      apy
9520: 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e 46 4c 49  ->type==SSCONFLI
9530: 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d  CT ||.      apy-
9540: 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46 4c 49 43  >type==SRCONFLIC
9550: 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e  T ||.      apy->
9560: 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c 49 43 54  type==RRCONFLICT
9570: 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f 2a 20 54  .    );.    /* T
9580: 68 65 20 52 45 44 55 43 45 2f 53 48 49 46 54 20  he REDUCE/SHIFT 
9590: 63 61 73 65 20 63 61 6e 6e 6f 74 20 68 61 70 70  case cannot happ
95a0: 65 6e 20 62 65 63 61 75 73 65 20 53 48 49 46 54  en because SHIFT
95b0: 73 20 63 6f 6d 65 20 62 65 66 6f 72 65 0a 20 20  s come before.  
95c0: 20 20 2a 2a 20 52 45 44 55 43 45 73 20 6f 6e 20    ** REDUCEs on 
95d0: 74 68 65 20 6c 69 73 74 2e 20 20 49 66 20 77 65  the list.  If we
95e0: 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
95f0: 74 20 69 74 20 6d 75 73 74 20 62 65 20 62 65 63  t it must be bec
9600: 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ause.    ** the 
9610: 70 61 72 73 65 72 20 63 6f 6e 66 6c 69 63 74 20  parser conflict 
9620: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
9630: 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20   resolved. */.  
9640: 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e  }.  return errcn
9650: 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t;.}./**********
9660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
9670: 20 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66 69   the file "confi
9680: 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  glist.c" *******
9690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96a0: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  **/./*.** Routin
96b0: 65 73 20 74 6f 20 70 72 6f 63 65 73 73 69 6e 67  es to processing
96c0: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
96d0: 20 6c 69 73 74 20 61 6e 64 20 62 75 69 6c 64 69   list and buildi
96e0: 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a 20 69 6e  ng a state.** in
96f0: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
9700: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
9710: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
9720: 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69 73 74 20  onfig *freelist 
9730: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  = 0;      /* Lis
9740: 74 20 6f 66 20 66 72 65 65 20 63 6f 6e 66 69 67  t of free config
9750: 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  urations */.stat
9760: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
9770: 20 2a 63 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   *current = 0;  
9780: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c       /* Top of l
9790: 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61  ist of configura
97a0: 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
97b0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a  struct config **
97c0: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 20  currentend = 0; 
97d0: 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c 69 73    /* Last on lis
97e0: 74 20 6f 66 20 63 6f 6e 66 69 67 73 20 2a 2f 0a  t of configs */.
97f0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f  static struct co
9800: 6e 66 69 67 20 2a 62 61 73 69 73 20 3d 20 30 3b  nfig *basis = 0;
9810: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
9820: 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73  of list of basis
9830: 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74   configs */.stat
9840: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
9850: 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d 20 30 3b   **basisend = 0;
9860: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c       /* End of l
9870: 69 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f 6e  ist of basis con
9880: 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65 74 75  figs */../* Retu
9890: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
98a0: 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61 74  a new configurat
98b0: 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 73  ion */.PRIVATE s
98c0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
98d0: 77 63 6f 6e 66 69 67 28 29 7b 0a 20 20 73 74 72  wconfig(){.  str
98e0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63  uct config *newc
98f0: 66 67 3b 0a 20 20 69 66 28 20 66 72 65 65 6c 69  fg;.  if( freeli
9900: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  st==0 ){.    int
9910: 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20   i;.    int amt 
9920: 3d 20 33 3b 0a 20 20 20 20 66 72 65 65 6c 69 73  = 3;.    freelis
9930: 74 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66  t = (struct conf
9940: 69 67 20 2a 29 63 61 6c 6c 6f 63 28 20 61 6d 74  ig *)calloc( amt
9950: 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  , sizeof(struct 
9960: 63 6f 6e 66 69 67 29 20 29 3b 0a 20 20 20 20 69  config) );.    i
9970: 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29  f( freelist==0 )
9980: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
9990: 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74  stderr,"Unable t
99a0: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
99b0: 79 20 66 6f 72 20 61 20 6e 65 77 20 63 6f 6e 66  y for a new conf
99c0: 69 67 75 72 61 74 69 6f 6e 2e 22 29 3b 0a 20 20  iguration.");.  
99d0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
99e0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
99f0: 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72  i<amt-1; i++) fr
9a00: 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d  eelist[i].next =
9a10: 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b   &freelist[i+1];
9a20: 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b 61 6d  .    freelist[am
9a30: 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20  t-1].next = 0;. 
9a40: 20 7d 0a 20 20 6e 65 77 63 66 67 20 3d 20 66 72   }.  newcfg = fr
9a50: 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69  eelist;.  freeli
9a60: 73 74 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e  st = freelist->n
9a70: 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65  ext;.  return ne
9a80: 77 63 66 67 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  wcfg;.}../* The 
9a90: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 6f  configuration "o
9aa0: 6c 64 22 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  ld" is no longer
9ab0: 20 75 73 65 64 20 2a 2f 0a 50 52 49 56 41 54 45   used */.PRIVATE
9ac0: 20 76 6f 69 64 20 64 65 6c 65 74 65 63 6f 6e 66   void deleteconf
9ad0: 69 67 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ig(struct config
9ae0: 20 2a 6f 6c 64 29 0a 7b 0a 20 20 6f 6c 64 2d 3e   *old).{.  old->
9af0: 6e 65 78 74 20 3d 20 66 72 65 65 6c 69 73 74 3b  next = freelist;
9b00: 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20 6f 6c  .  freelist = ol
9b10: 64 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c  d;.}../* Initial
9b20: 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69 67 75  ized the configu
9b30: 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c  ration list buil
9b40: 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  der */.void Conf
9b50: 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 7b 0a 20  iglist_init(){. 
9b60: 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20   current = 0;.  
9b70: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 75  currentend = &cu
9b80: 72 72 65 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d  rrent;.  basis =
9b90: 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d   0;.  basisend =
9ba0: 20 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69   &basis;.  Confi
9bb0: 67 74 61 62 6c 65 5f 69 6e 69 74 28 29 3b 0a 20  gtable_init();. 
9bc0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49   return;.}../* I
9bd0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63  nitialized the c
9be0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
9bf0: 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69  t builder */.voi
9c00: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73  d Configlist_res
9c10: 65 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20  et(){.  current 
9c20: 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e  = 0;.  currenten
9c30: 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20  d = &current;.  
9c40: 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73  basis = 0;.  bas
9c50: 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a  isend = &basis;.
9c60: 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c    Configtable_cl
9c70: 65 61 72 28 30 29 3b 0a 20 20 72 65 74 75 72 6e  ear(0);.  return
9c80: 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 6e 6f 74  ;.}../* Add anot
9c90: 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  her configuratio
9ca0: 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75  n to the configu
9cb0: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73  ration list */.s
9cc0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
9cd0: 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 0a 20 20  nfiglist_add(.  
9ce0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c  struct rule *rp,
9cf0: 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 20      /* The rule 
9d00: 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 20 20 20 20  */.  int dot    
9d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
9d20: 78 20 69 6e 74 6f 20 74 68 65 20 52 48 53 20 6f  x into the RHS o
9d30: 66 20 74 68 65 20 72 75 6c 65 20 77 68 65 72 65  f the rule where
9d40: 20 74 68 65 20 64 6f 74 20 67 6f 65 73 20 2a 2f   the dot goes */
9d50: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  .){.  struct con
9d60: 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b  fig *cfp, model;
9d70: 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 72  ..  assert( curr
9d80: 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d  entend!=0 );.  m
9d90: 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20  odel.rp = rp;.  
9da0: 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b  model.dot = dot;
9db0: 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74  .  cfp = Configt
9dc0: 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c  able_find(&model
9dd0: 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20  );.  if( cfp==0 
9de0: 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77  ){.    cfp = new
9df0: 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66  config();.    cf
9e00: 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20  p->rp = rp;.    
9e10: 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a  cfp->dot = dot;.
9e20: 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53      cfp->fws = S
9e30: 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70  etNew();.    cfp
9e40: 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63  ->stp = 0;.    c
9e50: 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e  fp->fplp = cfp->
9e60: 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66  bplp = 0;.    cf
9e70: 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20  p->next = 0;.   
9e80: 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20   cfp->bp = 0;.  
9e90: 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20    *currentend = 
9ea0: 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74  cfp;.    current
9eb0: 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74  end = &cfp->next
9ec0: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c  ;.    Configtabl
9ed0: 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20  e_insert(cfp);. 
9ee0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b   }.  return cfp;
9ef0: 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62 61 73  .}../* Add a bas
9f00: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
9f10: 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72   to the configur
9f20: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74  ation list */.st
9f30: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
9f40: 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73  figlist_addbasis
9f50: 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70  (struct rule *rp
9f60: 2c 20 69 6e 74 20 64 6f 74 29 0a 7b 0a 20 20 73  , int dot).{.  s
9f70: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
9f80: 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73  p, model;..  ass
9f90: 65 72 74 28 20 62 61 73 69 73 65 6e 64 21 3d 30  ert( basisend!=0
9fa0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
9fb0: 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20  rrentend!=0 );. 
9fc0: 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a   model.rp = rp;.
9fd0: 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f    model.dot = do
9fe0: 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  t;.  cfp = Confi
9ff0: 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64  gtable_find(&mod
a000: 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d  el);.  if( cfp==
a010: 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e  0 ){.    cfp = n
a020: 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20  ewconfig();.    
a030: 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20  cfp->rp = rp;.  
a040: 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74    cfp->dot = dot
a050: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d  ;.    cfp->fws =
a060: 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63   SetNew();.    c
a070: 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20  fp->stp = 0;.   
a080: 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70   cfp->fplp = cfp
a090: 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20  ->bplp = 0;.    
a0a0: 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20  cfp->next = 0;. 
a0b0: 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a     cfp->bp = 0;.
a0c0: 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20      *currentend 
a0d0: 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65  = cfp;.    curre
a0e0: 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65  ntend = &cfp->ne
a0f0: 78 74 3b 0a 20 20 20 20 2a 62 61 73 69 73 65 6e  xt;.    *basisen
a100: 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 62 61 73  d = cfp;.    bas
a110: 69 73 65 6e 64 20 3d 20 26 63 66 70 2d 3e 62 70  isend = &cfp->bp
a120: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c  ;.    Configtabl
a130: 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20  e_insert(cfp);. 
a140: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b   }.  return cfp;
a150: 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74  .}../* Compute t
a160: 68 65 20 63 6c 6f 73 75 72 65 20 6f 66 20 74 68  he closure of th
a170: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
a180: 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  list */.void Con
a190: 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28  figlist_closure(
a1a0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
a1b0: 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63  mp).{.  struct c
a1c0: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6e 65 77  onfig *cfp, *new
a1d0: 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75  cfp;.  struct ru
a1e0: 6c 65 20 2a 72 70 2c 20 2a 6e 65 77 72 70 3b 0a  le *rp, *newrp;.
a1f0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
a200: 2a 73 70 2c 20 2a 78 73 70 3b 0a 20 20 69 6e 74  *sp, *xsp;.  int
a210: 20 69 2c 20 64 6f 74 3b 0a 0a 20 20 61 73 73 65   i, dot;..  asse
a220: 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d  rt( currentend!=
a230: 30 20 29 3b 0a 20 20 66 6f 72 28 63 66 70 3d 63  0 );.  for(cfp=c
a240: 75 72 72 65 6e 74 3b 20 63 66 70 3b 20 63 66 70  urrent; cfp; cfp
a250: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
a260: 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20   rp = cfp->rp;. 
a270: 20 20 20 64 6f 74 20 3d 20 63 66 70 2d 3e 64 6f     dot = cfp->do
a280: 74 3b 0a 20 20 20 20 69 66 28 20 64 6f 74 3e 3d  t;.    if( dot>=
a290: 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69  rp->nrhs ) conti
a2a0: 6e 75 65 3b 0a 20 20 20 20 73 70 20 3d 20 72 70  nue;.    sp = rp
a2b0: 2d 3e 72 68 73 5b 64 6f 74 5d 3b 0a 20 20 20 20  ->rhs[dot];.    
a2c0: 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f  if( sp->type==NO
a2d0: 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  NTERMINAL ){.   
a2e0: 20 20 20 69 66 28 20 73 70 2d 3e 72 75 6c 65 3d     if( sp->rule=
a2f0: 3d 30 20 26 26 20 73 70 21 3d 6c 65 6d 70 2d 3e  =0 && sp!=lemp->
a300: 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20  errsym ){.      
a310: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
a320: 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69  >filename,rp->li
a330: 6e 65 2c 22 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20  ne,"Nonterminal 
a340: 5c 22 25 73 5c 22 20 68 61 73 20 6e 6f 20 72 75  \"%s\" has no ru
a350: 6c 65 73 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  les.",.         
a360: 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
a370: 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
a380: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nt++;.      }.  
a390: 20 20 20 20 66 6f 72 28 6e 65 77 72 70 3d 73 70      for(newrp=sp
a3a0: 2d 3e 72 75 6c 65 3b 20 6e 65 77 72 70 3b 20 6e  ->rule; newrp; n
a3b0: 65 77 72 70 3d 6e 65 77 72 70 2d 3e 6e 65 78 74  ewrp=newrp->next
a3c0: 6c 68 73 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  lhs){.        ne
a3d0: 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73  wcfp = Configlis
a3e0: 74 5f 61 64 64 28 6e 65 77 72 70 2c 30 29 3b 0a  t_add(newrp,0);.
a3f0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 64 6f          for(i=do
a400: 74 2b 31 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  t+1; i<rp->nrhs;
a410: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
a420: 20 78 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69   xsp = rp->rhs[i
a430: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
a440: 20 78 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d   xsp->type==TERM
a450: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
a460: 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66      SetAdd(newcf
a470: 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 69 6e 64 65  p->fws,xsp->inde
a480: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x);.            
a490: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
a4a0: 20 7d 65 6c 73 65 20 69 66 28 20 78 73 70 2d 3e   }else if( xsp->
a4b0: 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
a4c0: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
a4d0: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
a4e0: 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
a4f0: 3c 78 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b  <xsp->nsubsym; k
a500: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
a510: 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66 70     SetAdd(newcfp
a520: 2d 3e 66 77 73 2c 20 78 73 70 2d 3e 73 75 62 73  ->fws, xsp->subs
a530: 79 6d 5b 6b 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20  ym[k]->index);. 
a540: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
a550: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a560: 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20  .  }else{.      
a570: 20 20 20 20 20 20 53 65 74 55 6e 69 6f 6e 28 6e        SetUnion(n
a580: 65 77 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e  ewcfp->fws,xsp->
a590: 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20  firstset);.     
a5a0: 20 20 20 20 20 20 20 69 66 28 20 78 73 70 2d 3e         if( xsp->
a5b0: 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41  lambda==LEMON_FA
a5c0: 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 20 20  LSE ) break;..  
a5d0: 7d 0a 09 7d 0a 20 20 20 20 20 20 20 20 69 66 28  }..}.        if(
a5e0: 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 50   i==rp->nrhs ) P
a5f0: 6c 69 6e 6b 5f 61 64 64 28 26 63 66 70 2d 3e 66  link_add(&cfp->f
a600: 70 6c 70 2c 6e 65 77 63 66 70 29 3b 0a 20 20 20  plp,newcfp);.   
a610: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
a620: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53   return;.}../* S
a630: 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ort the configur
a640: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f  ation list */.vo
a650: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f  id Configlist_so
a660: 72 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20  rt(){.  current 
a670: 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  = (struct config
a680: 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20 2a   *)msort((char *
a690: 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72 20 2a  )current,(char *
a6a0: 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 6e 65 78  *)&(current->nex
a6b0: 74 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20  t),Configcmp);. 
a6c0: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b   currentend = 0;
a6d0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
a6e0: 20 53 6f 72 74 20 74 68 65 20 62 61 73 69 73 20   Sort the basis 
a6f0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
a700: 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  st */.void Confi
a710: 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28  glist_sortbasis(
a720: 29 7b 0a 20 20 62 61 73 69 73 20 3d 20 28 73 74  ){.  basis = (st
a730: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d 73  ruct config *)ms
a740: 6f 72 74 28 28 63 68 61 72 20 2a 29 63 75 72 72  ort((char *)curr
a750: 65 6e 74 2c 28 63 68 61 72 20 2a 2a 29 26 28 63  ent,(char **)&(c
a760: 75 72 72 65 6e 74 2d 3e 62 70 29 2c 43 6f 6e 66  urrent->bp),Conf
a770: 69 67 63 6d 70 29 3b 0a 20 20 62 61 73 69 73 65  igcmp);.  basise
a780: 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  nd = 0;.  return
a790: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
a7a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
a7b0: 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66  head of the conf
a7c0: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  iguration list a
a7d0: 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  nd.** reset the 
a7e0: 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63  list */.struct c
a7f0: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73  onfig *Configlis
a800: 74 5f 72 65 74 75 72 6e 28 29 7b 0a 20 20 73 74  t_return(){.  st
a810: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64  ruct config *old
a820: 3b 0a 20 20 6f 6c 64 20 3d 20 63 75 72 72 65 6e  ;.  old = curren
a830: 74 3b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30  t;.  current = 0
a840: 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d  ;.  currentend =
a850: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64   0;.  return old
a860: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
a870: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
a880: 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66  head of the conf
a890: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  iguration list a
a8a0: 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  nd.** reset the 
a8b0: 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63  list */.struct c
a8c0: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73  onfig *Configlis
a8d0: 74 5f 62 61 73 69 73 28 29 7b 0a 20 20 73 74 72  t_basis(){.  str
a8e0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b  uct config *old;
a8f0: 0a 20 20 6f 6c 64 20 3d 20 62 61 73 69 73 3b 0a  .  old = basis;.
a900: 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62    basis = 0;.  b
a910: 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72  asisend = 0;.  r
a920: 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a  eturn old;.}../*
a930: 20 46 72 65 65 20 61 6c 6c 20 65 6c 65 6d 65 6e   Free all elemen
a940: 74 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ts of the given 
a950: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
a960: 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  st */.void Confi
a970: 67 6c 69 73 74 5f 65 61 74 28 73 74 72 75 63 74  glist_eat(struct
a980: 20 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a   config *cfp).{.
a990: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
a9a0: 2a 6e 65 78 74 63 66 70 3b 0a 20 20 66 6f 72 28  *nextcfp;.  for(
a9b0: 3b 20 63 66 70 3b 20 63 66 70 3d 6e 65 78 74 63  ; cfp; cfp=nextc
a9c0: 66 70 29 7b 0a 20 20 20 20 6e 65 78 74 63 66 70  fp){.    nextcfp
a9d0: 20 3d 20 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20   = cfp->next;.  
a9e0: 20 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e 66    assert( cfp->f
a9f0: 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  plp==0 );.    as
aa00: 73 65 72 74 28 20 63 66 70 2d 3e 62 70 6c 70 3d  sert( cfp->bplp=
aa10: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 63 66  =0 );.    if( cf
aa20: 70 2d 3e 66 77 73 20 29 20 53 65 74 46 72 65 65  p->fws ) SetFree
aa30: 28 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20  (cfp->fws);.    
aa40: 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 63 66 70  deleteconfig(cfp
aa50: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  );.  }.  return;
aa60: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
aa70: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
aa80: 69 6c 65 20 22 65 72 72 6f 72 2e 63 22 20 2a 2a  ile "error.c" **
aa90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aaa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
aab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20  ./*.** Code for 
aac0: 70 72 69 6e 74 69 6e 67 20 65 72 72 6f 72 20 6d  printing error m
aad0: 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a 76 6f 69 64  essage..*/..void
aae0: 20 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20   ErrorMsg(const 
aaf0: 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20  char *filename, 
ab00: 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73  int lineno, cons
ab10: 74 20 63 68 61 72 20 2a 66 6f 72 6d 61 74 2c 20  t char *format, 
ab20: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
ab30: 61 70 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  ap;.  fprintf(st
ab40: 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 22 2c  derr, "%s:%d: ",
ab50: 20 66 69 6c 65 6e 61 6d 65 2c 20 6c 69 6e 65 6e   filename, linen
ab60: 6f 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  o);.  va_start(a
ab70: 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20 76 66  p, format);.  vf
ab80: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 66 6f  printf(stderr,fo
ab90: 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76 61 5f 65  rmat,ap);.  va_e
aba0: 6e 64 28 61 70 29 3b 0a 20 20 66 70 72 69 6e 74  nd(ap);.  fprint
abb0: 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b  f(stderr, "\n");
abc0: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
abd0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
abe0: 6c 65 20 22 6d 61 69 6e 2e 63 22 20 2a 2a 2a 2a  le "main.c" ****
abf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac10: 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20 70 72 6f  /./*.** Main pro
ac20: 67 72 61 6d 20 66 69 6c 65 20 66 6f 72 20 74 68  gram file for th
ac30: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
ac40: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
ac50: 20 52 65 70 6f 72 74 20 61 6e 20 6f 75 74 2d 6f   Report an out-o
ac60: 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64 69 74 69  f-memory conditi
ac70: 6f 6e 20 61 6e 64 20 61 62 6f 72 74 2e 20 20 54  on and abort.  T
ac80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
ac90: 69 73 20 75 73 65 64 20 6d 6f 73 74 6c 79 20 62  is used mostly b
aca0: 79 20 74 68 65 20 22 4d 65 6d 6f 72 79 43 68 65  y the "MemoryChe
acb0: 63 6b 22 20 6d 61 63 72 6f 20 69 6e 20 73 74 72  ck" macro in str
acc0: 75 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64 20 6d 65  uct.h.*/.void me
acd0: 6d 6f 72 79 5f 65 72 72 6f 72 28 29 7b 0a 20 20  mory_error(){.  
ace0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
acf0: 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 20  Out of memory.  
ad00: 41 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e 22 29 3b  Aborting...\n");
ad10: 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 73  .  exit(1);.}..s
ad20: 74 61 74 69 63 20 69 6e 74 20 6e 44 65 66 69 6e  tatic int nDefin
ad30: 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  e = 0;      /* N
ad40: 75 6d 62 65 72 20 6f 66 20 2d 44 20 6f 70 74 69  umber of -D opti
ad50: 6f 6e 73 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  ons on the comma
ad60: 6e 64 20 6c 69 6e 65 20 2a 2f 0a 73 74 61 74 69  nd line */.stati
ad70: 63 20 63 68 61 72 20 2a 2a 61 7a 44 65 66 69 6e  c char **azDefin
ad80: 65 20 3d 20 30 3b 20 20 2f 2a 20 4e 61 6d 65 20  e = 0;  /* Name 
ad90: 6f 66 20 74 68 65 20 2d 44 20 6d 61 63 72 6f 73  of the -D macros
ada0: 20 2a 2f 0a 0a 2f 2a 20 54 68 69 73 20 72 6f 75   */../* This rou
adb0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
adc0: 69 74 68 20 74 68 65 20 61 72 67 75 6d 65 6e 74  ith the argument
add0: 20 74 6f 20 65 61 63 68 20 2d 44 20 63 6f 6d 6d   to each -D comm
ade0: 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e  and-line option.
adf0: 0a 2a 2a 20 41 64 64 20 74 68 65 20 6d 61 63 72  .** Add the macr
ae00: 6f 20 64 65 66 69 6e 65 64 20 74 6f 20 74 68 65  o defined to the
ae10: 20 61 7a 44 65 66 69 6e 65 20 61 72 72 61 79 2e   azDefine array.
ae20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ae30: 68 61 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e 28  handle_D_option(
ae40: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61 72  char *z){.  char
ae50: 20 2a 2a 70 61 7a 3b 0a 20 20 6e 44 65 66 69 6e   **paz;.  nDefin
ae60: 65 2b 2b 3b 0a 20 20 61 7a 44 65 66 69 6e 65 20  e++;.  azDefine 
ae70: 3d 20 28 63 68 61 72 20 2a 2a 29 20 72 65 61 6c  = (char **) real
ae80: 6c 6f 63 28 61 7a 44 65 66 69 6e 65 2c 20 73 69  loc(azDefine, si
ae90: 7a 65 6f 66 28 61 7a 44 65 66 69 6e 65 5b 30 5d  zeof(azDefine[0]
aea0: 29 2a 6e 44 65 66 69 6e 65 29 3b 0a 20 20 69 66  )*nDefine);.  if
aeb0: 28 20 61 7a 44 65 66 69 6e 65 3d 3d 30 20 29 7b  ( azDefine==0 ){
aec0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
aed0: 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  err,"out of memo
aee0: 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  ry\n");.    exit
aef0: 28 31 29 3b 0a 20 20 7d 0a 20 20 70 61 7a 20 3d  (1);.  }.  paz =
af00: 20 26 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69   &azDefine[nDefi
af10: 6e 65 2d 31 5d 3b 0a 20 20 2a 70 61 7a 20 3d 20  ne-1];.  *paz = 
af20: 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28  (char *) malloc(
af30: 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29 2b   lemonStrlen(z)+
af40: 31 20 29 3b 0a 20 20 69 66 28 20 2a 70 61 7a 3d  1 );.  if( *paz=
af50: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
af60: 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20 6f 66  f(stderr,"out of
af70: 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
af80: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
af90: 73 74 72 63 70 79 28 2a 70 61 7a 2c 20 7a 29 3b  strcpy(*paz, z);
afa0: 0a 20 20 66 6f 72 28 7a 3d 2a 70 61 7a 3b 20 2a  .  for(z=*paz; *
afb0: 7a 20 26 26 20 2a 7a 21 3d 27 3d 27 3b 20 7a 2b  z && *z!='='; z+
afc0: 2b 29 7b 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d  +){}.  *z = 0;.}
afd0: 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75  ..static char *u
afe0: 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65  ser_templatename
aff0: 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20   = NULL;.static 
b000: 76 6f 69 64 20 68 61 6e 64 6c 65 5f 54 5f 6f 70  void handle_T_op
b010: 74 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20  tion(char *z){. 
b020: 20 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61   user_templatena
b030: 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61  me = (char *) ma
b040: 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65  lloc( lemonStrle
b050: 6e 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28 20  n(z)+1 );.  if( 
b060: 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
b070: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 6f  e==0 ){.    memo
b080: 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a  ry_error();.  }.
b090: 20 20 73 74 72 63 70 79 28 75 73 65 72 5f 74 65    strcpy(user_te
b0a0: 6d 70 6c 61 74 65 6e 61 6d 65 2c 20 7a 29 3b 0a  mplatename, z);.
b0b0: 7d 0a 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70  }../* The main p
b0c0: 72 6f 67 72 61 6d 2e 20 20 50 61 72 73 65 20 74  rogram.  Parse t
b0d0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
b0e0: 61 6e 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a  and do it... */.
b0f0: 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67  int main(int arg
b100: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 0a  c, char **argv).
b110: 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 76  {.  static int v
b120: 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73 74  ersion = 0;.  st
b130: 61 74 69 63 20 69 6e 74 20 72 70 66 6c 61 67 20  atic int rpflag 
b140: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
b150: 74 20 62 61 73 69 73 66 6c 61 67 20 3d 20 30 3b  t basisflag = 0;
b160: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f  .  static int co
b170: 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20 20 73 74  mpress = 0;.  st
b180: 61 74 69 63 20 69 6e 74 20 71 75 69 65 74 20 3d  atic int quiet =
b190: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
b1a0: 20 73 74 61 74 69 73 74 69 63 73 20 3d 20 30 3b   statistics = 0;
b1b0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6d 68  .  static int mh
b1c0: 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74  flag = 0;.  stat
b1d0: 69 63 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73  ic int nolinenos
b1e0: 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74  flag = 0;.  stat
b1f0: 69 63 20 69 6e 74 20 6e 6f 52 65 73 6f 72 74 20  ic int noResort 
b200: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74  = 0;.  static st
b210: 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f  ruct s_options o
b220: 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20  ptions[] = {.   
b230: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c   {OPT_FLAG, "b",
b240: 20 28 63 68 61 72 2a 29 26 62 61 73 69 73 66 6c   (char*)&basisfl
b250: 61 67 2c 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20  ag, "Print only 
b260: 74 68 65 20 62 61 73 69 73 20 69 6e 20 72 65 70  the basis in rep
b270: 6f 72 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ort."},.    {OPT
b280: 5f 46 4c 41 47 2c 20 22 63 22 2c 20 28 63 68 61  _FLAG, "c", (cha
b290: 72 2a 29 26 63 6f 6d 70 72 65 73 73 2c 20 22 44  r*)&compress, "D
b2a0: 6f 6e 27 74 20 63 6f 6d 70 72 65 73 73 20 74 68  on't compress th
b2b0: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22  e action table."
b2c0: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52  },.    {OPT_FSTR
b2d0: 2c 20 22 44 22 2c 20 28 63 68 61 72 2a 29 68 61  , "D", (char*)ha
b2e0: 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22  ndle_D_option, "
b2f0: 44 65 66 69 6e 65 20 61 6e 20 25 69 66 64 65 66  Define an %ifdef
b300: 20 6d 61 63 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b   macro."},.    {
b310: 4f 50 54 5f 46 53 54 52 2c 20 22 54 22 2c 20 28  OPT_FSTR, "T", (
b320: 63 68 61 72 2a 29 68 61 6e 64 6c 65 5f 54 5f 6f  char*)handle_T_o
b330: 70 74 69 6f 6e 2c 20 22 53 70 65 63 69 66 79 20  ption, "Specify 
b340: 61 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 2e  a template file.
b350: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
b360: 47 2c 20 22 67 22 2c 20 28 63 68 61 72 2a 29 26  G, "g", (char*)&
b370: 72 70 66 6c 61 67 2c 20 22 50 72 69 6e 74 20 67  rpflag, "Print g
b380: 72 61 6d 6d 61 72 20 77 69 74 68 6f 75 74 20 61  rammar without a
b390: 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b  ctions."},.    {
b3a0: 4f 50 54 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28  OPT_FLAG, "m", (
b3b0: 63 68 61 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22  char*)&mhflag, "
b3c0: 4f 75 74 70 75 74 20 61 20 6d 61 6b 65 68 65 61  Output a makehea
b3d0: 64 65 72 73 20 63 6f 6d 70 61 74 69 62 6c 65 20  ders compatible 
b3e0: 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  file."},.    {OP
b3f0: 54 5f 46 4c 41 47 2c 20 22 6c 22 2c 20 28 63 68  T_FLAG, "l", (ch
b400: 61 72 2a 29 26 6e 6f 6c 69 6e 65 6e 6f 73 66 6c  ar*)&nolinenosfl
b410: 61 67 2c 20 22 44 6f 20 6e 6f 74 20 70 72 69 6e  ag, "Do not prin
b420: 74 20 23 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e  t #line statemen
b430: 74 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  ts."},.    {OPT_
b440: 46 4c 41 47 2c 20 22 70 22 2c 20 28 63 68 61 72  FLAG, "p", (char
b450: 2a 29 26 73 68 6f 77 50 72 65 63 65 64 65 6e 63  *)&showPrecedenc
b460: 65 43 6f 6e 66 6c 69 63 74 2c 0a 20 20 20 20 20  eConflict,.     
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
b480: 53 68 6f 77 20 63 6f 6e 66 6c 69 63 74 73 20 72  Show conflicts r
b490: 65 73 6f 6c 76 65 64 20 62 79 20 70 72 65 63 65  esolved by prece
b4a0: 64 65 6e 63 65 20 72 75 6c 65 73 22 7d 2c 0a 20  dence rules"},. 
b4b0: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71     {OPT_FLAG, "q
b4c0: 22 2c 20 28 63 68 61 72 2a 29 26 71 75 69 65 74  ", (char*)&quiet
b4d0: 2c 20 22 28 51 75 69 65 74 29 20 44 6f 6e 27 74  , "(Quiet) Don't
b4e0: 20 70 72 69 6e 74 20 74 68 65 20 72 65 70 6f 72   print the repor
b4f0: 74 20 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b  t file."},.    {
b500: 4f 50 54 5f 46 4c 41 47 2c 20 22 72 22 2c 20 28  OPT_FLAG, "r", (
b510: 63 68 61 72 2a 29 26 6e 6f 52 65 73 6f 72 74 2c  char*)&noResort,
b520: 20 22 44 6f 20 6e 6f 74 20 73 6f 72 74 20 6f 72   "Do not sort or
b530: 20 72 65 6e 75 6d 62 65 72 20 73 74 61 74 65 73   renumber states
b540: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
b550: 47 2c 20 22 73 22 2c 20 28 63 68 61 72 2a 29 26  G, "s", (char*)&
b560: 73 74 61 74 69 73 74 69 63 73 2c 0a 20 20 20 20  statistics,.    
b570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
b590: 50 72 69 6e 74 20 70 61 72 73 65 72 20 73 74 61  Print parser sta
b5a0: 74 73 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f  ts to standard o
b5b0: 75 74 70 75 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f  utput."},.    {O
b5c0: 50 54 5f 46 4c 41 47 2c 20 22 78 22 2c 20 28 63  PT_FLAG, "x", (c
b5d0: 68 61 72 2a 29 26 76 65 72 73 69 6f 6e 2c 20 22  har*)&version, "
b5e0: 50 72 69 6e 74 20 74 68 65 20 76 65 72 73 69 6f  Print the versio
b5f0: 6e 20 6e 75 6d 62 65 72 2e 22 7d 2c 0a 20 20 20  n number."},.   
b600: 20 7b 4f 50 54 5f 46 4c 41 47 2c 30 2c 30 2c 30   {OPT_FLAG,0,0,0
b610: 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  }.  };.  int i;.
b620: 20 20 69 6e 74 20 65 78 69 74 63 6f 64 65 3b 0a    int exitcode;.
b630: 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 6c    struct lemon l
b640: 65 6d 3b 0a 0a 20 20 4f 70 74 49 6e 69 74 28 61  em;..  OptInit(a
b650: 72 67 76 2c 6f 70 74 69 6f 6e 73 2c 73 74 64 65  rgv,options,stde
b660: 72 72 29 3b 0a 20 20 69 66 28 20 76 65 72 73 69  rr);.  if( versi
b670: 6f 6e 20 29 7b 0a 20 20 20 20 20 70 72 69 6e 74  on ){.     print
b680: 66 28 22 4c 65 6d 6f 6e 20 76 65 72 73 69 6f 6e  f("Lemon version
b690: 20 31 2e 30 5c 6e 22 29 3b 0a 20 20 20 20 20 65   1.0\n");.     e
b6a0: 78 69 74 28 30 29 3b 20 0a 20 20 7d 0a 20 20 69  xit(0); .  }.  i
b6b0: 66 28 20 4f 70 74 4e 41 72 67 73 28 29 21 3d 31  f( OptNArgs()!=1
b6c0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
b6d0: 73 74 64 65 72 72 2c 22 45 78 61 63 74 6c 79 20  stderr,"Exactly 
b6e0: 6f 6e 65 20 66 69 6c 65 6e 61 6d 65 20 61 72 67  one filename arg
b6f0: 75 6d 65 6e 74 20 69 73 20 72 65 71 75 69 72 65  ument is require
b700: 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  d.\n");.    exit
b710: 28 31 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  (1);.  }.  memse
b720: 74 28 26 6c 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  t(&lem, 0, sizeo
b730: 66 28 6c 65 6d 29 29 3b 0a 20 20 6c 65 6d 2e 65  f(lem));.  lem.e
b740: 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 0a 20 20  rrorcnt = 0;..  
b750: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
b760: 65 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 53  e machine */.  S
b770: 74 72 73 61 66 65 5f 69 6e 69 74 28 29 3b 0a 20  trsafe_init();. 
b780: 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 3b 0a   Symbol_init();.
b790: 20 20 53 74 61 74 65 5f 69 6e 69 74 28 29 3b 0a    State_init();.
b7a0: 20 20 6c 65 6d 2e 61 72 67 76 30 20 3d 20 61 72    lem.argv0 = ar
b7b0: 67 76 5b 30 5d 3b 0a 20 20 6c 65 6d 2e 66 69 6c  gv[0];.  lem.fil
b7c0: 65 6e 61 6d 65 20 3d 20 4f 70 74 41 72 67 28 30  ename = OptArg(0
b7d0: 29 3b 0a 20 20 6c 65 6d 2e 62 61 73 69 73 66 6c  );.  lem.basisfl
b7e0: 61 67 20 3d 20 62 61 73 69 73 66 6c 61 67 3b 0a  ag = basisflag;.
b7f0: 20 20 6c 65 6d 2e 6e 6f 6c 69 6e 65 6e 6f 73 66    lem.nolinenosf
b800: 6c 61 67 20 3d 20 6e 6f 6c 69 6e 65 6e 6f 73 66  lag = nolinenosf
b810: 6c 61 67 3b 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65  lag;.  Symbol_ne
b820: 77 28 22 24 22 29 3b 0a 20 20 6c 65 6d 2e 65 72  w("$");.  lem.er
b830: 72 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  rsym = Symbol_ne
b840: 77 28 22 65 72 72 6f 72 22 29 3b 0a 20 20 6c 65  w("error");.  le
b850: 6d 2e 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74  m.errsym->useCnt
b860: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 61 72 73   = 0;..  /* Pars
b870: 65 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  e the input file
b880: 20 2a 2f 0a 20 20 50 61 72 73 65 28 26 6c 65 6d   */.  Parse(&lem
b890: 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 65 72 72  );.  if( lem.err
b8a0: 6f 72 63 6e 74 20 29 20 65 78 69 74 28 6c 65 6d  orcnt ) exit(lem
b8b0: 2e 65 72 72 6f 72 63 6e 74 29 3b 0a 20 20 69 66  .errorcnt);.  if
b8c0: 28 20 6c 65 6d 2e 6e 72 75 6c 65 3d 3d 30 20 29  ( lem.nrule==0 )
b8d0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
b8e0: 64 65 72 72 2c 22 45 6d 70 74 79 20 67 72 61 6d  derr,"Empty gram
b8f0: 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78  mar.\n");.    ex
b900: 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  it(1);.  }..  /*
b910: 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e 64 65 78   Count and index
b920: 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 6f 66 20   the symbols of 
b930: 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20  the grammar */. 
b940: 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53   lem.nsymbol = S
b950: 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20  ymbol_count();. 
b960: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65   Symbol_new("{de
b970: 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c 65 6d 2e  fault}");.  lem.
b980: 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d 62 6f 6c  symbols = Symbol
b990: 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20 20 66 6f  _arrayof();.  fo
b9a0: 72 28 69 3d 30 3b 20 69 3c 3d 6c 65 6d 2e 6e 73  r(i=0; i<=lem.ns
b9b0: 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e  ymbol; i++) lem.
b9c0: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65  symbols[i]->inde
b9d0: 78 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74 28 6c  x = i;.  qsort(l
b9e0: 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65 6d 2e 6e  em.symbols,lem.n
b9f0: 73 79 6d 62 6f 6c 2b 31 2c 73 69 7a 65 6f 66 28  symbol+1,sizeof(
ba00: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2c  struct symbol*),
ba10: 20 53 79 6d 62 6f 6c 63 6d 70 70 29 3b 0a 20 20   Symbolcmpp);.  
ba20: 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6c 65 6d 2e  for(i=0; i<=lem.
ba30: 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65  nsymbol; i++) le
ba40: 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e  m.symbols[i]->in
ba50: 64 65 78 20 3d 20 69 3b 0a 20 20 66 6f 72 28 69  dex = i;.  for(i
ba60: 3d 31 3b 20 69 73 75 70 70 65 72 28 6c 65 6d 2e  =1; isupper(lem.
ba70: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65  symbols[i]->name
ba80: 5b 30 5d 29 3b 20 69 2b 2b 29 3b 0a 20 20 6c 65  [0]); i++);.  le
ba90: 6d 2e 6e 74 65 72 6d 69 6e 61 6c 20 3d 20 69 3b  m.nterminal = i;
baa0: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
bab0: 61 20 72 65 70 72 69 6e 74 20 6f 66 20 74 68 65  a reprint of the
bac0: 20 67 72 61 6d 6d 61 72 2c 20 69 66 20 72 65 71   grammar, if req
bad0: 75 65 73 74 65 64 20 6f 6e 20 74 68 65 20 63 6f  uested on the co
bae0: 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a 20 20  mmand line */.  
baf0: 69 66 28 20 72 70 66 6c 61 67 20 29 7b 0a 20 20  if( rpflag ){.  
bb00: 20 20 52 65 70 72 69 6e 74 28 26 6c 65 6d 29 3b    Reprint(&lem);
bb10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
bb20: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
bb30: 73 69 7a 65 20 66 6f 72 20 61 6c 6c 20 66 6f 6c  size for all fol
bb40: 6c 6f 77 20 61 6e 64 20 66 69 72 73 74 20 73 65  low and first se
bb50: 74 73 20 2a 2f 0a 20 20 20 20 53 65 74 53 69 7a  ts */.    SetSiz
bb60: 65 28 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2b  e(lem.nterminal+
bb70: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64  1);..    /* Find
bb80: 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65 20   the precedence 
bb90: 66 6f 72 20 65 76 65 72 79 20 70 72 6f 64 75 63  for every produc
bba0: 74 69 6f 6e 20 72 75 6c 65 20 28 74 68 61 74 20  tion rule (that 
bbb0: 68 61 73 20 6f 6e 65 29 20 2a 2f 0a 20 20 20 20  has one) */.    
bbc0: 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e  FindRulePreceden
bbd0: 63 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ces(&lem);..    
bbe0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c  /* Compute the l
bbf0: 61 6d 62 64 61 2d 6e 6f 6e 74 65 72 6d 69 6e 61  ambda-nontermina
bc00: 6c 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  ls and the first
bc10: 2d 73 65 74 73 20 66 6f 72 20 65 76 65 72 79 0a  -sets for every.
bc20: 20 20 20 20 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e      ** nontermin
bc30: 61 6c 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 69  al */.    FindFi
bc40: 72 73 74 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a  rstSets(&lem);..
bc50: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61      /* Compute a
bc60: 6c 6c 20 4c 52 28 30 29 20 73 74 61 74 65 73 2e  ll LR(0) states.
bc70: 20 20 41 6c 73 6f 20 72 65 63 6f 72 64 20 66 6f    Also record fo
bc80: 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61  llow-set propaga
bc90: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b  tion.    ** link
bca0: 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 6f  s so that the fo
bcb0: 6c 6c 6f 77 2d 73 65 74 20 63 61 6e 20 62 65 20  llow-set can be 
bcc0: 63 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 20 2a  computed later *
bcd0: 2f 0a 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74 65  /.    lem.nstate
bce0: 20 3d 20 30 3b 0a 20 20 20 20 46 69 6e 64 53 74   = 0;.    FindSt
bcf0: 61 74 65 73 28 26 6c 65 6d 29 3b 0a 20 20 20 20  ates(&lem);.    
bd00: 6c 65 6d 2e 73 6f 72 74 65 64 20 3d 20 53 74 61  lem.sorted = Sta
bd10: 74 65 5f 61 72 72 61 79 6f 66 28 29 3b 0a 0a 20  te_arrayof();.. 
bd20: 20 20 20 2f 2a 20 54 69 65 20 75 70 20 6c 6f 6f     /* Tie up loo
bd30: 73 65 20 65 6e 64 73 20 6f 6e 20 74 68 65 20 70  se ends on the p
bd40: 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
bd50: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 4c 69 6e 6b   */.    FindLink
bd60: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
bd70: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66 6f 6c   Compute the fol
bd80: 6c 6f 77 20 73 65 74 20 6f 66 20 65 76 65 72 79  low set of every
bd90: 20 72 65 64 75 63 69 62 6c 65 20 63 6f 6e 66 69   reducible confi
bda0: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  guration */.    
bdb0: 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 26  FindFollowSets(&
bdc0: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  lem);..    /* Co
bdd0: 6d 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e  mpute the action
bde0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 46   tables */.    F
bdf0: 69 6e 64 41 63 74 69 6f 6e 73 28 26 6c 65 6d 29  indActions(&lem)
be00: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65  ;..    /* Compre
be10: 73 73 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  ss the action ta
be20: 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  bles */.    if( 
be30: 63 6f 6d 70 72 65 73 73 3d 3d 30 20 29 20 43 6f  compress==0 ) Co
be40: 6d 70 72 65 73 73 54 61 62 6c 65 73 28 26 6c 65  mpressTables(&le
be50: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6f 72  m);..    /* Reor
be60: 64 65 72 20 61 6e 64 20 72 65 6e 75 6d 62 65 72  der and renumber
be70: 20 74 68 65 20 73 74 61 74 65 73 20 73 6f 20 74   the states so t
be80: 68 61 74 20 73 74 61 74 65 73 20 77 69 74 68 20  hat states with 
be90: 66 65 77 65 72 20 63 68 6f 69 63 65 73 0a 20 20  fewer choices.  
bea0: 20 20 2a 2a 20 6f 63 63 75 72 20 61 74 20 74 68    ** occur at th
beb0: 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20  e end.  This is 
bec0: 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
bed0: 74 68 61 74 20 68 65 6c 70 73 20 6d 61 6b 65 20  that helps make 
bee0: 74 68 65 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72  the.    ** gener
bef0: 61 74 65 64 20 70 61 72 73 65 72 20 74 61 62 6c  ated parser tabl
bf00: 65 73 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 20  es smaller. */. 
bf10: 20 20 20 69 66 28 20 6e 6f 52 65 73 6f 72 74 3d     if( noResort=
bf20: 3d 30 20 29 20 52 65 73 6f 72 74 53 74 61 74 65  =0 ) ResortState
bf30: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
bf40: 20 47 65 6e 65 72 61 74 65 20 61 20 72 65 70 6f   Generate a repo
bf50: 72 74 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  rt of the parser
bf60: 20 67 65 6e 65 72 61 74 65 64 2e 20 20 28 74 68   generated.  (th
bf70: 65 20 22 79 2e 6f 75 74 70 75 74 22 20 66 69 6c  e "y.output" fil
bf80: 65 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 71  e) */.    if( !q
bf90: 75 69 65 74 20 29 20 52 65 70 6f 72 74 4f 75 74  uiet ) ReportOut
bfa0: 70 75 74 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  put(&lem);..    
bfb0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
bfc0: 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20  source code for 
bfd0: 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 20 20  the parser */.  
bfe0: 20 20 52 65 70 6f 72 74 54 61 62 6c 65 28 26 6c    ReportTable(&l
bff0: 65 6d 2c 20 6d 68 66 6c 61 67 29 3b 0a 0a 20 20  em, mhflag);..  
c000: 20 20 2f 2a 20 50 72 6f 64 75 63 65 20 61 20 68    /* Produce a h
c010: 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20 75  eader file for u
c020: 73 65 20 62 79 20 74 68 65 20 73 63 61 6e 6e 65  se by the scanne
c030: 72 2e 20 20 28 54 68 69 73 20 73 74 65 70 20 69  r.  (This step i
c040: 73 0a 20 20 20 20 2a 2a 20 6f 6d 69 74 74 65 64  s.    ** omitted
c050: 20 69 66 20 74 68 65 20 22 2d 6d 22 20 6f 70 74   if the "-m" opt
c060: 69 6f 6e 20 69 73 20 75 73 65 64 20 62 65 63 61  ion is used beca
c070: 75 73 65 20 6d 61 6b 65 68 65 61 64 65 72 73 20  use makeheaders 
c080: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65  will.    ** gene
c090: 72 61 74 65 20 74 68 65 20 66 69 6c 65 20 66 6f  rate the file fo
c0a0: 72 20 75 73 2e 29 20 2a 2f 0a 20 20 20 20 69 66  r us.) */.    if
c0b0: 28 20 21 6d 68 66 6c 61 67 20 29 20 52 65 70 6f  ( !mhflag ) Repo
c0c0: 72 74 48 65 61 64 65 72 28 26 6c 65 6d 29 3b 0a  rtHeader(&lem);.
c0d0: 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 69 73    }.  if( statis
c0e0: 74 69 63 73 20 29 7b 0a 20 20 20 20 70 72 69 6e  tics ){.    prin
c0f0: 74 66 28 22 50 61 72 73 65 72 20 73 74 61 74 69  tf("Parser stati
c100: 73 74 69 63 73 3a 20 25 64 20 74 65 72 6d 69 6e  stics: %d termin
c110: 61 6c 73 2c 20 25 64 20 6e 6f 6e 74 65 72 6d 69  als, %d nontermi
c120: 6e 61 6c 73 2c 20 25 64 20 72 75 6c 65 73 5c 6e  nals, %d rules\n
c130: 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 74 65  ",.      lem.nte
c140: 72 6d 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 73 79 6d  rminal, lem.nsym
c150: 62 6f 6c 20 2d 20 6c 65 6d 2e 6e 74 65 72 6d 69  bol - lem.ntermi
c160: 6e 61 6c 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b  nal, lem.nrule);
c170: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 20 20  .    printf("   
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c190: 25 64 20 73 74 61 74 65 73 2c 20 25 64 20 70 61  %d states, %d pa
c1a0: 72 73 65 72 20 74 61 62 6c 65 20 65 6e 74 72 69  rser table entri
c1b0: 65 73 2c 20 25 64 20 63 6f 6e 66 6c 69 63 74 73  es, %d conflicts
c1c0: 5c 6e 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e  \n",.      lem.n
c1d0: 73 74 61 74 65 2c 20 6c 65 6d 2e 74 61 62 6c 65  state, lem.table
c1e0: 73 69 7a 65 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c  size, lem.nconfl
c1f0: 69 63 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ict);.  }.  if( 
c200: 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 3e 20  lem.nconflict > 
c210: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
c220: 28 73 74 64 65 72 72 2c 22 25 64 20 70 61 72 73  (stderr,"%d pars
c230: 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e  ing conflicts.\n
c240: 22 2c 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29  ",lem.nconflict)
c250: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 72 65 74 75  ;.  }..  /* retu
c260: 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c  rn 0 on success,
c270: 20 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 2a   1 on failure. *
c280: 2f 0a 20 20 65 78 69 74 63 6f 64 65 20 3d 20 28  /.  exitcode = (
c290: 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3e 20  (lem.errorcnt > 
c2a0: 30 29 20 7c 7c 20 28 6c 65 6d 2e 6e 63 6f 6e 66  0) || (lem.nconf
c2b0: 6c 69 63 74 20 3e 20 30 29 29 20 3f 20 31 20 3a  lict > 0)) ? 1 :
c2c0: 20 30 3b 0a 20 20 65 78 69 74 28 65 78 69 74 63   0;.  exit(exitc
c2d0: 6f 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  ode);.  return (
c2e0: 65 78 69 74 63 6f 64 65 29 3b 0a 7d 0a 2f 2a 2a  exitcode);.}./**
c2f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c300: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
c310: 20 22 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a   "msort.c" *****
c320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
c340: 2a 20 41 20 67 65 6e 65 72 69 63 20 6d 65 72 67  * A generic merg
c350: 65 2d 73 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a  e-sort program..
c360: 2a 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20  **.** USAGE:.** 
c370: 4c 65 74 20 22 70 74 72 22 20 62 65 20 61 20 70  Let "ptr" be a p
c380: 6f 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20 73  ointer to some s
c390: 74 72 75 63 74 75 72 65 20 77 68 69 63 68 20 69  tructure which i
c3a0: 73 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66  s at the head of
c3b0: 0a 2a 2a 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69  .** a null-termi
c3c0: 6e 61 74 65 64 20 6c 69 73 74 2e 20 20 54 68 65  nated list.  The
c3d0: 6e 20 74 6f 20 73 6f 72 74 20 74 68 65 20 6c 69  n to sort the li
c3e0: 73 74 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  st call:.**.**  
c3f0: 20 20 20 70 74 72 20 3d 20 6d 73 6f 72 74 28 70     ptr = msort(p
c400: 74 72 2c 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c  tr,&(ptr->next),
c410: 63 6d 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49  cmpfnc);.**.** I
c420: 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 22 63 6d  n the above, "cm
c430: 70 66 6e 63 22 20 69 73 20 61 20 70 6f 69 6e 74  pfnc" is a point
c440: 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
c450: 20 77 68 69 63 68 20 63 6f 6d 70 61 72 65 73 0a   which compares.
c460: 2a 2a 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73  ** two instances
c470: 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
c480: 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 6e  e and returns an
c490: 20 69 6e 74 65 67 65 72 2c 20 61 73 20 69 6e 0a   integer, as in.
c4a0: 2a 2a 20 73 74 72 63 6d 70 2e 20 20 54 68 65 20  ** strcmp.  The 
c4b0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
c4c0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
c4d0: 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  the pointer to t
c4e0: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65  he.** second ele
c4f0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b  ment of the link
c500: 65 64 20 6c 69 73 74 2e 20 20 54 68 69 73 20 61  ed list.  This a
c510: 64 64 72 65 73 73 20 69 73 20 75 73 65 64 20 74  ddress is used t
c520: 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65  o compute.** the
c530: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 22   offset to the "
c540: 6e 65 78 74 22 20 66 69 65 6c 64 20 77 69 74 68  next" field with
c550: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
c560: 2e 20 20 54 68 65 20 6f 66 66 73 65 74 20 74 6f  .  The offset to
c570: 0a 2a 2a 20 74 68 65 20 22 6e 65 78 74 22 20 66  .** the "next" f
c580: 69 65 6c 64 20 6d 75 73 74 20 62 65 20 63 6f 6e  ield must be con
c590: 73 74 61 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74  stant for all st
c5a0: 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
c5b0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
c5c0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
c5d0: 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 77   a new pointer w
c5e0: 68 69 63 68 20 69 73 20 74 68 65 20 68 65 61 64  hich is the head
c5f0: 20 6f 66 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20   of the list.** 
c600: 61 66 74 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a  after sorting..*
c610: 2a 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a  *.** ALGORITHM:.
c620: 2a 2a 20 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a  ** Merge-sort..*
c630: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
c640: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
c650: 20 6e 65 78 74 20 73 74 72 75 63 74 75 72 65 20   next structure 
c660: 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
c670: 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  st..*/.#define N
c680: 45 58 54 28 41 29 20 28 2a 28 63 68 61 72 2a 2a  EXT(A) (*(char**
c690: 29 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  )(((unsigned lon
c6a0: 67 29 41 29 2b 6f 66 66 73 65 74 29 29 0a 0a 2f  g)A)+offset))../
c6b0: 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20  *.** Inputs:.** 
c6c0: 20 20 61 3a 20 20 20 20 20 20 20 41 20 73 6f 72    a:       A sor
c6d0: 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e  ted, null-termin
c6e0: 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74  ated linked list
c6f0: 2e 20 20 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29  .  (May be null)
c700: 2e 0a 2a 2a 20 20 20 62 3a 20 20 20 20 20 20 20  ..**   b:       
c710: 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74  A sorted, null-t
c720: 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64  erminated linked
c730: 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62 65 20   list.  (May be 
c740: 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 63 6d 70 3a  null)..**   cmp:
c750: 20 20 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74       A pointer t
c760: 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
c770: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20   function..**   
c780: 6f 66 66 73 65 74 3a 20 20 4f 66 66 73 65 74 20  offset:  Offset 
c790: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
c7a0: 20 74 6f 20 74 68 65 20 22 6e 65 78 74 22 20 66   to the "next" f
c7b0: 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ield..**.** Retu
c7c0: 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41  rn Value:.**   A
c7d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
c7e0: 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64  head of a sorted
c7f0: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
c800: 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a   the elements.**
c810: 20 20 20 6f 66 20 62 6f 74 68 20 61 20 61 6e 64     of both a and
c820: 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65   b..**.** Side e
c830: 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65  ffects:.**   The
c840: 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 73   "next" pointers
c850: 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e   for elements in
c860: 20 74 68 65 20 6c 69 73 74 73 20 61 20 61 6e 64   the lists a and
c870: 20 62 20 61 72 65 0a 2a 2a 20 20 20 63 68 61 6e   b are.**   chan
c880: 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ged..*/.static c
c890: 68 61 72 20 2a 6d 65 72 67 65 28 0a 20 20 63 68  har *merge(.  ch
c8a0: 61 72 20 2a 61 2c 0a 20 20 63 68 61 72 20 2a 62  ar *a,.  char *b
c8b0: 2c 0a 20 20 69 6e 74 20 28 2a 63 6d 70 29 28 63  ,.  int (*cmp)(c
c8c0: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
c8d0: 20 63 68 61 72 2a 29 2c 0a 20 20 69 6e 74 20 6f   char*),.  int o
c8e0: 66 66 73 65 74 0a 29 7b 0a 20 20 63 68 61 72 20  ffset.){.  char 
c8f0: 2a 70 74 72 2c 20 2a 68 65 61 64 3b 0a 0a 20 20  *ptr, *head;..  
c900: 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20  if( a==0 ){.    
c910: 68 65 61 64 20 3d 20 62 3b 0a 20 20 7d 65 6c 73  head = b;.  }els
c920: 65 20 69 66 28 20 62 3d 3d 30 20 29 7b 0a 20 20  e if( b==0 ){.  
c930: 20 20 68 65 61 64 20 3d 20 61 3b 0a 20 20 7d 65    head = a;.  }e
c940: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 28 2a 63  lse{.    if( (*c
c950: 6d 70 29 28 61 2c 62 29 3c 3d 30 20 29 7b 0a 20  mp)(a,b)<=0 ){. 
c960: 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a 20 20       ptr = a;.  
c970: 20 20 20 20 61 20 3d 20 4e 45 58 54 28 61 29 3b      a = NEXT(a);
c980: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c990: 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20 20 20    ptr = b;.     
c9a0: 20 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20 20   b = NEXT(b);.  
c9b0: 20 20 7d 0a 20 20 20 20 68 65 61 64 20 3d 20 70    }.    head = p
c9c0: 74 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 61  tr;.    while( a
c9d0: 20 26 26 20 62 20 29 7b 0a 20 20 20 20 20 20 69   && b ){.      i
c9e0: 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c 3d  f( (*cmp)(a,b)<=
c9f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 45 58  0 ){.        NEX
ca00: 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20  T(ptr) = a;.    
ca10: 20 20 20 20 70 74 72 20 3d 20 61 3b 0a 20 20 20      ptr = a;.   
ca20: 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28 61 29       a = NEXT(a)
ca30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ca40: 20 20 20 20 20 20 20 4e 45 58 54 28 70 74 72 29         NEXT(ptr)
ca50: 20 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 70 74   = b;.        pt
ca60: 72 20 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 62  r = b;.        b
ca70: 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20 20 20 20   = NEXT(b);.    
ca80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
ca90: 28 20 61 20 29 20 4e 45 58 54 28 70 74 72 29 20  ( a ) NEXT(ptr) 
caa0: 3d 20 61 3b 0a 20 20 20 20 65 6c 73 65 20 20 20  = a;.    else   
cab0: 20 4e 45 58 54 28 70 74 72 29 20 3d 20 62 3b 0a   NEXT(ptr) = b;.
cac0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 65 61    }.  return hea
cad0: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75  d;.}../*.** Inpu
cae0: 74 73 3a 0a 2a 2a 20 20 20 6c 69 73 74 3a 20 20  ts:.**   list:  
caf0: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 61      Pointer to a
cb00: 20 73 69 6e 67 6c 79 2d 6c 69 6e 6b 65 64 20 6c   singly-linked l
cb10: 69 73 74 20 6f 66 20 73 74 72 75 63 74 75 72 65  ist of structure
cb20: 73 2e 0a 2a 2a 20 20 20 6e 65 78 74 3a 20 20 20  s..**   next:   
cb30: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f     Pointer to po
cb40: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 65 63  inter to the sec
cb50: 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ond element of t
cb60: 68 65 20 6c 69 73 74 2e 0a 2a 2a 20 20 20 63 6d  he list..**   cm
cb70: 70 3a 20 20 20 20 20 20 20 41 20 63 6f 6d 70 61  p:       A compa
cb80: 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a  rison function..
cb90: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c  **.** Return Val
cba0: 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74  ue:.**   A point
cbb0: 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
cbc0: 66 20 61 20 73 6f 72 74 65 64 20 6c 69 73 74 20  f a sorted list 
cbd0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
cbe0: 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 72 67  lements.**   org
cbf0: 69 6e 61 6c 6c 79 20 69 6e 20 6c 69 73 74 2e 0a  inally in list..
cc00: 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66 66 65 63  **.** Side effec
cc10: 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20 22 6e 65  ts:.**   The "ne
cc20: 78 74 22 20 70 6f 69 6e 74 65 72 73 20 66 6f 72  xt" pointers for
cc30: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 6c 69 73   elements in lis
cc40: 74 20 61 72 65 20 63 68 61 6e 67 65 64 2e 0a 2a  t are changed..*
cc50: 2f 0a 23 64 65 66 69 6e 65 20 4c 49 53 54 53 49  /.#define LISTSI
cc60: 5a 45 20 33 30 0a 73 74 61 74 69 63 20 63 68 61  ZE 30.static cha
cc70: 72 20 2a 6d 73 6f 72 74 28 0a 20 20 63 68 61 72  r *msort(.  char
cc80: 20 2a 6c 69 73 74 2c 0a 20 20 63 68 61 72 20 2a   *list,.  char *
cc90: 2a 6e 65 78 74 2c 0a 20 20 69 6e 74 20 28 2a 63  *next,.  int (*c
cca0: 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  mp)(const char*,
ccb0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a  const char*).){.
ccc0: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
ccd0: 6f 66 66 73 65 74 3b 0a 20 20 63 68 61 72 20 2a  offset;.  char *
cce0: 65 70 3b 0a 20 20 63 68 61 72 20 2a 73 65 74 5b  ep;.  char *set[
ccf0: 4c 49 53 54 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  LISTSIZE];.  int
cd00: 20 69 3b 0a 20 20 6f 66 66 73 65 74 20 3d 20 28   i;.  offset = (
cd10: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 6e 65  unsigned long)ne
cd20: 78 74 20 2d 20 28 75 6e 73 69 67 6e 65 64 20 6c  xt - (unsigned l
cd30: 6f 6e 67 29 6c 69 73 74 3b 0a 20 20 66 6f 72 28  ong)list;.  for(
cd40: 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b  i=0; i<LISTSIZE;
cd50: 20 69 2b 2b 29 20 73 65 74 5b 69 5d 20 3d 20 30   i++) set[i] = 0
cd60: 3b 0a 20 20 77 68 69 6c 65 28 20 6c 69 73 74 20  ;.  while( list 
cd70: 29 7b 0a 20 20 20 20 65 70 20 3d 20 6c 69 73 74  ){.    ep = list
cd80: 3b 0a 20 20 20 20 6c 69 73 74 20 3d 20 4e 45 58  ;.    list = NEX
cd90: 54 28 6c 69 73 74 29 3b 0a 20 20 20 20 4e 45 58  T(list);.    NEX
cda0: 54 28 65 70 29 20 3d 20 30 3b 0a 20 20 20 20 66  T(ep) = 0;.    f
cdb0: 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49  or(i=0; i<LISTSI
cdc0: 5a 45 2d 31 20 26 26 20 73 65 74 5b 69 5d 21 3d  ZE-1 && set[i]!=
cdd0: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 65  0; i++){.      e
cde0: 70 20 3d 20 6d 65 72 67 65 28 65 70 2c 73 65 74  p = merge(ep,set
cdf0: 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74 29 3b  [i],cmp,offset);
ce00: 0a 20 20 20 20 20 20 73 65 74 5b 69 5d 20 3d 20  .      set[i] = 
ce10: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  0;.    }.    set
ce20: 5b 69 5d 20 3d 20 65 70 3b 0a 20 20 7d 0a 20 20  [i] = ep;.  }.  
ce30: 65 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ep = 0;.  for(i=
ce40: 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b 20 69  0; i<LISTSIZE; i
ce50: 2b 2b 29 20 69 66 28 20 73 65 74 5b 69 5d 20 29  ++) if( set[i] )
ce60: 20 65 70 20 3d 20 6d 65 72 67 65 28 73 65 74 5b   ep = merge(set[
ce70: 69 5d 2c 65 70 2c 63 6d 70 2c 6f 66 66 73 65 74  i],ep,cmp,offset
ce80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 70 3b 0a  );.  return ep;.
ce90: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
cea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
ceb0: 20 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69 6f   the file "optio
cec0: 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n.c" ***********
ced0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
cee0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 61  .static char **a
cef0: 72 67 76 3b 0a 73 74 61 74 69 63 20 73 74 72 75  rgv;.static stru
cf00: 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70  ct s_options *op
cf10: 3b 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 65  ;.static FILE *e
cf20: 72 72 73 74 72 65 61 6d 3b 0a 0a 23 64 65 66 69  rrstream;..#defi
cf30: 6e 65 20 49 53 4f 50 54 28 58 29 20 28 28 58 29  ne ISOPT(X) ((X)
cf40: 5b 30 5d 3d 3d 27 2d 27 7c 7c 28 58 29 5b 30 5d  [0]=='-'||(X)[0]
cf50: 3d 3d 27 2b 27 7c 7c 73 74 72 63 68 72 28 28 58  =='+'||strchr((X
cf60: 29 2c 27 3d 27 29 21 3d 30 29 0a 0a 2f 2a 0a 2a  ),'=')!=0)../*.*
cf70: 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6d 6d  * Print the comm
cf80: 61 6e 64 20 6c 69 6e 65 20 77 69 74 68 20 61 20  and line with a 
cf90: 63 61 72 72 6f 74 20 70 6f 69 6e 74 69 6e 67 20  carrot pointing 
cfa0: 74 6f 20 74 68 65 20 6b 2d 74 68 20 63 68 61 72  to the k-th char
cfb0: 61 63 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  acter.** of the 
cfc0: 6e 2d 74 68 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73  n-th field..*/.s
cfd0: 74 61 74 69 63 20 76 6f 69 64 20 65 72 72 6c 69  tatic void errli
cfe0: 6e 65 28 69 6e 74 20 6e 2c 20 69 6e 74 20 6b 2c  ne(int n, int k,
cff0: 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20 20   FILE *err).{.  
d000: 69 6e 74 20 73 70 63 6e 74 2c 20 69 3b 0a 20 20  int spcnt, i;.  
d010: 69 66 28 20 61 72 67 76 5b 30 5d 20 29 20 66 70  if( argv[0] ) fp
d020: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 22 2c 61  rintf(err,"%s",a
d030: 72 67 76 5b 30 5d 29 3b 0a 20 20 73 70 63 6e 74  rgv[0]);.  spcnt
d040: 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61   = lemonStrlen(a
d050: 72 67 76 5b 30 5d 29 20 2b 20 31 3b 0a 20 20 66  rgv[0]) + 1;.  f
d060: 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20 61  or(i=1; i<n && a
d070: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgv[i]; i++){.  
d080: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 20    fprintf(err," 
d090: 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20  %s",argv[i]);.  
d0a0: 20 20 73 70 63 6e 74 20 2b 3d 20 6c 65 6d 6f 6e    spcnt += lemon
d0b0: 53 74 72 6c 65 6e 28 61 72 67 76 5b 69 5d 29 2b  Strlen(argv[i])+
d0c0: 31 3b 0a 20 20 7d 0a 20 20 73 70 63 6e 74 20 2b  1;.  }.  spcnt +
d0d0: 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b 20 61 72 67  = k;.  for(; arg
d0e0: 76 5b 69 5d 3b 20 69 2b 2b 29 20 66 70 72 69 6e  v[i]; i++) fprin
d0f0: 74 66 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67  tf(err," %s",arg
d100: 76 5b 69 5d 29 3b 0a 20 20 69 66 28 20 73 70 63  v[i]);.  if( spc
d110: 6e 74 3c 32 30 20 29 7b 0a 20 20 20 20 66 70 72  nt<20 ){.    fpr
d120: 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73 5e  intf(err,"\n%*s^
d130: 2d 2d 20 68 65 72 65 5c 6e 22 2c 73 70 63 6e 74  -- here\n",spcnt
d140: 2c 22 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ,"");.  }else{. 
d150: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
d160: 5c 6e 25 2a 73 68 65 72 65 20 2d 2d 5e 5c 6e 22  \n%*shere --^\n"
d170: 2c 73 70 63 6e 74 2d 37 2c 22 22 29 3b 0a 20 20  ,spcnt-7,"");.  
d180: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
d190: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  n the index of t
d1a0: 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d 73 77 69 74  he N-th non-swit
d1b0: 63 68 20 61 72 67 75 6d 65 6e 74 2e 20 20 52 65  ch argument.  Re
d1c0: 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 4e 20  turn -1.** if N 
d1d0: 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
d1e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
d1f0: 72 67 69 6e 64 65 78 28 69 6e 74 20 6e 29 0a 7b  rgindex(int n).{
d200: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
d210: 64 61 73 68 64 61 73 68 20 3d 20 30 3b 0a 20 20  dashdash = 0;.  
d220: 69 66 28 20 61 72 67 76 21 3d 30 20 26 26 20 2a  if( argv!=0 && *
d230: 61 72 67 76 21 3d 30 20 29 7b 0a 20 20 20 20 66  argv!=0 ){.    f
d240: 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b  or(i=1; argv[i];
d250: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
d260: 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53   dashdash || !IS
d270: 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a  OPT(argv[i]) ){.
d280: 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30          if( n==0
d290: 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20   ) return i;.   
d2a0: 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20       n--;.      
d2b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  }.      if( strc
d2c0: 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29  mp(argv[i],"--")
d2d0: 3d 3d 30 20 29 20 64 61 73 68 64 61 73 68 20 3d  ==0 ) dashdash =
d2e0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
d2f0: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73 74  return -1;.}..st
d300: 61 74 69 63 20 63 68 61 72 20 65 6d 73 67 5b 5d  atic char emsg[]
d310: 20 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c 69 6e 65   = "Command line
d320: 20 73 79 6e 74 61 78 20 65 72 72 6f 72 3a 20 22   syntax error: "
d330: 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  ;../*.** Process
d340: 20 61 20 66 6c 61 67 20 63 6f 6d 6d 61 6e 64 20   a flag command 
d350: 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  line argument..*
d360: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 6e  /.static int han
d370: 64 6c 65 66 6c 61 67 73 28 69 6e 74 20 69 2c 20  dleflags(int i, 
d380: 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20 20 69  FILE *err).{.  i
d390: 6e 74 20 76 3b 0a 20 20 69 6e 74 20 65 72 72 63  nt v;.  int errc
d3a0: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  nt = 0;.  int j;
d3b0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a  .  for(j=0; op[j
d3c0: 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20  ].label; j++){. 
d3d0: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 26     if( strncmp(&
d3e0: 61 72 67 76 5b 69 5d 5b 31 5d 2c 6f 70 5b 6a 5d  argv[i][1],op[j]
d3f0: 2e 6c 61 62 65 6c 2c 6c 65 6d 6f 6e 53 74 72 6c  .label,lemonStrl
d400: 65 6e 28 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 29  en(op[j].label))
d410: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ==0 ) break;.  }
d420: 0a 20 20 76 20 3d 20 61 72 67 76 5b 69 5d 5b 30  .  v = argv[i][0
d430: 5d 3d 3d 27 2d 27 20 3f 20 31 20 3a 20 30 3b 0a  ]=='-' ? 1 : 0;.
d440: 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65    if( op[j].labe
d450: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  l==0 ){.    if( 
d460: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72  err ){.      fpr
d470: 69 6e 74 66 28 65 72 72 2c 22 25 73 75 6e 64 65  intf(err,"%sunde
d480: 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22  fined option.\n"
d490: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72  ,emsg);.      er
d4a0: 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a  rline(i,1,err);.
d4b0: 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74      }.    errcnt
d4c0: 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ++;.  }else if( 
d4d0: 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f  op[j].type==OPT_
d4e0: 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a 28 28 69  FLAG ){.    *((i
d4f0: 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d  nt*)op[j].arg) =
d500: 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   v;.  }else if( 
d510: 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f  op[j].type==OPT_
d520: 46 46 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a 28  FFLAG ){.    (*(
d530: 76 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f 70  void(*)(int))(op
d540: 5b 6a 5d 2e 61 72 67 29 29 28 76 29 3b 0a 20 20  [j].arg))(v);.  
d550: 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e  }else if( op[j].
d560: 74 79 70 65 3d 3d 4f 50 54 5f 46 53 54 52 20 29  type==OPT_FSTR )
d570: 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29  {.    (*(void(*)
d580: 28 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e  (char *))(op[j].
d590: 61 72 67 29 29 28 26 61 72 67 76 5b 69 5d 5b 32  arg))(&argv[i][2
d5a0: 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ]);.  }else{.   
d5b0: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
d5c0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25    fprintf(err,"%
d5d0: 73 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e  smissing argumen
d5e0: 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c 6e 22 2c  t on switch.\n",
d5f0: 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72  emsg);.      err
d600: 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20  line(i,1,err);. 
d610: 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b     }.    errcnt+
d620: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
d630: 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  errcnt;.}../*.**
d640: 20 50 72 6f 63 65 73 73 20 61 20 63 6f 6d 6d 61   Process a comma
d650: 6e 64 20 6c 69 6e 65 20 73 77 69 74 63 68 20 77  nd line switch w
d660: 68 69 63 68 20 68 61 73 20 61 6e 20 61 72 67 75  hich has an argu
d670: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
d680: 69 6e 74 20 68 61 6e 64 6c 65 73 77 69 74 63 68  int handleswitch
d690: 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65 72  (int i, FILE *er
d6a0: 72 29 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d 20  r).{.  int lv = 
d6b0: 30 3b 0a 20 20 64 6f 75 62 6c 65 20 64 76 20 3d  0;.  double dv =
d6c0: 20 30 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73 76   0.0;.  char *sv
d6d0: 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63 68   = 0, *end;.  ch
d6e0: 61 72 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a 3b  ar *cp;.  int j;
d6f0: 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20  .  int errcnt = 
d700: 30 3b 0a 20 20 63 70 20 3d 20 73 74 72 63 68 72  0;.  cp = strchr
d710: 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20  (argv[i],'=');. 
d720: 20 61 73 73 65 72 74 28 20 63 70 21 3d 30 20 29   assert( cp!=0 )
d730: 3b 0a 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 66  ;.  *cp = 0;.  f
d740: 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61  or(j=0; op[j].la
d750: 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  bel; j++){.    i
d760: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69  f( strcmp(argv[i
d770: 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d  ],op[j].label)==
d780: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  0 ) break;.  }. 
d790: 20 2a 63 70 20 3d 20 27 3d 27 3b 0a 20 20 69 66   *cp = '=';.  if
d7a0: 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30  ( op[j].label==0
d7b0: 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20   ){.    if( err 
d7c0: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
d7d0: 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e 65  (err,"%sundefine
d7e0: 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73  d option.\n",ems
d7f0: 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e  g);.      errlin
d800: 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20 20  e(i,0,err);.    
d810: 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a  }.    errcnt++;.
d820: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 70 2b    }else{.    cp+
d830: 2b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  +;.    switch( o
d840: 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20  p[j].type ){.   
d850: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47     case OPT_FLAG
d860: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
d870: 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20  _FFLAG:.        
d880: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
d890: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
d8a0: 2c 22 25 73 6f 70 74 69 6f 6e 20 72 65 71 75 69  ,"%soption requi
d8b0: 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e  res an argument.
d8c0: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
d8d0: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 30       errline(i,0
d8e0: 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ,err);.        }
d8f0: 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b  .        errcnt+
d900: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  +;.        break
d910: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
d920: 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  _DBL:.      case
d930: 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20   OPT_FDBL:.     
d940: 20 20 20 64 76 20 3d 20 73 74 72 74 6f 64 28 63     dv = strtod(c
d950: 70 2c 26 65 6e 64 29 3b 0a 20 20 20 20 20 20 20  p,&end);.       
d960: 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20   if( *end ){.   
d970: 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29         if( err )
d980: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  {.            fp
d990: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 69 6c 6c  rintf(err,"%sill
d9a0: 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20 69  egal character i
d9b0: 6e 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74  n floating-point
d9c0: 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d   argument.\n",em
d9d0: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sg);.           
d9e0: 20 65 72 72 6c 69 6e 65 28 69 2c 28 28 75 6e 73   errline(i,((uns
d9f0: 69 67 6e 65 64 20 6c 6f 6e 67 29 65 6e 64 29 2d  igned long)end)-
da00: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 61  (unsigned long)a
da10: 72 67 76 5b 69 5d 2c 65 72 72 29 3b 0a 20 20 20  rgv[i],err);.   
da20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
da30: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
da40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
da50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
da60: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
da70: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
da80: 20 20 20 20 20 20 20 6c 76 20 3d 20 73 74 72 74         lv = strt
da90: 6f 6c 28 63 70 2c 26 65 6e 64 2c 30 29 3b 0a 20  ol(cp,&end,0);. 
daa0: 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e 64 20         if( *end 
dab0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
dac0: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20   err ){.        
dad0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
dae0: 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61 72 61  "%sillegal chara
daf0: 63 74 65 72 20 69 6e 20 69 6e 74 65 67 65 72 20  cter in integer 
db00: 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73  argument.\n",ems
db10: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
db20: 65 72 72 6c 69 6e 65 28 69 2c 28 28 75 6e 73 69  errline(i,((unsi
db30: 67 6e 65 64 20 6c 6f 6e 67 29 65 6e 64 29 2d 28  gned long)end)-(
db40: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 61 72  unsigned long)ar
db50: 67 76 5b 69 5d 2c 65 72 72 29 3b 0a 20 20 20 20  gv[i],err);.    
db60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
db70: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20    errcnt++;.    
db80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
db90: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
dba0: 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63  OPT_STR:.      c
dbb0: 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20  ase OPT_FSTR:.  
dbc0: 20 20 20 20 20 20 73 76 20 3d 20 63 70 3b 0a 20        sv = cp;. 
dbd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
dbe0: 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20    }.    switch( 
dbf0: 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[j].type ){.  
dc00: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
dc10: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
dc20: 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
dc30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
dc40: 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20  se OPT_DBL:.    
dc50: 20 20 20 20 2a 28 64 6f 75 62 6c 65 2a 29 28 6f      *(double*)(o
dc60: 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 64 76 3b 0a  p[j].arg) = dv;.
dc70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
dc80: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44       case OPT_FD
dc90: 42 4c 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76  BL:.        (*(v
dca0: 6f 69 64 28 2a 29 28 64 6f 75 62 6c 65 29 29 28  oid(*)(double))(
dcb0: 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 64 76 29 3b  op[j].arg))(dv);
dcc0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
dcd0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49        case OPT_I
dce0: 4e 54 3a 0a 20 20 20 20 20 20 20 20 2a 28 69 6e  NT:.        *(in
dcf0: 74 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d  t*)(op[j].arg) =
dd00: 20 6c 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65   lv;.        bre
dd10: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
dd20: 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20  PT_FINT:.       
dd30: 20 28 2a 28 76 6f 69 64 28 2a 29 28 69 6e 74 29   (*(void(*)(int)
dd40: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 28 69  )(op[j].arg))((i
dd50: 6e 74 29 6c 76 29 3b 0a 20 20 20 20 20 20 20 20  nt)lv);.        
dd60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
dd70: 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20  e OPT_STR:.     
dd80: 20 20 20 2a 28 63 68 61 72 2a 2a 29 28 6f 70 5b     *(char**)(op[
dd90: 6a 5d 2e 61 72 67 29 20 3d 20 73 76 3b 0a 20 20  j].arg) = sv;.  
dda0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ddb0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52     case OPT_FSTR
ddc0: 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69  :.        (*(voi
ddd0: 64 28 2a 29 28 63 68 61 72 20 2a 29 29 28 6f 70  d(*)(char *))(op
dde0: 5b 6a 5d 2e 61 72 67 29 29 28 73 76 29 3b 0a 20  [j].arg))(sv);. 
ddf0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
de00: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
de10: 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 69 6e 74 20   errcnt;.}..int 
de20: 4f 70 74 49 6e 69 74 28 63 68 61 72 20 2a 2a 61  OptInit(char **a
de30: 2c 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f  , struct s_optio
de40: 6e 73 20 2a 6f 2c 20 46 49 4c 45 20 2a 65 72 72  ns *o, FILE *err
de50: 29 0a 7b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74  ).{.  int errcnt
de60: 20 3d 20 30 3b 0a 20 20 61 72 67 76 20 3d 20 61   = 0;.  argv = a
de70: 3b 0a 20 20 6f 70 20 3d 20 6f 3b 0a 20 20 65 72  ;.  op = o;.  er
de80: 72 73 74 72 65 61 6d 20 3d 20 65 72 72 3b 0a 20  rstream = err;. 
de90: 20 69 66 28 20 61 72 67 76 20 26 26 20 2a 61 72   if( argv && *ar
dea0: 67 76 20 26 26 20 6f 70 20 29 7b 0a 20 20 20 20  gv && op ){.    
deb0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
dec0: 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b  =1; argv[i]; i++
ded0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 72 67  ){.      if( arg
dee0: 76 5b 69 5d 5b 30 5d 3d 3d 27 2b 27 20 7c 7c 20  v[i][0]=='+' || 
def0: 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20  argv[i][0]=='-' 
df00: 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e  ){.        errcn
df10: 74 20 2b 3d 20 68 61 6e 64 6c 65 66 6c 61 67 73  t += handleflags
df20: 28 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 7d  (i,err);.      }
df30: 65 6c 73 65 20 69 66 28 20 73 74 72 63 68 72 28  else if( strchr(
df40: 61 72 67 76 5b 69 5d 2c 27 3d 27 29 20 29 7b 0a  argv[i],'=') ){.
df50: 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 20 2b          errcnt +
df60: 3d 20 68 61 6e 64 6c 65 73 77 69 74 63 68 28 69  = handleswitch(i
df70: 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ,err);.      }. 
df80: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65     }.  }.  if( e
df90: 72 72 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 66  rrcnt>0 ){.    f
dfa0: 70 72 69 6e 74 66 28 65 72 72 2c 22 56 61 6c 69  printf(err,"Vali
dfb0: 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f  d command line o
dfc0: 70 74 69 6f 6e 73 20 66 6f 72 20 5c 22 25 73 5c  ptions for \"%s\
dfd0: 22 20 61 72 65 3a 5c 6e 22 2c 2a 61 29 3b 0a 20  " are:\n",*a);. 
dfe0: 20 20 20 4f 70 74 50 72 69 6e 74 28 29 3b 0a 20     OptPrint();. 
dff0: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
e000: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 69    return 0;.}..i
e010: 6e 74 20 4f 70 74 4e 41 72 67 73 28 29 7b 0a 20  nt OptNArgs(){. 
e020: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
e030: 69 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20 30  int dashdash = 0
e040: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
e050: 20 61 72 67 76 21 3d 30 20 26 26 20 61 72 67 76   argv!=0 && argv
e060: 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  [0]!=0 ){.    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: 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53 4f  dashdash || !ISO
e0a0: 50 54 28 61 72 67 76 5b 69 5d 29 20 29 20 63 6e  PT(argv[i]) ) cn
e0b0: 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73  t++;.      if( s
e0c0: 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d  trcmp(argv[i],"-
e0d0: 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73  -")==0 ) dashdas
e0e0: 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  h = 1;.    }.  }
e0f0: 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 3b 0a 7d  .  return cnt;.}
e100: 0a 0a 63 68 61 72 20 2a 4f 70 74 41 72 67 28 69  ..char *OptArg(i
e110: 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  nt n).{.  int i;
e120: 0a 20 20 69 20 3d 20 61 72 67 69 6e 64 65 78 28  .  i = argindex(
e130: 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3e 3d  n);.  return i>=
e140: 30 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 30 3b  0 ? argv[i] : 0;
e150: 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 45 72 72 28  .}..void OptErr(
e160: 69 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69  int n).{.  int i
e170: 3b 0a 20 20 69 20 3d 20 61 72 67 69 6e 64 65 78  ;.  i = argindex
e180: 28 6e 29 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20  (n);.  if( i>=0 
e190: 29 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72  ) errline(i,0,er
e1a0: 72 73 74 72 65 61 6d 29 3b 0a 7d 0a 0a 76 6f 69  rstream);.}..voi
e1b0: 64 20 4f 70 74 50 72 69 6e 74 28 29 7b 0a 20 20  d OptPrint(){.  
e1c0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 61 78  int i;.  int max
e1d0: 2c 20 6c 65 6e 3b 0a 20 20 6d 61 78 20 3d 20 30  , len;.  max = 0
e1e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b  ;.  for(i=0; op[
e1f0: 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a  i].label; i++){.
e200: 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53      len = lemonS
e210: 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65  trlen(op[i].labe
e220: 6c 29 20 2b 20 31 3b 0a 20 20 20 20 73 77 69 74  l) + 1;.    swit
e230: 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29  ch( op[i].type )
e240: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  {.      case OPT
e250: 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73  _FLAG:.      cas
e260: 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20  e OPT_FFLAG:.   
e270: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e280: 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a    case OPT_INT:.
e290: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
e2a0: 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e  INT:.        len
e2b0: 20 2b 3d 20 39 3b 20 20 20 20 20 20 20 2f 2a 20   += 9;       /* 
e2c0: 6c 65 6e 67 74 68 20 6f 66 20 22 3c 69 6e 74 65  length of "<inte
e2d0: 67 65 72 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20  ger>" */.       
e2e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
e2f0: 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20  se OPT_DBL:.    
e300: 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a    case OPT_FDBL:
e310: 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20  .        len += 
e320: 36 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67  6;       /* leng
e330: 74 68 20 6f 66 20 22 3c 72 65 61 6c 3e 22 20 2a  th of "<real>" *
e340: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
e350: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
e360: 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20  STR:.      case 
e370: 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20  OPT_FSTR:.      
e380: 20 20 6c 65 6e 20 2b 3d 20 38 3b 20 20 20 20 20    len += 8;     
e390: 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22    /* length of "
e3a0: 3c 73 74 72 69 6e 67 3e 22 20 2a 2f 0a 20 20 20  <string>" */.   
e3b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e3c0: 7d 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61  }.    if( len>ma
e3d0: 78 20 29 20 6d 61 78 20 3d 20 6c 65 6e 3b 0a 20  x ) max = len;. 
e3e0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 6f 70   }.  for(i=0; op
e3f0: 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b  [i].label; i++){
e400: 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b  .    switch( op[
e410: 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20  i].type ){.     
e420: 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a   case OPT_FLAG:.
e430: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
e440: 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 66 70  FLAG:.        fp
e450: 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c  rintf(errstream,
e460: 22 20 20 2d 25 2d 2a 73 20 20 25 73 5c 6e 22 2c  "  -%-*s  %s\n",
e470: 6d 61 78 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c  max,op[i].label,
e480: 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a  op[i].message);.
e490: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e4a0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e       case OPT_IN
e4b0: 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  T:.      case OP
e4c0: 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20  T_FINT:.        
e4d0: 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61  fprintf(errstrea
e4e0: 6d 2c 22 20 20 25 73 3d 3c 69 6e 74 65 67 65 72  m,"  %s=<integer
e4f0: 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69  >%*s  %s\n",op[i
e500: 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  ].label,.       
e510: 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d     (int)(max-lem
e520: 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c  onStrlen(op[i].l
e530: 61 62 65 6c 29 2d 39 29 2c 22 22 2c 6f 70 5b 69  abel)-9),"",op[i
e540: 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20  ].message);.    
e550: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e560: 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20   case OPT_DBL:. 
e570: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44       case OPT_FD
e580: 42 4c 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69  BL:.        fpri
e590: 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20  ntf(errstream," 
e5a0: 20 25 73 3d 3c 72 65 61 6c 3e 25 2a 73 20 20 25   %s=<real>%*s  %
e5b0: 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c  s\n",op[i].label
e5c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e 74  ,.          (int
e5d0: 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65  )(max-lemonStrle
e5e0: 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 36  n(op[i].label)-6
e5f0: 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61  ),"",op[i].messa
e600: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ge);.        bre
e610: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
e620: 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61  PT_STR:.      ca
e630: 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20  se OPT_FSTR:.   
e640: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
e650: 73 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 73 74  stream,"  %s=<st
e660: 72 69 6e 67 3e 25 2a 73 20 20 25 73 5c 6e 22 2c  ring>%*s  %s\n",
e670: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20  op[i].label,.   
e680: 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78         (int)(max
e690: 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b  -lemonStrlen(op[
e6a0: 69 5d 2e 6c 61 62 65 6c 29 2d 38 29 2c 22 22 2c  i].label)-8),"",
e6b0: 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a  op[i].message);.
e6c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e6d0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a     }.  }.}./****
e6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6f0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
e700: 65 20 22 70 61 72 73 65 2e 63 22 20 2a 2a 2a 2a  e "parse.c" ****
e710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e720: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
e730: 49 6e 70 75 74 20 66 69 6c 65 20 70 61 72 73 65  Input file parse
e740: 72 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20  r for the LEMON 
e750: 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
e760: 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68 65 20 73 74 61  ..*/../* The sta
e770: 74 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  te of the parser
e780: 20 2a 2f 0a 65 6e 75 6d 20 65 5f 73 74 61 74 65   */.enum e_state
e790: 20 7b 0a 20 20 49 4e 49 54 49 41 4c 49 5a 45 2c   {.  INITIALIZE,
e7a0: 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44  .  WAITING_FOR_D
e7b0: 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c 0a 20 20 57  ECL_OR_RULE,.  W
e7c0: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
e7d0: 4b 45 59 57 4f 52 44 2c 0a 20 20 57 41 49 54 49  KEYWORD,.  WAITI
e7e0: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 2c  NG_FOR_DECL_ARG,
e7f0: 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50  .  WAITING_FOR_P
e800: 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c  RECEDENCE_SYMBOL
e810: 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ,.  WAITING_FOR_
e820: 41 52 52 4f 57 2c 0a 20 20 49 4e 5f 52 48 53 2c  ARROW,.  IN_RHS,
e830: 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f 31 2c 0a  .  LHS_ALIAS_1,.
e840: 20 20 4c 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20    LHS_ALIAS_2,. 
e850: 20 4c 48 53 5f 41 4c 49 41 53 5f 33 2c 0a 20 20   LHS_ALIAS_3,.  
e860: 52 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 52  RHS_ALIAS_1,.  R
e870: 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 50 52  HS_ALIAS_2,.  PR
e880: 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 2c  ECEDENCE_MARK_1,
e890: 0a 20 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41  .  PRECEDENCE_MA
e8a0: 52 4b 5f 32 2c 0a 20 20 52 45 53 59 4e 43 5f 41  RK_2,.  RESYNC_A
e8b0: 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 2c  FTER_RULE_ERROR,
e8c0: 0a 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f  .  RESYNC_AFTER_
e8d0: 44 45 43 4c 5f 45 52 52 4f 52 2c 0a 20 20 57 41  DECL_ERROR,.  WA
e8e0: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55  ITING_FOR_DESTRU
e8f0: 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57  CTOR_SYMBOL,.  W
e900: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54  AITING_FOR_DATAT
e910: 59 50 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41  YPE_SYMBOL,.  WA
e920: 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41  ITING_FOR_FALLBA
e930: 43 4b 5f 49 44 2c 0a 20 20 57 41 49 54 49 4e 47  CK_ID,.  WAITING
e940: 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44  _FOR_WILDCARD_ID
e950: 0a 7d 3b 0a 73 74 72 75 63 74 20 70 73 74 61 74  .};.struct pstat
e960: 65 20 7b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65  e {.  char *file
e970: 6e 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e  name;       /* N
e980: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74  ame of the input
e990: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74   file */.  int t
e9a0: 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20 20  okenlineno;     
e9b0: 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 61   /* Linenumber a
e9c0: 74 20 77 68 69 63 68 20 63 75 72 72 65 6e 74 20  t which current 
e9d0: 74 6f 6b 65 6e 20 73 74 61 72 74 73 20 2a 2f 0a  token starts */.
e9e0: 20 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20    int errorcnt; 
e9f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ea00: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 6f 20 66  r of errors so f
ea10: 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f  ar */.  char *to
ea20: 6b 65 6e 73 74 61 72 74 3b 20 20 20 20 20 2f 2a  kenstart;     /*
ea30: 20 54 65 78 74 20 6f 66 20 63 75 72 72 65 6e 74   Text of current
ea40: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75   token */.  stru
ea50: 63 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20 20  ct lemon *gp;   
ea60: 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 74 61 74    /* Global stat
ea70: 65 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 65 6e  e vector */.  en
ea80: 75 6d 20 65 5f 73 74 61 74 65 20 73 74 61 74 65  um e_state state
ea90: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
eaa0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72  state of the par
eab0: 73 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ser */.  struct 
eac0: 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b  symbol *fallback
ead0: 3b 20 20 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62  ;   /* The fallb
eae0: 61 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73  ack token */.  s
eaf0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68  truct symbol *lh
eb00: 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66  s;        /* Lef
eb10: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63  t-hand side of c
eb20: 75 72 72 65 6e 74 20 72 75 6c 65 20 2a 2f 0a 20  urrent rule */. 
eb30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 68 73   const char *lhs
eb40: 61 6c 69 61 73 3b 20 20 20 20 20 20 2f 2a 20 41  alias;      /* A
eb50: 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53  lias for the LHS
eb60: 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20   */.  int nrhs; 
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb80: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 69   /* Number of ri
eb90: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 73 79  ght-hand side sy
eba0: 6d 62 6f 6c 73 20 73 65 65 6e 20 2a 2f 0a 20 20  mbols seen */.  
ebb0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 72  struct symbol *r
ebc0: 68 73 5b 4d 41 58 52 48 53 5d 3b 20 20 2f 2a 20  hs[MAXRHS];  /* 
ebd0: 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  RHS symbols */. 
ebe0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 6c 69   const char *ali
ebf0: 61 73 5b 4d 41 58 52 48 53 5d 3b 20 2f 2a 20 41  as[MAXRHS]; /* A
ec00: 6c 69 61 73 65 73 20 66 6f 72 20 65 61 63 68 20  liases for each 
ec10: 52 48 53 20 73 79 6d 62 6f 6c 20 28 6f 72 20 4e  RHS symbol (or N
ec20: 55 4c 4c 29 20 2a 2f 0a 20 20 73 74 72 75 63 74  ULL) */.  struct
ec30: 20 72 75 6c 65 20 2a 70 72 65 76 72 75 6c 65 3b   rule *prevrule;
ec40: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
ec50: 20 72 75 6c 65 20 70 61 72 73 65 64 20 2a 2f 0a   rule parsed */.
ec60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 65    const char *de
ec70: 63 6c 6b 65 79 77 6f 72 64 3b 20 20 20 2f 2a 20  clkeyword;   /* 
ec80: 4b 65 79 77 6f 72 64 20 6f 66 20 61 20 64 65 63  Keyword of a dec
ec90: 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68  laration */.  ch
eca0: 61 72 20 2a 2a 64 65 63 6c 61 72 67 73 6c 6f 74  ar **declargslot
ecb0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ;        /* Wher
ecc0: 65 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  e the declaratio
ecd0: 6e 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c  n argument shoul
ece0: 64 20 62 65 20 70 75 74 20 2a 2f 0a 20 20 69 6e  d be put */.  in
ecf0: 74 20 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  t insertLineMacr
ed00: 6f 3b 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20  o;       /* Add 
ed10: 23 6c 69 6e 65 20 62 65 66 6f 72 65 20 64 65 63  #line before dec
ed20: 6c 61 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 20  laration insert 
ed30: 2a 2f 0a 20 20 69 6e 74 20 2a 64 65 63 6c 6c 69  */.  int *declli
ed40: 6e 65 6e 6f 73 6c 6f 74 3b 20 20 20 20 20 20 20  nenoslot;       
ed50: 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
ed60: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6c 69  e declaration li
ed70: 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 65  ne number */.  e
ed80: 6e 75 6d 20 65 5f 61 73 73 6f 63 20 64 65 63 6c  num e_assoc decl
ed90: 61 73 73 6f 63 3b 20 20 20 20 2f 2a 20 41 73 73  assoc;    /* Ass
eda0: 69 67 6e 20 74 68 69 73 20 61 73 73 6f 63 69 61  ign this associa
edb0: 74 69 6f 6e 20 74 6f 20 64 65 63 6c 20 61 72 67  tion to decl arg
edc0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  uments */.  int 
edd0: 70 72 65 63 63 6f 75 6e 74 65 72 3b 20 20 20 20  preccounter;    
ede0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 69 67 6e         /* Assign
edf0: 20 74 68 69 73 20 70 72 65 63 65 64 65 6e 63 65   this precedence
ee00: 20 74 6f 20 64 65 63 6c 20 61 72 67 75 6d 65 6e   to decl argumen
ee10: 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72  ts */.  struct r
ee20: 75 6c 65 20 2a 66 69 72 73 74 72 75 6c 65 3b 20  ule *firstrule; 
ee30: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
ee40: 20 66 69 72 73 74 20 72 75 6c 65 20 69 6e 20 74   first rule in t
ee50: 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20  he grammar */.  
ee60: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6c 61 73  struct rule *las
ee70: 74 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 6f  trule;     /* Po
ee80: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 6f 73  inter to the mos
ee90: 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
eea0: 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  d rule */.};../*
eeb0: 20 50 61 72 73 65 20 61 20 73 69 6e 67 6c 65 20   Parse a single 
eec0: 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74 69 63 20  token */.static 
eed0: 76 6f 69 64 20 70 61 72 73 65 6f 6e 65 74 6f 6b  void parseonetok
eee0: 65 6e 28 73 74 72 75 63 74 20 70 73 74 61 74 65  en(struct pstate
eef0: 20 2a 70 73 70 29 0a 7b 0a 20 20 63 6f 6e 73 74   *psp).{.  const
ef00: 20 63 68 61 72 20 2a 78 3b 0a 20 20 78 20 3d 20   char *x;.  x = 
ef10: 53 74 72 73 61 66 65 28 70 73 70 2d 3e 74 6f 6b  Strsafe(psp->tok
ef20: 65 6e 73 74 61 72 74 29 3b 20 20 20 20 20 2f 2a  enstart);     /*
ef30: 20 53 61 76 65 20 74 68 65 20 74 6f 6b 65 6e 20   Save the token 
ef40: 70 65 72 6d 61 6e 65 6e 74 6c 79 20 2a 2f 0a 23  permanently */.#
ef50: 69 66 20 30 0a 20 20 70 72 69 6e 74 66 28 22 25  if 0.  printf("%
ef60: 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b 25 73 5d  s:%d: Token=[%s]
ef70: 20 73 74 61 74 65 3d 25 64 5c 6e 22 2c 70 73 70   state=%d\n",psp
ef80: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
ef90: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
efa0: 20 78 2c 70 73 70 2d 3e 73 74 61 74 65 29 3b 0a   x,psp->state);.
efb0: 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28  #endif.  switch(
efc0: 20 70 73 70 2d 3e 73 74 61 74 65 20 29 7b 0a 20   psp->state ){. 
efd0: 20 20 20 63 61 73 65 20 49 4e 49 54 49 41 4c 49     case INITIALI
efe0: 5a 45 3a 0a 20 20 20 20 20 20 70 73 70 2d 3e 70  ZE:.      psp->p
eff0: 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  revrule = 0;.   
f000: 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e     psp->preccoun
f010: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
f020: 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20  sp->firstrule = 
f030: 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20  psp->lastrule = 
f040: 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 67 70  0;.      psp->gp
f050: 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  ->nrule = 0;.   
f060: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
f070: 74 6f 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a  to next case */.
f080: 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
f090: 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
f0a0: 45 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  E:.      if( x[0
f0b0: 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20 20 20  ]=='%' ){.      
f0c0: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
f0d0: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
f0e0: 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20 7d  KEYWORD;.      }
f0f0: 65 6c 73 65 20 69 66 28 20 69 73 6c 6f 77 65 72  else if( islower
f100: 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
f110: 20 20 70 73 70 2d 3e 6c 68 73 20 3d 20 53 79 6d    psp->lhs = Sym
f120: 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
f130: 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 20 3d 20      psp->nrhs = 
f140: 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
f150: 6c 68 73 61 6c 69 61 73 20 3d 20 30 3b 0a 20 20  lhsalias = 0;.  
f160: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
f170: 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41   = WAITING_FOR_A
f180: 52 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROW;.      }els
f190: 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27 20  e if( x[0]=='{' 
f1a0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
f1b0: 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20  sp->prevrule==0 
f1c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
f1d0: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
f1e0: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
f1f0: 6e 65 6e 6f 2c 0a 22 54 68 65 72 65 20 69 73 20  neno,."There is 
f200: 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20 75 70  no prior rule up
f210: 6f 6e 20 77 68 69 63 68 20 74 6f 20 61 74 74 61  on which to atta
f220: 63 68 20 74 68 65 20 63 6f 64 65 20 5c 0a 66 72  ch the code \.fr
f230: 61 67 6d 65 6e 74 20 77 68 69 63 68 20 62 65 67  agment which beg
f240: 69 6e 73 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65  ins on this line
f250: 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  .");.          p
f260: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
f270: 09 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e  .}else if( psp->
f280: 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65 21 3d  prevrule->code!=
f290: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
f2a0: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
f2b0: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
f2c0: 6c 69 6e 65 6e 6f 2c 0a 22 43 6f 64 65 20 66 72  lineno,."Code fr
f2d0: 61 67 6d 65 6e 74 20 62 65 67 69 6e 6e 69 6e 67  agment beginning
f2e0: 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73   on this line is
f2f0: 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 20 5c   not the first \
f300: 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70  .to follow the p
f310: 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b  revious rule.");
f320: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
f330: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
f340: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f350: 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75       psp->prevru
f360: 6c 65 2d 3e 6c 69 6e 65 20 3d 20 70 73 70 2d 3e  le->line = psp->
f370: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20  tokenlineno;.   
f380: 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76         psp->prev
f390: 72 75 6c 65 2d 3e 63 6f 64 65 20 3d 20 26 78 5b  rule->code = &x[
f3a0: 31 5d 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c  1];..}.      }el
f3b0: 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 5b 27  se if( x[0]=='['
f3c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
f3d0: 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45 44 45  >state = PRECEDE
f3e0: 4e 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20 20 20  NCE_MARK_1;.    
f3f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f400: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
f410: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
f420: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
f430: 20 20 20 20 22 54 6f 6b 65 6e 20 5c 22 25 73 5c      "Token \"%s\
f440: 22 20 73 68 6f 75 6c 64 20 62 65 20 65 69 74 68  " should be eith
f450: 65 72 20 5c 22 25 25 5c 22 20 6f 72 20 61 20 6e  er \"%%\" or a n
f460: 6f 6e 74 65 72 6d 69 6e 61 6c 20 6e 61 6d 65 2e  onterminal name.
f470: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 29 3b  ",.          x);
f480: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
f490: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
f4a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f4b0: 20 20 20 63 61 73 65 20 50 52 45 43 45 44 45 4e     case PRECEDEN
f4c0: 43 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20 20 20  CE_MARK_1:.     
f4d0: 20 69 66 28 20 21 69 73 75 70 70 65 72 28 78 5b   if( !isupper(x[
f4e0: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
f4f0: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
f500: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
f510: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
f520: 20 20 22 54 68 65 20 70 72 65 63 65 64 65 6e 63    "The precedenc
f530: 65 20 73 79 6d 62 6f 6c 20 6d 75 73 74 20 62 65  e symbol must be
f540: 20 61 20 74 65 72 6d 69 6e 61 6c 2e 22 29 3b 0a   a terminal.");.
f550: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
f560: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
f570: 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72  else if( psp->pr
f580: 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  evrule==0 ){.   
f590: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
f5a0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
f5b0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
f5c0: 20 20 20 20 20 20 20 20 22 54 68 65 72 65 20 69          "There i
f5d0: 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20  s no prior rule 
f5e0: 74 6f 20 61 73 73 69 67 6e 20 70 72 65 63 65 64  to assign preced
f5f0: 65 6e 63 65 20 5c 22 5b 25 73 5d 5c 22 2e 22 2c  ence \"[%s]\".",
f600: 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
f610: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
f620: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70     }else if( psp
f630: 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63  ->prevrule->prec
f640: 73 79 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sym!=0 ){.      
f650: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
f660: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
f670: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72 65 63  kenlineno,."Prec
f680: 65 64 65 6e 63 65 20 6d 61 72 6b 20 6f 6e 20 74  edence mark on t
f690: 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20  his line is not 
f6a0: 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66  the first \.to f
f6b0: 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f  ollow the previo
f6c0: 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20  us rule.");.    
f6d0: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
f6e0: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  t++;.      }else
f6f0: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70  {.        psp->p
f700: 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73 79 6d  revrule->precsym
f710: 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
f720: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f730: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45  psp->state = PRE
f740: 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3b 0a  CEDENCE_MARK_2;.
f750: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f760: 20 63 61 73 65 20 50 52 45 43 45 44 45 4e 43 45   case PRECEDENCE
f770: 5f 4d 41 52 4b 5f 32 3a 0a 20 20 20 20 20 20 69  _MARK_2:.      i
f780: 66 28 20 78 5b 30 5d 21 3d 27 5d 27 20 29 7b 0a  f( x[0]!=']' ){.
f790: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
f7a0: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
f7b0: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
f7c0: 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73  .          "Miss
f7d0: 69 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20 70 72 65  ing \"]\" on pre
f7e0: 63 65 64 65 6e 63 65 20 6d 61 72 6b 2e 22 29 3b  cedence mark.");
f7f0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
f800: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
f810: 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61  }.      psp->sta
f820: 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
f830: 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20  _DECL_OR_RULE;. 
f840: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f850: 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
f860: 5f 41 52 52 4f 57 3a 0a 20 20 20 20 20 20 69 66  _ARROW:.      if
f870: 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78  ( x[0]==':' && x
f880: 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d  [1]==':' && x[2]
f890: 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='=' ){.       
f8a0: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e   psp->state = IN
f8b0: 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _RHS;.      }els
f8c0: 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20  e if( x[0]=='(' 
f8d0: 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
f8e0: 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41  state = LHS_ALIA
f8f0: 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  S_1;.      }else
f900: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
f910: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
f920: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
f930: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 45 78  o,.          "Ex
f940: 70 65 63 74 65 64 20 74 6f 20 73 65 65 20 61 20  pected to see a 
f950: 5c 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20  \":\" following 
f960: 74 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c 20 5c  the LHS symbol \
f970: 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20  "%s\".",.       
f980: 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d     psp->lhs->nam
f990: 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  e);.        psp-
f9a0: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
f9b0: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
f9c0: 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
f9d0: 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
f9e0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f9f0: 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49      case LHS_ALI
fa00: 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20  AS_1:.      if( 
fa10: 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b  isalpha(x[0]) ){
fa20: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68  .        psp->lh
fa30: 73 61 6c 69 61 73 20 3d 20 78 3b 0a 20 20 20 20  salias = x;.    
fa40: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
fa50: 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20   LHS_ALIAS_2;.  
fa60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fa70: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
fa80: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
fa90: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
faa0: 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73        "\"%s\" is
fab0: 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69   not a valid ali
fac0: 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20 5c  as for the LHS \
fad0: 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20  "%s\"\n",.      
fae0: 20 20 20 20 78 2c 70 73 70 2d 3e 6c 68 73 2d 3e      x,psp->lhs->
faf0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  name);.        p
fb00: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
fb10: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
fb20: 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
fb30: 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20  R_RULE_ERROR;.  
fb40: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
fb50: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f  k;.    case LHS_
fb60: 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69  ALIAS_2:.      i
fb70: 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a  f( x[0]==')' ){.
fb80: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
fb90: 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 33  te = LHS_ALIAS_3
fba0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
fbb0: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
fbc0: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
fbd0: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
fbe0: 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69            "Missi
fbf0: 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69  ng \")\" followi
fc00: 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d  ng LHS alias nam
fc10: 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e  e \"%s\".",psp->
fc20: 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20  lhsalias);.     
fc30: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
fc40: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
fc50: 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
fc60: 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
fc70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fc80: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
fc90: 4c 48 53 5f 41 4c 49 41 53 5f 33 3a 0a 20 20 20  LHS_ALIAS_3:.   
fca0: 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27     if( x[0]==':'
fcb0: 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26   && x[1]==':' &&
fcc0: 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20   x[2]=='=' ){.  
fcd0: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
fce0: 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20   = IN_RHS;.     
fcf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fd00: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
fd10: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
fd20: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
fd30: 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 2d 3e     "Missing \"->
fd40: 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 5c 22  \" following: \"
fd50: 25 73 28 25 73 29 5c 22 2e 22 2c 0a 20 20 20 20  %s(%s)\".",.    
fd60: 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d         psp->lhs-
fd70: 3e 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68 73 61 6c  >name,psp->lhsal
fd80: 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ias);.        ps
fd90: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
fda0: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
fdb0: 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
fdc0: 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
fdd0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
fde0: 3b 0a 20 20 20 20 63 61 73 65 20 49 4e 5f 52 48  ;.    case IN_RH
fdf0: 53 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  S:.      if( x[0
fe00: 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  ]=='.' ){.      
fe10: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
fe20: 70 3b 0a 20 20 20 20 20 20 20 20 72 70 20 3d 20  p;.        rp = 
fe30: 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 29 63  (struct rule *)c
fe40: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
fe50: 72 75 63 74 20 72 75 6c 65 29 20 2b 20 0a 20 20  ruct rule) + .  
fe60: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
fe70: 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a  f(struct symbol*
fe80: 29 2a 70 73 70 2d 3e 6e 72 68 73 20 2b 20 73 69  )*psp->nrhs + si
fe90: 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 73 70 2d  zeof(char*)*psp-
fea0: 3e 6e 72 68 73 2c 20 31 29 3b 0a 20 20 20 20 20  >nrhs, 1);.     
feb0: 20 20 20 69 66 28 20 72 70 3d 3d 30 20 29 7b 0a     if( rp==0 ){.
fec0: 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
fed0: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
fee0: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
fef0: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  o,.            "
ff00: 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 65  Can't allocate e
ff10: 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66 6f 72  nough memory for
ff20: 20 74 68 69 73 20 72 75 6c 65 2e 22 29 3b 0a 20   this rule.");. 
ff30: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
ff40: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
ff50: 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c      psp->prevrul
ff60: 65 20 3d 20 30 3b 0a 09 7d 65 6c 73 65 7b 0a 20  e = 0;..}else{. 
ff70: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
ff80: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 75            rp->ru
ff90: 6c 65 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f  leline = psp->to
ffa0: 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20  kenlineno;.     
ffb0: 20 20 20 20 20 72 70 2d 3e 72 68 73 20 3d 20 28       rp->rhs = (
ffc0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 2a 29  struct symbol**)
ffd0: 26 72 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20  &rp[1];.        
ffe0: 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 20 3d    rp->rhsalias =
fff0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26   (const char**)&
10000 28 72 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72  (rp->rhs[psp->nr
10010 68 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  hs]);.          
10020 66 6f 72 28 69 3d 30 3b 20 69 3c 70 73 70 2d 3e  for(i=0; i<psp->
10030 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
10040 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b          rp->rhs[
10050 69 5d 20 3d 20 70 73 70 2d 3e 72 68 73 5b 69 5d  i] = psp->rhs[i]
10060 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70  ;.            rp
10070 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 3d 20  ->rhsalias[i] = 
10080 70 73 70 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a 09  psp->alias[i];..
10090 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 70    }.          rp
100a0 2d 3e 6c 68 73 20 3d 20 70 73 70 2d 3e 6c 68 73  ->lhs = psp->lhs
100b0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
100c0 6c 68 73 61 6c 69 61 73 20 3d 20 70 73 70 2d 3e  lhsalias = psp->
100d0 6c 68 73 61 6c 69 61 73 3b 0a 20 20 20 20 20 20  lhsalias;.      
100e0 20 20 20 20 72 70 2d 3e 6e 72 68 73 20 3d 20 70      rp->nrhs = p
100f0 73 70 2d 3e 6e 72 68 73 3b 0a 20 20 20 20 20 20  sp->nrhs;.      
10100 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30      rp->code = 0
10110 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
10120 70 72 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20  precsym = 0;.   
10130 20 20 20 20 20 20 20 72 70 2d 3e 69 6e 64 65 78         rp->index
10140 20 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c   = psp->gp->nrul
10150 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e++;.          r
10160 70 2d 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d  p->nextlhs = rp-
10170 3e 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20  >lhs->rule;.    
10180 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72        rp->lhs->r
10190 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20  ule = rp;.      
101a0 20 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30      rp->next = 0
101b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
101c0 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d  psp->firstrule==
101d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
101e0 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20   psp->firstrule 
101f0 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20  = psp->lastrule 
10200 3d 20 72 70 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a  = rp;..  }else{.
10210 20 20 20 20 20 20 20 20 20 20 20 20 70 73 70 2d              psp-
10220 3e 6c 61 73 74 72 75 6c 65 2d 3e 6e 65 78 74 20  >lastrule->next 
10230 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20  = rp;.          
10240 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20    psp->lastrule 
10250 3d 20 72 70 3b 0a 09 20 20 7d 0a 20 20 20 20 20  = rp;..  }.     
10260 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75       psp->prevru
10270 6c 65 20 3d 20 72 70 3b 0a 09 7d 0a 20 20 20 20  le = rp;..}.    
10280 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
10290 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
102a0 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
102b0 20 7d 65 6c 73 65 20 69 66 28 20 69 73 61 6c 70   }else if( isalp
102c0 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ha(x[0]) ){.    
102d0 20 20 20 20 69 66 28 20 70 73 70 2d 3e 6e 72 68      if( psp->nrh
102e0 73 3e 3d 4d 41 58 52 48 53 20 29 7b 0a 20 20 20  s>=MAXRHS ){.   
102f0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
10300 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
10310 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
10320 20 20 20 20 20 20 20 20 20 20 20 20 22 54 6f 6f              "Too
10330 20 6d 61 6e 79 20 73 79 6d 62 6f 6c 73 20 6f 6e   many symbols on
10340 20 52 48 53 20 6f 66 20 72 75 6c 65 20 62 65 67   RHS of rule beg
10350 69 6e 6e 69 6e 67 20 61 74 20 5c 22 25 73 5c 22  inning at \"%s\"
10360 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  .",.            
10370 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
10380 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
10390 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
103a0 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
103b0 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 09  ER_RULE_ERROR;..
103c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
103d0 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e   psp->rhs[psp->n
103e0 72 68 73 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  rhs] = Symbol_ne
103f0 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  w(x);.          
10400 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e  psp->alias[psp->
10410 6e 72 68 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20  nrhs] = 0;.     
10420 20 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 2b 2b       psp->nrhs++
10430 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65  ;..}.      }else
10440 20 69 66 28 20 28 78 5b 30 5d 3d 3d 27 7c 27 20   if( (x[0]=='|' 
10450 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29 20 26 26  || x[0]=='/') &&
10460 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a   psp->nrhs>0 ){.
10470 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
10480 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70  ymbol *msp = psp
10490 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d  ->rhs[psp->nrhs-
104a0 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1];.        if( 
104b0 6d 73 70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49  msp->type!=MULTI
104c0 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
104d0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
104e0 62 6f 6c 20 2a 6f 72 69 67 73 70 20 3d 20 6d 73  bol *origsp = ms
104f0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70  p;.          msp
10500 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f   = (struct symbo
10510 6c 20 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69  l *) calloc(1,si
10520 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20 20 20  zeof(*msp));.   
10530 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 6d 73         memset(ms
10540 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6d 73  p, 0, sizeof(*ms
10550 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  p));.          m
10560 73 70 2d 3e 74 79 70 65 20 3d 20 4d 55 4c 54 49  sp->type = MULTI
10570 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 20 20  TERMINAL;.      
10580 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d      msp->nsubsym
10590 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
105a0 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73  msp->subsym = (s
105b0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29  truct symbol **)
105c0 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f 66   calloc(1,sizeof
105d0 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29  (struct symbol*)
105e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70  );.          msp
105f0 2d 3e 73 75 62 73 79 6d 5b 30 5d 20 3d 20 6f 72  ->subsym[0] = or
10600 69 67 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20  igsp;.          
10610 6d 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f 72 69 67  msp->name = orig
10620 73 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20 20 20  sp->name;.      
10630 20 20 20 20 70 73 70 2d 3e 72 68 73 5b 70 73 70      psp->rhs[psp
10640 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d 73 70 3b  ->nrhs-1] = msp;
10650 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10660 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b     msp->nsubsym+
10670 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e  +;.        msp->
10680 73 75 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74  subsym = (struct
10690 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61 6c   symbol **) real
106a0 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c  loc(msp->subsym,
106b0 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f  .          sizeo
106c0 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a  f(struct symbol*
106d0 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29 3b  )*msp->nsubsym);
106e0 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75  .        msp->su
106f0 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73 79  bsym[msp->nsubsy
10700 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  m-1] = Symbol_ne
10710 77 28 26 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20  w(&x[1]);.      
10720 20 20 69 66 28 20 69 73 6c 6f 77 65 72 28 78 5b    if( islower(x[
10730 31 5d 29 20 7c 7c 20 69 73 6c 6f 77 65 72 28 6d  1]) || islower(m
10740 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e  sp->subsym[0]->n
10750 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  ame[0]) ){.     
10760 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
10770 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
10780 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
10790 20 20 20 20 20 20 20 20 20 20 22 43 61 6e 6e 6f            "Canno
107a0 74 20 66 6f 72 6d 20 61 20 63 6f 6d 70 6f 75 6e  t form a compoun
107b0 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 6e  d containing a n
107c0 6f 6e 2d 74 65 72 6d 69 6e 61 6c 22 29 3b 0a 20  on-terminal");. 
107d0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
107e0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
107f0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
10800 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 26 26  if( x[0]=='(' &&
10810 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a   psp->nrhs>0 ){.
10820 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
10830 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 31  te = RHS_ALIAS_1
10840 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10850 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
10860 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
10870 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
10880 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67            "Illeg
10890 61 6c 20 63 68 61 72 61 63 74 65 72 20 6f 6e 20  al character on 
108a0 52 48 53 20 6f 66 20 72 75 6c 65 3a 20 5c 22 25  RHS of rule: \"%
108b0 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  s\".",x);.      
108c0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
108d0 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
108e0 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
108f0 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
10900 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
10910 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52  reak;.    case R
10920 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20  HS_ALIAS_1:.    
10930 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b    if( isalpha(x[
10940 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
10950 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e  sp->alias[psp->n
10960 72 68 73 2d 31 5d 20 3d 20 78 3b 0a 20 20 20 20  rhs-1] = x;.    
10970 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
10980 20 52 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20   RHS_ALIAS_2;.  
10990 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
109a0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
109b0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
109c0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
109d0 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73        "\"%s\" is
109e0 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69   not a valid ali
109f0 61 73 20 66 6f 72 20 74 68 65 20 52 48 53 20 73  as for the RHS s
10a00 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c 6e 22 2c  ymbol \"%s\"\n",
10a10 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70  .          x,psp
10a20 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d  ->rhs[psp->nrhs-
10a30 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  1]->name);.     
10a40 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
10a50 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
10a60 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
10a70 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
10a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10a90 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
10aa0 52 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20  RHS_ALIAS_2:.   
10ab0 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27     if( x[0]==')'
10ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
10ad0 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b  >state = IN_RHS;
10ae0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10af0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
10b00 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
10b10 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
10b20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e           "Missin
10b30 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e  g \")\" followin
10b40 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65  g LHS alias name
10b50 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c   \"%s\".",psp->l
10b60 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  hsalias);.      
10b70 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
10b80 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
10b90 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
10ba0 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
10bb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
10bc0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
10bd0 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
10be0 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20 20 20 69  KEYWORD:.      i
10bf0 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  f( isalpha(x[0])
10c00 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
10c10 3e 64 65 63 6c 6b 65 79 77 6f 72 64 20 3d 20 78  >declkeyword = x
10c20 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64  ;.        psp->d
10c30 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 30 3b 0a  eclargslot = 0;.
10c40 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
10c50 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20 30 3b  llinenoslot = 0;
10c60 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e  .        psp->in
10c70 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
10c80 31 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  1;.        psp->
10c90 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
10ca0 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20  FOR_DECL_ARG;.  
10cb0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
10cc0 28 78 2c 22 6e 61 6d 65 22 29 3d 3d 30 20 29 7b  (x,"name")==0 ){
10cd0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10ce0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
10cf0 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65 29 3b 0a  psp->gp->name);.
10d00 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69            psp->i
10d10 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
10d20 20 30 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73   0;..}else if( s
10d30 74 72 63 6d 70 28 78 2c 22 69 6e 63 6c 75 64 65  trcmp(x,"include
10d40 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10d50 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
10d60 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
10d70 3e 69 6e 63 6c 75 64 65 29 3b 0a 09 7d 65 6c 73  >include);..}els
10d80 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10d90 63 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  code")==0 ){.   
10da0 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
10db0 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
10dc0 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64 65 29 3b  >gp->extracode);
10dd0 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63  ..}else if( strc
10de0 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 64 65 73 74  mp(x,"token_dest
10df0 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20  ructor")==0 ){. 
10e00 20 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 26 70 73 70  clargslot = &psp
10e20 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b  ->gp->tokendest;
10e30 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63  ..}else if( strc
10e40 6d 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 64 65  mp(x,"default_de
10e50 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b  structor")==0 ){
10e60 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10e70 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70  declargslot = &p
10e80 73 70 2d 3e 67 70 2d 3e 76 61 72 64 65 73 74 3b  sp->gp->vardest;
10e90 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63  ..}else if( strc
10ea0 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 70 72 65 66  mp(x,"token_pref
10eb0 69 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ix")==0 ){.     
10ec0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10ed0 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70  gslot = &psp->gp
10ee0 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20  ->tokenprefix;. 
10ef0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
10f00 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
10f10 30 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  0;..}else if( st
10f20 72 63 6d 70 28 78 2c 22 73 79 6e 74 61 78 5f 65  rcmp(x,"syntax_e
10f30 72 72 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  rror")==0 ){.   
10f40 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
10f50 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
10f60 3e 67 70 2d 3e 65 72 72 6f 72 29 3b 0a 09 7d 65  >gp->error);..}e
10f70 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
10f80 2c 22 70 61 72 73 65 5f 61 63 63 65 70 74 22 29  ,"parse_accept")
10f90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10fa0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10fb0 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61  t = &(psp->gp->a
10fc0 63 63 65 70 74 29 3b 0a 09 7d 65 6c 73 65 20 69  ccept);..}else i
10fd0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 70 61 72  f( strcmp(x,"par
10fe0 73 65 5f 66 61 69 6c 75 72 65 22 29 3d 3d 30 20  se_failure")==0 
10ff0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
11000 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
11010 26 28 70 73 70 2d 3e 67 70 2d 3e 66 61 69 6c 75  &(psp->gp->failu
11020 72 65 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  re);..}else if( 
11030 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f  strcmp(x,"stack_
11040 6f 76 65 72 66 6c 6f 77 22 29 3d 3d 30 20 29 7b  overflow")==0 ){
11050 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11060 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
11070 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66 6c 6f  psp->gp->overflo
11080 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  w);.        }els
11090 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
110a0 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74 22 29  extra_argument")
110b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
110c0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
110d0 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61  t = &(psp->gp->a
110e0 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  rg);.          p
110f0 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
11100 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
11110 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
11120 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70 65 22  p(x,"token_type"
11130 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11140 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
11150 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
11160 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20 20 20  tokentype);.    
11170 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72        psp->inser
11180 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a  tLineMacro = 0;.
11190 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
111a0 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66 61  ( strcmp(x,"defa
111b0 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b  ult_type")==0 ){
111c0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
111d0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
111e0 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79 70 65  psp->gp->vartype
111f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
11200 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
11210 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  o = 0;.        }
11220 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11230 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22 29 3d  x,"stack_size")=
11240 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11250 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
11260 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74   = &(psp->gp->st
11270 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  acksize);.      
11280 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
11290 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20  ineMacro = 0;.  
112a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
112b0 73 74 72 63 6d 70 28 78 2c 22 73 74 61 72 74 5f  strcmp(x,"start_
112c0 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b 0a 20  symbol")==0 ){. 
112d0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
112e0 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
112f0 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b 0a 20  p->gp->start);. 
11300 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
11310 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
11320 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
11330 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6c   if( strcmp(x,"l
11340 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eft")==0 ){.    
11350 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63        psp->precc
11360 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
11370 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73      psp->declass
11380 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20 20 20 20  oc = LEFT;.     
11390 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
113a0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52  = WAITING_FOR_PR
113b0 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b  ECEDENCE_SYMBOL;
113c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
113d0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 72 69 67  f( strcmp(x,"rig
113e0 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ht")==0 ){.     
113f0 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f       psp->precco
11400 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20  unter++;.       
11410 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f     psp->declasso
11420 63 20 3d 20 52 49 47 48 54 3b 0a 20 20 20 20 20  c = RIGHT;.     
11430 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11440 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52  = WAITING_FOR_PR
11450 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b  ECEDENCE_SYMBOL;
11460 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11470 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 6f 6e  f( strcmp(x,"non
11480 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b 0a 20 20  assoc")==0 ){.  
11490 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
114a0 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  ccounter++;.    
114b0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
114c0 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20 20 20  ssoc = NONE;.   
114d0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
114e0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
114f0 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
11500 4c 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  L;..}else if( st
11510 72 63 6d 70 28 78 2c 22 64 65 73 74 72 75 63 74  rcmp(x,"destruct
11520 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  or")==0 ){.     
11530 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11540 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
11550 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3b  STRUCTOR_SYMBOL;
11560 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63  ..}else if( strc
11570 6d 70 28 78 2c 22 74 79 70 65 22 29 3d 3d 30 20  mp(x,"type")==0 
11580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
11590 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
115a0 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53  G_FOR_DATATYPE_S
115b0 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d  YMBOL;.        }
115c0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
115d0 78 2c 22 66 61 6c 6c 62 61 63 6b 22 29 3d 3d 30  x,"fallback")==0
115e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
115f0 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  p->fallback = 0;
11600 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11610 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
11620 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3b  FOR_FALLBACK_ID;
11630 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11640 66 28 20 73 74 72 63 6d 70 28 78 2c 22 77 69 6c  f( strcmp(x,"wil
11650 64 63 61 72 64 22 29 3d 3d 30 20 29 7b 0a 20 20  dcard")==0 ){.  
11660 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11670 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
11680 5f 57 49 4c 44 43 41 52 44 5f 49 44 3b 0a 20 20  _WILDCARD_ID;.  
11690 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
116a0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
116b0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
116c0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
116d0 20 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 6b              "Unk
116e0 6e 6f 77 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  nown declaration
116f0 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25 25 25 73   keyword: \"%%%s
11700 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  \".",x);.       
11710 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
11720 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
11730 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
11740 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
11750 4f 52 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c  OR;..}.      }el
11760 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
11770 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
11780 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
11790 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
117a0 49 6c 6c 65 67 61 6c 20 64 65 63 6c 61 72 61 74  Illegal declarat
117b0 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25  ion keyword: \"%
117c0 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  s\".",x);.      
117d0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
117e0 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
117f0 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
11800 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
11810 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
11820 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
11830 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52  AITING_FOR_DESTR
11840 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3a 0a 20 20  UCTOR_SYMBOL:.  
11850 20 20 20 20 69 66 28 20 21 69 73 61 6c 70 68 61      if( !isalpha
11860 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
11870 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
11880 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
11890 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
118a0 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d       "Symbol nam
118b0 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20  e missing after 
118c0 25 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79  %%destructor key
118d0 77 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20  word");.        
118e0 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
118f0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
11900 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
11910 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
11920 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11930 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
11940 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e  l *sp = Symbol_n
11950 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ew(x);.        p
11960 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
11970 3d 20 26 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  = &sp->destructo
11980 72 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  r;.        psp->
11990 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d  decllinenoslot =
119a0 20 26 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f   &sp->destLineno
119b0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69  ;.        psp->i
119c0 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
119d0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   1;.        psp-
119e0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
119f0 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20  _FOR_DECL_ARG;. 
11a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
11a10 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
11a20 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50  TING_FOR_DATATYP
11a30 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20  E_SYMBOL:.      
11a40 69 66 28 20 21 69 73 61 6c 70 68 61 28 78 5b 30  if( !isalpha(x[0
11a50 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]) ){.        Er
11a60 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
11a70 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
11a80 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
11a90 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69   "Symbol name mi
11aa0 73 73 69 6e 67 20 61 66 74 65 72 20 25 25 74 79  ssing after %%ty
11ab0 70 65 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20  pe keyword");.  
11ac0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
11ad0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
11ae0 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
11af0 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
11b00 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
11b10 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
11b20 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79   symbol *sp = Sy
11b30 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20  mbol_find(x);.  
11b40 20 20 20 20 20 20 69 66 28 28 73 70 29 20 26 26        if((sp) &&
11b50 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65 29 29   (sp->datatype))
11b60 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
11b70 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
11b80 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
11b90 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
11ba0 20 22 53 79 6d 62 6f 6c 20 25 25 74 79 70 65 20   "Symbol %%type 
11bb0 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20 64  \"%s\" already d
11bc0 65 66 69 6e 65 64 22 2c 20 78 29 3b 0a 20 20 20  efined", x);.   
11bd0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
11be0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
11bf0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
11c00 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
11c10 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
11c20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
11c30 20 69 66 20 28 21 73 70 29 7b 0a 20 20 20 20 20   if (!sp){.     
11c40 20 20 20 20 20 20 20 73 70 20 3d 20 53 79 6d 62         sp = Symb
11c50 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
11c60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
11c70 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
11c80 74 20 3d 20 26 73 70 2d 3e 64 61 74 61 74 79 70  t = &sp->datatyp
11c90 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  e;.          psp
11ca0 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
11cb0 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  o = 0;.         
11cc0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
11cd0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
11ce0 52 47 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  RG;.        }.  
11cf0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
11d00 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
11d10 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
11d20 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20  CE_SYMBOL:.     
11d30 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
11d40 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
11d50 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
11d60 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
11d70 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
11d80 20 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29   isupper(x[0]) )
11d90 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
11da0 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 20   symbol *sp;.   
11db0 20 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c       sp = Symbol
11dc0 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
11dd0 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30   if( sp->prec>=0
11de0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72   ){.          Er
11df0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
11e00 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
11e10 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
11e20 20 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c     "Symbol \"%s\
11e30 22 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  " has already be
11e40 20 67 69 76 65 6e 20 61 20 70 72 65 63 65 64 65   given a precede
11e50 6e 63 65 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  nce.",x);.      
11e60 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
11e70 74 2b 2b 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20  t++;..}else{.   
11e80 20 20 20 20 20 20 20 73 70 2d 3e 70 72 65 63 20         sp->prec 
11e90 3d 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74  = psp->preccount
11ea0 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 70  er;.          sp
11eb0 2d 3e 61 73 73 6f 63 20 3d 20 70 73 70 2d 3e 64  ->assoc = psp->d
11ec0 65 63 6c 61 73 73 6f 63 3b 0a 09 7d 0a 20 20 20  eclassoc;..}.   
11ed0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11ee0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
11ef0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
11f00 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11f10 20 20 20 20 20 22 43 61 6e 27 74 20 61 73 73 69       "Can't assi
11f20 67 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65 20  gn a precedence 
11f30 74 6f 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a  to \"%s\".",x);.
11f40 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11f50 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
11f60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11f70 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
11f80 4f 52 5f 44 45 43 4c 5f 41 52 47 3a 0a 20 20 20  OR_DECL_ARG:.   
11f90 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27     if( x[0]=='{'
11fa0 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c   || x[0]=='\"' |
11fb0 7c 20 69 73 61 6c 6e 75 6d 28 78 5b 30 5d 29 20  | isalnum(x[0]) 
11fc0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
11fd0 20 63 68 61 72 20 2a 7a 4f 6c 64 2c 20 2a 7a 4e   char *zOld, *zN
11fe0 65 77 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  ew;.        char
11ff0 20 2a 7a 42 75 66 2c 20 2a 7a 3b 0a 20 20 20 20   *zBuf, *z;.    
12000 20 20 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 6e 2c      int nOld, n,
12010 20 6e 4c 69 6e 65 2c 20 6e 4e 65 77 2c 20 6e 42   nLine, nNew, nB
12020 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ack;.        int
12030 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 3b 0a 20   addLineMacro;. 
12040 20 20 20 20 20 20 20 63 68 61 72 20 7a 4c 69 6e         char zLin
12050 65 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20 7a  e[50];.        z
12060 4e 65 77 20 3d 20 78 3b 0a 20 20 20 20 20 20 20  New = x;.       
12070 20 69 66 28 20 7a 4e 65 77 5b 30 5d 3d 3d 27 22   if( zNew[0]=='"
12080 27 20 7c 7c 20 7a 4e 65 77 5b 30 5d 3d 3d 27 7b  ' || zNew[0]=='{
12090 27 20 29 20 7a 4e 65 77 2b 2b 3b 0a 20 20 20 20  ' ) zNew++;.    
120a0 20 20 20 20 6e 4e 65 77 20 3d 20 6c 65 6d 6f 6e      nNew = lemon
120b0 53 74 72 6c 65 6e 28 7a 4e 65 77 29 3b 0a 20 20  Strlen(zNew);.  
120c0 20 20 20 20 20 20 69 66 28 20 2a 70 73 70 2d 3e        if( *psp->
120d0 64 65 63 6c 61 72 67 73 6c 6f 74 20 29 7b 0a 20  declargslot ){. 
120e0 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20           zOld = 
120f0 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f  *psp->declargslo
12100 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
12110 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64  {.          zOld
12120 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 7d   = "";.        }
12130 0a 20 20 20 20 20 20 20 20 6e 4f 6c 64 20 3d 20  .        nOld = 
12140 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4f 6c 64  lemonStrlen(zOld
12150 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 6e  );.        n = n
12160 4f 6c 64 20 2b 20 6e 4e 65 77 20 2b 20 32 30 3b  Old + nNew + 20;
12170 0a 20 20 20 20 20 20 20 20 61 64 64 4c 69 6e 65  .        addLine
12180 4d 61 63 72 6f 20 3d 20 21 70 73 70 2d 3e 67 70  Macro = !psp->gp
12190 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20  ->nolinenosflag 
121a0 26 26 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69  && psp->insertLi
121b0 6e 65 4d 61 63 72 6f 20 26 26 0a 20 20 20 20 20  neMacro &&.     
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121d0 20 20 20 28 70 73 70 2d 3e 64 65 63 6c 6c 69 6e     (psp->decllin
121e0 65 6e 6f 73 6c 6f 74 3d 3d 30 20 7c 7c 20 70 73  enoslot==0 || ps
121f0 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f  p->decllinenoslo
12200 74 5b 30 5d 21 3d 30 29 3b 0a 20 20 20 20 20 20  t[0]!=0);.      
12210 20 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61 63    if( addLineMac
12220 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ro ){.          
12230 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e  for(z=psp->filen
12240 61 6d 65 2c 20 6e 42 61 63 6b 3d 30 3b 20 2a 7a  ame, nBack=0; *z
12250 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; z++){.        
12260 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27      if( *z=='\\'
12270 20 29 20 6e 42 61 63 6b 2b 2b 3b 0a 20 20 20 20   ) nBack++;.    
12280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12290 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c    sprintf(zLine,
122a0 20 22 23 6c 69 6e 65 20 25 64 20 22 2c 20 70 73   "#line %d ", ps
122b0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 29 3b  p->tokenlineno);
122c0 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65  .          nLine
122d0 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a   = lemonStrlen(z
122e0 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Line);.         
122f0 20 6e 20 2b 3d 20 6e 4c 69 6e 65 20 2b 20 6c 65   n += nLine + le
12300 6d 6f 6e 53 74 72 6c 65 6e 28 70 73 70 2d 3e 66  monStrlen(psp->f
12310 69 6c 65 6e 61 6d 65 29 20 2b 20 6e 42 61 63 6b  ilename) + nBack
12320 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12330 20 20 20 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72      *psp->declar
12340 67 73 6c 6f 74 20 3d 20 28 63 68 61 72 20 2a 29  gslot = (char *)
12350 20 72 65 61 6c 6c 6f 63 28 2a 70 73 70 2d 3e 64   realloc(*psp->d
12360 65 63 6c 61 72 67 73 6c 6f 74 2c 20 6e 29 3b 0a  eclargslot, n);.
12370 20 20 20 20 20 20 20 20 7a 42 75 66 20 3d 20 2a          zBuf = *
12380 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
12390 20 2b 20 6e 4f 6c 64 3b 0a 20 20 20 20 20 20 20   + nOld;.       
123a0 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61 63 72   if( addLineMacr
123b0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  o ){.          i
123c0 66 28 20 6e 4f 6c 64 20 26 26 20 7a 42 75 66 5b  f( nOld && zBuf[
123d0 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  -1]!='\n' ){.   
123e0 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b           *(zBuf+
123f0 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20  +) = '\n';.     
12400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12410 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c   memcpy(zBuf, zL
12420 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20  ine, nLine);.   
12430 20 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e         zBuf += n
12440 4c 69 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Line;.          
12450 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22 27 3b  *(zBuf++) = '"';
12460 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 7a  .          for(z
12470 3d 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 3b 20  =psp->filename; 
12480 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20  *z; z++){.      
12490 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c        if( *z=='\
124a0 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  \' ){.          
124b0 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20      *(zBuf++) = 
124c0 27 5c 5c 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\\';.          
124d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
124e0 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 2a 7a 3b 0a  *(zBuf++) = *z;.
124f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12500 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20        *(zBuf++) 
12510 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 20 20 20  = '"';.         
12520 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e   *(zBuf++) = '\n
12530 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
12540 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 64 65       if( psp->de
12550 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 26 26 20  cllinenoslot && 
12560 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73  psp->decllinenos
12570 6c 6f 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  lot[0]==0 ){.   
12580 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
12590 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 20 3d 20  linenoslot[0] = 
125a0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
125b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
125c0 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c      memcpy(zBuf,
125d0 20 7a 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20   zNew, nNew);.  
125e0 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4e        zBuf += nN
125f0 65 77 3b 0a 20 20 20 20 20 20 20 20 2a 7a 42 75  ew;.        *zBu
12600 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  f = 0;.        p
12610 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
12620 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
12630 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RULE;.      }els
12640 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
12650 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
12660 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
12670 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49  no,.          "I
12680 6c 6c 65 67 61 6c 20 61 72 67 75 6d 65 6e 74 20  llegal argument 
12690 74 6f 20 25 25 25 73 3a 20 25 73 22 2c 70 73 70  to %%%s: %s",psp
126a0 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 2c 78 29  ->declkeyword,x)
126b0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
126c0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
126d0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
126e0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
126f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
12700 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12710 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
12720 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3a 0a  OR_FALLBACK_ID:.
12730 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
12740 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '.' ){.        p
12750 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
12760 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
12770 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RULE;.      }els
12780 65 20 69 66 28 20 21 69 73 75 70 70 65 72 28 78  e if( !isupper(x
12790 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
127a0 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
127b0 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b  lename, psp->tok
127c0 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
127d0 20 20 20 20 22 25 25 66 61 6c 6c 62 61 63 6b 20      "%%fallback 
127e0 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20  argument \"%s\" 
127f0 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65  should be a toke
12800 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  n", x);.        
12810 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
12820 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12830 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
12840 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c  bol *sp = Symbol
12850 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
12860 20 69 66 28 20 70 73 70 2d 3e 66 61 6c 6c 62 61   if( psp->fallba
12870 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
12880 20 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b     psp->fallback
12890 20 3d 20 73 70 3b 0a 20 20 20 20 20 20 20 20 7d   = sp;.        }
128a0 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 66 61 6c  else if( sp->fal
128b0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
128c0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
128d0 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e  >filename, psp->
128e0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
128f0 20 20 20 20 20 20 20 20 20 22 4d 6f 72 65 20 74           "More t
12900 68 61 6e 20 6f 6e 65 20 66 61 6c 6c 62 61 63 6b  han one fallback
12910 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 6f 6b   assigned to tok
12920 65 6e 20 25 73 22 2c 20 78 29 3b 0a 20 20 20 20  en %s", x);.    
12930 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
12940 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
12950 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
12960 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 70  sp->fallback = p
12970 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3b 0a 20 20  sp->fallback;.  
12980 20 20 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d          psp->gp-
12990 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 3d 20  >has_fallback = 
129a0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
129b0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
129c0 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
129d0 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f  NG_FOR_WILDCARD_
129e0 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  ID:.      if( x[
129f0 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  0]=='.' ){.     
12a00 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
12a10 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
12a20 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20  _OR_RULE;.      
12a30 7d 65 6c 73 65 20 69 66 28 20 21 69 73 75 70 70  }else if( !isupp
12a40 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  er(x[0]) ){.    
12a50 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
12a60 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d  ->filename, psp-
12a70 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
12a80 20 20 20 20 20 20 20 20 22 25 25 77 69 6c 64 63          "%%wildc
12a90 61 72 64 20 61 72 67 75 6d 65 6e 74 20 5c 22 25  ard argument \"%
12aa0 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61 20  s\" should be a 
12ab0 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20  token", x);.    
12ac0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
12ad0 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  t++;.      }else
12ae0 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
12af0 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79   symbol *sp = Sy
12b00 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
12b10 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 67 70       if( psp->gp
12b20 2d 3e 77 69 6c 64 63 61 72 64 3d 3d 30 20 29 7b  ->wildcard==0 ){
12b30 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12b40 67 70 2d 3e 77 69 6c 64 63 61 72 64 20 3d 20 73  gp->wildcard = s
12b50 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
12b60 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
12b70 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
12b80 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
12b90 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
12ba0 20 20 22 45 78 74 72 61 20 77 69 6c 64 63 61 72    "Extra wildcar
12bb0 64 20 74 6f 20 74 6f 6b 65 6e 3a 20 25 73 22 2c  d to token: %s",
12bc0 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   x);.          p
12bd0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
12be0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12bf0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
12c00 20 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41     case RESYNC_A
12c10 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3a  FTER_RULE_ERROR:
12c20 0a 2f 2a 20 20 20 20 20 20 69 66 28 20 78 5b 30  ./*      if( x[0
12c30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73 74  ]=='.' ) psp->st
12c40 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
12c50 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
12c60 2a 2a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 2a  **      break; *
12c70 2f 0a 20 20 20 20 63 61 73 65 20 52 45 53 59 4e  /.    case RESYN
12c80 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
12c90 4f 52 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  OR:.      if( x[
12ca0 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73  0]=='.' ) psp->s
12cb0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
12cc0 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
12cd0 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
12ce0 3d 27 25 27 20 29 20 70 73 70 2d 3e 73 74 61 74  ='%' ) psp->stat
12cf0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
12d00 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20  DECL_KEYWORD;.  
12d10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d      break;.  }.}
12d20 0a 0a 2f 2a 20 52 75 6e 20 74 68 65 20 70 72 65  ../* Run the pre
12d30 70 72 6f 63 65 73 73 6f 72 20 6f 76 65 72 20 74  processor over t
12d40 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 74 65  he input file te
12d50 78 74 2e 20 20 54 68 65 20 67 6c 6f 62 61 6c 20  xt.  The global 
12d60 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 61 7a 44  variables.** azD
12d70 65 66 69 6e 65 5b 30 5d 20 74 68 72 6f 75 67 68  efine[0] through
12d80 20 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69 6e   azDefine[nDefin
12d90 65 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68  e-1] contains th
12da0 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 64  e names of all d
12db0 65 66 69 6e 65 64 0a 2a 2a 20 6d 61 63 72 6f 73  efined.** macros
12dc0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
12dd0 6c 6f 6f 6b 73 20 66 6f 72 20 22 25 69 66 64 65  looks for "%ifde
12de0 66 22 20 61 6e 64 20 22 25 69 66 6e 64 65 66 22  f" and "%ifndef"
12df0 20 61 6e 64 20 22 25 65 6e 64 69 66 22 20 61 6e   and "%endif" an
12e00 64 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73 20 74 68  d.** comments th
12e10 65 6d 20 6f 75 74 2e 20 20 54 65 78 74 20 69 6e  em out.  Text in
12e20 20 62 65 74 77 65 65 6e 20 69 73 20 61 6c 73 6f   between is also
12e30 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 20 61   commented out a
12e40 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a  s appropriate..*
12e50 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
12e60 65 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 63  eprocess_input(c
12e70 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
12e80 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 69 6e 74  , j, k, n;.  int
12e90 20 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20   exclude = 0;.  
12ea0 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20  int start = 0;. 
12eb0 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b   int lineno = 1;
12ec0 0a 20 20 69 6e 74 20 73 74 61 72 74 5f 6c 69 6e  .  int start_lin
12ed0 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  eno = 1;.  for(i
12ee0 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
12ef0 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c      if( z[i]=='\
12f00 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n' ) lineno++;. 
12f10 20 20 20 69 66 28 20 7a 5b 69 5d 21 3d 27 25 27     if( z[i]!='%'
12f20 20 7c 7c 20 28 69 3e 30 20 26 26 20 7a 5b 69 2d   || (i>0 && z[i-
12f30 31 5d 21 3d 27 5c 6e 27 29 20 29 20 63 6f 6e 74  1]!='\n') ) cont
12f40 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74  inue;.    if( st
12f50 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 65 6e  rncmp(&z[i],"%en
12f60 64 69 66 22 2c 36 29 3d 3d 30 20 26 26 20 69 73  dif",6)==0 && is
12f70 73 70 61 63 65 28 7a 5b 69 2b 36 5d 29 20 29 7b  space(z[i+6]) ){
12f80 0a 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75  .      if( exclu
12f90 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78  de ){.        ex
12fa0 63 6c 75 64 65 2d 2d 3b 0a 20 20 20 20 20 20 20  clude--;.       
12fb0 20 69 66 28 20 65 78 63 6c 75 64 65 3d 3d 30 20   if( exclude==0 
12fc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
12fd0 28 6a 3d 73 74 61 72 74 3b 20 6a 3c 69 3b 20 6a  (j=start; j<i; j
12fe0 2b 2b 29 20 69 66 28 20 7a 5b 6a 5d 21 3d 27 5c  ++) if( z[j]!='\
12ff0 6e 27 20 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b  n' ) z[j] = ' ';
13000 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13010 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69   }.      for(j=i
13020 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d  ; z[j] && z[j]!=
13030 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20  '\n'; j++) z[j] 
13040 3d 20 27 20 27 3b 0a 20 20 20 20 7d 65 6c 73 65  = ' ';.    }else
13050 20 69 66 28 20 28 73 74 72 6e 63 6d 70 28 26 7a   if( (strncmp(&z
13060 5b 69 5d 2c 22 25 69 66 64 65 66 22 2c 36 29 3d  [i],"%ifdef",6)=
13070 3d 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b  =0 && isspace(z[
13080 69 2b 36 5d 29 29 0a 20 20 20 20 20 20 20 20 20  i+6])).         
13090 20 7c 7c 20 28 73 74 72 6e 63 6d 70 28 26 7a 5b   || (strncmp(&z[
130a0 69 5d 2c 22 25 69 66 6e 64 65 66 22 2c 37 29 3d  i],"%ifndef",7)=
130b0 3d 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b  =0 && isspace(z[
130c0 69 2b 37 5d 29 29 20 29 7b 0a 20 20 20 20 20 20  i+7])) ){.      
130d0 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20  if( exclude ){. 
130e0 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 2b 2b         exclude++
130f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13100 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 37         for(j=i+7
13110 3b 20 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29 3b  ; isspace(z[j]);
13120 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   j++){}.        
13130 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6a 2b 6e 5d 20  for(n=0; z[j+n] 
13140 26 26 20 21 69 73 73 70 61 63 65 28 7a 5b 6a 2b  && !isspace(z[j+
13150 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  n]); n++){}.    
13160 20 20 20 20 65 78 63 6c 75 64 65 20 3d 20 31 3b      exclude = 1;
13170 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  .        for(k=0
13180 3b 20 6b 3c 6e 44 65 66 69 6e 65 3b 20 6b 2b 2b  ; k<nDefine; k++
13190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
131a0 20 73 74 72 6e 63 6d 70 28 61 7a 44 65 66 69 6e   strncmp(azDefin
131b0 65 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e 29 3d 3d 30  e[k],&z[j],n)==0
131c0 20 26 26 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28   && lemonStrlen(
131d0 61 7a 44 65 66 69 6e 65 5b 6b 5d 29 3d 3d 6e 20  azDefine[k])==n 
131e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  ){.            e
131f0 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20 20 20  xclude = 0;.    
13200 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13210 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13220 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
13230 20 7a 5b 69 2b 33 5d 3d 3d 27 6e 27 20 29 20 65   z[i+3]=='n' ) e
13240 78 63 6c 75 64 65 20 3d 20 21 65 78 63 6c 75 64  xclude = !exclud
13250 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  e;.        if( e
13260 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20 20  xclude ){.      
13270 20 20 20 20 73 74 61 72 74 20 3d 20 69 3b 0a 20      start = i;. 
13280 20 20 20 20 20 20 20 20 20 73 74 61 72 74 5f 6c           start_l
13290 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a  ineno = lineno;.
132a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
132b0 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b  }.      for(j=i;
132c0 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27   z[j] && z[j]!='
132d0 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d  \n'; j++) z[j] =
132e0 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   ' ';.    }.  }.
132f0 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b    if( exclude ){
13300 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
13310 65 72 72 2c 22 75 6e 74 65 72 6d 69 6e 61 74 65  err,"unterminate
13320 64 20 25 25 69 66 64 65 66 20 73 74 61 72 74 69  d %%ifdef starti
13330 6e 67 20 6f 6e 20 6c 69 6e 65 20 25 64 5c 6e 22  ng on line %d\n"
13340 2c 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 29 3b  , start_lineno);
13350 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
13360 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20 73 70 69 74 65  }.}../* In spite
13370 20 6f 66 20 69 74 73 20 6e 61 6d 65 2c 20 74 68   of its name, th
13380 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  is function is r
13390 65 61 6c 6c 79 20 61 20 73 63 61 6e 6e 65 72 2e  eally a scanner.
133a0 20 20 49 74 20 72 65 61 64 0a 2a 2a 20 69 6e 20    It read.** in 
133b0 74 68 65 20 65 6e 74 69 72 65 20 69 6e 70 75 74  the entire input
133c0 20 66 69 6c 65 20 28 61 6c 6c 20 61 74 20 6f 6e   file (all at on
133d0 63 65 29 20 74 68 65 6e 20 74 6f 6b 65 6e 69 7a  ce) then tokeniz
133e0 65 73 20 69 74 2e 20 20 45 61 63 68 0a 2a 2a 20  es it.  Each.** 
133f0 74 6f 6b 65 6e 20 69 73 20 70 61 73 73 65 64 20  token is passed 
13400 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
13410 22 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 22 20  "parseonetoken" 
13420 77 68 69 63 68 20 62 75 69 6c 64 73 20 61 6c 6c  which builds all
13430 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69  .** the appropri
13440 61 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ate data structu
13450 72 65 73 20 69 6e 20 74 68 65 20 67 6c 6f 62 61  res in the globa
13460 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 22  l state vector "
13470 67 70 22 2e 0a 2a 2f 0a 76 6f 69 64 20 50 61 72  gp"..*/.void Par
13480 73 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  se(struct lemon 
13490 2a 67 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  *gp).{.  struct 
134a0 70 73 74 61 74 65 20 70 73 3b 0a 20 20 46 49 4c  pstate ps;.  FIL
134b0 45 20 2a 66 70 3b 0a 20 20 63 68 61 72 20 2a 66  E *fp;.  char *f
134c0 69 6c 65 62 75 66 3b 0a 20 20 69 6e 74 20 66 69  ilebuf;.  int fi
134d0 6c 65 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69  lesize;.  int li
134e0 6e 65 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20  neno;.  int c;. 
134f0 20 63 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74   char *cp, *next
13500 63 70 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c  cp;.  int startl
13510 69 6e 65 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73  ine = 0;..  mems
13520 65 74 28 26 70 73 2c 20 27 5c 30 27 2c 20 73 69  et(&ps, '\0', si
13530 7a 65 6f 66 28 70 73 29 29 3b 0a 20 20 70 73 2e  zeof(ps));.  ps.
13540 67 70 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66 69  gp = gp;.  ps.fi
13550 6c 65 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69 6c  lename = gp->fil
13560 65 6e 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72 6f  ename;.  ps.erro
13570 72 63 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e 73  rcnt = 0;.  ps.s
13580 74 61 74 65 20 3d 20 49 4e 49 54 49 41 4c 49 5a  tate = INITIALIZ
13590 45 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62  E;..  /* Begin b
135a0 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 69 6e  y reading the in
135b0 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66 70  put file */.  fp
135c0 20 3d 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c 65   = fopen(ps.file
135d0 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66  name,"rb");.  if
135e0 28 20 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 45  ( fp==0 ){.    E
135f0 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e  rrorMsg(ps.filen
13600 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70 65  ame,0,"Can't ope
13610 6e 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20  n this file for 
13620 72 65 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20 20  reading.");.    
13630 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  gp->errorcnt++;.
13640 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
13650 20 20 66 73 65 65 6b 28 66 70 2c 30 2c 32 29 3b    fseek(fp,0,2);
13660 0a 20 20 66 69 6c 65 73 69 7a 65 20 3d 20 66 74  .  filesize = ft
13670 65 6c 6c 28 66 70 29 3b 0a 20 20 72 65 77 69 6e  ell(fp);.  rewin
13680 64 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66  d(fp);.  filebuf
13690 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f   = (char *)mallo
136a0 63 28 20 66 69 6c 65 73 69 7a 65 2b 31 20 29 3b  c( filesize+1 );
136b0 0a 20 20 69 66 28 20 66 69 6c 65 62 75 66 3d 3d  .  if( filebuf==
136c0 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73  0 ){.    ErrorMs
136d0 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c  g(ps.filename,0,
136e0 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20  "Can't allocate 
136f0 25 64 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  %d of memory to 
13700 68 6f 6c 64 20 74 68 69 73 20 66 69 6c 65 2e 22  hold this file."
13710 2c 0a 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65  ,.      filesize
13720 2b 31 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72  +1);.    gp->err
13730 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 66 63 6c  orcnt++;.    fcl
13740 6f 73 65 28 66 70 29 3b 0a 20 20 20 20 72 65 74  ose(fp);.    ret
13750 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  urn;.  }.  if( f
13760 72 65 61 64 28 66 69 6c 65 62 75 66 2c 31 2c 66  read(filebuf,1,f
13770 69 6c 65 73 69 7a 65 2c 66 70 29 21 3d 66 69 6c  ilesize,fp)!=fil
13780 65 73 69 7a 65 20 29 7b 0a 20 20 20 20 45 72 72  esize ){.    Err
13790 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d  orMsg(ps.filenam
137a0 65 2c 30 2c 22 43 61 6e 27 74 20 72 65 61 64 20  e,0,"Can't read 
137b0 69 6e 20 61 6c 6c 20 25 64 20 62 79 74 65 73 20  in all %d bytes 
137c0 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a  of this file.",.
137d0 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65 29 3b        filesize);
137e0 0a 20 20 20 20 66 72 65 65 28 66 69 6c 65 62 75  .    free(filebu
137f0 66 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f  f);.    gp->erro
13800 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 66 63 6c 6f  rcnt++;.    fclo
13810 73 65 28 66 70 29 3b 0a 20 20 20 20 72 65 74 75  se(fp);.    retu
13820 72 6e 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  rn;.  }.  fclose
13830 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 5b  (fp);.  filebuf[
13840 66 69 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a  filesize] = 0;..
13850 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 69 6e 69    /* Make an ini
13860 74 69 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67  tial pass throug
13870 68 20 74 68 65 20 66 69 6c 65 20 74 6f 20 68 61  h the file to ha
13880 6e 64 6c 65 20 25 69 66 64 65 66 20 61 6e 64 20  ndle %ifdef and 
13890 25 69 66 6e 64 65 66 20 2a 2f 0a 20 20 70 72 65  %ifndef */.  pre
138a0 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 66 69  process_input(fi
138b0 6c 65 62 75 66 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  lebuf);..  /* No
138c0 77 20 73 63 61 6e 20 74 68 65 20 74 65 78 74 20  w scan the text 
138d0 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
138e0 65 20 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20  e */.  lineno = 
138f0 31 3b 0a 20 20 66 6f 72 28 63 70 3d 66 69 6c 65  1;.  for(cp=file
13900 62 75 66 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30  buf; (c= *cp)!=0
13910 3b 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ; ){.    if( c==
13920 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
13930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13940 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
13950 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a  he line number *
13960 2f 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63  /.    if( isspac
13970 65 28 63 29 20 29 7b 20 63 70 2b 2b 3b 20 63 6f  e(c) ){ cp++; co
13980 6e 74 69 6e 75 65 3b 20 7d 20 20 2f 2a 20 53 6b  ntinue; }  /* Sk
13990 69 70 20 61 6c 6c 20 77 68 69 74 65 20 73 70 61  ip all white spa
139a0 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d  ce */.    if( c=
139b0 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='/' && cp[1]=='
139c0 2f 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f  /' ){          /
139d0 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65  * Skip C++ style
139e0 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   comments */.   
139f0 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20     cp+=2;.      
13a00 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
13a10 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20  =0 && c!='\n' ) 
13a20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74  cp++;.      cont
13a30 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
13a40 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70  if( c=='/' && cp
13a50 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 20 20 20  [1]=='*' ){     
13a60 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 20 73       /* Skip C s
13a70 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f  tyle comments */
13a80 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20  .      cp+=2;.  
13a90 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a      while( (c= *
13aa0 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f  cp)!=0 && (c!='/
13ab0 27 20 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a 27  ' || cp[-1]!='*'
13ac0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
13ad0 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e   c=='\n' ) linen
13ae0 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b  o++;.        cp+
13af0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
13b00 20 69 66 28 20 63 20 29 20 63 70 2b 2b 3b 0a 20   if( c ) cp++;. 
13b10 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
13b20 20 20 20 7d 0a 20 20 20 20 70 73 2e 74 6f 6b 65     }.    ps.toke
13b30 6e 73 74 61 72 74 20 3d 20 63 70 3b 20 20 20 20  nstart = cp;    
13b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
13b50 61 72 6b 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ark the beginnin
13b60 67 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 2a  g of the token *
13b70 2f 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 6c 69  /.    ps.tokenli
13b80 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20 20  neno = lineno;  
13b90 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
13ba0 6e 75 6d 62 65 72 20 6f 6e 20 77 68 69 63 68 20  number on which 
13bb0 74 6f 6b 65 6e 20 62 65 67 69 6e 73 20 2a 2f 0a  token begins */.
13bc0 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 22 27 20      if( c=='\"' 
13bd0 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
13be0 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
13bf0 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20   literals */.   
13c00 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 77     cp++;.      w
13c10 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
13c20 30 20 26 26 20 63 21 3d 27 5c 22 27 20 29 7b 0a  0 && c!='\"' ){.
13c30 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
13c40 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n' ) lineno++;.
13c50 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20          cp++;.  
13c60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13c70 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
13c80 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65  ErrorMsg(ps.file
13c90 6e 61 6d 65 2c 73 74 61 72 74 6c 69 6e 65 2c 0a  name,startline,.
13ca0 22 53 74 72 69 6e 67 20 73 74 61 72 74 69 6e 67  "String starting
13cb0 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73   on this line is
13cc0 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20   not terminated 
13cd0 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f  before the end o
13ce0 66 20 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20  f the file.");. 
13cf0 20 20 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63         ps.errorc
13d00 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65  nt++;.        ne
13d10 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20  xtcp = cp;.     
13d20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13d30 6e 65 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20  nextcp = cp+1;. 
13d40 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
13d50 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 7b 20 20   if( c=='{' ){  
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13d70 41 20 62 6c 6f 63 6b 20 6f 66 20 43 20 63 6f 64  A block of C cod
13d80 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c  e */.      int l
13d90 65 76 65 6c 3b 0a 20 20 20 20 20 20 63 70 2b 2b  evel;.      cp++
13da0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6c 65 76 65  ;.      for(leve
13db0 6c 3d 31 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30  l=1; (c= *cp)!=0
13dc0 20 26 26 20 28 6c 65 76 65 6c 3e 31 20 7c 7c 20   && (level>1 || 
13dd0 63 21 3d 27 7d 27 29 3b 20 63 70 2b 2b 29 7b 0a  c!='}'); cp++){.
13de0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
13df0 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n' ) lineno++;.
13e00 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
13e10 20 63 3d 3d 27 7b 27 20 29 20 6c 65 76 65 6c 2b   c=='{' ) level+
13e20 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20  +;.        else 
13e30 69 66 28 20 63 3d 3d 27 7d 27 20 29 20 6c 65 76  if( c=='}' ) lev
13e40 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 65 6c  el--;.        el
13e50 73 65 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26  se if( c=='/' &&
13e60 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20   cp[1]=='*' ){  
13e70 2f 2a 20 53 6b 69 70 20 63 6f 6d 6d 65 6e 74 73  /* Skip comments
13e80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
13e90 74 20 70 72 65 76 63 3b 0a 20 20 20 20 20 20 20  t prevc;.       
13ea0 20 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a     cp = &cp[2];.
13eb0 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20            prevc 
13ec0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = 0;.          w
13ed0 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
13ee0 30 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20  0 && (c!='/' || 
13ef0 70 72 65 76 63 21 3d 27 2a 27 29 20 29 7b 0a 20  prevc!='*') ){. 
13f00 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
13f10 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
13f20 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  +;.            p
13f30 72 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20  revc = c;.      
13f40 20 20 20 20 20 20 63 70 2b 2b 3b 0a 09 20 20 7d        cp++;..  }
13f50 0a 09 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27  ..}else if( c=='
13f60 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27  /' && cp[1]=='/'
13f70 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b   ){  /* Skip C++
13f80 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20   style comments 
13f90 74 6f 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  too */.         
13fa0 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20   cp = &cp[2];.  
13fb0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
13fc0 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21  c= *cp)!=0 && c!
13fd0 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20  ='\n' ) cp++;.  
13fe0 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 20          if( c ) 
13ff0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 09 7d 65 6c 73 65  lineno++;..}else
14000 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20   if( c=='\'' || 
14010 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a  c=='\"' ){    /*
14020 20 53 74 72 69 6e 67 20 61 20 63 68 61 72 61 63   String a charac
14030 74 65 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a  ter literals */.
14040 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 73 74            int st
14050 61 72 74 63 68 61 72 2c 20 70 72 65 76 63 3b 0a  artchar, prevc;.
14060 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 63            startc
14070 68 61 72 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  har = c;.       
14080 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20     prevc = 0;.  
14090 20 20 20 20 20 20 20 20 66 6f 72 28 63 70 2b 2b          for(cp++
140a0 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ; (c= *cp)!=0 &&
140b0 20 28 63 21 3d 73 74 61 72 74 63 68 61 72 20 7c   (c!=startchar |
140c0 7c 20 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20  | prevc=='\\'); 
140d0 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  cp++){.         
140e0 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
140f0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
14100 20 20 20 20 20 20 20 69 66 28 20 70 72 65 76 63         if( prevc
14110 3d 3d 27 5c 5c 27 20 29 20 70 72 65 76 63 20 3d  =='\\' ) prevc =
14120 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
14130 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
14140 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 09 20 20    prevc = c;..  
14150 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20  }..}.      }.   
14160 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
14170 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
14180 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 70 73 2e 74  ps.filename,ps.t
14190 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63  okenlineno,."C c
141a0 6f 64 65 20 73 74 61 72 74 69 6e 67 20 6f 6e 20  ode starting on 
141b0 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74  this line is not
141c0 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f   terminated befo
141d0 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  re the end of th
141e0 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20  e file.");.     
141f0 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b     ps.errorcnt++
14200 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70  ;.        nextcp
14210 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c   = cp;.      }el
14220 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  se{.        next
14230 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20  cp = cp+1;.     
14240 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
14250 20 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b 20 20   isalnum(c) ){  
14260 20 20 20 20 20 20 20 20 2f 2a 20 49 64 65 6e 74          /* Ident
14270 69 66 69 65 72 73 20 2a 2f 0a 20 20 20 20 20 20  ifiers */.      
14280 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
14290 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 63  =0 && (isalnum(c
142a0 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63  ) || c=='_') ) c
142b0 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  p++;.      nextc
142c0 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73  p = cp;.    }els
142d0 65 20 69 66 28 20 63 3d 3d 27 3a 27 20 26 26 20  e if( c==':' && 
142e0 63 70 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 63 70  cp[1]==':' && cp
142f0 5b 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20 54  [2]=='=' ){ /* T
14300 68 65 20 6f 70 65 72 61 74 6f 72 20 22 3a 3a 3d  he operator "::=
14310 22 20 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d  " */.      cp +=
14320 20 33 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70   3;.      nextcp
14330 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65   = cp;.    }else
14340 20 69 66 28 20 28 63 3d 3d 27 2f 27 20 7c 7c 20   if( (c=='/' || 
14350 63 3d 3d 27 7c 27 29 20 26 26 20 69 73 61 6c 70  c=='|') && isalp
14360 68 61 28 63 70 5b 31 5d 29 20 29 7b 0a 20 20 20  ha(cp[1]) ){.   
14370 20 20 20 63 70 20 2b 3d 20 32 3b 0a 20 20 20 20     cp += 2;.    
14380 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 63    while( (c = *c
14390 70 29 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75  p)!=0 && (isalnu
143a0 6d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20  m(c) || c=='_') 
143b0 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65  ) cp++;.      ne
143c0 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d  xtcp = cp;.    }
143d0 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
143e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
143f0 2a 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65  * All other (one
14400 20 63 68 61 72 61 63 74 65 72 29 20 6f 70 65 72   character) oper
14410 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 63  ators */.      c
14420 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  p++;.      nextc
14430 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20  p = cp;.    }.  
14440 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a    c = *cp;.    *
14450 63 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  cp = 0;         
14460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14470 2a 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65  * Null terminate
14480 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20   the token */.  
14490 20 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28    parseonetoken(
144a0 26 70 73 29 3b 20 20 20 20 20 20 20 20 20 20 20  &ps);           
144b0 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 74    /* Parse the t
144c0 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20  oken */.    *cp 
144d0 3d 20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  = c;            
144e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
144f0 65 73 74 6f 72 65 20 74 68 65 20 62 75 66 66 65  estore the buffe
14500 72 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65  r */.    cp = ne
14510 78 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65  xtcp;.  }.  free
14520 28 66 69 6c 65 62 75 66 29 3b 20 20 20 20 20 20  (filebuf);      
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14540 20 52 65 6c 65 61 73 65 20 74 68 65 20 62 75 66   Release the buf
14550 66 65 72 20 61 66 74 65 72 20 70 61 72 73 69 6e  fer after parsin
14560 67 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20  g */.  gp->rule 
14570 3d 20 70 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a  = ps.firstrule;.
14580 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d    gp->errorcnt =
14590 20 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a   ps.errorcnt;.}.
145a0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
145b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
145c0 6d 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e  m the file "plin
145d0 6b 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  k.c" ***********
145e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
145f0 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65  * Routines proce
14600 73 73 69 6e 67 20 63 6f 6e 66 69 67 75 72 61 74  ssing configurat
14610 69 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70  ion follow-set p
14620 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
14630 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e  .** in the LEMON
14640 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
14650 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  r..*/.static str
14660 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b  uct plink *plink
14670 5f 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a  _freelist = 0;..
14680 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
14690 77 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63  w plink */.struc
146a0 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e  t plink *Plink_n
146b0 65 77 28 29 7b 0a 20 20 73 74 72 75 63 74 20 70  ew(){.  struct p
146c0 6c 69 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a 0a  link *newlink;..
146d0 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65    if( plink_free
146e0 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  list==0 ){.    i
146f0 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d  nt i;.    int am
14700 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 70 6c 69  t = 100;.    pli
14710 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 28 73  nk_freelist = (s
14720 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 63 61  truct plink *)ca
14730 6c 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f  lloc( amt, sizeo
14740 66 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 29 20  f(struct plink) 
14750 29 3b 0a 20 20 20 20 69 66 28 20 70 6c 69 6e 6b  );.    if( plink
14760 5f 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a  _freelist==0 ){.
14770 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
14780 64 65 72 72 2c 0a 20 20 20 20 20 20 22 55 6e 61  derr,.      "Una
14790 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
147a0 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77  memory for a new
147b0 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70   follow-set prop
147c0 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22  agation link.\n"
147d0 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29  );.      exit(1)
147e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
147f0 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b  i=0; i<amt-1; i+
14800 2b 29 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73  +) plink_freelis
14810 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 70 6c 69  t[i].next = &pli
14820 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d  nk_freelist[i+1]
14830 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65  ;.    plink_free
14840 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74  list[amt-1].next
14850 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 6c   = 0;.  }.  newl
14860 69 6e 6b 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65  ink = plink_free
14870 6c 69 73 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66 72  list;.  plink_fr
14880 65 65 6c 69 73 74 20 3d 20 70 6c 69 6e 6b 5f 66  eelist = plink_f
14890 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20  reelist->next;. 
148a0 20 72 65 74 75 72 6e 20 6e 65 77 6c 69 6e 6b 3b   return newlink;
148b0 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c 69  .}../* Add a pli
148c0 6e 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c 69  nk to a plink li
148d0 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b  st */.void Plink
148e0 5f 61 64 64 28 73 74 72 75 63 74 20 70 6c 69 6e  _add(struct plin
148f0 6b 20 2a 2a 70 6c 70 70 2c 20 73 74 72 75 63 74  k **plpp, struct
14900 20 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a   config *cfp).{.
14910 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
14920 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69  newlink;.  newli
14930 6e 6b 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77 28 29  nk = Plink_new()
14940 3b 0a 20 20 6e 65 77 6c 69 6e 6b 2d 3e 6e 65 78  ;.  newlink->nex
14950 74 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c  t = *plpp;.  *pl
14960 70 70 20 3d 20 6e 65 77 6c 69 6e 6b 3b 0a 20 20  pp = newlink;.  
14970 6e 65 77 6c 69 6e 6b 2d 3e 63 66 70 20 3d 20 63  newlink->cfp = c
14980 66 70 3b 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73 66  fp;.}../* Transf
14990 65 72 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f  er every plink o
149a0 6e 20 74 68 65 20 6c 69 73 74 20 22 66 72 6f 6d  n the list "from
149b0 22 20 74 6f 20 74 68 65 20 6c 69 73 74 20 22 74  " to the list "t
149c0 6f 22 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b  o" */.void Plink
149d0 5f 63 6f 70 79 28 73 74 72 75 63 74 20 70 6c 69  _copy(struct pli
149e0 6e 6b 20 2a 2a 74 6f 2c 20 73 74 72 75 63 74 20  nk **to, struct 
149f0 70 6c 69 6e 6b 20 2a 66 72 6f 6d 29 0a 7b 0a 20  plink *from).{. 
14a00 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e   struct plink *n
14a10 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28 20  extpl;.  while( 
14a20 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78 74  from ){.    next
14a30 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b  pl = from->next;
14a40 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74 20  .    from->next 
14a50 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d  = *to;.    *to =
14a60 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d 20   from;.    from 
14a70 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a  = nextpl;.  }.}.
14a80 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79  ./* Delete every
14a90 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69   plink on the li
14aa0 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b  st */.void Plink
14ab0 5f 64 65 6c 65 74 65 28 73 74 72 75 63 74 20 70  _delete(struct p
14ac0 6c 69 6e 6b 20 2a 70 6c 70 29 0a 7b 0a 20 20 73  link *plp).{.  s
14ad0 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78  truct plink *nex
14ae0 74 70 6c 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70  tpl;..  while( p
14af0 6c 70 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c  lp ){.    nextpl
14b00 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20   = plp->next;.  
14b10 20 20 70 6c 70 2d 3e 6e 65 78 74 20 3d 20 70 6c    plp->next = pl
14b20 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20  ink_freelist;.  
14b30 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74    plink_freelist
14b40 20 3d 20 70 6c 70 3b 0a 20 20 20 20 70 6c 70 20   = plp;.    plp 
14b50 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a  = nextpl;.  }.}.
14b60 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
14b70 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
14b80 65 20 66 69 6c 65 20 22 72 65 70 6f 72 74 2e 63  e file "report.c
14b90 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
14ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
14bb0 0a 2a 2a 20 50 72 6f 63 65 64 75 72 65 73 20 66  .** Procedures f
14bc0 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 72 65  or generating re
14bd0 70 6f 72 74 73 20 61 6e 64 20 74 61 62 6c 65 73  ports and tables
14be0 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
14bf0 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
14c00 2a 2f 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  */../* Generate 
14c10 61 20 66 69 6c 65 6e 61 6d 65 20 77 69 74 68 20  a filename with 
14c20 74 68 65 20 67 69 76 65 6e 20 73 75 66 66 69 78  the given suffix
14c30 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
14c40 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6d   the.** name com
14c50 65 73 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  es from malloc()
14c60 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
14c70 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
14c80 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  g.** function..*
14c90 2f 0a 50 52 49 56 41 54 45 20 63 68 61 72 20 2a  /.PRIVATE char *
14ca0 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 73 74  file_makename(st
14cb0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
14cc0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 75  , const char *su
14cd0 66 66 69 78 29 0a 7b 0a 20 20 63 68 61 72 20 2a  ffix).{.  char *
14ce0 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70  name;.  char *cp
14cf0 3b 0a 0a 20 20 6e 61 6d 65 20 3d 20 28 63 68 61  ;..  name = (cha
14d00 72 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e  r*)malloc( lemon
14d10 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69 6c  Strlen(lemp->fil
14d20 65 6e 61 6d 65 29 20 2b 20 6c 65 6d 6f 6e 53 74  ename) + lemonSt
14d30 72 6c 65 6e 28 73 75 66 66 69 78 29 20 2b 20 35  rlen(suffix) + 5
14d40 20 29 3b 0a 20 20 69 66 28 20 6e 61 6d 65 3d 3d   );.  if( name==
14d50 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
14d60 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 61  (stderr,"Can't a
14d70 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
14d80 72 20 61 20 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22  r a filename.\n"
14d90 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
14da0 20 20 7d 0a 20 20 73 74 72 63 70 79 28 6e 61 6d    }.  strcpy(nam
14db0 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  e,lemp->filename
14dc0 29 3b 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68  );.  cp = strrch
14dd0 72 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69  r(name,'.');.  i
14de0 66 28 20 63 70 20 29 20 2a 63 70 20 3d 20 30 3b  f( cp ) *cp = 0;
14df0 0a 20 20 73 74 72 63 61 74 28 6e 61 6d 65 2c 73  .  strcat(name,s
14e00 75 66 66 69 78 29 3b 0a 20 20 72 65 74 75 72 6e  uffix);.  return
14e10 20 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65   name;.}../* Ope
14e20 6e 20 61 20 66 69 6c 65 20 77 69 74 68 20 61 20  n a file with a 
14e30 6e 61 6d 65 20 62 61 73 65 64 20 6f 6e 20 74 68  name based on th
14e40 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
14e50 70 75 74 20 66 69 6c 65 2c 0a 2a 2a 20 62 75 74  put file,.** but
14e60 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
14e70 74 20 28 73 70 65 63 69 66 69 65 64 29 20 73 75  t (specified) su
14e80 66 66 69 78 2c 20 61 6e 64 20 72 65 74 75 72 6e  ffix, and return
14e90 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
14ea0 20 74 68 65 20 73 74 72 65 61 6d 20 2a 2f 0a 50   the stream */.P
14eb0 52 49 56 41 54 45 20 46 49 4c 45 20 2a 66 69 6c  RIVATE FILE *fil
14ec0 65 5f 6f 70 65 6e 28 0a 20 20 73 74 72 75 63 74  e_open(.  struct
14ed0 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20   lemon *lemp,.  
14ee0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 66 66  const char *suff
14ef0 69 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ix,.  const char
14f00 20 2a 6d 6f 64 65 0a 29 7b 0a 20 20 46 49 4c 45   *mode.){.  FILE
14f10 20 2a 66 70 3b 0a 0a 20 20 69 66 28 20 6c 65 6d   *fp;..  if( lem
14f20 70 2d 3e 6f 75 74 6e 61 6d 65 20 29 20 66 72 65  p->outname ) fre
14f30 65 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29  e(lemp->outname)
14f40 3b 0a 20 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  ;.  lemp->outnam
14f50 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d  e = file_makenam
14f60 65 28 6c 65 6d 70 2c 20 73 75 66 66 69 78 29 3b  e(lemp, suffix);
14f70 0a 20 20 66 70 20 3d 20 66 6f 70 65 6e 28 6c 65  .  fp = fopen(le
14f80 6d 70 2d 3e 6f 75 74 6e 61 6d 65 2c 6d 6f 64 65  mp->outname,mode
14f90 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 26  );.  if( fp==0 &
14fa0 26 20 2a 6d 6f 64 65 3d 3d 27 77 27 20 29 7b 0a  & *mode=='w' ){.
14fb0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
14fc0 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 66  rr,"Can't open f
14fd0 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 6c  ile \"%s\".\n",l
14fe0 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20  emp->outname);. 
14ff0 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
15000 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t++;.    return 
15010 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
15020 66 70 3b 0a 7d 0a 0a 2f 2a 20 44 75 70 6c 69 63  fp;.}../* Duplic
15030 61 74 65 20 74 68 65 20 69 6e 70 75 74 20 66 69  ate the input fi
15040 6c 65 20 77 69 74 68 6f 75 74 20 63 6f 6d 6d 65  le without comme
15050 6e 74 73 20 61 6e 64 20 77 69 74 68 6f 75 74 20  nts and without 
15060 61 63 74 69 6f 6e 73 20 0a 2a 2a 20 6f 6e 20 72  actions .** on r
15070 75 6c 65 73 20 2a 2f 0a 76 6f 69 64 20 52 65 70  ules */.void Rep
15080 72 69 6e 74 28 73 74 72 75 63 74 20 6c 65 6d 6f  rint(struct lemo
15090 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72  n *lemp).{.  str
150a0 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
150b0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
150c0 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6d  p;.  int i, j, m
150d0 61 78 6c 65 6e 2c 20 6c 65 6e 2c 20 6e 63 6f 6c  axlen, len, ncol
150e0 75 6d 6e 73 2c 20 73 6b 69 70 3b 0a 20 20 70 72  umns, skip;.  pr
150f0 69 6e 74 66 28 22 2f 2f 20 52 65 70 72 69 6e 74  intf("// Reprint
15100 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 5c   of input file \
15110 22 25 73 5c 22 2e 5c 6e 2f 2f 20 53 79 6d 62 6f  "%s\".\n// Symbo
15120 6c 73 3a 5c 6e 22 2c 6c 65 6d 70 2d 3e 66 69 6c  ls:\n",lemp->fil
15130 65 6e 61 6d 65 29 3b 0a 20 20 6d 61 78 6c 65 6e  ename);.  maxlen
15140 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28 69 3d 30   = 10;.  for(i=0
15150 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
15160 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 20  l; i++){.    sp 
15170 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
15180 69 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65  i];.    len = le
15190 6d 6f 6e 53 74 72 6c 65 6e 28 73 70 2d 3e 6e 61  monStrlen(sp->na
151a0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e  me);.    if( len
151b0 3e 6d 61 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e  >maxlen ) maxlen
151c0 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 6e 63   = len;.  }.  nc
151d0 6f 6c 75 6d 6e 73 20 3d 20 37 36 2f 28 6d 61 78  olumns = 76/(max
151e0 6c 65 6e 2b 35 29 3b 0a 20 20 69 66 28 20 6e 63  len+5);.  if( nc
151f0 6f 6c 75 6d 6e 73 3c 31 20 29 20 6e 63 6f 6c 75  olumns<1 ) ncolu
15200 6d 6e 73 20 3d 20 31 3b 0a 20 20 73 6b 69 70 20  mns = 1;.  skip 
15210 3d 20 28 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c  = (lemp->nsymbol
15220 20 2b 20 6e 63 6f 6c 75 6d 6e 73 20 2d 20 31 29   + ncolumns - 1)
15230 2f 6e 63 6f 6c 75 6d 6e 73 3b 0a 20 20 66 6f 72  /ncolumns;.  for
15240 28 69 3d 30 3b 20 69 3c 73 6b 69 70 3b 20 69 2b  (i=0; i<skip; i+
15250 2b 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  +){.    printf("
15260 2f 2f 22 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  //");.    for(j=
15270 69 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  i; j<lemp->nsymb
15280 6f 6c 3b 20 6a 2b 3d 73 6b 69 70 29 7b 0a 20 20  ol; j+=skip){.  
15290 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73      sp = lemp->s
152a0 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20  ymbols[j];.     
152b0 20 61 73 73 65 72 74 28 20 73 70 2d 3e 69 6e 64   assert( sp->ind
152c0 65 78 3d 3d 6a 20 29 3b 0a 20 20 20 20 20 20 70  ex==j );.      p
152d0 72 69 6e 74 66 28 22 20 25 33 64 20 25 2d 2a 2e  rintf(" %3d %-*.
152e0 2a 73 22 2c 6a 2c 6d 61 78 6c 65 6e 2c 6d 61 78  *s",j,maxlen,max
152f0 6c 65 6e 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  len,sp->name);. 
15300 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28     }.    printf(
15310 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  "\n");.  }.  for
15320 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
15330 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
15340 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 73  {.    printf("%s
15350 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29  ",rp->lhs->name)
15360 3b 0a 20 20 20 20 2f 2a 20 20 20 20 69 66 28 20  ;.    /*    if( 
15370 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 29 20 70  rp->lhsalias ) p
15380 72 69 6e 74 66 28 22 28 25 73 29 22 2c 72 70 2d  rintf("(%s)",rp-
15390 3e 6c 68 73 61 6c 69 61 73 29 3b 20 2a 2f 0a 20  >lhsalias); */. 
153a0 20 20 20 70 72 69 6e 74 66 28 22 20 3a 3a 3d 22     printf(" ::="
153b0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
153c0 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
153d0 7b 0a 20 20 20 20 20 20 73 70 20 3d 20 72 70 2d  {.      sp = rp-
153e0 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 70  >rhs[i];.      p
153f0 72 69 6e 74 66 28 22 20 25 73 22 2c 20 73 70 2d  rintf(" %s", sp-
15400 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  >name);.      if
15410 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54  ( sp->type==MULT
15420 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
15430 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c       for(j=1; j<
15440 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b  sp->nsubsym; j++
15450 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69  ){.          pri
15460 6e 74 66 28 22 7c 25 73 22 2c 20 73 70 2d 3e 73  ntf("|%s", sp->s
15470 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b  ubsym[j]->name);
15480 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15490 20 7d 0a 20 20 20 20 20 20 2f 2a 20 69 66 28 20   }.      /* if( 
154a0 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20  rp->rhsalias[i] 
154b0 29 20 70 72 69 6e 74 66 28 22 28 25 73 29 22 2c  ) printf("(%s)",
154c0 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29  rp->rhsalias[i])
154d0 3b 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70  ; */.    }.    p
154e0 72 69 6e 74 66 28 22 2e 22 29 3b 0a 20 20 20 20  rintf(".");.    
154f0 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 20  if( rp->precsym 
15500 29 20 70 72 69 6e 74 66 28 22 20 5b 25 73 5d 22  ) printf(" [%s]"
15510 2c 72 70 2d 3e 70 72 65 63 73 79 6d 2d 3e 6e 61  ,rp->precsym->na
15520 6d 65 29 3b 0a 20 20 20 20 2f 2a 20 69 66 28 20  me);.    /* if( 
15530 72 70 2d 3e 63 6f 64 65 20 29 20 70 72 69 6e 74  rp->code ) print
15540 66 28 22 5c 6e 20 20 20 20 25 73 22 2c 72 70 2d  f("\n    %s",rp-
15550 3e 63 6f 64 65 29 3b 20 2a 2f 0a 20 20 20 20 70  >code); */.    p
15560 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
15570 0a 7d 0a 0a 76 6f 69 64 20 43 6f 6e 66 69 67 50  .}..void ConfigP
15580 72 69 6e 74 28 46 49 4c 45 20 2a 66 70 2c 20 73  rint(FILE *fp, s
15590 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
155a0 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75  p).{.  struct ru
155b0 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74  le *rp;.  struct
155c0 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69   symbol *sp;.  i
155d0 6e 74 20 69 2c 20 6a 3b 0a 20 20 72 70 20 3d 20  nt i, j;.  rp = 
155e0 63 66 70 2d 3e 72 70 3b 0a 20 20 66 70 72 69 6e  cfp->rp;.  fprin
155f0 74 66 28 66 70 2c 22 25 73 20 3a 3a 3d 22 2c 72  tf(fp,"%s ::=",r
15600 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20  p->lhs->name);. 
15610 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 72 70 2d   for(i=0; i<=rp-
15620 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
15630 20 69 66 28 20 69 3d 3d 63 66 70 2d 3e 64 6f 74   if( i==cfp->dot
15640 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20   ) fprintf(fp," 
15650 2a 22 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  *");.    if( i==
15660 72 70 2d 3e 6e 72 68 73 20 29 20 62 72 65 61 6b  rp->nrhs ) break
15670 3b 0a 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72  ;.    sp = rp->r
15680 68 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e  hs[i];.    fprin
15690 74 66 28 66 70 2c 22 20 25 73 22 2c 20 73 70 2d  tf(fp," %s", sp-
156a0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  >name);.    if( 
156b0 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54  sp->type==MULTIT
156c0 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
156d0 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e   for(j=1; j<sp->
156e0 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20  nsubsym; j++){. 
156f0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
15700 70 2c 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62 73  p,"|%s",sp->subs
15710 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ym[j]->name);.  
15720 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15730 7d 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 54 45  }../* #define TE
15740 53 54 20 2a 2f 0a 23 69 66 20 30 0a 2f 2a 20 50  ST */.#if 0./* P
15750 72 69 6e 74 20 61 20 73 65 74 20 2a 2f 0a 50 52  rint a set */.PR
15760 49 56 41 54 45 20 76 6f 69 64 20 53 65 74 50 72  IVATE void SetPr
15770 69 6e 74 28 6f 75 74 2c 73 65 74 2c 6c 65 6d 70  int(out,set,lemp
15780 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 63 68 61  ).FILE *out;.cha
15790 72 20 2a 73 65 74 3b 0a 73 74 72 75 63 74 20 6c  r *set;.struct l
157a0 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
157b0 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 73  int i;.  char *s
157c0 70 61 63 65 72 3b 0a 20 20 73 70 61 63 65 72 20  pacer;.  spacer 
157d0 3d 20 22 22 3b 0a 20 20 66 70 72 69 6e 74 66 28  = "";.  fprintf(
157e0 6f 75 74 2c 22 25 31 32 73 5b 22 2c 22 22 29 3b  out,"%12s[","");
157f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
15800 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69  mp->nterminal; i
15810 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 65 74  ++){.    if( Set
15820 46 69 6e 64 28 73 65 74 2c 69 29 20 29 7b 0a 20  Find(set,i) ){. 
15830 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
15840 2c 22 25 73 25 73 22 2c 73 70 61 63 65 72 2c 6c  ,"%s%s",spacer,l
15850 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
15860 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 70  >name);.      sp
15870 61 63 65 72 20 3d 20 22 20 22 3b 0a 20 20 20 20  acer = " ";.    
15880 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  }.  }.  fprintf(
15890 6f 75 74 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a 2f  out,"]\n");.}../
158a0 2a 20 50 72 69 6e 74 20 61 20 70 6c 69 6e 6b 20  * Print a plink 
158b0 63 68 61 69 6e 20 2a 2f 0a 50 52 49 56 41 54 45  chain */.PRIVATE
158c0 20 76 6f 69 64 20 50 6c 69 6e 6b 50 72 69 6e 74   void PlinkPrint
158d0 28 6f 75 74 2c 70 6c 70 2c 74 61 67 29 0a 46 49  (out,plp,tag).FI
158e0 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20  LE *out;.struct 
158f0 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 63 68 61 72  plink *plp;.char
15900 20 2a 74 61 67 3b 0a 7b 0a 20 20 77 68 69 6c 65   *tag;.{.  while
15910 28 20 70 6c 70 20 29 7b 0a 20 20 20 20 66 70 72  ( plp ){.    fpr
15920 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 25 73  intf(out,"%12s%s
15930 20 28 73 74 61 74 65 20 25 32 64 29 20 22 2c 22   (state %2d) ","
15940 22 2c 74 61 67 2c 70 6c 70 2d 3e 63 66 70 2d 3e  ",tag,plp->cfp->
15950 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a  stp->statenum);.
15960 20 20 20 20 43 6f 6e 66 69 67 50 72 69 6e 74 28      ConfigPrint(
15970 6f 75 74 2c 70 6c 70 2d 3e 63 66 70 29 3b 0a 20  out,plp->cfp);. 
15980 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
15990 5c 6e 22 29 3b 0a 20 20 20 20 70 6c 70 20 3d 20  \n");.    plp = 
159a0 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 7d  plp->next;.  }.}
159b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 50 72 69 6e  .#endif../* Prin
159c0 74 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20 74  t an action to t
159d0 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
159e0 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
159f0 6e 20 46 41 4c 53 45 20 69 66 0a 2a 2a 20 6e 6f  n FALSE if.** no
15a00 74 68 69 6e 67 20 77 61 73 20 61 63 74 75 61 6c  thing was actual
15a10 6c 79 20 70 72 69 6e 74 65 64 2e 0a 2a 2f 0a 69  ly printed..*/.i
15a20 6e 74 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 73  nt PrintAction(s
15a30 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
15a40 2c 20 46 49 4c 45 20 2a 66 70 2c 20 69 6e 74 20  , FILE *fp, int 
15a50 69 6e 64 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  indent){.  int r
15a60 65 73 75 6c 74 20 3d 20 31 3b 0a 20 20 73 77 69  esult = 1;.  swi
15a70 74 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b  tch( ap->type ){
15a80 0a 20 20 20 20 63 61 73 65 20 53 48 49 46 54 3a  .    case SHIFT:
15a90 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
15aa0 70 2c 22 25 2a 73 20 73 68 69 66 74 20 20 25 64  p,"%*s shift  %d
15ab0 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d  ",indent,ap->sp-
15ac0 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d  >name,ap->x.stp-
15ad0 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20  >statenum);.    
15ae0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
15af0 65 20 52 45 44 55 43 45 3a 0a 20 20 20 20 20 20  e REDUCE:.      
15b00 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20  fprintf(fp,"%*s 
15b10 72 65 64 75 63 65 20 25 64 22 2c 69 6e 64 65 6e  reduce %d",inden
15b20 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61  t,ap->sp->name,a
15b30 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 29 3b  p->x.rp->index);
15b40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15b50 20 20 63 61 73 65 20 41 43 43 45 50 54 3a 0a 20    case ACCEPT:. 
15b60 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
15b70 22 25 2a 73 20 61 63 63 65 70 74 22 2c 69 6e 64  "%*s accept",ind
15b80 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
15b90 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15ba0 20 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a 0a      case ERROR:.
15bb0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
15bc0 2c 22 25 2a 73 20 65 72 72 6f 72 22 2c 69 6e 64  ,"%*s error",ind
15bd0 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
15be0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15bf0 20 20 20 20 63 61 73 65 20 53 52 43 4f 4e 46 4c      case SRCONFL
15c00 49 43 54 3a 0a 20 20 20 20 63 61 73 65 20 52 52  ICT:.    case RR
15c10 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20  CONFLICT:.      
15c20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20  fprintf(fp,"%*s 
15c30 72 65 64 75 63 65 20 25 2d 33 64 20 2a 2a 20 50  reduce %-3d ** P
15c40 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20  arsing conflict 
15c50 2a 2a 22 2c 0a 20 20 20 20 20 20 20 20 69 6e 64  **",.        ind
15c60 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
15c70 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78  ,ap->x.rp->index
15c80 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15c90 20 20 20 20 63 61 73 65 20 53 53 43 4f 4e 46 4c      case SSCONFL
15ca0 49 43 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e  ICT:.      fprin
15cb0 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74  tf(fp,"%*s shift
15cc0 20 20 25 2d 33 64 20 2a 2a 20 50 61 72 73 69 6e    %-3d ** Parsin
15cd0 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a 22 2c 20  g conflict **", 
15ce0 0a 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74 2c  .        indent,
15cf0 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d  ap->sp->name,ap-
15d00 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d  >x.stp->statenum
15d10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15d20 20 20 20 20 63 61 73 65 20 53 48 5f 52 45 53 4f      case SH_RESO
15d30 4c 56 45 44 3a 0a 20 20 20 20 20 20 69 66 28 20  LVED:.      if( 
15d40 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f  showPrecedenceCo
15d50 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20 20 20  nflict ){.      
15d60 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
15d70 73 20 73 68 69 66 74 20 20 25 2d 33 64 20 2d 2d  s shift  %-3d --
15d80 20 64 72 6f 70 70 65 64 20 62 79 20 70 72 65 63   dropped by prec
15d90 65 64 65 6e 63 65 22 2c 0a 20 20 20 20 20 20 20  edence",.       
15da0 20 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74 2c           indent,
15db0 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d  ap->sp->name,ap-
15dc0 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d  >x.stp->statenum
15dd0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
15de0 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d          result =
15df0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
15e00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
15e10 65 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20  e RD_RESOLVED:. 
15e20 20 20 20 20 20 69 66 28 20 73 68 6f 77 50 72 65       if( showPre
15e30 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63 74 20  cedenceConflict 
15e40 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
15e50 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75 63  tf(fp,"%*s reduc
15e60 65 20 25 2d 33 64 20 2d 2d 20 64 72 6f 70 70 65  e %-3d -- droppe
15e70 64 20 62 79 20 70 72 65 63 65 64 65 6e 63 65 22  d by precedence"
15e80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15e90 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d    indent,ap->sp-
15ea0 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e  >name,ap->x.rp->
15eb0 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 65  index);.      }e
15ec0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73  lse{.        res
15ed0 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ult = 0;.      }
15ee0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15ef0 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44 3a    case NOT_USED:
15f00 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20  .      result = 
15f10 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
15f20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
15f30 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72  ult;.}../* Gener
15f40 61 74 65 20 74 68 65 20 22 79 2e 6f 75 74 70 75  ate the "y.outpu
15f50 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76  t" log file */.v
15f60 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74  oid ReportOutput
15f70 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
15f80 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  emp).{.  int i;.
15f90 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
15fa0 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 63 6f  stp;.  struct co
15fb0 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72  nfig *cfp;.  str
15fc0 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
15fd0 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 66    FILE *fp;..  f
15fe0 70 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65  p = file_open(le
15ff0 6d 70 2c 22 2e 6f 75 74 22 2c 22 77 62 22 29 3b  mp,".out","wb");
16000 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 29 20 72  .  if( fp==0 ) r
16010 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
16020 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
16030 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
16040 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
16050 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66  ];.    fprintf(f
16060 70 2c 22 53 74 61 74 65 20 25 64 3a 5c 6e 22 2c  p,"State %d:\n",
16070 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a  stp->statenum);.
16080 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61      if( lemp->ba
16090 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d 73 74  sisflag ) cfp=st
160a0 70 2d 3e 62 70 3b 0a 20 20 20 20 65 6c 73 65 20  p->bp;.    else 
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 20 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 0a 20   cfp=stp->cfp;. 
160d0 20 20 20 77 68 69 6c 65 28 20 63 66 70 20 29 7b     while( cfp ){
160e0 0a 20 20 20 20 20 20 63 68 61 72 20 62 75 66 5b  .      char buf[
160f0 32 30 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63  20];.      if( c
16100 66 70 2d 3e 64 6f 74 3d 3d 63 66 70 2d 3e 72 70  fp->dot==cfp->rp
16110 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20  ->nrhs ){.      
16120 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c 22 28    sprintf(buf,"(
16130 25 64 29 22 2c 63 66 70 2d 3e 72 70 2d 3e 69 6e  %d)",cfp->rp->in
16140 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 66 70  dex);.        fp
16150 72 69 6e 74 66 28 66 70 2c 22 20 20 20 20 25 35  rintf(fp,"    %5
16160 73 20 22 2c 62 75 66 29 3b 0a 20 20 20 20 20 20  s ",buf);.      
16170 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
16180 70 72 69 6e 74 66 28 66 70 2c 22 20 20 20 20 20  printf(fp,"     
16190 20 20 20 20 20 22 29 3b 0a 20 20 20 20 20 20 7d       ");.      }
161a0 0a 20 20 20 20 20 20 43 6f 6e 66 69 67 50 72 69  .      ConfigPri
161b0 6e 74 28 66 70 2c 63 66 70 29 3b 0a 20 20 20 20  nt(fp,cfp);.    
161c0 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e    fprintf(fp,"\n
161d0 22 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20  ");.#if 0.      
161e0 53 65 74 50 72 69 6e 74 28 66 70 2c 63 66 70 2d  SetPrint(fp,cfp-
161f0 3e 66 77 73 2c 6c 65 6d 70 29 3b 0a 20 20 20 20  >fws,lemp);.    
16200 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c    PlinkPrint(fp,
16210 63 66 70 2d 3e 66 70 6c 70 2c 22 54 6f 20 20 22  cfp->fplp,"To  "
16220 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72  );.      PlinkPr
16230 69 6e 74 28 66 70 2c 63 66 70 2d 3e 62 70 6c 70  int(fp,cfp->bplp
16240 2c 22 46 72 6f 6d 22 29 3b 0a 23 65 6e 64 69 66  ,"From");.#endif
16250 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6d 70 2d  .      if( lemp-
16260 3e 62 61 73 69 73 66 6c 61 67 20 29 20 63 66 70  >basisflag ) cfp
16270 3d 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20 20 20  =cfp->bp;.      
16280 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
16290 20 20 20 20 20 20 63 66 70 3d 63 66 70 2d 3e 6e        cfp=cfp->n
162a0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ext;.    }.    f
162b0 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b  printf(fp,"\n");
162c0 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
162d0 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
162e0 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
162f0 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 61 70 2c   PrintAction(ap,
16300 66 70 2c 33 30 29 20 29 20 66 70 72 69 6e 74 66  fp,30) ) fprintf
16310 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 7d  (fp,"\n");.    }
16320 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
16330 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 70 72  "\n");.  }.  fpr
16340 69 6e 74 66 28 66 70 2c 20 22 2d 2d 2d 2d 2d 2d  intf(fp, "------
16350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  --------------\n
16380 22 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70  ");.  fprintf(fp
16390 2c 20 22 53 79 6d 62 6f 6c 73 3a 5c 6e 22 29 3b  , "Symbols:\n");
163a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
163b0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
163c0 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  ){.    int j;.  
163d0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
163e0 2a 73 70 3b 0a 0a 20 20 20 20 73 70 20 3d 20 6c  *sp;..    sp = l
163f0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
16400 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
16410 20 22 20 20 25 33 64 3a 20 25 73 22 2c 20 69 2c   "  %3d: %s", i,
16420 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
16430 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f  if( sp->type==NO
16440 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  NTERMINAL ){.   
16450 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22     fprintf(fp, "
16460 3a 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  :");.      if( s
16470 70 2d 3e 6c 61 6d 62 64 61 20 29 7b 0a 20 20 20  p->lambda ){.   
16480 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
16490 20 22 20 3c 6c 61 6d 62 64 61 3e 22 29 3b 0a 20   " <lambda>");. 
164a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
164b0 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74  (j=0; j<lemp->nt
164c0 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20  erminal; j++){. 
164d0 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 66         if( sp->f
164e0 69 72 73 74 73 65 74 20 26 26 20 53 65 74 46 69  irstset && SetFi
164f0 6e 64 28 73 70 2d 3e 66 69 72 73 74 73 65 74 2c  nd(sp->firstset,
16500 20 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   j) ){.         
16510 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 20 25   fprintf(fp, " %
16520 73 22 2c 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  s", lemp->symbol
16530 73 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  s[j]->name);.   
16540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16550 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
16560 28 66 70 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a  (fp, "\n");.  }.
16570 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20    fclose(fp);.  
16580 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65  return;.}../* Se
16590 61 72 63 68 20 66 6f 72 20 74 68 65 20 66 69 6c  arch for the fil
165a0 65 20 22 6e 61 6d 65 22 20 77 68 69 63 68 20 69  e "name" which i
165b0 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  s in the same di
165c0 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68  rectory as.** th
165d0 65 20 65 78 61 63 75 74 61 62 6c 65 20 2a 2f 0a  e exacutable */.
165e0 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 70 61  PRIVATE char *pa
165f0 74 68 73 65 61 72 63 68 28 63 68 61 72 20 2a 61  thsearch(char *a
16600 72 67 76 30 2c 20 63 68 61 72 20 2a 6e 61 6d 65  rgv0, char *name
16610 2c 20 69 6e 74 20 6d 6f 64 65 6d 61 73 6b 29 0a  , int modemask).
16620 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
16630 70 61 74 68 6c 69 73 74 3b 0a 20 20 63 68 61 72  pathlist;.  char
16640 20 2a 70 61 74 68 62 75 66 70 74 72 3b 0a 20 20   *pathbufptr;.  
16650 63 68 61 72 20 2a 70 61 74 68 62 75 66 3b 0a 20  char *pathbuf;. 
16660 20 63 68 61 72 20 2a 70 61 74 68 2c 2a 63 70 3b   char *path,*cp;
16670 0a 20 20 63 68 61 72 20 63 3b 0a 0a 23 69 66 64  .  char c;..#ifd
16680 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20 63  ef __WIN32__.  c
16690 70 20 3d 20 73 74 72 72 63 68 72 28 61 72 67 76  p = strrchr(argv
166a0 30 2c 27 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a 20  0,'\\');.#else. 
166b0 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 61 72   cp = strrchr(ar
166c0 67 76 30 2c 27 2f 27 29 3b 0a 23 65 6e 64 69 66  gv0,'/');.#endif
166d0 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20  .  if( cp ){.   
166e0 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63   c = *cp;.    *c
166f0 70 20 3d 20 30 3b 0a 20 20 20 20 70 61 74 68 20  p = 0;.    path 
16700 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63  = (char *)malloc
16710 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72  ( lemonStrlen(ar
16720 67 76 30 29 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c  gv0) + lemonStrl
16730 65 6e 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b 0a  en(name) + 2 );.
16740 20 20 20 20 69 66 28 20 70 61 74 68 20 29 20 73      if( path ) s
16750 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73 2f  printf(path,"%s/
16760 25 73 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29 3b  %s",argv0,name);
16770 0a 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20  .    *cp = c;.  
16780 7d 65 6c 73 65 7b 0a 20 20 20 20 70 61 74 68 6c  }else{.    pathl
16790 69 73 74 20 3d 20 67 65 74 65 6e 76 28 22 50 41  ist = getenv("PA
167a0 54 48 22 29 3b 0a 20 20 20 20 69 66 28 20 70 61  TH");.    if( pa
167b0 74 68 6c 69 73 74 3d 3d 30 20 29 20 70 61 74 68  thlist==0 ) path
167c0 6c 69 73 74 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f  list = ".:/bin:/
167d0 75 73 72 2f 62 69 6e 22 3b 0a 20 20 20 20 70 61  usr/bin";.    pa
167e0 74 68 62 75 66 20 3d 20 28 63 68 61 72 20 2a 29  thbuf = (char *)
167f0 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74   malloc( lemonSt
16800 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 20 2b  rlen(pathlist) +
16810 20 31 20 29 3b 0a 20 20 20 20 70 61 74 68 20 3d   1 );.    path =
16820 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28   (char *)malloc(
16830 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74   lemonStrlen(pat
16840 68 6c 69 73 74 29 2b 6c 65 6d 6f 6e 53 74 72 6c  hlist)+lemonStrl
16850 65 6e 28 6e 61 6d 65 29 2b 32 20 29 3b 0a 20 20  en(name)+2 );.  
16860 20 20 69 66 28 20 28 70 61 74 68 62 75 66 20 21    if( (pathbuf !
16870 3d 20 30 29 20 26 26 20 28 70 61 74 68 21 3d 30  = 0) && (path!=0
16880 29 20 29 7b 0a 20 20 20 20 20 20 70 61 74 68 62  ) ){.      pathb
16890 75 66 70 74 72 20 3d 20 70 61 74 68 62 75 66 3b  ufptr = pathbuf;
168a0 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 70 61  .      strcpy(pa
168b0 74 68 62 75 66 2c 20 70 61 74 68 6c 69 73 74 29  thbuf, pathlist)
168c0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a  ;.      while( *
168d0 70 61 74 68 62 75 66 20 29 7b 0a 20 20 20 20 20  pathbuf ){.     
168e0 20 20 20 63 70 20 3d 20 73 74 72 63 68 72 28 70     cp = strchr(p
168f0 61 74 68 62 75 66 2c 27 3a 27 29 3b 0a 20 20 20  athbuf,':');.   
16900 20 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29       if( cp==0 )
16910 20 63 70 20 3d 20 26 70 61 74 68 62 75 66 5b 6c   cp = &pathbuf[l
16920 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68 62  emonStrlen(pathb
16930 75 66 29 5d 3b 0a 20 20 20 20 20 20 20 20 63 20  uf)];.        c 
16940 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20 20 20 2a  = *cp;.        *
16950 63 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  cp = 0;.        
16960 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73  sprintf(path,"%s
16970 2f 25 73 22 2c 70 61 74 68 62 75 66 2c 6e 61 6d  /%s",pathbuf,nam
16980 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 63 70 20  e);.        *cp 
16990 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = c;.        if(
169a0 20 63 3d 3d 30 20 29 20 70 61 74 68 62 75 66 5b   c==0 ) pathbuf[
169b0 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  0] = 0;.        
169c0 65 6c 73 65 20 70 61 74 68 62 75 66 20 3d 20 26  else pathbuf = &
169d0 63 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 69  cp[1];.        i
169e0 66 28 20 61 63 63 65 73 73 28 70 61 74 68 2c 6d  f( access(path,m
169f0 6f 64 65 6d 61 73 6b 29 3d 3d 30 20 29 20 62 72  odemask)==0 ) br
16a00 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
16a10 20 20 20 66 72 65 65 28 70 61 74 68 62 75 66 70     free(pathbufp
16a20 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  tr);.    }.  }. 
16a30 20 72 65 74 75 72 6e 20 70 61 74 68 3b 0a 7d 0a   return path;.}.
16a40 0a 2f 2a 20 47 69 76 65 6e 20 61 6e 20 61 63 74  ./* Given an act
16a50 69 6f 6e 2c 20 63 6f 6d 70 75 74 65 20 74 68 65  ion, compute the
16a60 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
16a70 6f 72 20 74 68 61 74 20 61 63 74 69 6f 6e 0a 2a  or that action.*
16a80 2a 20 77 68 69 63 68 20 69 73 20 74 6f 20 62 65  * which is to be
16a90 20 70 75 74 20 69 6e 20 74 68 65 20 61 63 74 69   put in the acti
16aa0 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  on table of the 
16ab0 67 65 6e 65 72 61 74 65 64 20 6d 61 63 68 69 6e  generated machin
16ac0 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67  e..** Return neg
16ad0 61 74 69 76 65 20 69 66 20 6e 6f 20 61 63 74 69  ative if no acti
16ae0 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 67 65 6e  on should be gen
16af0 65 72 61 74 65 64 2e 0a 2a 2f 0a 50 52 49 56 41  erated..*/.PRIVA
16b00 54 45 20 69 6e 74 20 63 6f 6d 70 75 74 65 5f 61  TE int compute_a
16b10 63 74 69 6f 6e 28 73 74 72 75 63 74 20 6c 65 6d  ction(struct lem
16b20 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74  on *lemp, struct
16b30 20 61 63 74 69 6f 6e 20 2a 61 70 29 0a 7b 0a 20   action *ap).{. 
16b40 20 69 6e 74 20 61 63 74 3b 0a 20 20 73 77 69 74   int act;.  swit
16b50 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a  ch( ap->type ){.
16b60 20 20 20 20 63 61 73 65 20 53 48 49 46 54 3a 20      case SHIFT: 
16b70 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 73 74 70   act = ap->x.stp
16b80 2d 3e 73 74 61 74 65 6e 75 6d 3b 20 20 20 20 20  ->statenum;     
16b90 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16ba0 20 20 63 61 73 65 20 52 45 44 55 43 45 3a 20 61    case REDUCE: a
16bb0 63 74 20 3d 20 61 70 2d 3e 78 2e 72 70 2d 3e 69  ct = ap->x.rp->i
16bc0 6e 64 65 78 20 2b 20 6c 65 6d 70 2d 3e 6e 73 74  ndex + lemp->nst
16bd0 61 74 65 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ate; break;.    
16be0 63 61 73 65 20 45 52 52 4f 52 3a 20 20 61 63 74  case ERROR:  act
16bf0 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20   = lemp->nstate 
16c00 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 20 20  + lemp->nrule;  
16c10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
16c20 73 65 20 41 43 43 45 50 54 3a 20 61 63 74 20 3d  se ACCEPT: act =
16c30 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20   lemp->nstate + 
16c40 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 31 3b  lemp->nrule + 1;
16c50 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
16c60 75 6c 74 3a 20 20 20 20 20 61 63 74 20 3d 20 2d  ult:     act = -
16c70 31 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  1; break;.  }.  
16c80 72 65 74 75 72 6e 20 61 63 74 3b 0a 7d 0a 0a 23  return act;.}..#
16c90 64 65 66 69 6e 65 20 4c 49 4e 45 53 49 5a 45 20  define LINESIZE 
16ca0 31 30 30 30 0a 2f 2a 20 54 68 65 20 6e 65 78 74  1000./* The next
16cb0 20 63 6c 75 73 74 65 72 20 6f 66 20 72 6f 75 74   cluster of rout
16cc0 69 6e 65 73 20 61 72 65 20 66 6f 72 20 72 65 61  ines are for rea
16cd0 64 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74  ding the templat
16ce0 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 77 72  e file.** and wr
16cf0 69 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  iting the result
16d00 73 20 74 6f 20 74 68 65 20 67 65 6e 65 72 61 74  s to the generat
16d10 65 64 20 70 61 72 73 65 72 20 2a 2f 0a 2f 2a 20  ed parser */./* 
16d20 54 68 65 20 66 69 72 73 74 20 66 75 6e 63 74 69  The first functi
16d30 6f 6e 20 74 72 61 6e 73 66 65 72 73 20 64 61 74  on transfers dat
16d40 61 20 66 72 6f 6d 20 22 69 6e 22 20 74 6f 20 22  a from "in" to "
16d50 6f 75 74 22 20 75 6e 74 69 6c 0a 2a 2a 20 61 20  out" until.** a 
16d60 6c 69 6e 65 20 69 73 20 73 65 65 6e 20 77 68 69  line is seen whi
16d70 63 68 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  ch begins with "
16d80 25 25 22 2e 20 20 54 68 65 20 6c 69 6e 65 20 6e  %%".  The line n
16d90 75 6d 62 65 72 20 69 73 0a 2a 2a 20 74 72 61 63  umber is.** trac
16da0 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6e 61  ked..**.** if na
16db0 6d 65 21 3d 30 2c 20 74 68 65 6e 20 61 6e 79 20  me!=0, then any 
16dc0 77 6f 72 64 20 74 68 61 74 20 62 65 67 69 6e 20  word that begin 
16dd0 77 69 74 68 20 22 50 61 72 73 65 22 20 69 73 20  with "Parse" is 
16de0 63 68 61 6e 67 65 64 20 74 6f 0a 2a 2a 20 62 65  changed to.** be
16df0 67 69 6e 20 77 69 74 68 20 2a 6e 61 6d 65 20 69  gin with *name i
16e00 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50 52 49 56 41  nstead..*/.PRIVA
16e10 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 78 66 65  TE void tplt_xfe
16e20 72 28 63 68 61 72 20 2a 6e 61 6d 65 2c 20 46 49  r(char *name, FI
16e30 4c 45 20 2a 69 6e 2c 20 46 49 4c 45 20 2a 6f 75  LE *in, FILE *ou
16e40 74 2c 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 29 0a  t, int *lineno).
16e50 7b 0a 20 20 69 6e 74 20 69 2c 20 69 53 74 61 72  {.  int i, iStar
16e60 74 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c  t;.  char line[L
16e70 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 77 68 69 6c  INESIZE];.  whil
16e80 65 28 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49  e( fgets(line,LI
16e90 4e 45 53 49 5a 45 2c 69 6e 29 20 26 26 20 28 6c  NESIZE,in) && (l
16ea0 69 6e 65 5b 30 5d 21 3d 27 25 27 20 7c 7c 20 6c  ine[0]!='%' || l
16eb0 69 6e 65 5b 31 5d 21 3d 27 25 27 29 20 29 7b 0a  ine[1]!='%') ){.
16ec0 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b      (*lineno)++;
16ed0 0a 20 20 20 20 69 53 74 61 72 74 20 3d 20 30 3b  .    iStart = 0;
16ee0 0a 20 20 20 20 69 66 28 20 6e 61 6d 65 20 29 7b  .    if( name ){
16ef0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
16f00 6c 69 6e 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  line[i]; i++){. 
16f10 20 20 20 20 20 20 20 69 66 28 20 6c 69 6e 65 5b         if( line[
16f20 69 5d 3d 3d 27 50 27 20 26 26 20 73 74 72 6e 63  i]=='P' && strnc
16f30 6d 70 28 26 6c 69 6e 65 5b 69 5d 2c 22 50 61 72  mp(&line[i],"Par
16f40 73 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20 20 20  se",5)==0.      
16f50 20 20 20 20 26 26 20 28 69 3d 3d 30 20 7c 7c 20      && (i==0 || 
16f60 21 69 73 61 6c 70 68 61 28 6c 69 6e 65 5b 69 2d  !isalpha(line[i-
16f70 31 5d 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  1])).        ){.
16f80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
16f90 69 53 74 61 72 74 20 29 20 66 70 72 69 6e 74 66  iStart ) fprintf
16fa0 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2d 69 53  (out,"%.*s",i-iS
16fb0 74 61 72 74 2c 26 6c 69 6e 65 5b 69 53 74 61 72  tart,&line[iStar
16fc0 74 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  t]);.          f
16fd0 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c  printf(out,"%s",
16fe0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
16ff0 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20   i += 4;.       
17000 20 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b     iStart = i+1;
17010 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17020 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72   }.    }.    fpr
17030 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 26 6c  intf(out,"%s",&l
17040 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20  ine[iStart]);.  
17050 7d 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6e 65 78 74  }.}../* The next
17060 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
17070 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  the template fil
17080 65 20 61 6e 64 20 6f 70 65 6e 73 20 69 74 2c 20  e and opens it, 
17090 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 20 70  returning.** a p
170a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 70  ointer to the op
170b0 65 6e 65 64 20 66 69 6c 65 2e 20 2a 2f 0a 50 52  ened file. */.PR
170c0 49 56 41 54 45 20 46 49 4c 45 20 2a 74 70 6c 74  IVATE FILE *tplt
170d0 5f 6f 70 65 6e 28 73 74 72 75 63 74 20 6c 65 6d  _open(struct lem
170e0 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74  on *lemp).{.  st
170f0 61 74 69 63 20 63 68 61 72 20 74 65 6d 70 6c 61  atic char templa
17100 74 65 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70  tename[] = "lemp
17110 61 72 2e 63 22 3b 0a 20 20 63 68 61 72 20 62 75  ar.c";.  char bu
17120 66 5b 31 30 30 30 5d 3b 0a 20 20 46 49 4c 45 20  f[1000];.  FILE 
17130 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 74 70 6c  *in;.  char *tpl
17140 74 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63  tname;.  char *c
17150 70 3b 0a 0a 20 20 2f 2a 20 66 69 72 73 74 2c 20  p;..  /* first, 
17160 73 65 65 20 69 66 20 75 73 65 72 20 73 70 65 63  see if user spec
17170 69 66 69 65 64 20 61 20 74 65 6d 70 6c 61 74 65  ified a template
17180 20 66 69 6c 65 6e 61 6d 65 20 6f 6e 20 74 68 65   filename on the
17190 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 2a   command line. *
171a0 2f 0a 20 20 69 66 20 28 75 73 65 72 5f 74 65 6d  /.  if (user_tem
171b0 70 6c 61 74 65 6e 61 6d 65 20 21 3d 20 30 29 20  platename != 0) 
171c0 7b 0a 20 20 20 20 69 66 28 20 61 63 63 65 73 73  {.    if( access
171d0 28 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61  (user_templatena
171e0 6d 65 2c 30 30 34 29 3d 3d 2d 31 20 29 7b 0a 20  me,004)==-1 ){. 
171f0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
17200 65 72 72 2c 22 43 61 6e 27 74 20 66 69 6e 64 20  err,"Can't find 
17210 74 68 65 20 70 61 72 73 65 72 20 64 72 69 76 65  the parser drive
17220 72 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20  r template file 
17230 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20  \"%s\".\n",.    
17240 20 20 20 20 75 73 65 72 5f 74 65 6d 70 6c 61 74      user_templat
17250 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65  ename);.      le
17260 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
17270 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
17280 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66      }.    in = f
17290 6f 70 65 6e 28 75 73 65 72 5f 74 65 6d 70 6c 61  open(user_templa
172a0 74 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20  tename,"rb");.  
172b0 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
172c0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
172d0 65 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20  err,"Can't open 
172e0 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  the template fil
172f0 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 75 73 65  e \"%s\".\n",use
17300 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b  r_templatename);
17310 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  .      lemp->err
17320 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72  orcnt++;.      r
17330 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
17340 20 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a 20 20     return in;.  
17350 7d 0a 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68  }..  cp = strrch
17360 72 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  r(lemp->filename
17370 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20  ,'.');.  if( cp 
17380 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 62  ){.    sprintf(b
17390 75 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e  uf,"%.*s.lt",(in
173a0 74 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65  t)(cp-lemp->file
173b0 6e 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65  name),lemp->file
173c0 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  name);.  }else{.
173d0 20 20 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c      sprintf(buf,
173e0 22 25 73 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69  "%s.lt",lemp->fi
173f0 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69  lename);.  }.  i
17400 66 28 20 61 63 63 65 73 73 28 62 75 66 2c 30 30  f( access(buf,00
17410 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c  4)==0 ){.    tpl
17420 74 6e 61 6d 65 20 3d 20 62 75 66 3b 0a 20 20 7d  tname = buf;.  }
17430 65 6c 73 65 20 69 66 28 20 61 63 63 65 73 73 28  else if( access(
17440 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34  templatename,004
17450 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74  )==0 ){.    tplt
17460 6e 61 6d 65 20 3d 20 74 65 6d 70 6c 61 74 65 6e  name = templaten
17470 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
17480 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 70 61 74    tpltname = pat
17490 68 73 65 61 72 63 68 28 6c 65 6d 70 2d 3e 61 72  hsearch(lemp->ar
174a0 67 76 30 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65  gv0,templatename
174b0 2c 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  ,0);.  }.  if( t
174c0 70 6c 74 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  pltname==0 ){.  
174d0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
174e0 2c 22 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65  ,"Can't find the
174f0 20 70 61 72 73 65 72 20 64 72 69 76 65 72 20 74   parser driver t
17500 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25  emplate file \"%
17510 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 74 65 6d  s\".\n",.    tem
17520 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20  platename);.    
17530 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
17540 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
17550 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e    }.  in = fopen
17560 28 74 70 6c 74 6e 61 6d 65 2c 22 72 62 22 29 3b  (tpltname,"rb");
17570 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a  .  if( in==0 ){.
17580 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
17590 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74  rr,"Can't open t
175a0 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
175b0 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70   \"%s\".\n",temp
175c0 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c  latename);.    l
175d0 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
175e0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
175f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a   }.  return in;.
17600 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 23 6c  }../* Print a #l
17610 69 6e 65 20 64 69 72 65 63 74 69 76 65 20 6c 69  ine directive li
17620 6e 65 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ne to the output
17630 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54   file. */.PRIVAT
17640 45 20 76 6f 69 64 20 74 70 6c 74 5f 6c 69 6e 65  E void tplt_line
17650 64 69 72 28 46 49 4c 45 20 2a 6f 75 74 2c 20 69  dir(FILE *out, i
17660 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 68 61 72 20  nt lineno, char 
17670 2a 66 69 6c 65 6e 61 6d 65 29 0a 7b 0a 20 20 66  *filename).{.  f
17680 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e  printf(out,"#lin
17690 65 20 25 64 20 5c 22 22 2c 6c 69 6e 65 6e 6f 29  e %d \"",lineno)
176a0 3b 0a 20 20 77 68 69 6c 65 28 20 2a 66 69 6c 65  ;.  while( *file
176b0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69 66 28 20  name ){.    if( 
176c0 2a 66 69 6c 65 6e 61 6d 65 20 3d 3d 20 27 5c 5c  *filename == '\\
176d0 27 20 29 20 70 75 74 63 28 27 5c 5c 27 2c 6f 75  ' ) putc('\\',ou
176e0 74 29 3b 0a 20 20 20 20 70 75 74 63 28 2a 66 69  t);.    putc(*fi
176f0 6c 65 6e 61 6d 65 2c 6f 75 74 29 3b 0a 20 20 20  lename,out);.   
17700 20 66 69 6c 65 6e 61 6d 65 2b 2b 3b 0a 20 20 7d   filename++;.  }
17710 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
17720 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72  \"\n");.}../* Pr
17730 69 6e 74 20 61 20 73 74 72 69 6e 67 20 74 6f 20  int a string to 
17740 74 68 65 20 66 69 6c 65 20 61 6e 64 20 6b 65 65  the file and kee
17750 70 20 74 68 65 20 6c 69 6e 65 6e 75 6d 62 65 72  p the linenumber
17760 20 75 70 20 74 6f 20 64 61 74 65 20 2a 2f 0a 50   up to date */.P
17770 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74  RIVATE void tplt
17780 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a 6f 75 74  _print(FILE *out
17790 2c 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  , struct lemon *
177a0 6c 65 6d 70 2c 20 63 68 61 72 20 2a 73 74 72 2c  lemp, char *str,
177b0 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a   int *lineno).{.
177c0 20 20 69 66 28 20 73 74 72 3d 3d 30 20 29 20 72    if( str==0 ) r
177d0 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20  eturn;.  while( 
177e0 2a 73 74 72 20 29 7b 0a 20 20 20 20 70 75 74 63  *str ){.    putc
177f0 28 2a 73 74 72 2c 6f 75 74 29 3b 0a 20 20 20 20  (*str,out);.    
17800 69 66 28 20 2a 73 74 72 3d 3d 27 5c 6e 27 20 29  if( *str=='\n' )
17810 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
17820 20 20 73 74 72 2b 2b 3b 0a 20 20 7d 0a 20 20 69    str++;.  }.  i
17830 66 28 20 73 74 72 5b 2d 31 5d 21 3d 27 5c 6e 27  f( str[-1]!='\n'
17840 20 29 7b 0a 20 20 20 20 70 75 74 63 28 27 5c 6e   ){.    putc('\n
17850 27 2c 6f 75 74 29 3b 0a 20 20 20 20 28 2a 6c 69  ',out);.    (*li
17860 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 7d 0a 20 20 69  neno)++;.  }.  i
17870 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65  f (!lemp->noline
17880 6e 6f 73 66 6c 61 67 29 20 7b 0a 20 20 20 20 28  nosflag) {.    (
17890 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74  *lineno)++; tplt
178a0 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69  _linedir(out,*li
178b0 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  neno,lemp->outna
178c0 6d 65 29 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  me); .  }.  retu
178d0 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rn;.}../*.** The
178e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
178f0 6e 65 20 65 6d 69 74 73 20 63 6f 64 65 20 66 6f  ne emits code fo
17900 72 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  r the destructor
17910 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 79 6d 62   for the.** symb
17920 6f 6c 20 73 70 0a 2a 2f 0a 76 6f 69 64 20 65 6d  ol sp.*/.void em
17930 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
17940 64 65 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c  de(.  FILE *out,
17950 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
17960 20 2a 73 70 2c 0a 20 20 73 74 72 75 63 74 20 6c   *sp,.  struct l
17970 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e  emon *lemp,.  in
17980 74 20 2a 6c 69 6e 65 6e 6f 0a 29 7b 0a 20 63 68  t *lineno.){. ch
17990 61 72 20 2a 63 70 20 3d 20 30 3b 0a 0a 20 69 66  ar *cp = 0;.. if
179a0 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d  ( sp->type==TERM
179b0 49 4e 41 4c 20 29 7b 0a 20 20 20 63 70 20 3d 20  INAL ){.   cp = 
179c0 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b  lemp->tokendest;
179d0 0a 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20  .   if( cp==0 ) 
179e0 72 65 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e  return;.   fprin
179f0 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28  tf(out,"{\n"); (
17a00 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c  *lineno)++;. }el
17a10 73 65 20 69 66 28 20 73 70 2d 3e 64 65 73 74 72  se if( sp->destr
17a20 75 63 74 6f 72 20 29 7b 0a 20 20 20 63 70 20 3d  uctor ){.   cp =
17a30 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b   sp->destructor;
17a40 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
17a50 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f  "{\n"); (*lineno
17a60 29 2b 2b 3b 0a 20 20 20 69 66 20 28 21 6c 65 6d  )++;.   if (!lem
17a70 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
17a80 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ) { (*lineno)++;
17a90 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75   tplt_linedir(ou
17aa0 74 2c 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f  t,sp->destLineno
17ab0 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
17ac0 3b 20 7d 0a 20 7d 65 6c 73 65 20 69 66 28 20 6c  ; }. }else if( l
17ad0 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a  emp->vardest ){.
17ae0 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61     cp = lemp->va
17af0 72 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70  rdest;.   if( cp
17b00 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
17b10 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c   fprintf(out,"{\
17b20 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n"); (*lineno)++
17b30 3b 0a 20 7d 65 6c 73 65 7b 0a 20 20 20 61 73 73  ;. }else{.   ass
17b40 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61  ert( 0 );  /* Ca
17b50 6e 6e 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20  nnot happen */. 
17b60 7d 0a 20 66 6f 72 28 3b 20 2a 63 70 3b 20 63 70  }. for(; *cp; cp
17b70 2b 2b 29 7b 0a 20 20 20 69 66 28 20 2a 63 70 3d  ++){.   if( *cp=
17b80 3d 27 24 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='$' && cp[1]=='
17b90 24 27 20 29 7b 0a 20 20 20 20 20 66 70 72 69 6e  $' ){.     fprin
17ba0 74 66 28 6f 75 74 2c 22 28 79 79 70 6d 69 6e 6f  tf(out,"(yypmino
17bb0 72 2d 3e 79 79 25 64 29 22 2c 73 70 2d 3e 64 74  r->yy%d)",sp->dt
17bc0 6e 75 6d 29 3b 0a 20 20 20 20 20 63 70 2b 2b 3b  num);.     cp++;
17bd0 0a 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a  .     continue;.
17be0 20 20 20 7d 0a 20 20 20 69 66 28 20 2a 63 70 3d     }.   if( *cp=
17bf0 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f  ='\n' ) (*lineno
17c00 29 2b 2b 3b 0a 20 20 20 66 70 75 74 63 28 2a 63  )++;.   fputc(*c
17c10 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20 66 70 72 69  p,out);. }. fpri
17c20 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 28  ntf(out,"\n"); (
17c30 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 69 66 20  *lineno)++;. if 
17c40 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f  (!lemp->nolineno
17c50 73 66 6c 61 67 29 20 7b 20 0a 20 20 20 28 2a 6c  sflag) { .   (*l
17c60 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c  ineno)++; tplt_l
17c70 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65  inedir(out,*line
17c80 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  no,lemp->outname
17c90 29 3b 20 0a 20 7d 0a 20 66 70 72 69 6e 74 66 28  ); . }. fprintf(
17ca0 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69  out,"}\n"); (*li
17cb0 6e 65 6e 6f 29 2b 2b 3b 0a 20 72 65 74 75 72 6e  neno)++;. return
17cc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
17cd0 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f  n TRUE (non-zero
17ce0 29 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  ) if the given s
17cf0 79 6d 62 6f 6c 20 68 61 73 20 61 20 64 65 73 74  ymbol has a dest
17d00 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 68  ructor..*/.int h
17d10 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28 73 74  as_destructor(st
17d20 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c  ruct symbol *sp,
17d30 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c   struct lemon *l
17d40 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 72 65 74  emp).{.  int ret
17d50 3b 0a 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65  ;.  if( sp->type
17d60 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  ==TERMINAL ){.  
17d70 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 74 6f    ret = lemp->to
17d80 6b 65 6e 64 65 73 74 21 3d 30 3b 0a 20 20 7d 65  kendest!=0;.  }e
17d90 6c 73 65 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c  lse{.    ret = l
17da0 65 6d 70 2d 3e 76 61 72 64 65 73 74 21 3d 30 20  emp->vardest!=0 
17db0 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  || sp->destructo
17dc0 72 21 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  r!=0;.  }.  retu
17dd0 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
17de0 20 41 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20   Append text to 
17df0 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
17e00 6c 6f 63 61 74 65 64 20 73 74 72 69 6e 67 2e 20  located string. 
17e10 20 49 66 20 7a 54 65 78 74 20 69 73 20 30 20 74   If zText is 0 t
17e20 68 65 6e 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  hen.** reset the
17e30 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20 65 6d   string to be em
17e40 70 74 79 20 61 67 61 69 6e 2e 20 20 41 6c 77 61  pty again.  Alwa
17e50 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f  ys return the co
17e60 6d 70 6c 65 74 65 20 74 65 78 74 0a 2a 2a 20 6f  mplete text.** o
17e70 66 20 74 68 65 20 73 74 72 69 6e 67 20 28 77 68  f the string (wh
17e80 69 63 68 20 69 73 20 6f 76 65 72 77 72 69 74 74  ich is overwritt
17e90 65 6e 20 77 69 74 68 20 65 61 63 68 20 63 61 6c  en with each cal
17ea0 6c 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62 79 74 65  l)..**.** n byte
17eb0 73 20 6f 66 20 7a 54 65 78 74 20 61 72 65 20 73  s of zText are s
17ec0 74 6f 72 65 64 2e 20 20 49 66 20 6e 3d 3d 30 20  tored.  If n==0 
17ed0 74 68 65 6e 20 61 6c 6c 20 6f 66 20 7a 54 65 78  then all of zTex
17ee0 74 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  t up to the firs
17ef0 74 0a 2a 2a 20 5c 30 30 30 20 74 65 72 6d 69 6e  t.** \000 termin
17f00 61 74 6f 72 20 69 73 20 73 74 6f 72 65 64 2e 20  ator is stored. 
17f10 20 7a 54 65 78 74 20 63 61 6e 20 63 6f 6e 74 61   zText can conta
17f20 69 6e 20 75 70 20 74 6f 20 74 77 6f 20 69 6e 73  in up to two ins
17f30 74 61 6e 63 65 73 20 6f 66 0a 2a 2a 20 25 64 2e  tances of.** %d.
17f40 20 20 54 68 65 20 76 61 6c 75 65 73 20 6f 66 20    The values of 
17f50 70 31 20 61 6e 64 20 70 32 20 61 72 65 20 77 72  p1 and p2 are wr
17f60 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 66  itten into the f
17f70 69 72 73 74 20 61 6e 64 20 73 65 63 6f 6e 64 0a  irst and second.
17f80 2a 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ** %d..**.** If 
17f90 6e 3d 3d 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  n==-1, then the 
17fa0 70 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74  previous charact
17fb0 65 72 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  er is overwritte
17fc0 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63 68  n..*/.PRIVATE ch
17fd0 61 72 20 2a 61 70 70 65 6e 64 5f 73 74 72 28 63  ar *append_str(c
17fe0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
17ff0 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 70 31 2c  , int n, int p1,
18000 20 69 6e 74 20 70 32 29 7b 0a 20 20 73 74 61 74   int p2){.  stat
18010 69 63 20 63 68 61 72 20 65 6d 70 74 79 5b 31 5d  ic char empty[1]
18020 20 3d 20 7b 20 30 20 7d 3b 0a 20 20 73 74 61 74   = { 0 };.  stat
18030 69 63 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a  ic char *z = 0;.
18040 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c    static int all
18050 6f 63 65 64 20 3d 20 30 3b 0a 20 20 73 74 61 74  oced = 0;.  stat
18060 69 63 20 69 6e 74 20 75 73 65 64 20 3d 20 30 3b  ic int used = 0;
18070 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68 61 72  .  int c;.  char
18080 20 7a 49 6e 74 5b 34 30 5d 3b 0a 20 20 69 66 28   zInt[40];.  if(
18090 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20   zText==0 ){.   
180a0 20 75 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 72   used = 0;.    r
180b0 65 74 75 72 6e 20 7a 3b 0a 20 20 7d 0a 20 20 69  eturn z;.  }.  i
180c0 66 28 20 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 69  f( n<=0 ){.    i
180d0 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( n<0 ){.      
180e0 75 73 65 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  used += n;.     
180f0 20 61 73 73 65 72 74 28 20 75 73 65 64 3e 3d 30   assert( used>=0
18100 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   );.    }.    n 
18110 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 54  = lemonStrlen(zT
18120 65 78 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ext);.  }.  if( 
18130 28 69 6e 74 29 20 28 6e 2b 73 69 7a 65 6f 66 28  (int) (n+sizeof(
18140 7a 49 6e 74 29 2a 32 2b 75 73 65 64 29 20 3e 3d  zInt)*2+used) >=
18150 20 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20   alloced ){.    
18160 61 6c 6c 6f 63 65 64 20 3d 20 6e 20 2b 20 73 69  alloced = n + si
18170 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 20 2b 20 75  zeof(zInt)*2 + u
18180 73 65 64 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a  sed + 200;.    z
18190 20 3d 20 28 63 68 61 72 20 2a 29 20 72 65 61 6c   = (char *) real
181a0 6c 6f 63 28 7a 2c 20 20 61 6c 6c 6f 63 65 64 29  loc(z,  alloced)
181b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 3d 3d 30  ;.  }.  if( z==0
181c0 20 29 20 72 65 74 75 72 6e 20 65 6d 70 74 79 3b   ) return empty;
181d0 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
181e0 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 28 7a  0 ){.    c = *(z
181f0 54 65 78 74 2b 2b 29 3b 0a 20 20 20 20 69 66 28  Text++);.    if(
18200 20 63 3d 3d 27 25 27 20 26 26 20 6e 3e 30 20 26   c=='%' && n>0 &
18210 26 20 7a 54 65 78 74 5b 30 5d 3d 3d 27 64 27 20  & zText[0]=='d' 
18220 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ){.      sprintf
18230 28 7a 49 6e 74 2c 20 22 25 64 22 2c 20 70 31 29  (zInt, "%d", p1)
18240 3b 0a 20 20 20 20 20 20 70 31 20 3d 20 70 32 3b  ;.      p1 = p2;
18250 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a  .      strcpy(&z
18260 5b 75 73 65 64 5d 2c 20 7a 49 6e 74 29 3b 0a 20  [used], zInt);. 
18270 20 20 20 20 20 75 73 65 64 20 2b 3d 20 6c 65 6d       used += lem
18280 6f 6e 53 74 72 6c 65 6e 28 26 7a 5b 75 73 65 64  onStrlen(&z[used
18290 5d 29 3b 0a 20 20 20 20 20 20 7a 54 65 78 74 2b  ]);.      zText+
182a0 2b 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  +;.      n--;.  
182b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
182c0 5b 75 73 65 64 2b 2b 5d 20 3d 20 63 3b 0a 20 20  [used++] = c;.  
182d0 20 20 7d 0a 20 20 7d 0a 20 20 7a 5b 75 73 65 64    }.  }.  z[used
182e0 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
182f0 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 7a 43 6f 64  z;.}../*.** zCod
18300 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 74 68  e is a string th
18310 61 74 20 69 73 20 74 68 65 20 61 63 74 69 6f 6e  at is the action
18320 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
18330 20 61 20 72 75 6c 65 2e 20 20 45 78 70 61 6e 64   a rule.  Expand
18340 0a 2a 2a 20 74 68 65 20 73 79 6d 62 6f 6c 73 20  .** the symbols 
18350 69 6e 20 74 68 69 73 20 73 74 72 69 6e 67 20 73  in this string s
18360 6f 20 74 68 61 74 20 74 68 65 20 72 65 66 65 72  o that the refer
18370 20 74 6f 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20   to elements of 
18380 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 73 74  the parser.** st
18390 61 63 6b 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ack..*/.PRIVATE 
183a0 76 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 5f 63  void translate_c
183b0 6f 64 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ode(struct lemon
183c0 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 72   *lemp, struct r
183d0 75 6c 65 20 2a 72 70 29 7b 0a 20 20 63 68 61 72  ule *rp){.  char
183e0 20 2a 63 70 2c 20 2a 78 70 3b 0a 20 20 69 6e 74   *cp, *xp;.  int
183f0 20 69 3b 0a 20 20 63 68 61 72 20 6c 68 73 75 73   i;.  char lhsus
18400 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 72  ed = 0;    /* Tr
18410 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 65 6c  ue if the LHS el
18420 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 20 75  ement has been u
18430 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 75 73  sed */.  char us
18440 65 64 5b 4d 41 58 52 48 53 5d 3b 20 20 20 2f 2a  ed[MAXRHS];   /*
18450 20 54 72 75 65 20 66 6f 72 20 65 61 63 68 20 52   True for each R
18460 48 53 20 65 6c 65 6d 65 6e 74 20 77 68 69 63 68  HS element which
18470 20 69 73 20 75 73 65 64 20 2a 2f 0a 0a 20 20 66   is used */..  f
18480 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
18490 68 73 3b 20 69 2b 2b 29 20 75 73 65 64 5b 69 5d  hs; i++) used[i]
184a0 20 3d 20 30 3b 0a 20 20 6c 68 73 75 73 65 64 20   = 0;.  lhsused 
184b0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72 70 2d 3e  = 0;..  if( rp->
184c0 63 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  code==0 ){.    s
184d0 74 61 74 69 63 20 63 68 61 72 20 6e 65 77 6c 69  tatic char newli
184e0 6e 65 73 74 72 5b 32 5d 20 3d 20 7b 20 27 5c 6e  nestr[2] = { '\n
184f0 27 2c 20 27 5c 30 27 20 7d 3b 0a 20 20 20 20 72  ', '\0' };.    r
18500 70 2d 3e 63 6f 64 65 20 3d 20 6e 65 77 6c 69 6e  p->code = newlin
18510 65 73 74 72 3b 0a 20 20 20 20 72 70 2d 3e 6c 69  estr;.    rp->li
18520 6e 65 20 3d 20 72 70 2d 3e 72 75 6c 65 6c 69 6e  ne = rp->rulelin
18530 65 3b 0a 20 20 7d 0a 0a 20 20 61 70 70 65 6e 64  e;.  }..  append
18540 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 0a  _str(0,0,0,0);..
18550 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 20    /* This const 
18560 63 61 73 74 20 69 73 20 77 72 6f 6e 67 20 62 75  cast is wrong bu
18570 74 20 68 61 72 6d 6c 65 73 73 2c 20 69 66 20 77  t harmless, if w
18580 65 27 72 65 20 63 61 72 65 66 75 6c 2e 20 2a 2f  e're careful. */
18590 0a 20 20 66 6f 72 28 63 70 3d 28 63 68 61 72 20  .  for(cp=(char 
185a0 2a 29 72 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b  *)rp->code; *cp;
185b0 20 63 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   cp++){.    if( 
185c0 69 73 61 6c 70 68 61 28 2a 63 70 29 20 26 26 20  isalpha(*cp) && 
185d0 28 63 70 3d 3d 72 70 2d 3e 63 6f 64 65 20 7c 7c  (cp==rp->code ||
185e0 20 28 21 69 73 61 6c 6e 75 6d 28 63 70 5b 2d 31   (!isalnum(cp[-1
185f0 5d 29 20 26 26 20 63 70 5b 2d 31 5d 21 3d 27 5f  ]) && cp[-1]!='_
18600 27 29 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ')) ){.      cha
18610 72 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 66  r saved;.      f
18620 6f 72 28 78 70 3d 20 26 63 70 5b 31 5d 3b 20 69  or(xp= &cp[1]; i
18630 73 61 6c 6e 75 6d 28 2a 78 70 29 20 7c 7c 20 2a  salnum(*xp) || *
18640 78 70 3d 3d 27 5f 27 3b 20 78 70 2b 2b 29 3b 0a  xp=='_'; xp++);.
18650 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 78        saved = *x
18660 70 3b 0a 20 20 20 20 20 20 2a 78 70 20 3d 20 30  p;.      *xp = 0
18670 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e  ;.      if( rp->
18680 6c 68 73 61 6c 69 61 73 20 26 26 20 73 74 72 63  lhsalias && strc
18690 6d 70 28 63 70 2c 72 70 2d 3e 6c 68 73 61 6c 69  mp(cp,rp->lhsali
186a0 61 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  as)==0 ){.      
186b0 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79    append_str("yy
186c0 67 6f 74 6f 6d 69 6e 6f 72 2e 79 79 25 64 22 2c  gotominor.yy%d",
186d0 30 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d  0,rp->lhs->dtnum
186e0 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 63 70 20  ,0);.        cp 
186f0 3d 20 78 70 3b 0a 20 20 20 20 20 20 20 20 6c 68  = xp;.        lh
18700 73 75 73 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  sused = 1;.     
18710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18720 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
18730 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
18740 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73       if( rp->rhs
18750 61 6c 69 61 73 5b 69 5d 20 26 26 20 73 74 72 63  alias[i] && strc
18760 6d 70 28 63 70 2c 72 70 2d 3e 72 68 73 61 6c 69  mp(cp,rp->rhsali
18770 61 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20  as[i])==0 ){.   
18780 20 20 20 20 20 20 20 20 20 69 66 28 20 63 70 21           if( cp!
18790 3d 72 70 2d 3e 63 6f 64 65 20 26 26 20 63 70 5b  =rp->code && cp[
187a0 2d 31 5d 3d 3d 27 40 27 20 29 7b 0a 20 20 20 20  -1]=='@' ){.    
187b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
187c0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  the argument is 
187d0 6f 66 20 74 68 65 20 66 6f 72 6d 20 40 58 20 74  of the form @X t
187e0 68 65 6e 20 73 75 62 73 74 69 74 75 74 65 64 0a  hen substituted.
187f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
18800 20 74 68 65 20 74 6f 6b 65 6e 20 6e 75 6d 62 65   the token numbe
18810 72 20 6f 66 20 58 2c 20 6e 6f 74 20 74 68 65 20  r of X, not the 
18820 76 61 6c 75 65 20 6f 66 20 58 20 2a 2f 0a 20 20  value of X */.  
18830 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65              appe
18840 6e 64 5f 73 74 72 28 22 79 79 6d 73 70 5b 25 64  nd_str("yymsp[%d
18850 5d 2e 6d 61 6a 6f 72 22 2c 2d 31 2c 69 2d 72 70  ].major",-1,i-rp
18860 2d 3e 6e 72 68 73 2b 31 2c 30 29 3b 0a 20 20 20  ->nrhs+1,0);.   
18870 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
18880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
18890 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
188a0 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20  = rp->rhs[i];.  
188b0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
188c0 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  dtnum;.         
188d0 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70       if( sp->typ
188e0 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
188f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18900 20 20 20 20 64 74 6e 75 6d 20 3d 20 73 70 2d 3e      dtnum = sp->
18910 73 75 62 73 79 6d 5b 30 5d 2d 3e 64 74 6e 75 6d  subsym[0]->dtnum
18920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
18930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
18940 20 20 20 20 20 20 20 64 74 6e 75 6d 20 3d 20 73         dtnum = s
18950 70 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20  p->dtnum;.      
18960 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18970 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73          append_s
18980 74 72 28 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 69  tr("yymsp[%d].mi
18990 6e 6f 72 2e 79 79 25 64 22 2c 30 2c 69 2d 72 70  nor.yy%d",0,i-rp
189a0 2d 3e 6e 72 68 73 2b 31 2c 20 64 74 6e 75 6d 29  ->nrhs+1, dtnum)
189b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
189c0 20 20 20 20 20 20 20 20 20 20 20 20 63 70 20 3d              cp =
189d0 20 78 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20   xp;.           
189e0 20 75 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20   used[i] = 1;.  
189f0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
18a00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
18a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
18a20 20 20 20 20 20 2a 78 70 20 3d 20 73 61 76 65 64       *xp = saved
18a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 70 70 65  ;.    }.    appe
18a40 6e 64 5f 73 74 72 28 63 70 2c 20 31 2c 20 30 2c  nd_str(cp, 1, 0,
18a50 20 30 29 3b 0a 20 20 7d 20 2f 2a 20 45 6e 64 20   0);.  } /* End 
18a60 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  loop */..  /* Ch
18a70 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
18a80 20 74 68 65 20 4c 48 53 20 68 61 73 20 62 65 65   the LHS has bee
18a90 6e 20 75 73 65 64 20 2a 2f 0a 20 20 69 66 28 20  n used */.  if( 
18aa0 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20  rp->lhsalias && 
18ab0 21 6c 68 73 75 73 65 64 20 29 7b 0a 20 20 20 20  !lhsused ){.    
18ac0 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
18ad0 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65  ilename,rp->rule
18ae0 6c 69 6e 65 2c 0a 20 20 20 20 20 20 22 4c 61 62  line,.      "Lab
18af0 65 6c 20 5c 22 25 73 5c 22 20 66 6f 72 20 5c 22  el \"%s\" for \"
18b00 25 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65  %s(%s)\" is neve
18b10 72 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20  r used.",.      
18b20 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72    rp->lhsalias,r
18b30 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 72 70 2d  p->lhs->name,rp-
18b40 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20  >lhsalias);.    
18b50 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
18b60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
18b70 72 61 74 65 20 64 65 73 74 72 75 63 74 6f 72 20  rate destructor 
18b80 63 6f 64 65 20 66 6f 72 20 52 48 53 20 73 79 6d  code for RHS sym
18b90 62 6f 6c 73 20 77 68 69 63 68 20 61 72 65 20 6e  bols which are n
18ba0 6f 74 20 75 73 65 64 20 69 6e 20 74 68 65 0a 20  ot used in the. 
18bb0 20 2a 2a 20 72 65 64 75 63 65 20 63 6f 64 65 20   ** reduce code 
18bc0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
18bd0 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  rp->nrhs; i++){.
18be0 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61      if( rp->rhsa
18bf0 6c 69 61 73 5b 69 5d 20 26 26 20 21 75 73 65 64  lias[i] && !used
18c00 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 45 72 72  [i] ){.      Err
18c10 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
18c20 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e  name,rp->rulelin
18c30 65 2c 0a 20 20 20 20 20 20 20 20 22 4c 61 62 65  e,.        "Labe
18c40 6c 20 25 73 20 66 6f 72 20 5c 22 25 73 28 25 73  l %s for \"%s(%s
18c50 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73 65  )\" is never use
18c60 64 2e 22 2c 0a 20 20 20 20 20 20 20 20 72 70 2d  d.",.        rp-
18c70 3e 72 68 73 61 6c 69 61 73 5b 69 5d 2c 72 70 2d  >rhsalias[i],rp-
18c80 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 72 70  >rhs[i]->name,rp
18c90 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 0a  ->rhsalias[i]);.
18ca0 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
18cb0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  rcnt++;.    }els
18cc0 65 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69  e if( rp->rhsali
18cd0 61 73 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  as[i]==0 ){.    
18ce0 20 20 69 66 28 20 68 61 73 5f 64 65 73 74 72 75    if( has_destru
18cf0 63 74 6f 72 28 72 70 2d 3e 72 68 73 5b 69 5d 2c  ctor(rp->rhs[i],
18d00 6c 65 6d 70 29 20 29 7b 0a 20 20 20 20 20 20 20  lemp) ){.       
18d10 20 61 70 70 65 6e 64 5f 73 74 72 28 22 20 20 79   append_str("  y
18d20 79 5f 64 65 73 74 72 75 63 74 6f 72 28 79 79 70  y_destructor(yyp
18d30 50 61 72 73 65 72 2c 25 64 2c 26 79 79 6d 73 70  Parser,%d,&yymsp
18d40 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c 6e 22 2c  [%d].minor);\n",
18d50 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 72   0,.           r
18d60 70 2d 3e 72 68 73 5b 69 5d 2d 3e 69 6e 64 65 78  p->rhs[i]->index
18d70 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 29 3b 0a  ,i-rp->nrhs+1);.
18d80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18d90 20 20 20 20 20 2f 2a 20 4e 6f 20 64 65 73 74 72       /* No destr
18da0 75 63 74 6f 72 20 64 65 66 69 6e 65 64 20 66 6f  uctor defined fo
18db0 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  r this term */. 
18dc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18dd0 0a 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 20  .  if( rp->code 
18de0 29 7b 0a 20 20 20 20 63 70 20 3d 20 61 70 70 65  ){.    cp = appe
18df0 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b  nd_str(0,0,0,0);
18e00 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20  .    rp->code = 
18e10 53 74 72 73 61 66 65 28 63 70 3f 63 70 3a 22 22  Strsafe(cp?cp:""
18e20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  );.  }.}../* .**
18e30 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
18e40 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
18e50 65 6e 20 74 68 65 20 72 75 6c 65 20 22 72 70 22  en the rule "rp"
18e60 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 57 72   is reduced.  Wr
18e70 69 74 65 0a 2a 2a 20 74 68 65 20 63 6f 64 65 20  ite.** the code 
18e80 74 6f 20 22 6f 75 74 22 2e 20 20 4d 61 6b 65 20  to "out".  Make 
18e90 73 75 72 65 20 6c 69 6e 65 6e 6f 20 73 74 61 79  sure lineno stay
18ea0 73 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f  s up-to-date..*/
18eb0 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 65 6d  .PRIVATE void em
18ec0 69 74 5f 63 6f 64 65 28 0a 20 20 46 49 4c 45 20  it_code(.  FILE 
18ed0 2a 6f 75 74 2c 0a 20 20 73 74 72 75 63 74 20 72  *out,.  struct r
18ee0 75 6c 65 20 2a 72 70 2c 0a 20 20 73 74 72 75 63  ule *rp,.  struc
18ef0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20  t lemon *lemp,. 
18f00 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 0a 29 7b 0a   int *lineno.){.
18f10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 70 3b   const char *cp;
18f20 0a 0a 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .. /* Generate c
18f30 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 72 65  ode to do the re
18f40 64 75 63 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  duce action */. 
18f50 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 7b 0a  if( rp->code ){.
18f60 20 20 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f     if (!lemp->no
18f70 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 20 28  linenosflag) { (
18f80 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74  *lineno)++; tplt
18f90 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 72 70 2d  _linedir(out,rp-
18fa0 3e 6c 69 6e 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65  >line,lemp->file
18fb0 6e 61 6d 65 29 3b 20 7d 0a 20 20 20 66 70 72 69  name); }.   fpri
18fc0 6e 74 66 28 6f 75 74 2c 22 7b 25 73 22 2c 72 70  ntf(out,"{%s",rp
18fd0 2d 3e 63 6f 64 65 29 3b 0a 20 20 20 66 6f 72 28  ->code);.   for(
18fe0 63 70 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a 63 70  cp=rp->code; *cp
18ff0 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 69 66  ; cp++){.     if
19000 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a  ( *cp=='\n' ) (*
19010 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 7d 20  lineno)++;.   } 
19020 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 20  /* End loop */. 
19030 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d    fprintf(out,"}
19040 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n"); (*lineno)+
19050 2b 3b 0a 20 20 20 69 66 20 28 21 6c 65 6d 70 2d  +;.   if (!lemp-
19060 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20  >nolinenosflag) 
19070 7b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74  { (*lineno)++; t
19080 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c  plt_linedir(out,
19090 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75  *lineno,lemp->ou
190a0 74 6e 61 6d 65 29 3b 20 7d 0a 20 7d 20 2f 2a 20  tname); }. } /* 
190b0 45 6e 64 20 69 66 28 20 72 70 2d 3e 63 6f 64 65  End if( rp->code
190c0 20 29 20 2a 2f 0a 0a 20 72 65 74 75 72 6e 3b 0a   ) */.. return;.
190d0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  }../*.** Print t
190e0 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  he definition of
190f0 20 74 68 65 20 75 6e 69 6f 6e 20 75 73 65 64 20   the union used 
19100 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 27 73  for the parser's
19110 20 64 61 74 61 20 73 74 61 63 6b 2e 0a 2a 2a 20   data stack..** 
19120 54 68 69 73 20 75 6e 69 6f 6e 20 63 6f 6e 74 61  This union conta
19130 69 6e 73 20 66 69 65 6c 64 73 20 66 6f 72 20 65  ins fields for e
19140 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20 64 61  very possible da
19150 74 61 20 74 79 70 65 20 66 6f 72 20 74 6f 6b 65  ta type for toke
19160 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f 6e 74 65 72  ns.** and nonter
19170 6d 69 6e 61 6c 73 2e 20 20 49 6e 20 74 68 65 20  minals.  In the 
19180 70 72 6f 63 65 73 73 20 6f 66 20 63 6f 6d 70 75  process of compu
19190 74 69 6e 67 20 61 6e 64 20 70 72 69 6e 74 69 6e  ting and printin
191a0 67 20 74 68 69 73 0a 2a 2a 20 75 6e 69 6f 6e 2c  g this.** union,
191b0 20 61 6c 73 6f 20 73 65 74 20 74 68 65 20 22 2e   also set the ".
191c0 64 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66 20  dtnum" field of 
191d0 65 76 65 72 79 20 74 65 72 6d 69 6e 61 6c 20 61  every terminal a
191e0 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 0a 2a  nd nonterminal.*
191f0 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f 0a 76 6f 69  * symbol..*/.voi
19200 64 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e  d print_stack_un
19210 69 6f 6e 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74  ion(.  FILE *out
19220 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19230 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74     /* The output
19240 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 73 74 72   stream */.  str
19250 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
19260 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19270 6d 61 69 6e 20 69 6e 66 6f 20 73 74 72 75 63 74  main info struct
19280 75 72 65 20 66 6f 72 20 74 68 69 73 20 70 61 72  ure for this par
19290 73 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6c  ser */.  int *pl
192a0 69 6e 65 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  ineno,          
192b0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
192c0 74 6f 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62  to the line numb
192d0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 68 66 6c  er */.  int mhfl
192e0 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
192f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 67      /* True if g
19300 65 6e 65 72 61 74 69 6e 67 20 6d 61 6b 65 68 65  enerating makehe
19310 61 64 65 72 73 20 6f 75 74 70 75 74 20 2a 2f 0a  aders output */.
19320 29 7b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20  ){.  int lineno 
19330 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20 20 2f  = *plineno;    /
19340 2a 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65  * The line numbe
19350 72 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20  r of the output 
19360 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 74 79 70 65  */.  char **type
19370 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
19380 2a 20 41 20 68 61 73 68 20 74 61 62 6c 65 20 6f  * A hash table o
19390 66 20 64 61 74 61 74 79 70 65 73 20 2a 2f 0a 20  f datatypes */. 
193a0 20 69 6e 74 20 61 72 72 61 79 73 69 7a 65 3b 20   int arraysize; 
193b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
193c0 7a 65 20 6f 66 20 74 68 65 20 22 74 79 70 65 73  ze of the "types
193d0 22 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  " array */.  int
193e0 20 6d 61 78 64 74 6c 65 6e 67 74 68 3b 20 20 20   maxdtlength;   
193f0 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
19400 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e 79 20  m length of any 
19410 22 2e 64 61 74 61 74 79 70 65 22 20 66 69 65 6c  ".datatype" fiel
19420 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74  d. */.  char *st
19430 64 64 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddt;            
19440 20 20 2f 2a 20 53 74 61 6e 64 61 72 64 69 7a 65    /* Standardize
19450 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 64 61 74  d name for a dat
19460 61 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74 20 69  atype */.  int i
19470 2c 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ,j;             
19480 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
19490 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 68  nters */.  int h
194a0 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ash;            
194b0 20 20 20 20 20 2f 2a 20 46 6f 72 20 68 61 73 68       /* For hash
194c0 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
194d0 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 6f 6e 73  a type */.  cons
194e0 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20  t char *name;   
194f0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
19500 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 0a   the parser */..
19510 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
19520 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 79 70  d initialize typ
19530 65 73 5b 5d 20 61 6e 64 20 61 6c 6c 6f 63 61 74  es[] and allocat
19540 65 20 73 74 64 64 74 5b 5d 20 2a 2f 0a 20 20 61  e stddt[] */.  a
19550 72 72 61 79 73 69 7a 65 20 3d 20 6c 65 6d 70 2d  rraysize = lemp-
19560 3e 6e 73 79 6d 62 6f 6c 20 2a 20 32 3b 0a 20 20  >nsymbol * 2;.  
19570 74 79 70 65 73 20 3d 20 28 63 68 61 72 2a 2a 29  types = (char**)
19580 63 61 6c 6c 6f 63 28 20 61 72 72 61 79 73 69 7a  calloc( arraysiz
19590 65 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  e, sizeof(char*)
195a0 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65 73 3d   );.  if( types=
195b0 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
195c0 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66  f(stderr,"Out of
195d0 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20   memory.\n");.  
195e0 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
195f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61   for(i=0; i<arra
19600 79 73 69 7a 65 3b 20 69 2b 2b 29 20 74 79 70 65  ysize; i++) type
19610 73 5b 69 5d 20 3d 20 30 3b 0a 20 20 6d 61 78 64  s[i] = 0;.  maxd
19620 74 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 69  tlength = 0;.  i
19630 66 28 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65  f( lemp->vartype
19640 20 29 7b 0a 20 20 20 20 6d 61 78 64 74 6c 65 6e   ){.    maxdtlen
19650 67 74 68 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  gth = lemonStrle
19660 6e 28 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 29  n(lemp->vartype)
19670 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
19680 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
19690 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
196a0 6c 65 6e 3b 0a 20 20 20 20 73 74 72 75 63 74 20  len;.    struct 
196b0 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
196c0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
196d0 20 20 20 69 66 28 20 73 70 2d 3e 64 61 74 61 74     if( sp->datat
196e0 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ype==0 ) continu
196f0 65 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d  e;.    len = lem
19700 6f 6e 53 74 72 6c 65 6e 28 73 70 2d 3e 64 61 74  onStrlen(sp->dat
19710 61 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20  atype);.    if( 
19720 6c 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74 68 20  len>maxdtlength 
19730 29 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20  ) maxdtlength = 
19740 6c 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64 64 74  len;.  }.  stddt
19750 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63   = (char*)malloc
19760 28 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a 32 20  ( maxdtlength*2 
19770 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 73 74 64  + 1 );.  if( std
19780 64 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  dt==0 ){.    fpr
19790 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74  intf(stderr,"Out
197a0 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b   of memory.\n");
197b0 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
197c0 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20 61 20  }..  /* Build a 
197d0 68 61 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61  hash table of da
197e0 74 61 74 79 70 65 73 2e 20 54 68 65 20 22 2e 64  tatypes. The ".d
197f0 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66 20 65  tnum" field of e
19800 61 63 68 20 73 79 6d 62 6f 6c 0a 20 20 2a 2a 20  ach symbol.  ** 
19810 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74  is filled in wit
19820 68 20 74 68 65 20 68 61 73 68 20 69 6e 64 65 78  h the hash index
19830 20 70 6c 75 73 20 31 2e 20 20 41 20 22 2e 64 74   plus 1.  A ".dt
19840 6e 75 6d 22 20 76 61 6c 75 65 20 6f 66 20 30 20  num" value of 0 
19850 69 73 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72  is.  ** used for
19860 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c   terminal symbol
19870 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  s.  If there is 
19880 6e 6f 20 25 64 65 66 61 75 6c 74 5f 74 79 70 65  no %default_type
19890 20 64 65 66 69 6e 65 64 20 74 68 65 6e 0a 20 20   defined then.  
198a0 2a 2a 20 30 20 69 73 20 61 6c 73 6f 20 75 73 65  ** 0 is also use
198b0 64 20 61 73 20 74 68 65 20 2e 64 74 6e 75 6d 20  d as the .dtnum 
198c0 76 61 6c 75 65 20 66 6f 72 20 6e 6f 6e 74 65 72  value for nonter
198d0 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 64 6f 20  minals which do 
198e0 6e 6f 74 20 73 70 65 63 69 66 79 0a 20 20 2a 2a  not specify.  **
198f0 20 61 20 64 61 74 61 74 79 70 65 20 75 73 69 6e   a datatype usin
19900 67 20 74 68 65 20 25 74 79 70 65 20 64 69 72 65  g the %type dire
19910 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ctive..  */.  fo
19920 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
19930 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
19940 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
19950 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62  *sp = lemp->symb
19960 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 63 68 61 72  ols[i];.    char
19970 20 2a 63 70 3b 0a 20 20 20 20 69 66 28 20 73 70   *cp;.    if( sp
19980 3d 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29  ==lemp->errsym )
19990 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75  {.      sp->dtnu
199a0 6d 20 3d 20 61 72 72 61 79 73 69 7a 65 2b 31 3b  m = arraysize+1;
199b0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
199c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
199d0 70 2d 3e 74 79 70 65 21 3d 4e 4f 4e 54 45 52 4d  p->type!=NONTERM
199e0 49 4e 41 4c 20 7c 7c 20 28 73 70 2d 3e 64 61 74  INAL || (sp->dat
199f0 61 74 79 70 65 3d 3d 30 20 26 26 20 6c 65 6d 70  atype==0 && lemp
19a00 2d 3e 76 61 72 74 79 70 65 3d 3d 30 29 20 29 7b  ->vartype==0) ){
19a10 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d  .      sp->dtnum
19a20 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 0;.      cont
19a30 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
19a40 63 70 20 3d 20 73 70 2d 3e 64 61 74 61 74 79 70  cp = sp->datatyp
19a50 65 3b 0a 20 20 20 20 69 66 28 20 63 70 3d 3d 30  e;.    if( cp==0
19a60 20 29 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61   ) cp = lemp->va
19a70 72 74 79 70 65 3b 0a 20 20 20 20 6a 20 3d 20 30  rtype;.    j = 0
19a80 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73 73  ;.    while( iss
19a90 70 61 63 65 28 2a 63 70 29 20 29 20 63 70 2b 2b  pace(*cp) ) cp++
19aa0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 63 70  ;.    while( *cp
19ab0 20 29 20 73 74 64 64 74 5b 6a 2b 2b 5d 20 3d 20   ) stddt[j++] = 
19ac0 2a 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65  *cp++;.    while
19ad0 28 20 6a 3e 30 20 26 26 20 69 73 73 70 61 63 65  ( j>0 && isspace
19ae0 28 73 74 64 64 74 5b 6a 2d 31 5d 29 20 29 20 6a  (stddt[j-1]) ) j
19af0 2d 2d 3b 0a 20 20 20 20 73 74 64 64 74 5b 6a 5d  --;.    stddt[j]
19b00 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c 65   = 0;.    if( le
19b10 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 20 26 26  mp->tokentype &&
19b20 20 73 74 72 63 6d 70 28 73 74 64 64 74 2c 20 6c   strcmp(stddt, l
19b30 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3d  emp->tokentype)=
19b40 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e  =0 ){.      sp->
19b50 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20  dtnum = 0;.     
19b60 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
19b70 0a 20 20 20 20 68 61 73 68 20 3d 20 30 3b 0a 20  .    hash = 0;. 
19b80 20 20 20 66 6f 72 28 6a 3d 30 3b 20 73 74 64 64     for(j=0; stdd
19b90 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
19ba0 20 20 68 61 73 68 20 3d 20 68 61 73 68 2a 35 33    hash = hash*53
19bb0 20 2b 20 73 74 64 64 74 5b 6a 5d 3b 0a 20 20 20   + stddt[j];.   
19bc0 20 7d 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68   }.    hash = (h
19bd0 61 73 68 20 26 20 30 78 37 66 66 66 66 66 66 66  ash & 0x7fffffff
19be0 29 25 61 72 72 61 79 73 69 7a 65 3b 0a 20 20 20  )%arraysize;.   
19bf0 20 77 68 69 6c 65 28 20 74 79 70 65 73 5b 68 61   while( types[ha
19c00 73 68 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28  sh] ){.      if(
19c10 20 73 74 72 63 6d 70 28 74 79 70 65 73 5b 68 61   strcmp(types[ha
19c20 73 68 5d 2c 73 74 64 64 74 29 3d 3d 30 20 29 7b  sh],stddt)==0 ){
19c30 0a 20 20 20 20 20 20 20 20 73 70 2d 3e 64 74 6e  .        sp->dtn
19c40 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20  um = hash + 1;. 
19c50 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19c60 20 20 20 20 7d 0a 20 20 20 20 20 20 68 61 73 68      }.      hash
19c70 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61  ++;.      if( ha
19c80 73 68 3e 3d 61 72 72 61 79 73 69 7a 65 20 29 20  sh>=arraysize ) 
19c90 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  hash = 0;.    }.
19ca0 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 68 61      if( types[ha
19cb0 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sh]==0 ){.      
19cc0 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68  sp->dtnum = hash
19cd0 20 2b 20 31 3b 0a 20 20 20 20 20 20 74 79 70 65   + 1;.      type
19ce0 73 5b 68 61 73 68 5d 20 3d 20 28 63 68 61 72 2a  s[hash] = (char*
19cf0 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74  )malloc( lemonSt
19d00 72 6c 65 6e 28 73 74 64 64 74 29 2b 31 20 29 3b  rlen(stddt)+1 );
19d10 0a 20 20 20 20 20 20 69 66 28 20 74 79 70 65 73  .      if( types
19d20 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20  [hash]==0 ){.   
19d30 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
19d40 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f  err,"Out of memo
19d50 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ry.\n");.       
19d60 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
19d70 7d 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 74  }.      strcpy(t
19d80 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74  ypes[hash],stddt
19d90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
19da0 2f 2a 20 50 72 69 6e 74 20 6f 75 74 20 74 68 65  /* Print out the
19db0 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 59   definition of Y
19dc0 59 54 4f 4b 45 4e 54 59 50 45 20 61 6e 64 20 59  YTOKENTYPE and Y
19dd0 59 4d 49 4e 4f 52 54 59 50 45 20 2a 2f 0a 20 20  YMINORTYPE */.  
19de0 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d  name = lemp->nam
19df0 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a  e ? lemp->name :
19e00 20 22 50 61 72 73 65 22 3b 0a 20 20 6c 69 6e 65   "Parse";.  line
19e10 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 0a 20  no = *plineno;. 
19e20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66   if( mhflag ){ f
19e30 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20  printf(out,"#if 
19e40 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c  INTERFACE\n"); l
19e50 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72  ineno++; }.  fpr
19e60 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
19e70 65 20 25 73 54 4f 4b 45 4e 54 59 50 45 20 25 73  e %sTOKENTYPE %s
19e80 5c 6e 22 2c 6e 61 6d 65 2c 0a 20 20 20 20 6c 65  \n",name,.    le
19e90 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3f 6c 65  mp->tokentype?le
19ea0 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3a 22 76  mp->tokentype:"v
19eb0 6f 69 64 2a 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b  oid*");  lineno+
19ec0 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  +;.  if( mhflag 
19ed0 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ){ fprintf(out,"
19ee0 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65  #endif\n"); line
19ef0 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74  no++; }.  fprint
19f00 66 28 6f 75 74 2c 22 74 79 70 65 64 65 66 20 75  f(out,"typedef u
19f10 6e 69 6f 6e 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65  nion {\n"); line
19f20 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
19f30 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 69 6e 69  out,"  int yyini
19f40 74 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  t;\n"); lineno++
19f50 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
19f60 22 20 20 25 73 54 4f 4b 45 4e 54 59 50 45 20 79  "  %sTOKENTYPE y
19f70 79 30 3b 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69  y0;\n",name); li
19f80 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d  neno++;.  for(i=
19f90 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20  0; i<arraysize; 
19fa0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 79  i++){.    if( ty
19fb0 70 65 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  pes[i]==0 ) cont
19fc0 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74  inue;.    fprint
19fd0 66 28 6f 75 74 2c 22 20 20 25 73 20 79 79 25 64  f(out,"  %s yy%d
19fe0 3b 5c 6e 22 2c 74 79 70 65 73 5b 69 5d 2c 69 2b  ;\n",types[i],i+
19ff0 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  1); lineno++;.  
1a000 20 20 66 72 65 65 28 74 79 70 65 73 5b 69 5d 29    free(types[i])
1a010 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70  ;.  }.  if( lemp
1a020 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74  ->errsym->useCnt
1a030 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1a040 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 25 64 3b  out,"  int yy%d;
1a050 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  \n",lemp->errsym
1a060 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f  ->dtnum); lineno
1a070 2b 2b 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 73  ++;.  }.  free(s
1a080 74 64 64 74 29 3b 0a 20 20 66 72 65 65 28 74 79  tddt);.  free(ty
1a090 70 65 73 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  pes);.  fprintf(
1a0a0 6f 75 74 2c 22 7d 20 59 59 4d 49 4e 4f 52 54 59  out,"} YYMINORTY
1a0b0 50 45 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  PE;\n"); lineno+
1a0c0 2b 3b 0a 20 20 2a 70 6c 69 6e 65 6e 6f 20 3d 20  +;.  *plineno = 
1a0d0 6c 69 6e 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lineno;.}../*.**
1a0e0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
1a0f0 20 6f 66 20 61 20 43 20 64 61 74 61 74 79 70 65   of a C datatype
1a100 20 61 62 6c 65 20 74 6f 20 72 65 70 72 65 73 65   able to represe
1a110 6e 74 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  nt values betwee
1a120 6e 0a 2a 2a 20 6c 77 72 20 61 6e 64 20 75 70 72  n.** lwr and upr
1a130 2c 20 69 6e 63 6c 75 73 69 76 65 2e 0a 2a 2f 0a  , inclusive..*/.
1a140 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
1a150 72 20 2a 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f  r *minimum_size_
1a160 74 79 70 65 28 69 6e 74 20 6c 77 72 2c 20 69 6e  type(int lwr, in
1a170 74 20 75 70 72 29 7b 0a 20 20 69 66 28 20 6c 77  t upr){.  if( lw
1a180 72 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  r>=0 ){.    if( 
1a190 75 70 72 3c 3d 32 35 35 20 29 7b 0a 20 20 20 20  upr<=255 ){.    
1a1a0 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e    return "unsign
1a1b0 65 64 20 63 68 61 72 22 3b 0a 20 20 20 20 7d 65  ed char";.    }e
1a1c0 6c 73 65 20 69 66 28 20 75 70 72 3c 36 35 35 33  lse if( upr<6553
1a1d0 35 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  5 ){.      retur
1a1e0 6e 20 22 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  n "unsigned shor
1a1f0 74 20 69 6e 74 22 3b 0a 20 20 20 20 7d 65 6c 73  t int";.    }els
1a200 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
1a210 22 75 6e 73 69 67 6e 65 64 20 69 6e 74 22 3b 0a  "unsigned int";.
1a220 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1a230 28 20 6c 77 72 3e 3d 2d 31 32 37 20 26 26 20 75  ( lwr>=-127 && u
1a240 70 72 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 72  pr<=127 ){.    r
1a250 65 74 75 72 6e 20 22 73 69 67 6e 65 64 20 63 68  eturn "signed ch
1a260 61 72 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ar";.  }else if(
1a270 20 6c 77 72 3e 3d 2d 33 32 37 36 37 20 26 26 20   lwr>=-32767 && 
1a280 75 70 72 3c 33 32 37 36 37 20 29 7b 0a 20 20 20  upr<32767 ){.   
1a290 20 72 65 74 75 72 6e 20 22 73 68 6f 72 74 22 3b   return "short";
1a2a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1a2b0 74 75 72 6e 20 22 69 6e 74 22 3b 0a 20 20 7d 0a  turn "int";.  }.
1a2c0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 73 74  }../*.** Each st
1a2d0 61 74 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  ate contains a s
1a2e0 65 74 20 6f 66 20 74 6f 6b 65 6e 20 74 72 61 6e  et of token tran
1a2f0 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 73 65  saction and a se
1a300 74 20 6f 66 0a 2a 2a 20 6e 6f 6e 74 65 72 6d 69  t of.** nontermi
1a310 6e 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  nal transactions
1a320 2e 20 20 45 61 63 68 20 6f 66 20 74 68 65 73 65  .  Each of these
1a330 20 73 65 74 73 20 6d 61 6b 65 73 20 61 6e 20 69   sets makes an i
1a340 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68  nstance.** of th
1a350 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1a360 63 74 75 72 65 2e 20 20 41 6e 20 61 72 72 61 79  cture.  An array
1a370 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74   of these struct
1a380 75 72 65 73 20 69 73 20 75 73 65 64 0a 2a 2a 20  ures is used.** 
1a390 74 6f 20 6f 72 64 65 72 20 74 68 65 20 63 72 65  to order the cre
1a3a0 61 74 69 6f 6e 20 6f 66 20 65 6e 74 72 69 65 73  ation of entries
1a3b0 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f   in the yy_actio
1a3c0 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  n[] table..*/.st
1a3d0 72 75 63 74 20 61 78 73 65 74 20 7b 0a 20 20 73  ruct axset {.  s
1a3e0 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
1a3f0 3b 20 20 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72  ;   /* A pointer
1a400 20 74 6f 20 61 20 73 74 61 74 65 20 2a 2f 0a 20   to a state */. 
1a410 20 69 6e 74 20 69 73 54 6b 6e 3b 20 20 20 20 20   int isTkn;     
1a420 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1a430 20 75 73 65 20 74 6f 6b 65 6e 73 2e 20 20 46 61   use tokens.  Fa
1a440 6c 73 65 20 66 6f 72 20 6e 6f 6e 2d 74 65 72 6d  lse for non-term
1a450 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  inals */.  int n
1a460 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Action;         
1a470 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63 74  /* Number of act
1a480 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  ions */.  int iO
1a490 72 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f  rder;          /
1a4a0 2a 20 4f 72 69 67 69 6e 61 6c 20 6f 72 64 65 72  * Original order
1a4b0 20 6f 66 20 61 63 74 69 6f 6e 20 73 65 74 73 20   of action sets 
1a4c0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  */.};../*.** Com
1a4d0 70 61 72 65 20 74 6f 20 61 78 73 65 74 20 73 74  pare to axset st
1a4e0 72 75 63 74 75 72 65 73 20 66 6f 72 20 73 6f 72  ructures for sor
1a4f0 74 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f  ting purposes.*/
1a500 0a 73 74 61 74 69 63 20 69 6e 74 20 61 78 73 65  .static int axse
1a510 74 5f 63 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  t_compare(const 
1a520 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76  void *a, const v
1a530 6f 69 64 20 2a 62 29 7b 0a 20 20 73 74 72 75 63  oid *b){.  struc
1a540 74 20 61 78 73 65 74 20 2a 70 31 20 3d 20 28 73  t axset *p1 = (s
1a550 74 72 75 63 74 20 61 78 73 65 74 2a 29 61 3b 0a  truct axset*)a;.
1a560 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a    struct axset *
1a570 70 32 20 3d 20 28 73 74 72 75 63 74 20 61 78 73  p2 = (struct axs
1a580 65 74 2a 29 62 3b 0a 20 20 69 6e 74 20 63 3b 0a  et*)b;.  int c;.
1a590 20 20 63 20 3d 20 70 32 2d 3e 6e 41 63 74 69 6f    c = p2->nActio
1a5a0 6e 20 2d 20 70 31 2d 3e 6e 41 63 74 69 6f 6e 3b  n - p1->nAction;
1a5b0 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20  .  if( c==0 ){. 
1a5c0 20 20 20 63 20 3d 20 70 32 2d 3e 69 4f 72 64 65     c = p2->iOrde
1a5d0 72 20 2d 20 70 31 2d 3e 69 4f 72 64 65 72 3b 0a  r - p1->iOrder;.
1a5e0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 21    }.  assert( c!
1a5f0 3d 30 20 7c 7c 20 70 31 3d 3d 70 32 20 29 3b 0a  =0 || p1==p2 );.
1a600 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f    return c;.}../
1a610 2a 0a 2a 2a 20 57 72 69 74 65 20 74 65 78 74 20  *.** Write text 
1a620 6f 6e 20 22 6f 75 74 22 20 74 68 61 74 20 64 65  on "out" that de
1a630 73 63 72 69 62 65 73 20 74 68 65 20 72 75 6c 65  scribes the rule
1a640 20 22 72 70 22 2e 0a 2a 2f 0a 73 74 61 74 69 63   "rp"..*/.static
1a650 20 76 6f 69 64 20 77 72 69 74 65 52 75 6c 65 54   void writeRuleT
1a660 65 78 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73  ext(FILE *out, s
1a670 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b  truct rule *rp){
1a680 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 70 72 69  .  int j;.  fpri
1a690 6e 74 66 28 6f 75 74 2c 22 25 73 20 3a 3a 3d 22  ntf(out,"%s ::="
1a6a0 2c 20 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29  , rp->lhs->name)
1a6b0 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 72  ;.  for(j=0; j<r
1a6c0 70 2d 3e 6e 72 68 73 3b 20 6a 2b 2b 29 7b 0a 20  p->nrhs; j++){. 
1a6d0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
1a6e0 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 6a   *sp = rp->rhs[j
1a6f0 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ];.    fprintf(o
1a700 75 74 2c 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61  ut," %s", sp->na
1a710 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 70 2d  me);.    if( sp-
1a720 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
1a730 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e  INAL ){.      in
1a740 74 20 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  t k;.      for(k
1a750 3d 31 3b 20 6b 3c 73 70 2d 3e 6e 73 75 62 73 79  =1; k<sp->nsubsy
1a760 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; k++){.       
1a770 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c 25   fprintf(out,"|%
1a780 73 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d  s",sp->subsym[k]
1a790 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  ->name);.      }
1a7a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f  .    }.  }.}.../
1a7b0 2a 20 47 65 6e 65 72 61 74 65 20 43 20 73 6f 75  * Generate C sou
1a7c0 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  rce code for the
1a7d0 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20   parser */.void 
1a7e0 52 65 70 6f 72 74 54 61 62 6c 65 28 0a 20 20 73  ReportTable(.  s
1a7f0 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
1a800 70 2c 0a 20 20 69 6e 74 20 6d 68 66 6c 61 67 20  p,.  int mhflag 
1a810 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 69 6e      /* Output in
1a820 20 6d 61 6b 65 68 65 61 64 65 72 73 20 66 6f 72   makeheaders for
1a830 6d 61 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  mat if true */.)
1a840 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a  {.  FILE *out, *
1a850 69 6e 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b  in;.  char line[
1a860 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  LINESIZE];.  int
1a870 20 20 6c 69 6e 65 6e 6f 3b 0a 20 20 73 74 72 75    lineno;.  stru
1a880 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
1a890 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
1a8a0 61 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ap;.  struct rul
1a8b0 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20  e *rp;.  struct 
1a8c0 61 63 74 74 61 62 20 2a 70 41 63 74 74 61 62 3b  acttab *pActtab;
1a8d0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a  .  int i, j, n;.
1a8e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61    const char *na
1a8f0 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e 54 6b 6e 4f  me;.  int mnTknO
1a900 66 73 74 2c 20 6d 78 54 6b 6e 4f 66 73 74 3b 0a  fst, mxTknOfst;.
1a910 20 20 69 6e 74 20 6d 6e 4e 74 4f 66 73 74 2c 20    int mnNtOfst, 
1a920 6d 78 4e 74 4f 66 73 74 3b 0a 20 20 73 74 72 75  mxNtOfst;.  stru
1a930 63 74 20 61 78 73 65 74 20 2a 61 78 3b 0a 0a 20  ct axset *ax;.. 
1a940 20 69 6e 20 3d 20 74 70 6c 74 5f 6f 70 65 6e 28   in = tplt_open(
1a950 6c 65 6d 70 29 3b 0a 20 20 69 66 28 20 69 6e 3d  lemp);.  if( in=
1a960 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f  =0 ) return;.  o
1a970 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c  ut = file_open(l
1a980 65 6d 70 2c 22 2e 63 22 2c 22 77 62 22 29 3b 0a  emp,".c","wb");.
1a990 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a    if( out==0 ){.
1a9a0 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
1a9b0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1a9c0 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20    lineno = 1;.  
1a9d0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1a9e0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1a9f0 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1aa00 72 61 74 65 20 74 68 65 20 69 6e 63 6c 75 64 65  rate the include
1aa10 20 63 6f 64 65 2c 20 69 66 20 61 6e 79 20 2a 2f   code, if any */
1aa20 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
1aa30 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63  t,lemp,lemp->inc
1aa40 6c 75 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lude,&lineno);. 
1aa50 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
1aa60 20 20 20 63 68 61 72 20 2a 6e 61 6d 65 20 3d 20     char *name = 
1aa70 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65  file_makename(le
1aa80 6d 70 2c 20 22 2e 68 22 29 3b 0a 20 20 20 20 66  mp, ".h");.    f
1aa90 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63  printf(out,"#inc
1aaa0 6c 75 64 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  lude \"%s\"\n", 
1aab0 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
1aac0 0a 20 20 20 20 66 72 65 65 28 6e 61 6d 65 29 3b  .    free(name);
1aad0 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
1aae0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1aaf0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1ab00 2f 2a 20 47 65 6e 65 72 61 74 65 20 23 64 65 66  /* Generate #def
1ab10 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b  ines for all tok
1ab20 65 6e 73 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66  ens */.  if( mhf
1ab30 6c 61 67 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  lag ){.    const
1ab40 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20   char *prefix;. 
1ab50 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1ab60 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22  #if INTERFACE\n"
1ab70 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1ab80 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e   if( lemp->token
1ab90 70 72 65 66 69 78 20 29 20 70 72 65 66 69 78 20  prefix ) prefix 
1aba0 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65  = lemp->tokenpre
1abb0 66 69 78 3b 0a 20 20 20 20 65 6c 73 65 20 20 20  fix;.    else   
1abc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abd0 20 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20   prefix = "";.  
1abe0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d    for(i=1; i<lem
1abf0 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b  p->nterminal; i+
1ac00 2b 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  +){.      fprint
1ac10 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1ac20 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72  s%-30s %2d\n",pr
1ac30 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  efix,lemp->symbo
1ac40 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a  ls[i]->name,i);.
1ac50 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a        lineno++;.
1ac60 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
1ac70 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22  f(out,"#endif\n"
1ac80 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1ac90 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1aca0 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1acb0 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1acc0 65 6e 65 72 61 74 65 20 74 68 65 20 64 65 66 69  enerate the defi
1acd0 6e 65 73 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  nes */.  fprintf
1ace0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1acf0 43 4f 44 45 54 59 50 45 20 25 73 5c 6e 22 2c 0a  CODETYPE %s\n",.
1ad00 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65      minimum_size
1ad10 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e  _type(0, lemp->n
1ad20 73 79 6d 62 6f 6c 2b 31 29 29 3b 20 6c 69 6e 65  symbol+1)); line
1ad30 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1ad40 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e  out,"#define YYN
1ad50 4f 43 4f 44 45 20 25 64 5c 6e 22 2c 6c 65 6d 70  OCODE %d\n",lemp
1ad60 2d 3e 6e 73 79 6d 62 6f 6c 2b 31 29 3b 20 20 6c  ->nsymbol+1);  l
1ad70 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
1ad80 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1ad90 59 59 41 43 54 49 4f 4e 54 59 50 45 20 25 73 5c  YYACTIONTYPE %s\
1ada0 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f  n",.    minimum_
1adb0 73 69 7a 65 5f 74 79 70 65 28 30 2c 20 6c 65 6d  size_type(0, lem
1adc0 70 2d 3e 6e 73 74 61 74 65 2b 6c 65 6d 70 2d 3e  p->nstate+lemp->
1add0 6e 72 75 6c 65 2b 35 29 29 3b 20 20 6c 69 6e 65  nrule+5));  line
1ade0 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70  no++;.  if( lemp
1adf0 2d 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20  ->wildcard ){.  
1ae00 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1ae10 64 65 66 69 6e 65 20 59 59 57 49 4c 44 43 41 52  define YYWILDCAR
1ae20 44 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  D %d\n",.       
1ae30 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 2d 3e  lemp->wildcard->
1ae40 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  index); lineno++
1ae50 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 5f 73 74  ;.  }.  print_st
1ae60 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65  ack_union(out,le
1ae70 6d 70 2c 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61  mp,&lineno,mhfla
1ae80 67 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  g);.  fprintf(ou
1ae90 74 2c 20 22 23 69 66 6e 64 65 66 20 59 59 53 54  t, "#ifndef YYST
1aea0 41 43 4b 44 45 50 54 48 5c 6e 22 29 3b 20 6c 69  ACKDEPTH\n"); li
1aeb0 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65  neno++;.  if( le
1aec0 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 20 29 7b  mp->stacksize ){
1aed0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1aee0 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54 41 43  ,"#define YYSTAC
1aef0 4b 44 45 50 54 48 20 25 73 5c 6e 22 2c 6c 65 6d  KDEPTH %s\n",lem
1af00 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 20 20  p->stacksize);  
1af10 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73  lineno++;.  }els
1af20 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e{.    fprintf(o
1af30 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54  ut,"#define YYST
1af40 41 43 4b 44 45 50 54 48 20 31 30 30 5c 6e 22 29  ACKDEPTH 100\n")
1af50 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ;  lineno++;.  }
1af60 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1af70 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e  "#endif\n"); lin
1af80 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66  eno++;.  if( mhf
1af90 6c 61 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  lag ){.    fprin
1afa0 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45  tf(out,"#if INTE
1afb0 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e  RFACE\n"); linen
1afc0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 20  o++;.  }.  name 
1afd0 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c  = lemp->name ? l
1afe0 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72  emp->name : "Par
1aff0 73 65 22 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  se";.  if( lemp-
1b000 3e 61 72 67 20 26 26 20 6c 65 6d 70 2d 3e 61 72  >arg && lemp->ar
1b010 67 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  g[0] ){.    int 
1b020 69 3b 0a 20 20 20 20 69 20 3d 20 6c 65 6d 6f 6e  i;.    i = lemon
1b030 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72 67  Strlen(lemp->arg
1b040 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e  );.    while( i>
1b050 3d 31 20 26 26 20 69 73 73 70 61 63 65 28 6c 65  =1 && isspace(le
1b060 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 29 20  mp->arg[i-1]) ) 
1b070 69 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  i--;.    while( 
1b080 69 3e 3d 31 20 26 26 20 28 69 73 61 6c 6e 75 6d  i>=1 && (isalnum
1b090 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29  (lemp->arg[i-1])
1b0a0 20 7c 7c 20 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d   || lemp->arg[i-
1b0b0 31 5d 3d 3d 27 5f 27 29 20 29 20 69 2d 2d 3b 0a  1]=='_') ) i--;.
1b0c0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b0d0 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53  "#define %sARG_S
1b0e0 44 45 43 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65  DECL %s;\n",name
1b0f0 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69  ,lemp->arg);  li
1b100 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1b110 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1b120 20 25 73 41 52 47 5f 50 44 45 43 4c 20 2c 25 73   %sARG_PDECL ,%s
1b130 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61  \n",name,lemp->a
1b140 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  rg);  lineno++;.
1b150 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b160 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46  "#define %sARG_F
1b170 45 54 43 48 20 25 73 20 3d 20 79 79 70 50 61 72  ETCH %s = yypPar
1b180 73 65 72 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20  ser->%s\n",.    
1b190 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d               nam
1b1a0 65 2c 6c 65 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d  e,lemp->arg,&lem
1b1b0 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e  p->arg[i]);  lin
1b1c0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
1b1d0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1b1e0 25 73 41 52 47 5f 53 54 4f 52 45 20 79 79 70 50  %sARG_STORE yypP
1b1f0 61 72 73 65 72 2d 3e 25 73 20 3d 20 25 73 5c 6e  arser->%s = %s\n
1b200 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1b210 20 20 20 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e      name,&lemp->
1b220 61 72 67 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72  arg[i],&lemp->ar
1b230 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  g[i]);  lineno++
1b240 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
1b250 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1b260 69 6e 65 20 25 73 41 52 47 5f 53 44 45 43 4c 5c  ine %sARG_SDECL\
1b270 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e  n",name);  linen
1b280 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1b290 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1b2a0 41 52 47 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d  ARG_PDECL\n",nam
1b2b0 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  e);  lineno++;. 
1b2c0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1b2d0 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45  #define %sARG_FE
1b2e0 54 43 48 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69  TCH\n",name); li
1b2f0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1b300 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1b310 20 25 73 41 52 47 5f 53 54 4f 52 45 5c 6e 22 2c   %sARG_STORE\n",
1b320 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
1b330 0a 20 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61  .  }.  if( mhfla
1b340 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  g ){.    fprintf
1b350 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29  (out,"#endif\n")
1b360 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
1b370 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1b380 64 65 66 69 6e 65 20 59 59 4e 53 54 41 54 45 20  define YYNSTATE 
1b390 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61  %d\n",lemp->nsta
1b3a0 74 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  te);  lineno++;.
1b3b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1b3c0 64 65 66 69 6e 65 20 59 59 4e 52 55 4c 45 20 25  define YYNRULE %
1b3d0 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65  d\n",lemp->nrule
1b3e0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1b3f0 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  if( lemp->errsym
1b400 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20  ->useCnt ){.    
1b410 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1b420 66 69 6e 65 20 59 59 45 52 52 4f 52 53 59 4d 42  fine YYERRORSYMB
1b430 4f 4c 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65  OL %d\n",lemp->e
1b440 72 72 73 79 6d 2d 3e 69 6e 64 65 78 29 3b 20 20  rrsym->index);  
1b450 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70  lineno++;.    fp
1b460 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1b470 6e 65 20 59 59 45 52 52 53 59 4d 44 54 20 79 79  ne YYERRSYMDT yy
1b480 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73  %d\n",lemp->errs
1b490 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 20 6c 69 6e  ym->dtnum);  lin
1b4a0 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  eno++;.  }.  if(
1b4b0 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62   lemp->has_fallb
1b4c0 61 63 6b 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ack ){.    fprin
1b4d0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1b4e0 59 59 46 41 4c 4c 42 41 43 4b 20 31 5c 6e 22 29  YYFALLBACK 1\n")
1b4f0 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ;  lineno++;.  }
1b500 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1b510 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1b520 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1b530 65 6e 65 72 61 74 65 20 74 68 65 20 61 63 74 69  enerate the acti
1b540 6f 6e 20 74 61 62 6c 65 20 61 6e 64 20 69 74 73  on table and its
1b550 20 61 73 73 6f 63 69 61 74 65 73 3a 0a 20 20 2a   associates:.  *
1b560 2a 0a 20 20 2a 2a 20 20 79 79 5f 61 63 74 69 6f  *.  **  yy_actio
1b570 6e 5b 5d 20 20 20 20 20 20 20 20 41 20 73 69 6e  n[]        A sin
1b580 67 6c 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  gle table contai
1b590 6e 69 6e 67 20 61 6c 6c 20 61 63 74 69 6f 6e 73  ning all actions
1b5a0 2e 0a 20 20 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61  ..  **  yy_looka
1b5b0 68 65 61 64 5b 5d 20 20 20 20 20 41 20 74 61 62  head[]     A tab
1b5c0 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
1b5d0 65 20 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20  e lookahead for 
1b5e0 65 61 63 68 20 65 6e 74 72 79 20 69 6e 0a 20 20  each entry in.  
1b5f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1b600 20 20 20 20 20 20 20 79 79 5f 61 63 74 69 6f 6e         yy_action
1b610 2e 20 20 55 73 65 64 20 74 6f 20 64 65 74 65 63  .  Used to detec
1b620 74 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  t hash collision
1b630 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 73 68 69 66  s..  **  yy_shif
1b640 74 5f 6f 66 73 74 5b 5d 20 20 20 20 46 6f 72 20  t_ofst[]    For 
1b650 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65 20  each state, the 
1b660 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61  offset into yy_a
1b670 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20  ction for.  **  
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b690 20 20 20 73 68 69 66 74 69 6e 67 20 74 65 72 6d     shifting term
1b6a0 69 6e 61 6c 73 2e 0a 20 20 2a 2a 20 20 79 79 5f  inals..  **  yy_
1b6b0 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 20 20  reduce_ofst[]   
1b6c0 46 6f 72 20 65 61 63 68 20 73 74 61 74 65 2c 20  For each state, 
1b6d0 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  the offset into 
1b6e0 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20  yy_action for.  
1b6f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1b700 20 20 20 20 20 20 20 73 68 69 66 74 69 6e 67 20         shifting 
1b710 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 61 66  non-terminals af
1b720 74 65 72 20 61 20 72 65 64 75 63 65 2e 0a 20 20  ter a reduce..  
1b730 2a 2a 20 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d  **  yy_default[]
1b740 20 20 20 20 20 20 20 44 65 66 61 75 6c 74 20 61         Default a
1b750 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 73  ction for each s
1b760 74 61 74 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  tate..  */..  /*
1b770 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74   Compute the act
1b780 69 6f 6e 73 20 6f 6e 20 61 6c 6c 20 73 74 61 74  ions on all stat
1b790 65 73 20 61 6e 64 20 63 6f 75 6e 74 20 74 68 65  es and count the
1b7a0 6d 20 75 70 20 2a 2f 0a 20 20 61 78 20 3d 20 28  m up */.  ax = (
1b7b0 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 29 20  struct axset *) 
1b7c0 63 61 6c 6c 6f 63 28 6c 65 6d 70 2d 3e 6e 73 74  calloc(lemp->nst
1b7d0 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66 28 61 78  ate*2, sizeof(ax
1b7e0 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 61 78 3d  [0]));.  if( ax=
1b7f0 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
1b800 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63  f(stderr,"malloc
1b810 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20   failed\n");.   
1b820 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
1b830 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1b840 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
1b850 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
1b860 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 61 78  orted[i];.    ax
1b870 5b 69 2a 32 5d 2e 73 74 70 20 3d 20 73 74 70 3b  [i*2].stp = stp;
1b880 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 69 73 54  .    ax[i*2].isT
1b890 6b 6e 20 3d 20 31 3b 0a 20 20 20 20 61 78 5b 69  kn = 1;.    ax[i
1b8a0 2a 32 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74  *2].nAction = st
1b8b0 70 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20  p->nTknAct;.    
1b8c0 61 78 5b 69 2a 32 2b 31 5d 2e 73 74 70 20 3d 20  ax[i*2+1].stp = 
1b8d0 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b  stp;.    ax[i*2+
1b8e0 31 5d 2e 69 73 54 6b 6e 20 3d 20 30 3b 0a 20 20  1].isTkn = 0;.  
1b8f0 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 6e 41 63 74    ax[i*2+1].nAct
1b900 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63  ion = stp->nNtAc
1b910 74 3b 0a 20 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66  t;.  }.  mxTknOf
1b920 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d  st = mnTknOfst =
1b930 20 30 3b 0a 20 20 6d 78 4e 74 4f 66 73 74 20 3d   0;.  mxNtOfst =
1b940 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 30 3b 0a 0a   mnNtOfst = 0;..
1b950 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
1b960 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20   action table.  
1b970 49 6e 20 6f 72 64 65 72 20 74 6f 20 74 72 79 20  In order to try 
1b980 74 6f 20 6b 65 65 70 20 74 68 65 20 73 69 7a 65  to keep the size
1b990 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 61 63 74   of the.  ** act
1b9a0 69 6f 6e 20 74 61 62 6c 65 20 74 6f 20 61 20 6d  ion table to a m
1b9b0 69 6e 69 6d 75 6d 2c 20 74 68 65 20 68 65 75 72  inimum, the heur
1b9c0 69 73 74 69 63 20 6f 66 20 70 6c 61 63 69 6e 67  istic of placing
1b9d0 20 74 68 65 20 6c 61 72 67 65 73 74 20 61 63 74   the largest act
1b9e0 69 6f 6e 0a 20 20 2a 2a 20 73 65 74 73 20 66 69  ion.  ** sets fi
1b9f0 72 73 74 20 69 73 20 75 73 65 64 2e 0a 20 20 2a  rst is used..  *
1ba00 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
1ba10 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 3b 20 69  emp->nstate*2; i
1ba20 2b 2b 29 20 61 78 5b 69 5d 2e 69 4f 72 64 65 72  ++) ax[i].iOrder
1ba30 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74 28 61 78   = i;.  qsort(ax
1ba40 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32  , lemp->nstate*2
1ba50 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 2c  , sizeof(ax[0]),
1ba60 20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 29 3b   axset_compare);
1ba70 0a 20 20 70 41 63 74 74 61 62 20 3d 20 61 63 74  .  pActtab = act
1ba80 74 61 62 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 66  tab_alloc();.  f
1ba90 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1baa0 6e 73 74 61 74 65 2a 32 20 26 26 20 61 78 5b 69  nstate*2 && ax[i
1bab0 5d 2e 6e 41 63 74 69 6f 6e 3e 30 3b 20 69 2b 2b  ].nAction>0; i++
1bac0 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 61 78 5b  ){.    stp = ax[
1bad0 69 5d 2e 73 74 70 3b 0a 20 20 20 20 69 66 28 20  i].stp;.    if( 
1bae0 61 78 5b 69 5d 2e 69 73 54 6b 6e 20 29 7b 0a 20  ax[i].isTkn ){. 
1baf0 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d       for(ap=stp-
1bb00 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
1bb10 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  next){.        i
1bb20 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20  nt action;.     
1bb30 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69     if( ap->sp->i
1bb40 6e 64 65 78 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72  ndex>=lemp->nter
1bb50 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65  minal ) continue
1bb60 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e  ;.        action
1bb70 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f   = compute_actio
1bb80 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20  n(lemp, ap);.   
1bb90 20 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c       if( action<
1bba0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1bbb0 20 20 20 20 20 20 61 63 74 74 61 62 5f 61 63 74        acttab_act
1bbc0 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70 2d  ion(pActtab, ap-
1bbd0 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69  >sp->index, acti
1bbe0 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  on);.      }.   
1bbf0 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74     stp->iTknOfst
1bc00 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74   = acttab_insert
1bc10 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20  (pActtab);.     
1bc20 20 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66   if( stp->iTknOf
1bc30 73 74 3c 6d 6e 54 6b 6e 4f 66 73 74 20 29 20 6d  st<mnTknOfst ) m
1bc40 6e 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e  nTknOfst = stp->
1bc50 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 20 20  iTknOfst;.      
1bc60 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73  if( stp->iTknOfs
1bc70 74 3e 6d 78 54 6b 6e 4f 66 73 74 20 29 20 6d 78  t>mxTknOfst ) mx
1bc80 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69  TknOfst = stp->i
1bc90 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 7d 65 6c  TknOfst;.    }el
1bca0 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 61 70  se{.      for(ap
1bcb0 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
1bcc0 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
1bcd0 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a      int action;.
1bce0 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e          if( ap->
1bcf0 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e  sp->index<lemp->
1bd00 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74  nterminal ) cont
1bd10 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
1bd20 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d  ( ap->sp->index=
1bd30 3d 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29  =lemp->nsymbol )
1bd40 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1bd50 20 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70     action = comp
1bd60 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c  ute_action(lemp,
1bd70 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66   ap);.        if
1bd80 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e  ( action<0 ) con
1bd90 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
1bda0 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63  cttab_action(pAc
1bdb0 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e  ttab, ap->sp->in
1bdc0 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20  dex, action);.  
1bdd0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d      }.      stp-
1bde0 3e 69 4e 74 4f 66 73 74 20 3d 20 61 63 74 74 61  >iNtOfst = actta
1bdf0 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61 62  b_insert(pActtab
1be00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70  );.      if( stp
1be10 2d 3e 69 4e 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66  ->iNtOfst<mnNtOf
1be20 73 74 20 29 20 6d 6e 4e 74 4f 66 73 74 20 3d 20  st ) mnNtOfst = 
1be30 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20  stp->iNtOfst;.  
1be40 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e 74      if( stp->iNt
1be50 4f 66 73 74 3e 6d 78 4e 74 4f 66 73 74 20 29 20  Ofst>mxNtOfst ) 
1be60 6d 78 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e  mxNtOfst = stp->
1be70 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 20  iNtOfst;.    }. 
1be80 20 7d 0a 20 20 66 72 65 65 28 61 78 29 3b 0a 0a   }.  free(ax);..
1be90 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
1bea0 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  yy_action table 
1beb0 2a 2f 0a 20 20 6e 20 3d 20 61 63 74 74 61 62 5f  */.  n = acttab_
1bec0 73 69 7a 65 28 70 41 63 74 74 61 62 29 3b 0a 20  size(pActtab);. 
1bed0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1bee0 65 66 69 6e 65 20 59 59 5f 41 43 54 54 41 42 5f  efine YY_ACTTAB_
1bef0 43 4f 55 4e 54 20 28 25 64 29 5c 6e 22 2c 20 6e  COUNT (%d)\n", n
1bf00 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1bf10 70 72 69 6e 74 66 28 6f 75 74 2c 22 73 74 61 74  printf(out,"stat
1bf20 69 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f  ic const YYACTIO
1bf30 4e 54 59 50 45 20 79 79 5f 61 63 74 69 6f 6e 5b  NTYPE yy_action[
1bf40 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ] = {\n"); linen
1bf50 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  o++;.  for(i=j=0
1bf60 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1bf70 20 69 6e 74 20 61 63 74 69 6f 6e 20 3d 20 61 63   int action = ac
1bf80 74 74 61 62 5f 79 79 61 63 74 69 6f 6e 28 70 41  ttab_yyaction(pA
1bf90 63 74 74 61 62 2c 20 69 29 3b 0a 20 20 20 20 69  cttab, i);.    i
1bfa0 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 61 63  f( action<0 ) ac
1bfb0 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74  tion = lemp->nst
1bfc0 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c  ate + lemp->nrul
1bfd0 65 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 6a  e + 2;.    if( j
1bfe0 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75  ==0 ) fprintf(ou
1bff0 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c  t," /* %5d */ ",
1c000 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66   i);.    fprintf
1c010 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 61  (out, " %4d,", a
1c020 63 74 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20  ction);.    if( 
1c030 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29  j==9 || i==n-1 )
1c040 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1c050 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65  out, "\n"); line
1c060 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20  no++;.      j = 
1c070 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1c080 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      j++;.    }. 
1c090 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
1c0a0 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  , "};\n"); linen
1c0b0 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  o++;..  /* Outpu
1c0c0 74 20 74 68 65 20 79 79 5f 6c 6f 6f 6b 61 68 65  t the yy_lookahe
1c0d0 61 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70  ad table */.  fp
1c0e0 72 69 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69  rintf(out,"stati
1c0f0 63 20 63 6f 6e 73 74 20 59 59 43 4f 44 45 54 59  c const YYCODETY
1c100 50 45 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b  PE yy_lookahead[
1c110 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ] = {\n"); linen
1c120 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  o++;.  for(i=j=0
1c130 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1c140 20 69 6e 74 20 6c 61 20 3d 20 61 63 74 74 61 62   int la = acttab
1c150 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28 70 41 63  _yylookahead(pAc
1c160 74 74 61 62 2c 20 69 29 3b 0a 20 20 20 20 69 66  ttab, i);.    if
1c170 28 20 6c 61 3c 30 20 29 20 6c 61 20 3d 20 6c 65  ( la<0 ) la = le
1c180 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a 20 20 20  mp->nsymbol;.   
1c190 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69   if( j==0 ) fpri
1c1a0 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64  ntf(out," /* %5d
1c1b0 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66   */ ", i);.    f
1c1c0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34  printf(out, " %4
1c1d0 64 2c 22 2c 20 6c 61 29 3b 0a 20 20 20 20 69 66  d,", la);.    if
1c1e0 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31  ( j==9 || i==n-1
1c1f0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
1c200 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69  f(out, "\n"); li
1c210 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20  neno++;.      j 
1c220 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1c230 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
1c240 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
1c250 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e  ut, "};\n"); lin
1c260 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74  eno++;..  /* Out
1c270 70 75 74 20 74 68 65 20 79 79 5f 73 68 69 66 74  put the yy_shift
1c280 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f  _ofst[] table */
1c290 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1c2a0 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46  "#define YY_SHIF
1c2b0 54 5f 55 53 45 5f 44 46 4c 54 20 28 25 64 29 5c  T_USE_DFLT (%d)\
1c2c0 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74 2d 31 29  n", mnTknOfst-1)
1c2d0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20  ; lineno++;.  n 
1c2e0 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a  = lemp->nstate;.
1c2f0 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
1c300 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31  lemp->sorted[n-1
1c310 5d 2d 3e 69 54 6b 6e 4f 66 73 74 3d 3d 4e 4f 5f  ]->iTknOfst==NO_
1c320 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20 20  OFFSET ) n--;.  
1c330 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
1c340 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 43  efine YY_SHIFT_C
1c350 4f 55 4e 54 20 28 25 64 29 5c 6e 22 2c 20 6e 2d  OUNT (%d)\n", n-
1c360 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  1); lineno++;.  
1c370 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
1c380 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d  efine YY_SHIFT_M
1c390 49 4e 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 6e  IN   (%d)\n", mn
1c3a0 54 6b 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f  TknOfst); lineno
1c3b0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1c3c0 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53  t, "#define YY_S
1c3d0 48 49 46 54 5f 4d 41 58 20 20 20 28 25 64 29 5c  HIFT_MAX   (%d)\
1c3e0 6e 22 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 3b 20  n", mxTknOfst); 
1c3f0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1c400 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63  ntf(out, "static
1c410 20 63 6f 6e 73 74 20 25 73 20 79 79 5f 73 68 69   const %s yy_shi
1c420 66 74 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22  ft_ofst[] = {\n"
1c430 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6d 69 6e  , .          min
1c440 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d  imum_size_type(m
1c450 6e 54 6b 6e 4f 66 73 74 2d 31 2c 20 6d 78 54 6b  nTknOfst-1, mxTk
1c460 6e 4f 66 73 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b  nOfst)); lineno+
1c470 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  +;.  for(i=j=0; 
1c480 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
1c490 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 73 74 70  nt ofst;.    stp
1c4a0 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
1c4b0 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20 73  i];.    ofst = s
1c4c0 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20  tp->iTknOfst;.  
1c4d0 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f    if( ofst==NO_O
1c4e0 46 46 53 45 54 20 29 20 6f 66 73 74 20 3d 20 6d  FFSET ) ofst = m
1c4f0 6e 54 6b 6e 4f 66 73 74 20 2d 20 31 3b 0a 20 20  nTknOfst - 1;.  
1c500 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72    if( j==0 ) fpr
1c510 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35  intf(out," /* %5
1c520 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20  d */ ", i);.    
1c530 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
1c540 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20  4d,", ofst);.   
1c550 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
1c560 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
1c570 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
1c580 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
1c590 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
1c5a0 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
1c5b0 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
1c5c0 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
1c5d0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20  lineno++;..  /* 
1c5e0 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 72 65  Output the yy_re
1c5f0 64 75 63 65 5f 6f 66 73 74 5b 5d 20 74 61 62 6c  duce_ofst[] tabl
1c600 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  e */.  fprintf(o
1c610 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f  ut, "#define YY_
1c620 52 45 44 55 43 45 5f 55 53 45 5f 44 46 4c 54 20  REDUCE_USE_DFLT 
1c630 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73  (%d)\n", mnNtOfs
1c640 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  t-1); lineno++;.
1c650 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61    n = lemp->nsta
1c660 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  te;.  while( n>0
1c670 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64   && lemp->sorted
1c680 5b 6e 2d 31 5d 2d 3e 69 4e 74 4f 66 73 74 3d 3d  [n-1]->iNtOfst==
1c690 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b  NO_OFFSET ) n--;
1c6a0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1c6b0 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55  "#define YY_REDU
1c6c0 43 45 5f 43 4f 55 4e 54 20 28 25 64 29 5c 6e 22  CE_COUNT (%d)\n"
1c6d0 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  , n-1); lineno++
1c6e0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1c6f0 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44   "#define YY_RED
1c700 55 43 45 5f 4d 49 4e 20 20 20 28 25 64 29 5c 6e  UCE_MIN   (%d)\n
1c710 22 2c 20 6d 6e 4e 74 4f 66 73 74 29 3b 20 6c 69  ", mnNtOfst); li
1c720 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1c730 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
1c740 59 59 5f 52 45 44 55 43 45 5f 4d 41 58 20 20 20  YY_REDUCE_MAX   
1c750 28 25 64 29 5c 6e 22 2c 20 6d 78 4e 74 4f 66 73  (%d)\n", mxNtOfs
1c760 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  t); lineno++;.  
1c770 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74  fprintf(out, "st
1c780 61 74 69 63 20 63 6f 6e 73 74 20 25 73 20 79 79  atic const %s yy
1c790 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 3d  _reduce_ofst[] =
1c7a0 20 7b 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20   {\n", .        
1c7b0 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74    minimum_size_t
1c7c0 79 70 65 28 6d 6e 4e 74 4f 66 73 74 2d 31 2c 20  ype(mnNtOfst-1, 
1c7d0 6d 78 4e 74 4f 66 73 74 29 29 3b 20 6c 69 6e 65  mxNtOfst)); line
1c7e0 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  no++;.  for(i=j=
1c7f0 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
1c800 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20    int ofst;.    
1c810 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
1c820 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20  ed[i];.    ofst 
1c830 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a  = stp->iNtOfst;.
1c840 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f      if( ofst==NO
1c850 5f 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20 3d  _OFFSET ) ofst =
1c860 20 6d 6e 4e 74 4f 66 73 74 20 2d 20 31 3b 0a 20   mnNtOfst - 1;. 
1c870 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70     if( j==0 ) fp
1c880 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
1c890 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20  5d */ ", i);.   
1c8a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
1c8b0 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20  %4d,", ofst);.  
1c8c0 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d    if( j==9 || i=
1c8d0 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70  =n-1 ){.      fp
1c8e0 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
1c8f0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1c900 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c    j = 0;.    }el
1c910 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  se{.      j++;. 
1c920 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e     }.  }.  fprin
1c930 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b  tf(out, "};\n");
1c940 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a   lineno++;..  /*
1c950 20 4f 75 74 70 75 74 20 74 68 65 20 64 65 66 61   Output the defa
1c960 75 6c 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ult action table
1c970 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
1c980 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74  t, "static const
1c990 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79   YYACTIONTYPE yy
1c9a0 5f 64 65 66 61 75 6c 74 5b 5d 20 3d 20 7b 5c 6e  _default[] = {\n
1c9b0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1c9c0 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  n = lemp->nstate
1c9d0 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
1c9e0 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  <n; i++){.    st
1c9f0 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
1ca00 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  [i];.    if( j==
1ca10 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
1ca20 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
1ca30 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1ca40 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 73 74 70  ut, " %4d,", stp
1ca50 2d 3e 69 44 66 6c 74 29 3b 0a 20 20 20 20 69 66  ->iDflt);.    if
1ca60 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31  ( j==9 || i==n-1
1ca70 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
1ca80 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69  f(out, "\n"); li
1ca90 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20  neno++;.      j 
1caa0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1cab0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
1cac0 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
1cad0 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e  ut, "};\n"); lin
1cae0 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66  eno++;.  tplt_xf
1caf0 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1cb00 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1cb10 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
1cb20 65 20 74 61 62 6c 65 20 6f 66 20 66 61 6c 6c 62  e table of fallb
1cb30 61 63 6b 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f  ack tokens..  */
1cb40 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73  .  if( lemp->has
1cb50 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _fallback ){.   
1cb60 20 69 6e 74 20 6d 78 20 3d 20 6c 65 6d 70 2d 3e   int mx = lemp->
1cb70 6e 74 65 72 6d 69 6e 61 6c 20 2d 20 31 3b 0a 20  nterminal - 1;. 
1cb80 20 20 20 77 68 69 6c 65 28 20 6d 78 3e 30 20 26     while( mx>0 &
1cb90 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  & lemp->symbols[
1cba0 6d 78 5d 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30  mx]->fallback==0
1cbb0 20 29 7b 20 6d 78 2d 2d 3b 20 7d 0a 20 20 20 20   ){ mx--; }.    
1cbc0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6d 78 3b 20  for(i=0; i<=mx; 
1cbd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
1cbe0 63 74 20 73 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c  ct symbol *p = l
1cbf0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
1cc00 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 61  .      if( p->fa
1cc10 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  llback==0 ){.   
1cc20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1cc30 2c 20 22 20 20 20 20 30 2c 20 20 2f 2a 20 25 31  , "    0,  /* %1
1cc40 30 73 20 3d 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f  0s => nothing */
1cc50 5c 6e 22 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20  \n", p->name);. 
1cc60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1cc70 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1cc80 20 22 20 20 25 33 64 2c 20 20 2f 2a 20 25 31 30   "  %3d,  /* %10
1cc90 73 20 3d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 20 70  s => %s */\n", p
1cca0 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65  ->fallback->inde
1ccb0 78 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  x,.          p->
1ccc0 6e 61 6d 65 2c 20 70 2d 3e 66 61 6c 6c 62 61 63  name, p->fallbac
1ccd0 6b 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  k->name);.      
1cce0 7d 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b  }.      lineno++
1ccf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74 70  ;.    }.  }.  tp
1cd00 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1cd10 6d 65 2c 20 69 6e 2c 20 6f 75 74 2c 20 26 6c 69  me, in, out, &li
1cd20 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1cd30 65 72 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f  erate a table co
1cd40 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 79 6d  ntaining the sym
1cd50 62 6f 6c 69 63 20 6e 61 6d 65 20 6f 66 20 65 76  bolic name of ev
1cd60 65 72 79 20 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a  ery symbol.  */.
1cd70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1cd80 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
1cd90 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 6c 69  {.    sprintf(li
1cda0 6e 65 2c 22 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d  ne,"\"%s\",",lem
1cdb0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
1cdc0 61 6d 65 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  ame);.    fprint
1cdd0 66 28 6f 75 74 2c 22 20 20 25 2d 31 35 73 22 2c  f(out,"  %-15s",
1cde0 6c 69 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 28  line);.    if( (
1cdf0 69 26 33 29 3d 3d 33 20 29 7b 20 66 70 72 69 6e  i&3)==3 ){ fprin
1ce00 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69  tf(out,"\n"); li
1ce10 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  neno++; }.  }.  
1ce20 69 66 28 20 28 69 26 33 29 21 3d 30 20 29 7b 20  if( (i&3)!=0 ){ 
1ce30 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22  fprintf(out,"\n"
1ce40 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20  ); lineno++; }. 
1ce50 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1ce60 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1ce70 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1ce80 65 72 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f  erate a table co
1ce90 6e 74 61 69 6e 69 6e 67 20 61 20 74 65 78 74 20  ntaining a text 
1cea0 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
1ceb0 72 69 62 65 73 20 65 76 65 72 79 0a 20 20 2a 2a  ribes every.  **
1cec0 20 72 75 6c 65 20 69 6e 20 74 68 65 20 72 75 6c   rule in the rul
1ced0 65 20 73 65 74 20 6f 66 20 74 68 65 20 67 72 61  e set of the gra
1cee0 6d 6d 61 72 2e 20 20 54 68 69 73 20 69 6e 66 6f  mmar.  This info
1cef0 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 0a  rmation is used.
1cf00 20 20 2a 2a 20 77 68 65 6e 20 74 72 61 63 69 6e    ** when tracin
1cf10 67 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73  g REDUCE actions
1cf20 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
1cf30 2c 20 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  , rp=lemp->rule;
1cf40 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
1cf50 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  , i++){.    asse
1cf60 72 74 28 20 72 70 2d 3e 69 6e 64 65 78 3d 3d 69  rt( rp->index==i
1cf70 20 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   );.    fprintf(
1cf80 6f 75 74 2c 22 20 2f 2a 20 25 33 64 20 2a 2f 20  out," /* %3d */ 
1cf90 5c 22 22 2c 20 69 29 3b 0a 20 20 20 20 77 72 69  \"", i);.    wri
1cfa0 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20  teRuleText(out, 
1cfb0 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  rp);.    fprintf
1cfc0 28 6f 75 74 2c 22 5c 22 2c 5c 6e 22 29 3b 20 6c  (out,"\",\n"); l
1cfd0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
1cfe0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1cff0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1d000 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1d010 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
1d020 78 65 63 75 74 65 73 20 65 76 65 72 79 20 74 69  xecutes every ti
1d030 6d 65 20 61 20 73 79 6d 62 6f 6c 20 69 73 20 70  me a symbol is p
1d040 6f 70 70 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20  opped from.  ** 
1d050 74 68 65 20 73 74 61 63 6b 20 77 68 69 6c 65 20  the stack while 
1d060 70 72 6f 63 65 73 73 69 6e 67 20 65 72 72 6f 72  processing error
1d070 73 20 6f 72 20 77 68 69 6c 65 20 64 65 73 74 72  s or while destr
1d080 6f 79 69 6e 67 20 74 68 65 20 70 61 72 73 65 72  oying the parser
1d090 2e 20 0a 20 20 2a 2a 20 28 49 6e 20 6f 74 68 65  . .  ** (In othe
1d0a0 72 20 77 6f 72 64 73 2c 20 67 65 6e 65 72 61 74  r words, generat
1d0b0 65 20 74 68 65 20 25 64 65 73 74 72 75 63 74 6f  e the %destructo
1d0c0 72 20 61 63 74 69 6f 6e 73 29 0a 20 20 2a 2f 0a  r actions).  */.
1d0d0 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65    if( lemp->toke
1d0e0 6e 64 65 73 74 20 29 7b 0a 20 20 20 20 69 6e 74  ndest ){.    int
1d0f0 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 66   once = 1;.    f
1d100 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1d110 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
1d120 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
1d130 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73  ol *sp = lemp->s
1d140 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20  ymbols[i];.     
1d150 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70   if( sp==0 || sp
1d160 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c  ->type!=TERMINAL
1d170 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1d180 20 20 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20     if( once ){. 
1d190 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1d1a0 75 74 2c 20 22 20 20 20 20 20 20 2f 2a 20 54 45  ut, "      /* TE
1d1b0 52 4d 49 4e 41 4c 20 44 65 73 74 72 75 63 74 6f  RMINAL Destructo
1d1c0 72 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  r */\n"); lineno
1d1d0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65  ++;.        once
1d1e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1d1f0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1d200 22 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a  "    case %d: /*
1d210 20 25 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69   %s */\n", sp->i
1d220 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b  ndex, sp->name);
1d230 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
1d240 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1d250 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 26 26  lemp->nsymbol &&
1d260 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
1d270 5d 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41  ]->type!=TERMINA
1d280 4c 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 69 66 28  L; i++);.    if(
1d290 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1d2a0 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64   ){.      emit_d
1d2b0 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f  estructor_code(o
1d2c0 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ut,lemp->symbols
1d2d0 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f  [i],lemp,&lineno
1d2e0 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
1d2f0 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61  (out,"      brea
1d300 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  k;\n"); lineno++
1d310 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1d320 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20  ( lemp->vardest 
1d330 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79  ){.    struct sy
1d340 6d 62 6f 6c 20 2a 64 66 6c 74 5f 73 70 20 3d 20  mbol *dflt_sp = 
1d350 30 3b 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20  0;.    int once 
1d360 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 1;.    for(i=0
1d370 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
1d380 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
1d390 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
1d3a0 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
1d3b0 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73  [i];.      if( s
1d3c0 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65  p==0 || sp->type
1d3d0 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 0a 20 20  ==TERMINAL ||.  
1d3e0 20 20 20 20 20 20 20 20 73 70 2d 3e 69 6e 64 65          sp->inde
1d3f0 78 3c 3d 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74  x<=0 || sp->dest
1d400 72 75 63 74 6f 72 21 3d 30 20 29 20 63 6f 6e 74  ructor!=0 ) cont
1d410 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
1d420 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  once ){.        
1d430 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20  fprintf(out, "  
1d440 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 4e      /* Default N
1d450 4f 4e 2d 54 45 52 4d 49 4e 41 4c 20 44 65 73 74  ON-TERMINAL Dest
1d460 72 75 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b 20 6c  ructor */\n"); l
1d470 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
1d480 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20   once = 0;.     
1d490 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
1d4a0 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25  (out,"    case %
1d4b0 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20  d: /* %s */\n", 
1d4c0 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e  sp->index, sp->n
1d4d0 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
1d4e0 20 20 20 20 20 20 64 66 6c 74 5f 73 70 20 3d 20        dflt_sp = 
1d4f0 73 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  sp;.    }.    if
1d500 28 20 64 66 6c 74 5f 73 70 21 3d 30 20 29 7b 0a  ( dflt_sp!=0 ){.
1d510 20 20 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72        emit_destr
1d520 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 64  uctor_code(out,d
1d530 66 6c 74 5f 73 70 2c 6c 65 6d 70 2c 26 6c 69 6e  flt_sp,lemp,&lin
1d540 65 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eno);.    }.    
1d550 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1d560 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c     break;\n"); l
1d570 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66  ineno++;.  }.  f
1d580 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1d590 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
1d5a0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
1d5b0 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d   *sp = lemp->sym
1d5c0 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28  bols[i];.    if(
1d5d0 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79   sp==0 || sp->ty
1d5e0 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 20  pe==TERMINAL || 
1d5f0 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3d 3d  sp->destructor==
1d600 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1d610 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1d620 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25     case %d: /* %
1d630 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64  s */\n", sp->ind
1d640 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c  ex, sp->name); l
1d650 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  ineno++;..    /*
1d660 20 43 6f 6d 62 69 6e 65 20 64 75 70 6c 69 63 61   Combine duplica
1d670 74 65 20 64 65 73 74 72 75 63 74 6f 72 73 20 69  te destructors i
1d680 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 63 61 73  nto a single cas
1d690 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 69  e */.    for(j=i
1d6a0 2b 31 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  +1; j<lemp->nsym
1d6b0 62 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  bol; j++){.     
1d6c0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1d6d0 73 70 32 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62  sp2 = lemp->symb
1d6e0 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  ols[j];.      if
1d6f0 28 20 73 70 32 20 26 26 20 73 70 32 2d 3e 74 79  ( sp2 && sp2->ty
1d700 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 26 26 20  pe!=TERMINAL && 
1d710 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 0a  sp2->destructor.
1d720 20 20 20 20 20 20 20 20 20 20 26 26 20 73 70 32            && sp2
1d730 2d 3e 64 74 6e 75 6d 3d 3d 73 70 2d 3e 64 74 6e  ->dtnum==sp->dtn
1d740 75 6d 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  um.          && 
1d750 73 74 72 63 6d 70 28 73 70 2d 3e 64 65 73 74 72  strcmp(sp->destr
1d760 75 63 74 6f 72 2c 73 70 32 2d 3e 64 65 73 74 72  uctor,sp2->destr
1d770 75 63 74 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20  uctor)==0 ){.   
1d780 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1d790 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 20  t,"    case %d: 
1d7a0 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20  /* %s */\n",.   
1d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 70                sp
1d7c0 32 2d 3e 69 6e 64 65 78 2c 20 73 70 32 2d 3e 6e  2->index, sp2->n
1d7d0 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
1d7e0 20 20 20 20 20 20 20 20 20 73 70 32 2d 3e 64 65           sp2->de
1d7f0 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20  structor = 0;.  
1d800 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1d810 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72   emit_destructor
1d820 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e  _code(out,lemp->
1d830 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c  symbols[i],lemp,
1d840 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70  &lineno);.    fp
1d850 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
1d860 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
1d870 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
1d880 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1d890 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1d8a0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1d8b0 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
1d8c0 63 75 74 65 73 20 77 68 65 6e 65 76 65 72 20 74  cutes whenever t
1d8d0 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20  he parser stack 
1d8e0 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 74  overflows */.  t
1d8f0 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
1d900 6d 70 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f  mp,lemp->overflo
1d910 77 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70  w,&lineno);.  tp
1d920 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1d930 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
1d940 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
1d950 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20  te the table of 
1d960 72 75 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  rule information
1d970 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65   .  **.  ** Note
1d980 3a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  : This code depe
1d990 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
1d9a0 74 68 61 74 20 72 75 6c 65 73 20 61 72 65 20 6e  that rules are n
1d9b0 75 6d 62 65 72 0a 20 20 2a 2a 20 73 65 71 75 65  umber.  ** seque
1d9c0 6e 74 75 61 6c 6c 79 20 62 65 67 69 6e 6e 69 6e  ntually beginnin
1d9d0 67 20 77 69 74 68 20 30 2e 0a 20 20 2a 2f 0a 20  g with 0..  */. 
1d9e0 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
1d9f0 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
1da00 65 78 74 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  ext){.    fprint
1da10 66 28 6f 75 74 2c 22 20 20 7b 20 25 64 2c 20 25  f(out,"  { %d, %
1da20 64 20 7d 2c 5c 6e 22 2c 72 70 2d 3e 6c 68 73 2d  d },\n",rp->lhs-
1da30 3e 69 6e 64 65 78 2c 72 70 2d 3e 6e 72 68 73 29  >index,rp->nrhs)
1da40 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
1da50 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1da60 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1da70 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1da80 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63  nerate code whic
1da90 68 20 65 78 65 63 75 74 69 6f 6e 20 64 75 72 69  h execution duri
1daa0 6e 67 20 65 61 63 68 20 52 45 44 55 43 45 20 61  ng each REDUCE a
1dab0 63 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 72  ction */.  for(r
1dac0 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
1dad0 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
1dae0 20 20 20 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f      translate_co
1daf0 64 65 28 6c 65 6d 70 2c 20 72 70 29 3b 0a 20 20  de(lemp, rp);.  
1db00 7d 0a 20 20 2f 2a 20 46 69 72 73 74 20 6f 75 74  }.  /* First out
1db10 70 75 74 20 72 75 6c 65 73 20 6f 74 68 65 72 20  put rules other 
1db20 74 68 61 6e 20 74 68 65 20 64 65 66 61 75 6c 74  than the default
1db30 3a 20 72 75 6c 65 20 2a 2f 0a 20 20 66 6f 72 28  : rule */.  for(
1db40 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
1db50 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
1db60 0a 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65  .    struct rule
1db70 20 2a 72 70 32 3b 20 20 20 20 20 20 20 20 20 20   *rp2;          
1db80 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 20 72 75       /* Other ru
1db90 6c 65 73 20 77 69 74 68 20 74 68 65 20 73 61 6d  les with the sam
1dba0 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  e action */.    
1dbb0 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20  if( rp->code==0 
1dbc0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1dbd0 69 66 28 20 72 70 2d 3e 63 6f 64 65 5b 30 5d 3d  if( rp->code[0]=
1dbe0 3d 27 5c 6e 27 20 26 26 20 72 70 2d 3e 63 6f 64  ='\n' && rp->cod
1dbf0 65 5b 31 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  e[1]==0 ) contin
1dc00 75 65 3b 20 2f 2a 20 57 69 6c 6c 20 62 65 20 64  ue; /* Will be d
1dc10 65 66 61 75 6c 74 3a 20 2a 2f 0a 20 20 20 20 66  efault: */.    f
1dc20 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1dc30 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 22 2c    case %d: /* ",
1dc40 20 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20   rp->index);.   
1dc50 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f   writeRuleText(o
1dc60 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72  ut, rp);.    fpr
1dc70 69 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f 5c 6e  intf(out, " */\n
1dc80 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1dc90 20 20 66 6f 72 28 72 70 32 3d 72 70 2d 3e 6e 65    for(rp2=rp->ne
1dca0 78 74 3b 20 72 70 32 3b 20 72 70 32 3d 72 70 32  xt; rp2; rp2=rp2
1dcb0 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
1dcc0 66 28 20 72 70 32 2d 3e 63 6f 64 65 3d 3d 72 70  f( rp2->code==rp
1dcd0 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  ->code ){.      
1dce0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1dcf0 20 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a       case %d: /*
1dd00 20 22 2c 20 72 70 32 2d 3e 69 6e 64 65 78 29 3b   ", rp2->index);
1dd10 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 52 75  .        writeRu
1dd20 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 32 29  leText(out, rp2)
1dd30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
1dd40 66 28 6f 75 74 2c 22 20 2a 2f 20 79 79 74 65 73  f(out," */ yytes
1dd50 74 63 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d  tcase(yyruleno==
1dd60 25 64 29 3b 5c 6e 22 2c 20 72 70 32 2d 3e 69 6e  %d);\n", rp2->in
1dd70 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
1dd80 20 20 20 20 20 20 20 20 72 70 32 2d 3e 63 6f 64          rp2->cod
1dd90 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
1dda0 20 20 20 7d 0a 20 20 20 20 65 6d 69 74 5f 63 6f     }.    emit_co
1ddb0 64 65 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 26  de(out,rp,lemp,&
1ddc0 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72  lineno);.    fpr
1ddd0 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
1dde0 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69    break;\n"); li
1ddf0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 72 70 2d 3e  neno++;.    rp->
1de00 63 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  code = 0;.  }.  
1de10 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6f 75 74 70  /* Finally, outp
1de20 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20  ut the default: 
1de30 72 75 6c 65 2e 20 20 57 65 20 63 68 6f 6f 73 65  rule.  We choose
1de40 20 61 73 20 74 68 65 20 64 65 66 61 75 6c 74 3a   as the default:
1de50 20 61 6c 6c 0a 20 20 2a 2a 20 65 6d 70 74 79 20   all.  ** empty 
1de60 61 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 66 70  actions. */.  fp
1de70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
1de80 20 64 65 66 61 75 6c 74 3a 5c 6e 22 29 3b 20 6c   default:\n"); l
1de90 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 72  ineno++;.  for(r
1dea0 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
1deb0 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
1dec0 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65      if( rp->code
1ded0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1dee0 20 20 20 20 61 73 73 65 72 74 28 20 72 70 2d 3e      assert( rp->
1def0 63 6f 64 65 5b 30 5d 3d 3d 27 5c 6e 27 20 26 26  code[0]=='\n' &&
1df00 20 72 70 2d 3e 63 6f 64 65 5b 31 5d 3d 3d 30 20   rp->code[1]==0 
1df10 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1df20 75 74 2c 22 20 20 20 20 20 20 2f 2a 20 28 25 64  ut,"      /* (%d
1df30 29 20 22 2c 20 72 70 2d 3e 69 6e 64 65 78 29 3b  ) ", rp->index);
1df40 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54 65  .    writeRuleTe
1df50 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20  xt(out, rp);.   
1df60 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
1df70 2a 2f 20 79 79 74 65 73 74 63 61 73 65 28 79 79  */ yytestcase(yy
1df80 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c  ruleno==%d);\n",
1df90 20 72 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e   rp->index); lin
1dfa0 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72  eno++;.  }.  fpr
1dfb0 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
1dfc0 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69    break;\n"); li
1dfd0 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78  neno++;.  tplt_x
1dfe0 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1dff0 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1e000 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1e010 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
1e020 65 73 20 69 66 20 61 20 70 61 72 73 65 20 66 61  es if a parse fa
1e030 69 6c 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72  ils */.  tplt_pr
1e040 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d  int(out,lemp,lem
1e050 70 2d 3e 66 61 69 6c 75 72 65 2c 26 6c 69 6e 65  p->failure,&line
1e060 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  no);.  tplt_xfer
1e070 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1e080 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1e090 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1e0a0 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20   which executes 
1e0b0 77 68 65 6e 20 61 20 73 79 6e 74 61 78 20 65 72  when a syntax er
1e0c0 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20  ror occurs */.  
1e0d0 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
1e0e0 65 6d 70 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 2c  emp,lemp->error,
1e0f0 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74  &lineno);.  tplt
1e100 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1e110 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1e120 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1e130 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   code which exec
1e140 75 74 65 73 20 77 68 65 6e 20 74 68 65 20 70 61  utes when the pa
1e150 72 73 65 72 20 61 63 63 65 70 74 73 20 69 74 73  rser accepts its
1e160 20 69 6e 70 75 74 20 2a 2f 0a 20 20 74 70 6c 74   input */.  tplt
1e170 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
1e180 6c 65 6d 70 2d 3e 61 63 63 65 70 74 2c 26 6c 69  lemp->accept,&li
1e190 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66  neno);.  tplt_xf
1e1a0 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1e1b0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1e1c0 20 20 2f 2a 20 41 70 70 65 6e 64 20 61 6e 79 20    /* Append any 
1e1d0 61 64 64 69 74 69 6f 6e 20 63 6f 64 65 20 74 68  addition code th
1e1e0 65 20 75 73 65 72 20 64 65 73 69 72 65 73 20 2a  e user desires *
1e1f0 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  /.  tplt_print(o
1e200 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78  ut,lemp,lemp->ex
1e210 74 72 61 63 6f 64 65 2c 26 6c 69 6e 65 6e 6f 29  tracode,&lineno)
1e220 3b 0a 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  ;..  fclose(in);
1e230 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a  .  fclose(out);.
1e240 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
1e250 47 65 6e 65 72 61 74 65 20 61 20 68 65 61 64 65  Generate a heade
1e260 72 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70  r file for the p
1e270 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65  arser */.void Re
1e280 70 6f 72 74 48 65 61 64 65 72 28 73 74 72 75 63  portHeader(struc
1e290 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
1e2a0 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69  .  FILE *out, *i
1e2b0 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n;.  const char 
1e2c0 2a 70 72 65 66 69 78 3b 0a 20 20 63 68 61 72 20  *prefix;.  char 
1e2d0 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a  line[LINESIZE];.
1e2e0 20 20 63 68 61 72 20 70 61 74 74 65 72 6e 5b 4c    char pattern[L
1e2f0 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20  INESIZE];.  int 
1e300 69 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  i;..  if( lemp->
1e310 74 6f 6b 65 6e 70 72 65 66 69 78 20 29 20 70 72  tokenprefix ) pr
1e320 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b  efix = lemp->tok
1e330 65 6e 70 72 65 66 69 78 3b 0a 20 20 65 6c 73 65  enprefix;.  else
1e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e350 20 20 20 20 70 72 65 66 69 78 20 3d 20 22 22 3b      prefix = "";
1e360 0a 20 20 69 6e 20 3d 20 66 69 6c 65 5f 6f 70 65  .  in = file_ope
1e370 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 72 62 22  n(lemp,".h","rb"
1e380 29 3b 0a 20 20 69 66 28 20 69 6e 20 29 7b 0a 20  );.  if( in ){. 
1e390 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65     for(i=1; i<le
1e3a0 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26  mp->nterminal &&
1e3b0 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45   fgets(line,LINE
1e3c0 53 49 5a 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a  SIZE,in); i++){.
1e3d0 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 70 61        sprintf(pa
1e3e0 74 74 65 72 6e 2c 22 23 64 65 66 69 6e 65 20 25  ttern,"#define %
1e3f0 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72  s%-30s %2d\n",pr
1e400 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  efix,lemp->symbo
1e410 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a  ls[i]->name,i);.
1e420 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
1e430 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e 29 20 29  (line,pattern) )
1e440 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1e450 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
1e460 20 20 69 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e    if( i==lemp->n
1e470 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20  terminal ){.    
1e480 20 20 2f 2a 20 4e 6f 20 63 68 61 6e 67 65 20 69    /* No change i
1e490 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 44 6f 6e  n the file.  Don
1e4a0 27 74 20 72 65 77 72 69 74 65 20 69 74 2e 20 2a  't rewrite it. *
1e4b0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  /.      return;.
1e4c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6f 75 74 20      }.  }.  out 
1e4d0 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70  = file_open(lemp
1e4e0 2c 22 2e 68 22 2c 22 77 62 22 29 3b 0a 20 20 69  ,".h","wb");.  i
1e4f0 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 66 6f  f( out ){.    fo
1e500 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=1; i<lemp->n
1e510 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a  terminal; i++){.
1e520 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1e530 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33  t,"#define %s%-3
1e540 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78  0s %2d\n",prefix
1e550 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
1e560 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20  ]->name,i);.    
1e570 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74  }.    fclose(out
1e580 29 3b 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  );  .  }.  retur
1e590 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 64 75 63 65 20  n;.}../* Reduce 
1e5a0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1e5b0 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 2c 20 69  action tables, i
1e5c0 66 20 70 6f 73 73 69 62 6c 65 2c 20 62 79 20 6d  f possible, by m
1e5d0 61 6b 69 6e 67 20 75 73 65 0a 2a 2a 20 6f 66 20  aking use.** of 
1e5e0 64 65 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20  defaults..**.** 
1e5f0 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 2c  In this version,
1e600 20 77 65 20 74 61 6b 65 20 74 68 65 20 6d 6f 73   we take the mos
1e610 74 20 66 72 65 71 75 65 6e 74 20 52 45 44 55 43  t frequent REDUC
1e620 45 20 61 63 74 69 6f 6e 20 61 6e 64 20 6d 61 6b  E action and mak
1e630 65 0a 2a 2a 20 69 74 20 74 68 65 20 64 65 66 61  e.** it the defa
1e640 75 6c 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68  ult.  Except, th
1e650 65 72 65 20 69 73 20 6e 6f 20 64 65 66 61 75 6c  ere is no defaul
1e660 74 20 69 66 20 74 68 65 20 77 69 6c 64 63 61 72  t if the wildcar
1e670 64 20 74 6f 6b 65 6e 0a 2a 2a 20 69 73 20 61 20  d token.** is a 
1e680 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b 2d 61 68  possible look-ah
1e690 65 61 64 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d  ead..*/.void Com
1e6a0 70 72 65 73 73 54 61 62 6c 65 73 28 73 74 72 75  pressTables(stru
1e6b0 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
1e6c0 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
1e6d0 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
1e6e0 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 61 70 32  action *ap, *ap2
1e6f0 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
1e700 2a 72 70 2c 20 2a 72 70 32 2c 20 2a 72 62 65 73  *rp, *rp2, *rbes
1e710 74 3b 0a 20 20 69 6e 74 20 6e 62 65 73 74 2c 20  t;.  int nbest, 
1e720 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
1e730 74 20 75 73 65 73 57 69 6c 64 63 61 72 64 3b 0a  t usesWildcard;.
1e740 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
1e750 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
1e760 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  {.    stp = lemp
1e770 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
1e780 20 6e 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20   nbest = 0;.    
1e790 72 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 75  rbest = 0;.    u
1e7a0 73 65 73 57 69 6c 64 63 61 72 64 20 3d 20 30 3b  sesWildcard = 0;
1e7b0 0a 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70  ..    for(ap=stp
1e7c0 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
1e7d0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
1e7e0 28 20 61 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46  ( ap->type==SHIF
1e7f0 54 20 26 26 20 61 70 2d 3e 73 70 3d 3d 6c 65 6d  T && ap->sp==lem
1e800 70 2d 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20  p->wildcard ){. 
1e810 20 20 20 20 20 20 20 75 73 65 73 57 69 6c 64 63         usesWildc
1e820 61 72 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ard = 1;.      }
1e830 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
1e840 79 70 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f  ype!=REDUCE ) co
1e850 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 70  ntinue;.      rp
1e860 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20   = ap->x.rp;.   
1e870 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 53 74     if( rp->lhsSt
1e880 61 72 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  art ) continue;.
1e890 20 20 20 20 20 20 69 66 28 20 72 70 3d 3d 72 62        if( rp==rb
1e8a0 65 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  est ) continue;.
1e8b0 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20        n = 1;.   
1e8c0 20 20 20 66 6f 72 28 61 70 32 3d 61 70 2d 3e 6e     for(ap2=ap->n
1e8d0 65 78 74 3b 20 61 70 32 3b 20 61 70 32 3d 61 70  ext; ap2; ap2=ap
1e8e0 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  2->next){.      
1e8f0 20 20 69 66 28 20 61 70 32 2d 3e 74 79 70 65 21    if( ap2->type!
1e900 3d 52 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e  =REDUCE ) contin
1e910 75 65 3b 0a 20 20 20 20 20 20 20 20 72 70 32 20  ue;.        rp2 
1e920 3d 20 61 70 32 2d 3e 78 2e 72 70 3b 0a 20 20 20  = ap2->x.rp;.   
1e930 20 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72 62       if( rp2==rb
1e940 65 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  est ) continue;.
1e950 20 20 20 20 20 20 20 20 69 66 28 20 72 70 32 3d          if( rp2=
1e960 3d 72 70 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20  =rp ) n++;.     
1e970 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e   }.      if( n>n
1e980 62 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  best ){.        
1e990 6e 62 65 73 74 20 3d 20 6e 3b 0a 20 20 20 20 20  nbest = n;.     
1e9a0 20 20 20 72 62 65 73 74 20 3d 20 72 70 3b 0a 20     rbest = rp;. 
1e9b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 0a 20       }.    }. . 
1e9c0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b     /* Do not mak
1e9d0 65 20 61 20 64 65 66 61 75 6c 74 20 69 66 20 74  e a default if t
1e9e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 75 6c  he number of rul
1e9f0 65 73 20 74 6f 20 64 65 66 61 75 6c 74 0a 20 20  es to default.  
1ea00 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 74 20 6c    ** is not at l
1ea10 65 61 73 74 20 31 20 6f 72 20 69 66 20 74 68 65  east 1 or if the
1ea20 20 77 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e 20   wildcard token 
1ea30 69 73 20 61 20 70 6f 73 73 69 62 6c 65 0a 20 20  is a possible.  
1ea40 20 20 2a 2a 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a    ** lookahead..
1ea50 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1ea60 62 65 73 74 3c 31 20 7c 7c 20 75 73 65 73 57 69  best<1 || usesWi
1ea70 6c 64 63 61 72 64 20 29 20 63 6f 6e 74 69 6e 75  ldcard ) continu
1ea80 65 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62  e;...    /* Comb
1ea90 69 6e 65 20 6d 61 74 63 68 69 6e 67 20 52 45 44  ine matching RED
1eaa0 55 43 45 20 61 63 74 69 6f 6e 73 20 69 6e 74 6f  UCE actions into
1eab0 20 61 20 73 69 6e 67 6c 65 20 64 65 66 61 75 6c   a single defaul
1eac0 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28 61 70 3d  t */.    for(ap=
1ead0 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
1eae0 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
1eaf0 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52   if( ap->type==R
1eb00 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72  EDUCE && ap->x.r
1eb10 70 3d 3d 72 62 65 73 74 20 29 20 62 72 65 61 6b  p==rbest ) break
1eb20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1eb30 72 74 28 20 61 70 20 29 3b 0a 20 20 20 20 61 70  rt( ap );.    ap
1eb40 2d 3e 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  ->sp = Symbol_ne
1eb50 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a  w("{default}");.
1eb60 20 20 20 20 66 6f 72 28 61 70 3d 61 70 2d 3e 6e      for(ap=ap->n
1eb70 65 78 74 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  ext; ap; ap=ap->
1eb80 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
1eb90 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43   ap->type==REDUC
1eba0 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72  E && ap->x.rp==r
1ebb0 62 65 73 74 20 29 20 61 70 2d 3e 74 79 70 65 20  best ) ap->type 
1ebc0 3d 20 4e 4f 54 5f 55 53 45 44 3b 0a 20 20 20 20  = NOT_USED;.    
1ebd0 7d 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20  }.    stp->ap = 
1ebe0 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d  Action_sort(stp-
1ebf0 3e 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  >ap);.  }.}.../*
1ec00 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
1ec10 73 74 61 74 65 73 20 66 6f 72 20 73 6f 72 74 69  states for sorti
1ec20 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68  ng purposes.  Th
1ec30 65 20 73 6d 61 6c 6c 65 72 20 73 74 61 74 65 20  e smaller state 
1ec40 69 73 20 74 68 65 0a 2a 2a 20 6f 6e 65 20 77 69  is the.** one wi
1ec50 74 68 20 74 68 65 20 6d 6f 73 74 20 6e 6f 6e 2d  th the most non-
1ec60 74 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73  terminal actions
1ec70 2e 20 20 49 66 20 74 68 65 79 20 68 61 76 65 20  .  If they have 
1ec80 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
1ec90 2a 2a 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e  ** of non-termin
1eca0 61 6c 20 61 63 74 69 6f 6e 73 2c 20 74 68 65 6e  al actions, then
1ecb0 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 69 73 20   the smaller is 
1ecc0 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
1ecd0 20 6d 6f 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 61   most.** token a
1ece0 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  ctions..*/.stati
1ecf0 63 20 69 6e 74 20 73 74 61 74 65 52 65 73 6f 72  c int stateResor
1ed00 74 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76  tCompare(const v
1ed10 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f  oid *a, const vo
1ed20 69 64 20 2a 62 29 7b 0a 20 20 63 6f 6e 73 74 20  id *b){.  const 
1ed30 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 70 41  struct state *pA
1ed40 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63   = *(const struc
1ed50 74 20 73 74 61 74 65 2a 2a 29 61 3b 0a 20 20 63  t state**)a;.  c
1ed60 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74  onst struct stat
1ed70 65 20 2a 70 42 20 3d 20 2a 28 63 6f 6e 73 74 20  e *pB = *(const 
1ed80 73 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29 62  struct state**)b
1ed90 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20  ;.  int n;..  n 
1eda0 3d 20 70 42 2d 3e 6e 4e 74 41 63 74 20 2d 20 70  = pB->nNtAct - p
1edb0 41 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20 69 66 28  A->nNtAct;.  if(
1edc0 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d   n==0 ){.    n =
1edd0 20 70 42 2d 3e 6e 54 6b 6e 41 63 74 20 2d 20 70   pB->nTknAct - p
1ede0 41 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20  A->nTknAct;.    
1edf0 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
1ee00 20 20 6e 20 3d 20 70 42 2d 3e 73 74 61 74 65 6e    n = pB->staten
1ee10 75 6d 20 2d 20 70 41 2d 3e 73 74 61 74 65 6e 75  um - pA->statenu
1ee20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  m;.    }.  }.  a
1ee30 73 73 65 72 74 28 20 6e 21 3d 30 20 29 3b 0a 20  ssert( n!=0 );. 
1ee40 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f   return n;.}.../
1ee50 2a 0a 2a 2a 20 52 65 6e 75 6d 62 65 72 20 61 6e  *.** Renumber an
1ee60 64 20 72 65 73 6f 72 74 20 73 74 61 74 65 73 20  d resort states 
1ee70 73 6f 20 74 68 61 74 20 73 74 61 74 65 73 20 77  so that states w
1ee80 69 74 68 20 66 65 77 65 72 20 63 68 6f 69 63 65  ith fewer choice
1ee90 73 0a 2a 2a 20 6f 63 63 75 72 20 61 74 20 74 68  s.** occur at th
1eea0 65 20 65 6e 64 2e 20 20 45 78 63 65 70 74 2c 20  e end.  Except, 
1eeb0 6b 65 65 70 20 73 74 61 74 65 20 30 20 61 73 20  keep state 0 as 
1eec0 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65 2e  the first state.
1eed0 0a 2a 2f 0a 76 6f 69 64 20 52 65 73 6f 72 74 53  .*/.void ResortS
1eee0 74 61 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d  tates(struct lem
1eef0 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e  on *lemp).{.  in
1ef00 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
1ef10 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
1ef20 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 0a  ct action *ap;..
1ef30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1ef40 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
1ef50 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
1ef60 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
1ef70 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20 73  stp->nTknAct = s
1ef80 74 70 2d 3e 6e 4e 74 41 63 74 20 3d 20 30 3b 0a  tp->nNtAct = 0;.
1ef90 20 20 20 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d      stp->iDflt =
1efa0 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20   lemp->nstate + 
1efb0 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20  lemp->nrule;.   
1efc0 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d   stp->iTknOfst =
1efd0 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20   NO_OFFSET;.    
1efe0 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 4e  stp->iNtOfst = N
1eff0 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 66 6f  O_OFFSET;.    fo
1f000 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
1f010 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1f020 20 20 20 20 20 20 69 66 28 20 63 6f 6d 70 75 74        if( comput
1f030 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70  e_action(lemp,ap
1f040 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
1f050 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
1f060 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  x<lemp->ntermina
1f070 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  l ){.          s
1f080 74 70 2d 3e 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20  tp->nTknAct++;. 
1f090 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1f0a0 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c   ap->sp->index<l
1f0b0 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a  emp->nsymbol ){.
1f0c0 20 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e            stp->n
1f0d0 4e 74 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20  NtAct++;.       
1f0e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f0f0 20 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 63    stp->iDflt = c
1f100 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65  ompute_action(le
1f110 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20  mp, ap);.       
1f120 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1f130 0a 20 20 7d 0a 20 20 71 73 6f 72 74 28 26 6c 65  .  }.  qsort(&le
1f140 6d 70 2d 3e 73 6f 72 74 65 64 5b 31 5d 2c 20 6c  mp->sorted[1], l
1f150 65 6d 70 2d 3e 6e 73 74 61 74 65 2d 31 2c 20 73  emp->nstate-1, s
1f160 69 7a 65 6f 66 28 6c 65 6d 70 2d 3e 73 6f 72 74  izeof(lemp->sort
1f170 65 64 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 20  ed[0]),.        
1f180 73 74 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61  stateResortCompa
1f190 72 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  re);.  for(i=0; 
1f1a0 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
1f1b0 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e  i++){.    lemp->
1f1c0 73 6f 72 74 65 64 5b 69 5d 2d 3e 73 74 61 74 65  sorted[i]->state
1f1d0 6e 75 6d 20 3d 20 69 3b 0a 20 20 7d 0a 7d 0a 0a  num = i;.  }.}..
1f1e0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1f1f0 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
1f200 65 20 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  e "set.c" ******
1f210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1f230 2f 2a 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70 75  /*.** Set manipu
1f240 6c 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  lation routines 
1f250 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61  for the LEMON pa
1f260 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
1f270 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  */..static int s
1f280 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74  ize = 0;../* Set
1f290 20 74 68 65 20 73 65 74 20 73 69 7a 65 20 2a 2f   the set size */
1f2a0 0a 76 6f 69 64 20 53 65 74 53 69 7a 65 28 69 6e  .void SetSize(in
1f2b0 74 20 6e 29 0a 7b 0a 20 20 73 69 7a 65 20 3d 20  t n).{.  size = 
1f2c0 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63  n+1;.}../* Alloc
1f2d0 61 74 65 20 61 20 6e 65 77 20 73 65 74 20 2a 2f  ate a new set */
1f2e0 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28 29 7b  .char *SetNew(){
1f2f0 0a 20 20 63 68 61 72 20 2a 73 3b 0a 20 20 73 20  .  char *s;.  s 
1f300 3d 20 28 63 68 61 72 2a 29 63 61 6c 6c 6f 63 28  = (char*)calloc(
1f310 20 73 69 7a 65 2c 20 31 29 3b 0a 20 20 69 66 28   size, 1);.  if(
1f320 20 73 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 74   s==0 ){.    ext
1f330 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f  ern void memory_
1f340 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 6d 65 6d  error();.    mem
1f350 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d  ory_error();.  }
1f360 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a  .  return s;.}..
1f370 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  /* Deallocate a 
1f380 73 65 74 20 2a 2f 0a 76 6f 69 64 20 53 65 74 46  set */.void SetF
1f390 72 65 65 28 63 68 61 72 20 2a 73 29 0a 7b 0a 20  ree(char *s).{. 
1f3a0 20 66 72 65 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20   free(s);.}../* 
1f3b0 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
1f3c0 74 20 74 6f 20 74 68 65 20 73 65 74 2e 20 20 52  t to the set.  R
1f3d0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
1f3e0 65 20 65 6c 65 6d 65 6e 74 20 77 61 73 20 61 64  e element was ad
1f3f0 64 65 64 0a 2a 2a 20 61 6e 64 20 46 41 4c 53 45  ded.** and FALSE
1f400 20 69 66 20 69 74 20 77 61 73 20 61 6c 72 65 61   if it was alrea
1f410 64 79 20 74 68 65 72 65 2e 20 2a 2f 0a 69 6e 74  dy there. */.int
1f420 20 53 65 74 41 64 64 28 63 68 61 72 20 2a 73 2c   SetAdd(char *s,
1f430 20 69 6e 74 20 65 29 0a 7b 0a 20 20 69 6e 74 20   int e).{.  int 
1f440 72 76 3b 0a 20 20 61 73 73 65 72 74 28 20 65 3e  rv;.  assert( e>
1f450 3d 30 20 26 26 20 65 3c 73 69 7a 65 20 29 3b 0a  =0 && e<size );.
1f460 20 20 72 76 20 3d 20 73 5b 65 5d 3b 0a 20 20 73    rv = s[e];.  s
1f470 5b 65 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  [e] = 1;.  retur
1f480 6e 20 21 72 76 3b 0a 7d 0a 0a 2f 2a 20 41 64 64  n !rv;.}../* Add
1f490 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f   every element o
1f4a0 66 20 73 32 20 74 6f 20 73 31 2e 20 20 52 65 74  f s2 to s1.  Ret
1f4b0 75 72 6e 20 54 52 55 45 20 69 66 20 73 31 20 63  urn TRUE if s1 c
1f4c0 68 61 6e 67 65 73 2e 20 2a 2f 0a 69 6e 74 20 53  hanges. */.int S
1f4d0 65 74 55 6e 69 6f 6e 28 63 68 61 72 20 2a 73 31  etUnion(char *s1
1f4e0 2c 20 63 68 61 72 20 2a 73 32 29 0a 7b 0a 20 20  , char *s2).{.  
1f4f0 69 6e 74 20 69 2c 20 70 72 6f 67 72 65 73 73 3b  int i, progress;
1f500 0a 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b  .  progress = 0;
1f510 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
1f520 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ze; i++){.    if
1f530 28 20 73 32 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  ( s2[i]==0 ) con
1f540 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
1f550 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  1[i]==0 ){.     
1f560 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20   progress = 1;. 
1f570 20 20 20 20 20 73 31 5b 69 5d 20 3d 20 31 3b 0a       s1[i] = 1;.
1f580 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1f590 72 6e 20 70 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f  rn progress;.}./
1f5a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f5b0 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
1f5c0 66 69 6c 65 20 22 74 61 62 6c 65 2e 63 22 20 2a  file "table.c" *
1f5d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f5e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
1f5f0 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74  ** All code in t
1f600 68 69 73 20 66 69 6c 65 20 68 61 73 20 62 65 65  his file has bee
1f610 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  n automatically 
1f620 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f  generated.** fro
1f630 6d 20 61 20 73 70 65 63 69 66 69 63 61 74 69 6f  m a specificatio
1f640 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a  n in the file.**
1f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
1f660 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68  able.q".** by th
1f670 65 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  e associative ar
1f680 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e  ray code buildin
1f690 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e  g program "aagen
1f6a0 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69  "..** Do not edi
1f6b0 74 20 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e  t this file!  In
1f6c0 73 74 65 61 64 2c 20 65 64 69 74 20 74 68 65 20  stead, edit the 
1f6d0 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a  specification.**
1f6e0 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75   file, then reru
1f6f0 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a  n aagen..*/./*.*
1f700 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65  * Code for proce
1f710 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20  ssing tables in 
1f720 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
1f730 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
1f740 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 72 68  PRIVATE int strh
1f750 61 73 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ash(const char *
1f760 78 29 0a 7b 0a 20 20 69 6e 74 20 68 20 3d 20 30  x).{.  int h = 0
1f770 3b 0a 20 20 77 68 69 6c 65 28 20 2a 78 29 20 68  ;.  while( *x) h
1f780 20 3d 20 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29   = h*13 + *(x++)
1f790 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a  ;.  return h;.}.
1f7a0 0a 2f 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73  ./* Works like s
1f7b0 74 72 64 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20  trdup, sort of. 
1f7c0 20 53 61 76 65 20 61 20 73 74 72 69 6e 67 20 69   Save a string i
1f7d0 6e 20 6d 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72  n malloced memor
1f7e0 79 2c 20 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73  y, but.** keep s
1f7f0 74 72 69 6e 67 73 20 69 6e 20 61 20 74 61 62 6c  trings in a tabl
1f800 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 61  e so that the sa
1f810 6d 65 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74  me string is not
1f820 20 69 6e 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e   in more.** than
1f830 20 6f 6e 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63   one place..*/.c
1f840 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73 61  onst char *Strsa
1f850 66 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 79  fe(const char *y
1f860 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ).{.  const char
1f870 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 63 70 79   *z;.  char *cpy
1f880 3b 0a 0a 20 20 69 66 28 20 79 3d 3d 30 20 29 20  ;..  if( y==0 ) 
1f890 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20  return 0;.  z = 
1f8a0 53 74 72 73 61 66 65 5f 66 69 6e 64 28 79 29 3b  Strsafe_find(y);
1f8b0 0a 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 28  .  if( z==0 && (
1f8c0 63 70 79 3d 28 63 68 61 72 20 2a 29 6d 61 6c 6c  cpy=(char *)mall
1f8d0 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
1f8e0 79 29 2b 31 20 29 29 21 3d 30 20 29 7b 0a 20 20  y)+1 ))!=0 ){.  
1f8f0 20 20 73 74 72 63 70 79 28 63 70 79 2c 79 29 3b    strcpy(cpy,y);
1f900 0a 20 20 20 20 7a 20 3d 20 63 70 79 3b 0a 20 20  .    z = cpy;.  
1f910 20 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74    Strsafe_insert
1f920 28 7a 29 3b 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72  (z);.  }.  Memor
1f930 79 43 68 65 63 6b 28 7a 29 3b 0a 20 20 72 65 74  yCheck(z);.  ret
1f940 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  urn z;.}../* The
1f950 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
1f960 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1f970 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f  ing structure fo
1f980 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69  r each.** associ
1f990 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
1f9a0 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 73 74 72  ype "x1"..*/.str
1f9b0 75 63 74 20 73 5f 78 31 20 7b 0a 20 20 69 6e 74  uct s_x1 {.  int
1f9c0 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
1f9d0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
1f9e0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
1f9f0 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  slots. */.      
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa10 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65      /*   Must be
1fa20 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72   a power of 2 gr
1fa30 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f  eater than or */
1fa40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fa50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
1fa60 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20  equal to 1 */.  
1fa70 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20  int count;      
1fa80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1fa90 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73  r of currently s
1faa0 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20  lots filled */. 
1fab0 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
1fac0 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64   *tbl;  /* The d
1fad0 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20  ata stored here 
1fae0 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31  */.  struct s_x1
1faf0 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48  node **ht;  /* H
1fb00 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f  ash table for lo
1fb10 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  okups */.};../* 
1fb20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
1fb30 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
1fb40 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72  ructure for ever
1fb50 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a  y data element.*
1fb60 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74  * in an associat
1fb70 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
1fb80 65 20 22 78 31 22 2e 0a 2a 2f 0a 74 79 70 65 64  e "x1"..*/.typed
1fb90 65 66 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f  ef struct s_x1no
1fba0 64 65 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  de {.  const cha
1fbb0 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  r *data;        
1fbc0 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
1fbd0 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
1fbe0 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78   *next;   /* Nex
1fbf0 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  t entry with the
1fc00 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20   same hash */.  
1fc10 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20  struct s_x1node 
1fc20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76  **from;  /* Prev
1fc30 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78  ious link */.} x
1fc40 31 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65  1node;../* There
1fc50 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73   is only one ins
1fc60 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72  tance of the arr
1fc70 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  ay, which is the
1fc80 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74   following */.st
1fc90 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 31  atic struct s_x1
1fca0 20 2a 78 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63   *x1a;../* Alloc
1fcb0 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69  ate a new associ
1fcc0 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76  ative array */.v
1fcd0 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e 69 74  oid Strsafe_init
1fce0 28 29 7b 0a 20 20 69 66 28 20 78 31 61 20 29 20  (){.  if( x1a ) 
1fcf0 72 65 74 75 72 6e 3b 0a 20 20 78 31 61 20 3d 20  return;.  x1a = 
1fd00 28 73 74 72 75 63 74 20 73 5f 78 31 2a 29 6d 61  (struct s_x1*)ma
1fd10 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
1fd20 75 63 74 20 73 5f 78 31 29 20 29 3b 0a 20 20 69  uct s_x1) );.  i
1fd30 66 28 20 78 31 61 20 29 7b 0a 20 20 20 20 78 31  f( x1a ){.    x1
1fd40 61 2d 3e 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  a->size = 1024;.
1fd50 20 20 20 20 78 31 61 2d 3e 63 6f 75 6e 74 20 3d      x1a->count =
1fd60 20 30 3b 0a 20 20 20 20 78 31 61 2d 3e 74 62 6c   0;.    x1a->tbl
1fd70 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x1node*)mall
1fd80 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65  oc( .      (size
1fd90 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x1node) + siz
1fda0 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 2a 31 30  eof(x1node*))*10
1fdb0 32 34 20 29 3b 0a 20 20 20 20 69 66 28 20 78 31  24 );.    if( x1
1fdc0 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
1fdd0 20 20 20 66 72 65 65 28 78 31 61 29 3b 0a 20 20     free(x1a);.  
1fde0 20 20 20 20 78 31 61 20 3d 20 30 3b 0a 20 20 20      x1a = 0;.   
1fdf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1fe00 74 20 69 3b 0a 20 20 20 20 20 20 78 31 61 2d 3e  t i;.      x1a->
1fe10 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26  ht = (x1node**)&
1fe20 28 78 31 61 2d 3e 74 62 6c 5b 31 30 32 34 5d 29  (x1a->tbl[1024])
1fe30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1fe40 20 69 3c 31 30 32 34 3b 20 69 2b 2b 29 20 78 31   i<1024; i++) x1
1fe50 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
1fe60 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73    }.  }.}./* Ins
1fe70 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
1fe80 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e   into the array.
1fe90 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
1fea0 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20   successful..** 
1feb0 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20  Prior data with 
1fec0 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
1fed0 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20  NOT overwritten 
1fee0 2a 2f 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69  */.int Strsafe_i
1fef0 6e 73 65 72 74 28 63 6f 6e 73 74 20 63 68 61 72  nsert(const char
1ff00 20 2a 64 61 74 61 29 0a 7b 0a 20 20 78 31 6e 6f   *data).{.  x1no
1ff10 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b  de *np;.  int h;
1ff20 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66  .  int ph;..  if
1ff30 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x1a==0 ) retur
1ff40 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68  n 0;.  ph = strh
1ff50 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d  ash(data);.  h =
1ff60 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65   ph & (x1a->size
1ff70 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d  -1);.  np = x1a-
1ff80 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
1ff90 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73   np ){.    if( s
1ffa0 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64  trcmp(np->data,d
1ffb0 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ata)==0 ){.     
1ffc0 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
1ffd0 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
1ffe0 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64  ame key is found
1fff0 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61  . */.      /* Fa
20000 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77  il because overw
20010 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  rite is not allo
20020 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ws. */.      ret
20030 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
20040 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
20050 20 20 7d 0a 20 20 69 66 28 20 78 31 61 2d 3e 63    }.  if( x1a->c
20060 6f 75 6e 74 3e 3d 78 31 61 2d 3e 73 69 7a 65 20  ount>=x1a->size 
20070 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74  ){.    /* Need t
20080 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20  o make the hash 
20090 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a  table bigger */.
200a0 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a      int i,size;.
200b0 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 31 20      struct s_x1 
200c0 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79  array;.    array
200d0 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78  .size = size = x
200e0 31 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20  1a->size*2;.    
200f0 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31  array.count = x1
20100 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72  a->count;.    ar
20110 72 61 79 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64  ray.tbl = (x1nod
20120 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e*)malloc(.     
20130 20 28 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29   (sizeof(x1node)
20140 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65   + sizeof(x1node
20150 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20  *))*size );.    
20160 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30  if( array.tbl==0
20170 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
20180 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c   Fail due to mal
20190 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  loc failure */. 
201a0 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78     array.ht = (x
201b0 31 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e  1node**)&(array.
201c0 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20  tbl[size]);.    
201d0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
201e0 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69   i++) array.ht[i
201f0 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  ] = 0;.    for(i
20200 3d 30 3b 20 69 3c 78 31 61 2d 3e 63 6f 75 6e 74  =0; i<x1a->count
20210 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 31  ; i++){.      x1
20220 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65  node *oldnp, *ne
20230 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70  wnp;.      oldnp
20240 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 69 5d   = &(x1a->tbl[i]
20250 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72  );.      h = str
20260 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61  hash(oldnp->data
20270 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20  ) & (size-1);.  
20280 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
20290 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
202a0 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
202b0 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
202c0 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
202d0 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
202e0 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
202f0 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
20300 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
20310 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
20320 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
20330 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
20340 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
20350 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
20360 20 20 20 20 66 72 65 65 28 78 31 61 2d 3e 74 62      free(x1a->tb
20370 6c 29 3b 0a 20 20 20 20 2a 78 31 61 20 3d 20 61  l);.    *x1a = a
20380 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
20390 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
203a0 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
203b0 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x1a->size-1);.
203c0 20 20 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62    np = &(x1a->tb
203d0 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x1a->count++])
203e0 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
203f0 61 74 61 3b 0a 20 20 69 66 28 20 78 31 61 2d 3e  ata;.  if( x1a->
20400 68 74 5b 68 5d 20 29 20 78 31 61 2d 3e 68 74 5b  ht[h] ) x1a->ht[
20410 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
20420 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
20430 78 74 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b  xt = x1a->ht[h];
20440 0a 20 20 78 31 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x1a->ht[h] = 
20450 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
20460 20 26 28 78 31 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x1a->ht[h]);.
20470 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
20480 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
20490 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
204a0 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
204b0 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
204c0 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
204d0 20 6b 65 79 2e 20 2a 2f 0a 63 6f 6e 73 74 20 63   key. */.const c
204e0 68 61 72 20 2a 53 74 72 73 61 66 65 5f 66 69 6e  har *Strsafe_fin
204f0 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65  d(const char *ke
20500 79 29 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  y).{.  int h;.  
20510 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69  x1node *np;..  i
20520 66 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75  f( x1a==0 ) retu
20530 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68  rn 0;.  h = strh
20540 61 73 68 28 6b 65 79 29 20 26 20 28 78 31 61 2d  ash(key) & (x1a-
20550 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
20560 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77   x1a->ht[h];.  w
20570 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20  hile( np ){.    
20580 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64  if( strcmp(np->d
20590 61 74 61 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72  ata,key)==0 ) br
205a0 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70  eak;.    np = np
205b0 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  ->next;.  }.  re
205c0 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61  turn np ? np->da
205d0 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  ta : 0;.}../* Re
205e0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
205f0 6f 20 74 68 65 20 28 74 65 72 6d 69 6e 61 6c 20  o the (terminal 
20600 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29 20  or nonterminal) 
20610 73 79 6d 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43  symbol "x"..** C
20620 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
20630 6f 6c 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ol if this is th
20640 65 20 66 69 72 73 74 20 74 69 6d 65 20 22 78 22  e first time "x"
20650 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 2e 0a   has been seen..
20660 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  */.struct symbol
20670 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 63 6f 6e   *Symbol_new(con
20680 73 74 20 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20  st char *x).{.  
20690 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
206a0 70 3b 0a 0a 20 20 73 70 20 3d 20 53 79 6d 62 6f  p;..  sp = Symbo
206b0 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20 69 66 28  l_find(x);.  if(
206c0 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 70   sp==0 ){.    sp
206d0 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f   = (struct symbo
206e0 6c 20 2a 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69  l *)calloc(1, si
206f0 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
20700 6f 6c 29 20 29 3b 0a 20 20 20 20 4d 65 6d 6f 72  ol) );.    Memor
20710 79 43 68 65 63 6b 28 73 70 29 3b 0a 20 20 20 20  yCheck(sp);.    
20720 73 70 2d 3e 6e 61 6d 65 20 3d 20 53 74 72 73 61  sp->name = Strsa
20730 66 65 28 78 29 3b 0a 20 20 20 20 73 70 2d 3e 74  fe(x);.    sp->t
20740 79 70 65 20 3d 20 69 73 75 70 70 65 72 28 2a 78  ype = isupper(*x
20750 29 20 3f 20 54 45 52 4d 49 4e 41 4c 20 3a 20 4e  ) ? TERMINAL : N
20760 4f 4e 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20  ONTERMINAL;.    
20770 73 70 2d 3e 72 75 6c 65 20 3d 20 30 3b 0a 20 20  sp->rule = 0;.  
20780 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d    sp->fallback =
20790 20 30 3b 0a 20 20 20 20 73 70 2d 3e 70 72 65 63   0;.    sp->prec
207a0 20 3d 20 2d 31 3b 0a 20 20 20 20 73 70 2d 3e 61   = -1;.    sp->a
207b0 73 73 6f 63 20 3d 20 55 4e 4b 3b 0a 20 20 20 20  ssoc = UNK;.    
207c0 73 70 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 30  sp->firstset = 0
207d0 3b 0a 20 20 20 20 73 70 2d 3e 6c 61 6d 62 64 61  ;.    sp->lambda
207e0 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a   = LEMON_FALSE;.
207f0 20 20 20 20 73 70 2d 3e 64 65 73 74 72 75 63 74      sp->destruct
20800 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  or = 0;.    sp->
20810 64 65 73 74 4c 69 6e 65 6e 6f 20 3d 20 30 3b 0a  destLineno = 0;.
20820 20 20 20 20 73 70 2d 3e 64 61 74 61 74 79 70 65      sp->datatype
20830 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 75 73   = 0;.    sp->us
20840 65 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 53 79  eCnt = 0;.    Sy
20850 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 70 2c 73  mbol_insert(sp,s
20860 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  p->name);.  }.  
20870 73 70 2d 3e 75 73 65 43 6e 74 2b 2b 3b 0a 20 20  sp->useCnt++;.  
20880 72 65 74 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a  return sp;.}../*
20890 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 79 6d   Compare two sym
208a0 62 6f 6c 73 20 66 6f 72 20 77 6f 72 6b 69 6e 67  bols for working
208b0 20 70 75 72 70 6f 73 65 73 0a 2a 2a 0a 2a 2a 20   purposes.**.** 
208c0 53 79 6d 62 6f 6c 73 20 74 68 61 74 20 62 65 67  Symbols that beg
208d0 69 6e 20 77 69 74 68 20 75 70 70 65 72 20 63 61  in with upper ca
208e0 73 65 20 6c 65 74 74 65 72 73 20 28 74 65 72 6d  se letters (term
208f0 69 6e 61 6c 73 20 6f 72 20 74 6f 6b 65 6e 73 29  inals or tokens)
20900 0a 2a 2a 20 6d 75 73 74 20 73 6f 72 74 20 62 65  .** must sort be
20910 66 6f 72 65 20 73 79 6d 62 6f 6c 73 20 74 68 61  fore symbols tha
20920 74 20 62 65 67 69 6e 20 77 69 74 68 20 6c 6f 77  t begin with low
20930 65 72 20 63 61 73 65 20 6c 65 74 74 65 72 73 0a  er case letters.
20940 2a 2a 20 28 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  ** (non-terminal
20950 73 29 2e 20 20 4f 74 68 65 72 20 74 68 61 6e 20  s).  Other than 
20960 74 68 61 74 2c 20 74 68 65 20 6f 72 64 65 72 20  that, the order 
20970 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e  does not matter.
20980 0a 2a 2a 0a 2a 2a 20 57 65 20 66 69 6e 64 20 65  .**.** We find e
20990 78 70 65 72 69 6d 65 6e 74 61 6c 6c 79 20 74 68  xperimentally th
209a0 61 74 20 6c 65 61 76 69 6e 67 20 74 68 65 20 73  at leaving the s
209b0 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 69 72 20  ymbols in their 
209c0 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 6f 72 64 65  original.** orde
209d0 72 20 28 74 68 65 20 6f 72 64 65 72 20 74 68 65  r (the order the
209e0 79 20 61 70 70 65 61 72 65 64 20 69 6e 20 74 68  y appeared in th
209f0 65 20 67 72 61 6d 6d 61 72 20 66 69 6c 65 29 20  e grammar file) 
20a00 67 69 76 65 73 20 74 68 65 0a 2a 2a 20 73 6d 61  gives the.** sma
20a10 6c 6c 65 73 74 20 70 61 72 73 65 72 20 74 61 62  llest parser tab
20a20 6c 65 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a  les in SQLite..*
20a30 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70  /.int Symbolcmpp
20a40 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 61 2c  (const void *_a,
20a50 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 62 29   const void *_b)
20a60 0a 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63  .{.  const struc
20a70 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 20 3d 20 28  t symbol **a = (
20a80 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d  const struct sym
20a90 62 6f 6c 20 2a 2a 29 20 5f 61 3b 0a 20 20 63 6f  bol **) _a;.  co
20aa0 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f  nst struct symbo
20ab0 6c 20 2a 2a 62 20 3d 20 28 63 6f 6e 73 74 20 73  l **b = (const s
20ac0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29  truct symbol **)
20ad0 20 5f 62 3b 0a 20 20 69 6e 74 20 69 31 20 3d 20   _b;.  int i1 = 
20ae0 28 2a 2a 61 29 2e 69 6e 64 65 78 20 2b 20 31 30  (**a).index + 10
20af0 30 30 30 30 30 30 2a 28 28 2a 2a 61 29 2e 6e 61  000000*((**a).na
20b00 6d 65 5b 30 5d 3e 27 5a 27 29 3b 0a 20 20 69 6e  me[0]>'Z');.  in
20b10 74 20 69 32 20 3d 20 28 2a 2a 62 29 2e 69 6e 64  t i2 = (**b).ind
20b20 65 78 20 2b 20 31 30 30 30 30 30 30 30 2a 28 28  ex + 10000000*((
20b30 2a 2a 62 29 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27  **b).name[0]>'Z'
20b40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 31 21  );.  assert( i1!
20b50 3d 69 32 20 7c 7c 20 73 74 72 63 6d 70 28 28 2a  =i2 || strcmp((*
20b60 2a 61 29 2e 6e 61 6d 65 2c 28 2a 2a 62 29 2e 6e  *a).name,(**b).n
20b70 61 6d 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  ame)==0 );.  ret
20b80 75 72 6e 20 69 31 2d 69 32 3b 0a 7d 0a 0a 2f 2a  urn i1-i2;.}../*
20b90 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
20ba0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
20bb0 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
20bc0 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73  e for each.** as
20bd0 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
20be0 6f 66 20 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f  of type "x2"..*/
20bf0 0a 73 74 72 75 63 74 20 73 5f 78 32 20 7b 0a 20  .struct s_x2 {. 
20c00 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
20c10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20c20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
20c30 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20  ble slots. */.  
20c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c50 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73          /*   Mus
20c60 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
20c70 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  2 greater than o
20c80 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  r */.           
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20ca0 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a  *   equal to 1 *
20cb0 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20  /.  int count;  
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20cd0 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74  umber of current
20ce0 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20  ly slots filled 
20cf0 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32  */.  struct s_x2
20d00 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54  node *tbl;  /* T
20d10 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68  he data stored h
20d20 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ere */.  struct 
20d30 73 5f 78 32 6e 6f 64 65 20 2a 2a 68 74 3b 20 20  s_x2node **ht;  
20d40 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f  /* Hash table fo
20d50 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a  r lookups */.};.
20d60 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  ./* There is one
20d70 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
20d80 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  s structure for 
20d90 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65  every data eleme
20da0 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f  nt.** in an asso
20db0 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
20dc0 20 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 74   type "x2"..*/.t
20dd0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f  ypedef struct s_
20de0 78 32 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63  x2node {.  struc
20df0 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 20  t symbol *data; 
20e00 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20      /* The data 
20e10 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
20e20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  *key;         /*
20e30 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74   The key */.  st
20e40 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 6e  ruct s_x2node *n
20e50 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65  ext;   /* Next e
20e60 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
20e70 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72  me hash */.  str
20e80 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 66  uct s_x2node **f
20e90 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75  rom;  /* Previou
20ea0 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 32 6e 6f  s link */.} x2no
20eb0 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  de;../* There is
20ec0 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e   only one instan
20ed0 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c  ce of the array,
20ee0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f   which is the fo
20ef0 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69  llowing */.stati
20f00 63 20 73 74 72 75 63 74 20 73 5f 78 32 20 2a 78  c struct s_x2 *x
20f10 32 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  2a;../* Allocate
20f20 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69   a new associati
20f30 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64  ve array */.void
20f40 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 7b 0a   Symbol_init(){.
20f50 20 20 69 66 28 20 78 32 61 20 29 20 72 65 74 75    if( x2a ) retu
20f60 72 6e 3b 0a 20 20 78 32 61 20 3d 20 28 73 74 72  rn;.  x2a = (str
20f70 75 63 74 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63  uct s_x2*)malloc
20f80 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
20f90 73 5f 78 32 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x2) );.  if( x
20fa0 32 61 20 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73  2a ){.    x2a->s
20fb0 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78  ize = 128;.    x
20fc0 32 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20  2a->count = 0;. 
20fd0 20 20 20 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78     x2a->tbl = (x
20fe0 32 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a  2node*)malloc( .
20ff0 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 32        (sizeof(x2
21000 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
21010 32 6e 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a  2node*))*128 );.
21020 20 20 20 20 69 66 28 20 78 32 61 2d 3e 74 62 6c      if( x2a->tbl
21030 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65  ==0 ){.      fre
21040 65 28 78 32 61 29 3b 0a 20 20 20 20 20 20 78 32  e(x2a);.      x2
21050 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
21060 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
21070 20 20 20 20 20 78 32 61 2d 3e 68 74 20 3d 20 28       x2a->ht = (
21080 78 32 6e 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e  x2node**)&(x2a->
21090 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20  tbl[128]);.     
210a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b   for(i=0; i<128;
210b0 20 69 2b 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d   i++) x2a->ht[i]
210c0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
210d0 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  }./* Insert a ne
210e0 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
210f0 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  e array.  Return
21100 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73   TRUE if success
21110 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61  ful..** Prior da
21120 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ta with the same
21130 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72   key is NOT over
21140 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53  written */.int S
21150 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 74 72  ymbol_insert(str
21160 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61  uct symbol *data
21170 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65  , const char *ke
21180 79 29 0a 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e  y).{.  x2node *n
21190 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e  p;.  int h;.  in
211a0 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 32 61  t ph;..  if( x2a
211b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
211c0 20 20 70 68 20 3d 20 73 74 72 68 61 73 68 28 6b    ph = strhash(k
211d0 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20  ey);.  h = ph & 
211e0 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x2a->size-1);. 
211f0 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d   np = x2a->ht[h]
21200 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
21210 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
21220 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20  np->key,key)==0 
21230 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  ){.      /* An e
21240 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69  xisting entry wi
21250 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
21260 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20  is found. */.   
21270 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75     /* Fail becau
21280 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20  se overwrite is 
21290 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20  not allows. */. 
212a0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
212b0 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70     }.    np = np
212c0 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  ->next;.  }.  if
212d0 28 20 78 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32  ( x2a->count>=x2
212e0 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f  a->size ){.    /
212f0 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74  * Need to make t
21300 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69  he hash table bi
21310 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  gger */.    int 
21320 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75  i,size;.    stru
21330 63 74 20 73 5f 78 32 20 61 72 72 61 79 3b 0a 20  ct s_x2 array;. 
21340 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20     array.size = 
21350 73 69 7a 65 20 3d 20 78 32 61 2d 3e 73 69 7a 65  size = x2a->size
21360 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f  *2;.    array.co
21370 75 6e 74 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74  unt = x2a->count
21380 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20  ;.    array.tbl 
21390 3d 20 28 78 32 6e 6f 64 65 2a 29 6d 61 6c 6c 6f  = (x2node*)mallo
213a0 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66  c(.      (sizeof
213b0 28 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x2node) + sizeo
213c0 66 28 78 32 6e 6f 64 65 2a 29 29 2a 73 69 7a 65  f(x2node*))*size
213d0 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61   );.    if( arra
213e0 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72  y.tbl==0 ) retur
213f0 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75  n 0;  /* Fail du
21400 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e to malloc fail
21410 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79  ure */.    array
21420 2e 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29  .ht = (x2node**)
21430 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65  &(array.tbl[size
21440 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
21450 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72   i<size; i++) ar
21460 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  ray.ht[i] = 0;. 
21470 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 32     for(i=0; i<x2
21480 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a  a->count; i++){.
21490 20 20 20 20 20 20 78 32 6e 6f 64 65 20 2a 6f 6c        x2node *ol
214a0 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20  dnp, *newnp;.   
214b0 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 32 61     oldnp = &(x2a
214c0 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  ->tbl[i]);.     
214d0 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64   h = strhash(old
214e0 6e 70 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a 65  np->key) & (size
214f0 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  -1);.      newnp
21500 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69   = &(array.tbl[i
21510 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72  ]);.      if( ar
21520 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61  ray.ht[h] ) arra
21530 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  y.ht[h]->from = 
21540 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a  &(newnp->next);.
21550 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78        newnp->nex
21560 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b  t = array.ht[h];
21570 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65  .      newnp->ke
21580 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a  y = oldnp->key;.
21590 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74        newnp->dat
215a0 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b  a = oldnp->data;
215b0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72  .      newnp->fr
215c0 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b  om = &(array.ht[
215d0 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79  h]);.      array
215e0 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a  .ht[h] = newnp;.
215f0 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78      }.    free(x
21600 32 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78  2a->tbl);.    *x
21610 32 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a  2a = array;.  }.
21620 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
21630 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20  new data */.  h 
21640 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a  = ph & (x2a->siz
21650 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78  e-1);.  np = &(x
21660 32 61 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f 75  2a->tbl[x2a->cou
21670 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65  nt++]);.  np->ke
21680 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64  y = key;.  np->d
21690 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66  ata = data;.  if
216a0 28 20 78 32 61 2d 3e 68 74 5b 68 5d 20 29 20 78  ( x2a->ht[h] ) x
216b0 32 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  2a->ht[h]->from 
216c0 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  = &(np->next);. 
216d0 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 32 61 2d   np->next = x2a-
216e0 3e 68 74 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e 68  >ht[h];.  x2a->h
216f0 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d  t[h] = np;.  np-
21700 3e 66 72 6f 6d 20 3d 20 26 28 78 32 61 2d 3e 68  >from = &(x2a->h
21710 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  t[h]);.  return 
21720 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  1;.}../* Return 
21730 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
21740 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  a assigned to th
21750 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65  e given key.  Re
21760 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  turn NULL.** if 
21770 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a  no such key. */.
21780 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
21790 79 6d 62 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73 74  ymbol_find(const
217a0 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20   char *key).{.  
217b0 69 6e 74 20 68 3b 0a 20 20 78 32 6e 6f 64 65 20  int h;.  x2node 
217c0 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d  *np;..  if( x2a=
217d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
217e0 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79   h = strhash(key
217f0 29 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31  ) & (x2a->size-1
21800 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68  );.  np = x2a->h
21810 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
21820 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  p ){.    if( str
21830 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29  cmp(np->key,key)
21840 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
21850 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
21860 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20    }.  return np 
21870 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a  ? np->data : 0;.
21880 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  }../* Return the
21890 20 6e 2d 74 68 20 64 61 74 61 2e 20 20 52 65 74   n-th data.  Ret
218a0 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 20 69 73  urn NULL if n is
218b0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 2a   out of range. *
218c0 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
218d0 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74 20  *Symbol_Nth(int 
218e0 6e 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79  n).{.  struct sy
218f0 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 20 20 69 66  mbol *data;.  if
21900 28 20 78 32 61 20 26 26 20 6e 3e 30 20 26 26 20  ( x2a && n>0 && 
21910 6e 3c 3d 78 32 61 2d 3e 63 6f 75 6e 74 20 29 7b  n<=x2a->count ){
21920 0a 20 20 20 20 64 61 74 61 20 3d 20 78 32 61 2d  .    data = x2a-
21930 3e 74 62 6c 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a  >tbl[n-1].data;.
21940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 61 74    }else{.    dat
21950 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  a = 0;.  }.  ret
21960 75 72 6e 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20  urn data;.}../* 
21970 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
21980 6f 66 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a  of the array */.
21990 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74  int Symbol_count
219a0 28 29 0a 7b 0a 20 20 72 65 74 75 72 6e 20 78 32  ().{.  return x2
219b0 61 20 3f 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3a  a ? x2a->count :
219c0 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   0;.}../* Return
219d0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
219e0 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74  nters to all dat
219f0 61 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  a in the table..
21a00 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69 73 20  ** The array is 
21a10 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
21a20 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55  lloc.  Return NU
21a30 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c  LL if memory all
21a40 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c  ocation.** probl
21a50 65 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61  ems, or if the a
21a60 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a  rray is empty. *
21a70 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
21a80 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66  **Symbol_arrayof
21a90 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79  ().{.  struct sy
21aa0 6d 62 6f 6c 20 2a 2a 61 72 72 61 79 3b 0a 20 20  mbol **array;.  
21ab0 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 69 66  int i,size;.  if
21ac0 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x2a==0 ) retur
21ad0 6e 20 30 3b 0a 20 20 73 69 7a 65 20 3d 20 78 32  n 0;.  size = x2
21ae0 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61  a->count;.  arra
21af0 79 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  y = (struct symb
21b00 6f 6c 20 2a 2a 29 63 61 6c 6c 6f 63 28 73 69 7a  ol **)calloc(siz
21b10 65 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  e, sizeof(struct
21b20 20 73 79 6d 62 6f 6c 20 2a 29 29 3b 0a 20 20 69   symbol *));.  i
21b30 66 28 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20  f( array ){.    
21b40 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
21b50 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d   i++) array[i] =
21b60 20 78 32 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74   x2a->tbl[i].dat
21b70 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  a;.  }.  return 
21b80 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  array;.}../* Com
21b90 70 61 72 65 20 74 77 6f 20 63 6f 6e 66 69 67 75  pare two configu
21ba0 72 61 74 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43  rations */.int C
21bb0 6f 6e 66 69 67 63 6d 70 28 63 6f 6e 73 74 20 63  onfigcmp(const c
21bc0 68 61 72 20 2a 5f 61 2c 63 6f 6e 73 74 20 63 68  har *_a,const ch
21bd0 61 72 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f 6e 73  ar *_b).{.  cons
21be0 74 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  t struct config 
21bf0 2a 61 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e  *a = (struct con
21c00 66 69 67 20 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e  fig *) _a;.  con
21c10 73 74 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  st struct config
21c20 20 2a 62 20 3d 20 28 73 74 72 75 63 74 20 63 6f   *b = (struct co
21c30 6e 66 69 67 20 2a 29 20 5f 62 3b 0a 20 20 69 6e  nfig *) _b;.  in
21c40 74 20 78 3b 0a 20 20 78 20 3d 20 61 2d 3e 72 70  t x;.  x = a->rp
21c50 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d  ->index - b->rp-
21c60 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 78 3d  >index;.  if( x=
21c70 3d 30 20 29 20 78 20 3d 20 61 2d 3e 64 6f 74 20  =0 ) x = a->dot 
21c80 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75  - b->dot;.  retu
21c90 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70  rn x;.}../* Comp
21ca0 61 72 65 20 74 77 6f 20 73 74 61 74 65 73 20 2a  are two states *
21cb0 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73 74  /.PRIVATE int st
21cc0 61 74 65 63 6d 70 28 73 74 72 75 63 74 20 63 6f  atecmp(struct co
21cd0 6e 66 69 67 20 2a 61 2c 20 73 74 72 75 63 74 20  nfig *a, struct 
21ce0 63 6f 6e 66 69 67 20 2a 62 29 0a 7b 0a 20 20 69  config *b).{.  i
21cf0 6e 74 20 72 63 3b 0a 20 20 66 6f 72 28 72 63 3d  nt rc;.  for(rc=
21d00 30 3b 20 72 63 3d 3d 30 20 26 26 20 61 20 26 26  0; rc==0 && a &&
21d10 20 62 3b 20 20 61 3d 61 2d 3e 62 70 2c 20 62 3d   b;  a=a->bp, b=
21d20 62 2d 3e 62 70 29 7b 0a 20 20 20 20 72 63 20 3d  b->bp){.    rc =
21d30 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20   a->rp->index - 
21d40 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20  b->rp->index;.  
21d50 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
21d60 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64   = a->dot - b->d
21d70 6f 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ot;.  }.  if( rc
21d80 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 61  ==0 ){.    if( a
21d90 20 29 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 69   ) rc = 1;.    i
21da0 66 28 20 62 20 29 20 72 63 20 3d 20 2d 31 3b 0a  f( b ) rc = -1;.
21db0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21dc0 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 73 74  .}../* Hash a st
21dd0 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 69  ate */.PRIVATE i
21de0 6e 74 20 73 74 61 74 65 68 61 73 68 28 73 74 72  nt statehash(str
21df0 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 29 0a 7b  uct config *a).{
21e00 0a 20 20 69 6e 74 20 68 3d 30 3b 0a 20 20 77 68  .  int h=0;.  wh
21e10 69 6c 65 28 20 61 20 29 7b 0a 20 20 20 20 68 20  ile( a ){.    h 
21e20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d  = h*571 + a->rp-
21e30 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64  >index*37 + a->d
21e40 6f 74 3b 0a 20 20 20 20 61 20 3d 20 61 2d 3e 62  ot;.    a = a->b
21e50 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
21e60 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  h;.}../* Allocat
21e70 65 20 61 20 6e 65 77 20 73 74 61 74 65 20 73 74  e a new state st
21e80 72 75 63 74 75 72 65 20 2a 2f 0a 73 74 72 75 63  ructure */.struc
21e90 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e  t state *State_n
21ea0 65 77 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  ew().{.  struct 
21eb0 73 74 61 74 65 20 2a 6e 65 77 73 74 61 74 65 3b  state *newstate;
21ec0 0a 20 20 6e 65 77 73 74 61 74 65 20 3d 20 28 73  .  newstate = (s
21ed0 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 63 61  truct state *)ca
21ee0 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28 73  lloc(1, sizeof(s
21ef0 74 72 75 63 74 20 73 74 61 74 65 29 20 29 3b 0a  truct state) );.
21f00 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 6e 65    MemoryCheck(ne
21f10 77 73 74 61 74 65 29 3b 0a 20 20 72 65 74 75 72  wstate);.  retur
21f20 6e 20 6e 65 77 73 74 61 74 65 3b 0a 7d 0a 0a 2f  n newstate;.}../
21f30 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
21f40 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
21f50 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
21f60 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61  re for each.** a
21f70 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
21f80 20 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a   of type "x3"..*
21f90 2f 0a 73 74 72 75 63 74 20 73 5f 78 33 20 7b 0a  /.struct s_x3 {.
21fa0 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
21fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21fc0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
21fd0 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20  able slots. */. 
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75           /*   Mu
22000 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
22010 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
22020 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
22030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22040 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20  /*   equal to 1 
22050 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20  */.  int count; 
22060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22070 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  Number of curren
22080 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64  tly slots filled
22090 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
220a0 33 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20  3node *tbl;  /* 
220b0 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  The data stored 
220c0 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  here */.  struct
220d0 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 68 74 3b 20   s_x3node **ht; 
220e0 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66   /* Hash table f
220f0 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b  or lookups */.};
22100 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
22110 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
22120 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
22130 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d   every data elem
22140 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73  ent.** in an ass
22150 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
22160 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a  f type "x3"..*/.
22170 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
22180 5f 78 33 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75  _x3node {.  stru
22190 63 74 20 73 74 61 74 65 20 2a 64 61 74 61 3b 20  ct state *data; 
221a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221b0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
221c0 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
221d0 2a 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  *key;           
221e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b          /* The k
221f0 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ey */.  struct s
22200 5f 78 33 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20  _x3node *next;  
22210 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77   /* Next entry w
22220 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73  ith the same has
22230 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  h */.  struct s_
22240 78 33 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20  x3node **from;  
22250 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b  /* Previous link
22260 20 2a 2f 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f   */.} x3node;../
22270 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  * There is only 
22280 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
22290 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68  the array, which
222a0 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   is the followin
222b0 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  g */.static stru
222c0 63 74 20 73 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f  ct s_x3 *x3a;../
222d0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
222e0 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
222f0 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74 61 74 65  ay */.void State
22300 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78  _init(){.  if( x
22310 33 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  3a ) return;.  x
22320 33 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78  3a = (struct s_x
22330 33 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  3*)malloc( sizeo
22340 66 28 73 74 72 75 63 74 20 73 5f 78 33 29 20 29  f(struct s_x3) )
22350 3b 0a 20 20 69 66 28 20 78 33 61 20 29 7b 0a 20  ;.  if( x3a ){. 
22360 20 20 20 78 33 61 2d 3e 73 69 7a 65 20 3d 20 31     x3a->size = 1
22370 32 38 3b 0a 20 20 20 20 78 33 61 2d 3e 63 6f 75  28;.    x3a->cou
22380 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 33 61 2d  nt = 0;.    x3a-
22390 3e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29  >tbl = (x3node*)
223a0 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28  malloc( .      (
223b0 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b  sizeof(x3node) +
223c0 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29   sizeof(x3node*)
223d0 29 2a 31 32 38 20 29 3b 0a 20 20 20 20 69 66 28  )*128 );.    if(
223e0 20 78 33 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a   x3a->tbl==0 ){.
223f0 20 20 20 20 20 20 66 72 65 65 28 78 33 61 29 3b        free(x3a);
22400 0a 20 20 20 20 20 20 78 33 61 20 3d 20 30 3b 0a  .      x3a = 0;.
22410 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22420 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 33   int i;.      x3
22430 61 2d 3e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a  a->ht = (x3node*
22440 2a 29 26 28 78 33 61 2d 3e 74 62 6c 5b 31 32 38  *)&(x3a->tbl[128
22450 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ]);.      for(i=
22460 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78  0; i<128; i++) x
22470 33 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  3a->ht[i] = 0;. 
22480 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e     }.  }.}./* In
22490 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
224a0 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79  d into the array
224b0 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
224c0 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a  f successful..**
224d0 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68   Prior data with
224e0 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
224f0 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e   NOT overwritten
22500 20 2a 2f 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e   */.int State_in
22510 73 65 72 74 28 73 74 72 75 63 74 20 73 74 61 74  sert(struct stat
22520 65 20 2a 64 61 74 61 2c 20 73 74 72 75 63 74 20  e *data, struct 
22530 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20  config *key).{. 
22540 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69   x3node *np;.  i
22550 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a  nt h;.  int ph;.
22560 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20  .  if( x3a==0 ) 
22570 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
22580 20 73 74 61 74 65 68 61 73 68 28 6b 65 79 29 3b   statehash(key);
22590 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 33 61  .  h = ph & (x3a
225a0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
225b0 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x3a->ht[h];.  
225c0 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
225d0 20 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e 70   if( statecmp(np
225e0 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b  ->key,key)==0 ){
225f0 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69  .      /* An exi
22600 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68  sting entry with
22610 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
22620 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20   found. */.     
22630 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65   /* Fail because
22640 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f   overwrite is no
22650 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20  t allows. */.   
22660 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
22670 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e   }.    np = np->
22680 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  next;.  }.  if( 
22690 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61 2d  x3a->count>=x3a-
226a0 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  >size ){.    /* 
226b0 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  Need to make the
226c0 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67   hash table bigg
226d0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  er */.    int i,
226e0 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74  size;.    struct
226f0 20 73 5f 78 33 20 61 72 72 61 79 3b 0a 20 20 20   s_x3 array;.   
22700 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69   array.size = si
22710 7a 65 20 3d 20 78 33 61 2d 3e 73 69 7a 65 2a 32  ze = x3a->size*2
22720 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e  ;.    array.coun
22730 74 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a  t = x3a->count;.
22740 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20      array.tbl = 
22750 28 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x3node*)malloc(
22760 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
22770 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  3node) + sizeof(
22780 78 33 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29  x3node*))*size )
22790 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e  ;.    if( array.
227a0 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tbl==0 ) return 
227b0 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20  0;  /* Fail due 
227c0 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  to malloc failur
227d0 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68  e */.    array.h
227e0 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28  t = (x3node**)&(
227f0 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29  array.tbl[size])
22800 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
22810 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
22820 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  y.ht[i] = 0;.   
22830 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 33 61 2d   for(i=0; i<x3a-
22840 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  >count; i++){.  
22850 20 20 20 20 78 33 6e 6f 64 65 20 2a 6f 6c 64 6e      x3node *oldn
22860 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20  p, *newnp;.     
22870 20 6f 6c 64 6e 70 20 3d 20 26 28 78 33 61 2d 3e   oldnp = &(x3a->
22880 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68  tbl[i]);.      h
22890 20 3d 20 73 74 61 74 65 68 61 73 68 28 6f 6c 64   = statehash(old
228a0 6e 70 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a 65  np->key) & (size
228b0 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  -1);.      newnp
228c0 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69   = &(array.tbl[i
228d0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72  ]);.      if( ar
228e0 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61  ray.ht[h] ) arra
228f0 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  y.ht[h]->from = 
22900 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a  &(newnp->next);.
22910 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78        newnp->nex
22920 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b  t = array.ht[h];
22930 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65  .      newnp->ke
22940 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a  y = oldnp->key;.
22950 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74        newnp->dat
22960 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b  a = oldnp->data;
22970 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72  .      newnp->fr
22980 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b  om = &(array.ht[
22990 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79  h]);.      array
229a0 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a  .ht[h] = newnp;.
229b0 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78      }.    free(x
229c0 33 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78  3a->tbl);.    *x
229d0 33 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a  3a = array;.  }.
229e0 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
229f0 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20  new data */.  h 
22a00 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73 69 7a  = ph & (x3a->siz
22a10 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78  e-1);.  np = &(x
22a20 33 61 2d 3e 74 62 6c 5b 78 33 61 2d 3e 63 6f 75  3a->tbl[x3a->cou
22a30 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65  nt++]);.  np->ke
22a40 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64  y = key;.  np->d
22a50 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66  ata = data;.  if
22a60 28 20 78 33 61 2d 3e 68 74 5b 68 5d 20 29 20 78  ( x3a->ht[h] ) x
22a70 33 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  3a->ht[h]->from 
22a80 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  = &(np->next);. 
22a90 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 33 61 2d   np->next = x3a-
22aa0 3e 68 74 5b 68 5d 3b 0a 20 20 78 33 61 2d 3e 68  >ht[h];.  x3a->h
22ab0 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d  t[h] = np;.  np-
22ac0 3e 66 72 6f 6d 20 3d 20 26 28 78 33 61 2d 3e 68  >from = &(x3a->h
22ad0 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  t[h]);.  return 
22ae0 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  1;.}../* Return 
22af0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
22b00 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  a assigned to th
22b10 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65  e given key.  Re
22b20 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  turn NULL.** if 
22b30 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a  no such key. */.
22b40 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53 74  struct state *St
22b50 61 74 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20  ate_find(struct 
22b60 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20  config *key).{. 
22b70 20 69 6e 74 20 68 3b 0a 20 20 78 33 6e 6f 64 65   int h;.  x3node
22b80 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 33 61   *np;..  if( x3a
22b90 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
22ba0 20 20 68 20 3d 20 73 74 61 74 65 68 61 73 68 28    h = statehash(
22bb0 6b 65 79 29 20 26 20 28 78 33 61 2d 3e 73 69 7a  key) & (x3a->siz
22bc0 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61  e-1);.  np = x3a
22bd0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
22be0 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
22bf0 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79  statecmp(np->key
22c00 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,key)==0 ) break
22c10 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  ;.    np = np->n
22c20 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
22c30 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20  n np ? np->data 
22c40 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  : 0;.}../* Retur
22c50 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f  n an array of po
22c60 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61  inters to all da
22c70 74 61 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ta in the table.
22c80 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69 73  .** The array is
22c90 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
22ca0 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e  alloc.  Return N
22cb0 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c  ULL if memory al
22cc0 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62  location.** prob
22cd0 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20  lems, or if the 
22ce0 61 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20  array is empty. 
22cf0 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  */.struct state 
22d00 2a 2a 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28  **State_arrayof(
22d10 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  ).{.  struct sta
22d20 74 65 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e  te **array;.  in
22d30 74 20 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20  t i,size;.  if( 
22d40 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x3a==0 ) return 
22d50 30 3b 0a 20 20 73 69 7a 65 20 3d 20 78 33 61 2d  0;.  size = x3a-
22d60 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20  >count;.  array 
22d70 3d 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20  = (struct state 
22d80 2a 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  **)malloc( sizeo
22d90 66 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  f(struct state *
22da0 29 2a 73 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  )*size );.  if( 
22db0 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72  array ){.    for
22dc0 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
22dd0 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78 33  +) array[i] = x3
22de0 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a  a->tbl[i].data;.
22df0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 72    }.  return arr
22e00 61 79 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61  ay;.}../* Hash a
22e10 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a   configuration *
22e20 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 63 6f  /.PRIVATE int co
22e30 6e 66 69 67 68 61 73 68 28 73 74 72 75 63 74 20  nfighash(struct 
22e40 63 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20 20 69  config *a).{.  i
22e50 6e 74 20 68 3d 30 3b 0a 20 20 68 20 3d 20 68 2a  nt h=0;.  h = h*
22e60 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64  571 + a->rp->ind
22e70 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a  ex*37 + a->dot;.
22e80 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f    return h;.}../
22e90 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
22ea0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
22eb0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
22ec0 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61  re for each.** a
22ed0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
22ee0 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a   of type "x4"..*
22ef0 2f 0a 73 74 72 75 63 74 20 73 5f 78 34 20 7b 0a  /.struct s_x4 {.
22f00 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
22f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22f20 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
22f30 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20  able slots. */. 
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f50 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75           /*   Mu
22f60 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
22f70 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
22f80 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fa0 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20  /*   equal to 1 
22fb0 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20  */.  int count; 
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22fd0 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  Number of curren
22fe0 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64  tly slots filled
22ff0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
23000 34 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20  4node *tbl;  /* 
23010 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  The data stored 
23020 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  here */.  struct
23030 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 68 74 3b 20   s_x4node **ht; 
23040 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66   /* Hash table f
23050 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b  or lookups */.};
23060 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
23070 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
23080 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
23090 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d   every data elem
230a0 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73  ent.** in an ass
230b0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
230c0 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a  f type "x4"..*/.
230d0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
230e0 5f 78 34 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75  _x4node {.  stru
230f0 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b  ct config *data;
23100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23110 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
23120 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f  .  struct s_x4no
23130 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e  de *next;   /* N
23140 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74  ext entry with t
23150 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a  he same hash */.
23160 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64    struct s_x4nod
23170 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72  e **from;  /* Pr
23180 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d  evious link */.}
23190 20 78 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65   x4node;../* The
231a0 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69  re is only one i
231b0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61  nstance of the a
231c0 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74  rray, which is t
231d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
231e0 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f  static struct s_
231f0 78 34 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c  x4 *x4a;../* All
23200 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f  ocate a new asso
23210 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f  ciative array */
23220 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c  .void Configtabl
23230 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20  e_init(){.  if( 
23240 78 34 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  x4a ) return;.  
23250 78 34 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f  x4a = (struct s_
23260 78 34 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  x4*)malloc( size
23270 6f 66 28 73 74 72 75 63 74 20 73 5f 78 34 29 20  of(struct s_x4) 
23280 29 3b 0a 20 20 69 66 28 20 78 34 61 20 29 7b 0a  );.  if( x4a ){.
23290 20 20 20 20 78 34 61 2d 3e 73 69 7a 65 20 3d 20      x4a->size = 
232a0 36 34 3b 0a 20 20 20 20 78 34 61 2d 3e 63 6f 75  64;.    x4a->cou
232b0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 34 61 2d  nt = 0;.    x4a-
232c0 3e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29  >tbl = (x4node*)
232d0 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28  malloc( .      (
232e0 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b  sizeof(x4node) +
232f0 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29   sizeof(x4node*)
23300 29 2a 36 34 20 29 3b 0a 20 20 20 20 69 66 28 20  )*64 );.    if( 
23310 78 34 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20  x4a->tbl==0 ){. 
23320 20 20 20 20 20 66 72 65 65 28 78 34 61 29 3b 0a       free(x4a);.
23330 20 20 20 20 20 20 78 34 61 20 3d 20 30 3b 0a 20        x4a = 0;. 
23340 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23350 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 34 61  int i;.      x4a
23360 2d 3e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a  ->ht = (x4node**
23370 29 26 28 78 34 61 2d 3e 74 62 6c 5b 36 34 5d 29  )&(x4a->tbl[64])
23380 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
23390 20 69 3c 36 34 3b 20 69 2b 2b 29 20 78 34 61 2d   i<64; i++) x4a-
233a0 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  >ht[i] = 0;.    
233b0 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72  }.  }.}./* Inser
233c0 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
233d0 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20  nto the array.  
233e0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
233f0 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72  uccessful..** Pr
23400 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68  ior data with th
23410 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f  e same key is NO
23420 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f  T overwritten */
23430 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c 65  .int Configtable
23440 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 63  _insert(struct c
23450 6f 6e 66 69 67 20 2a 64 61 74 61 29 0a 7b 0a 20  onfig *data).{. 
23460 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69   x4node *np;.  i
23470 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a  nt h;.  int ph;.
23480 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20  .  if( x4a==0 ) 
23490 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
234a0 20 63 6f 6e 66 69 67 68 61 73 68 28 64 61 74 61   confighash(data
234b0 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
234c0 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  4a->size-1);.  n
234d0 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x4a->ht[h];.
234e0 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
234f0 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70     if( Configcmp
23500 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20  ((const char *) 
23510 6e 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73 74 20  np->data,(const 
23520 63 68 61 72 20 2a 29 20 64 61 74 61 29 3d 3d 30  char *) data)==0
23530 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
23540 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77  existing entry w
23550 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
23560 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20   is found. */.  
23570 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61      /* Fail beca
23580 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73  use overwrite is
23590 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a   not allows. */.
235a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
235b0 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e      }.    np = n
235c0 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  p->next;.  }.  i
235d0 66 28 20 78 34 61 2d 3e 63 6f 75 6e 74 3e 3d 78  f( x4a->count>=x
235e0 34 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20  4a->size ){.    
235f0 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
23600 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62  the hash table b
23610 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  igger */.    int
23620 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72   i,size;.    str
23630 75 63 74 20 73 5f 78 34 20 61 72 72 61 79 3b 0a  uct s_x4 array;.
23640 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d      array.size =
23650 20 73 69 7a 65 20 3d 20 78 34 61 2d 3e 73 69 7a   size = x4a->siz
23660 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63  e*2;.    array.c
23670 6f 75 6e 74 20 3d 20 78 34 61 2d 3e 63 6f 75 6e  ount = x4a->coun
23680 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c  t;.    array.tbl
23690 20 3d 20 28 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x4node*)mall
236a0 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f  oc(.      (sizeo
236b0 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x4node) + size
236c0 6f 66 28 78 34 6e 6f 64 65 2a 29 29 2a 73 69 7a  of(x4node*))*siz
236d0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72  e );.    if( arr
236e0 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75  ay.tbl==0 ) retu
236f0 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64  rn 0;  /* Fail d
23700 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69  ue to malloc fai
23710 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61  lure */.    arra
23720 79 2e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a  y.ht = (x4node**
23730 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a  )&(array.tbl[siz
23740 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e]);.    for(i=0
23750 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61  ; i<size; i++) a
23760 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a  rray.ht[i] = 0;.
23770 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78      for(i=0; i<x
23780 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b  4a->count; i++){
23790 0a 20 20 20 20 20 20 78 34 6e 6f 64 65 20 2a 6f  .      x4node *o
237a0 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20  ldnp, *newnp;.  
237b0 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 34      oldnp = &(x4
237c0 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  a->tbl[i]);.    
237d0 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68    h = confighash
237e0 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26 20  (oldnp->data) & 
237f0 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  (size-1);.      
23800 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e  newnp = &(array.
23810 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  tbl[i]);.      i
23820 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29  f( array.ht[h] )
23830 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72   array.ht[h]->fr
23840 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65  om = &(newnp->ne
23850 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  xt);.      newnp
23860 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68  ->next = array.h
23870 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e  t[h];.      newn
23880 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
23890 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
238a0 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
238b0 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
238c0 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
238d0 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
238e0 66 72 65 65 28 78 34 61 2d 3e 74 62 6c 29 3b 0a  free(x4a->tbl);.
238f0 20 20 20 20 2a 78 34 61 20 3d 20 61 72 72 61 79      *x4a = array
23900 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
23910 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
23920 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 34  /.  h = ph & (x4
23930 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
23940 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 78 34   = &(x4a->tbl[x4
23950 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
23960 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b  np->data = data;
23970 0a 20 20 69 66 28 20 78 34 61 2d 3e 68 74 5b 68  .  if( x4a->ht[h
23980 5d 20 29 20 78 34 61 2d 3e 68 74 5b 68 5d 2d 3e  ] ) x4a->ht[h]->
23990 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78  from = &(np->nex
239a0 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d  t);.  np->next =
239b0 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78   x4a->ht[h];.  x
239c0 34 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a  4a->ht[h] = np;.
239d0 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78    np->from = &(x
239e0 34 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65  4a->ht[h]);.  re
239f0 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65  turn 1;.}../* Re
23a00 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
23a10 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20  o data assigned 
23a20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79  to the given key
23a30 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a  .  Return NULL.*
23a40 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79  * if no such key
23a50 2e 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  . */.struct conf
23a60 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f  ig *Configtable_
23a70 66 69 6e 64 28 73 74 72 75 63 74 20 63 6f 6e 66  find(struct conf
23a80 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 69 6e 74  ig *key).{.  int
23a90 20 68 3b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70   h;.  x4node *np
23aa0 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20  ;..  if( x4a==0 
23ab0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20  ) return 0;.  h 
23ac0 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 6b 65 79  = confighash(key
23ad0 29 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31  ) & (x4a->size-1
23ae0 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68  );.  np = x4a->h
23af0 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
23b00 70 20 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e  p ){.    if( Con
23b10 66 69 67 63 6d 70 28 28 63 6f 6e 73 74 20 63 68  figcmp((const ch
23b20 61 72 20 2a 29 20 6e 70 2d 3e 64 61 74 61 2c 28  ar *) np->data,(
23b30 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6b 65  const char *) ke
23b40 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  y)==0 ) break;. 
23b50 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
23b60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
23b70 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30  p ? np->data : 0
23b80 3b 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20 61  ;.}../* Remove a
23b90 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ll data from the
23ba0 20 74 61 62 6c 65 2e 20 20 50 61 73 73 20 65 61   table.  Pass ea
23bb0 63 68 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  ch data to the f
23bc0 75 6e 63 74 69 6f 6e 20 22 66 22 0a 2a 2a 20 61  unction "f".** a
23bd0 73 20 69 74 20 69 73 20 72 65 6d 6f 76 65 64 2e  s it is removed.
23be0 20 20 28 22 66 22 20 6d 61 79 20 62 65 20 6e 75    ("f" may be nu
23bf0 6c 6c 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73  ll to avoid this
23c00 20 73 74 65 70 2e 29 20 2a 2f 0a 76 6f 69 64 20   step.) */.void 
23c10 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61  Configtable_clea
23c20 72 28 69 6e 74 28 2a 66 29 28 73 74 72 75 63 74  r(int(*f)(struct
23c30 20 63 6f 6e 66 69 67 20 2a 29 29 0a 7b 0a 20 20   config *)).{.  
23c40 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 78 34 61  int i;.  if( x4a
23c50 3d 3d 30 20 7c 7c 20 78 34 61 2d 3e 63 6f 75 6e  ==0 || x4a->coun
23c60 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
23c70 20 69 66 28 20 66 20 29 20 66 6f 72 28 69 3d 30   if( f ) for(i=0
23c80 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20  ; i<x4a->count; 
23c90 69 2b 2b 29 20 28 2a 66 29 28 78 34 61 2d 3e 74  i++) (*f)(x4a->t
23ca0 62 6c 5b 69 5d 2e 64 61 74 61 29 3b 0a 20 20 66  bl[i].data);.  f
23cb0 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 73  or(i=0; i<x4a->s
23cc0 69 7a 65 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68  ize; i++) x4a->h
23cd0 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 78 34 61 2d  t[i] = 0;.  x4a-
23ce0 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 72 65  >count = 0;.  re
23cf0 74 75 72 6e 3b 0a 7d 0a                          turn;.}.