/ Hex Artifact Content
Login

Artifact 8b7afc12a6671e3a932a5209a9e64abbfbd0f025:


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 63 68 61 72 2a 29 41 29 2b 6f 66 66  )(((char*)A)+off
c6a0: 73 65 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70  set))../*.** Inp
c6b0: 75 74 73 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20  uts:.**   a:    
c6c0: 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c     A sorted, nul
c6d0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e  l-terminated lin
c6e0: 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20  ked list.  (May 
c6f0: 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62  be null)..**   b
c700: 3a 20 20 20 20 20 20 20 41 20 73 6f 72 74 65 64  :       A sorted
c710: 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65  , null-terminate
c720: 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20  d linked list.  
c730: 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a  (May be null)..*
c740: 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 41 20 70  *   cmp:     A p
c750: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f  ointer to the co
c760: 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
c770: 6e 2e 0a 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20  n..**   offset: 
c780: 20 4f 66 66 73 65 74 20 69 6e 20 74 68 65 20 73   Offset in the s
c790: 74 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20  tructure to the 
c7a0: 22 6e 65 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a  "next" field..**
c7b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65  .** Return Value
c7c0: 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72  :.**   A pointer
c7d0: 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
c7e0: 61 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f  a sorted list co
c7f0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65  ntaining the ele
c800: 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f  ments.**   of bo
c810: 74 68 20 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a  th a and b..**.*
c820: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
c830: 2a 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22 20  **   The "next" 
c840: 70 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65  pointers for ele
c850: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73  ments in the lis
c860: 74 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a 2a  ts a and b are.*
c870: 2a 20 20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  *   changed..*/.
c880: 73 74 61 74 69 63 20 63 68 61 72 20 2a 6d 65 72  static char *mer
c890: 67 65 28 0a 20 20 63 68 61 72 20 2a 61 2c 0a 20  ge(.  char *a,. 
c8a0: 20 63 68 61 72 20 2a 62 2c 0a 20 20 69 6e 74 20   char *b,.  int 
c8b0: 28 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61  (*cmp)(const cha
c8c0: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c  r*,const char*),
c8d0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 0a 29 7b  .  int offset.){
c8e0: 0a 20 20 63 68 61 72 20 2a 70 74 72 2c 20 2a 68  .  char *ptr, *h
c8f0: 65 61 64 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30  ead;..  if( a==0
c900: 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 62   ){.    head = b
c910: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 3d  ;.  }else if( b=
c920: 3d 30 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d  =0 ){.    head =
c930: 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   a;.  }else{.   
c940: 20 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29   if( (*cmp)(a,b)
c950: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72  <=0 ){.      ptr
c960: 20 3d 20 61 3b 0a 20 20 20 20 20 20 61 20 3d 20   = a;.      a = 
c970: 4e 45 58 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c  NEXT(a);.    }el
c980: 73 65 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20  se{.      ptr = 
c990: 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 4e 45 58  b;.      b = NEX
c9a0: 54 28 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  T(b);.    }.    
c9b0: 68 65 61 64 20 3d 20 70 74 72 3b 0a 20 20 20 20  head = ptr;.    
c9c0: 77 68 69 6c 65 28 20 61 20 26 26 20 62 20 29 7b  while( a && b ){
c9d0: 0a 20 20 20 20 20 20 69 66 28 20 28 2a 63 6d 70  .      if( (*cmp
c9e0: 29 28 61 2c 62 29 3c 3d 30 20 29 7b 0a 20 20 20  )(a,b)<=0 ){.   
c9f0: 20 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d       NEXT(ptr) =
ca00: 20 61 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20   a;.        ptr 
ca10: 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d  = a;.        a =
ca20: 20 4e 45 58 54 28 61 29 3b 0a 20 20 20 20 20 20   NEXT(a);.      
ca30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e  }else{.        N
ca40: 45 58 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20  EXT(ptr) = b;.  
ca50: 20 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20        ptr = b;. 
ca60: 20 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28         b = NEXT(
ca70: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
ca80: 7d 0a 20 20 20 20 69 66 28 20 61 20 29 20 4e 45  }.    if( a ) NE
ca90: 58 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20  XT(ptr) = a;.   
caa0: 20 65 6c 73 65 20 20 20 20 4e 45 58 54 28 70 74   else    NEXT(pt
cab0: 72 29 20 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65  r) = b;.  }.  re
cac0: 74 75 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a  turn head;.}../*
cad0: 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20  .** Inputs:.**  
cae0: 20 6c 69 73 74 3a 20 20 20 20 20 20 50 6f 69 6e   list:      Poin
caf0: 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d  ter to a singly-
cb00: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73  linked list of s
cb10: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20  tructures..**   
cb20: 6e 65 78 74 3a 20 20 20 20 20 20 50 6f 69 6e 74  next:      Point
cb30: 65 72 20 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f  er to pointer to
cb40: 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d   the second elem
cb50: 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 2e  ent of the list.
cb60: 0a 2a 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 20  .**   cmp:      
cb70: 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75   A comparison fu
cb80: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65  nction..**.** Re
cb90: 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20  turn Value:.**  
cba0: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
cbb0: 65 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74  e head of a sort
cbc0: 65 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  ed list containi
cbd0: 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a  ng the elements.
cbe0: 2a 2a 20 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69  **   orginally i
cbf0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69  n list..**.** Si
cc00: 64 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20  de effects:.**  
cc10: 20 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e   The "next" poin
cc20: 74 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74  ters for element
cc30: 73 20 69 6e 20 6c 69 73 74 20 61 72 65 20 63 68  s in list are ch
cc40: 61 6e 67 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e  anged..*/.#defin
cc50: 65 20 4c 49 53 54 53 49 5a 45 20 33 30 0a 73 74  e LISTSIZE 30.st
cc60: 61 74 69 63 20 63 68 61 72 20 2a 6d 73 6f 72 74  atic char *msort
cc70: 28 0a 20 20 63 68 61 72 20 2a 6c 69 73 74 2c 0a  (.  char *list,.
cc80: 20 20 63 68 61 72 20 2a 2a 6e 65 78 74 2c 0a 20    char **next,. 
cc90: 20 69 6e 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73   int (*cmp)(cons
cca0: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
ccb0: 61 72 2a 29 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  ar*).){.  unsign
ccc0: 65 64 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a  ed long offset;.
ccd0: 20 20 63 68 61 72 20 2a 65 70 3b 0a 20 20 63 68    char *ep;.  ch
cce0: 61 72 20 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45  ar *set[LISTSIZE
ccf0: 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66  ];.  int i;.  of
cd00: 66 73 65 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  fset = (unsigned
cd10: 20 6c 6f 6e 67 29 6e 65 78 74 20 2d 20 28 75 6e   long)next - (un
cd20: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 6c 69 73 74  signed long)list
cd30: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c  ;.  for(i=0; i<L
cd40: 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65  ISTSIZE; i++) se
cd50: 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c  t[i] = 0;.  whil
cd60: 65 28 20 6c 69 73 74 20 29 7b 0a 20 20 20 20 65  e( list ){.    e
cd70: 70 20 3d 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69  p = list;.    li
cd80: 73 74 20 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b  st = NEXT(list);
cd90: 0a 20 20 20 20 4e 45 58 54 28 65 70 29 20 3d 20  .    NEXT(ep) = 
cda0: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
cdb0: 69 3c 4c 49 53 54 53 49 5a 45 2d 31 20 26 26 20  i<LISTSIZE-1 && 
cdc0: 73 65 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b  set[i]!=0; i++){
cdd0: 0a 20 20 20 20 20 20 65 70 20 3d 20 6d 65 72 67  .      ep = merg
cde0: 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c  e(ep,set[i],cmp,
cdf0: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  offset);.      s
ce00: 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  et[i] = 0;.    }
ce10: 0a 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 65 70  .    set[i] = ep
ce20: 3b 0a 20 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a  ;.  }.  ep = 0;.
ce30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53    for(i=0; i<LIS
ce40: 54 53 49 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20  TSIZE; i++) if( 
ce50: 73 65 74 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65  set[i] ) ep = me
ce60: 72 67 65 28 73 65 74 5b 69 5d 2c 65 70 2c 63 6d  rge(set[i],ep,cm
ce70: 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 72 65 74  p,offset);.  ret
ce80: 75 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  urn ep;.}./*****
ce90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cea0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
ceb0: 65 20 22 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a  e "option.c" ***
cec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ced0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20  *******/.static 
cee0: 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61  char **argv;.sta
cef0: 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74  tic struct s_opt
cf00: 69 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63  ions *op;.static
cf10: 20 46 49 4c 45 20 2a 65 72 72 73 74 72 65 61 6d   FILE *errstream
cf20: 3b 0a 0a 23 64 65 66 69 6e 65 20 49 53 4f 50 54  ;..#define ISOPT
cf30: 28 58 29 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27  (X) ((X)[0]=='-'
cf40: 7c 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73  ||(X)[0]=='+'||s
cf50: 74 72 63 68 72 28 28 58 29 2c 27 3d 27 29 21 3d  trchr((X),'=')!=
cf60: 30 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  0)../*.** Print 
cf70: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
cf80: 20 77 69 74 68 20 61 20 63 61 72 72 6f 74 20 70   with a carrot p
cf90: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6b  ointing to the k
cfa0: 2d 74 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  -th character.**
cfb0: 20 6f 66 20 74 68 65 20 6e 2d 74 68 20 66 69 65   of the n-th fie
cfc0: 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ld..*/.static vo
cfd0: 69 64 20 65 72 72 6c 69 6e 65 28 69 6e 74 20 6e  id errline(int n
cfe0: 2c 20 69 6e 74 20 6b 2c 20 46 49 4c 45 20 2a 65  , int k, FILE *e
cff0: 72 72 29 0a 7b 0a 20 20 69 6e 74 20 73 70 63 6e  rr).{.  int spcn
d000: 74 2c 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76  t, i;.  if( argv
d010: 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28 65 72  [0] ) fprintf(er
d020: 72 2c 22 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b  r,"%s",argv[0]);
d030: 0a 20 20 73 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e  .  spcnt = lemon
d040: 53 74 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 20  Strlen(argv[0]) 
d050: 2b 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  + 1;.  for(i=1; 
d060: 69 3c 6e 20 26 26 20 61 72 67 76 5b 69 5d 3b 20  i<n && argv[i]; 
d070: 69 2b 2b 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  i++){.    fprint
d080: 66 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76  f(err," %s",argv
d090: 5b 69 5d 29 3b 0a 20 20 20 20 73 70 63 6e 74 20  [i]);.    spcnt 
d0a0: 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61  += lemonStrlen(a
d0b0: 72 67 76 5b 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20  rgv[i])+1;.  }. 
d0c0: 20 73 70 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66   spcnt += k;.  f
d0d0: 6f 72 28 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b  or(; argv[i]; i+
d0e0: 2b 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22  +) fprintf(err,"
d0f0: 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20   %s",argv[i]);. 
d100: 20 69 66 28 20 73 70 63 6e 74 3c 32 30 20 29 7b   if( spcnt<20 ){
d110: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
d120: 2c 22 5c 6e 25 2a 73 5e 2d 2d 20 68 65 72 65 5c  ,"\n%*s^-- here\
d130: 6e 22 2c 73 70 63 6e 74 2c 22 22 29 3b 0a 20 20  n",spcnt,"");.  
d140: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e  }else{.    fprin
d150: 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73 68 65 72  tf(err,"\n%*sher
d160: 65 20 2d 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37  e --^\n",spcnt-7
d170: 2c 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ,"");.  }.}../*.
d180: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
d190: 64 65 78 20 6f 66 20 74 68 65 20 4e 2d 74 68 20  dex of the N-th 
d1a0: 6e 6f 6e 2d 73 77 69 74 63 68 20 61 72 67 75 6d  non-switch argum
d1b0: 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  ent.  Return -1.
d1c0: 2a 2a 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f  ** if N is out o
d1d0: 66 20 72 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74  f range..*/.stat
d1e0: 69 63 20 69 6e 74 20 61 72 67 69 6e 64 65 78 28  ic int argindex(
d1f0: 69 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69  int n).{.  int i
d200: 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68  ;.  int dashdash
d210: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76   = 0;.  if( argv
d220: 21 3d 30 20 26 26 20 2a 61 72 67 76 21 3d 30 20  !=0 && *argv!=0 
d230: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
d240: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
d250: 20 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73       if( dashdas
d260: 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76  h || !ISOPT(argv
d270: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
d280: 69 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72  if( n==0 ) retur
d290: 6e 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d  n i;.        n--
d2a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d2b0: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
d2c0: 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61  i],"--")==0 ) da
d2d0: 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20  shdash = 1;.    
d2e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  }.  }.  return -
d2f0: 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61  1;.}..static cha
d300: 72 20 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d  r emsg[] = "Comm
d310: 61 6e 64 20 6c 69 6e 65 20 73 79 6e 74 61 78 20  and line syntax 
d320: 65 72 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a  error: ";../*.**
d330: 20 50 72 6f 63 65 73 73 20 61 20 66 6c 61 67 20   Process a flag 
d340: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67  command line arg
d350: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
d360: 20 69 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67 73   int handleflags
d370: 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65 72  (int i, FILE *er
d380: 72 29 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20  r).{.  int v;.  
d390: 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a  int errcnt = 0;.
d3a0: 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
d3b0: 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b  =0; op[j].label;
d3c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   j++){.    if( s
d3d0: 74 72 6e 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b  trncmp(&argv[i][
d3e0: 31 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c  1],op[j].label,l
d3f0: 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d  emonStrlen(op[j]
d400: 2e 6c 61 62 65 6c 29 29 3d 3d 30 20 29 20 62 72  .label))==0 ) br
d410: 65 61 6b 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 61  eak;.  }.  v = a
d420: 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f  rgv[i][0]=='-' ?
d430: 20 31 20 3a 20 30 3b 0a 20 20 69 66 28 20 6f 70   1 : 0;.  if( op
d440: 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a  [j].label==0 ){.
d450: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
d460: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
d470: 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70  ,"%sundefined op
d480: 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  tion.\n",emsg);.
d490: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
d4a0: 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  1,err);.    }.  
d4b0: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65    errcnt++;.  }e
d4c0: 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79  lse if( op[j].ty
d4d0: 70 65 3d 3d 4f 50 54 5f 46 4c 41 47 20 29 7b 0a  pe==OPT_FLAG ){.
d4e0: 20 20 20 20 2a 28 28 69 6e 74 2a 29 6f 70 5b 6a      *((int*)op[j
d4f0: 5d 2e 61 72 67 29 20 3d 20 76 3b 0a 20 20 7d 65  ].arg) = v;.  }e
d500: 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79  lse if( op[j].ty
d510: 70 65 3d 3d 4f 50 54 5f 46 46 4c 41 47 20 29 7b  pe==OPT_FFLAG ){
d520: 0a 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28  .    (*(void(*)(
d530: 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  int))(op[j].arg)
d540: 29 28 76 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  )(v);.  }else if
d550: 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50  ( op[j].type==OP
d560: 54 5f 46 53 54 52 20 29 7b 0a 20 20 20 20 28 2a  T_FSTR ){.    (*
d570: 28 76 6f 69 64 28 2a 29 28 63 68 61 72 20 2a 29  (void(*)(char *)
d580: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 26 61  )(op[j].arg))(&a
d590: 72 67 76 5b 69 5d 5b 32 5d 29 3b 0a 20 20 7d 65  rgv[i][2]);.  }e
d5a0: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 65 72 72  lse{.    if( err
d5b0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
d5c0: 66 28 65 72 72 2c 22 25 73 6d 69 73 73 69 6e 67  f(err,"%smissing
d5d0: 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 73 77 69   argument on swi
d5e0: 74 63 68 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20  tch.\n",emsg);. 
d5f0: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 31       errline(i,1
d600: 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ,err);.    }.   
d610: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20   errcnt++;.  }. 
d620: 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a   return errcnt;.
d630: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  }../*.** Process
d640: 20 61 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20   a command line 
d650: 73 77 69 74 63 68 20 77 68 69 63 68 20 68 61 73  switch which has
d660: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f   an argument..*/
d670: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 6e 64  .static int hand
d680: 6c 65 73 77 69 74 63 68 28 69 6e 74 20 69 2c 20  leswitch(int i, 
d690: 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20 20 69  FILE *err).{.  i
d6a0: 6e 74 20 6c 76 20 3d 20 30 3b 0a 20 20 64 6f 75  nt lv = 0;.  dou
d6b0: 62 6c 65 20 64 76 20 3d 20 30 2e 30 3b 0a 20 20  ble dv = 0.0;.  
d6c0: 63 68 61 72 20 2a 73 76 20 3d 20 30 2c 20 2a 65  char *sv = 0, *e
d6d0: 6e 64 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a  nd;.  char *cp;.
d6e0: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 65    int j;.  int e
d6f0: 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 63 70 20  rrcnt = 0;.  cp 
d700: 3d 20 73 74 72 63 68 72 28 61 72 67 76 5b 69 5d  = strchr(argv[i]
d710: 2c 27 3d 27 29 3b 0a 20 20 61 73 73 65 72 74 28  ,'=');.  assert(
d720: 20 63 70 21 3d 30 20 29 3b 0a 20 20 2a 63 70 20   cp!=0 );.  *cp 
d730: 3d 20 30 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  = 0;.  for(j=0; 
d740: 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b  op[j].label; j++
d750: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
d760: 70 28 61 72 67 76 5b 69 5d 2c 6f 70 5b 6a 5d 2e  p(argv[i],op[j].
d770: 6c 61 62 65 6c 29 3d 3d 30 20 29 20 62 72 65 61  label)==0 ) brea
d780: 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70 20 3d 20 27  k;.  }.  *cp = '
d790: 3d 27 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e  =';.  if( op[j].
d7a0: 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  label==0 ){.    
d7b0: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
d7c0: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
d7d0: 75 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e  undefined option
d7e0: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
d7f0: 20 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72    errline(i,0,er
d800: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72  r);.    }.    er
d810: 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  rcnt++;.  }else{
d820: 0a 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 73  .    cp++;.    s
d830: 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70  witch( op[j].typ
d840: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
d850: 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
d860: 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
d870: 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20          if( err 
d880: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  ){.          fpr
d890: 69 6e 74 66 28 65 72 72 2c 22 25 73 6f 70 74 69  intf(err,"%sopti
d8a0: 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61  on requires an a
d8b0: 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67  rgument.\n",emsg
d8c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 72 72  );.          err
d8d0: 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20  line(i,0,err);. 
d8e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d8f0: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20   errcnt++;.     
d900: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d910: 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20  case OPT_DBL:.  
d920: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42      case OPT_FDB
d930: 4c 3a 0a 20 20 20 20 20 20 20 20 64 76 20 3d 20  L:.        dv = 
d940: 73 74 72 74 6f 64 28 63 70 2c 26 65 6e 64 29 3b  strtod(cp,&end);
d950: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e  .        if( *en
d960: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  d ){.          i
d970: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
d980: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
d990: 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61  r,"%sillegal cha
d9a0: 72 61 63 74 65 72 20 69 6e 20 66 6c 6f 61 74 69  racter in floati
d9b0: 6e 67 2d 70 6f 69 6e 74 20 61 72 67 75 6d 65 6e  ng-point argumen
d9c0: 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20  t.\n",emsg);.   
d9d0: 20 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65           errline
d9e0: 28 69 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  (i,((unsigned lo
d9f0: 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65  ng)end)-(unsigne
da00: 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65  d long)argv[i],e
da10: 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rr);.          }
da20: 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 63 6e  .          errcn
da30: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
da40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
da50: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54      case OPT_INT
da60: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
da70: 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c  _FINT:.        l
da80: 76 20 3d 20 73 74 72 74 6f 6c 28 63 70 2c 26 65  v = strtol(cp,&e
da90: 6e 64 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69  nd,0);.        i
daa0: 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20  f( *end ){.     
dab0: 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a       if( err ){.
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69              fpri
dad0: 6e 74 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67  ntf(err,"%silleg
dae0: 61 6c 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  al character in 
daf0: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
db00: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
db10: 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28          errline(
db20: 69 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  i,((unsigned lon
db30: 67 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65 64  g)end)-(unsigned
db40: 20 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65 72   long)argv[i],er
db50: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
db60: 20 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74            errcnt
db70: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
db80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
db90: 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a     case OPT_STR:
dba0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
dbb0: 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 73 76  FSTR:.        sv
dbc0: 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 20 20 62   = cp;.        b
dbd0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
dbe0: 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79  switch( op[j].ty
dbf0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
dc00: 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20   OPT_FLAG:.     
dc10: 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a   case OPT_FFLAG:
dc20: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
dc30: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44        case OPT_D
dc40: 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a 28 64 6f  BL:.        *(do
dc50: 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67  uble*)(op[j].arg
dc60: 29 20 3d 20 64 76 3b 0a 20 20 20 20 20 20 20 20  ) = dv;.        
dc70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
dc80: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
dc90: 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 64      (*(void(*)(d
dca0: 6f 75 62 6c 65 29 29 28 6f 70 5b 6a 5d 2e 61 72  ouble))(op[j].ar
dcb0: 67 29 29 28 64 76 29 3b 0a 20 20 20 20 20 20 20  g))(dv);.       
dcc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
dcd0: 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20  se OPT_INT:.    
dce0: 20 20 20 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a      *(int*)(op[j
dcf0: 5d 2e 61 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20  ].arg) = lv;.   
dd00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dd10: 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a    case OPT_FINT:
dd20: 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64  .        (*(void
dd30: 28 2a 29 28 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e  (*)(int))(op[j].
dd40: 61 72 67 29 29 28 28 69 6e 74 29 6c 76 29 3b 0a  arg))((int)lv);.
dd50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
dd60: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54       case OPT_ST
dd70: 52 3a 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61  R:.        *(cha
dd80: 72 2a 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20  r**)(op[j].arg) 
dd90: 3d 20 73 76 3b 0a 20 20 20 20 20 20 20 20 62 72  = sv;.        br
dda0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ddb0: 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20  OPT_FSTR:.      
ddc0: 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 63 68 61    (*(void(*)(cha
ddd0: 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  r *))(op[j].arg)
dde0: 29 28 73 76 29 3b 0a 20 20 20 20 20 20 20 20 62  )(sv);.        b
ddf0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
de00: 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b    return errcnt;
de10: 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e 69 74 28  .}..int OptInit(
de20: 63 68 61 72 20 2a 2a 61 2c 20 73 74 72 75 63 74  char **a, struct
de30: 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 2c 20 46   s_options *o, F
de40: 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20 20 69 6e  ILE *err).{.  in
de50: 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20  t errcnt = 0;.  
de60: 61 72 67 76 20 3d 20 61 3b 0a 20 20 6f 70 20 3d  argv = a;.  op =
de70: 20 6f 3b 0a 20 20 65 72 72 73 74 72 65 61 6d 20   o;.  errstream 
de80: 3d 20 65 72 72 3b 0a 20 20 69 66 28 20 61 72 67  = err;.  if( arg
de90: 76 20 26 26 20 2a 61 72 67 76 20 26 26 20 6f 70  v && *argv && op
dea0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
deb0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76     for(i=1; argv
dec0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
ded0: 20 69 66 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d   if( argv[i][0]=
dee0: 3d 27 2b 27 20 7c 7c 20 61 72 67 76 5b 69 5d 5b  ='+' || argv[i][
def0: 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
df00: 20 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e     errcnt += han
df10: 64 6c 65 66 6c 61 67 73 28 69 2c 65 72 72 29 3b  dleflags(i,err);
df20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
df30: 20 73 74 72 63 68 72 28 61 72 67 76 5b 69 5d 2c   strchr(argv[i],
df40: 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '=') ){.        
df50: 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65  errcnt += handle
df60: 73 77 69 74 63 68 28 69 2c 65 72 72 29 3b 0a 20  switch(i,err);. 
df70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
df80: 0a 20 20 69 66 28 20 65 72 72 63 6e 74 3e 30 20  .  if( errcnt>0 
df90: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65  ){.    fprintf(e
dfa0: 72 72 2c 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e  rr,"Valid comman
dfb0: 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66  d line options f
dfc0: 6f 72 20 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e  or \"%s\" are:\n
dfd0: 22 2c 2a 61 29 3b 0a 20 20 20 20 4f 70 74 50 72  ",*a);.    OptPr
dfe0: 69 6e 74 28 29 3b 0a 20 20 20 20 65 78 69 74 28  int();.    exit(
dff0: 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
e000: 20 30 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41   0;.}..int OptNA
e010: 72 67 73 28 29 7b 0a 20 20 69 6e 74 20 63 6e 74  rgs(){.  int cnt
e020: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 64 61 73 68   = 0;.  int dash
e030: 64 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  dash = 0;.  int 
e040: 69 3b 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30  i;.  if( argv!=0
e050: 20 26 26 20 61 72 67 76 5b 30 5d 21 3d 30 20 29   && argv[0]!=0 )
e060: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  {.    for(i=1; a
e070: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgv[i]; i++){.  
e080: 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73 68      if( dashdash
e090: 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b   || !ISOPT(argv[
e0a0: 69 5d 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20  i]) ) cnt++;.   
e0b0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72     if( strcmp(ar
e0c0: 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29  gv[i],"--")==0 )
e0d0: 20 64 61 73 68 64 61 73 68 20 3d 20 31 3b 0a 20   dashdash = 1;. 
e0e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
e0f0: 6e 20 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72 20 2a  n cnt;.}..char *
e100: 4f 70 74 41 72 67 28 69 6e 74 20 6e 29 0a 7b 0a  OptArg(int n).{.
e110: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61    int i;.  i = a
e120: 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72 65  rgindex(n);.  re
e130: 74 75 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67 76  turn i>=0 ? argv
e140: 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64  [i] : 0;.}..void
e150: 20 4f 70 74 45 72 72 28 69 6e 74 20 6e 29 0a 7b   OptErr(int n).{
e160: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20  .  int i;.  i = 
e170: 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 69  argindex(n);.  i
e180: 66 28 20 69 3e 3d 30 20 29 20 65 72 72 6c 69 6e  f( i>=0 ) errlin
e190: 65 28 69 2c 30 2c 65 72 72 73 74 72 65 61 6d 29  e(i,0,errstream)
e1a0: 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 50 72 69  ;.}..void OptPri
e1b0: 6e 74 28 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nt(){.  int i;. 
e1c0: 20 69 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b 0a 20   int max, len;. 
e1d0: 20 6d 61 78 20 3d 20 30 3b 0a 20 20 66 6f 72 28   max = 0;.  for(
e1e0: 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c  i=0; op[i].label
e1f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6e 20  ; i++){.    len 
e200: 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70  = lemonStrlen(op
e210: 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b 20 31 3b 0a  [i].label) + 1;.
e220: 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 69      switch( op[i
e230: 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  ].type ){.      
e240: 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20  case OPT_FLAG:. 
e250: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46       case OPT_FF
e260: 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65  LAG:.        bre
e270: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
e280: 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61  PT_INT:.      ca
e290: 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20  se OPT_FINT:.   
e2a0: 20 20 20 20 20 6c 65 6e 20 2b 3d 20 39 3b 20 20       len += 9;  
e2b0: 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f       /* length o
e2c0: 66 20 22 3c 69 6e 74 65 67 65 72 3e 22 20 2a 2f  f "<integer>" */
e2d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e2e0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44        case OPT_D
e2f0: 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  BL:.      case O
e300: 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20  PT_FDBL:.       
e310: 20 6c 65 6e 20 2b 3d 20 36 3b 20 20 20 20 20 20   len += 6;      
e320: 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c   /* length of "<
e330: 72 65 61 6c 3e 22 20 2a 2f 0a 20 20 20 20 20 20  real>" */.      
e340: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
e350: 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20  ase OPT_STR:.   
e360: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52     case OPT_FSTR
e370: 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d  :.        len +=
e380: 20 38 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e   8;       /* len
e390: 67 74 68 20 6f 66 20 22 3c 73 74 72 69 6e 67 3e  gth of "<string>
e3a0: 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  " */.        bre
e3b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
e3c0: 28 20 6c 65 6e 3e 6d 61 78 20 29 20 6d 61 78 20  ( len>max ) max 
e3d0: 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72  = len;.  }.  for
e3e0: 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65  (i=0; op[i].labe
e3f0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69  l; i++){.    swi
e400: 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20  tch( op[i].type 
e410: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  ){.      case OP
e420: 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61  T_FLAG:.      ca
e430: 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20  se OPT_FFLAG:.  
e440: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
e450: 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 2d 2a 73  rstream,"  -%-*s
e460: 20 20 25 73 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69    %s\n",max,op[i
e470: 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65  ].label,op[i].me
e480: 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
e490: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
e4a0: 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20  e OPT_INT:.     
e4b0: 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a   case OPT_FINT:.
e4c0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
e4d0: 65 72 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d  errstream,"  %s=
e4e0: 3c 69 6e 74 65 67 65 72 3e 25 2a 73 20 20 25 73  <integer>%*s  %s
e4f0: 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c  \n",op[i].label,
e500: 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29  .          (int)
e510: 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e  (max-lemonStrlen
e520: 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 39 29  (op[i].label)-9)
e530: 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67  ,"",op[i].messag
e540: 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
e550: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
e560: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73  T_DBL:.      cas
e570: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
e580: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73      fprintf(errs
e590: 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 72 65 61  tream,"  %s=<rea
e5a0: 6c 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b  l>%*s  %s\n",op[
e5b0: 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20  i].label,.      
e5c0: 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65      (int)(max-le
e5d0: 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e  monStrlen(op[i].
e5e0: 6c 61 62 65 6c 29 2d 36 29 2c 22 22 2c 6f 70 5b  label)-6),"",op[
e5f0: 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20  i].message);.   
e600: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e610: 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a    case OPT_STR:.
e620: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
e630: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 66 70 72  STR:.        fpr
e640: 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22  intf(errstream,"
e650: 20 20 25 73 3d 3c 73 74 72 69 6e 67 3e 25 2a 73    %s=<string>%*s
e660: 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61    %s\n",op[i].la
e670: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  bel,.          (
e680: 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74  int)(max-lemonSt
e690: 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c  rlen(op[i].label
e6a0: 29 2d 38 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65  )-8),"",op[i].me
e6b0: 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
e6c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
e6d0: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
e6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
e6f0: 20 74 68 65 20 66 69 6c 65 20 22 70 61 72 73 65   the file "parse
e700: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
e710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e720: 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 20 66 69  /./*.** Input fi
e730: 6c 65 20 70 61 72 73 65 72 20 66 6f 72 20 74 68  le parser for th
e740: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
e750: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
e760: 20 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   The state of th
e770: 65 20 70 61 72 73 65 72 20 2a 2f 0a 65 6e 75 6d  e parser */.enum
e780: 20 65 5f 73 74 61 74 65 20 7b 0a 20 20 49 4e 49   e_state {.  INI
e790: 54 49 41 4c 49 5a 45 2c 0a 20 20 57 41 49 54 49  TIALIZE,.  WAITI
e7a0: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
e7b0: 55 4c 45 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  ULE,.  WAITING_F
e7c0: 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 2c  OR_DECL_KEYWORD,
e7d0: 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44  .  WAITING_FOR_D
e7e0: 45 43 4c 5f 41 52 47 2c 0a 20 20 57 41 49 54 49  ECL_ARG,.  WAITI
e7f0: 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43  NG_FOR_PRECEDENC
e800: 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54  E_SYMBOL,.  WAIT
e810: 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 2c 0a 20  ING_FOR_ARROW,. 
e820: 20 49 4e 5f 52 48 53 2c 0a 20 20 4c 48 53 5f 41   IN_RHS,.  LHS_A
e830: 4c 49 41 53 5f 31 2c 0a 20 20 4c 48 53 5f 41 4c  LIAS_1,.  LHS_AL
e840: 49 41 53 5f 32 2c 0a 20 20 4c 48 53 5f 41 4c 49  IAS_2,.  LHS_ALI
e850: 41 53 5f 33 2c 0a 20 20 52 48 53 5f 41 4c 49 41  AS_3,.  RHS_ALIA
e860: 53 5f 31 2c 0a 20 20 52 48 53 5f 41 4c 49 41 53  S_1,.  RHS_ALIAS
e870: 5f 32 2c 0a 20 20 50 52 45 43 45 44 45 4e 43 45  _2,.  PRECEDENCE
e880: 5f 4d 41 52 4b 5f 31 2c 0a 20 20 50 52 45 43 45  _MARK_1,.  PRECE
e890: 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c 0a 20 20  DENCE_MARK_2,.  
e8a0: 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
e8b0: 45 5f 45 52 52 4f 52 2c 0a 20 20 52 45 53 59 4e  E_ERROR,.  RESYN
e8c0: 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
e8d0: 4f 52 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  OR,.  WAITING_FO
e8e0: 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d  R_DESTRUCTOR_SYM
e8f0: 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  BOL,.  WAITING_F
e900: 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42  OR_DATATYPE_SYMB
e910: 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  OL,.  WAITING_FO
e920: 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 2c 0a 20  R_FALLBACK_ID,. 
e930: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c   WAITING_FOR_WIL
e940: 44 43 41 52 44 5f 49 44 0a 7d 3b 0a 73 74 72 75  DCARD_ID.};.stru
e950: 63 74 20 70 73 74 61 74 65 20 7b 0a 20 20 63 68  ct pstate {.  ch
e960: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20  ar *filename;   
e970: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
e980: 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
e990: 0a 20 20 69 6e 74 20 74 6f 6b 65 6e 6c 69 6e 65  .  int tokenline
e9a0: 6e 6f 3b 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65  no;      /* Line
e9b0: 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63 68 20  number at which 
e9c0: 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 73 74  current token st
e9d0: 61 72 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72  arts */.  int er
e9e0: 72 6f 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20  rorcnt;         
e9f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
ea00: 6f 72 73 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  ors so far */.  
ea10: 63 68 61 72 20 2a 74 6f 6b 65 6e 73 74 61 72 74  char *tokenstart
ea20: 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  ;     /* Text of
ea30: 20 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 2a   current token *
ea40: 2f 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  /.  struct lemon
ea50: 20 2a 67 70 3b 20 20 20 20 20 2f 2a 20 47 6c 6f   *gp;     /* Glo
ea60: 62 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72  bal state vector
ea70: 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 73 74 61   */.  enum e_sta
ea80: 74 65 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  te state;       
ea90: 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66   /* The state of
eaa0: 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 20   the parser */. 
eab0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
eac0: 66 61 6c 6c 62 61 63 6b 3b 20 20 20 2f 2a 20 54  fallback;   /* T
ead0: 68 65 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65  he fallback toke
eae0: 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  n */.  struct sy
eaf0: 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20  mbol *lhs;      
eb00: 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73    /* Left-hand s
eb10: 69 64 65 20 6f 66 20 63 75 72 72 65 6e 74 20 72  ide of current r
eb20: 75 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ule */.  const c
eb30: 68 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20  har *lhsalias;  
eb40: 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72      /* Alias for
eb50: 20 74 68 65 20 4c 48 53 20 2a 2f 0a 20 20 69 6e   the LHS */.  in
eb60: 74 20 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20  t nrhs;         
eb70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
eb80: 65 72 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  er of right-hand
eb90: 20 73 69 64 65 20 73 79 6d 62 6f 6c 73 20 73 65   side symbols se
eba0: 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  en */.  struct s
ebb0: 79 6d 62 6f 6c 20 2a 72 68 73 5b 4d 41 58 52 48  ymbol *rhs[MAXRH
ebc0: 53 5d 3b 20 20 2f 2a 20 52 48 53 20 73 79 6d 62  S];  /* RHS symb
ebd0: 6f 6c 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ols */.  const c
ebe0: 68 61 72 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48  har *alias[MAXRH
ebf0: 53 5d 3b 20 2f 2a 20 41 6c 69 61 73 65 73 20 66  S]; /* Aliases f
ec00: 6f 72 20 65 61 63 68 20 52 48 53 20 73 79 6d 62  or each RHS symb
ec10: 6f 6c 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ol (or NULL) */.
ec20: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70    struct rule *p
ec30: 72 65 76 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20  revrule;     /* 
ec40: 50 72 65 76 69 6f 75 73 20 72 75 6c 65 20 70 61  Previous rule pa
ec50: 72 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rsed */.  const 
ec60: 63 68 61 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72  char *declkeywor
ec70: 64 3b 20 20 20 2f 2a 20 4b 65 79 77 6f 72 64 20  d;   /* Keyword 
ec80: 6f 66 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e  of a declaration
ec90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 64 65 63   */.  char **dec
eca0: 6c 61 72 67 73 6c 6f 74 3b 20 20 20 20 20 20 20  largslot;       
ecb0: 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20 64 65   /* Where the de
ecc0: 63 6c 61 72 61 74 69 6f 6e 20 61 72 67 75 6d 65  claration argume
ecd0: 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 70 75 74  nt should be put
ece0: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 65 72 74   */.  int insert
ecf0: 4c 69 6e 65 4d 61 63 72 6f 3b 20 20 20 20 20 20  LineMacro;      
ed00: 20 2f 2a 20 41 64 64 20 23 6c 69 6e 65 20 62 65   /* Add #line be
ed10: 66 6f 72 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  fore declaration
ed20: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74   insert */.  int
ed30: 20 2a 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74   *decllinenoslot
ed40: 3b 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  ;       /* Where
ed50: 20 74 6f 20 77 72 69 74 65 20 64 65 63 6c 61 72   to write declar
ed60: 61 74 69 6f 6e 20 6c 69 6e 65 20 6e 75 6d 62 65  ation line numbe
ed70: 72 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73  r */.  enum e_as
ed80: 73 6f 63 20 64 65 63 6c 61 73 73 6f 63 3b 20 20  soc declassoc;  
ed90: 20 20 2f 2a 20 41 73 73 69 67 6e 20 74 68 69 73    /* Assign this
eda0: 20 61 73 73 6f 63 69 61 74 69 6f 6e 20 74 6f 20   association to 
edb0: 64 65 63 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a  decl arguments *
edc0: 2f 0a 20 20 69 6e 74 20 70 72 65 63 63 6f 75 6e  /.  int preccoun
edd0: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ter;           /
ede0: 2a 20 41 73 73 69 67 6e 20 74 68 69 73 20 70 72  * Assign this pr
edf0: 65 63 65 64 65 6e 63 65 20 74 6f 20 64 65 63 6c  ecedence to decl
ee00: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
ee10: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 66 69 72  struct rule *fir
ee20: 73 74 72 75 6c 65 3b 20 20 20 20 2f 2a 20 50 6f  strule;    /* Po
ee30: 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 72  inter to first r
ee40: 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  ule in the gramm
ee50: 61 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72  ar */.  struct r
ee60: 75 6c 65 20 2a 6c 61 73 74 72 75 6c 65 3b 20 20  ule *lastrule;  
ee70: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
ee80: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
ee90: 6c 79 20 70 61 72 73 65 64 20 72 75 6c 65 20 2a  ly parsed rule *
eea0: 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61  /.};../* Parse a
eeb0: 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f   single token */
eec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 72  .static void par
eed0: 73 65 6f 6e 65 74 6f 6b 65 6e 28 73 74 72 75 63  seonetoken(struc
eee0: 74 20 70 73 74 61 74 65 20 2a 70 73 70 29 0a 7b  t pstate *psp).{
eef0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 78  .  const char *x
ef00: 3b 0a 20 20 78 20 3d 20 53 74 72 73 61 66 65 28  ;.  x = Strsafe(
ef10: 70 73 70 2d 3e 74 6f 6b 65 6e 73 74 61 72 74 29  psp->tokenstart)
ef20: 3b 20 20 20 20 20 2f 2a 20 53 61 76 65 20 74 68  ;     /* Save th
ef30: 65 20 74 6f 6b 65 6e 20 70 65 72 6d 61 6e 65 6e  e token permanen
ef40: 74 6c 79 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70  tly */.#if 0.  p
ef50: 72 69 6e 74 66 28 22 25 73 3a 25 64 3a 20 54 6f  rintf("%s:%d: To
ef60: 6b 65 6e 3d 5b 25 73 5d 20 73 74 61 74 65 3d 25  ken=[%s] state=%
ef70: 64 5c 6e 22 2c 70 73 70 2d 3e 66 69 6c 65 6e 61  d\n",psp->filena
ef80: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
ef90: 65 6e 6f 2c 0a 20 20 20 20 78 2c 70 73 70 2d 3e  eno,.    x,psp->
efa0: 73 74 61 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20  state);.#endif. 
efb0: 20 73 77 69 74 63 68 28 20 70 73 70 2d 3e 73 74   switch( psp->st
efc0: 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ate ){.    case 
efd0: 49 4e 49 54 49 41 4c 49 5a 45 3a 0a 20 20 20 20  INITIALIZE:.    
efe0: 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20    psp->prevrule 
eff0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e  = 0;.      psp->
f000: 70 72 65 63 63 6f 75 6e 74 65 72 20 3d 20 30 3b  preccounter = 0;
f010: 0a 20 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73  .      psp->firs
f020: 74 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73  trule = psp->las
f030: 74 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  trule = 0;.     
f040: 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20   psp->gp->nrule 
f050: 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  = 0;.      /* Fa
f060: 6c 6c 20 74 68 72 75 20 74 6f 20 6e 65 78 74 20  ll thru to next 
f070: 63 61 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65  case */.    case
f080: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
f090: 4c 5f 4f 52 5f 52 55 4c 45 3a 0a 20 20 20 20 20  L_OR_RULE:.     
f0a0: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29   if( x[0]=='%' )
f0b0: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
f0c0: 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
f0d0: 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b  OR_DECL_KEYWORD;
f0e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f0f0: 20 69 73 6c 6f 77 65 72 28 78 5b 30 5d 29 20 29   islower(x[0]) )
f100: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c  {.        psp->l
f110: 68 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  hs = Symbol_new(
f120: 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
f130: 3e 6e 72 68 73 20 3d 20 30 3b 0a 20 20 20 20 20  >nrhs = 0;.     
f140: 20 20 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73     psp->lhsalias
f150: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
f160: 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
f170: 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3b 0a 20 20  NG_FOR_ARROW;.  
f180: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b      }else if( x[
f190: 30 5d 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20  0]=='{' ){.     
f1a0: 20 20 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76     if( psp->prev
f1b0: 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rule==0 ){.     
f1c0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
f1d0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
f1e0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54  >tokenlineno,."T
f1f0: 68 65 72 65 20 69 73 20 6e 6f 20 70 72 69 6f 72  here is no prior
f200: 20 72 75 6c 65 20 75 70 6f 6e 20 77 68 69 63 68   rule upon which
f210: 20 74 6f 20 61 74 74 61 63 68 20 74 68 65 20 63   to attach the c
f220: 6f 64 65 20 5c 0a 66 72 61 67 6d 65 6e 74 20 77  ode \.fragment w
f230: 68 69 63 68 20 62 65 67 69 6e 73 20 6f 6e 20 74  hich begins on t
f240: 68 69 73 20 6c 69 6e 65 2e 22 29 3b 0a 20 20 20  his line.");.   
f250: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
f260: 72 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 20 69  rcnt++;..}else i
f270: 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65  f( psp->prevrule
f280: 2d 3e 63 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20  ->code!=0 ){.   
f290: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f2a0: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f2b0: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f2c0: 22 43 6f 64 65 20 66 72 61 67 6d 65 6e 74 20 62  "Code fragment b
f2d0: 65 67 69 6e 6e 69 6e 67 20 6f 6e 20 74 68 69 73  eginning on this
f2e0: 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 65   line is not the
f2f0: 20 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c   first \.to foll
f300: 6f 77 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ow the previous 
f310: 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  rule.");.       
f320: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
f330: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
f340: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  e{.          psp
f350: 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 6c 69 6e 65  ->prevrule->line
f360: 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e   = psp->tokenlin
f370: 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 70  eno;.          p
f380: 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f  sp->prevrule->co
f390: 64 65 20 3d 20 26 78 5b 31 5d 3b 0a 09 7d 0a 20  de = &x[1];..}. 
f3a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78       }else if( x
f3b0: 5b 30 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20  [0]=='[' ){.    
f3c0: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
f3d0: 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
f3e0: 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _1;.      }else{
f3f0: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
f400: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
f410: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
f420: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54 6f 6b  ,.          "Tok
f430: 65 6e 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64  en \"%s\" should
f440: 20 62 65 20 65 69 74 68 65 72 20 5c 22 25 25 5c   be either \"%%\
f450: 22 20 6f 72 20 61 20 6e 6f 6e 74 65 72 6d 69 6e  " or a nontermin
f460: 61 6c 20 6e 61 6d 65 2e 22 2c 0a 20 20 20 20 20  al name.",.     
f470: 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20       x);.       
f480: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
f490: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f4a0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
f4b0: 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f  PRECEDENCE_MARK_
f4c0: 31 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  1:.      if( !is
f4d0: 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20  upper(x[0]) ){. 
f4e0: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f4f0: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f500: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f510: 20 20 20 20 20 20 20 20 20 20 22 54 68 65 20 70            "The p
f520: 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c  recedence symbol
f530: 20 6d 75 73 74 20 62 65 20 61 20 74 65 72 6d 69   must be a termi
f540: 6e 61 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  nal.");.        
f550: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
f560: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f570: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d   psp->prevrule==
f580: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  0 ){.        Err
f590: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
f5a0: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
f5b0: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
f5c0: 22 54 68 65 72 65 20 69 73 20 6e 6f 20 70 72 69  "There is no pri
f5d0: 6f 72 20 72 75 6c 65 20 74 6f 20 61 73 73 69 67  or rule to assig
f5e0: 6e 20 70 72 65 63 65 64 65 6e 63 65 20 5c 22 5b  n precedence \"[
f5f0: 25 73 5d 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20  %s]\".",x);.    
f600: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
f610: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  t++;.      }else
f620: 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75   if( psp->prevru
f630: 6c 65 2d 3e 70 72 65 63 73 79 6d 21 3d 30 20 29  le->precsym!=0 )
f640: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
f650: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
f660: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
f670: 6f 2c 0a 22 50 72 65 63 65 64 65 6e 63 65 20 6d  o,."Precedence m
f680: 61 72 6b 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65  ark on this line
f690: 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73   is not the firs
f6a0: 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68  t \.to follow th
f6b0: 65 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e  e previous rule.
f6c0: 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ");.        psp-
f6d0: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
f6e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f6f0: 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d    psp->prevrule-
f700: 3e 70 72 65 63 73 79 6d 20 3d 20 53 79 6d 62 6f  >precsym = Symbo
f710: 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
f720: 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61  }.      psp->sta
f730: 74 65 20 3d 20 50 52 45 43 45 44 45 4e 43 45 5f  te = PRECEDENCE_
f740: 4d 41 52 4b 5f 32 3b 0a 20 20 20 20 20 20 62 72  MARK_2;.      br
f750: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52  eak;.    case PR
f760: 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3a  ECEDENCE_MARK_2:
f770: 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 21  .      if( x[0]!
f780: 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =']' ){.        
f790: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
f7a0: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
f7b0: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
f7c0: 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 5d 5c     "Missing \"]\
f7d0: 22 20 6f 6e 20 70 72 65 63 65 64 65 6e 63 65 20  " on precedence 
f7e0: 6d 61 72 6b 2e 22 29 3b 0a 20 20 20 20 20 20 20  mark.");.       
f7f0: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
f800: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f810: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
f820: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
f830: 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 62 72 65  _RULE;.      bre
f840: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
f850: 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3a 0a  TING_FOR_ARROW:.
f860: 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
f870: 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27  ':' && x[1]==':'
f880: 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b   && x[2]=='=' ){
f890: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
f8a0: 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20  ate = IN_RHS;.  
f8b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b      }else if( x[
f8c0: 30 5d 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20  0]=='(' ){.     
f8d0: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f8e0: 4c 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20  LHS_ALIAS_1;.   
f8f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f900: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
f910: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
f920: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
f930: 20 20 20 20 20 22 45 78 70 65 63 74 65 64 20 74       "Expected t
f940: 6f 20 73 65 65 20 61 20 5c 22 3a 5c 22 20 66 6f  o see a \":\" fo
f950: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4c 48 53 20  llowing the LHS 
f960: 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 2e 22 2c  symbol \"%s\".",
f970: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
f980: 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  lhs->name);.    
f990: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
f9a0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
f9b0: 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
f9c0: 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
f9d0: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
f9e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
f9f0: 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20   LHS_ALIAS_1:.  
fa00: 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61 28      if( isalpha(
fa10: 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
fa20: 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d   psp->lhsalias =
fa30: 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   x;.        psp-
fa40: 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49  >state = LHS_ALI
fa50: 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  AS_2;.      }els
fa60: 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
fa70: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
fa80: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
fa90: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c  no,.          "\
faa0: 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76  "%s\" is not a v
fab0: 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74  alid alias for t
fac0: 68 65 20 4c 48 53 20 5c 22 25 73 5c 22 5c 6e 22  he LHS \"%s\"\n"
fad0: 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70 73  ,.          x,ps
fae0: 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20  p->lhs->name);. 
faf0: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
fb00: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
fb10: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
fb20: 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
fb30: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
fb40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
fb50: 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3a  ase LHS_ALIAS_2:
fb60: 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
fb70: 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =')' ){.        
fb80: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53  psp->state = LHS
fb90: 5f 41 4c 49 41 53 5f 33 3b 0a 20 20 20 20 20 20  _ALIAS_3;.      
fba0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
fbb0: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
fbc0: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
fbd0: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
fbe0: 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22    "Missing \")\"
fbf0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61   following LHS a
fc00: 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22  lias name \"%s\"
fc10: 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73  .",psp->lhsalias
fc20: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
fc30: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
fc40: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
fc50: 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
fc60: 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  LE_ERROR;.      
fc70: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
fc80: 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41     case LHS_ALIA
fc90: 53 5f 33 3a 0a 20 20 20 20 20 20 69 66 28 20 78  S_3:.      if( x
fca0: 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d  [0]==':' && x[1]
fcb0: 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27  ==':' && x[2]=='
fcc0: 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  =' ){.        ps
fcd0: 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48  p->state = IN_RH
fce0: 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  S;.      }else{.
fcf0: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
fd00: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
fd10: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
fd20: 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73  .          "Miss
fd30: 69 6e 67 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c 6f  ing \"->\" follo
fd40: 77 69 6e 67 3a 20 5c 22 25 73 28 25 73 29 5c 22  wing: \"%s(%s)\"
fd50: 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  .",.           p
fd60: 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70 73  sp->lhs->name,ps
fd70: 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20  p->lhsalias);.  
fd80: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
fd90: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
fda0: 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
fdb0: 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
fdc0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
fdd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
fde0: 73 65 20 49 4e 5f 52 48 53 3a 0a 20 20 20 20 20  se IN_RHS:.     
fdf0: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
fe00: 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
fe10: 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 20 20 20   rule *rp;.     
fe20: 20 20 20 72 70 20 3d 20 28 73 74 72 75 63 74 20     rp = (struct 
fe30: 72 75 6c 65 20 2a 29 63 61 6c 6c 6f 63 28 20 73  rule *)calloc( s
fe40: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 72 75 6c  izeof(struct rul
fe50: 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20  e) + .          
fe60: 20 20 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74     sizeof(struct
fe70: 20 73 79 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e 6e   symbol*)*psp->n
fe80: 72 68 73 20 2b 20 73 69 7a 65 6f 66 28 63 68 61  rhs + sizeof(cha
fe90: 72 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 2c 20 31  r*)*psp->nrhs, 1
fea0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
feb0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p==0 ){.        
fec0: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
fed0: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
fee0: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
fef0: 20 20 20 20 20 20 20 22 43 61 6e 27 74 20 61 6c         "Can't al
ff00: 6c 6f 63 61 74 65 20 65 6e 6f 75 67 68 20 6d 65  locate enough me
ff10: 6d 6f 72 79 20 66 6f 72 20 74 68 69 73 20 72 75  mory for this ru
ff20: 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  le.");.         
ff30: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
ff40: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
ff50: 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 09  >prevrule = 0;..
ff60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ff70: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
ff80: 20 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 20 3d    rp->ruleline =
ff90: 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
ffa0: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  o;.          rp-
ffb0: 3e 72 68 73 20 3d 20 28 73 74 72 75 63 74 20 73  >rhs = (struct s
ffc0: 79 6d 62 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b 0a  ymbol**)&rp[1];.
ffd0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
ffe0: 73 61 6c 69 61 73 20 3d 20 28 63 6f 6e 73 74 20  salias = (const 
fff0: 63 68 61 72 2a 2a 29 26 28 72 70 2d 3e 72 68 73  char**)&(rp->rhs
10000 5b 70 73 70 2d 3e 6e 72 68 73 5d 29 3b 0a 20 20  [psp->nrhs]);.  
10010 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
10020 20 69 3c 70 73 70 2d 3e 6e 72 68 73 3b 20 69 2b   i<psp->nrhs; i+
10030 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
10040 72 70 2d 3e 72 68 73 5b 69 5d 20 3d 20 70 73 70  rp->rhs[i] = psp
10050 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20  ->rhs[i];.      
10060 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69        rp->rhsali
10070 61 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 61 6c 69  as[i] = psp->ali
10080 61 73 5b 69 5d 3b 0a 09 20 20 7d 0a 20 20 20 20  as[i];..  }.    
10090 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 20 3d 20        rp->lhs = 
100a0 70 73 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20  psp->lhs;.      
100b0 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73      rp->lhsalias
100c0 20 3d 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73   = psp->lhsalias
100d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
100e0 6e 72 68 73 20 3d 20 70 73 70 2d 3e 6e 72 68 73  nrhs = psp->nrhs
100f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
10100 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  code = 0;.      
10110 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20      rp->precsym 
10120 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
10130 70 2d 3e 69 6e 64 65 78 20 3d 20 70 73 70 2d 3e  p->index = psp->
10140 67 70 2d 3e 6e 72 75 6c 65 2b 2b 3b 0a 20 20 20  gp->nrule++;.   
10150 20 20 20 20 20 20 20 72 70 2d 3e 6e 65 78 74 6c         rp->nextl
10160 68 73 20 3d 20 72 70 2d 3e 6c 68 73 2d 3e 72 75  hs = rp->lhs->ru
10170 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  le;.          rp
10180 2d 3e 6c 68 73 2d 3e 72 75 6c 65 20 3d 20 72 70  ->lhs->rule = rp
10190 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
101a0 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  next = 0;.      
101b0 20 20 20 20 69 66 28 20 70 73 70 2d 3e 66 69 72      if( psp->fir
101c0 73 74 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  strule==0 ){.   
101d0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 69           psp->fi
101e0 72 73 74 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c  rstrule = psp->l
101f0 61 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a 09 20  astrule = rp;.. 
10200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10210 20 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c      psp->lastrul
10220 65 2d 3e 6e 65 78 74 20 3d 20 72 70 3b 0a 20 20  e->next = rp;.  
10230 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c            psp->l
10240 61 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a 09 20  astrule = rp;.. 
10250 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 73 70   }.          psp
10260 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 72 70 3b  ->prevrule = rp;
10270 0a 09 7d 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ..}.        psp-
10280 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
10290 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
102a0 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
102b0 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  f( isalpha(x[0])
102c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
102d0 70 73 70 2d 3e 6e 72 68 73 3e 3d 4d 41 58 52 48  psp->nrhs>=MAXRH
102e0 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  S ){.          E
102f0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
10300 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
10310 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
10320 20 20 20 20 22 54 6f 6f 20 6d 61 6e 79 20 73 79      "Too many sy
10330 6d 62 6f 6c 73 20 6f 6e 20 52 48 53 20 6f 66 20  mbols on RHS of 
10340 72 75 6c 65 20 62 65 67 69 6e 6e 69 6e 67 20 61  rule beginning a
10350 74 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20  t \"%s\".",.    
10360 20 20 20 20 20 20 20 20 78 29 3b 0a 20 20 20 20          x);.    
10370 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
10380 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
10390 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
103a0 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
103b0 45 52 52 4f 52 3b 0a 09 7d 65 6c 73 65 7b 0a 20  ERROR;..}else{. 
103c0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68           psp->rh
103d0 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 53  s[psp->nrhs] = S
103e0 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
103f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c 69          psp->ali
10400 61 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20  as[psp->nrhs] = 
10410 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  0;.          psp
10420 2d 3e 6e 72 68 73 2b 2b 3b 0a 09 7d 0a 20 20 20  ->nrhs++;..}.   
10430 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 78 5b     }else if( (x[
10440 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78 5b 30 5d 3d  0]=='|' || x[0]=
10450 3d 27 2f 27 29 20 26 26 20 70 73 70 2d 3e 6e 72  ='/') && psp->nr
10460 68 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  hs>0 ){.        
10470 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6d  struct symbol *m
10480 73 70 20 3d 20 70 73 70 2d 3e 72 68 73 5b 70 73  sp = psp->rhs[ps
10490 70 2d 3e 6e 72 68 73 2d 31 5d 3b 0a 20 20 20 20  p->nrhs-1];.    
104a0 20 20 20 20 69 66 28 20 6d 73 70 2d 3e 74 79 70      if( msp->typ
104b0 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e!=MULTITERMINAL
104c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
104d0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6f 72 69  ruct symbol *ori
104e0 67 73 70 20 3d 20 6d 73 70 3b 0a 20 20 20 20 20  gsp = msp;.     
104f0 20 20 20 20 20 6d 73 70 20 3d 20 28 73 74 72 75       msp = (stru
10500 63 74 20 73 79 6d 62 6f 6c 20 2a 29 20 63 61 6c  ct symbol *) cal
10510 6c 6f 63 28 31 2c 73 69 7a 65 6f 66 28 2a 6d 73  loc(1,sizeof(*ms
10520 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  p));.          m
10530 65 6d 73 65 74 28 6d 73 70 2c 20 30 2c 20 73 69  emset(msp, 0, si
10540 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20 20 20  zeof(*msp));.   
10550 20 20 20 20 20 20 20 6d 73 70 2d 3e 74 79 70 65         msp->type
10560 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c   = MULTITERMINAL
10570 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d  ;.          msp-
10580 3e 6e 73 75 62 73 79 6d 20 3d 20 31 3b 0a 20 20  >nsubsym = 1;.  
10590 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62          msp->sub
105a0 73 79 6d 20 3d 20 28 73 74 72 75 63 74 20 73 79  sym = (struct sy
105b0 6d 62 6f 6c 20 2a 2a 29 20 63 61 6c 6c 6f 63 28  mbol **) calloc(
105c0 31 2c 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  1,sizeof(struct 
105d0 73 79 6d 62 6f 6c 2a 29 29 3b 0a 20 20 20 20 20  symbol*));.     
105e0 20 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d       msp->subsym
105f0 5b 30 5d 20 3d 20 6f 72 69 67 73 70 3b 0a 20 20  [0] = origsp;.  
10600 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 61 6d          msp->nam
10610 65 20 3d 20 6f 72 69 67 73 70 2d 3e 6e 61 6d 65  e = origsp->name
10620 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10630 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31  >rhs[psp->nrhs-1
10640 5d 20 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20 20  ] = msp;.       
10650 20 7d 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e   }.        msp->
10660 6e 73 75 62 73 79 6d 2b 2b 3b 0a 20 20 20 20 20  nsubsym++;.     
10670 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d     msp->subsym =
10680 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20   (struct symbol 
10690 2a 2a 29 20 72 65 61 6c 6c 6f 63 28 6d 73 70 2d  **) realloc(msp-
106a0 3e 73 75 62 73 79 6d 2c 0a 20 20 20 20 20 20 20  >subsym,.       
106b0 20 20 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74     sizeof(struct
106c0 20 73 79 6d 62 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e   symbol*)*msp->n
106d0 73 75 62 73 79 6d 29 3b 0a 20 20 20 20 20 20 20  subsym);.       
106e0 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 6d 73 70   msp->subsym[msp
106f0 2d 3e 6e 73 75 62 73 79 6d 2d 31 5d 20 3d 20 53  ->nsubsym-1] = S
10700 79 6d 62 6f 6c 5f 6e 65 77 28 26 78 5b 31 5d 29  ymbol_new(&x[1])
10710 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
10720 6c 6f 77 65 72 28 78 5b 31 5d 29 20 7c 7c 20 69  lower(x[1]) || i
10730 73 6c 6f 77 65 72 28 6d 73 70 2d 3e 73 75 62 73  slower(msp->subs
10740 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 20  ym[0]->name[0]) 
10750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
10760 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
10770 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
10780 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
10790 20 20 22 43 61 6e 6e 6f 74 20 66 6f 72 6d 20 61    "Cannot form a
107a0 20 63 6f 6d 70 6f 75 6e 64 20 63 6f 6e 74 61 69   compound contai
107b0 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 65 72 6d 69  ning a non-termi
107c0 6e 61 6c 22 29 3b 0a 20 20 20 20 20 20 20 20 20  nal");.         
107d0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
107e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
107f0 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d    }else if( x[0]
10800 3d 3d 27 28 27 20 26 26 20 70 73 70 2d 3e 6e 72  =='(' && psp->nr
10810 68 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  hs>0 ){.        
10820 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 48 53  psp->state = RHS
10830 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20 20  _ALIAS_1;.      
10840 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
10850 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
10860 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
10870 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
10880 20 20 22 49 6c 6c 65 67 61 6c 20 63 68 61 72 61    "Illegal chara
10890 63 74 65 72 20 6f 6e 20 52 48 53 20 6f 66 20 72  cter on RHS of r
108a0 75 6c 65 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29  ule: \"%s\".",x)
108b0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
108c0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
108d0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
108e0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
108f0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
10900 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10910 20 20 63 61 73 65 20 52 48 53 5f 41 4c 49 41 53    case RHS_ALIAS
10920 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73  _1:.      if( is
10930 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
10940 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c 69 61         psp->alia
10950 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d  s[psp->nrhs-1] =
10960 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   x;.        psp-
10970 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49  >state = RHS_ALI
10980 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  AS_2;.      }els
10990 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
109a0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
109b0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
109c0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c  no,.          "\
109d0 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76  "%s\" is not a v
109e0 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74  alid alias for t
109f0 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 20 5c 22  he RHS symbol \"
10a00 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %s\"\n",.       
10a10 20 20 20 78 2c 70 73 70 2d 3e 72 68 73 5b 70 73     x,psp->rhs[ps
10a20 70 2d 3e 6e 72 68 73 2d 31 5d 2d 3e 6e 61 6d 65  p->nrhs-1]->name
10a30 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
10a40 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
10a50 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
10a60 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
10a70 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  LE_ERROR;.      
10a80 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
10a90 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c 49 41     case RHS_ALIA
10aa0 53 5f 32 3a 0a 20 20 20 20 20 20 69 66 28 20 78  S_2:.      if( x
10ab0 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20  [0]==')' ){.    
10ac0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
10ad0 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d   IN_RHS;.      }
10ae0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
10af0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
10b00 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
10b10 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
10b20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20   "Missing \")\" 
10b30 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c  following LHS al
10b40 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e  ias name \"%s\".
10b50 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29  ",psp->lhsalias)
10b60 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
10b70 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
10b80 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
10b90 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
10ba0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
10bb0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10bc0 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
10bd0 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3a  OR_DECL_KEYWORD:
10be0 0a 20 20 20 20 20 20 69 66 28 20 69 73 61 6c 70  .      if( isalp
10bf0 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ha(x[0]) ){.    
10c00 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6b 65 79      psp->declkey
10c10 77 6f 72 64 20 3d 20 78 3b 0a 20 20 20 20 20 20  word = x;.      
10c20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
10c30 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ot = 0;.        
10c40 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73  psp->decllinenos
10c50 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  lot = 0;.       
10c60 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
10c70 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20  Macro = 1;.     
10c80 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
10c90 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
10ca0 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20 69 66  _ARG;.        if
10cb0 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 61 6d 65  ( strcmp(x,"name
10cc0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10cd0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
10ce0 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
10cf0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
10d00 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e    psp->insertLin
10d10 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 09 7d 65 6c  eMacro = 0;..}el
10d20 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
10d30 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20 29 7b  "include")==0 ){
10d40 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10d50 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
10d60 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65  psp->gp->include
10d70 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  );..}else if( st
10d80 72 63 6d 70 28 78 2c 22 63 6f 64 65 22 29 3d 3d  rcmp(x,"code")==
10d90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10da0 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
10db0 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65 78 74  = &(psp->gp->ext
10dc0 72 61 63 6f 64 65 29 3b 0a 09 7d 65 6c 73 65 20  racode);..}else 
10dd0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f  if( strcmp(x,"to
10de0 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72 22 29  ken_destructor")
10df0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10e00 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10e10 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f  t = &psp->gp->to
10e20 6b 65 6e 64 65 73 74 3b 0a 09 7d 65 6c 73 65 20  kendest;..}else 
10e30 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65  if( strcmp(x,"de
10e40 66 61 75 6c 74 5f 64 65 73 74 72 75 63 74 6f 72  fault_destructor
10e50 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10e60 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
10e70 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
10e80 76 61 72 64 65 73 74 3b 0a 09 7d 65 6c 73 65 20  vardest;..}else 
10e90 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f  if( strcmp(x,"to
10ea0 6b 65 6e 5f 70 72 65 66 69 78 22 29 3d 3d 30 20  ken_prefix")==0 
10eb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
10ec0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
10ed0 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70  &psp->gp->tokenp
10ee0 72 65 66 69 78 3b 0a 20 20 20 20 20 20 20 20 20  refix;.         
10ef0 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
10f00 4d 61 63 72 6f 20 3d 20 30 3b 0a 09 7d 65 6c 73  Macro = 0;..}els
10f10 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10f20 73 79 6e 74 61 78 5f 65 72 72 6f 72 22 29 3d 3d  syntax_error")==
10f30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10f40 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
10f50 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65 72 72  = &(psp->gp->err
10f60 6f 72 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  or);..}else if( 
10f70 73 74 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f  strcmp(x,"parse_
10f80 61 63 63 65 70 74 22 29 3d 3d 30 20 29 7b 0a 20  accept")==0 ){. 
10f90 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
10fa0 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
10fb0 70 2d 3e 67 70 2d 3e 61 63 63 65 70 74 29 3b 0a  p->gp->accept);.
10fc0 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d  .}else if( strcm
10fd0 70 28 78 2c 22 70 61 72 73 65 5f 66 61 69 6c 75  p(x,"parse_failu
10fe0 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  re")==0 ){.     
10ff0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
11000 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
11010 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 09 7d 65  p->failure);..}e
11020 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
11030 2c 22 73 74 61 63 6b 5f 6f 76 65 72 66 6c 6f 77  ,"stack_overflow
11040 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
11050 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
11060 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
11070 3e 6f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  >overflow);.    
11080 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
11090 72 63 6d 70 28 78 2c 22 65 78 74 72 61 5f 61 72  rcmp(x,"extra_ar
110a0 67 75 6d 65 6e 74 22 29 3d 3d 30 20 29 7b 0a 20  gument")==0 ){. 
110b0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
110c0 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
110d0 70 2d 3e 67 70 2d 3e 61 72 67 29 3b 0a 20 20 20  p->gp->arg);.   
110e0 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
110f0 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
11100 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11110 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b  f( strcmp(x,"tok
11120 65 6e 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a  en_type")==0 ){.
11130 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
11140 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
11150 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 74 79 70  sp->gp->tokentyp
11160 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  e);.          ps
11170 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
11180 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
11190 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
111a0 28 78 2c 22 64 65 66 61 75 6c 74 5f 74 79 70 65  (x,"default_type
111b0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
111c0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
111d0 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
111e0 3e 76 61 72 74 79 70 65 29 3b 0a 20 20 20 20 20  >vartype);.     
111f0 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74       psp->insert
11200 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20  LineMacro = 0;. 
11210 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
11220 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63 6b   strcmp(x,"stack
11230 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20  _size")==0 ){.  
11240 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
11250 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
11260 2d 3e 67 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29  ->gp->stacksize)
11270 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
11280 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
11290 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
112a0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
112b0 2c 22 73 74 61 72 74 5f 73 79 6d 62 6f 6c 22 29  ,"start_symbol")
112c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
112d0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
112e0 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73  t = &(psp->gp->s
112f0 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tart);.         
11300 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
11310 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20  Macro = 0;.     
11320 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
11330 63 6d 70 28 78 2c 22 6c 65 66 74 22 29 3d 3d 30  cmp(x,"left")==0
11340 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
11350 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b  p->preccounter++
11360 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
11370 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4c 45 46  >declassoc = LEF
11380 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  T;.          psp
11390 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
113a0 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45  G_FOR_PRECEDENCE
113b0 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20  _SYMBOL;.       
113c0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
113d0 70 28 78 2c 22 72 69 67 68 74 22 29 3d 3d 30 20  p(x,"right")==0 
113e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
113f0 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b  ->preccounter++;
11400 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11410 64 65 63 6c 61 73 73 6f 63 20 3d 20 52 49 47 48  declassoc = RIGH
11420 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  T;.          psp
11430 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
11440 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45  G_FOR_PRECEDENCE
11450 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20  _SYMBOL;.       
11460 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
11470 70 28 78 2c 22 6e 6f 6e 61 73 73 6f 63 22 29 3d  p(x,"nonassoc")=
11480 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11490 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72  psp->preccounter
114a0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
114b0 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4e  p->declassoc = N
114c0 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ONE;.          p
114d0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
114e0 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
114f0 43 45 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73  CE_SYMBOL;..}els
11500 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
11510 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20  destructor")==0 
11520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
11530 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
11540 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52  G_FOR_DESTRUCTOR
11550 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20  _SYMBOL;..}else 
11560 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 79  if( strcmp(x,"ty
11570 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pe")==0 ){.     
11580 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11590 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41  = WAITING_FOR_DA
115a0 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3b 0a 20  TATYPE_SYMBOL;. 
115b0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
115c0 20 73 74 72 63 6d 70 28 78 2c 22 66 61 6c 6c 62   strcmp(x,"fallb
115d0 61 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ack")==0 ){.    
115e0 20 20 20 20 20 20 70 73 70 2d 3e 66 61 6c 6c 62        psp->fallb
115f0 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ack = 0;.       
11600 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
11610 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c  WAITING_FOR_FALL
11620 42 41 43 4b 5f 49 44 3b 0a 20 20 20 20 20 20 20  BACK_ID;.       
11630 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
11640 70 28 78 2c 22 77 69 6c 64 63 61 72 64 22 29 3d  p(x,"wildcard")=
11650 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11660 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
11670 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52  TING_FOR_WILDCAR
11680 44 5f 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65  D_ID;.        }e
11690 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 45  lse{.          E
116a0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
116b0 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
116c0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
116d0 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 64 65 63      "Unknown dec
116e0 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64  laration keyword
116f0 3a 20 5c 22 25 25 25 73 5c 22 2e 22 2c 78 29 3b  : \"%%%s\".",x);
11700 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11710 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
11720 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11730 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
11740 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20  DECL_ERROR;..}. 
11750 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11760 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
11770 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
11780 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
11790 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20         "Illegal 
117a0 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77  declaration keyw
117b0 6f 72 64 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29  ord: \"%s\".",x)
117c0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
117d0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
117e0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
117f0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
11800 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
11810 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11820 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
11830 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59  OR_DESTRUCTOR_SY
11840 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20  MBOL:.      if( 
11850 21 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29  !isalpha(x[0]) )
11860 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
11870 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
11880 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
11890 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 79  o,.          "Sy
118a0 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e  mbol name missin
118b0 67 20 61 66 74 65 72 20 25 25 64 65 73 74 72 75  g after %%destru
118c0 63 74 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b 0a  ctor keyword");.
118d0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
118e0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
118f0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
11900 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
11910 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
11920 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  se{.        stru
11930 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
11940 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20  Symbol_new(x);. 
11950 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
11960 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64  argslot = &sp->d
11970 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 20 20 20  estructor;.     
11980 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65     psp->declline
11990 6e 6f 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65  noslot = &sp->de
119a0 73 74 4c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  stLineno;.      
119b0 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e    psp->insertLin
119c0 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20 20  eMacro = 1;.    
119d0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
119e0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
119f0 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a 20  L_ARG;.      }. 
11a00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11a10 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
11a20 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c  _DATATYPE_SYMBOL
11a30 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 61  :.      if( !isa
11a40 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20  lpha(x[0]) ){.  
11a50 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11a60 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11a70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
11a80 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c           "Symbol
11a90 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61 66   name missing af
11aa0 74 65 72 20 25 25 74 79 70 65 20 6b 65 79 77 6f  ter %%type keywo
11ab0 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  rd");.        ps
11ac0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
11ad0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11ae0 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
11af0 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  _DECL_ERROR;.   
11b00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11b10 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
11b20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e  *sp = Symbol_fin
11b30 64 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  d(x);.        if
11b40 28 28 73 70 29 20 26 26 20 28 73 70 2d 3e 64 61  ((sp) && (sp->da
11b50 74 61 74 79 70 65 29 29 7b 0a 20 20 20 20 20 20  tatype)){.      
11b60 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
11b70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
11b80 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
11b90 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c           "Symbol
11ba0 20 25 25 74 79 70 65 20 5c 22 25 73 5c 22 20 61   %%type \"%s\" a
11bb0 6c 72 65 61 64 79 20 64 65 66 69 6e 65 64 22 2c  lready defined",
11bc0 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   x);.          p
11bd0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11be0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
11bf0 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
11c00 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a  TER_DECL_ERROR;.
11c10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
11c20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 73 70           if (!sp
11c30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
11c40 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  p = Symbol_new(x
11c50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
11c60 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
11c70 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d  clargslot = &sp-
11c80 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20 20  >datatype;.     
11c90 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74       psp->insert
11ca0 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20  LineMacro = 0;. 
11cb0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
11cc0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
11cd0 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20  R_DECL_ARG;.    
11ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11cf0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
11d00 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
11d10 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
11d20 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  L:.      if( x[0
11d30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  ]=='.' ){.      
11d40 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
11d50 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
11d60 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d  OR_RULE;.      }
11d70 65 6c 73 65 20 69 66 28 20 69 73 75 70 70 65 72  else if( isupper
11d80 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
11d90 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
11da0 2a 73 70 3b 0a 20 20 20 20 20 20 20 20 73 70 20  *sp;.        sp 
11db0 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
11dc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d  .        if( sp-
11dd0 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20  >prec>=0 ){.    
11de0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11df0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11e00 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
11e10 20 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62             "Symb
11e20 6f 6c 20 5c 22 25 73 5c 22 20 68 61 73 20 61 6c  ol \"%s\" has al
11e30 72 65 61 64 79 20 62 65 20 67 69 76 65 6e 20 61  ready be given a
11e40 20 70 72 65 63 65 64 65 6e 63 65 2e 22 2c 78 29   precedence.",x)
11e50 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
11e60 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 09 7d 65  >errorcnt++;..}e
11e70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
11e80 70 2d 3e 70 72 65 63 20 3d 20 70 73 70 2d 3e 70  p->prec = psp->p
11e90 72 65 63 63 6f 75 6e 74 65 72 3b 0a 20 20 20 20  reccounter;.    
11ea0 20 20 20 20 20 20 73 70 2d 3e 61 73 73 6f 63 20        sp->assoc 
11eb0 3d 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63  = psp->declassoc
11ec0 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65  ;..}.      }else
11ed0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
11ee0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
11ef0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
11f00 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 61  o,.          "Ca
11f10 6e 27 74 20 61 73 73 69 67 6e 20 61 20 70 72 65  n't assign a pre
11f20 63 65 64 65 6e 63 65 20 74 6f 20 5c 22 25 73 5c  cedence to \"%s\
11f30 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20  ".",x);.        
11f40 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
11f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
11f60 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
11f70 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
11f80 41 52 47 3a 0a 20 20 20 20 20 20 69 66 28 20 78  ARG:.      if( x
11f90 5b 30 5d 3d 3d 27 7b 27 20 7c 7c 20 78 5b 30 5d  [0]=='{' || x[0]
11fa0 3d 3d 27 5c 22 27 20 7c 7c 20 69 73 61 6c 6e 75  =='\"' || isalnu
11fb0 6d 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  m(x[0]) ){.     
11fc0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11fd0 4f 6c 64 2c 20 2a 7a 4e 65 77 3b 0a 20 20 20 20  Old, *zNew;.    
11fe0 20 20 20 20 63 68 61 72 20 2a 7a 42 75 66 2c 20      char *zBuf, 
11ff0 2a 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  *z;.        int 
12000 6e 4f 6c 64 2c 20 6e 2c 20 6e 4c 69 6e 65 2c 20  nOld, n, nLine, 
12010 6e 4e 65 77 2c 20 6e 42 61 63 6b 3b 0a 20 20 20  nNew, nBack;.   
12020 20 20 20 20 20 69 6e 74 20 61 64 64 4c 69 6e 65       int addLine
12030 4d 61 63 72 6f 3b 0a 20 20 20 20 20 20 20 20 63  Macro;.        c
12040 68 61 72 20 7a 4c 69 6e 65 5b 35 30 5d 3b 0a 20  har zLine[50];. 
12050 20 20 20 20 20 20 20 7a 4e 65 77 20 3d 20 78 3b         zNew = x;
12060 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 65  .        if( zNe
12070 77 5b 30 5d 3d 3d 27 22 27 20 7c 7c 20 7a 4e 65  w[0]=='"' || zNe
12080 77 5b 30 5d 3d 3d 27 7b 27 20 29 20 7a 4e 65 77  w[0]=='{' ) zNew
12090 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 4e 65 77  ++;.        nNew
120a0 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a   = lemonStrlen(z
120b0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66  New);.        if
120c0 28 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73  ( *psp->declargs
120d0 6c 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lot ){.         
120e0 20 7a 4f 6c 64 20 3d 20 2a 70 73 70 2d 3e 64 65   zOld = *psp->de
120f0 63 6c 61 72 67 73 6c 6f 74 3b 0a 20 20 20 20 20  clargslot;.     
12100 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12110 20 20 20 20 7a 4f 6c 64 20 3d 20 22 22 3b 0a 20      zOld = "";. 
12120 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12130 20 6e 4f 6c 64 20 3d 20 6c 65 6d 6f 6e 53 74 72   nOld = lemonStr
12140 6c 65 6e 28 7a 4f 6c 64 29 3b 0a 20 20 20 20 20  len(zOld);.     
12150 20 20 20 6e 20 3d 20 6e 4f 6c 64 20 2b 20 6e 4e     n = nOld + nN
12160 65 77 20 2b 20 32 30 3b 0a 20 20 20 20 20 20 20  ew + 20;.       
12170 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20 3d 20   addLineMacro = 
12180 21 70 73 70 2d 3e 67 70 2d 3e 6e 6f 6c 69 6e 65  !psp->gp->noline
12190 6e 6f 73 66 6c 61 67 20 26 26 20 70 73 70 2d 3e  nosflag && psp->
121a0 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
121b0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
121c0 20 20 20 20 20 20 20 20 20 20 20 28 70 73 70 2d             (psp-
121d0 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3d  >decllinenoslot=
121e0 3d 30 20 7c 7c 20 70 73 70 2d 3e 64 65 63 6c 6c  =0 || psp->decll
121f0 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 21 3d 30 29  inenoslot[0]!=0)
12200 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  ;.        if( ad
12210 64 4c 69 6e 65 4d 61 63 72 6f 20 29 7b 0a 20 20  dLineMacro ){.  
12220 20 20 20 20 20 20 20 20 66 6f 72 28 7a 3d 70 73          for(z=ps
12230 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 6e 42 61  p->filename, nBa
12240 63 6b 3d 30 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a  ck=0; *z; z++){.
12250 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
12260 2a 7a 3d 3d 27 5c 5c 27 20 29 20 6e 42 61 63 6b  *z=='\\' ) nBack
12270 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
12280 20 20 20 20 20 20 20 20 20 20 73 70 72 69 6e 74            sprint
12290 66 28 7a 4c 69 6e 65 2c 20 22 23 6c 69 6e 65 20  f(zLine, "#line 
122a0 25 64 20 22 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e  %d ", psp->token
122b0 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 20  lineno);.       
122c0 20 20 20 6e 4c 69 6e 65 20 3d 20 6c 65 6d 6f 6e     nLine = lemon
122d0 53 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20  Strlen(zLine);. 
122e0 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 6e 4c           n += nL
122f0 69 6e 65 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65  ine + lemonStrle
12300 6e 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  n(psp->filename)
12310 20 2b 20 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20   + nBack;.      
12320 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 73 70    }.        *psp
12330 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
12340 28 63 68 61 72 20 2a 29 20 72 65 61 6c 6c 6f 63  (char *) realloc
12350 28 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c  (*psp->declargsl
12360 6f 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  ot, n);.        
12370 7a 42 75 66 20 3d 20 2a 70 73 70 2d 3e 64 65 63  zBuf = *psp->dec
12380 6c 61 72 67 73 6c 6f 74 20 2b 20 6e 4f 6c 64 3b  largslot + nOld;
12390 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
123a0 4c 69 6e 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20  LineMacro ){.   
123b0 20 20 20 20 20 20 20 69 66 28 20 6e 4f 6c 64 20         if( nOld 
123c0 26 26 20 7a 42 75 66 5b 2d 31 5d 21 3d 27 5c 6e  && zBuf[-1]!='\n
123d0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
123e0 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e   *(zBuf++) = '\n
123f0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ';.          }. 
12400 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
12410 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 6e 4c 69  zBuf, zLine, nLi
12420 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ne);.          z
12430 42 75 66 20 2b 3d 20 6e 4c 69 6e 65 3b 0a 20 20  Buf += nLine;.  
12440 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b          *(zBuf++
12450 29 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 20  ) = '"';.       
12460 20 20 20 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69     for(z=psp->fi
12470 6c 65 6e 61 6d 65 3b 20 2a 7a 3b 20 7a 2b 2b 29  lename; *z; z++)
12480 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
12490 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20  ( *z=='\\' ){.  
124a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42              *(zB
124b0 75 66 2b 2b 29 20 3d 20 27 5c 5c 27 3b 0a 20 20  uf++) = '\\';.  
124c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
124d0 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b          *(zBuf++
124e0 29 20 3d 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20  ) = *z;.        
124f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2a 28    }.          *(
12500 7a 42 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20  zBuf++) = '"';. 
12510 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b           *(zBuf+
12520 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20  +) = '\n';.     
12530 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
12540 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f   psp->decllineno
12550 73 6c 6f 74 20 26 26 20 70 73 70 2d 3e 64 65 63  slot && psp->dec
12560 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 3d 3d  llinenoslot[0]==
12570 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
12580 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
12590 6f 74 5b 30 5d 20 3d 20 70 73 70 2d 3e 74 6f 6b  ot[0] = psp->tok
125a0 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  enlineno;.      
125b0 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63    }.        memc
125c0 70 79 28 7a 42 75 66 2c 20 7a 4e 65 77 2c 20 6e  py(zBuf, zNew, n
125d0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7a 42  New);.        zB
125e0 75 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  uf += nNew;.    
125f0 20 20 20 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20      *zBuf = 0;. 
12600 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12610 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
12620 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
12630 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12640 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
12650 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
12660 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
12670 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 61        "Illegal a
12680 72 67 75 6d 65 6e 74 20 74 6f 20 25 25 25 73 3a  rgument to %%%s:
12690 20 25 73 22 2c 70 73 70 2d 3e 64 65 63 6c 6b 65   %s",psp->declke
126a0 79 77 6f 72 64 2c 78 29 3b 0a 20 20 20 20 20 20  yword,x);.      
126b0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
126c0 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
126d0 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
126e0 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
126f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
12700 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
12710 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42  AITING_FOR_FALLB
12720 41 43 4b 5f 49 44 3a 0a 20 20 20 20 20 20 69 66  ACK_ID:.      if
12730 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
12740 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12750 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
12760 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
12770 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69      }else if( !i
12780 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a  supper(x[0]) ){.
12790 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
127a0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
127b0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
127c0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 25 66  ,.          "%%f
127d0 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74  allback argument
127e0 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62   \"%s\" should b
127f0 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a  e a token", x);.
12800 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
12810 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
12820 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
12830 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
12840 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
12850 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70  .        if( psp
12860 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b  ->fallback==0 ){
12870 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12880 66 61 6c 6c 62 61 63 6b 20 3d 20 73 70 3b 0a 20  fallback = sp;. 
12890 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
128a0 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 29 7b   sp->fallback ){
128b0 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
128c0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
128d0 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
128e0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
128f0 20 22 4d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20   "More than one 
12900 66 61 6c 6c 62 61 63 6b 20 61 73 73 69 67 6e 65  fallback assigne
12910 64 20 74 6f 20 74 6f 6b 65 6e 20 25 73 22 2c 20  d to token %s", 
12920 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
12930 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
12940 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
12950 20 20 20 20 20 20 20 20 73 70 2d 3e 66 61 6c 6c          sp->fall
12960 62 61 63 6b 20 3d 20 70 73 70 2d 3e 66 61 6c 6c  back = psp->fall
12970 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  back;.          
12980 70 73 70 2d 3e 67 70 2d 3e 68 61 73 5f 66 61 6c  psp->gp->has_fal
12990 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  lback = 1;.     
129a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
129b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
129c0 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57  se WAITING_FOR_W
129d0 49 4c 44 43 41 52 44 5f 49 44 3a 0a 20 20 20 20  ILDCARD_ID:.    
129e0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
129f0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
12a00 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
12a10 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
12a20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
12a30 28 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d 29  ( !isupper(x[0])
12a40 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
12a50 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
12a60 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
12a70 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
12a80 22 25 25 77 69 6c 64 63 61 72 64 20 61 72 67 75  "%%wildcard argu
12a90 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75  ment \"%s\" shou
12aa0 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20  ld be a token", 
12ab0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
12ac0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
12ad0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12ae0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
12af0 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  *sp = Symbol_new
12b00 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (x);.        if(
12b10 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61   psp->gp->wildca
12b20 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rd==0 ){.       
12b30 20 20 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64     psp->gp->wild
12b40 63 61 72 64 20 3d 20 73 70 3b 0a 20 20 20 20 20  card = sp;.     
12b50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12b60 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
12b70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d  ->filename, psp-
12b80 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
12b90 20 20 20 20 20 20 20 20 20 20 22 45 78 74 72 61            "Extra
12ba0 20 77 69 6c 64 63 61 72 64 20 74 6f 20 74 6f 6b   wildcard to tok
12bb0 65 6e 3a 20 25 73 22 2c 20 78 29 3b 0a 20 20 20  en: %s", x);.   
12bc0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
12bd0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
12be0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
12bf0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
12c00 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
12c10 45 5f 45 52 52 4f 52 3a 0a 2f 2a 20 20 20 20 20  E_ERROR:./*     
12c20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
12c30 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
12c40 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
12c50 52 5f 52 55 4c 45 3b 0a 2a 2a 20 20 20 20 20 20  R_RULE;.**      
12c60 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 63 61  break; */.    ca
12c70 73 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f  se RESYNC_AFTER_
12c80 44 45 43 4c 5f 45 52 52 4f 52 3a 0a 20 20 20 20  DECL_ERROR:.    
12c90 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
12ca0 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57  ) psp->state = W
12cb0 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
12cc0 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 69  OR_RULE;.      i
12cd0 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 20 70  f( x[0]=='%' ) p
12ce0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
12cf0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59  ING_FOR_DECL_KEY
12d00 57 4f 52 44 3b 0a 20 20 20 20 20 20 62 72 65 61  WORD;.      brea
12d10 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e  k;.  }.}../* Run
12d20 20 74 68 65 20 70 72 65 70 72 6f 63 65 73 73 6f   the preprocesso
12d30 72 20 6f 76 65 72 20 74 68 65 20 69 6e 70 75 74  r over the input
12d40 20 66 69 6c 65 20 74 65 78 74 2e 20 20 54 68 65   file text.  The
12d50 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
12d60 73 0a 2a 2a 20 61 7a 44 65 66 69 6e 65 5b 30 5d  s.** azDefine[0]
12d70 20 74 68 72 6f 75 67 68 20 61 7a 44 65 66 69 6e   through azDefin
12d80 65 5b 6e 44 65 66 69 6e 65 2d 31 5d 20 63 6f 6e  e[nDefine-1] con
12d90 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20  tains the names 
12da0 6f 66 20 61 6c 6c 20 64 65 66 69 6e 65 64 0a 2a  of all defined.*
12db0 2a 20 6d 61 63 72 6f 73 2e 20 20 54 68 69 73 20  * macros.  This 
12dc0 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 66 6f  routine looks fo
12dd0 72 20 22 25 69 66 64 65 66 22 20 61 6e 64 20 22  r "%ifdef" and "
12de0 25 69 66 6e 64 65 66 22 20 61 6e 64 20 22 25 65  %ifndef" and "%e
12df0 6e 64 69 66 22 20 61 6e 64 0a 2a 2a 20 63 6f 6d  ndif" and.** com
12e00 6d 65 6e 74 73 20 74 68 65 6d 20 6f 75 74 2e 20  ments them out. 
12e10 20 54 65 78 74 20 69 6e 20 62 65 74 77 65 65 6e   Text in between
12e20 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74   is also comment
12e30 65 64 20 6f 75 74 20 61 73 20 61 70 70 72 6f 70  ed out as approp
12e40 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
12e50 20 76 6f 69 64 20 70 72 65 70 72 6f 63 65 73 73   void preprocess
12e60 5f 69 6e 70 75 74 28 63 68 61 72 20 2a 7a 29 7b  _input(char *z){
12e70 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20  .  int i, j, k, 
12e80 6e 3b 0a 20 20 69 6e 74 20 65 78 63 6c 75 64 65  n;.  int exclude
12e90 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 74 61 72   = 0;.  int star
12ea0 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 69 6e  t = 0;.  int lin
12eb0 65 6e 6f 20 3d 20 31 3b 0a 20 20 69 6e 74 20 73  eno = 1;.  int s
12ec0 74 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20 31 3b  tart_lineno = 1;
12ed0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d  .  for(i=0; z[i]
12ee0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
12ef0 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  z[i]=='\n' ) lin
12f00 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a  eno++;.    if( z
12f10 5b 69 5d 21 3d 27 25 27 20 7c 7c 20 28 69 3e 30  [i]!='%' || (i>0
12f20 20 26 26 20 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27   && z[i-1]!='\n'
12f30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
12f40 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 26 7a    if( strncmp(&z
12f50 5b 69 5d 2c 22 25 65 6e 64 69 66 22 2c 36 29 3d  [i],"%endif",6)=
12f60 3d 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b  =0 && isspace(z[
12f70 69 2b 36 5d 29 20 29 7b 0a 20 20 20 20 20 20 69  i+6]) ){.      i
12f80 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20  f( exclude ){.  
12f90 20 20 20 20 20 20 65 78 63 6c 75 64 65 2d 2d 3b        exclude--;
12fa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78 63  .        if( exc
12fb0 6c 75 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lude==0 ){.     
12fc0 20 20 20 20 20 66 6f 72 28 6a 3d 73 74 61 72 74       for(j=start
12fd0 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 20 69 66 28 20  ; j<i; j++) if( 
12fe0 7a 5b 6a 5d 21 3d 27 5c 6e 27 20 29 20 7a 5b 6a  z[j]!='\n' ) z[j
12ff0 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
13000 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
13010 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26   for(j=i; z[j] &
13020 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b  & z[j]!='\n'; j+
13030 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20  +) z[j] = ' ';. 
13040 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 73 74     }else if( (st
13050 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66  rncmp(&z[i],"%if
13060 64 65 66 22 2c 36 29 3d 3d 30 20 26 26 20 69 73  def",6)==0 && is
13070 73 70 61 63 65 28 7a 5b 69 2b 36 5d 29 29 0a 20  space(z[i+6])). 
13080 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 74 72           || (str
13090 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 6e  ncmp(&z[i],"%ifn
130a0 64 65 66 22 2c 37 29 3d 3d 30 20 26 26 20 69 73  def",7)==0 && is
130b0 73 70 61 63 65 28 7a 5b 69 2b 37 5d 29 29 20 29  space(z[i+7])) )
130c0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78 63 6c  {.      if( excl
130d0 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ude ){.        e
130e0 78 63 6c 75 64 65 2b 2b 3b 0a 20 20 20 20 20 20  xclude++;.      
130f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
13100 6f 72 28 6a 3d 69 2b 37 3b 20 69 73 73 70 61 63  or(j=i+7; isspac
13110 65 28 7a 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a  e(z[j]); j++){}.
13120 20 20 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b          for(n=0;
13130 20 7a 5b 6a 2b 6e 5d 20 26 26 20 21 69 73 73 70   z[j+n] && !issp
13140 61 63 65 28 7a 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b  ace(z[j+n]); n++
13150 29 7b 7d 0a 20 20 20 20 20 20 20 20 65 78 63 6c  ){}.        excl
13160 75 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ude = 1;.       
13170 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 44 65 66   for(k=0; k<nDef
13180 69 6e 65 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  ine; k++){.     
13190 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
131a0 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 2c 26 7a 5b  (azDefine[k],&z[
131b0 6a 5d 2c 6e 29 3d 3d 30 20 26 26 20 6c 65 6d 6f  j],n)==0 && lemo
131c0 6e 53 74 72 6c 65 6e 28 61 7a 44 65 66 69 6e 65  nStrlen(azDefine
131d0 5b 6b 5d 29 3d 3d 6e 20 29 7b 0a 20 20 20 20 20  [k])==n ){.     
131e0 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 20 3d         exclude =
131f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
13200 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
13210 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
13220 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 33 5d 3d       if( z[i+3]=
13230 3d 27 6e 27 20 29 20 65 78 63 6c 75 64 65 20 3d  ='n' ) exclude =
13240 20 21 65 78 63 6c 75 64 65 3b 0a 20 20 20 20 20   !exclude;.     
13250 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29     if( exclude )
13260 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72  {.          star
13270 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
13280 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20   start_lineno = 
13290 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20  lineno;.        
132a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
132b0 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26  for(j=i; z[j] &&
132c0 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b   z[j]!='\n'; j++
132d0 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20  ) z[j] = ' ';.  
132e0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 78    }.  }.  if( ex
132f0 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 66 70 72  clude ){.    fpr
13300 69 6e 74 66 28 73 74 64 65 72 72 2c 22 75 6e 74  intf(stderr,"unt
13310 65 72 6d 69 6e 61 74 65 64 20 25 25 69 66 64 65  erminated %%ifde
13320 66 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 6c 69  f starting on li
13330 6e 65 20 25 64 5c 6e 22 2c 20 73 74 61 72 74 5f  ne %d\n", start_
13340 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 65 78 69  lineno);.    exi
13350 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  t(1);.  }.}../* 
13360 49 6e 20 73 70 69 74 65 20 6f 66 20 69 74 73 20  In spite of its 
13370 6e 61 6d 65 2c 20 74 68 69 73 20 66 75 6e 63 74  name, this funct
13380 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ion is really a 
13390 73 63 61 6e 6e 65 72 2e 20 20 49 74 20 72 65 61  scanner.  It rea
133a0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 65 6e 74 69  d.** in the enti
133b0 72 65 20 69 6e 70 75 74 20 66 69 6c 65 20 28 61  re input file (a
133c0 6c 6c 20 61 74 20 6f 6e 63 65 29 20 74 68 65 6e  ll at once) then
133d0 20 74 6f 6b 65 6e 69 7a 65 73 20 69 74 2e 20 20   tokenizes it.  
133e0 45 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20 69 73  Each.** token is
133f0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 66   passed to the f
13400 75 6e 63 74 69 6f 6e 20 22 70 61 72 73 65 6f 6e  unction "parseon
13410 65 74 6f 6b 65 6e 22 20 77 68 69 63 68 20 62 75  etoken" which bu
13420 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20 74 68 65 20  ilds all.** the 
13430 61 70 70 72 6f 70 72 69 61 74 65 20 64 61 74 61  appropriate data
13440 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74   structures in t
13450 68 65 20 67 6c 6f 62 61 6c 20 73 74 61 74 65 20  he global state 
13460 76 65 63 74 6f 72 20 22 67 70 22 2e 0a 2a 2f 0a  vector "gp"..*/.
13470 76 6f 69 64 20 50 61 72 73 65 28 73 74 72 75 63  void Parse(struc
13480 74 20 6c 65 6d 6f 6e 20 2a 67 70 29 0a 7b 0a 20  t lemon *gp).{. 
13490 20 73 74 72 75 63 74 20 70 73 74 61 74 65 20 70   struct pstate p
134a0 73 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 20  s;.  FILE *fp;. 
134b0 20 63 68 61 72 20 2a 66 69 6c 65 62 75 66 3b 0a   char *filebuf;.
134c0 20 20 69 6e 74 20 66 69 6c 65 73 69 7a 65 3b 0a    int filesize;.
134d0 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 3b 0a 20 20    int lineno;.  
134e0 69 6e 74 20 63 3b 0a 20 20 63 68 61 72 20 2a 63  int c;.  char *c
134f0 70 2c 20 2a 6e 65 78 74 63 70 3b 0a 20 20 69 6e  p, *nextcp;.  in
13500 74 20 73 74 61 72 74 6c 69 6e 65 20 3d 20 30 3b  t startline = 0;
13510 0a 0a 20 20 6d 65 6d 73 65 74 28 26 70 73 2c 20  ..  memset(&ps, 
13520 27 5c 30 27 2c 20 73 69 7a 65 6f 66 28 70 73 29  '\0', sizeof(ps)
13530 29 3b 0a 20 20 70 73 2e 67 70 20 3d 20 67 70 3b  );.  ps.gp = gp;
13540 0a 20 20 70 73 2e 66 69 6c 65 6e 61 6d 65 20 3d  .  ps.filename =
13550 20 67 70 2d 3e 66 69 6c 65 6e 61 6d 65 3b 0a 20   gp->filename;. 
13560 20 70 73 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30   ps.errorcnt = 0
13570 3b 0a 20 20 70 73 2e 73 74 61 74 65 20 3d 20 49  ;.  ps.state = I
13580 4e 49 54 49 41 4c 49 5a 45 3b 0a 0a 20 20 2f 2a  NITIALIZE;..  /*
13590 20 42 65 67 69 6e 20 62 79 20 72 65 61 64 69 6e   Begin by readin
135a0 67 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  g the input file
135b0 20 2a 2f 0a 20 20 66 70 20 3d 20 66 6f 70 65 6e   */.  fp = fopen
135c0 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 22 72 62  (ps.filename,"rb
135d0 22 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20  ");.  if( fp==0 
135e0 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28  ){.    ErrorMsg(
135f0 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43  ps.filename,0,"C
13600 61 6e 27 74 20 6f 70 65 6e 20 74 68 69 73 20 66  an't open this f
13610 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
13620 22 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f  ");.    gp->erro
13630 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
13640 72 6e 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28  rn;.  }.  fseek(
13650 66 70 2c 30 2c 32 29 3b 0a 20 20 66 69 6c 65 73  fp,0,2);.  files
13660 69 7a 65 20 3d 20 66 74 65 6c 6c 28 66 70 29 3b  ize = ftell(fp);
13670 0a 20 20 72 65 77 69 6e 64 28 66 70 29 3b 0a 20  .  rewind(fp);. 
13680 20 66 69 6c 65 62 75 66 20 3d 20 28 63 68 61 72   filebuf = (char
13690 20 2a 29 6d 61 6c 6c 6f 63 28 20 66 69 6c 65 73   *)malloc( files
136a0 69 7a 65 2b 31 20 29 3b 0a 20 20 69 66 28 20 66  ize+1 );.  if( f
136b0 69 6c 65 62 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ilebuf==0 ){.   
136c0 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c   ErrorMsg(ps.fil
136d0 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 61  ename,0,"Can't a
136e0 6c 6c 6f 63 61 74 65 20 25 64 20 6f 66 20 6d 65  llocate %d of me
136f0 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 69  mory to hold thi
13700 73 20 66 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20  s file.",.      
13710 66 69 6c 65 73 69 7a 65 2b 31 29 3b 0a 20 20 20  filesize+1);.   
13720 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b   gp->errorcnt++;
13730 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b  .    fclose(fp);
13740 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
13750 0a 20 20 69 66 28 20 66 72 65 61 64 28 66 69 6c  .  if( fread(fil
13760 65 62 75 66 2c 31 2c 66 69 6c 65 73 69 7a 65 2c  ebuf,1,filesize,
13770 66 70 29 21 3d 66 69 6c 65 73 69 7a 65 20 29 7b  fp)!=filesize ){
13780 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73  .    ErrorMsg(ps
13790 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e  .filename,0,"Can
137a0 27 74 20 72 65 61 64 20 69 6e 20 61 6c 6c 20 25  't read in all %
137b0 64 20 62 79 74 65 73 20 6f 66 20 74 68 69 73 20  d bytes of this 
137c0 66 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66 69  file.",.      fi
137d0 6c 65 73 69 7a 65 29 3b 0a 20 20 20 20 66 72 65  lesize);.    fre
137e0 65 28 66 69 6c 65 62 75 66 29 3b 0a 20 20 20 20  e(filebuf);.    
137f0 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  gp->errorcnt++;.
13800 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a      fclose(fp);.
13810 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
13820 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20    fclose(fp);.  
13830 66 69 6c 65 62 75 66 5b 66 69 6c 65 73 69 7a 65  filebuf[filesize
13840 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  ] = 0;..  /* Mak
13850 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 70 61 73  e an initial pas
13860 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69  s through the fi
13870 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 25 69 66  le to handle %if
13880 64 65 66 20 61 6e 64 20 25 69 66 6e 64 65 66 20  def and %ifndef 
13890 2a 2f 0a 20 20 70 72 65 70 72 6f 63 65 73 73 5f  */.  preprocess_
138a0 69 6e 70 75 74 28 66 69 6c 65 62 75 66 29 3b 0a  input(filebuf);.
138b0 0a 20 20 2f 2a 20 4e 6f 77 20 73 63 61 6e 20 74  .  /* Now scan t
138c0 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 69  he text of the i
138d0 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 6c  nput file */.  l
138e0 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72  ineno = 1;.  for
138f0 28 63 70 3d 66 69 6c 65 62 75 66 3b 20 28 63 3d  (cp=filebuf; (c=
13900 20 2a 63 70 29 21 3d 30 3b 20 29 7b 0a 20 20 20   *cp)!=0; ){.   
13910 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
13920 69 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20 20 20 20  ineno++;        
13930 20 20 20 20 20 20 2f 2a 20 4b 65 65 70 20 74 72        /* Keep tr
13940 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20  ack of the line 
13950 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 66  number */.    if
13960 28 20 69 73 73 70 61 63 65 28 63 29 20 29 7b 20  ( isspace(c) ){ 
13970 63 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b 20  cp++; continue; 
13980 7d 20 20 2f 2a 20 53 6b 69 70 20 61 6c 6c 20 77  }  /* Skip all w
13990 68 69 74 65 20 73 70 61 63 65 20 2a 2f 0a 20 20  hite space */.  
139a0 20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20    if( c=='/' && 
139b0 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 20  cp[1]=='/' ){   
139c0 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43         /* Skip C
139d0 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74  ++ style comment
139e0 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32  s */.      cp+=2
139f0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  ;.      while( (
13a00 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21  c= *cp)!=0 && c!
13a10 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20  ='\n' ) cp++;.  
13a20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
13a30 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27    }.    if( c=='
13a40 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27  /' && cp[1]=='*'
13a50 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   ){          /* 
13a60 53 6b 69 70 20 43 20 73 74 79 6c 65 20 63 6f 6d  Skip C style com
13a70 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63  ments */.      c
13a80 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c  p+=2;.      whil
13a90 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  e( (c= *cp)!=0 &
13aa0 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 63 70 5b  & (c!='/' || cp[
13ab0 2d 31 5d 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20  -1]!='*') ){.   
13ac0 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
13ad0 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20   ) lineno++;.   
13ae0 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20       cp++;.     
13af0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 20 29   }.      if( c )
13b00 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e   cp++;.      con
13b10 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
13b20 20 70 73 2e 74 6f 6b 65 6e 73 74 61 72 74 20 3d   ps.tokenstart =
13b30 20 63 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   cp;            
13b40 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20      /* Mark the 
13b50 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
13b60 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 73   token */.    ps
13b70 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d 20 6c  .tokenlineno = l
13b80 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  ineno;          
13b90 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 6f   /* Linenumber o
13ba0 6e 20 77 68 69 63 68 20 74 6f 6b 65 6e 20 62 65  n which token be
13bb0 67 69 6e 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  gins */.    if( 
13bc0 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 20 20  c=='\"' ){      
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13be0 2a 20 53 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  * String literal
13bf0 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b  s */.      cp++;
13c00 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
13c10 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d  = *cp)!=0 && c!=
13c20 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\"' ){.        
13c30 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
13c40 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
13c50 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  cp++;.      }.  
13c60 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
13c70 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
13c80 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 73 74 61  (ps.filename,sta
13c90 72 74 6c 69 6e 65 2c 0a 22 53 74 72 69 6e 67 20  rtline,."String 
13ca0 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73  starting on this
13cb0 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72   line is not ter
13cc0 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74  minated before t
13cd0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
13ce0 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  le.");.        p
13cf0 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  s.errorcnt++;.  
13d00 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
13d10 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  p;.      }else{.
13d20 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d          nextcp =
13d30 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20   cp+1;.      }. 
13d40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
13d50 27 7b 27 20 29 7b 20 20 20 20 20 20 20 20 20 20  '{' ){          
13d60 20 20 20 20 20 2f 2a 20 41 20 62 6c 6f 63 6b 20       /* A block 
13d70 6f 66 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 20  of C code */.   
13d80 20 20 20 69 6e 74 20 6c 65 76 65 6c 3b 0a 20 20     int level;.  
13d90 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20      cp++;.      
13da0 66 6f 72 28 6c 65 76 65 6c 3d 31 3b 20 28 63 3d  for(level=1; (c=
13db0 20 2a 63 70 29 21 3d 30 20 26 26 20 28 6c 65 76   *cp)!=0 && (lev
13dc0 65 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d 27 29 3b  el>1 || c!='}');
13dd0 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   cp++){.        
13de0 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
13df0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
13e00 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27 20  else if( c=='{' 
13e10 29 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20  ) level++;.     
13e20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27     else if( c=='
13e30 7d 27 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a 20 20  }' ) level--;.  
13e40 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63        else if( c
13e50 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d  =='/' && cp[1]==
13e60 27 2a 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20  '*' ){  /* Skip 
13e70 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  comments */.    
13e80 20 20 20 20 20 20 69 6e 74 20 70 72 65 76 63 3b        int prevc;
13e90 0a 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20  .          cp = 
13ea0 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  &cp[2];.        
13eb0 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20    prevc = 0;.   
13ec0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
13ed0 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21  = *cp)!=0 && (c!
13ee0 3d 27 2f 27 20 7c 7c 20 70 72 65 76 63 21 3d 27  ='/' || prevc!='
13ef0 2a 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  *') ){.         
13f00 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
13f10 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
13f20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 63         prevc = c
13f30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 70  ;.            cp
13f40 2b 2b 3b 0a 09 20 20 7d 0a 09 7d 65 6c 73 65 20  ++;..  }..}else 
13f50 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70  if( c=='/' && cp
13f60 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20  [1]=='/' ){  /* 
13f70 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63  Skip C++ style c
13f80 6f 6d 6d 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20  omments too */. 
13f90 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 26 63           cp = &c
13fa0 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  p[2];.          
13fb0 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
13fc0 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20  =0 && c!='\n' ) 
13fd0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  cp++;.          
13fe0 69 66 28 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b  if( c ) lineno++
13ff0 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  ;..}else if( c==
14000 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 5c 22 27 20  '\'' || c=='\"' 
14010 29 7b 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20  ){    /* String 
14020 61 20 63 68 61 72 61 63 74 65 72 20 6c 69 74 65  a character lite
14030 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rals */.        
14040 20 20 69 6e 74 20 73 74 61 72 74 63 68 61 72 2c    int startchar,
14050 20 70 72 65 76 63 3b 0a 20 20 20 20 20 20 20 20   prevc;.        
14060 20 20 73 74 61 72 74 63 68 61 72 20 3d 20 63 3b    startchar = c;
14070 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63  .          prevc
14080 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
14090 66 6f 72 28 63 70 2b 2b 3b 20 28 63 3d 20 2a 63  for(cp++; (c= *c
140a0 70 29 21 3d 30 20 26 26 20 28 63 21 3d 73 74 61  p)!=0 && (c!=sta
140b0 72 74 63 68 61 72 20 7c 7c 20 70 72 65 76 63 3d  rtchar || prevc=
140c0 3d 27 5c 5c 27 29 3b 20 63 70 2b 2b 29 7b 0a 20  ='\\'); cp++){. 
140d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
140e0 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
140f0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  +;.            i
14100 66 28 20 70 72 65 76 63 3d 3d 27 5c 5c 27 20 29  f( prevc=='\\' )
14110 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20   prevc = 0;.    
14120 20 20 20 20 20 20 20 20 65 6c 73 65 20 20 20 20          else    
14130 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20            prevc 
14140 3d 20 63 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20  = c;..  }..}.   
14150 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
14160 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
14170 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e  rrorMsg(ps.filen
14180 61 6d 65 2c 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65  ame,ps.tokenline
14190 6e 6f 2c 0a 22 43 20 63 6f 64 65 20 73 74 61 72  no,."C code star
141a0 74 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e  ting on this lin
141b0 65 20 69 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61  e is not termina
141c0 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 65  ted before the e
141d0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 22  nd of the file."
141e0 29 3b 0a 20 20 20 20 20 20 20 20 70 73 2e 65 72  );.        ps.er
141f0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
14200 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20    nextcp = cp;. 
14210 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14220 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 2b      nextcp = cp+
14230 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
14240 65 6c 73 65 20 69 66 28 20 69 73 61 6c 6e 75 6d  else if( isalnum
14250 28 63 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  (c) ){          
14260 2f 2a 20 49 64 65 6e 74 69 66 69 65 72 73 20 2a  /* Identifiers *
14270 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  /.      while( (
14280 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 69  c= *cp)!=0 && (i
14290 73 61 6c 6e 75 6d 28 63 29 20 7c 7c 20 63 3d 3d  salnum(c) || c==
142a0 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20  '_') ) cp++;.   
142b0 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a     nextcp = cp;.
142c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
142d0 3d 27 3a 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  =':' && cp[1]=='
142e0 3a 27 20 26 26 20 63 70 5b 32 5d 3d 3d 27 3d 27  :' && cp[2]=='='
142f0 20 29 7b 20 2f 2a 20 54 68 65 20 6f 70 65 72 61   ){ /* The opera
14300 74 6f 72 20 22 3a 3a 3d 22 20 2a 2f 0a 20 20 20  tor "::=" */.   
14310 20 20 20 63 70 20 2b 3d 20 33 3b 0a 20 20 20 20     cp += 3;.    
14320 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20    nextcp = cp;. 
14330 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d     }else if( (c=
14340 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27 7c 27 29 20  ='/' || c=='|') 
14350 26 26 20 69 73 61 6c 70 68 61 28 63 70 5b 31 5d  && isalpha(cp[1]
14360 29 20 29 7b 0a 20 20 20 20 20 20 63 70 20 2b 3d  ) ){.      cp +=
14370 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   2;.      while(
14380 20 28 63 20 3d 20 2a 63 70 29 21 3d 30 20 26 26   (c = *cp)!=0 &&
14390 20 28 69 73 61 6c 6e 75 6d 28 63 29 20 7c 7c 20   (isalnum(c) || 
143a0 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a  c=='_') ) cp++;.
143b0 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
143c0 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20 20  p;.    }else{   
143d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143e0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6f 74         /* All ot
143f0 68 65 72 20 28 6f 6e 65 20 63 68 61 72 61 63 74  her (one charact
14400 65 72 29 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f  er) operators */
14410 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20  .      cp++;.   
14420 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a     nextcp = cp;.
14430 20 20 20 20 7d 0a 20 20 20 20 63 20 3d 20 2a 63      }.    c = *c
14440 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 20  p;.    *cp = 0; 
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14460 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 6c 20 74         /* Null t
14470 65 72 6d 69 6e 61 74 65 20 74 68 65 20 74 6f 6b  erminate the tok
14480 65 6e 20 2a 2f 0a 20 20 20 20 70 61 72 73 65 6f  en */.    parseo
14490 6e 65 74 6f 6b 65 6e 28 26 70 73 29 3b 20 20 20  netoken(&ps);   
144a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
144b0 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a  se the token */.
144c0 20 20 20 20 2a 63 70 20 3d 20 63 3b 20 20 20 20      *cp = c;    
144d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144e0 20 20 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74      /* Restore t
144f0 68 65 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  he buffer */.   
14500 20 63 70 20 3d 20 6e 65 78 74 63 70 3b 0a 20 20   cp = nextcp;.  
14510 7d 0a 20 20 66 72 65 65 28 66 69 6c 65 62 75 66  }.  free(filebuf
14520 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
14530 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65        /* Release
14540 20 74 68 65 20 62 75 66 66 65 72 20 61 66 74 65   the buffer afte
14550 72 20 70 61 72 73 69 6e 67 20 2a 2f 0a 20 20 67  r parsing */.  g
14560 70 2d 3e 72 75 6c 65 20 3d 20 70 73 2e 66 69 72  p->rule = ps.fir
14570 73 74 72 75 6c 65 3b 0a 20 20 67 70 2d 3e 65 72  strule;.  gp->er
14580 72 6f 72 63 6e 74 20 3d 20 70 73 2e 65 72 72 6f  rorcnt = ps.erro
14590 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  rcnt;.}./*******
145a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145b0 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
145c0 6c 65 20 22 70 6c 69 6e 6b 2e 63 22 20 2a 2a 2a  le "plink.c" ***
145d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145e0 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  **/./*.** Routin
145f0 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f  es processing co
14600 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f 6c 6c  nfiguration foll
14610 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69  ow-set propagati
14620 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a 20 69 6e 20 74  on links.** in t
14630 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20  he LEMON parser 
14640 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74  generator..*/.st
14650 61 74 69 63 20 73 74 72 75 63 74 20 70 6c 69 6e  atic struct plin
14660 6b 20 2a 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73  k *plink_freelis
14670 74 20 3d 20 30 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63  t = 0;../* Alloc
14680 61 74 65 20 61 20 6e 65 77 20 70 6c 69 6e 6b 20  ate a new plink 
14690 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  */.struct plink 
146a0 2a 50 6c 69 6e 6b 5f 6e 65 77 28 29 7b 0a 20 20  *Plink_new(){.  
146b0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
146c0 77 6c 69 6e 6b 3b 0a 0a 20 20 69 66 28 20 70 6c  wlink;..  if( pl
146d0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d 30 20  ink_freelist==0 
146e0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
146f0 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b    int amt = 100;
14700 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  .    plink_freel
14710 69 73 74 20 3d 20 28 73 74 72 75 63 74 20 70 6c  ist = (struct pl
14720 69 6e 6b 20 2a 29 63 61 6c 6c 6f 63 28 20 61 6d  ink *)calloc( am
14730 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  t, sizeof(struct
14740 20 70 6c 69 6e 6b 29 20 29 3b 0a 20 20 20 20 69   plink) );.    i
14750 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73  f( plink_freelis
14760 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  t==0 ){.      fp
14770 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
14780 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 61      "Unable to a
14790 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
147a0 6f 72 20 61 20 6e 65 77 20 66 6f 6c 6c 6f 77 2d  or a new follow-
147b0 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  set propagation 
147c0 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20 20 20 20 20  link.\n");.     
147d0 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
147e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
147f0 6d 74 2d 31 3b 20 69 2b 2b 29 20 70 6c 69 6e 6b  mt-1; i++) plink
14800 5f 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78  _freelist[i].nex
14810 74 20 3d 20 26 70 6c 69 6e 6b 5f 66 72 65 65 6c  t = &plink_freel
14820 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 70 6c  ist[i+1];.    pl
14830 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 61 6d 74  ink_freelist[amt
14840 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  -1].next = 0;.  
14850 7d 0a 20 20 6e 65 77 6c 69 6e 6b 20 3d 20 70 6c  }.  newlink = pl
14860 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20  ink_freelist;.  
14870 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d  plink_freelist =
14880 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 2d   plink_freelist-
14890 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20  >next;.  return 
148a0 6e 65 77 6c 69 6e 6b 3b 0a 7d 0a 0a 2f 2a 20 41  newlink;.}../* A
148b0 64 64 20 61 20 70 6c 69 6e 6b 20 74 6f 20 61 20  dd a plink to a 
148c0 70 6c 69 6e 6b 20 6c 69 73 74 20 2a 2f 0a 76 6f  plink list */.vo
148d0 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 73 74 72  id Plink_add(str
148e0 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 70 6c 70 70  uct plink **plpp
148f0 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
14900 2a 63 66 70 29 0a 7b 0a 20 20 73 74 72 75 63 74  *cfp).{.  struct
14910 20 70 6c 69 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b   plink *newlink;
14920 0a 20 20 6e 65 77 6c 69 6e 6b 20 3d 20 50 6c 69  .  newlink = Pli
14930 6e 6b 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77 6c  nk_new();.  newl
14940 69 6e 6b 2d 3e 6e 65 78 74 20 3d 20 2a 70 6c 70  ink->next = *plp
14950 70 3b 0a 20 20 2a 70 6c 70 70 20 3d 20 6e 65 77  p;.  *plpp = new
14960 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e 6b 2d  link;.  newlink-
14970 3e 63 66 70 20 3d 20 63 66 70 3b 0a 7d 0a 0a 2f  >cfp = cfp;.}../
14980 2a 20 54 72 61 6e 73 66 65 72 20 65 76 65 72 79  * Transfer every
14990 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69   plink on the li
149a0 73 74 20 22 66 72 6f 6d 22 20 74 6f 20 74 68 65  st "from" to the
149b0 20 6c 69 73 74 20 22 74 6f 22 20 2a 2f 0a 76 6f   list "to" */.vo
149c0 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 73 74  id Plink_copy(st
149d0 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 74 6f 2c  ruct plink **to,
149e0 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66   struct plink *f
149f0 72 6f 6d 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  rom).{.  struct 
14a00 70 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 20  plink *nextpl;. 
14a10 20 77 68 69 6c 65 28 20 66 72 6f 6d 20 29 7b 0a   while( from ){.
14a20 20 20 20 20 6e 65 78 74 70 6c 20 3d 20 66 72 6f      nextpl = fro
14a30 6d 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 66 72 6f  m->next;.    fro
14a40 6d 2d 3e 6e 65 78 74 20 3d 20 2a 74 6f 3b 0a 20  m->next = *to;. 
14a50 20 20 20 2a 74 6f 20 3d 20 66 72 6f 6d 3b 0a 20     *to = from;. 
14a60 20 20 20 66 72 6f 6d 20 3d 20 6e 65 78 74 70 6c     from = nextpl
14a70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 44 65 6c 65  ;.  }.}../* Dele
14a80 74 65 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f  te every plink o
14a90 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 76 6f  n the list */.vo
14aa0 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28  id Plink_delete(
14ab0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c  struct plink *pl
14ac0 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c  p).{.  struct pl
14ad0 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20  ink *nextpl;..  
14ae0 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20  while( plp ){.  
14af0 20 20 6e 65 78 74 70 6c 20 3d 20 70 6c 70 2d 3e    nextpl = plp->
14b00 6e 65 78 74 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e  next;.    plp->n
14b10 65 78 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65  ext = plink_free
14b20 6c 69 73 74 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f  list;.    plink_
14b30 66 72 65 65 6c 69 73 74 20 3d 20 70 6c 70 3b 0a  freelist = plp;.
14b40 20 20 20 20 70 6c 70 20 3d 20 6e 65 78 74 70 6c      plp = nextpl
14b50 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ;.  }.}./*******
14b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b70 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
14b80 72 65 70 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  report.c" ******
14b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ba0 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  ****/./*.** Proc
14bb0 65 64 75 72 65 73 20 66 6f 72 20 67 65 6e 65 72  edures for gener
14bc0 61 74 69 6e 67 20 72 65 70 6f 72 74 73 20 61 6e  ating reports an
14bd0 64 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  d tables in the 
14be0 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
14bf0 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47  erator..*/../* G
14c00 65 6e 65 72 61 74 65 20 61 20 66 69 6c 65 6e 61  enerate a filena
14c10 6d 65 20 77 69 74 68 20 74 68 65 20 67 69 76 65  me with the give
14c20 6e 20 73 75 66 66 69 78 2e 20 20 53 70 61 63 65  n suffix.  Space
14c30 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
14c40 6e 61 6d 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20  name comes from 
14c50 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  malloc() and mus
14c60 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
14c70 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
14c80 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54  ction..*/.PRIVAT
14c90 45 20 63 68 61 72 20 2a 66 69 6c 65 5f 6d 61 6b  E char *file_mak
14ca0 65 6e 61 6d 65 28 73 74 72 75 63 74 20 6c 65 6d  ename(struct lem
14cb0 6f 6e 20 2a 6c 65 6d 70 2c 20 63 6f 6e 73 74 20  on *lemp, const 
14cc0 63 68 61 72 20 2a 73 75 66 66 69 78 29 0a 7b 0a  char *suffix).{.
14cd0 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20    char *name;.  
14ce0 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20 6e 61 6d  char *cp;..  nam
14cf0 65 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f  e = (char*)mallo
14d00 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c  c( lemonStrlen(l
14d10 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b  emp->filename) +
14d20 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 75 66   lemonStrlen(suf
14d30 66 69 78 29 20 2b 20 35 20 29 3b 0a 20 20 69 66  fix) + 5 );.  if
14d40 28 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  ( name==0 ){.   
14d50 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14d60 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20  "Can't allocate 
14d70 73 70 61 63 65 20 66 6f 72 20 61 20 66 69 6c 65  space for a file
14d80 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20 20 20 65  name.\n");.    e
14d90 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 73 74  xit(1);.  }.  st
14da0 72 63 70 79 28 6e 61 6d 65 2c 6c 65 6d 70 2d 3e  rcpy(name,lemp->
14db0 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 63 70 20  filename);.  cp 
14dc0 3d 20 73 74 72 72 63 68 72 28 6e 61 6d 65 2c 27  = strrchr(name,'
14dd0 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29 20  .');.  if( cp ) 
14de0 2a 63 70 20 3d 20 30 3b 0a 20 20 73 74 72 63 61  *cp = 0;.  strca
14df0 74 28 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b 0a  t(name,suffix);.
14e00 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d    return name;.}
14e10 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  ../* Open a file
14e20 20 77 69 74 68 20 61 20 6e 61 6d 65 20 62 61 73   with a name bas
14e30 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20 6f  ed on the name o
14e40 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
14e50 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68 20 61 20  ,.** but with a 
14e60 64 69 66 66 65 72 65 6e 74 20 28 73 70 65 63 69  different (speci
14e70 66 69 65 64 29 20 73 75 66 66 69 78 2c 20 61 6e  fied) suffix, an
14e80 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
14e90 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 72  er.** to the str
14ea0 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20 46  eam */.PRIVATE F
14eb0 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28 0a  ILE *file_open(.
14ec0 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a    struct lemon *
14ed0 6c 65 6d 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  lemp,.  const ch
14ee0 61 72 20 2a 73 75 66 66 69 78 2c 0a 20 20 63 6f  ar *suffix,.  co
14ef0 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 0a 29  nst char *mode.)
14f00 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20  {.  FILE *fp;.. 
14f10 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61   if( lemp->outna
14f20 6d 65 20 29 20 66 72 65 65 28 6c 65 6d 70 2d 3e  me ) free(lemp->
14f30 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d 70  outname);.  lemp
14f40 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c 65  ->outname = file
14f50 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20  _makename(lemp, 
14f60 73 75 66 66 69 78 29 3b 0a 20 20 66 70 20 3d 20  suffix);.  fp = 
14f70 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74 6e  fopen(lemp->outn
14f80 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66 28  ame,mode);.  if(
14f90 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65 3d   fp==0 && *mode=
14fa0 3d 27 77 27 20 29 7b 0a 20 20 20 20 66 70 72 69  ='w' ){.    fpri
14fb0 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27  ntf(stderr,"Can'
14fc0 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25 73  t open file \"%s
14fd0 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75 74  \".\n",lemp->out
14fe0 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d  name);.    lemp-
14ff0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
15000 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
15010 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f   return fp;.}../
15020 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68 65 20  * Duplicate the 
15030 69 6e 70 75 74 20 66 69 6c 65 20 77 69 74 68 6f  input file witho
15040 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64 20  ut comments and 
15050 77 69 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 20  without actions 
15060 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f 0a  .** on rules */.
15070 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73 74 72  void Reprint(str
15080 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
15090 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  .{.  struct rule
150a0 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73   *rp;.  struct s
150b0 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74  ymbol *sp;.  int
150c0 20 69 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20 6c   i, j, maxlen, l
150d0 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73 6b  en, ncolumns, sk
150e0 69 70 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f 2f  ip;.  printf("//
150f0 20 52 65 70 72 69 6e 74 20 6f 66 20 69 6e 70 75   Reprint of inpu
15100 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e  t file \"%s\".\n
15110 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c  // Symbols:\n",l
15120 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a  emp->filename);.
15130 20 20 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a 20    maxlen = 10;. 
15140 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
15150 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
15160 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
15170 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
15180 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  len = lemonStrle
15190 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  n(sp->name);.   
151a0 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20   if( len>maxlen 
151b0 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a  ) maxlen = len;.
151c0 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73 20 3d    }.  ncolumns =
151d0 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35 29 3b 0a   76/(maxlen+5);.
151e0 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e 73 3c 31    if( ncolumns<1
151f0 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 31 3b   ) ncolumns = 1;
15200 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65 6d 70 2d  .  skip = (lemp-
15210 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f 6c 75  >nsymbol + ncolu
15220 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c 75 6d 6e  mns - 1)/ncolumn
15230 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  s;.  for(i=0; i<
15240 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  skip; i++){.    
15250 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b 0a 20 20  printf("//");.  
15260 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c 65 6d    for(j=i; j<lem
15270 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 3d 73  p->nsymbol; j+=s
15280 6b 69 70 29 7b 0a 20 20 20 20 20 20 73 70 20 3d  kip){.      sp =
15290 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a   lemp->symbols[j
152a0 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
152b0 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20 29 3b   sp->index==j );
152c0 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20  .      printf(" 
152d0 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d 61  %3d %-*.*s",j,ma
152e0 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70 2d 3e  xlen,maxlen,sp->
152f0 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
15300 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
15310 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70   }.  for(rp=lemp
15320 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
15330 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 70 72  p->next){.    pr
15340 69 6e 74 66 28 22 25 73 22 2c 72 70 2d 3e 6c 68  intf("%s",rp->lh
15350 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a  s->name);.    /*
15360 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61      if( rp->lhsa
15370 6c 69 61 73 20 29 20 70 72 69 6e 74 66 28 22 28  lias ) printf("(
15380 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  %s)",rp->lhsalia
15390 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74  s); */.    print
153a0 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20 66  f(" ::=");.    f
153b0 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
153c0 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
153d0 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
153e0 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20  .      printf(" 
153f0 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a  %s", sp->name);.
15400 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79        if( sp->ty
15410 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
15420 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  L ){.        for
15430 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62  (j=1; j<sp->nsub
15440 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  sym; j++){.     
15450 20 20 20 20 20 70 72 69 6e 74 66 28 22 7c 25 73       printf("|%s
15460 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d  ", sp->subsym[j]
15470 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
15480 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
15490 20 2f 2a 20 69 66 28 20 72 70 2d 3e 72 68 73 61   /* if( rp->rhsa
154a0 6c 69 61 73 5b 69 5d 20 29 20 70 72 69 6e 74 66  lias[i] ) printf
154b0 28 22 28 25 73 29 22 2c 72 70 2d 3e 72 68 73 61  ("(%s)",rp->rhsa
154c0 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20 20  lias[i]); */.   
154d0 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2e   }.    printf(".
154e0 22 29 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  ");.    if( rp->
154f0 70 72 65 63 73 79 6d 20 29 20 70 72 69 6e 74 66  precsym ) printf
15500 28 22 20 5b 25 73 5d 22 2c 72 70 2d 3e 70 72 65  (" [%s]",rp->pre
15510 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  csym->name);.   
15520 20 2f 2a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65   /* if( rp->code
15530 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 20 20 20   ) printf("\n   
15540 20 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 20   %s",rp->code); 
15550 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c  */.    printf("\
15560 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64  n");.  }.}..void
15570 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 46 49 4c   ConfigPrint(FIL
15580 45 20 2a 66 70 2c 20 73 74 72 75 63 74 20 63 6f  E *fp, struct co
15590 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20 73  nfig *cfp).{.  s
155a0 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
155b0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
155c0 2a 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  *sp;.  int i, j;
155d0 0a 20 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b  .  rp = cfp->rp;
155e0 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25  .  fprintf(fp,"%
155f0 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e  s ::=",rp->lhs->
15600 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  name);.  for(i=0
15610 3b 20 69 3c 3d 72 70 2d 3e 6e 72 68 73 3b 20 69  ; i<=rp->nrhs; i
15620 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d  ++){.    if( i==
15630 63 66 70 2d 3e 64 6f 74 20 29 20 66 70 72 69 6e  cfp->dot ) fprin
15640 74 66 28 66 70 2c 22 20 2a 22 29 3b 0a 20 20 20  tf(fp," *");.   
15650 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73   if( i==rp->nrhs
15660 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 70   ) break;.    sp
15670 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
15680 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20     fprintf(fp," 
15690 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a  %s", sp->name);.
156a0 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
156b0 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
156c0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31  ){.      for(j=1
156d0 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b  ; j<sp->nsubsym;
156e0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   j++){.        f
156f0 70 72 69 6e 74 66 28 66 70 2c 22 7c 25 73 22 2c  printf(fp,"|%s",
15700 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e  sp->subsym[j]->n
15710 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
15720 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 23 64    }.  }.}../* #d
15730 65 66 69 6e 65 20 54 45 53 54 20 2a 2f 0a 23 69  efine TEST */.#i
15740 66 20 30 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73  f 0./* Print a s
15750 65 74 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  et */.PRIVATE vo
15760 69 64 20 53 65 74 50 72 69 6e 74 28 6f 75 74 2c  id SetPrint(out,
15770 73 65 74 2c 6c 65 6d 70 29 0a 46 49 4c 45 20 2a  set,lemp).FILE *
15780 6f 75 74 3b 0a 63 68 61 72 20 2a 73 65 74 3b 0a  out;.char *set;.
15790 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
157a0 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp;.{.  int i;. 
157b0 20 63 68 61 72 20 2a 73 70 61 63 65 72 3b 0a 20   char *spacer;. 
157c0 20 73 70 61 63 65 72 20 3d 20 22 22 3b 0a 20 20   spacer = "";.  
157d0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32  fprintf(out,"%12
157e0 73 5b 22 2c 22 22 29 3b 0a 20 20 66 6f 72 28 69  s[","");.  for(i
157f0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =0; i<lemp->nter
15800 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  minal; i++){.   
15810 20 69 66 28 20 53 65 74 46 69 6e 64 28 73 65 74   if( SetFind(set
15820 2c 69 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ,i) ){.      fpr
15830 69 6e 74 66 28 6f 75 74 2c 22 25 73 25 73 22 2c  intf(out,"%s%s",
15840 73 70 61 63 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d  spacer,lemp->sym
15850 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a  bols[i]->name);.
15860 20 20 20 20 20 20 73 70 61 63 65 72 20 3d 20 22        spacer = "
15870 20 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   ";.    }.  }.  
15880 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e  fprintf(out,"]\n
15890 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20  ");.}../* Print 
158a0 61 20 70 6c 69 6e 6b 20 63 68 61 69 6e 20 2a 2f  a plink chain */
158b0 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 50 6c  .PRIVATE void Pl
158c0 69 6e 6b 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70  inkPrint(out,plp
158d0 2c 74 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b  ,tag).FILE *out;
158e0 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70  .struct plink *p
158f0 6c 70 3b 0a 63 68 61 72 20 2a 74 61 67 3b 0a 7b  lp;.char *tag;.{
15900 0a 20 20 77 68 69 6c 65 28 20 70 6c 70 20 29 7b  .  while( plp ){
15910 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
15920 2c 22 25 31 32 73 25 73 20 28 73 74 61 74 65 20  ,"%12s%s (state 
15930 25 32 64 29 20 22 2c 22 22 2c 74 61 67 2c 70 6c  %2d) ","",tag,pl
15940 70 2d 3e 63 66 70 2d 3e 73 74 70 2d 3e 73 74 61  p->cfp->stp->sta
15950 74 65 6e 75 6d 29 3b 0a 20 20 20 20 43 6f 6e 66  tenum);.    Conf
15960 69 67 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2d  igPrint(out,plp-
15970 3e 63 66 70 29 3b 0a 20 20 20 20 66 70 72 69 6e  >cfp);.    fprin
15980 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20  tf(out,"\n");.  
15990 20 20 70 6c 70 20 3d 20 70 6c 70 2d 3e 6e 65 78    plp = plp->nex
159a0 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  t;.  }.}.#endif.
159b0 0a 2f 2a 20 50 72 69 6e 74 20 61 6e 20 61 63 74  ./* Print an act
159c0 69 6f 6e 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ion to the given
159d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
159e0 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  .  Return FALSE 
159f0 69 66 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 77 61  if.** nothing wa
15a00 73 20 61 63 74 75 61 6c 6c 79 20 70 72 69 6e 74  s actually print
15a10 65 64 2e 0a 2a 2f 0a 69 6e 74 20 50 72 69 6e 74  ed..*/.int Print
15a20 41 63 74 69 6f 6e 28 73 74 72 75 63 74 20 61 63  Action(struct ac
15a30 74 69 6f 6e 20 2a 61 70 2c 20 46 49 4c 45 20 2a  tion *ap, FILE *
15a40 66 70 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b  fp, int indent){
15a50 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 20 3d 20  .  int result = 
15a60 31 3b 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d  1;.  switch( ap-
15a70 3e 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  >type ){.    cas
15a80 65 20 53 48 49 46 54 3a 0a 20 20 20 20 20 20 66  e SHIFT:.      f
15a90 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73  printf(fp,"%*s s
15aa0 68 69 66 74 20 20 25 64 22 2c 69 6e 64 65 6e 74  hift  %d",indent
15ab0 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70  ,ap->sp->name,ap
15ac0 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75  ->x.stp->statenu
15ad0 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
15ae0 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43 45  .    case REDUCE
15af0 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
15b00 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25  fp,"%*s reduce %
15b10 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70  d",indent,ap->sp
15b20 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d  ->name,ap->x.rp-
15b30 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62  >index);.      b
15b40 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41  reak;.    case A
15b50 43 43 45 50 54 3a 0a 20 20 20 20 20 20 66 70 72  CCEPT:.      fpr
15b60 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 61 63 63  intf(fp,"%*s acc
15b70 65 70 74 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  ept",indent,ap->
15b80 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
15b90 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
15ba0 20 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 66 70   ERROR:.      fp
15bb0 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 65 72  rintf(fp,"%*s er
15bc0 72 6f 72 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  ror",indent,ap->
15bd0 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
15be0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
15bf0 20 53 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20   SRCONFLICT:.   
15c00 20 63 61 73 65 20 52 52 43 4f 4e 46 4c 49 43 54   case RRCONFLICT
15c10 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
15c20 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25  fp,"%*s reduce %
15c30 2d 33 64 20 2a 2a 20 50 61 72 73 69 6e 67 20 63  -3d ** Parsing c
15c40 6f 6e 66 6c 69 63 74 20 2a 2a 22 2c 0a 20 20 20  onflict **",.   
15c50 20 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e       indent,ap->
15c60 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72  sp->name,ap->x.r
15c70 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  p->index);.     
15c80 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
15c90 20 53 53 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20   SSCONFLICT:.   
15ca0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
15cb0 2a 73 20 73 68 69 66 74 20 20 25 2d 33 64 20 2a  *s shift  %-3d *
15cc0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69  * Parsing confli
15cd0 63 74 20 2a 2a 22 2c 20 0a 20 20 20 20 20 20 20  ct **", .       
15ce0 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e   indent,ap->sp->
15cf0 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e  name,ap->x.stp->
15d00 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20  statenum);.     
15d10 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
15d20 20 53 48 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20   SH_RESOLVED:.  
15d30 20 20 20 20 69 66 28 20 73 68 6f 77 50 72 65 63      if( showPrec
15d40 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63 74 20 29  edenceConflict )
15d50 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
15d60 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20  f(fp,"%*s shift 
15d70 20 25 2d 33 64 20 2d 2d 20 64 72 6f 70 70 65 64   %-3d -- dropped
15d80 20 62 79 20 70 72 65 63 65 64 65 6e 63 65 22 2c   by precedence",
15d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15da0 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e   indent,ap->sp->
15db0 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e  name,ap->x.stp->
15dc0 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20  statenum);.     
15dd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15de0 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20  result = 0;.    
15df0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
15e00 0a 20 20 20 20 63 61 73 65 20 52 44 5f 52 45 53  .    case RD_RES
15e10 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20 69 66 28  OLVED:.      if(
15e20 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43   showPrecedenceC
15e30 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20 20  onflict ){.     
15e40 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
15e50 2a 73 20 72 65 64 75 63 65 20 25 2d 33 64 20 2d  *s reduce %-3d -
15e60 2d 20 64 72 6f 70 70 65 64 20 62 79 20 70 72 65  - dropped by pre
15e70 63 65 64 65 6e 63 65 22 2c 0a 20 20 20 20 20 20  cedence",.      
15e80 20 20 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74            indent
15e90 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70  ,ap->sp->name,ap
15ea0 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a  ->x.rp->index);.
15eb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15ec0 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b       result = 0;
15ed0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
15ee0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4e  reak;.    case N
15ef0 4f 54 5f 55 53 45 44 3a 0a 20 20 20 20 20 20 72  OT_USED:.      r
15f00 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20  esult = 0;.     
15f10 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
15f20 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a  turn result;.}..
15f30 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
15f40 22 79 2e 6f 75 74 70 75 74 22 20 6c 6f 67 20 66  "y.output" log f
15f50 69 6c 65 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f  ile */.void Repo
15f60 72 74 4f 75 74 70 75 74 28 73 74 72 75 63 74 20  rtOutput(struct 
15f70 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
15f80 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
15f90 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73   state *stp;.  s
15fa0 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
15fb0 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  p;.  struct acti
15fc0 6f 6e 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a  on *ap;.  FILE *
15fd0 66 70 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65  fp;..  fp = file
15fe0 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74  _open(lemp,".out
15ff0 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 66  ","wb");.  if( f
16000 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
16010 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
16020 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
16030 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
16040 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66  sorted[i];.    f
16050 70 72 69 6e 74 66 28 66 70 2c 22 53 74 61 74 65  printf(fp,"State
16060 20 25 64 3a 5c 6e 22 2c 73 74 70 2d 3e 73 74 61   %d:\n",stp->sta
16070 74 65 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  tenum);.    if( 
16080 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20  lemp->basisflag 
16090 29 20 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20  ) cfp=stp->bp;. 
160a0 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
160b0 20 20 20 20 20 20 20 20 20 63 66 70 3d 73 74 70           cfp=stp
160c0 2d 3e 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65  ->cfp;.    while
160d0 28 20 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63  ( cfp ){.      c
160e0 68 61 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20  har buf[20];.   
160f0 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d     if( cfp->dot=
16100 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29  =cfp->rp->nrhs )
16110 7b 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74  {.        sprint
16120 66 28 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70  f(buf,"(%d)",cfp
16130 2d 3e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20  ->rp->index);.  
16140 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
16150 2c 22 20 20 20 20 25 35 73 20 22 2c 62 75 66 29  ,"    %5s ",buf)
16160 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16170 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
16180 70 2c 22 20 20 20 20 20 20 20 20 20 20 22 29 3b  p,"          ");
16190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43  .      }.      C
161a0 6f 6e 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66  onfigPrint(fp,cf
161b0 70 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  p);.      fprint
161c0 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 20  f(fp,"\n");.#if 
161d0 30 0a 20 20 20 20 20 20 53 65 74 50 72 69 6e 74  0.      SetPrint
161e0 28 66 70 2c 63 66 70 2d 3e 66 77 73 2c 6c 65 6d  (fp,cfp->fws,lem
161f0 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50  p);.      PlinkP
16200 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 70 6c  rint(fp,cfp->fpl
16210 70 2c 22 54 6f 20 20 22 29 3b 0a 20 20 20 20 20  p,"To  ");.     
16220 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63   PlinkPrint(fp,c
16230 66 70 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d 22 29  fp->bplp,"From")
16240 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  ;.#endif.      i
16250 66 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c  f( lemp->basisfl
16260 61 67 20 29 20 63 66 70 3d 63 66 70 2d 3e 62 70  ag ) cfp=cfp->bp
16270 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 20 20 20  ;.      else    
16280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 66                cf
16290 70 3d 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20  p=cfp->next;.   
162a0 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66   }.    fprintf(f
162b0 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72  p,"\n");.    for
162c0 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
162d0 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
162e0 20 20 20 20 20 69 66 28 20 50 72 69 6e 74 41 63       if( PrintAc
162f0 74 69 6f 6e 28 61 70 2c 66 70 2c 33 30 29 20 29  tion(ap,fp,30) )
16300 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22   fprintf(fp,"\n"
16310 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  );.    }.    fpr
16320 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20  intf(fp,"\n");. 
16330 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c   }.  fprintf(fp,
16340 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   "--------------
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 5c 6e 22 29 3b 0a 20 20 66 70  ------\n");.  fp
16380 72 69 6e 74 66 28 66 70 2c 20 22 53 79 6d 62 6f  rintf(fp, "Symbo
16390 6c 73 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69  ls:\n");.  for(i
163a0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
163b0 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  bol; i++){.    i
163c0 6e 74 20 6a 3b 0a 20 20 20 20 73 74 72 75 63 74  nt j;.    struct
163d0 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20   symbol *sp;..  
163e0 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d    sp = lemp->sym
163f0 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72  bols[i];.    fpr
16400 69 6e 74 66 28 66 70 2c 20 22 20 20 25 33 64 3a  intf(fp, "  %3d:
16410 20 25 73 22 2c 20 69 2c 20 73 70 2d 3e 6e 61 6d   %s", i, sp->nam
16420 65 29 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e  e);.    if( sp->
16430 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41  type==NONTERMINA
16440 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  L ){.      fprin
16450 74 66 28 66 70 2c 20 22 3a 22 29 3b 0a 20 20 20  tf(fp, ":");.   
16460 20 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64     if( sp->lambd
16470 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  a ){.        fpr
16480 69 6e 74 66 28 66 70 2c 20 22 20 3c 6c 61 6d 62  intf(fp, " <lamb
16490 64 61 3e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  da>");.      }. 
164a0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
164b0 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b  lemp->nterminal;
164c0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
164d0 66 28 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20  f( sp->firstset 
164e0 26 26 20 53 65 74 46 69 6e 64 28 73 70 2d 3e 66  && SetFind(sp->f
164f0 69 72 73 74 73 65 74 2c 20 6a 29 20 29 7b 0a 20  irstset, j) ){. 
16500 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
16510 28 66 70 2c 20 22 20 25 73 22 2c 20 6c 65 6d 70  (fp, " %s", lemp
16520 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61  ->symbols[j]->na
16530 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
16540 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16550 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 6e   fprintf(fp, "\n
16560 22 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  ");.  }.  fclose
16570 28 66 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  (fp);.  return;.
16580 7d 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  }../* Search for
16590 20 74 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22   the file "name"
165a0 20 77 68 69 63 68 20 69 73 20 69 6e 20 74 68 65   which is in the
165b0 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
165c0 61 73 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74  as.** the exacut
165d0 61 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20  able */.PRIVATE 
165e0 63 68 61 72 20 2a 70 61 74 68 73 65 61 72 63 68  char *pathsearch
165f0 28 63 68 61 72 20 2a 61 72 67 76 30 2c 20 63 68  (char *argv0, ch
16600 61 72 20 2a 6e 61 6d 65 2c 20 69 6e 74 20 6d 6f  ar *name, int mo
16610 64 65 6d 61 73 6b 29 0a 7b 0a 20 20 63 6f 6e 73  demask).{.  cons
16620 74 20 63 68 61 72 20 2a 70 61 74 68 6c 69 73 74  t char *pathlist
16630 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68 62 75  ;.  char *pathbu
16640 66 70 74 72 3b 0a 20 20 63 68 61 72 20 2a 70 61  fptr;.  char *pa
16650 74 68 62 75 66 3b 0a 20 20 63 68 61 72 20 2a 70  thbuf;.  char *p
16660 61 74 68 2c 2a 63 70 3b 0a 20 20 63 68 61 72 20  ath,*cp;.  char 
16670 63 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e  c;..#ifdef __WIN
16680 33 32 5f 5f 0a 20 20 63 70 20 3d 20 73 74 72 72  32__.  cp = strr
16690 63 68 72 28 61 72 67 76 30 2c 27 5c 5c 27 29 3b  chr(argv0,'\\');
166a0 0a 23 65 6c 73 65 0a 20 20 63 70 20 3d 20 73 74  .#else.  cp = st
166b0 72 72 63 68 72 28 61 72 67 76 30 2c 27 2f 27 29  rrchr(argv0,'/')
166c0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 63  ;.#endif.  if( c
166d0 70 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 63 70  p ){.    c = *cp
166e0 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20  ;.    *cp = 0;. 
166f0 20 20 20 70 61 74 68 20 3d 20 28 63 68 61 72 20     path = (char 
16700 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53  *)malloc( lemonS
16710 74 72 6c 65 6e 28 61 72 67 76 30 29 20 2b 20 6c  trlen(argv0) + l
16720 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29  emonStrlen(name)
16730 20 2b 20 32 20 29 3b 0a 20 20 20 20 69 66 28 20   + 2 );.    if( 
16740 70 61 74 68 20 29 20 73 70 72 69 6e 74 66 28 70  path ) sprintf(p
16750 61 74 68 2c 22 25 73 2f 25 73 22 2c 61 72 67 76  ath,"%s/%s",argv
16760 30 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 2a 63 70  0,name);.    *cp
16770 20 3d 20 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = c;.  }else{. 
16780 20 20 20 70 61 74 68 6c 69 73 74 20 3d 20 67 65     pathlist = ge
16790 74 65 6e 76 28 22 50 41 54 48 22 29 3b 0a 20 20  tenv("PATH");.  
167a0 20 20 69 66 28 20 70 61 74 68 6c 69 73 74 3d 3d    if( pathlist==
167b0 30 20 29 20 70 61 74 68 6c 69 73 74 20 3d 20 22  0 ) pathlist = "
167c0 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22  .:/bin:/usr/bin"
167d0 3b 0a 20 20 20 20 70 61 74 68 62 75 66 20 3d 20  ;.    pathbuf = 
167e0 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28  (char *) malloc(
167f0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74   lemonStrlen(pat
16800 68 6c 69 73 74 29 20 2b 20 31 20 29 3b 0a 20 20  hlist) + 1 );.  
16810 20 20 70 61 74 68 20 3d 20 28 63 68 61 72 20 2a    path = (char *
16820 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74  )malloc( lemonSt
16830 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 2b 6c  rlen(pathlist)+l
16840 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29  emonStrlen(name)
16850 2b 32 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  +2 );.    if( (p
16860 61 74 68 62 75 66 20 21 3d 20 30 29 20 26 26 20  athbuf != 0) && 
16870 28 70 61 74 68 21 3d 30 29 20 29 7b 0a 20 20 20  (path!=0) ){.   
16880 20 20 20 70 61 74 68 62 75 66 70 74 72 20 3d 20     pathbufptr = 
16890 70 61 74 68 62 75 66 3b 0a 20 20 20 20 20 20 73  pathbuf;.      s
168a0 74 72 63 70 79 28 70 61 74 68 62 75 66 2c 20 70  trcpy(pathbuf, p
168b0 61 74 68 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  athlist);.      
168c0 77 68 69 6c 65 28 20 2a 70 61 74 68 62 75 66 20  while( *pathbuf 
168d0 29 7b 0a 20 20 20 20 20 20 20 20 63 70 20 3d 20  ){.        cp = 
168e0 73 74 72 63 68 72 28 70 61 74 68 62 75 66 2c 27  strchr(pathbuf,'
168f0 3a 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  :');.        if(
16900 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20 26 70   cp==0 ) cp = &p
16910 61 74 68 62 75 66 5b 6c 65 6d 6f 6e 53 74 72 6c  athbuf[lemonStrl
16920 65 6e 28 70 61 74 68 62 75 66 29 5d 3b 0a 20 20  en(pathbuf)];.  
16930 20 20 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20        c = *cp;. 
16940 20 20 20 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a         *cp = 0;.
16950 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
16960 70 61 74 68 2c 22 25 73 2f 25 73 22 2c 70 61 74  path,"%s/%s",pat
16970 68 62 75 66 2c 6e 61 6d 65 29 3b 0a 20 20 20 20  hbuf,name);.    
16980 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 20      *cp = c;.   
16990 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20       if( c==0 ) 
169a0 70 61 74 68 62 75 66 5b 30 5d 20 3d 20 30 3b 0a  pathbuf[0] = 0;.
169b0 20 20 20 20 20 20 20 20 65 6c 73 65 20 70 61 74          else pat
169c0 68 62 75 66 20 3d 20 26 63 70 5b 31 5d 3b 0a 20  hbuf = &cp[1];. 
169d0 20 20 20 20 20 20 20 69 66 28 20 61 63 63 65 73         if( acces
169e0 73 28 70 61 74 68 2c 6d 6f 64 65 6d 61 73 6b 29  s(path,modemask)
169f0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
16a00 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65 28     }.      free(
16a10 70 61 74 68 62 75 66 70 74 72 29 3b 0a 20 20 20  pathbufptr);.   
16a20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
16a30 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47 69 76 65  path;.}../* Give
16a40 6e 20 61 6e 20 61 63 74 69 6f 6e 2c 20 63 6f 6d  n an action, com
16a50 70 75 74 65 20 74 68 65 20 69 6e 74 65 67 65 72  pute the integer
16a60 20 76 61 6c 75 65 20 66 6f 72 20 74 68 61 74 20   value for that 
16a70 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68 20  action.** which 
16a80 69 73 20 74 6f 20 62 65 20 70 75 74 20 69 6e 20  is to be put in 
16a90 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
16aa0 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
16ab0 64 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 52 65  d machine..** Re
16ac0 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69 66  turn negative if
16ad0 20 6e 6f 20 61 63 74 69 6f 6e 20 73 68 6f 75 6c   no action shoul
16ae0 64 20 62 65 20 67 65 6e 65 72 61 74 65 64 2e 0a  d be generated..
16af0 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 63  */.PRIVATE int c
16b00 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 73 74  ompute_action(st
16b10 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
16b20 2c 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  , struct action 
16b30 2a 61 70 29 0a 7b 0a 20 20 69 6e 74 20 61 63 74  *ap).{.  int act
16b40 3b 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e  ;.  switch( ap->
16b50 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
16b60 20 53 48 49 46 54 3a 20 20 61 63 74 20 3d 20 61   SHIFT:  act = a
16b70 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e  p->x.stp->staten
16b80 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  um;            b
16b90 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52  reak;.    case R
16ba0 45 44 55 43 45 3a 20 61 63 74 20 3d 20 61 70 2d  EDUCE: act = ap-
16bb0 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2b 20 6c  >x.rp->index + l
16bc0 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 62 72 65  emp->nstate; bre
16bd0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52 52  ak;.    case ERR
16be0 4f 52 3a 20 20 61 63 74 20 3d 20 6c 65 6d 70 2d  OR:  act = lemp-
16bf0 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e  >nstate + lemp->
16c00 6e 72 75 6c 65 3b 20 20 20 20 20 62 72 65 61 6b  nrule;     break
16c10 3b 0a 20 20 20 20 63 61 73 65 20 41 43 43 45 50  ;.    case ACCEP
16c20 54 3a 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e  T: act = lemp->n
16c30 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72  state + lemp->nr
16c40 75 6c 65 20 2b 20 31 3b 20 62 72 65 61 6b 3b 0a  ule + 1; break;.
16c50 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
16c60 20 61 63 74 20 3d 20 2d 31 3b 20 62 72 65 61 6b   act = -1; break
16c70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
16c80 63 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4c  ct;.}..#define L
16c90 49 4e 45 53 49 5a 45 20 31 30 30 30 0a 2f 2a 20  INESIZE 1000./* 
16ca0 54 68 65 20 6e 65 78 74 20 63 6c 75 73 74 65 72  The next cluster
16cb0 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
16cc0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68 65   for reading the
16cd0 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 0a 2a   template file.*
16ce0 2a 20 61 6e 64 20 77 72 69 74 69 6e 67 20 74 68  * and writing th
16cf0 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65  e results to the
16d00 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
16d10 72 20 2a 2f 0a 2f 2a 20 54 68 65 20 66 69 72 73  r */./* The firs
16d20 74 20 66 75 6e 63 74 69 6f 6e 20 74 72 61 6e 73  t function trans
16d30 66 65 72 73 20 64 61 74 61 20 66 72 6f 6d 20 22  fers data from "
16d40 69 6e 22 20 74 6f 20 22 6f 75 74 22 20 75 6e 74  in" to "out" unt
16d50 69 6c 0a 2a 2a 20 61 20 6c 69 6e 65 20 69 73 20  il.** a line is 
16d60 73 65 65 6e 20 77 68 69 63 68 20 62 65 67 69 6e  seen which begin
16d70 73 20 77 69 74 68 20 22 25 25 22 2e 20 20 54 68  s with "%%".  Th
16d80 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73  e line number is
16d90 0a 2a 2a 20 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a  .** tracked..**.
16da0 2a 2a 20 69 66 20 6e 61 6d 65 21 3d 30 2c 20 74  ** if name!=0, t
16db0 68 65 6e 20 61 6e 79 20 77 6f 72 64 20 74 68 61  hen any word tha
16dc0 74 20 62 65 67 69 6e 20 77 69 74 68 20 22 50 61  t begin with "Pa
16dd0 72 73 65 22 20 69 73 20 63 68 61 6e 67 65 64 20  rse" is changed 
16de0 74 6f 0a 2a 2a 20 62 65 67 69 6e 20 77 69 74 68  to.** begin with
16df0 20 2a 6e 61 6d 65 20 69 6e 73 74 65 61 64 2e 0a   *name instead..
16e00 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
16e10 74 70 6c 74 5f 78 66 65 72 28 63 68 61 72 20 2a  tplt_xfer(char *
16e20 6e 61 6d 65 2c 20 46 49 4c 45 20 2a 69 6e 2c 20  name, FILE *in, 
16e30 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e 74 20 2a  FILE *out, int *
16e40 6c 69 6e 65 6e 6f 29 0a 7b 0a 20 20 69 6e 74 20  lineno).{.  int 
16e50 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 63 68 61  i, iStart;.  cha
16e60 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d  r line[LINESIZE]
16e70 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73  ;.  while( fgets
16e80 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69  (line,LINESIZE,i
16e90 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d 21 3d  n) && (line[0]!=
16ea0 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21 3d  '%' || line[1]!=
16eb0 27 25 27 29 20 29 7b 0a 20 20 20 20 28 2a 6c 69  '%') ){.    (*li
16ec0 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69 53 74  neno)++;.    iSt
16ed0 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  art = 0;.    if(
16ee0 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 66   name ){.      f
16ef0 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d 3b  or(i=0; line[i];
16f00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
16f10 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27 20  f( line[i]=='P' 
16f20 26 26 20 73 74 72 6e 63 6d 70 28 26 6c 69 6e 65  && strncmp(&line
16f30 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35 29 3d 3d  [i],"Parse",5)==
16f40 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
16f50 69 3d 3d 30 20 7c 7c 20 21 69 73 61 6c 70 68 61  i==0 || !isalpha
16f60 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20 20 20  (line[i-1])).   
16f70 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
16f80 20 20 69 66 28 20 69 3e 69 53 74 61 72 74 20 29    if( i>iStart )
16f90 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e   fprintf(out,"%.
16fa0 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c 26 6c 69  *s",i-iStart,&li
16fb0 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 20  ne[iStart]);.   
16fc0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
16fd0 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b 0a 20  ut,"%s",name);. 
16fe0 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b           i += 4;
16ff0 0a 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72  .          iStar
17000 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20  t = i+1;.       
17010 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
17020 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
17030 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53 74 61  ,"%s",&line[iSta
17040 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  rt]);.  }.}../* 
17050 54 68 65 20 6e 65 78 74 20 66 75 6e 63 74 69 6f  The next functio
17060 6e 20 66 69 6e 64 73 20 74 68 65 20 74 65 6d 70  n finds the temp
17070 6c 61 74 65 20 66 69 6c 65 20 61 6e 64 20 6f 70  late file and op
17080 65 6e 73 20 69 74 2c 20 72 65 74 75 72 6e 69 6e  ens it, returnin
17090 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  g.** a pointer t
170a0 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c  o the opened fil
170b0 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49  e. */.PRIVATE FI
170c0 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28 73 74  LE *tplt_open(st
170d0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
170e0 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  ).{.  static cha
170f0 72 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 5b 5d  r templatename[]
17100 20 3d 20 22 6c 65 6d 70 61 72 2e 63 22 3b 0a 20   = "lempar.c";. 
17110 20 63 68 61 72 20 62 75 66 5b 31 30 30 30 5d 3b   char buf[1000];
17120 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63  .  FILE *in;.  c
17130 68 61 72 20 2a 74 70 6c 74 6e 61 6d 65 3b 0a 20  har *tpltname;. 
17140 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20 2f 2a   char *cp;..  /*
17150 20 66 69 72 73 74 2c 20 73 65 65 20 69 66 20 75   first, see if u
17160 73 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20  ser specified a 
17170 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 6e 61 6d  template filenam
17180 65 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  e on the command
17190 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28   line. */.  if (
171a0 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
171b0 65 20 21 3d 20 30 29 20 7b 0a 20 20 20 20 69 66  e != 0) {.    if
171c0 28 20 61 63 63 65 73 73 28 75 73 65 72 5f 74 65  ( access(user_te
171d0 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29 3d  mplatename,004)=
171e0 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  =-1 ){.      fpr
171f0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
17200 27 74 20 66 69 6e 64 20 74 68 65 20 70 61 72 73  't find the pars
17210 65 72 20 64 72 69 76 65 72 20 74 65 6d 70 6c 61  er driver templa
17220 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c  te file \"%s\".\
17230 6e 22 2c 0a 20 20 20 20 20 20 20 20 75 73 65 72  n",.        user
17240 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a  _templatename);.
17250 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
17260 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65  rcnt++;.      re
17270 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
17280 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 75 73 65    in = fopen(use
17290 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 22  r_templatename,"
172a0 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  rb");.    if( in
172b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
172c0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
172d0 27 74 20 6f 70 65 6e 20 74 68 65 20 74 65 6d 70  't open the temp
172e0 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22  late file \"%s\"
172f0 2e 5c 6e 22 2c 75 73 65 72 5f 74 65 6d 70 6c 61  .\n",user_templa
17300 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c  tename);.      l
17310 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
17320 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
17330 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
17340 6e 20 69 6e 3b 0a 20 20 7d 0a 0a 20 20 63 70 20  n in;.  }..  cp 
17350 3d 20 73 74 72 72 63 68 72 28 6c 65 6d 70 2d 3e  = strrchr(lemp->
17360 66 69 6c 65 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20  filename,'.');. 
17370 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20 20 73   if( cp ){.    s
17380 70 72 69 6e 74 66 28 62 75 66 2c 22 25 2e 2a 73  printf(buf,"%.*s
17390 2e 6c 74 22 2c 28 69 6e 74 29 28 63 70 2d 6c 65  .lt",(int)(cp-le
173a0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 2c 6c 65  mp->filename),le
173b0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
173c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69   }else{.    spri
173d0 6e 74 66 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c  ntf(buf,"%s.lt",
173e0 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
173f0 0a 20 20 7d 0a 20 20 69 66 28 20 61 63 63 65 73  .  }.  if( acces
17400 73 28 62 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b  s(buf,004)==0 ){
17410 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20  .    tpltname = 
17420 62 75 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  buf;.  }else if(
17430 20 61 63 63 65 73 73 28 74 65 6d 70 6c 61 74 65   access(template
17440 6e 61 6d 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a  name,004)==0 ){.
17450 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74      tpltname = t
17460 65 6d 70 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d  emplatename;.  }
17470 65 6c 73 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61  else{.    tpltna
17480 6d 65 20 3d 20 70 61 74 68 73 65 61 72 63 68 28  me = pathsearch(
17490 6c 65 6d 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70  lemp->argv0,temp
174a0 6c 61 74 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d  latename,0);.  }
174b0 0a 20 20 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d  .  if( tpltname=
174c0 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
174d0 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
174e0 66 69 6e 64 20 74 68 65 20 70 61 72 73 65 72 20  find the parser 
174f0 64 72 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20  driver template 
17500 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c  file \"%s\".\n",
17510 0a 20 20 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d  .    templatenam
17520 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72  e);.    lemp->er
17530 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65  rorcnt++;.    re
17540 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e  turn 0;.  }.  in
17550 20 3d 20 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d   = fopen(tpltnam
17560 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  e,"rb");.  if( i
17570 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  n==0 ){.    fpri
17580 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27  ntf(stderr,"Can'
17590 74 20 6f 70 65 6e 20 74 68 65 20 74 65 6d 70 6c  t open the templ
175a0 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e  ate file \"%s\".
175b0 5c 6e 22 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65  \n",templatename
175c0 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  );.    lemp->err
175d0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  orcnt++;.    ret
175e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
175f0 75 72 6e 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72  urn in;.}../* Pr
17600 69 6e 74 20 61 20 23 6c 69 6e 65 20 64 69 72 65  int a #line dire
17610 63 74 69 76 65 20 6c 69 6e 65 20 74 6f 20 74 68  ctive line to th
17620 65 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 2a  e output file. *
17630 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 74  /.PRIVATE void t
17640 70 6c 74 5f 6c 69 6e 65 64 69 72 28 46 49 4c 45  plt_linedir(FILE
17650 20 2a 6f 75 74 2c 20 69 6e 74 20 6c 69 6e 65 6e   *out, int linen
17660 6f 2c 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  o, char *filenam
17670 65 29 0a 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f  e).{.  fprintf(o
17680 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 22  ut,"#line %d \""
17690 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 77 68 69 6c  ,lineno);.  whil
176a0 65 28 20 2a 66 69 6c 65 6e 61 6d 65 20 29 7b 0a  e( *filename ){.
176b0 20 20 20 20 69 66 28 20 2a 66 69 6c 65 6e 61 6d      if( *filenam
176c0 65 20 3d 3d 20 27 5c 5c 27 20 29 20 70 75 74 63  e == '\\' ) putc
176d0 28 27 5c 5c 27 2c 6f 75 74 29 3b 0a 20 20 20 20  ('\\',out);.    
176e0 70 75 74 63 28 2a 66 69 6c 65 6e 61 6d 65 2c 6f  putc(*filename,o
176f0 75 74 29 3b 0a 20 20 20 20 66 69 6c 65 6e 61 6d  ut);.    filenam
17700 65 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  e++;.  }.  fprin
17710 74 66 28 6f 75 74 2c 22 5c 22 5c 6e 22 29 3b 0a  tf(out,"\"\n");.
17720 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 74  }../* Print a st
17730 72 69 6e 67 20 74 6f 20 74 68 65 20 66 69 6c 65  ring to the file
17740 20 61 6e 64 20 6b 65 65 70 20 74 68 65 20 6c 69   and keep the li
17750 6e 65 6e 75 6d 62 65 72 20 75 70 20 74 6f 20 64  nenumber up to d
17760 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  ate */.PRIVATE v
17770 6f 69 64 20 74 70 6c 74 5f 70 72 69 6e 74 28 46  oid tplt_print(F
17780 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74  ILE *out, struct
17790 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63 68   lemon *lemp, ch
177a0 61 72 20 2a 73 74 72 2c 20 69 6e 74 20 2a 6c 69  ar *str, int *li
177b0 6e 65 6e 6f 29 0a 7b 0a 20 20 69 66 28 20 73 74  neno).{.  if( st
177c0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
177d0 20 77 68 69 6c 65 28 20 2a 73 74 72 20 29 7b 0a   while( *str ){.
177e0 20 20 20 20 70 75 74 63 28 2a 73 74 72 2c 6f 75      putc(*str,ou
177f0 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 74 72  t);.    if( *str
17800 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e  =='\n' ) (*linen
17810 6f 29 2b 2b 3b 0a 20 20 20 20 73 74 72 2b 2b 3b  o)++;.    str++;
17820 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 5b 2d  .  }.  if( str[-
17830 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  1]!='\n' ){.    
17840 70 75 74 63 28 27 5c 6e 27 2c 6f 75 74 29 3b 0a  putc('\n',out);.
17850 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b      (*lineno)++;
17860 0a 20 20 7d 0a 20 20 69 66 20 28 21 6c 65 6d 70  .  }.  if (!lemp
17870 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29  ->nolinenosflag)
17880 20 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29   {.    (*lineno)
17890 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  ++; tplt_linedir
178a0 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d  (out,*lineno,lem
178b0 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a 20 20  p->outname); .  
178c0 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
178d0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
178e0 6e 67 20 72 6f 75 74 69 6e 65 20 65 6d 69 74 73  ng routine emits
178f0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65   code for the de
17900 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
17910 0a 2a 2a 20 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f  .** symbol sp.*/
17920 0a 76 6f 69 64 20 65 6d 69 74 5f 64 65 73 74 72  .void emit_destr
17930 75 63 74 6f 72 5f 63 6f 64 65 28 0a 20 20 46 49  uctor_code(.  FI
17940 4c 45 20 2a 6f 75 74 2c 0a 20 20 73 74 72 75 63  LE *out,.  struc
17950 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 0a 20 20  t symbol *sp,.  
17960 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
17970 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c 69 6e 65 6e  mp,.  int *linen
17980 6f 0a 29 7b 0a 20 63 68 61 72 20 2a 63 70 20 3d  o.){. char *cp =
17990 20 30 3b 0a 0a 20 69 66 28 20 73 70 2d 3e 74 79   0;.. if( sp->ty
179a0 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  pe==TERMINAL ){.
179b0 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f     cp = lemp->to
179c0 6b 65 6e 64 65 73 74 3b 0a 20 20 20 69 66 28 20  kendest;.   if( 
179d0 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  cp==0 ) return;.
179e0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
179f0 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29  {\n"); (*lineno)
17a00 2b 2b 3b 0a 20 7d 65 6c 73 65 20 69 66 28 20 73  ++;. }else if( s
17a10 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 29 7b  p->destructor ){
17a20 0a 20 20 20 63 70 20 3d 20 73 70 2d 3e 64 65 73  .   cp = sp->des
17a30 74 72 75 63 74 6f 72 3b 0a 20 20 20 66 70 72 69  tructor;.   fpri
17a40 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20  ntf(out,"{\n"); 
17a50 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
17a60 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e  if (!lemp->nolin
17a70 65 6e 6f 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69  enosflag) { (*li
17a80 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69  neno)++; tplt_li
17a90 6e 65 64 69 72 28 6f 75 74 2c 73 70 2d 3e 64 65  nedir(out,sp->de
17aa0 73 74 4c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 66  stLineno,lemp->f
17ab0 69 6c 65 6e 61 6d 65 29 3b 20 7d 0a 20 7d 65 6c  ilename); }. }el
17ac0 73 65 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72  se if( lemp->var
17ad0 64 65 73 74 20 29 7b 0a 20 20 20 63 70 20 3d 20  dest ){.   cp = 
17ae0 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20  lemp->vardest;. 
17af0 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65    if( cp==0 ) re
17b00 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66  turn;.   fprintf
17b10 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c  (out,"{\n"); (*l
17b20 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65  ineno)++;. }else
17b30 7b 0a 20 20 20 61 73 73 65 72 74 28 20 30 20 29  {.   assert( 0 )
17b40 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70  ;  /* Cannot hap
17b50 70 65 6e 20 2a 2f 0a 20 7d 0a 20 66 6f 72 28 3b  pen */. }. for(;
17b60 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20   *cp; cp++){.   
17b70 69 66 28 20 2a 63 70 3d 3d 27 24 27 20 26 26 20  if( *cp=='$' && 
17b80 63 70 5b 31 5d 3d 3d 27 24 27 20 29 7b 0a 20 20  cp[1]=='$' ){.  
17b90 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
17ba0 28 79 79 70 6d 69 6e 6f 72 2d 3e 79 79 25 64 29  (yypminor->yy%d)
17bb0 22 2c 73 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20  ",sp->dtnum);.  
17bc0 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 63 6f     cp++;.     co
17bd0 6e 74 69 6e 75 65 3b 0a 20 20 20 7d 0a 20 20 20  ntinue;.   }.   
17be0 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20  if( *cp=='\n' ) 
17bf0 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
17c00 66 70 75 74 63 28 2a 63 70 2c 6f 75 74 29 3b 0a  fputc(*cp,out);.
17c10 20 7d 0a 20 66 70 72 69 6e 74 66 28 6f 75 74 2c   }. fprintf(out,
17c20 22 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29  "\n"); (*lineno)
17c30 2b 2b 3b 0a 20 69 66 20 28 21 6c 65 6d 70 2d 3e  ++;. if (!lemp->
17c40 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b  nolinenosflag) {
17c50 20 0a 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b   .   (*lineno)++
17c60 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f  ; tplt_linedir(o
17c70 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d  ut,*lineno,lemp-
17c80 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a 20 7d 0a 20  >outname); . }. 
17c90 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e  fprintf(out,"}\n
17ca0 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
17cb0 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  . return;.}../*.
17cc0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 28  ** Return TRUE (
17cd0 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68 65  non-zero) if the
17ce0 20 67 69 76 65 6e 20 73 79 6d 62 6f 6c 20 68 61   given symbol ha
17cf0 73 20 61 20 64 65 73 74 72 75 63 74 6f 72 2e 0a  s a destructor..
17d00 2a 2f 0a 69 6e 74 20 68 61 73 5f 64 65 73 74 72  */.int has_destr
17d10 75 63 74 6f 72 28 73 74 72 75 63 74 20 73 79 6d  uctor(struct sym
17d20 62 6f 6c 20 2a 73 70 2c 20 73 74 72 75 63 74 20  bol *sp, struct 
17d30 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
17d40 20 69 6e 74 20 72 65 74 3b 0a 20 20 69 66 28 20   int ret;.  if( 
17d50 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
17d60 41 4c 20 29 7b 0a 20 20 20 20 72 65 74 20 3d 20  AL ){.    ret = 
17d70 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 21  lemp->tokendest!
17d80 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
17d90 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 76 61 72   ret = lemp->var
17da0 64 65 73 74 21 3d 30 20 7c 7c 20 73 70 2d 3e 64  dest!=0 || sp->d
17db0 65 73 74 72 75 63 74 6f 72 21 3d 30 3b 0a 20 20  estructor!=0;.  
17dc0 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
17dd0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
17de0 74 65 78 74 20 74 6f 20 61 20 64 79 6e 61 6d 69  text to a dynami
17df0 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
17e00 73 74 72 69 6e 67 2e 20 20 49 66 20 7a 54 65 78  string.  If zTex
17e10 74 20 69 73 20 30 20 74 68 65 6e 0a 2a 2a 20 72  t is 0 then.** r
17e20 65 73 65 74 20 74 68 65 20 73 74 72 69 6e 67 20  eset the string 
17e30 74 6f 20 62 65 20 65 6d 70 74 79 20 61 67 61 69  to be empty agai
17e40 6e 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  n.  Always retur
17e50 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  n the complete t
17e60 65 78 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 74  ext.** of the st
17e70 72 69 6e 67 20 28 77 68 69 63 68 20 69 73 20 6f  ring (which is o
17e80 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20  verwritten with 
17e90 65 61 63 68 20 63 61 6c 6c 29 2e 0a 2a 2a 0a 2a  each call)..**.*
17ea0 2a 20 6e 20 62 79 74 65 73 20 6f 66 20 7a 54 65  * n bytes of zTe
17eb0 78 74 20 61 72 65 20 73 74 6f 72 65 64 2e 20 20  xt are stored.  
17ec0 49 66 20 6e 3d 3d 30 20 74 68 65 6e 20 61 6c 6c  If n==0 then all
17ed0 20 6f 66 20 7a 54 65 78 74 20 75 70 20 74 6f 20   of zText up to 
17ee0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 5c 30 30  the first.** \00
17ef0 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 69 73 20  0 terminator is 
17f00 73 74 6f 72 65 64 2e 20 20 7a 54 65 78 74 20 63  stored.  zText c
17f10 61 6e 20 63 6f 6e 74 61 69 6e 20 75 70 20 74 6f  an contain up to
17f20 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f   two instances o
17f30 66 0a 2a 2a 20 25 64 2e 20 20 54 68 65 20 76 61  f.** %d.  The va
17f40 6c 75 65 73 20 6f 66 20 70 31 20 61 6e 64 20 70  lues of p1 and p
17f50 32 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  2 are written in
17f60 74 6f 20 74 68 65 20 66 69 72 73 74 20 61 6e 64  to the first and
17f70 20 73 65 63 6f 6e 64 0a 2a 2a 20 25 64 2e 0a 2a   second.** %d..*
17f80 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 2d 31 2c 20 74  *.** If n==-1, t
17f90 68 65 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73  hen the previous
17fa0 20 63 68 61 72 61 63 74 65 72 20 69 73 20 6f 76   character is ov
17fb0 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 50 52  erwritten..*/.PR
17fc0 49 56 41 54 45 20 63 68 61 72 20 2a 61 70 70 65  IVATE char *appe
17fd0 6e 64 5f 73 74 72 28 63 6f 6e 73 74 20 63 68 61  nd_str(const cha
17fe0 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 6e 2c  r *zText, int n,
17ff0 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
18000 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
18010 65 6d 70 74 79 5b 31 5d 20 3d 20 7b 20 30 20 7d  empty[1] = { 0 }
18020 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  ;.  static char 
18030 2a 7a 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  *z = 0;.  static
18040 20 69 6e 74 20 61 6c 6c 6f 63 65 64 20 3d 20 30   int alloced = 0
18050 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 75  ;.  static int u
18060 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  sed = 0;.  int c
18070 3b 0a 20 20 63 68 61 72 20 7a 49 6e 74 5b 34 30  ;.  char zInt[40
18080 5d 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 3d 3d  ];.  if( zText==
18090 30 20 29 7b 0a 20 20 20 20 75 73 65 64 20 3d 20  0 ){.    used = 
180a0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 3b  0;.    return z;
180b0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 3d 30 20  .  }.  if( n<=0 
180c0 29 7b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29  ){.    if( n<0 )
180d0 7b 0a 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20  {.      used += 
180e0 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
180f0 20 75 73 65 64 3e 3d 30 20 29 3b 0a 20 20 20 20   used>=0 );.    
18100 7d 0a 20 20 20 20 6e 20 3d 20 6c 65 6d 6f 6e 53  }.    n = lemonS
18110 74 72 6c 65 6e 28 7a 54 65 78 74 29 3b 0a 20 20  trlen(zText);.  
18120 7d 0a 20 20 69 66 28 20 28 69 6e 74 29 20 28 6e  }.  if( (int) (n
18130 2b 73 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 2b  +sizeof(zInt)*2+
18140 75 73 65 64 29 20 3e 3d 20 61 6c 6c 6f 63 65 64  used) >= alloced
18150 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 65 64 20   ){.    alloced 
18160 3d 20 6e 20 2b 20 73 69 7a 65 6f 66 28 7a 49 6e  = n + sizeof(zIn
18170 74 29 2a 32 20 2b 20 75 73 65 64 20 2b 20 32 30  t)*2 + used + 20
18180 30 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72  0;.    z = (char
18190 20 2a 29 20 72 65 61 6c 6c 6f 63 28 7a 2c 20 20   *) realloc(z,  
181a0 61 6c 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20 20  alloced);.  }.  
181b0 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
181c0 6e 20 65 6d 70 74 79 3b 0a 20 20 77 68 69 6c 65  n empty;.  while
181d0 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  ( n-- > 0 ){.   
181e0 20 63 20 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b   c = *(zText++);
181f0 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20  .    if( c=='%' 
18200 26 26 20 6e 3e 30 20 26 26 20 7a 54 65 78 74 5b  && n>0 && zText[
18210 30 5d 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20  0]=='d' ){.     
18220 20 73 70 72 69 6e 74 66 28 7a 49 6e 74 2c 20 22   sprintf(zInt, "
18230 25 64 22 2c 20 70 31 29 3b 0a 20 20 20 20 20 20  %d", p1);.      
18240 70 31 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 73  p1 = p2;.      s
18250 74 72 63 70 79 28 26 7a 5b 75 73 65 64 5d 2c 20  trcpy(&z[used], 
18260 7a 49 6e 74 29 3b 0a 20 20 20 20 20 20 75 73 65  zInt);.      use
18270 64 20 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  d += lemonStrlen
18280 28 26 7a 5b 75 73 65 64 5d 29 3b 0a 20 20 20 20  (&z[used]);.    
18290 20 20 7a 54 65 78 74 2b 2b 3b 0a 20 20 20 20 20    zText++;.     
182a0 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   n--;.    }else{
182b0 0a 20 20 20 20 20 20 7a 5b 75 73 65 64 2b 2b 5d  .      z[used++]
182c0 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = c;.    }.  }.
182d0 20 20 7a 5b 75 73 65 64 5d 20 3d 20 30 3b 0a 20    z[used] = 0;. 
182e0 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
182f0 0a 2a 2a 20 7a 43 6f 64 65 20 69 73 20 61 20 73  .** zCode is a s
18300 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 74 68  tring that is th
18310 65 20 61 63 74 69 6f 6e 20 61 73 73 6f 63 69 61  e action associa
18320 74 65 64 20 77 69 74 68 20 61 20 72 75 6c 65 2e  ted with a rule.
18330 20 20 45 78 70 61 6e 64 0a 2a 2a 20 74 68 65 20    Expand.** the 
18340 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 69 73 20  symbols in this 
18350 73 74 72 69 6e 67 20 73 6f 20 74 68 61 74 20 74  string so that t
18360 68 65 20 72 65 66 65 72 20 74 6f 20 65 6c 65 6d  he refer to elem
18370 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 72 73  ents of the pars
18380 65 72 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f 0a  er.** stack..*/.
18390 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 72 61  PRIVATE void tra
183a0 6e 73 6c 61 74 65 5f 63 6f 64 65 28 73 74 72 75  nslate_code(stru
183b0 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20  ct lemon *lemp, 
183c0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29  struct rule *rp)
183d0 7b 0a 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 78  {.  char *cp, *x
183e0 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
183f0 61 72 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 20  ar lhsused = 0; 
18400 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
18410 65 20 4c 48 53 20 65 6c 65 6d 65 6e 74 20 68 61  e LHS element ha
18420 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20  s been used */. 
18430 20 63 68 61 72 20 75 73 65 64 5b 4d 41 58 52 48   char used[MAXRH
18440 53 5d 3b 20 20 20 2f 2a 20 54 72 75 65 20 66 6f  S];   /* True fo
18450 72 20 65 61 63 68 20 52 48 53 20 65 6c 65 6d 65  r each RHS eleme
18460 6e 74 20 77 68 69 63 68 20 69 73 20 75 73 65 64  nt which is used
18470 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */..  for(i=0; 
18480 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
18490 20 75 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20   used[i] = 0;.  
184a0 6c 68 73 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20  lhsused = 0;..  
184b0 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20  if( rp->code==0 
184c0 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68  ){.    static ch
184d0 61 72 20 6e 65 77 6c 69 6e 65 73 74 72 5b 32 5d  ar newlinestr[2]
184e0 20 3d 20 7b 20 27 5c 6e 27 2c 20 27 5c 30 27 20   = { '\n', '\0' 
184f0 7d 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20  };.    rp->code 
18500 3d 20 6e 65 77 6c 69 6e 65 73 74 72 3b 0a 20 20  = newlinestr;.  
18510 20 20 72 70 2d 3e 6c 69 6e 65 20 3d 20 72 70 2d    rp->line = rp-
18520 3e 72 75 6c 65 6c 69 6e 65 3b 0a 20 20 7d 0a 0a  >ruleline;.  }..
18530 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30    append_str(0,0
18540 2c 30 2c 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ,0,0);..  /* Thi
18550 73 20 63 6f 6e 73 74 20 63 61 73 74 20 69 73 20  s const cast is 
18560 77 72 6f 6e 67 20 62 75 74 20 68 61 72 6d 6c 65  wrong but harmle
18570 73 73 2c 20 69 66 20 77 65 27 72 65 20 63 61 72  ss, if we're car
18580 65 66 75 6c 2e 20 2a 2f 0a 20 20 66 6f 72 28 63  eful. */.  for(c
18590 70 3d 28 63 68 61 72 20 2a 29 72 70 2d 3e 63 6f  p=(char *)rp->co
185a0 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a  de; *cp; cp++){.
185b0 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61 28      if( isalpha(
185c0 2a 63 70 29 20 26 26 20 28 63 70 3d 3d 72 70 2d  *cp) && (cp==rp-
185d0 3e 63 6f 64 65 20 7c 7c 20 28 21 69 73 61 6c 6e  >code || (!isaln
185e0 75 6d 28 63 70 5b 2d 31 5d 29 20 26 26 20 63 70  um(cp[-1]) && cp
185f0 5b 2d 31 5d 21 3d 27 5f 27 29 29 20 29 7b 0a 20  [-1]!='_')) ){. 
18600 20 20 20 20 20 63 68 61 72 20 73 61 76 65 64 3b       char saved;
18610 0a 20 20 20 20 20 20 66 6f 72 28 78 70 3d 20 26  .      for(xp= &
18620 63 70 5b 31 5d 3b 20 69 73 61 6c 6e 75 6d 28 2a  cp[1]; isalnum(*
18630 78 70 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b  xp) || *xp=='_';
18640 20 78 70 2b 2b 29 3b 0a 20 20 20 20 20 20 73 61   xp++);.      sa
18650 76 65 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20  ved = *xp;.     
18660 20 2a 78 70 20 3d 20 30 3b 0a 20 20 20 20 20 20   *xp = 0;.      
18670 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  if( rp->lhsalias
18680 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70   && strcmp(cp,rp
18690 2d 3e 6c 68 73 61 6c 69 61 73 29 3d 3d 30 20 29  ->lhsalias)==0 )
186a0 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
186b0 5f 73 74 72 28 22 79 79 67 6f 74 6f 6d 69 6e 6f  _str("yygotomino
186c0 72 2e 79 79 25 64 22 2c 30 2c 72 70 2d 3e 6c 68  r.yy%d",0,rp->lh
186d0 73 2d 3e 64 74 6e 75 6d 2c 30 29 3b 0a 20 20 20  s->dtnum,0);.   
186e0 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20       cp = xp;.  
186f0 20 20 20 20 20 20 6c 68 73 75 73 65 64 20 3d 20        lhsused = 
18700 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
18710 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
18720 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
18730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
18740 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
18750 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70   && strcmp(cp,rp
18760 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d  ->rhsalias[i])==
18770 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
18780 20 69 66 28 20 63 70 21 3d 72 70 2d 3e 63 6f 64   if( cp!=rp->cod
18790 65 20 26 26 20 63 70 5b 2d 31 5d 3d 3d 27 40 27  e && cp[-1]=='@'
187a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
187b0 20 20 2f 2a 20 49 66 20 74 68 65 20 61 72 67 75    /* If the argu
187c0 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
187d0 6f 72 6d 20 40 58 20 74 68 65 6e 20 73 75 62 73  orm @X then subs
187e0 74 69 74 75 74 65 64 0a 20 20 20 20 20 20 20 20  tituted.        
187f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 6f 6b        ** the tok
18800 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 2c 20  en number of X, 
18810 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  not the value of
18820 20 58 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20   X */.          
18830 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22      append_str("
18840 79 79 6d 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22  yymsp[%d].major"
18850 2c 2d 31 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  ,-1,i-rp->nrhs+1
18860 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,0);.           
18870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18880 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
18890 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68  bol *sp = rp->rh
188a0 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  s[i];.          
188b0 20 20 20 20 69 6e 74 20 64 74 6e 75 6d 3b 0a 20      int dtnum;. 
188c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
188d0 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49   sp->type==MULTI
188e0 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
188f0 20 20 20 20 20 20 20 20 20 20 20 20 64 74 6e 75              dtnu
18900 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30  m = sp->subsym[0
18910 5d 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20  ]->dtnum;.      
18920 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
18930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
18940 74 6e 75 6d 20 3d 20 73 70 2d 3e 64 74 6e 75 6d  tnum = sp->dtnum
18950 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
18960 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
18970 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73  append_str("yyms
18980 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64  p[%d].minor.yy%d
18990 22 2c 30 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  ",0,i-rp->nrhs+1
189a0 2c 20 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20  , dtnum);.      
189b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
189c0 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20      cp = xp;.   
189d0 20 20 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d           used[i]
189e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
189f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
18a00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
18a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 78 70       }.      *xp
18a20 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a   = saved;.    }.
18a30 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 63      append_str(c
18a40 70 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  p, 1, 0, 0);.  }
18a50 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a   /* End loop */.
18a60 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  /* Check to m
18a70 61 6b 65 20 73 75 72 65 20 74 68 65 20 4c 48 53  ake sure the LHS
18a80 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a   has been used *
18a90 2f 0a 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61  /.  if( rp->lhsa
18aa0 6c 69 61 73 20 26 26 20 21 6c 68 73 75 73 65 64  lias && !lhsused
18ab0 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67   ){.    ErrorMsg
18ac0 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
18ad0 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20  rp->ruleline,.  
18ae0 20 20 20 20 22 4c 61 62 65 6c 20 5c 22 25 73 5c      "Label \"%s\
18af0 22 20 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22  " for \"%s(%s)\"
18b00 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22   is never used."
18b10 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68  ,.        rp->lh
18b20 73 61 6c 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e  salias,rp->lhs->
18b30 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  name,rp->lhsalia
18b40 73 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72  s);.    lemp->er
18b50 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20  rorcnt++;.  }.. 
18b60 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 64 65 73   /* Generate des
18b70 74 72 75 63 74 6f 72 20 63 6f 64 65 20 66 6f 72  tructor code for
18b80 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 68 69   RHS symbols whi
18b90 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ch are not used 
18ba0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 72 65 64 75  in the.  ** redu
18bb0 63 65 20 63 6f 64 65 20 2a 2f 0a 20 20 66 6f 72  ce code */.  for
18bc0 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
18bd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
18be0 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20  rp->rhsalias[i] 
18bf0 26 26 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20  && !used[i] ){. 
18c00 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
18c10 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d  mp->filename,rp-
18c20 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20  >ruleline,.     
18c30 20 20 20 22 4c 61 62 65 6c 20 25 73 20 66 6f 72     "Label %s for
18c40 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e   \"%s(%s)\" is n
18c50 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20  ever used.",.   
18c60 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61       rp->rhsalia
18c70 73 5b 69 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d  s[i],rp->rhs[i]-
18c80 3e 6e 61 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69  >name,rp->rhsali
18c90 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 6c 65  as[i]);.      le
18ca0 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
18cb0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70      }else if( rp
18cc0 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 3d 3d 30  ->rhsalias[i]==0
18cd0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61   ){.      if( ha
18ce0 73 5f 64 65 73 74 72 75 63 74 6f 72 28 72 70 2d  s_destructor(rp-
18cf0 3e 72 68 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b  >rhs[i],lemp) ){
18d00 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f  .        append_
18d10 73 74 72 28 22 20 20 79 79 5f 64 65 73 74 72 75  str("  yy_destru
18d20 63 74 6f 72 28 79 79 70 50 61 72 73 65 72 2c 25  ctor(yypParser,%
18d30 64 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e  d,&yymsp[%d].min
18d40 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20  or);\n", 0,.    
18d50 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69         rp->rhs[i
18d60 5d 2d 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e  ]->index,i-rp->n
18d70 72 68 73 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  rhs+1);.      }e
18d80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
18d90 4e 6f 20 64 65 73 74 72 75 63 74 6f 72 20 64 65  No destructor de
18da0 66 69 6e 65 64 20 66 6f 72 20 74 68 69 73 20 74  fined for this t
18db0 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  erm */.      }. 
18dc0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
18dd0 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 20 63  p->code ){.    c
18de0 70 20 3d 20 61 70 70 65 6e 64 5f 73 74 72 28 30  p = append_str(0
18df0 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 72 70 2d  ,0,0,0);.    rp-
18e00 3e 63 6f 64 65 20 3d 20 53 74 72 73 61 66 65 28  >code = Strsafe(
18e10 63 70 3f 63 70 3a 22 22 29 3b 0a 20 20 7d 0a 7d  cp?cp:"");.  }.}
18e20 0a 0a 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74  ../* .** Generat
18e30 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
18e40 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20 72  cutes when the r
18e50 75 6c 65 20 22 72 70 22 20 69 73 20 72 65 64 75  ule "rp" is redu
18e60 63 65 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74  ced.  Write.** t
18e70 68 65 20 63 6f 64 65 20 74 6f 20 22 6f 75 74 22  he code to "out"
18e80 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e  .  Make sure lin
18e90 65 6e 6f 20 73 74 61 79 73 20 75 70 2d 74 6f 2d  eno stays up-to-
18ea0 64 61 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  date..*/.PRIVATE
18eb0 20 76 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65 28   void emit_code(
18ec0 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 0a 20 20  .  FILE *out,.  
18ed0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c  struct rule *rp,
18ee0 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  .  struct lemon 
18ef0 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c 69  *lemp,.  int *li
18f00 6e 65 6e 6f 0a 29 7b 0a 20 63 6f 6e 73 74 20 63  neno.){. const c
18f10 68 61 72 20 2a 63 70 3b 0a 0a 20 2f 2a 20 47 65  har *cp;.. /* Ge
18f20 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64  nerate code to d
18f30 6f 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74  o the reduce act
18f40 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e  ion */. if( rp->
18f50 63 6f 64 65 20 29 7b 0a 20 20 20 69 66 20 28 21  code ){.   if (!
18f60 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66  lemp->nolinenosf
18f70 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f 29  lag) { (*lineno)
18f80 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  ++; tplt_linedir
18f90 28 6f 75 74 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65  (out,rp->line,le
18fa0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 20 7d  mp->filename); }
18fb0 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
18fc0 22 7b 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b  "{%s",rp->code);
18fd0 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63  .   for(cp=rp->c
18fe0 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b  ode; *cp; cp++){
18ff0 0a 20 20 20 20 20 69 66 28 20 2a 63 70 3d 3d 27  .     if( *cp=='
19000 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n' ) (*lineno)+
19010 2b 3b 0a 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c  +;.   } /* End l
19020 6f 6f 70 20 2a 2f 0a 20 20 20 66 70 72 69 6e 74  oop */.   fprint
19030 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a  f(out,"}\n"); (*
19040 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66  lineno)++;.   if
19050 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e   (!lemp->nolinen
19060 6f 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65  osflag) { (*line
19070 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65  no)++; tplt_line
19080 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c  dir(out,*lineno,
19090 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20  lemp->outname); 
190a0 7d 0a 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20  }. } /* End if( 
190b0 72 70 2d 3e 63 6f 64 65 20 29 20 2a 2f 0a 0a 20  rp->code ) */.. 
190c0 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
190d0 20 50 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e   Print the defin
190e0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69  ition of the uni
190f0 6f 6e 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  on used for the 
19100 70 61 72 73 65 72 27 73 20 64 61 74 61 20 73 74  parser's data st
19110 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69  ack..** This uni
19120 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c  on contains fiel
19130 64 73 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73  ds for every pos
19140 73 69 62 6c 65 20 64 61 74 61 20 74 79 70 65 20  sible data type 
19150 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e  for tokens.** an
19160 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20  d nonterminals. 
19170 20 49 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20   In the process 
19180 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64  of computing and
19190 20 70 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a   printing this.*
191a0 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65  * union, also se
191b0 74 20 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66  t the ".dtnum" f
191c0 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65  ield of every te
191d0 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65  rminal and nonte
191e0 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c  rminal.** symbol
191f0 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f  ..*/.void print_
19200 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 0a 20 20 46  stack_union(.  F
19210 49 4c 45 20 2a 6f 75 74 2c 20 20 20 20 20 20 20  ILE *out,       
19220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19230 65 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d 20  e output stream 
19240 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f  */.  struct lemo
19250 6e 20 2a 6c 65 6d 70 2c 20 20 20 20 20 20 20 20  n *lemp,        
19260 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66   /* The main inf
19270 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  o structure for 
19280 74 68 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 20  this parser */. 
19290 20 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 2c 20 20   int *plineno,  
192a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
192b0 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c  Pointer to the l
192c0 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ine number */.  
192d0 69 6e 74 20 6d 68 66 6c 61 67 20 20 20 20 20 20  int mhflag      
192e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
192f0 72 75 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e  rue if generatin
19300 67 20 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75  g makeheaders ou
19310 74 70 75 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  tput */.){.  int
19320 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65   lineno = *pline
19330 6e 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 69  no;    /* The li
19340 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ne number of the
19350 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63 68 61   output */.  cha
19360 72 20 2a 2a 74 79 70 65 73 3b 20 20 20 20 20 20  r **types;      
19370 20 20 20 20 20 20 20 2f 2a 20 41 20 68 61 73 68         /* A hash
19380 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79   table of dataty
19390 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72  pes */.  int arr
193a0 61 79 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  aysize;         
193b0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
193c0 65 20 22 74 79 70 65 73 22 20 61 72 72 61 79 20  e "types" array 
193d0 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74 6c 65  */.  int maxdtle
193e0 6e 67 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f  ngth;          /
193f0 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68  * Maximum length
19400 20 6f 66 20 61 6e 79 20 22 2e 64 61 74 61 74 79   of any ".dataty
19410 70 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  pe" field. */.  
19420 63 68 61 72 20 2a 73 74 64 64 74 3b 20 20 20 20  char *stddt;    
19430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
19440 6e 64 61 72 64 69 7a 65 64 20 6e 61 6d 65 20 66  ndardized name f
19450 6f 72 20 61 20 64 61 74 61 74 79 70 65 20 2a 2f  or a datatype */
19460 0a 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20  .  int i,j;     
19470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19480 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
19490 0a 20 20 69 6e 74 20 68 61 73 68 3b 20 20 20 20  .  int hash;    
194a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
194b0 46 6f 72 20 68 61 73 68 69 6e 67 20 74 68 65 20  For hashing the 
194c0 6e 61 6d 65 20 6f 66 20 61 20 74 79 70 65 20 2a  name of a type *
194d0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
194e0 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  name;         /*
194f0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72   Name of the par
19500 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ser */..  /* All
19510 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
19520 6c 69 7a 65 20 74 79 70 65 73 5b 5d 20 61 6e 64  lize types[] and
19530 20 61 6c 6c 6f 63 61 74 65 20 73 74 64 64 74 5b   allocate stddt[
19540 5d 20 2a 2f 0a 20 20 61 72 72 61 79 73 69 7a 65  ] */.  arraysize
19550 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   = lemp->nsymbol
19560 20 2a 20 32 3b 0a 20 20 74 79 70 65 73 20 3d 20   * 2;.  types = 
19570 28 63 68 61 72 2a 2a 29 63 61 6c 6c 6f 63 28 20  (char**)calloc( 
19580 61 72 72 61 79 73 69 7a 65 2c 20 73 69 7a 65 6f  arraysize, sizeo
19590 66 28 63 68 61 72 2a 29 20 29 3b 0a 20 20 69 66  f(char*) );.  if
195a0 28 20 74 79 70 65 73 3d 3d 30 20 29 7b 0a 20 20  ( types==0 ){.  
195b0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
195c0 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  ,"Out of memory.
195d0 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
195e0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
195f0 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69  ; i<arraysize; i
19600 2b 2b 29 20 74 79 70 65 73 5b 69 5d 20 3d 20 30  ++) types[i] = 0
19610 3b 0a 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20  ;.  maxdtlength 
19620 3d 20 30 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  = 0;.  if( lemp-
19630 3e 76 61 72 74 79 70 65 20 29 7b 0a 20 20 20 20  >vartype ){.    
19640 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65  maxdtlength = le
19650 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e  monStrlen(lemp->
19660 76 61 72 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20  vartype);.  }.  
19670 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
19680 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
19690 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
196a0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
196b0 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
196c0 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73  ls[i];.    if( s
196d0 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 29  p->datatype==0 )
196e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c   continue;.    l
196f0 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  en = lemonStrlen
19700 28 73 70 2d 3e 64 61 74 61 74 79 70 65 29 3b 0a  (sp->datatype);.
19710 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 64      if( len>maxd
19720 74 6c 65 6e 67 74 68 20 29 20 6d 61 78 64 74 6c  tlength ) maxdtl
19730 65 6e 67 74 68 20 3d 20 6c 65 6e 3b 0a 20 20 7d  ength = len;.  }
19740 0a 20 20 73 74 64 64 74 20 3d 20 28 63 68 61 72  .  stddt = (char
19750 2a 29 6d 61 6c 6c 6f 63 28 20 6d 61 78 64 74 6c  *)malloc( maxdtl
19760 65 6e 67 74 68 2a 32 20 2b 20 31 20 29 3b 0a 20  ength*2 + 1 );. 
19770 20 69 66 28 20 73 74 64 64 74 3d 3d 30 20 29 7b   if( stddt==0 ){
19780 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
19790 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f  err,"Out of memo
197a0 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ry.\n");.    exi
197b0 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  t(1);.  }..  /* 
197c0 42 75 69 6c 64 20 61 20 68 61 73 68 20 74 61 62  Build a hash tab
197d0 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65 73 2e  le of datatypes.
197e0 20 54 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69   The ".dtnum" fi
197f0 65 6c 64 20 6f 66 20 65 61 63 68 20 73 79 6d 62  eld of each symb
19800 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69 6c 6c 65  ol.  ** is fille
19810 64 20 69 6e 20 77 69 74 68 20 74 68 65 20 68 61  d in with the ha
19820 73 68 20 69 6e 64 65 78 20 70 6c 75 73 20 31 2e  sh index plus 1.
19830 20 20 41 20 22 2e 64 74 6e 75 6d 22 20 76 61 6c    A ".dtnum" val
19840 75 65 20 6f 66 20 30 20 69 73 0a 20 20 2a 2a 20  ue of 0 is.  ** 
19850 75 73 65 64 20 66 6f 72 20 74 65 72 6d 69 6e 61  used for termina
19860 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49 66 20 74  l symbols.  If t
19870 68 65 72 65 20 69 73 20 6e 6f 20 25 64 65 66 61  here is no %defa
19880 75 6c 74 5f 74 79 70 65 20 64 65 66 69 6e 65 64  ult_type defined
19890 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20 69 73 20   then.  ** 0 is 
198a0 61 6c 73 6f 20 75 73 65 64 20 61 73 20 74 68 65  also used as the
198b0 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65 20 66 6f   .dtnum value fo
198c0 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77  r nonterminals w
198d0 68 69 63 68 20 64 6f 20 6e 6f 74 20 73 70 65 63  hich do not spec
198e0 69 66 79 0a 20 20 2a 2a 20 61 20 64 61 74 61 74  ify.  ** a datat
198f0 79 70 65 20 75 73 69 6e 67 20 74 68 65 20 25 74  ype using the %t
19900 79 70 65 20 64 69 72 65 63 74 69 76 65 2e 0a 20  ype directive.. 
19910 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
19920 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
19930 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
19940 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65   symbol *sp = le
19950 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
19960 20 20 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20      char *cp;.  
19970 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d 70 2d 3e    if( sp==lemp->
19980 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20  errsym ){.      
19990 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61 72 72 61  sp->dtnum = arra
199a0 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20 20 20 63  ysize+1;.      c
199b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
199c0 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 21     if( sp->type!
199d0 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20  =NONTERMINAL || 
199e0 28 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30  (sp->datatype==0
199f0 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70   && lemp->vartyp
19a00 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  e==0) ){.      s
19a10 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20  p->dtnum = 0;.  
19a20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
19a30 20 20 7d 0a 20 20 20 20 63 70 20 3d 20 73 70 2d    }.    cp = sp-
19a40 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20 69  >datatype;.    i
19a50 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20  f( cp==0 ) cp = 
19a60 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3b 0a 20  lemp->vartype;. 
19a70 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 77 68     j = 0;.    wh
19a80 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 63 70  ile( isspace(*cp
19a90 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 77 68  ) ) cp++;.    wh
19aa0 69 6c 65 28 20 2a 63 70 20 29 20 73 74 64 64 74  ile( *cp ) stddt
19ab0 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a 20  [j++] = *cp++;. 
19ac0 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26     while( j>0 &&
19ad0 20 69 73 73 70 61 63 65 28 73 74 64 64 74 5b 6a   isspace(stddt[j
19ae0 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20 20 20  -1]) ) j--;.    
19af0 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20  stddt[j] = 0;.  
19b00 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65    if( lemp->toke
19b10 6e 74 79 70 65 20 26 26 20 73 74 72 63 6d 70 28  ntype && strcmp(
19b20 73 74 64 64 74 2c 20 6c 65 6d 70 2d 3e 74 6f 6b  stddt, lemp->tok
19b30 65 6e 74 79 70 65 29 3d 3d 30 20 29 7b 0a 20 20  entype)==0 ){.  
19b40 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
19b50 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
19b60 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73  e;.    }.    has
19b70 68 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a  h = 0;.    for(j
19b80 3d 30 3b 20 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b  =0; stddt[j]; j+
19b90 2b 29 7b 0a 20 20 20 20 20 20 68 61 73 68 20 3d  +){.      hash =
19ba0 20 68 61 73 68 2a 35 33 20 2b 20 73 74 64 64 74   hash*53 + stddt
19bb0 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  [j];.    }.    h
19bc0 61 73 68 20 3d 20 28 68 61 73 68 20 26 20 30 78  ash = (hash & 0x
19bd0 37 66 66 66 66 66 66 66 29 25 61 72 72 61 79 73  7fffffff)%arrays
19be0 69 7a 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ize;.    while( 
19bf0 74 79 70 65 73 5b 68 61 73 68 5d 20 29 7b 0a 20  types[hash] ){. 
19c00 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
19c10 74 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64  types[hash],stdd
19c20 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)==0 ){.       
19c30 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73   sp->dtnum = has
19c40 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 62  h + 1;.        b
19c50 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
19c60 20 20 20 20 68 61 73 68 2b 2b 3b 0a 20 20 20 20      hash++;.    
19c70 20 20 69 66 28 20 68 61 73 68 3e 3d 61 72 72 61    if( hash>=arra
19c80 79 73 69 7a 65 20 29 20 68 61 73 68 20 3d 20 30  ysize ) hash = 0
19c90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19ca0 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29  types[hash]==0 )
19cb0 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75  {.      sp->dtnu
19cc0 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20  m = hash + 1;.  
19cd0 20 20 20 20 74 79 70 65 73 5b 68 61 73 68 5d 20      types[hash] 
19ce0 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28  = (char*)malloc(
19cf0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 74 64   lemonStrlen(std
19d00 64 74 29 2b 31 20 29 3b 0a 20 20 20 20 20 20 69  dt)+1 );.      i
19d10 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d  f( types[hash]==
19d20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  0 ){.        fpr
19d30 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74  intf(stderr,"Out
19d40 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b   of memory.\n");
19d50 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29  .        exit(1)
19d60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19d70 73 74 72 63 70 79 28 74 79 70 65 73 5b 68 61 73  strcpy(types[has
19d80 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20 20 7d  h],stddt);.    }
19d90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e 74  .  }..  /* Print
19da0 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e 69 74   out the definit
19db0 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54 59  ion of YYTOKENTY
19dc0 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54 59  PE and YYMINORTY
19dd0 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c  PE */.  name = l
19de0 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70  emp->name ? lemp
19df0 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22  ->name : "Parse"
19e00 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c  ;.  lineno = *pl
19e10 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68 66  ineno;.  if( mhf
19e20 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f  lag ){ fprintf(o
19e30 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43  ut,"#if INTERFAC
19e40 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  E\n"); lineno++;
19e50 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
19e60 2c 22 23 64 65 66 69 6e 65 20 25 73 54 4f 4b 45  ,"#define %sTOKE
19e70 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d 65  NTYPE %s\n",name
19e80 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65  ,.    lemp->toke
19e90 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65  ntype?lemp->toke
19ea0 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b 20  ntype:"void*"); 
19eb0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28   lineno++;.  if(
19ec0 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e   mhflag ){ fprin
19ed0 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e  tf(out,"#endif\n
19ee0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a  "); lineno++; }.
19ef0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 74    fprintf(out,"t
19f00 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e  ypedef union {\n
19f10 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
19f20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69  fprintf(out,"  i
19f30 6e 74 20 79 79 69 6e 69 74 3b 5c 6e 22 29 3b 20  nt yyinit;\n"); 
19f40 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
19f50 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 54 4f 4b  ntf(out,"  %sTOK
19f60 45 4e 54 59 50 45 20 79 79 30 3b 5c 6e 22 2c 6e  ENTYPE yy0;\n",n
19f70 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
19f80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72    for(i=0; i<arr
19f90 61 79 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  aysize; i++){.  
19fa0 20 20 69 66 28 20 74 79 70 65 73 5b 69 5d 3d 3d    if( types[i]==
19fb0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
19fc0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
19fd0 20 25 73 20 79 79 25 64 3b 5c 6e 22 2c 74 79 70   %s yy%d;\n",typ
19fe0 65 73 5b 69 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65  es[i],i+1); line
19ff0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 74  no++;.    free(t
1a000 79 70 65 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  ypes[i]);.  }.  
1a010 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  if( lemp->errsym
1a020 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20  ->useCnt ){.    
1a030 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69  fprintf(out,"  i
1a040 6e 74 20 79 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70  nt yy%d;\n",lemp
1a050 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29  ->errsym->dtnum)
1a060 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
1a070 20 20 66 72 65 65 28 73 74 64 64 74 29 3b 0a 20    free(stddt);. 
1a080 20 66 72 65 65 28 74 79 70 65 73 29 3b 0a 20 20   free(types);.  
1a090 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 20 59  fprintf(out,"} Y
1a0a0 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22 29 3b  YMINORTYPE;\n");
1a0b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70 6c   lineno++;.  *pl
1a0c0 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a  ineno = lineno;.
1a0d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a0e0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 43 20  the name of a C 
1a0f0 64 61 74 61 74 79 70 65 20 61 62 6c 65 20 74 6f  datatype able to
1a100 20 72 65 70 72 65 73 65 6e 74 20 76 61 6c 75 65   represent value
1a110 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 6c 77 72  s between.** lwr
1a120 20 61 6e 64 20 75 70 72 2c 20 69 6e 63 6c 75 73   and upr, inclus
1a130 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ive..*/.static c
1a140 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d  onst char *minim
1a150 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e 74  um_size_type(int
1a160 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 29 7b 0a   lwr, int upr){.
1a170 20 20 69 66 28 20 6c 77 72 3e 3d 30 20 29 7b 0a    if( lwr>=0 ){.
1a180 20 20 20 20 69 66 28 20 75 70 72 3c 3d 32 35 35      if( upr<=255
1a190 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1a1a0 20 22 75 6e 73 69 67 6e 65 64 20 63 68 61 72 22   "unsigned char"
1a1b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1a1c0 75 70 72 3c 36 35 35 33 35 20 29 7b 0a 20 20 20  upr<65535 ){.   
1a1d0 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67     return "unsig
1a1e0 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 22 3b 0a  ned short int";.
1a1f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a200 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e 65   return "unsigne
1a210 64 20 69 6e 74 22 3b 0a 20 20 20 20 7d 0a 20 20  d int";.    }.  
1a220 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d  }else if( lwr>=-
1a230 31 32 37 20 26 26 20 75 70 72 3c 3d 31 32 37 20  127 && upr<=127 
1a240 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 73  ){.    return "s
1a250 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20 7d  igned char";.  }
1a260 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d 33  else if( lwr>=-3
1a270 32 37 36 37 20 26 26 20 75 70 72 3c 33 32 37 36  2767 && upr<3276
1a280 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  7 ){.    return 
1a290 22 73 68 6f 72 74 22 3b 0a 20 20 7d 65 6c 73 65  "short";.  }else
1a2a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 69 6e  {.    return "in
1a2b0 74 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t";.  }.}../*.**
1a2c0 20 45 61 63 68 20 73 74 61 74 65 20 63 6f 6e 74   Each state cont
1a2d0 61 69 6e 73 20 61 20 73 65 74 20 6f 66 20 74 6f  ains a set of to
1a2e0 6b 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ken transaction 
1a2f0 61 6e 64 20 61 20 73 65 74 20 6f 66 0a 2a 2a 20  and a set of.** 
1a300 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 74 72 61 6e  nonterminal tran
1a310 73 61 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20  sactions.  Each 
1a320 6f 66 20 74 68 65 73 65 20 73 65 74 73 20 6d 61  of these sets ma
1a330 6b 65 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a  kes an instance.
1a340 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
1a350 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
1a360 41 6e 20 61 72 72 61 79 20 6f 66 20 74 68 65 73  An array of thes
1a370 65 20 73 74 72 75 63 74 75 72 65 73 20 69 73 20  e structures is 
1a380 75 73 65 64 0a 2a 2a 20 74 6f 20 6f 72 64 65 72  used.** to order
1a390 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
1a3a0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
1a3b0 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c  yy_action[] tabl
1a3c0 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 61 78 73  e..*/.struct axs
1a3d0 65 74 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74  et {.  struct st
1a3e0 61 74 65 20 2a 73 74 70 3b 20 20 20 2f 2a 20 41  ate *stp;   /* A
1a3f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
1a400 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  ate */.  int isT
1a410 6b 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  kn;           /*
1a420 20 54 72 75 65 20 74 6f 20 75 73 65 20 74 6f 6b   True to use tok
1a430 65 6e 73 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ens.  False for 
1a440 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 2a 2f  non-terminals */
1a450 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20  .  int nAction; 
1a460 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a470 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 2a 2f 0a  r of actions */.
1a480 20 20 69 6e 74 20 69 4f 72 64 65 72 3b 20 20 20    int iOrder;   
1a490 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
1a4a0 61 6c 20 6f 72 64 65 72 20 6f 66 20 61 63 74 69  al order of acti
1a4b0 6f 6e 20 73 65 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  on sets */.};../
1a4c0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 6f 20  *.** Compare to 
1a4d0 61 78 73 65 74 20 73 74 72 75 63 74 75 72 65 73  axset structures
1a4e0 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72   for sorting pur
1a4f0 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  poses.*/.static 
1a500 69 6e 74 20 61 78 73 65 74 5f 63 6f 6d 70 61 72  int axset_compar
1a510 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c  e(const void *a,
1a520 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b   const void *b){
1a530 0a 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20  .  struct axset 
1a540 2a 70 31 20 3d 20 28 73 74 72 75 63 74 20 61 78  *p1 = (struct ax
1a550 73 65 74 2a 29 61 3b 0a 20 20 73 74 72 75 63 74  set*)a;.  struct
1a560 20 61 78 73 65 74 20 2a 70 32 20 3d 20 28 73 74   axset *p2 = (st
1a570 72 75 63 74 20 61 78 73 65 74 2a 29 62 3b 0a 20  ruct axset*)b;. 
1a580 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 70 32   int c;.  c = p2
1a590 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20 70 31 2d 3e  ->nAction - p1->
1a5a0 6e 41 63 74 69 6f 6e 3b 0a 20 20 69 66 28 20 63  nAction;.  if( c
1a5b0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 70  ==0 ){.    c = p
1a5c0 32 2d 3e 69 4f 72 64 65 72 20 2d 20 70 31 2d 3e  2->iOrder - p1->
1a5d0 69 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 61 73  iOrder;.  }.  as
1a5e0 73 65 72 74 28 20 63 21 3d 30 20 7c 7c 20 70 31  sert( c!=0 || p1
1a5f0 3d 3d 70 32 20 29 3b 0a 20 20 72 65 74 75 72 6e  ==p2 );.  return
1a600 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69   c;.}../*.** Wri
1a610 74 65 20 74 65 78 74 20 6f 6e 20 22 6f 75 74 22  te text on "out"
1a620 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
1a630 74 68 65 20 72 75 6c 65 20 22 72 70 22 2e 0a 2a  the rule "rp"..*
1a640 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 72  /.static void wr
1a650 69 74 65 52 75 6c 65 54 65 78 74 28 46 49 4c 45  iteRuleText(FILE
1a660 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 72 75   *out, struct ru
1a670 6c 65 20 2a 72 70 29 7b 0a 20 20 69 6e 74 20 6a  le *rp){.  int j
1a680 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1a690 22 25 73 20 3a 3a 3d 22 2c 20 72 70 2d 3e 6c 68  "%s ::=", rp->lh
1a6a0 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  s->name);.  for(
1a6b0 6a 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b  j=0; j<rp->nrhs;
1a6c0 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   j++){.    struc
1a6d0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72  t symbol *sp = r
1a6e0 70 2d 3e 72 68 73 5b 6a 5d 3b 0a 20 20 20 20 66  p->rhs[j];.    f
1a6f0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22  printf(out," %s"
1a700 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  , sp->name);.   
1a710 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d   if( sp->type==M
1a720 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
1a730 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
1a740 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 73 70     for(k=1; k<sp
1a750 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b  ->nsubsym; k++){
1a760 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1a770 28 6f 75 74 2c 22 7c 25 73 22 2c 73 70 2d 3e 73  (out,"|%s",sp->s
1a780 75 62 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d 65 29 3b  ubsym[k]->name);
1a790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a7a0 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65 72 61   }.}.../* Genera
1a7b0 74 65 20 43 20 73 6f 75 72 63 65 20 63 6f 64 65  te C source code
1a7c0 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20   for the parser 
1a7d0 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61  */.void ReportTa
1a7e0 62 6c 65 28 0a 20 20 73 74 72 75 63 74 20 6c 65  ble(.  struct le
1a7f0 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74  mon *lemp,.  int
1a800 20 6d 68 66 6c 61 67 20 20 20 20 20 2f 2a 20 4f   mhflag     /* O
1a810 75 74 70 75 74 20 69 6e 20 6d 61 6b 65 68 65 61  utput in makehea
1a820 64 65 72 73 20 66 6f 72 6d 61 74 20 69 66 20 74  ders format if t
1a830 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 46 49 4c 45  rue */.){.  FILE
1a840 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68   *out, *in;.  ch
1a850 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45  ar line[LINESIZE
1a860 5d 3b 0a 20 20 69 6e 74 20 20 6c 69 6e 65 6e 6f  ];.  int  lineno
1a870 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
1a880 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
1a890 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 73 74  action *ap;.  st
1a8a0 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
1a8b0 20 73 74 72 75 63 74 20 61 63 74 74 61 62 20 2a   struct acttab *
1a8c0 70 41 63 74 74 61 62 3b 0a 20 20 69 6e 74 20 69  pActtab;.  int i
1a8d0 2c 20 6a 2c 20 6e 3b 0a 20 20 63 6f 6e 73 74 20  , j, n;.  const 
1a8e0 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 69 6e  char *name;.  in
1a8f0 74 20 6d 6e 54 6b 6e 4f 66 73 74 2c 20 6d 78 54  t mnTknOfst, mxT
1a900 6b 6e 4f 66 73 74 3b 0a 20 20 69 6e 74 20 6d 6e  knOfst;.  int mn
1a910 4e 74 4f 66 73 74 2c 20 6d 78 4e 74 4f 66 73 74  NtOfst, mxNtOfst
1a920 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65 74  ;.  struct axset
1a930 20 2a 61 78 3b 0a 0a 20 20 69 6e 20 3d 20 74 70   *ax;..  in = tp
1a940 6c 74 5f 6f 70 65 6e 28 6c 65 6d 70 29 3b 0a 20  lt_open(lemp);. 
1a950 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74   if( in==0 ) ret
1a960 75 72 6e 3b 0a 20 20 6f 75 74 20 3d 20 66 69 6c  urn;.  out = fil
1a970 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 63 22  e_open(lemp,".c"
1a980 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 6f 75  ,"wb");.  if( ou
1a990 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 63 6c 6f  t==0 ){.    fclo
1a9a0 73 65 28 69 6e 29 3b 0a 20 20 20 20 72 65 74 75  se(in);.    retu
1a9b0 72 6e 3b 0a 20 20 7d 0a 20 20 6c 69 6e 65 6e 6f  rn;.  }.  lineno
1a9c0 20 3d 20 31 3b 0a 20 20 74 70 6c 74 5f 78 66 65   = 1;.  tplt_xfe
1a9d0 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1a9e0 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1a9f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
1aa00 20 69 6e 63 6c 75 64 65 20 63 6f 64 65 2c 20 69   include code, i
1aa10 66 20 61 6e 79 20 2a 2f 0a 20 20 74 70 6c 74 5f  f any */.  tplt_
1aa20 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
1aa30 65 6d 70 2d 3e 69 6e 63 6c 75 64 65 2c 26 6c 69  emp->include,&li
1aa40 6e 65 6e 6f 29 3b 0a 20 20 69 66 28 20 6d 68 66  neno);.  if( mhf
1aa50 6c 61 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20  lag ){.    char 
1aa60 2a 6e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b  *name = file_mak
1aa70 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 22 2e 68 22  ename(lemp, ".h"
1aa80 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1aa90 75 74 2c 22 23 69 6e 63 6c 75 64 65 20 5c 22 25  ut,"#include \"%
1aaa0 73 5c 22 5c 6e 22 2c 20 6e 61 6d 65 29 3b 20 6c  s\"\n", name); l
1aab0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65  ineno++;.    fre
1aac0 65 28 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 74  e(name);.  }.  t
1aad0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1aae0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1aaf0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1ab00 61 74 65 20 23 64 65 66 69 6e 65 73 20 66 6f 72  ate #defines for
1ab10 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20   all tokens */. 
1ab20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
1ab30 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
1ab40 72 65 66 69 78 3b 0a 20 20 20 20 66 70 72 69 6e  refix;.    fprin
1ab50 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45  tf(out,"#if INTE
1ab60 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e  RFACE\n"); linen
1ab70 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d  o++;.    if( lem
1ab80 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29  p->tokenprefix )
1ab90 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e   prefix = lemp->
1aba0 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 20  tokenprefix;.   
1abb0 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20   else           
1abc0 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20           prefix 
1abd0 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d  = "";.    for(i=
1abe0 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  1; i<lemp->nterm
1abf0 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  inal; i++){.    
1ac00 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1ac10 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25  define %s%-30s %
1ac20 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d  2d\n",prefix,lem
1ac30 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
1ac40 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 6c 69  ame,i);.      li
1ac50 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  neno++;.    }.  
1ac60 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1ac70 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e  endif\n"); linen
1ac80 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
1ac90 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1aca0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1acb0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1acc0 74 68 65 20 64 65 66 69 6e 65 73 20 2a 2f 0a 20  the defines */. 
1acd0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1ace0 65 66 69 6e 65 20 59 59 43 4f 44 45 54 59 50 45  efine YYCODETYPE
1acf0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69   %s\n",.    mini
1ad00 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 30 2c  mum_size_type(0,
1ad10 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 31   lemp->nsymbol+1
1ad20 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  )); lineno++;.  
1ad30 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1ad40 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45 20 25 64  fine YYNOCODE %d
1ad50 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  \n",lemp->nsymbo
1ad60 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  l+1);  lineno++;
1ad70 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1ad80 23 64 65 66 69 6e 65 20 59 59 41 43 54 49 4f 4e  #define YYACTION
1ad90 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20  TYPE %s\n",.    
1ada0 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
1adb0 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  e(0, lemp->nstat
1adc0 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2b 35 29  e+lemp->nrule+5)
1add0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1ade0 69 66 28 20 6c 65 6d 70 2d 3e 77 69 6c 64 63 61  if( lemp->wildca
1adf0 72 64 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  rd ){.    fprint
1ae00 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1ae10 59 57 49 4c 44 43 41 52 44 20 25 64 5c 6e 22 2c  YWILDCARD %d\n",
1ae20 0a 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 77 69  .       lemp->wi
1ae30 6c 64 63 61 72 64 2d 3e 69 6e 64 65 78 29 3b 20  ldcard->index); 
1ae40 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1ae50 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f  print_stack_unio
1ae60 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69 6e 65  n(out,lemp,&line
1ae70 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20 20 66 70  no,mhflag);.  fp
1ae80 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 69 66 6e  rintf(out, "#ifn
1ae90 64 65 66 20 59 59 53 54 41 43 4b 44 45 50 54 48  def YYSTACKDEPTH
1aea0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1aeb0 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 63    if( lemp->stac
1aec0 6b 73 69 7a 65 20 29 7b 0a 20 20 20 20 66 70 72  ksize ){.    fpr
1aed0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1aee0 65 20 59 59 53 54 41 43 4b 44 45 50 54 48 20 25  e YYSTACKDEPTH %
1aef0 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61 63 6b  s\n",lemp->stack
1af00 73 69 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  size);  lineno++
1af10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
1af20 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1af30 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54 48  ine YYSTACKDEPTH
1af40 20 31 30 30 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e   100\n");  linen
1af50 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  o++;.  }.  fprin
1af60 74 66 28 6f 75 74 2c 20 22 23 65 6e 64 69 66 5c  tf(out, "#endif\
1af70 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1af80 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
1af90 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1afa0 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22  #if INTERFACE\n"
1afb0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1afc0 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e  .  name = lemp->
1afd0 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d  name ? lemp->nam
1afe0 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20 69  e : "Parse";.  i
1aff0 66 28 20 6c 65 6d 70 2d 3e 61 72 67 20 26 26 20  f( lemp->arg && 
1b000 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d 20 29 7b 0a  lemp->arg[0] ){.
1b010 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
1b020 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c   = lemonStrlen(l
1b030 65 6d 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 77  emp->arg);.    w
1b040 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 69 73  hile( i>=1 && is
1b050 73 70 61 63 65 28 6c 65 6d 70 2d 3e 61 72 67 5b  space(lemp->arg[
1b060 69 2d 31 5d 29 20 29 20 69 2d 2d 3b 0a 20 20 20  i-1]) ) i--;.   
1b070 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20   while( i>=1 && 
1b080 28 69 73 61 6c 6e 75 6d 28 6c 65 6d 70 2d 3e 61  (isalnum(lemp->a
1b090 72 67 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70  rg[i-1]) || lemp
1b0a0 2d 3e 61 72 67 5b 69 2d 31 5d 3d 3d 27 5f 27 29  ->arg[i-1]=='_')
1b0b0 20 29 20 69 2d 2d 3b 0a 20 20 20 20 66 70 72 69   ) i--;.    fpri
1b0c0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1b0d0 20 25 73 41 52 47 5f 53 44 45 43 4c 20 25 73 3b   %sARG_SDECL %s;
1b0e0 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61  \n",name,lemp->a
1b0f0 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  rg);  lineno++;.
1b100 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b110 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50  "#define %sARG_P
1b120 44 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65  DECL ,%s\n",name
1b130 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69  ,lemp->arg);  li
1b140 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1b150 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1b160 20 25 73 41 52 47 5f 46 45 54 43 48 20 25 73 20   %sARG_FETCH %s 
1b170 3d 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73 5c  = yypParser->%s\
1b180 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1b190 20 20 20 20 20 6e 61 6d 65 2c 6c 65 6d 70 2d 3e       name,lemp->
1b1a0 61 72 67 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69  arg,&lemp->arg[i
1b1b0 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ]);  lineno++;. 
1b1c0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1b1d0 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54  #define %sARG_ST
1b1e0 4f 52 45 20 79 79 70 50 61 72 73 65 72 2d 3e 25  ORE yypParser->%
1b1f0 73 20 3d 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  s = %s\n",.     
1b200 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65              name
1b210 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 2c 26  ,&lemp->arg[i],&
1b220 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20  lemp->arg[i]);  
1b230 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73  lineno++;.  }els
1b240 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e{.    fprintf(o
1b250 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
1b260 47 5f 53 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29  G_SDECL\n",name)
1b270 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1b280 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1b290 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43  efine %sARG_PDEC
1b2a0 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e  L\n",name);  lin
1b2b0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
1b2c0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1b2d0 25 73 41 52 47 5f 46 45 54 43 48 5c 6e 22 2c 6e  %sARG_FETCH\n",n
1b2e0 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
1b2f0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b300 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53  "#define %sARG_S
1b310 54 4f 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c  TORE\n",name); l
1b320 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69  ineno++;.  }.  i
1b330 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20  f( mhflag ){.   
1b340 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65   fprintf(out,"#e
1b350 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ndif\n"); lineno
1b360 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74  ++;.  }.  fprint
1b370 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1b380 59 4e 53 54 41 54 45 20 25 64 5c 6e 22 2c 6c 65  YNSTATE %d\n",le
1b390 6d 70 2d 3e 6e 73 74 61 74 65 29 3b 20 20 6c 69  mp->nstate);  li
1b3a0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1b3b0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1b3c0 59 4e 52 55 4c 45 20 25 64 5c 6e 22 2c 6c 65 6d  YNRULE %d\n",lem
1b3d0 70 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69 6e 65  p->nrule);  line
1b3e0 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70  no++;.  if( lemp
1b3f0 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74  ->errsym->useCnt
1b400 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1b410 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45  out,"#define YYE
1b420 52 52 4f 52 53 59 4d 42 4f 4c 20 25 64 5c 6e 22  RRORSYMBOL %d\n"
1b430 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 69  ,lemp->errsym->i
1b440 6e 64 65 78 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  ndex);  lineno++
1b450 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1b460 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52 52  t,"#define YYERR
1b470 53 59 4d 44 54 20 79 79 25 64 5c 6e 22 2c 6c 65  SYMDT yy%d\n",le
1b480 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75  mp->errsym->dtnu
1b490 6d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  m);  lineno++;. 
1b4a0 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68   }.  if( lemp->h
1b4b0 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  as_fallback ){. 
1b4c0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1b4d0 23 64 65 66 69 6e 65 20 59 59 46 41 4c 4c 42 41  #define YYFALLBA
1b4e0 43 4b 20 31 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e  CK 1\n");  linen
1b4f0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
1b500 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1b510 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1b520 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1b530 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
1b540 20 61 6e 64 20 69 74 73 20 61 73 73 6f 63 69 61   and its associa
1b550 74 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  tes:.  **.  **  
1b560 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 20 20 20 20  yy_action[]     
1b570 20 20 20 41 20 73 69 6e 67 6c 65 20 74 61 62 6c     A single tabl
1b580 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c  e containing all
1b590 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20   actions..  **  
1b5a0 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 20  yy_lookahead[]  
1b5b0 20 20 20 41 20 74 61 62 6c 65 20 63 6f 6e 74 61     A table conta
1b5c0 69 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 6b 61 68  ining the lookah
1b5d0 65 61 64 20 66 6f 72 20 65 61 63 68 20 65 6e 74  ead for each ent
1b5e0 72 79 20 69 6e 0a 20 20 2a 2a 20 20 20 20 20 20  ry in.  **      
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 79                 y
1b600 79 5f 61 63 74 69 6f 6e 2e 20 20 55 73 65 64 20  y_action.  Used 
1b610 74 6f 20 64 65 74 65 63 74 20 68 61 73 68 20 63  to detect hash c
1b620 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2a 20  ollisions..  ** 
1b630 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d   yy_shift_ofst[]
1b640 20 20 20 20 46 6f 72 20 65 61 63 68 20 73 74 61      For each sta
1b650 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74 20 69  te, the offset i
1b660 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f  nto yy_action fo
1b670 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  r.  **          
1b680 20 20 20 20 20 20 20 20 20 20 20 73 68 69 66 74             shift
1b690 69 6e 67 20 74 65 72 6d 69 6e 61 6c 73 2e 0a 20  ing terminals.. 
1b6a0 20 2a 2a 20 20 79 79 5f 72 65 64 75 63 65 5f 6f   **  yy_reduce_o
1b6b0 66 73 74 5b 5d 20 20 20 46 6f 72 20 65 61 63 68  fst[]   For each
1b6c0 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73   state, the offs
1b6d0 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f  et into yy_actio
1b6e0 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20  n for.  **      
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1b700 68 69 66 74 69 6e 67 20 6e 6f 6e 2d 74 65 72 6d  hifting non-term
1b710 69 6e 61 6c 73 20 61 66 74 65 72 20 61 20 72 65  inals after a re
1b720 64 75 63 65 2e 0a 20 20 2a 2a 20 20 79 79 5f 64  duce..  **  yy_d
1b730 65 66 61 75 6c 74 5b 5d 20 20 20 20 20 20 20 44  efault[]       D
1b740 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 66 6f  efault action fo
1b750 72 20 65 61 63 68 20 73 74 61 74 65 2e 0a 20 20  r each state..  
1b760 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  */..  /* Compute
1b770 20 74 68 65 20 61 63 74 69 6f 6e 73 20 6f 6e 20   the actions on 
1b780 61 6c 6c 20 73 74 61 74 65 73 20 61 6e 64 20 63  all states and c
1b790 6f 75 6e 74 20 74 68 65 6d 20 75 70 20 2a 2f 0a  ount them up */.
1b7a0 20 20 61 78 20 3d 20 28 73 74 72 75 63 74 20 61    ax = (struct a
1b7b0 78 73 65 74 20 2a 29 20 63 61 6c 6c 6f 63 28 6c  xset *) calloc(l
1b7c0 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 2c 20 73  emp->nstate*2, s
1b7d0 69 7a 65 6f 66 28 61 78 5b 30 5d 29 29 3b 0a 20  izeof(ax[0]));. 
1b7e0 20 69 66 28 20 61 78 3d 3d 30 20 29 7b 0a 20 20   if( ax==0 ){.  
1b7f0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1b800 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c  ,"malloc failed\
1b810 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
1b820 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1b830 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
1b840 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
1b850 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
1b860 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 73 74  ;.    ax[i*2].st
1b870 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78 5b  p = stp;.    ax[
1b880 69 2a 32 5d 2e 69 73 54 6b 6e 20 3d 20 31 3b 0a  i*2].isTkn = 1;.
1b890 20 20 20 20 61 78 5b 69 2a 32 5d 2e 6e 41 63 74      ax[i*2].nAct
1b8a0 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 54 6b 6e 41  ion = stp->nTknA
1b8b0 63 74 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31  ct;.    ax[i*2+1
1b8c0 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20  ].stp = stp;.   
1b8d0 20 61 78 5b 69 2a 32 2b 31 5d 2e 69 73 54 6b 6e   ax[i*2+1].isTkn
1b8e0 20 3d 20 30 3b 0a 20 20 20 20 61 78 5b 69 2a 32   = 0;.    ax[i*2
1b8f0 2b 31 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74  +1].nAction = st
1b900 70 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20 7d 0a 20  p->nNtAct;.  }. 
1b910 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20 6d 6e 54   mxTknOfst = mnT
1b920 6b 6e 4f 66 73 74 20 3d 20 30 3b 0a 20 20 6d 78  knOfst = 0;.  mx
1b930 4e 74 4f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73  NtOfst = mnNtOfs
1b940 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  t = 0;..  /* Com
1b950 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20  pute the action 
1b960 74 61 62 6c 65 2e 20 20 49 6e 20 6f 72 64 65 72  table.  In order
1b970 20 74 6f 20 74 72 79 20 74 6f 20 6b 65 65 70 20   to try to keep 
1b980 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
1b990 20 20 2a 2a 20 61 63 74 69 6f 6e 20 74 61 62 6c    ** action tabl
1b9a0 65 20 74 6f 20 61 20 6d 69 6e 69 6d 75 6d 2c 20  e to a minimum, 
1b9b0 74 68 65 20 68 65 75 72 69 73 74 69 63 20 6f 66  the heuristic of
1b9c0 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6c 61 72   placing the lar
1b9d0 67 65 73 74 20 61 63 74 69 6f 6e 0a 20 20 2a 2a  gest action.  **
1b9e0 20 73 65 74 73 20 66 69 72 73 74 20 69 73 20 75   sets first is u
1b9f0 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  sed..  */.  for(
1ba00 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
1ba10 61 74 65 2a 32 3b 20 69 2b 2b 29 20 61 78 5b 69  ate*2; i++) ax[i
1ba20 5d 2e 69 4f 72 64 65 72 20 3d 20 69 3b 0a 20 20  ].iOrder = i;.  
1ba30 71 73 6f 72 74 28 61 78 2c 20 6c 65 6d 70 2d 3e  qsort(ax, lemp->
1ba40 6e 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66  nstate*2, sizeof
1ba50 28 61 78 5b 30 5d 29 2c 20 61 78 73 65 74 5f 63  (ax[0]), axset_c
1ba60 6f 6d 70 61 72 65 29 3b 0a 20 20 70 41 63 74 74  ompare);.  pActt
1ba70 61 62 20 3d 20 61 63 74 74 61 62 5f 61 6c 6c 6f  ab = acttab_allo
1ba80 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  c();.  for(i=0; 
1ba90 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32  i<lemp->nstate*2
1baa0 20 26 26 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f   && ax[i].nActio
1bab0 6e 3e 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  n>0; i++){.    s
1bac0 74 70 20 3d 20 61 78 5b 69 5d 2e 73 74 70 3b 0a  tp = ax[i].stp;.
1bad0 20 20 20 20 69 66 28 20 61 78 5b 69 5d 2e 69 73      if( ax[i].is
1bae0 54 6b 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  Tkn ){.      for
1baf0 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
1bb00 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
1bb10 20 20 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f         int actio
1bb20 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  n;.        if( a
1bb30 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65  p->sp->index>=le
1bb40 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20  mp->nterminal ) 
1bb50 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1bb60 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75    action = compu
1bb70 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20  te_action(lemp, 
1bb80 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ap);.        if(
1bb90 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74   action<0 ) cont
1bba0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63  inue;.        ac
1bbb0 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74  ttab_action(pAct
1bbc0 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64  tab, ap->sp->ind
1bbd0 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20  ex, action);.   
1bbe0 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e     }.      stp->
1bbf0 69 54 6b 6e 4f 66 73 74 20 3d 20 61 63 74 74 61  iTknOfst = actta
1bc00 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61 62  b_insert(pActtab
1bc10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70  );.      if( stp
1bc20 2d 3e 69 54 6b 6e 4f 66 73 74 3c 6d 6e 54 6b 6e  ->iTknOfst<mnTkn
1bc30 4f 66 73 74 20 29 20 6d 6e 54 6b 6e 4f 66 73 74  Ofst ) mnTknOfst
1bc40 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74   = stp->iTknOfst
1bc50 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d  ;.      if( stp-
1bc60 3e 69 54 6b 6e 4f 66 73 74 3e 6d 78 54 6b 6e 4f  >iTknOfst>mxTknO
1bc70 66 73 74 20 29 20 6d 78 54 6b 6e 4f 66 73 74 20  fst ) mxTknOfst 
1bc80 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b  = stp->iTknOfst;
1bc90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bca0 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
1bcb0 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
1bcc0 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t){.        int 
1bcd0 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  action;.        
1bce0 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
1bcf0 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  x<lemp->ntermina
1bd00 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
1bd10 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70        if( ap->sp
1bd20 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e 6e  ->index==lemp->n
1bd30 73 79 6d 62 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  symbol ) continu
1bd40 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f  e;.        actio
1bd50 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69  n = compute_acti
1bd60 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20  on(lemp, ap);.  
1bd70 20 20 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e        if( action
1bd80 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
1bd90 20 20 20 20 20 20 20 61 63 74 74 61 62 5f 61 63         acttab_ac
1bda0 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70  tion(pActtab, ap
1bdb0 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74  ->sp->index, act
1bdc0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ion);.      }.  
1bdd0 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74      stp->iNtOfst
1bde0 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74   = acttab_insert
1bdf0 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20  (pActtab);.     
1be00 20 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73   if( stp->iNtOfs
1be10 74 3c 6d 6e 4e 74 4f 66 73 74 20 29 20 6d 6e 4e  t<mnNtOfst ) mnN
1be20 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74  tOfst = stp->iNt
1be30 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Ofst;.      if( 
1be40 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3e 6d 78 4e  stp->iNtOfst>mxN
1be50 74 4f 66 73 74 20 29 20 6d 78 4e 74 4f 66 73 74  tOfst ) mxNtOfst
1be60 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b   = stp->iNtOfst;
1be70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 72 65  .    }.  }.  fre
1be80 65 28 61 78 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74  e(ax);..  /* Out
1be90 70 75 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f  put the yy_actio
1bea0 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 6e 20 3d  n table */.  n =
1beb0 20 61 63 74 74 61 62 5f 73 69 7a 65 28 70 41 63   acttab_size(pAc
1bec0 74 74 61 62 29 3b 0a 20 20 66 70 72 69 6e 74 66  ttab);.  fprintf
1bed0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1bee0 5f 41 43 54 54 41 42 5f 43 4f 55 4e 54 20 28 25  _ACTTAB_COUNT (%
1bef0 64 29 5c 6e 22 2c 20 6e 29 3b 20 6c 69 6e 65 6e  d)\n", n); linen
1bf00 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1bf10 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74  ut,"static const
1bf20 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79   YYACTIONTYPE yy
1bf30 5f 61 63 74 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22  _action[] = {\n"
1bf40 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1bf50 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
1bf60 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 63 74  ++){.    int act
1bf70 69 6f 6e 20 3d 20 61 63 74 74 61 62 5f 79 79 61  ion = acttab_yya
1bf80 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 69  ction(pActtab, i
1bf90 29 3b 0a 20 20 20 20 69 66 28 20 61 63 74 69 6f  );.    if( actio
1bfa0 6e 3c 30 20 29 20 61 63 74 69 6f 6e 20 3d 20 6c  n<0 ) action = l
1bfb0 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65  emp->nstate + le
1bfc0 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 32 3b 0a 20  mp->nrule + 2;. 
1bfd0 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70     if( j==0 ) fp
1bfe0 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
1bff0 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20  5d */ ", i);.   
1c000 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
1c010 25 34 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b 0a  %4d,", action);.
1c020 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
1c030 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
1c040 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
1c050 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1c060 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
1c070 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
1c080 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
1c090 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
1c0a0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
1c0b0 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79  /* Output the yy
1c0c0 5f 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c 65  _lookahead table
1c0d0 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
1c0e0 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20  t,"static const 
1c0f0 59 59 43 4f 44 45 54 59 50 45 20 79 79 5f 6c 6f  YYCODETYPE yy_lo
1c100 6f 6b 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e 22  okahead[] = {\n"
1c110 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1c120 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
1c130 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61 20  ++){.    int la 
1c140 3d 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61  = acttab_yylooka
1c150 68 65 61 64 28 70 41 63 74 74 61 62 2c 20 69 29  head(pActtab, i)
1c160 3b 0a 20 20 20 20 69 66 28 20 6c 61 3c 30 20 29  ;.    if( la<0 )
1c170 20 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d   la = lemp->nsym
1c180 62 6f 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  bol;.    if( j==
1c190 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
1c1a0 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
1c1b0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1c1c0 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61 29  ut, " %4d,", la)
1c1d0 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c  ;.    if( j==9 |
1c1e0 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20  | i==n-1 ){.    
1c1f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1c200 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1c210 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
1c220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b   }else{.      j+
1c230 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  +;.    }.  }.  f
1c240 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c  printf(out, "};\
1c250 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a  n"); lineno++;..
1c260 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
1c270 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20  yy_shift_ofst[] 
1c280 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e  table */.  fprin
1c290 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65  tf(out, "#define
1c2a0 20 59 59 5f 53 48 49 46 54 5f 55 53 45 5f 44 46   YY_SHIFT_USE_DF
1c2b0 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b  LT (%d)\n", mnTk
1c2c0 6e 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f  nOfst-1); lineno
1c2d0 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e  ++;.  n = lemp->
1c2e0 6e 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28  nstate;.  while(
1c2f0 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f   n>0 && lemp->so
1c300 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b 6e 4f  rted[n-1]->iTknO
1c310 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29  fst==NO_OFFSET )
1c320 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28   n--;.  fprintf(
1c330 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59  out, "#define YY
1c340 5f 53 48 49 46 54 5f 43 4f 55 4e 54 20 28 25 64  _SHIFT_COUNT (%d
1c350 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65  )\n", n-1); line
1c360 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1c370 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59  out, "#define YY
1c380 5f 53 48 49 46 54 5f 4d 49 4e 20 20 20 28 25 64  _SHIFT_MIN   (%d
1c390 29 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74 29  )\n", mnTknOfst)
1c3a0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1c3b0 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
1c3c0 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d 41 58  ine YY_SHIFT_MAX
1c3d0 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 78 54 6b     (%d)\n", mxTk
1c3e0 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  nOfst); lineno++
1c3f0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1c400 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25   "static const %
1c410 73 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b  s yy_shift_ofst[
1c420 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20 20  ] = {\n", .     
1c430 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a       minimum_siz
1c440 65 5f 74 79 70 65 28 6d 6e 54 6b 6e 4f 66 73 74  e_type(mnTknOfst
1c450 2d 31 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 29 3b  -1, mxTknOfst));
1c460 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72   lineno++;.  for
1c470 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
1c480 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b  ){.    int ofst;
1c490 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
1c4a0 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
1c4b0 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e  ofst = stp->iTkn
1c4c0 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f 66  Ofst;.    if( of
1c4d0 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20  st==NO_OFFSET ) 
1c4e0 6f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74  ofst = mnTknOfst
1c4f0 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d   - 1;.    if( j=
1c500 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
1c510 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
1c520 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
1c530 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66  out, " %4d,", of
1c540 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  st);.    if( j==
1c550 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20  9 || i==n-1 ){. 
1c560 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1c570 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  , "\n"); lineno+
1c580 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  +;.      j = 0;.
1c590 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c5a0 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
1c5b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1c5c0 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  };\n"); lineno++
1c5d0 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
1c5e0 68 65 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73  he yy_reduce_ofs
1c5f0 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  t[] table */.  f
1c600 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65  printf(out, "#de
1c610 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 55  fine YY_REDUCE_U
1c620 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c  SE_DFLT (%d)\n",
1c630 20 6d 6e 4e 74 4f 66 73 74 2d 31 29 3b 20 6c 69   mnNtOfst-1); li
1c640 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65  neno++;.  n = le
1c650 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68  mp->nstate;.  wh
1c660 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70  ile( n>0 && lemp
1c670 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69  ->sorted[n-1]->i
1c680 4e 74 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45  NtOfst==NO_OFFSE
1c690 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e  T ) n--;.  fprin
1c6a0 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65  tf(out, "#define
1c6b0 20 59 59 5f 52 45 44 55 43 45 5f 43 4f 55 4e 54   YY_REDUCE_COUNT
1c6c0 20 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20   (%d)\n", n-1); 
1c6d0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1c6e0 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1c6f0 65 20 59 59 5f 52 45 44 55 43 45 5f 4d 49 4e 20  e YY_REDUCE_MIN 
1c700 20 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f    (%d)\n", mnNtO
1c710 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  fst); lineno++;.
1c720 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1c730 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43  #define YY_REDUC
1c740 45 5f 4d 41 58 20 20 20 28 25 64 29 5c 6e 22 2c  E_MAX   (%d)\n",
1c750 20 6d 78 4e 74 4f 66 73 74 29 3b 20 6c 69 6e 65   mxNtOfst); line
1c760 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1c770 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e  out, "static con
1c780 73 74 20 25 73 20 79 79 5f 72 65 64 75 63 65 5f  st %s yy_reduce_
1c790 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a  ofst[] = {\n", .
1c7a0 20 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d 75            minimu
1c7b0 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 4e 74  m_size_type(mnNt
1c7c0 4f 66 73 74 2d 31 2c 20 6d 78 4e 74 4f 66 73 74  Ofst-1, mxNtOfst
1c7d0 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  )); lineno++;.  
1c7e0 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
1c7f0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66  i++){.    int of
1c800 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  st;.    stp = le
1c810 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
1c820 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69     ofst = stp->i
1c830 4e 74 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20  NtOfst;.    if( 
1c840 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20  ofst==NO_OFFSET 
1c850 29 20 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73  ) ofst = mnNtOfs
1c860 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a  t - 1;.    if( j
1c870 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75  ==0 ) fprintf(ou
1c880 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c  t," /* %5d */ ",
1c890 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66   i);.    fprintf
1c8a0 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f  (out, " %4d,", o
1c8b0 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d  fst);.    if( j=
1c8c0 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
1c8d0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1c8e0 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
1c8f0 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
1c900 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c910 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
1c920 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1c930 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
1c940 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  +;..  /* Output 
1c950 74 68 65 20 64 65 66 61 75 6c 74 20 61 63 74 69  the default acti
1c960 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70  on table */.  fp
1c970 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74  rintf(out, "stat
1c980 69 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f  ic const YYACTIO
1c990 4e 54 59 50 45 20 79 79 5f 64 65 66 61 75 6c 74  NTYPE yy_default
1c9a0 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65  [] = {\n"); line
1c9b0 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70  no++;.  n = lemp
1c9c0 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 66 6f 72 28  ->nstate;.  for(
1c9d0 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
1c9e0 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  {.    stp = lemp
1c9f0 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
1ca00 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69   if( j==0 ) fpri
1ca10 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64  ntf(out," /* %5d
1ca20 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66   */ ", i);.    f
1ca30 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34  printf(out, " %4
1ca40 64 2c 22 2c 20 73 74 70 2d 3e 69 44 66 6c 74 29  d,", stp->iDflt)
1ca50 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c  ;.    if( j==9 |
1ca60 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20  | i==n-1 ){.    
1ca70 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1ca80 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1ca90 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
1caa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b   }else{.      j+
1cab0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  +;.    }.  }.  f
1cac0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c  printf(out, "};\
1cad0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1cae0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1caf0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1cb00 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1cb10 65 72 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  erate the table 
1cb20 6f 66 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65  of fallback toke
1cb30 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ns..  */.  if( l
1cb40 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63  emp->has_fallbac
1cb50 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 78 20  k ){.    int mx 
1cb60 3d 20 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  = lemp->ntermina
1cb70 6c 20 2d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65  l - 1;.    while
1cb80 28 20 6d 78 3e 30 20 26 26 20 6c 65 6d 70 2d 3e  ( mx>0 && lemp->
1cb90 73 79 6d 62 6f 6c 73 5b 6d 78 5d 2d 3e 66 61 6c  symbols[mx]->fal
1cba0 6c 62 61 63 6b 3d 3d 30 20 29 7b 20 6d 78 2d 2d  lback==0 ){ mx--
1cbb0 3b 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ; }.    for(i=0;
1cbc0 20 69 3c 3d 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20   i<=mx; i++){.  
1cbd0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
1cbe0 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d  l *p = lemp->sym
1cbf0 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69  bols[i];.      i
1cc00 66 28 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d  f( p->fallback==
1cc10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  0 ){.        fpr
1cc20 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20 30  intf(out, "    0
1cc30 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e 6f  ,  /* %10s => no
1cc40 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d 3e  thing */\n", p->
1cc50 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
1cc60 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  se{.        fpri
1cc70 6e 74 66 28 6f 75 74 2c 20 22 20 20 25 33 64 2c  ntf(out, "  %3d,
1cc80 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73 20    /* %10s => %s 
1cc90 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62 61  */\n", p->fallba
1cca0 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20 20  ck->index,.     
1ccb0 20 20 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70 2d       p->name, p-
1ccc0 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65 29  >fallback->name)
1ccd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cce0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
1ccf0 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
1cd00 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c 20  lemp->name, in, 
1cd10 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  out, &lineno);..
1cd20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1cd30 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1cd40 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61   the symbolic na
1cd50 6d 65 20 6f 66 20 65 76 65 72 79 20 73 79 6d 62  me of every symb
1cd60 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ol.  */.  for(i=
1cd70 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
1cd80 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70  ol; i++){.    sp
1cd90 72 69 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25 73  rintf(line,"\"%s
1cda0 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  \",",lemp->symbo
1cdb0 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ls[i]->name);.  
1cdc0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1cdd0 20 25 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a 20   %-15s",line);. 
1cde0 20 20 20 69 66 28 20 28 69 26 33 29 3d 3d 33 20     if( (i&3)==3 
1cdf0 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ){ fprintf(out,"
1ce00 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n"); lineno++; 
1ce10 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 26 33  }.  }.  if( (i&3
1ce20 29 21 3d 30 20 29 7b 20 66 70 72 69 6e 74 66 28  )!=0 ){ fprintf(
1ce30 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  out,"\n"); linen
1ce40 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78 66  o++; }.  tplt_xf
1ce50 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1ce60 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1ce70 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1ce80 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1ce90 20 61 20 74 65 78 74 20 73 74 72 69 6e 67 20 74   a text string t
1cea0 68 61 74 20 64 65 73 63 72 69 62 65 73 20 65 76  hat describes ev
1ceb0 65 72 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69 6e  ery.  ** rule in
1cec0 20 74 68 65 20 72 75 6c 65 20 73 65 74 20 6f 66   the rule set of
1ced0 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 54   the grammar.  T
1cee0 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
1cef0 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 77 68 65  is used.  ** whe
1cf00 6e 20 74 72 61 63 69 6e 67 20 52 45 44 55 43 45  n tracing REDUCE
1cf10 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20   actions..  */. 
1cf20 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d   for(i=0, rp=lem
1cf30 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
1cf40 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a  rp->next, i++){.
1cf50 20 20 20 20 61 73 73 65 72 74 28 20 72 70 2d 3e      assert( rp->
1cf60 69 6e 64 65 78 3d 3d 69 20 29 3b 0a 20 20 20 20  index==i );.    
1cf70 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
1cf80 20 25 33 64 20 2a 2f 20 5c 22 22 2c 20 69 29 3b   %3d */ \"", i);
1cf90 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54 65  .    writeRuleTe
1cfa0 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20  xt(out, rp);.   
1cfb0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22   fprintf(out,"\"
1cfc0 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ,\n"); lineno++;
1cfd0 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
1cfe0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1cff0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1d000 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1d010 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20   which executes 
1d020 65 76 65 72 79 20 74 69 6d 65 20 61 20 73 79 6d  every time a sym
1d030 62 6f 6c 20 69 73 20 70 6f 70 70 65 64 20 66 72  bol is popped fr
1d040 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63  om.  ** the stac
1d050 6b 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  k while processi
1d060 6e 67 20 65 72 72 6f 72 73 20 6f 72 20 77 68 69  ng errors or whi
1d070 6c 65 20 64 65 73 74 72 6f 79 69 6e 67 20 74 68  le destroying th
1d080 65 20 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a 20  e parser. .  ** 
1d090 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
1d0a0 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 25 64   generate the %d
1d0b0 65 73 74 72 75 63 74 6f 72 20 61 63 74 69 6f 6e  estructor action
1d0c0 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65  s).  */.  if( le
1d0d0 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29 7b  mp->tokendest ){
1d0e0 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20  .    int once = 
1d0f0 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  1;.    for(i=0; 
1d100 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
1d110 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
1d120 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
1d130 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
1d140 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d  ];.      if( sp=
1d150 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21 3d  =0 || sp->type!=
1d160 54 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74 69  TERMINAL ) conti
1d170 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  nue;.      if( o
1d180 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66  nce ){.        f
1d190 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20  printf(out, "   
1d1a0 20 20 20 2f 2a 20 54 45 52 4d 49 4e 41 4c 20 44     /* TERMINAL D
1d1b0 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22 29  estructor */\n")
1d1c0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1d1d0 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20      once = 0;.  
1d1e0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
1d1f0 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73  ntf(out,"    cas
1d200 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e  e %d: /* %s */\n
1d210 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70  ", sp->index, sp
1d220 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ->name); lineno+
1d230 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  +;.    }.    for
1d240 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1d250 79 6d 62 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e 73  ymbol && lemp->s
1d260 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65 21  ymbols[i]->type!
1d270 3d 54 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b  =TERMINAL; i++);
1d280 0a 20 20 20 20 69 66 28 20 69 3c 6c 65 6d 70 2d  .    if( i<lemp-
1d290 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20  >nsymbol ){.    
1d2a0 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f    emit_destructo
1d2b0 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d  r_code(out,lemp-
1d2c0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70  >symbols[i],lemp
1d2d0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  ,&lineno);.     
1d2e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1d2f0 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20      break;\n"); 
1d300 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
1d310 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e    }.  if( lemp->
1d320 76 61 72 64 65 73 74 20 29 7b 0a 20 20 20 20 73  vardest ){.    s
1d330 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66  truct symbol *df
1d340 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20 69  lt_sp = 0;.    i
1d350 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20  nt once = 1;.   
1d360 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1d370 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
1d380 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79  .      struct sy
1d390 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d  mbol *sp = lemp-
1d3a0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
1d3b0 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20     if( sp==0 || 
1d3c0 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
1d3d0 41 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  AL ||.          
1d3e0 73 70 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20  sp->index<=0 || 
1d3f0 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d  sp->destructor!=
1d400 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1d410 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a      if( once ){.
1d420 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1d430 6f 75 74 2c 20 22 20 20 20 20 20 20 2f 2a 20 44  out, "      /* D
1d440 65 66 61 75 6c 74 20 4e 4f 4e 2d 54 45 52 4d 49  efault NON-TERMI
1d450 4e 41 4c 20 44 65 73 74 72 75 63 74 6f 72 20 2a  NAL Destructor *
1d460 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  /\n"); lineno++;
1d470 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20  .        once = 
1d480 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1d490 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1d4a0 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73    case %d: /* %s
1d4b0 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65   */\n", sp->inde
1d4c0 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69  x, sp->name); li
1d4d0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66  neno++;.      df
1d4e0 6c 74 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20 20  lt_sp = sp;.    
1d4f0 7d 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5f 73  }.    if( dflt_s
1d500 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 6d  p!=0 ){.      em
1d510 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
1d520 64 65 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c  de(out,dflt_sp,l
1d530 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  emp,&lineno);.  
1d540 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
1d550 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b  out,"      break
1d560 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1d570 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1d580 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
1d590 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
1d5a0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
1d5b0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
1d5c0 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c  .    if( sp==0 |
1d5d0 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d  | sp->type==TERM
1d5e0 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64 65 73 74  INAL || sp->dest
1d5f0 72 75 63 74 6f 72 3d 3d 30 20 29 20 63 6f 6e 74  ructor==0 ) cont
1d600 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74  inue;.    fprint
1d610 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20  f(out,"    case 
1d620 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c  %d: /* %s */\n",
1d630 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e   sp->index, sp->
1d640 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
1d650 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65  ..    /* Combine
1d660 20 64 75 70 6c 69 63 61 74 65 20 64 65 73 74 72   duplicate destr
1d670 75 63 74 6f 72 73 20 69 6e 74 6f 20 61 20 73 69  uctors into a si
1d680 6e 67 6c 65 20 63 61 73 65 20 2a 2f 0a 20 20 20  ngle case */.   
1d690 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c 65   for(j=i+1; j<le
1d6a0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 2b  mp->nsymbol; j++
1d6b0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1d6c0 73 79 6d 62 6f 6c 20 2a 73 70 32 20 3d 20 6c 65  symbol *sp2 = le
1d6d0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a  mp->symbols[j];.
1d6e0 20 20 20 20 20 20 69 66 28 20 73 70 32 20 26 26        if( sp2 &&
1d6f0 20 73 70 32 2d 3e 74 79 70 65 21 3d 54 45 52 4d   sp2->type!=TERM
1d700 49 4e 41 4c 20 26 26 20 73 70 32 2d 3e 64 65 73  INAL && sp2->des
1d710 74 72 75 63 74 6f 72 0a 20 20 20 20 20 20 20 20  tructor.        
1d720 20 20 26 26 20 73 70 32 2d 3e 64 74 6e 75 6d 3d    && sp2->dtnum=
1d730 3d 73 70 2d 3e 64 74 6e 75 6d 0a 20 20 20 20 20  =sp->dtnum.     
1d740 20 20 20 20 20 26 26 20 73 74 72 63 6d 70 28 73       && strcmp(s
1d750 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 2c 73 70  p->destructor,sp
1d760 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 29 3d 3d  2->destructor)==
1d770 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 66 70  0 ){.         fp
1d780 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63  rintf(out,"    c
1d790 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f  ase %d: /* %s */
1d7a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1d7b0 20 20 20 20 20 20 73 70 32 2d 3e 69 6e 64 65 78        sp2->index
1d7c0 2c 20 73 70 32 2d 3e 6e 61 6d 65 29 3b 20 6c 69  , sp2->name); li
1d7d0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
1d7e0 20 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72   sp2->destructor
1d7f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1d800 20 20 7d 0a 0a 20 20 20 20 65 6d 69 74 5f 64 65    }..    emit_de
1d810 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75  structor_code(ou
1d820 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  t,lemp->symbols[
1d830 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  i],lemp,&lineno)
1d840 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1d850 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c  t,"      break;\
1d860 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1d870 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
1d880 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1d890 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1d8a0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
1d8b0 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
1d8c0 65 6e 65 76 65 72 20 74 68 65 20 70 61 72 73 65  enever the parse
1d8d0 72 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77  r stack overflow
1d8e0 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  s */.  tplt_prin
1d8f0 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
1d900 3e 6f 76 65 72 66 6c 6f 77 2c 26 6c 69 6e 65 6e  >overflow,&linen
1d910 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  o);.  tplt_xfer(
1d920 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1d930 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1d940 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74  * Generate the t
1d950 61 62 6c 65 20 6f 66 20 72 75 6c 65 20 69 6e 66  able of rule inf
1d960 6f 72 6d 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a 20  ormation .  **. 
1d970 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 63   ** Note: This c
1d980 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
1d990 68 65 20 66 61 63 74 20 74 68 61 74 20 72 75 6c  he fact that rul
1d9a0 65 73 20 61 72 65 20 6e 75 6d 62 65 72 0a 20 20  es are number.  
1d9b0 2a 2a 20 73 65 71 75 65 6e 74 75 61 6c 6c 79 20  ** sequentually 
1d9c0 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30  beginning with 0
1d9d0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d  ..  */.  for(rp=
1d9e0 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
1d9f0 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
1da00 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1da10 20 7b 20 25 64 2c 20 25 64 20 7d 2c 5c 6e 22 2c   { %d, %d },\n",
1da20 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c 72  rp->lhs->index,r
1da30 70 2d 3e 6e 72 68 73 29 3b 20 6c 69 6e 65 6e 6f  p->nrhs); lineno
1da40 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  ++;.  }.  tplt_x
1da50 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1da60 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1da70 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1da80 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
1da90 69 6f 6e 20 64 75 72 69 6e 67 20 65 61 63 68 20  ion during each 
1daa0 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 2a 2f  REDUCE action */
1dab0 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
1dac0 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
1dad0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 74 72 61 6e  >next){.    tran
1dae0 73 6c 61 74 65 5f 63 6f 64 65 28 6c 65 6d 70 2c  slate_code(lemp,
1daf0 20 72 70 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46   rp);.  }.  /* F
1db00 69 72 73 74 20 6f 75 74 70 75 74 20 72 75 6c 65  irst output rule
1db10 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  s other than the
1db20 20 64 65 66 61 75 6c 74 3a 20 72 75 6c 65 20 2a   default: rule *
1db30 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  /.  for(rp=lemp-
1db40 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
1db50 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 73 74 72  ->next){.    str
1db60 75 63 74 20 72 75 6c 65 20 2a 72 70 32 3b 20 20  uct rule *rp2;  
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1db80 4f 74 68 65 72 20 72 75 6c 65 73 20 77 69 74 68  Other rules with
1db90 20 74 68 65 20 73 61 6d 65 20 61 63 74 69 6f 6e   the same action
1dba0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 70 2d 3e   */.    if( rp->
1dbb0 63 6f 64 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  code==0 ) contin
1dbc0 75 65 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  ue;.    if( rp->
1dbd0 63 6f 64 65 5b 30 5d 3d 3d 27 5c 6e 27 20 26 26  code[0]=='\n' &&
1dbe0 20 72 70 2d 3e 63 6f 64 65 5b 31 5d 3d 3d 30 20   rp->code[1]==0 
1dbf0 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 57  ) continue; /* W
1dc00 69 6c 6c 20 62 65 20 64 65 66 61 75 6c 74 3a 20  ill be default: 
1dc10 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  */.    fprintf(o
1dc20 75 74 2c 22 20 20 20 20 20 20 63 61 73 65 20 25  ut,"      case %
1dc30 64 3a 20 2f 2a 20 22 2c 20 72 70 2d 3e 69 6e 64  d: /* ", rp->ind
1dc40 65 78 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75  ex);.    writeRu
1dc50 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b  leText(out, rp);
1dc60 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1dc70 2c 20 22 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65  , " */\n"); line
1dc80 6e 6f 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 72 70  no++;.    for(rp
1dc90 32 3d 72 70 2d 3e 6e 65 78 74 3b 20 72 70 32 3b  2=rp->next; rp2;
1dca0 20 72 70 32 3d 72 70 32 2d 3e 6e 65 78 74 29 7b   rp2=rp2->next){
1dcb0 0a 20 20 20 20 20 20 69 66 28 20 72 70 32 2d 3e  .      if( rp2->
1dcc0 63 6f 64 65 3d 3d 72 70 2d 3e 63 6f 64 65 20 29  code==rp->code )
1dcd0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
1dce0 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61 73  f(out,"      cas
1dcf0 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70 32 2d  e %d: /* ", rp2-
1dd00 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20  >index);.       
1dd10 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f   writeRuleText(o
1dd20 75 74 2c 20 72 70 32 29 3b 0a 20 20 20 20 20 20  ut, rp2);.      
1dd30 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1dd40 2a 2f 20 79 79 74 65 73 74 63 61 73 65 28 79 79  */ yytestcase(yy
1dd50 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c  ruleno==%d);\n",
1dd60 20 72 70 32 2d 3e 69 6e 64 65 78 29 3b 20 6c 69   rp2->index); li
1dd70 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
1dd80 72 70 32 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20  rp2->code = 0;. 
1dd90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1dda0 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72   emit_code(out,r
1ddb0 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b  p,lemp,&lineno);
1ddc0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1ddd0 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ,"        break;
1dde0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1ddf0 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30      rp->code = 0
1de00 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 69 6e 61 6c  ;.  }.  /* Final
1de10 6c 79 2c 20 6f 75 74 70 75 74 20 74 68 65 20 64  ly, output the d
1de20 65 66 61 75 6c 74 3a 20 72 75 6c 65 2e 20 20 57  efault: rule.  W
1de30 65 20 63 68 6f 6f 73 65 20 61 73 20 74 68 65 20  e choose as the 
1de40 64 65 66 61 75 6c 74 3a 20 61 6c 6c 0a 20 20 2a  default: all.  *
1de50 2a 20 65 6d 70 74 79 20 61 63 74 69 6f 6e 73 2e  * empty actions.
1de60 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
1de70 74 2c 22 20 20 20 20 20 20 64 65 66 61 75 6c 74  t,"      default
1de80 3a 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  :\n"); lineno++;
1de90 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
1dea0 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
1deb0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  >next){.    if( 
1dec0 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 20 63 6f  rp->code==0 ) co
1ded0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
1dee0 72 74 28 20 72 70 2d 3e 63 6f 64 65 5b 30 5d 3d  rt( rp->code[0]=
1def0 3d 27 5c 6e 27 20 26 26 20 72 70 2d 3e 63 6f 64  ='\n' && rp->cod
1df00 65 5b 31 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 66  e[1]==0 );.    f
1df10 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1df20 20 20 2f 2a 20 28 25 64 29 20 22 2c 20 72 70 2d    /* (%d) ", rp-
1df30 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 77 72 69  >index);.    wri
1df40 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20  teRuleText(out, 
1df50 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  rp);.    fprintf
1df60 28 6f 75 74 2c 20 22 20 2a 2f 20 79 79 74 65 73  (out, " */ yytes
1df70 74 63 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d  tcase(yyruleno==
1df80 25 64 29 3b 5c 6e 22 2c 20 72 70 2d 3e 69 6e 64  %d);\n", rp->ind
1df90 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ex); lineno++;. 
1dfa0 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
1dfb0 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ,"        break;
1dfc0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1dfd0 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1dfe0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1dff0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1e000 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63  nerate code whic
1e010 68 20 65 78 65 63 75 74 65 73 20 69 66 20 61 20  h executes if a 
1e020 70 61 72 73 65 20 66 61 69 6c 73 20 2a 2f 0a 20  parse fails */. 
1e030 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
1e040 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75  lemp,lemp->failu
1e050 72 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74  re,&lineno);.  t
1e060 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1e070 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1e080 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1e090 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
1e0a0 78 65 63 75 74 65 73 20 77 68 65 6e 20 61 20 73  xecutes when a s
1e0b0 79 6e 74 61 78 20 65 72 72 6f 72 20 6f 63 63 75  yntax error occu
1e0c0 72 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  rs */.  tplt_pri
1e0d0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1e0e0 2d 3e 65 72 72 6f 72 2c 26 6c 69 6e 65 6e 6f 29  ->error,&lineno)
1e0f0 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
1e100 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1e110 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1e120 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
1e130 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65  ich executes whe
1e140 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 63 63  n the parser acc
1e150 65 70 74 73 20 69 74 73 20 69 6e 70 75 74 20 2a  epts its input *
1e160 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  /.  tplt_print(o
1e170 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 61 63  ut,lemp,lemp->ac
1e180 63 65 70 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  cept,&lineno);. 
1e190 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1e1a0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1e1b0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 41 70 70  neno);..  /* App
1e1c0 65 6e 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e  end any addition
1e1d0 20 63 6f 64 65 20 74 68 65 20 75 73 65 72 20 64   code the user d
1e1e0 65 73 69 72 65 73 20 2a 2f 0a 20 20 74 70 6c 74  esires */.  tplt
1e1f0 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
1e200 6c 65 6d 70 2d 3e 65 78 74 72 61 63 6f 64 65 2c  lemp->extracode,
1e210 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66 63 6c  &lineno);..  fcl
1e220 6f 73 65 28 69 6e 29 3b 0a 20 20 66 63 6c 6f 73  ose(in);.  fclos
1e230 65 28 6f 75 74 29 3b 0a 20 20 72 65 74 75 72 6e  e(out);.  return
1e240 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  ;.}../* Generate
1e250 20 61 20 68 65 61 64 65 72 20 66 69 6c 65 20 66   a header file f
1e260 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  or the parser */
1e270 0a 76 6f 69 64 20 52 65 70 6f 72 74 48 65 61 64  .void ReportHead
1e280 65 72 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  er(struct lemon 
1e290 2a 6c 65 6d 70 29 0a 7b 0a 20 20 46 49 4c 45 20  *lemp).{.  FILE 
1e2a0 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 6f 6e  *out, *in;.  con
1e2b0 73 74 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b  st char *prefix;
1e2c0 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e  .  char line[LIN
1e2d0 45 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70  ESIZE];.  char p
1e2e0 61 74 74 65 72 6e 5b 4c 49 4e 45 53 49 5a 45 5d  attern[LINESIZE]
1e2f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  ;.  int i;..  if
1e300 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65  ( lemp->tokenpre
1e310 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c  fix ) prefix = l
1e320 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78  emp->tokenprefix
1e330 3b 0a 20 20 65 6c 73 65 20 20 20 20 20 20 20 20  ;.  else        
1e340 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66              pref
1e350 69 78 20 3d 20 22 22 3b 0a 20 20 69 6e 20 3d 20  ix = "";.  in = 
1e360 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22  file_open(lemp,"
1e370 2e 68 22 2c 22 72 62 22 29 3b 0a 20 20 69 66 28  .h","rb");.  if(
1e380 20 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e   in ){.    int n
1e390 65 78 74 43 68 61 72 3b 0a 20 20 20 20 66 6f 72  extChar;.    for
1e3a0 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74  (i=1; i<lemp->nt
1e3b0 65 72 6d 69 6e 61 6c 20 26 26 20 66 67 65 74 73  erminal && fgets
1e3c0 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69  (line,LINESIZE,i
1e3d0 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  n); i++){.      
1e3e0 73 70 72 69 6e 74 66 28 70 61 74 74 65 72 6e 2c  sprintf(pattern,
1e3f0 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73  "#define %s%-30s
1e400 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c   %2d\n",prefix,l
1e410 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
1e420 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20  >name,i);.      
1e430 69 66 28 20 73 74 72 63 6d 70 28 6c 69 6e 65 2c  if( strcmp(line,
1e440 70 61 74 74 65 72 6e 29 20 29 20 62 72 65 61 6b  pattern) ) break
1e450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 78 74  ;.    }.    next
1e460 43 68 61 72 20 3d 20 66 67 65 74 63 28 69 6e 29  Char = fgetc(in)
1e470 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  ;.    fclose(in)
1e480 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6c 65 6d  ;.    if( i==lem
1e490 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20  p->nterminal && 
1e4a0 6e 65 78 74 43 68 61 72 3d 3d 45 4f 46 20 29 7b  nextChar==EOF ){
1e4b0 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 68 61  .      /* No cha
1e4c0 6e 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  nge in the file.
1e4d0 20 20 44 6f 6e 27 74 20 72 65 77 72 69 74 65 20    Don't rewrite 
1e4e0 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  it. */.      ret
1e4f0 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
1e500 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e   out = file_open
1e510 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 77 62 22 29  (lemp,".h","wb")
1e520 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20  ;.  if( out ){. 
1e530 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65     for(i=1; i<le
1e540 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69  mp->nterminal; i
1e550 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ++){.      fprin
1e560 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1e570 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70  %s%-30s %2d\n",p
1e580 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62  refix,lemp->symb
1e590 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b  ols[i]->name,i);
1e5a0 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73  .    }.    fclos
1e5b0 65 28 6f 75 74 29 3b 20 20 0a 20 20 7d 0a 20 20  e(out);  .  }.  
1e5c0 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65  return;.}../* Re
1e5d0 64 75 63 65 20 74 68 65 20 73 69 7a 65 20 6f 66  duce the size of
1e5e0 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
1e5f0 65 73 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c  es, if possible,
1e600 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 0a 2a   by making use.*
1e610 2a 20 6f 66 20 64 65 66 61 75 6c 74 73 2e 0a 2a  * of defaults..*
1e620 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72  *.** In this ver
1e630 73 69 6f 6e 2c 20 77 65 20 74 61 6b 65 20 74 68  sion, we take th
1e640 65 20 6d 6f 73 74 20 66 72 65 71 75 65 6e 74 20  e most frequent 
1e650 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 61 6e  REDUCE action an
1e660 64 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65  d make.** it the
1e670 20 64 65 66 61 75 6c 74 2e 20 20 45 78 63 65 70   default.  Excep
1e680 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  t, there is no d
1e690 65 66 61 75 6c 74 20 69 66 20 74 68 65 20 77 69  efault if the wi
1e6a0 6c 64 63 61 72 64 20 74 6f 6b 65 6e 0a 2a 2a 20  ldcard token.** 
1e6b0 69 73 20 61 20 70 6f 73 73 69 62 6c 65 20 6c 6f  is a possible lo
1e6c0 6f 6b 2d 61 68 65 61 64 2e 0a 2a 2f 0a 76 6f 69  ok-ahead..*/.voi
1e6d0 64 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73  d CompressTables
1e6e0 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
1e6f0 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  emp).{.  struct 
1e700 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
1e710 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c  ruct action *ap,
1e720 20 2a 61 70 32 3b 0a 20 20 73 74 72 75 63 74 20   *ap2;.  struct 
1e730 72 75 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c 20  rule *rp, *rp2, 
1e740 2a 72 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e 62  *rbest;.  int nb
1e750 65 73 74 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 3b  est, n;.  int i;
1e760 0a 20 20 69 6e 74 20 75 73 65 73 57 69 6c 64 63  .  int usesWildc
1e770 61 72 64 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ard;..  for(i=0;
1e780 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
1e790 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
1e7a0 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
1e7b0 3b 0a 20 20 20 20 6e 62 65 73 74 20 3d 20 30 3b  ;.    nbest = 0;
1e7c0 0a 20 20 20 20 72 62 65 73 74 20 3d 20 30 3b 0a  .    rbest = 0;.
1e7d0 20 20 20 20 75 73 65 73 57 69 6c 64 63 61 72 64      usesWildcard
1e7e0 20 3d 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28 61   = 0;..    for(a
1e7f0 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
1e800 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
1e810 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d     if( ap->type=
1e820 3d 53 48 49 46 54 20 26 26 20 61 70 2d 3e 73 70  =SHIFT && ap->sp
1e830 3d 3d 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64  ==lemp->wildcard
1e840 20 29 7b 0a 20 20 20 20 20 20 20 20 75 73 65 73   ){.        uses
1e850 57 69 6c 64 63 61 72 64 20 3d 20 31 3b 0a 20 20  Wildcard = 1;.  
1e860 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1e870 61 70 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45  ap->type!=REDUCE
1e880 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e890 20 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70     rp = ap->x.rp
1e8a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e  ;.      if( rp->
1e8b0 6c 68 73 53 74 61 72 74 20 29 20 63 6f 6e 74 69  lhsStart ) conti
1e8c0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nue;.      if( r
1e8d0 70 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69  p==rbest ) conti
1e8e0 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20 31  nue;.      n = 1
1e8f0 3b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 32 3d  ;.      for(ap2=
1e900 61 70 2d 3e 6e 65 78 74 3b 20 61 70 32 3b 20 61  ap->next; ap2; a
1e910 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 0a 20  p2=ap2->next){. 
1e920 20 20 20 20 20 20 20 69 66 28 20 61 70 32 2d 3e         if( ap2->
1e930 74 79 70 65 21 3d 52 45 44 55 43 45 20 29 20 63  type!=REDUCE ) c
1e940 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e950 20 72 70 32 20 3d 20 61 70 32 2d 3e 78 2e 72 70   rp2 = ap2->x.rp
1e960 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70  ;.        if( rp
1e970 32 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69  2==rbest ) conti
1e980 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
1e990 20 72 70 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b 0a   rp2==rp ) n++;.
1e9a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1e9b0 28 20 6e 3e 6e 62 65 73 74 20 29 7b 0a 20 20 20  ( n>nbest ){.   
1e9c0 20 20 20 20 20 6e 62 65 73 74 20 3d 20 6e 3b 0a       nbest = n;.
1e9d0 20 20 20 20 20 20 20 20 72 62 65 73 74 20 3d 20          rbest = 
1e9e0 72 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rp;.      }.    
1e9f0 7d 0a 20 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  }. .    /* Do no
1ea00 74 20 6d 61 6b 65 20 61 20 64 65 66 61 75 6c 74  t make a default
1ea10 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   if the number o
1ea20 66 20 72 75 6c 65 73 20 74 6f 20 64 65 66 61 75  f rules to defau
1ea30 6c 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  lt.    ** is not
1ea40 20 61 74 20 6c 65 61 73 74 20 31 20 6f 72 20 69   at least 1 or i
1ea50 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 74  f the wildcard t
1ea60 6f 6b 65 6e 20 69 73 20 61 20 70 6f 73 73 69 62  oken is a possib
1ea70 6c 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 6b 61 68  le.    ** lookah
1ea80 65 61 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ead..    */.    
1ea90 69 66 28 20 6e 62 65 73 74 3c 31 20 7c 7c 20 75  if( nbest<1 || u
1eaa0 73 65 73 57 69 6c 64 63 61 72 64 20 29 20 63 6f  sesWildcard ) co
1eab0 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a  ntinue;...    /*
1eac0 20 43 6f 6d 62 69 6e 65 20 6d 61 74 63 68 69 6e   Combine matchin
1ead0 67 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73  g REDUCE actions
1eae0 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 64   into a single d
1eaf0 65 66 61 75 6c 74 20 2a 2f 0a 20 20 20 20 66 6f  efault */.    fo
1eb00 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
1eb10 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1eb20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
1eb30 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70  pe==REDUCE && ap
1eb40 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20  ->x.rp==rbest ) 
1eb50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1eb60 20 61 73 73 65 72 74 28 20 61 70 20 29 3b 0a 20   assert( ap );. 
1eb70 20 20 20 61 70 2d 3e 73 70 20 3d 20 53 79 6d 62     ap->sp = Symb
1eb80 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74  ol_new("{default
1eb90 7d 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  }");.    for(ap=
1eba0 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3b 20 61 70  ap->next; ap; ap
1ebb0 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
1ebc0 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d    if( ap->type==
1ebd0 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e  REDUCE && ap->x.
1ebe0 72 70 3d 3d 72 62 65 73 74 20 29 20 61 70 2d 3e  rp==rbest ) ap->
1ebf0 74 79 70 65 20 3d 20 4e 4f 54 5f 55 53 45 44 3b  type = NOT_USED;
1ec00 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 70 2d 3e  .    }.    stp->
1ec10 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74  ap = Action_sort
1ec20 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20 7d 0a 7d  (stp->ap);.  }.}
1ec30 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  .../*.** Compare
1ec40 20 74 77 6f 20 73 74 61 74 65 73 20 66 6f 72 20   two states for 
1ec50 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
1ec60 2e 20 20 54 68 65 20 73 6d 61 6c 6c 65 72 20 73  .  The smaller s
1ec70 74 61 74 65 20 69 73 20 74 68 65 0a 2a 2a 20 6f  tate is the.** o
1ec80 6e 65 20 77 69 74 68 20 74 68 65 20 6d 6f 73 74  ne with the most
1ec90 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63   non-terminal ac
1eca0 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 79 20  tions.  If they 
1ecb0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
1ecc0 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e 6f 6e 2d 74  mber.** of non-t
1ecd0 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2c  erminal actions,
1ece0 20 74 68 65 6e 20 74 68 65 20 73 6d 61 6c 6c 65   then the smalle
1ecf0 72 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  r is the one wit
1ed00 68 20 74 68 65 20 6d 6f 73 74 0a 2a 2a 20 74 6f  h the most.** to
1ed10 6b 65 6e 20 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  ken actions..*/.
1ed20 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 65  static int state
1ed30 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 28 63 6f  ResortCompare(co
1ed40 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e  nst void *a, con
1ed50 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 63  st void *b){.  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 41 20 3d 20 2a 28 63 6f 6e 73 74 20  e *pA = *(const 
1ed80 73 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29 61  struct state**)a
1ed90 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  ;.  const struct
1eda0 20 73 74 61 74 65 20 2a 70 42 20 3d 20 2a 28 63   state *pB = *(c
1edb0 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74  onst struct stat
1edc0 65 2a 2a 29 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a  e**)b;.  int n;.
1edd0 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e 4e 74 41 63  .  n = pB->nNtAc
1ede0 74 20 2d 20 70 41 2d 3e 6e 4e 74 41 63 74 3b 0a  t - pA->nNtAct;.
1edf0 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
1ee00 20 20 6e 20 3d 20 70 42 2d 3e 6e 54 6b 6e 41 63    n = pB->nTknAc
1ee10 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e 41 63 74 3b  t - pA->nTknAct;
1ee20 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  .    if( n==0 ){
1ee30 0a 20 20 20 20 20 20 6e 20 3d 20 70 42 2d 3e 73  .      n = pB->s
1ee40 74 61 74 65 6e 75 6d 20 2d 20 70 41 2d 3e 73 74  tatenum - pA->st
1ee50 61 74 65 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20  atenum;.    }.  
1ee60 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 21 3d 30  }.  assert( n!=0
1ee70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a   );.  return n;.
1ee80 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 75 6d 62  }.../*.** Renumb
1ee90 65 72 20 61 6e 64 20 72 65 73 6f 72 74 20 73 74  er and resort st
1eea0 61 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61  ates so that sta
1eeb0 74 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63  tes with fewer c
1eec0 68 6f 69 63 65 73 0a 2a 2a 20 6f 63 63 75 72 20  hoices.** occur 
1eed0 61 74 20 74 68 65 20 65 6e 64 2e 20 20 45 78 63  at the end.  Exc
1eee0 65 70 74 2c 20 6b 65 65 70 20 73 74 61 74 65 20  ept, keep state 
1eef0 30 20 61 73 20 74 68 65 20 66 69 72 73 74 20 73  0 as the first s
1ef00 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 52 65  tate..*/.void Re
1ef10 73 6f 72 74 53 74 61 74 65 73 28 73 74 72 75 63  sortStates(struc
1ef20 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
1ef30 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1ef40 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
1ef50 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
1ef60 61 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ap;..  for(i=0; 
1ef70 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
1ef80 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
1ef90 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
1efa0 0a 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63  .    stp->nTknAc
1efb0 74 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 20  t = stp->nNtAct 
1efc0 3d 20 30 3b 0a 20 20 20 20 73 74 70 2d 3e 69 44  = 0;.    stp->iD
1efd0 66 6c 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  flt = lemp->nsta
1efe0 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  te + lemp->nrule
1eff0 3b 0a 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f  ;.    stp->iTknO
1f000 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b  fst = NO_OFFSET;
1f010 0a 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73  .    stp->iNtOfs
1f020 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20  t = NO_OFFSET;. 
1f030 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
1f040 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
1f050 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  xt){.      if( c
1f060 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65  ompute_action(le
1f070 6d 70 2c 61 70 29 3e 3d 30 20 29 7b 0a 20 20 20  mp,ap)>=0 ){.   
1f080 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d       if( ap->sp-
1f090 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65  >index<lemp->nte
1f0a0 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  rminal ){.      
1f0b0 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74      stp->nTknAct
1f0c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
1f0d0 65 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e  e if( ap->sp->in
1f0e0 64 65 78 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  dex<lemp->nsymbo
1f0f0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  l ){.          s
1f100 74 70 2d 3e 6e 4e 74 41 63 74 2b 2b 3b 0a 20 20  tp->nNtAct++;.  
1f110 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f120 20 20 20 20 20 20 20 73 74 70 2d 3e 69 44 66 6c         stp->iDfl
1f130 74 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69  t = compute_acti
1f140 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20  on(lemp, ap);.  
1f150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f160 20 20 20 20 7d 0a 20 20 7d 0a 20 20 71 73 6f 72      }.  }.  qsor
1f170 74 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  t(&lemp->sorted[
1f180 31 5d 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  1], lemp->nstate
1f190 2d 31 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 70 2d  -1, sizeof(lemp-
1f1a0 3e 73 6f 72 74 65 64 5b 30 5d 29 2c 0a 20 20 20  >sorted[0]),.   
1f1b0 20 20 20 20 20 73 74 61 74 65 52 65 73 6f 72 74       stateResort
1f1c0 43 6f 6d 70 61 72 65 29 3b 0a 20 20 66 6f 72 28  Compare);.  for(
1f1d0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
1f1e0 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c  ate; i++){.    l
1f1f0 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e  emp->sorted[i]->
1f200 73 74 61 74 65 6e 75 6d 20 3d 20 69 3b 0a 20 20  statenum = i;.  
1f210 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}.../*********
1f220 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
1f230 65 20 66 69 6c 65 20 22 73 65 74 2e 63 22 20 2a  e file "set.c" *
1f240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f260 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6d  ***/./*.** Set m
1f270 61 6e 69 70 75 6c 61 74 69 6f 6e 20 72 6f 75 74  anipulation rout
1f280 69 6e 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d  ines for the LEM
1f290 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
1f2a0 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  tor..*/..static 
1f2b0 69 6e 74 20 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f  int size = 0;../
1f2c0 2a 20 53 65 74 20 74 68 65 20 73 65 74 20 73 69  * Set the set si
1f2d0 7a 65 20 2a 2f 0a 76 6f 69 64 20 53 65 74 53 69  ze */.void SetSi
1f2e0 7a 65 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 73 69  ze(int n).{.  si
1f2f0 7a 65 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20  ze = n+1;.}../* 
1f300 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73  Allocate a new s
1f310 65 74 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e  et */.char *SetN
1f320 65 77 28 29 7b 0a 20 20 63 68 61 72 20 2a 73 3b  ew(){.  char *s;
1f330 0a 20 20 73 20 3d 20 28 63 68 61 72 2a 29 63 61  .  s = (char*)ca
1f340 6c 6c 6f 63 28 20 73 69 7a 65 2c 20 31 29 3b 0a  lloc( size, 1);.
1f350 20 20 69 66 28 20 73 3d 3d 30 20 29 7b 0a 20 20    if( s==0 ){.  
1f360 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d 65    extern void me
1f370 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20  mory_error();.  
1f380 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29    memory_error()
1f390 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
1f3a0 3b 0a 7d 0a 0a 2f 2a 20 44 65 61 6c 6c 6f 63 61  ;.}../* Dealloca
1f3b0 74 65 20 61 20 73 65 74 20 2a 2f 0a 76 6f 69 64  te a set */.void
1f3c0 20 53 65 74 46 72 65 65 28 63 68 61 72 20 2a 73   SetFree(char *s
1f3d0 29 0a 7b 0a 20 20 66 72 65 65 28 73 29 3b 0a 7d  ).{.  free(s);.}
1f3e0 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 65  ../* Add a new e
1f3f0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 73 65  lement to the se
1f400 74 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  t.  Return TRUE 
1f410 69 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 77  if the element w
1f420 61 73 20 61 64 64 65 64 0a 2a 2a 20 61 6e 64 20  as added.** and 
1f430 46 41 4c 53 45 20 69 66 20 69 74 20 77 61 73 20  FALSE if it was 
1f440 61 6c 72 65 61 64 79 20 74 68 65 72 65 2e 20 2a  already there. *
1f450 2f 0a 69 6e 74 20 53 65 74 41 64 64 28 63 68 61  /.int SetAdd(cha
1f460 72 20 2a 73 2c 20 69 6e 74 20 65 29 0a 7b 0a 20  r *s, int e).{. 
1f470 20 69 6e 74 20 72 76 3b 0a 20 20 61 73 73 65 72   int rv;.  asser
1f480 74 28 20 65 3e 3d 30 20 26 26 20 65 3c 73 69 7a  t( e>=0 && e<siz
1f490 65 20 29 3b 0a 20 20 72 76 20 3d 20 73 5b 65 5d  e );.  rv = s[e]
1f4a0 3b 0a 20 20 73 5b 65 5d 20 3d 20 31 3b 0a 20 20  ;.  s[e] = 1;.  
1f4b0 72 65 74 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a 2f  return !rv;.}../
1f4c0 2a 20 41 64 64 20 65 76 65 72 79 20 65 6c 65 6d  * Add every elem
1f4d0 65 6e 74 20 6f 66 20 73 32 20 74 6f 20 73 31 2e  ent of s2 to s1.
1f4e0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
1f4f0 20 73 31 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a   s1 changes. */.
1f500 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28 63 68 61  int SetUnion(cha
1f510 72 20 2a 73 31 2c 20 63 68 61 72 20 2a 73 32 29  r *s1, char *s2)
1f520 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 70 72 6f 67  .{.  int i, prog
1f530 72 65 73 73 3b 0a 20 20 70 72 6f 67 72 65 73 73  ress;.  progress
1f540 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
1f550 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20   i<size; i++){. 
1f560 20 20 20 69 66 28 20 73 32 5b 69 5d 3d 3d 30 20     if( s2[i]==0 
1f570 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1f580 69 66 28 20 73 31 5b 69 5d 3d 3d 30 20 29 7b 0a  if( s1[i]==0 ){.
1f590 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d        progress =
1f5a0 20 31 3b 0a 20 20 20 20 20 20 73 31 5b 69 5d 20   1;.      s1[i] 
1f5b0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
1f5c0 20 72 65 74 75 72 6e 20 70 72 6f 67 72 65 73 73   return progress
1f5d0 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
1f5e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
1f5f0 20 74 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65   the file "table
1f600 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
1f610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f620 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65  /./*.** All code
1f630 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68 61   in this file ha
1f640 73 20 62 65 65 6e 20 61 75 74 6f 6d 61 74 69 63  s been automatic
1f650 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 0a 2a  ally generated.*
1f660 2a 20 66 72 6f 6d 20 61 20 73 70 65 63 69 66 69  * from a specifi
1f670 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 66 69  cation in the fi
1f680 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  le.**           
1f690 20 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20     "table.q".** 
1f6a0 62 79 20 74 68 65 20 61 73 73 6f 63 69 61 74 69  by the associati
1f6b0 76 65 20 61 72 72 61 79 20 63 6f 64 65 20 62 75  ve array code bu
1f6c0 69 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d 20 22  ilding program "
1f6d0 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f  aagen"..** Do no
1f6e0 74 20 65 64 69 74 20 74 68 69 73 20 66 69 6c 65  t edit this file
1f6f0 21 20 20 49 6e 73 74 65 61 64 2c 20 65 64 69 74  !  Instead, edit
1f700 20 74 68 65 20 73 70 65 63 69 66 69 63 61 74 69   the specificati
1f710 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  on.** file, then
1f720 20 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f   rerun aagen..*/
1f730 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20  ./*.** Code for 
1f740 70 72 6f 63 65 73 73 69 6e 67 20 74 61 62 6c 65  processing table
1f750 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  s in the LEMON p
1f760 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
1f770 0a 2a 2f 0a 0a 50 52 49 56 41 54 45 20 69 6e 74  .*/..PRIVATE int
1f780 20 73 74 72 68 61 73 68 28 63 6f 6e 73 74 20 63   strhash(const c
1f790 68 61 72 20 2a 78 29 0a 7b 0a 20 20 69 6e 74 20  har *x).{.  int 
1f7a0 68 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  h = 0;.  while( 
1f7b0 2a 78 29 20 68 20 3d 20 68 2a 31 33 20 2b 20 2a  *x) h = h*13 + *
1f7c0 28 78 2b 2b 29 3b 0a 20 20 72 65 74 75 72 6e 20  (x++);.  return 
1f7d0 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b 73 20 6c  h;.}../* Works l
1f7e0 69 6b 65 20 73 74 72 64 75 70 2c 20 73 6f 72 74  ike strdup, sort
1f7f0 20 6f 66 2e 20 20 53 61 76 65 20 61 20 73 74 72   of.  Save a str
1f800 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f 63 65 64 20  ing in malloced 
1f810 6d 65 6d 6f 72 79 2c 20 62 75 74 0a 2a 2a 20 6b  memory, but.** k
1f820 65 65 70 20 73 74 72 69 6e 67 73 20 69 6e 20 61  eep strings in a
1f830 20 74 61 62 6c 65 20 73 6f 20 74 68 61 74 20 74   table so that t
1f840 68 65 20 73 61 6d 65 20 73 74 72 69 6e 67 20 69  he same string i
1f850 73 20 6e 6f 74 20 69 6e 20 6d 6f 72 65 0a 2a 2a  s not in more.**
1f860 20 74 68 61 6e 20 6f 6e 65 20 70 6c 61 63 65 2e   than one place.
1f870 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
1f880 53 74 72 73 61 66 65 28 63 6f 6e 73 74 20 63 68  Strsafe(const ch
1f890 61 72 20 2a 79 29 0a 7b 0a 20 20 63 6f 6e 73 74  ar *y).{.  const
1f8a0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72   char *z;.  char
1f8b0 20 2a 63 70 79 3b 0a 0a 20 20 69 66 28 20 79 3d   *cpy;..  if( y=
1f8c0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1f8d0 20 7a 20 3d 20 53 74 72 73 61 66 65 5f 66 69 6e   z = Strsafe_fin
1f8e0 64 28 79 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  d(y);.  if( z==0
1f8f0 20 26 26 20 28 63 70 79 3d 28 63 68 61 72 20 2a   && (cpy=(char *
1f900 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74  )malloc( lemonSt
1f910 72 6c 65 6e 28 79 29 2b 31 20 29 29 21 3d 30 20  rlen(y)+1 ))!=0 
1f920 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 63 70  ){.    strcpy(cp
1f930 79 2c 79 29 3b 0a 20 20 20 20 7a 20 3d 20 63 70  y,y);.    z = cp
1f940 79 3b 0a 20 20 20 20 53 74 72 73 61 66 65 5f 69  y;.    Strsafe_i
1f950 6e 73 65 72 74 28 7a 29 3b 0a 20 20 7d 0a 20 20  nsert(z);.  }.  
1f960 4d 65 6d 6f 72 79 43 68 65 63 6b 28 7a 29 3b 0a  MemoryCheck(z);.
1f970 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f    return z;.}../
1f980 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
1f990 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
1f9a0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1f9b0 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61  re for each.** a
1f9c0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
1f9d0 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a   of type "x1"..*
1f9e0 2f 0a 73 74 72 75 63 74 20 73 5f 78 31 20 7b 0a  /.struct s_x1 {.
1f9f0 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
1fa00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1fa10 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
1fa20 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20  able slots. */. 
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa40 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75           /*   Mu
1fa50 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
1fa60 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
1fa70 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa90 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20  /*   equal to 1 
1faa0 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20  */.  int count; 
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fac0 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  Number of curren
1fad0 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64  tly slots filled
1fae0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1faf0 31 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20  1node *tbl;  /* 
1fb00 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  The data stored 
1fb10 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  here */.  struct
1fb20 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 68 74 3b 20   s_x1node **ht; 
1fb30 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66   /* Hash table f
1fb40 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b  or lookups */.};
1fb50 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
1fb60 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
1fb70 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
1fb80 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d   every data elem
1fb90 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73  ent.** in an ass
1fba0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
1fbb0 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a  f type "x1"..*/.
1fbc0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
1fbd0 5f 78 31 6e 6f 64 65 20 7b 0a 20 20 63 6f 6e 73  _x1node {.  cons
1fbe0 74 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  t char *data;   
1fbf0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
1fc00 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1fc10 31 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f  1node *next;   /
1fc20 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74  * Next entry wit
1fc30 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20  h the same hash 
1fc40 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31  */.  struct s_x1
1fc50 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a  node **from;  /*
1fc60 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a   Previous link *
1fc70 2f 0a 7d 20 78 31 6e 6f 64 65 3b 0a 0a 2f 2a 20  /.} x1node;../* 
1fc80 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e  There is only on
1fc90 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
1fca0 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69  e array, which i
1fcb0 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
1fcc0 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
1fcd0 20 73 5f 78 31 20 2a 78 31 61 3b 0a 0a 2f 2a 20   s_x1 *x1a;../* 
1fce0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61  Allocate a new a
1fcf0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
1fd00 20 2a 2f 0a 76 6f 69 64 20 53 74 72 73 61 66 65   */.void Strsafe
1fd10 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78  _init(){.  if( x
1fd20 31 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  1a ) return;.  x
1fd30 31 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78  1a = (struct s_x
1fd40 31 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  1*)malloc( sizeo
1fd50 66 28 73 74 72 75 63 74 20 73 5f 78 31 29 20 29  f(struct s_x1) )
1fd60 3b 0a 20 20 69 66 28 20 78 31 61 20 29 7b 0a 20  ;.  if( x1a ){. 
1fd70 20 20 20 78 31 61 2d 3e 73 69 7a 65 20 3d 20 31     x1a->size = 1
1fd80 30 32 34 3b 0a 20 20 20 20 78 31 61 2d 3e 63 6f  024;.    x1a->co
1fd90 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 31 61  unt = 0;.    x1a
1fda0 2d 3e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a  ->tbl = (x1node*
1fdb0 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20  )malloc( .      
1fdc0 28 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20  (sizeof(x1node) 
1fdd0 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a  + sizeof(x1node*
1fde0 29 29 2a 31 30 32 34 20 29 3b 0a 20 20 20 20 69  ))*1024 );.    i
1fdf0 66 28 20 78 31 61 2d 3e 74 62 6c 3d 3d 30 20 29  f( x1a->tbl==0 )
1fe00 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 31 61  {.      free(x1a
1fe10 29 3b 0a 20 20 20 20 20 20 78 31 61 20 3d 20 30  );.      x1a = 0
1fe20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1fe30 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1fe40 78 31 61 2d 3e 68 74 20 3d 20 28 78 31 6e 6f 64  x1a->ht = (x1nod
1fe50 65 2a 2a 29 26 28 78 31 61 2d 3e 74 62 6c 5b 31  e**)&(x1a->tbl[1
1fe60 30 32 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  024]);.      for
1fe70 28 69 3d 30 3b 20 69 3c 31 30 32 34 3b 20 69 2b  (i=0; i<1024; i+
1fe80 2b 29 20 78 31 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x1a->ht[i] = 
1fe90 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f  0;.    }.  }.}./
1fea0 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
1feb0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61  ecord into the a
1fec0 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52  rray.  Return TR
1fed0 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  UE if successful
1fee0 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20  ..** Prior data 
1fef0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
1ff00 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69  y is NOT overwri
1ff10 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 72 73  tten */.int Strs
1ff20 61 66 65 5f 69 6e 73 65 72 74 28 63 6f 6e 73 74  afe_insert(const
1ff30 20 63 68 61 72 20 2a 64 61 74 61 29 0a 7b 0a 20   char *data).{. 
1ff40 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69   x1node *np;.  i
1ff50 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a  nt h;.  int ph;.
1ff60 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29 20  .  if( x1a==0 ) 
1ff70 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
1ff80 20 73 74 72 68 61 73 68 28 64 61 74 61 29 3b 0a   strhash(data);.
1ff90 20 20 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d    h = ph & (x1a-
1ffa0 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
1ffb0 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77   x1a->ht[h];.  w
1ffc0 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20  hile( np ){.    
1ffd0 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64  if( strcmp(np->d
1ffe0 61 74 61 2c 64 61 74 61 29 3d 3d 30 20 29 7b 0a  ata,data)==0 ){.
1fff0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
20000 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20  ting entry with 
20010 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
20020 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20  found. */.      
20030 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20  /* Fail because 
20040 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74  overwrite is not
20050 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20   allows. */.    
20060 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
20070 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  }.    np = np->n
20080 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78  ext;.  }.  if( x
20090 31 61 2d 3e 63 6f 75 6e 74 3e 3d 78 31 61 2d 3e  1a->count>=x1a->
200a0 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  size ){.    /* N
200b0 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  eed to make the 
200c0 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65  hash table bigge
200d0 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73  r */.    int i,s
200e0 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ize;.    struct 
200f0 73 5f 78 31 20 61 72 72 61 79 3b 0a 20 20 20 20  s_x1 array;.    
20100 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a  array.size = siz
20110 65 20 3d 20 78 31 61 2d 3e 73 69 7a 65 2a 32 3b  e = x1a->size*2;
20120 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74  .    array.count
20130 20 3d 20 78 31 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x1a->count;. 
20140 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28     array.tbl = (
20150 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a  x1node*)malloc(.
20160 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 31        (sizeof(x1
20170 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
20180 31 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b  1node*))*size );
20190 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74  .    if( array.t
201a0 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  bl==0 ) return 0
201b0 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74  ;  /* Fail due t
201c0 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  o malloc failure
201d0 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74   */.    array.ht
201e0 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 61   = (x1node**)&(a
201f0 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b  rray.tbl[size]);
20200 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
20210 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  size; i++) array
20220 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  .ht[i] = 0;.    
20230 66 6f 72 28 69 3d 30 3b 20 69 3c 78 31 61 2d 3e  for(i=0; i<x1a->
20240 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  count; i++){.   
20250 20 20 20 78 31 6e 6f 64 65 20 2a 6f 6c 64 6e 70     x1node *oldnp
20260 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20  , *newnp;.      
20270 6f 6c 64 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74  oldnp = &(x1a->t
20280 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20  bl[i]);.      h 
20290 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d  = strhash(oldnp-
202a0 3e 64 61 74 61 29 20 26 20 28 73 69 7a 65 2d 31  >data) & (size-1
202b0 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
202c0 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
202d0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
202e0 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
202f0 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
20300 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
20310 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
20320 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
20330 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61       newnp->data
20340 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a   = oldnp->data;.
20350 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f        newnp->fro
20360 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68  m = &(array.ht[h
20370 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e  ]);.      array.
20380 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20  ht[h] = newnp;. 
20390 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 31     }.    free(x1
203a0 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 31  a->tbl);.    *x1
203b0 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20  a = array;.  }. 
203c0 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
203d0 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d  ew data */.  h =
203e0 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65   ph & (x1a->size
203f0 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 31  -1);.  np = &(x1
20400 61 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63 6f 75 6e  a->tbl[x1a->coun
20410 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74  t++]);.  np->dat
20420 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
20430 78 31 61 2d 3e 68 74 5b 68 5d 20 29 20 78 31 61  x1a->ht[h] ) x1a
20440 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
20450 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
20460 70 2d 3e 6e 65 78 74 20 3d 20 78 31 61 2d 3e 68  p->next = x1a->h
20470 74 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e 68 74 5b  t[h];.  x1a->ht[
20480 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
20490 72 6f 6d 20 3d 20 26 28 78 31 61 2d 3e 68 74 5b  rom = &(x1a->ht[
204a0 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
204b0 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
204c0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
204d0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
204e0 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
204f0 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
20500 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 63 6f   such key. */.co
20510 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73 61 66  nst char *Strsaf
20520 65 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61  e_find(const cha
20530 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 69 6e 74 20  r *key).{.  int 
20540 68 3b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b  h;.  x1node *np;
20550 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29  ..  if( x1a==0 )
20560 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d   return 0;.  h =
20570 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26 20   strhash(key) & 
20580 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x1a->size-1);. 
20590 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d   np = x1a->ht[h]
205a0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
205b0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
205c0 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30  np->data,key)==0
205d0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70   ) break;.    np
205e0 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
205f0 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e  .  return np ? n
20600 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a  p->data : 0;.}..
20610 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
20620 74 65 72 20 74 6f 20 74 68 65 20 28 74 65 72 6d  ter to the (term
20630 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74 65 72 6d 69  inal or nontermi
20640 6e 61 6c 29 20 73 79 6d 62 6f 6c 20 22 78 22 2e  nal) symbol "x".
20650 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
20660 20 73 79 6d 62 6f 6c 20 69 66 20 74 68 69 73 20   symbol if this 
20670 69 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  is the first tim
20680 65 20 22 78 22 20 68 61 73 20 62 65 65 6e 20 73  e "x" has been s
20690 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73  een..*/.struct s
206a0 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65  ymbol *Symbol_ne
206b0 77 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 29  w(const char *x)
206c0 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  .{.  struct symb
206d0 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73 70 20 3d 20  ol *sp;..  sp = 
206e0 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b 0a  Symbol_find(x);.
206f0 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20    if( sp==0 ){. 
20700 20 20 20 73 70 20 3d 20 28 73 74 72 75 63 74 20     sp = (struct 
20710 73 79 6d 62 6f 6c 20 2a 29 63 61 6c 6c 6f 63 28  symbol *)calloc(
20720 31 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  1, sizeof(struct
20730 20 73 79 6d 62 6f 6c 29 20 29 3b 0a 20 20 20 20   symbol) );.    
20740 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73 70 29 3b  MemoryCheck(sp);
20750 0a 20 20 20 20 73 70 2d 3e 6e 61 6d 65 20 3d 20  .    sp->name = 
20760 53 74 72 73 61 66 65 28 78 29 3b 0a 20 20 20 20  Strsafe(x);.    
20770 73 70 2d 3e 74 79 70 65 20 3d 20 69 73 75 70 70  sp->type = isupp
20780 65 72 28 2a 78 29 20 3f 20 54 45 52 4d 49 4e 41  er(*x) ? TERMINA
20790 4c 20 3a 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c 3b  L : NONTERMINAL;
207a0 0a 20 20 20 20 73 70 2d 3e 72 75 6c 65 20 3d 20  .    sp->rule = 
207b0 30 3b 0a 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62  0;.    sp->fallb
207c0 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d  ack = 0;.    sp-
207d0 3e 70 72 65 63 20 3d 20 2d 31 3b 0a 20 20 20 20  >prec = -1;.    
207e0 73 70 2d 3e 61 73 73 6f 63 20 3d 20 55 4e 4b 3b  sp->assoc = UNK;
207f0 0a 20 20 20 20 73 70 2d 3e 66 69 72 73 74 73 65  .    sp->firstse
20800 74 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 6c  t = 0;.    sp->l
20810 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46 41  ambda = LEMON_FA
20820 4c 53 45 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73  LSE;.    sp->des
20830 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20  tructor = 0;.   
20840 20 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 20   sp->destLineno 
20850 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 61 74  = 0;.    sp->dat
20860 61 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 73  atype = 0;.    s
20870 70 2d 3e 75 73 65 43 6e 74 20 3d 20 30 3b 0a 20  p->useCnt = 0;. 
20880 20 20 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74     Symbol_insert
20890 28 73 70 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  (sp,sp->name);. 
208a0 20 7d 0a 20 20 73 70 2d 3e 75 73 65 43 6e 74 2b   }.  sp->useCnt+
208b0 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73 70 3b 0a  +;.  return sp;.
208c0 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77  }../* Compare tw
208d0 6f 20 73 79 6d 62 6f 6c 73 20 66 6f 72 20 77 6f  o symbols for wo
208e0 72 6b 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a  rking purposes.*
208f0 2a 0a 2a 2a 20 53 79 6d 62 6f 6c 73 20 74 68 61  *.** Symbols tha
20900 74 20 62 65 67 69 6e 20 77 69 74 68 20 75 70 70  t begin with upp
20910 65 72 20 63 61 73 65 20 6c 65 74 74 65 72 73 20  er case letters 
20920 28 74 65 72 6d 69 6e 61 6c 73 20 6f 72 20 74 6f  (terminals or to
20930 6b 65 6e 73 29 0a 2a 2a 20 6d 75 73 74 20 73 6f  kens).** must so
20940 72 74 20 62 65 66 6f 72 65 20 73 79 6d 62 6f 6c  rt before symbol
20950 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
20960 68 20 6c 6f 77 65 72 20 63 61 73 65 20 6c 65 74  h lower case let
20970 74 65 72 73 0a 2a 2a 20 28 6e 6f 6e 2d 74 65 72  ters.** (non-ter
20980 6d 69 6e 61 6c 73 29 2e 20 20 4f 74 68 65 72 20  minals).  Other 
20990 74 68 61 6e 20 74 68 61 74 2c 20 74 68 65 20 6f  than that, the o
209a0 72 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 6d 61  rder does not ma
209b0 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 66  tter..**.** We f
209c0 69 6e 64 20 65 78 70 65 72 69 6d 65 6e 74 61 6c  ind experimental
209d0 6c 79 20 74 68 61 74 20 6c 65 61 76 69 6e 67 20  ly that leaving 
209e0 74 68 65 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74  the symbols in t
209f0 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a  heir original.**
20a00 20 6f 72 64 65 72 20 28 74 68 65 20 6f 72 64 65   order (the orde
20a10 72 20 74 68 65 79 20 61 70 70 65 61 72 65 64 20  r they appeared 
20a20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 66  in the grammar f
20a30 69 6c 65 29 20 67 69 76 65 73 20 74 68 65 0a 2a  ile) gives the.*
20a40 2a 20 73 6d 61 6c 6c 65 73 74 20 70 61 72 73 65  * smallest parse
20a50 72 20 74 61 62 6c 65 73 20 69 6e 20 53 51 4c 69  r tables in SQLi
20a60 74 65 2e 0a 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f  te..*/.int Symbo
20a70 6c 63 6d 70 70 28 63 6f 6e 73 74 20 76 6f 69 64  lcmpp(const void
20a80 20 2a 5f 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64   *_a, const void
20a90 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f 6e 73 74 20   *_b).{.  const 
20aa0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
20ab0 61 20 3d 20 28 63 6f 6e 73 74 20 73 74 72 75 63  a = (const struc
20ac0 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 5f 61 3b  t symbol **) _a;
20ad0 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
20ae0 73 79 6d 62 6f 6c 20 2a 2a 62 20 3d 20 28 63 6f  symbol **b = (co
20af0 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f  nst struct symbo
20b00 6c 20 2a 2a 29 20 5f 62 3b 0a 20 20 69 6e 74 20  l **) _b;.  int 
20b10 69 31 20 3d 20 28 2a 2a 61 29 2e 69 6e 64 65 78  i1 = (**a).index
20b20 20 2b 20 31 30 30 30 30 30 30 30 2a 28 28 2a 2a   + 10000000*((**
20b30 61 29 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 29 3b  a).name[0]>'Z');
20b40 0a 20 20 69 6e 74 20 69 32 20 3d 20 28 2a 2a 62  .  int i2 = (**b
20b50 29 2e 69 6e 64 65 78 20 2b 20 31 30 30 30 30 30  ).index + 100000
20b60 30 30 2a 28 28 2a 2a 62 29 2e 6e 61 6d 65 5b 30  00*((**b).name[0
20b70 5d 3e 27 5a 27 29 3b 0a 20 20 61 73 73 65 72 74  ]>'Z');.  assert
20b80 28 20 69 31 21 3d 69 32 20 7c 7c 20 73 74 72 63  ( i1!=i2 || strc
20b90 6d 70 28 28 2a 2a 61 29 2e 6e 61 6d 65 2c 28 2a  mp((**a).name,(*
20ba0 2a 62 29 2e 6e 61 6d 65 29 3d 3d 30 20 29 3b 0a  *b).name)==0 );.
20bb0 20 20 72 65 74 75 72 6e 20 69 31 2d 69 32 3b 0a    return i1-i2;.
20bc0 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  }../* There is o
20bd0 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
20be0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
20bf0 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a  ucture for each.
20c00 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ** associative a
20c10 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 32  rray of type "x2
20c20 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78  "..*/.struct s_x
20c30 32 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20  2 {.  int size; 
20c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20c50 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   The number of a
20c60 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20  vailable slots. 
20c70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20c90 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65    Must be a powe
20ca0 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74  r of 2 greater t
20cb0 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20  han or */.      
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cd0 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74      /*   equal t
20ce0 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  o 1 */.  int cou
20cf0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
20d00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
20d10 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69  rrently slots fi
20d20 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  lled */.  struct
20d30 20 73 5f 78 32 6e 6f 64 65 20 2a 74 62 6c 3b 20   s_x2node *tbl; 
20d40 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f   /* The data sto
20d50 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  red here */.  st
20d60 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a  ruct s_x2node **
20d70 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ht;  /* Hash tab
20d80 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a  le for lookups *
20d90 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  /.};../* There i
20da0 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
20db0 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
20dc0 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20   for every data 
20dd0 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e  element.** in an
20de0 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
20df0 61 79 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e  ay of type "x2".
20e00 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
20e10 63 74 20 73 5f 78 32 6e 6f 64 65 20 7b 0a 20 20  ct s_x2node {.  
20e20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
20e30 61 74 61 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ata;     /* The 
20e40 64 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  data */.  const 
20e50 63 68 61 72 20 2a 6b 65 79 3b 20 20 20 20 20 20  char *key;      
20e60 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
20e70 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f  .  struct s_x2no
20e80 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e  de *next;   /* N
20e90 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74  ext entry with t
20ea0 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a  he same hash */.
20eb0 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64    struct s_x2nod
20ec0 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72  e **from;  /* Pr
20ed0 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d  evious link */.}
20ee0 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65   x2node;../* The
20ef0 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69  re is only one i
20f00 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61  nstance of the a
20f10 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74  rray, which is t
20f20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
20f30 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f  static struct s_
20f40 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a 20 41 6c 6c  x2 *x2a;../* All
20f50 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f  ocate a new asso
20f60 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f  ciative array */
20f70 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69  .void Symbol_ini
20f80 74 28 29 7b 0a 20 20 69 66 28 20 78 32 61 20 29  t(){.  if( x2a )
20f90 20 72 65 74 75 72 6e 3b 0a 20 20 78 32 61 20 3d   return;.  x2a =
20fa0 20 28 73 74 72 75 63 74 20 73 5f 78 32 2a 29 6d   (struct s_x2*)m
20fb0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
20fc0 72 75 63 74 20 73 5f 78 32 29 20 29 3b 0a 20 20  ruct s_x2) );.  
20fd0 69 66 28 20 78 32 61 20 29 7b 0a 20 20 20 20 78  if( x2a ){.    x
20fe0 32 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a  2a->size = 128;.
20ff0 20 20 20 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3d      x2a->count =
21000 20 30 3b 0a 20 20 20 20 78 32 61 2d 3e 74 62 6c   0;.    x2a->tbl
21010 20 3d 20 28 78 32 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x2node*)mall
21020 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65  oc( .      (size
21030 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x2node) + siz
21040 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 2a 31 32  eof(x2node*))*12
21050 38 20 29 3b 0a 20 20 20 20 69 66 28 20 78 32 61  8 );.    if( x2a
21060 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ->tbl==0 ){.    
21070 20 20 66 72 65 65 28 78 32 61 29 3b 0a 20 20 20    free(x2a);.   
21080 20 20 20 78 32 61 20 3d 20 30 3b 0a 20 20 20 20     x2a = 0;.    
21090 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
210a0 20 69 3b 0a 20 20 20 20 20 20 78 32 61 2d 3e 68   i;.      x2a->h
210b0 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28  t = (x2node**)&(
210c0 78 32 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a  x2a->tbl[128]);.
210d0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
210e0 3c 31 32 38 3b 20 69 2b 2b 29 20 78 32 61 2d 3e  <128; i++) x2a->
210f0 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ht[i] = 0;.    }
21100 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74  .  }.}./* Insert
21110 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
21120 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52  to the array.  R
21130 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75  eturn TRUE if su
21140 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69  ccessful..** Pri
21150 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65  or data with the
21160 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54   same key is NOT
21170 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a   overwritten */.
21180 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72  int Symbol_inser
21190 74 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  t(struct symbol 
211a0 2a 64 61 74 61 2c 20 63 6f 6e 73 74 20 63 68 61  *data, const cha
211b0 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 78 32 6e 6f  r *key).{.  x2no
211c0 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b  de *np;.  int h;
211d0 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66  .  int ph;..  if
211e0 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x2a==0 ) retur
211f0 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68  n 0;.  ph = strh
21200 61 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20  ash(key);.  h = 
21210 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d  ph & (x2a->size-
21220 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e  1);.  np = x2a->
21230 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
21240 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
21250 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79  rcmp(np->key,key
21260 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
21270 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   An existing ent
21280 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
21290 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a   key is found. *
212a0 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20  /.      /* Fail 
212b0 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74  because overwrit
212c0 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e  e is not allows.
212d0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
212e0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70   0;.    }.    np
212f0 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
21300 0a 20 20 69 66 28 20 78 32 61 2d 3e 63 6f 75 6e  .  if( x2a->coun
21310 74 3e 3d 78 32 61 2d 3e 73 69 7a 65 20 29 7b 0a  t>=x2a->size ){.
21320 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d      /* Need to m
21330 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ake the hash tab
21340 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20  le bigger */.   
21350 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20   int i,size;.   
21360 20 73 74 72 75 63 74 20 73 5f 78 32 20 61 72 72   struct s_x2 arr
21370 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69  ay;.    array.si
21380 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 32 61 2d  ze = size = x2a-
21390 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72  >size*2;.    arr
213a0 61 79 2e 63 6f 75 6e 74 20 3d 20 78 32 61 2d 3e  ay.count = x2a->
213b0 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79  count;.    array
213c0 2e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29  .tbl = (x2node*)
213d0 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73  malloc(.      (s
213e0 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20  izeof(x2node) + 
213f0 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29  sizeof(x2node*))
21400 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  *size );.    if(
21410 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20   array.tbl==0 ) 
21420 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61  return 0;  /* Fa
21430 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63  il due to malloc
21440 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20   failure */.    
21450 61 72 72 61 79 2e 68 74 20 3d 20 28 78 32 6e 6f  array.ht = (x2no
21460 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c  de**)&(array.tbl
21470 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72  [size]);.    for
21480 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
21490 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d  +) array.ht[i] =
214a0 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
214b0 20 69 3c 78 32 61 2d 3e 63 6f 75 6e 74 3b 20 69   i<x2a->count; i
214c0 2b 2b 29 7b 0a 20 20 20 20 20 20 78 32 6e 6f 64  ++){.      x2nod
214d0 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70  e *oldnp, *newnp
214e0 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20  ;.      oldnp = 
214f0 26 28 78 32 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a  &(x2a->tbl[i]);.
21500 20 20 20 20 20 20 68 20 3d 20 73 74 72 68 61 73        h = strhas
21510 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20  h(oldnp->key) & 
21520 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  (size-1);.      
21530 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e  newnp = &(array.
21540 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  tbl[i]);.      i
21550 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29  f( array.ht[h] )
21560 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72   array.ht[h]->fr
21570 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65  om = &(newnp->ne
21580 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  xt);.      newnp
21590 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68  ->next = array.h
215a0 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e  t[h];.      newn
215b0 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e  p->key = oldnp->
215c0 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  key;.      newnp
215d0 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e  ->data = oldnp->
215e0 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e  data;.      newn
215f0 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61  p->from = &(arra
21600 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20  y.ht[h]);.      
21610 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65  array.ht[h] = ne
21620 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  wnp;.    }.    f
21630 72 65 65 28 78 32 61 2d 3e 74 62 6c 29 3b 0a 20  ree(x2a->tbl);. 
21640 20 20 20 2a 78 32 61 20 3d 20 61 72 72 61 79 3b     *x2a = array;
21650 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74  .  }.  /* Insert
21660 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f   the new data */
21670 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 32 61  .  h = ph & (x2a
21680 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
21690 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b 78 32 61  = &(x2a->tbl[x2a
216a0 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e  ->count++]);.  n
216b0 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20  p->key = key;.  
216c0 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b  np->data = data;
216d0 0a 20 20 69 66 28 20 78 32 61 2d 3e 68 74 5b 68  .  if( x2a->ht[h
216e0 5d 20 29 20 78 32 61 2d 3e 68 74 5b 68 5d 2d 3e  ] ) x2a->ht[h]->
216f0 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78  from = &(np->nex
21700 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d  t);.  np->next =
21710 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78   x2a->ht[h];.  x
21720 32 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a  2a->ht[h] = np;.
21730 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78    np->from = &(x
21740 32 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65  2a->ht[h]);.  re
21750 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65  turn 1;.}../* Re
21760 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
21770 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20  o data assigned 
21780 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79  to the given key
21790 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a  .  Return NULL.*
217a0 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79  * if no such key
217b0 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62  . */.struct symb
217c0 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28  ol *Symbol_find(
217d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 29  const char *key)
217e0 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 32  .{.  int h;.  x2
217f0 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28  node *np;..  if(
21800 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x2a==0 ) return
21810 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73   0;.  h = strhas
21820 68 28 6b 65 79 29 20 26 20 28 78 32 61 2d 3e 73  h(key) & (x2a->s
21830 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
21840 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  2a->ht[h];.  whi
21850 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
21860 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79  ( strcmp(np->key
21870 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,key)==0 ) break
21880 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  ;.    np = np->n
21890 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
218a0 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20  n np ? np->data 
218b0 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  : 0;.}../* Retur
218c0 6e 20 74 68 65 20 6e 2d 74 68 20 64 61 74 61 2e  n the n-th data.
218d0 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
218e0 20 6e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   n is out of ran
218f0 67 65 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79  ge. */.struct sy
21900 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68  mbol *Symbol_Nth
21910 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 73 74 72 75  (int n).{.  stru
21920 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b  ct symbol *data;
21930 0a 20 20 69 66 28 20 78 32 61 20 26 26 20 6e 3e  .  if( x2a && n>
21940 30 20 26 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f 75  0 && n<=x2a->cou
21950 6e 74 20 29 7b 0a 20 20 20 20 64 61 74 61 20 3d  nt ){.    data =
21960 20 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e 64   x2a->tbl[n-1].d
21970 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ata;.  }else{.  
21980 20 20 64 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a    data = 0;.  }.
21990 20 20 72 65 74 75 72 6e 20 64 61 74 61 3b 0a 7d    return data;.}
219a0 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ../* Return the 
219b0 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61  size of the arra
219c0 79 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f  y */.int Symbol_
219d0 63 6f 75 6e 74 28 29 0a 7b 0a 20 20 72 65 74 75  count().{.  retu
219e0 72 6e 20 78 32 61 20 3f 20 78 32 61 2d 3e 63 6f  rn x2a ? x2a->co
219f0 75 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52  unt : 0;.}../* R
21a00 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20 6f  eturn an array o
21a10 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c  f pointers to al
21a20 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 61  l data in the ta
21a30 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61  ble..** The arra
21a40 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  y is obtained fr
21a50 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75  om malloc.  Retu
21a60 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72  rn NULL if memor
21a70 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  y allocation.** 
21a80 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20  problems, or if 
21a90 74 68 65 20 61 72 72 61 79 20 69 73 20 65 6d 70  the array is emp
21aa0 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79  ty. */.struct sy
21ab0 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72  mbol **Symbol_ar
21ac0 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75  rayof().{.  stru
21ad0 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 72 72 61  ct symbol **arra
21ae0 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b  y;.  int i,size;
21af0 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20  .  if( x2a==0 ) 
21b00 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65  return 0;.  size
21b10 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x2a->count;. 
21b20 20 61 72 72 61 79 20 3d 20 28 73 74 72 75 63 74   array = (struct
21b30 20 73 79 6d 62 6f 6c 20 2a 2a 29 63 61 6c 6c 6f   symbol **)callo
21b40 63 28 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28 73  c(size, sizeof(s
21b50 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 29  truct symbol *))
21b60 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20 29 7b  ;.  if( array ){
21b70 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
21b80 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  size; i++) array
21b90 5b 69 5d 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 69  [i] = x2a->tbl[i
21ba0 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65  ].data;.  }.  re
21bb0 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f  turn array;.}../
21bc0 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 63 6f  * Compare two co
21bd0 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a  nfigurations */.
21be0 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 63 6f  int Configcmp(co
21bf0 6e 73 74 20 63 68 61 72 20 2a 5f 61 2c 63 6f 6e  nst char *_a,con
21c00 73 74 20 63 68 61 72 20 2a 5f 62 29 0a 7b 0a 20  st char *_b).{. 
21c10 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f   const struct co
21c20 6e 66 69 67 20 2a 61 20 3d 20 28 73 74 72 75 63  nfig *a = (struc
21c30 74 20 63 6f 6e 66 69 67 20 2a 29 20 5f 61 3b 0a  t config *) _a;.
21c40 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63    const struct c
21c50 6f 6e 66 69 67 20 2a 62 20 3d 20 28 73 74 72 75  onfig *b = (stru
21c60 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 5f 62 3b  ct config *) _b;
21c70 0a 20 20 69 6e 74 20 78 3b 0a 20 20 78 20 3d 20  .  int x;.  x = 
21c80 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62  a->rp->index - b
21c90 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69  ->rp->index;.  i
21ca0 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 61 2d  f( x==0 ) x = a-
21cb0 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20  >dot - b->dot;. 
21cc0 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a   return x;.}../*
21cd0 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 61   Compare two sta
21ce0 74 65 73 20 2a 2f 0a 50 52 49 56 41 54 45 20 69  tes */.PRIVATE i
21cf0 6e 74 20 73 74 61 74 65 63 6d 70 28 73 74 72 75  nt statecmp(stru
21d00 63 74 20 63 6f 6e 66 69 67 20 2a 61 2c 20 73 74  ct config *a, st
21d10 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 29 0a  ruct config *b).
21d20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 66 6f  {.  int rc;.  fo
21d30 72 28 72 63 3d 30 3b 20 72 63 3d 3d 30 20 26 26  r(rc=0; rc==0 &&
21d40 20 61 20 26 26 20 62 3b 20 20 61 3d 61 2d 3e 62   a && b;  a=a->b
21d50 70 2c 20 62 3d 62 2d 3e 62 70 29 7b 0a 20 20 20  p, b=b->bp){.   
21d60 20 72 63 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64   rc = a->rp->ind
21d70 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65  ex - b->rp->inde
21d80 78 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30  x;.    if( rc==0
21d90 20 29 20 72 63 20 3d 20 61 2d 3e 64 6f 74 20 2d   ) rc = a->dot -
21da0 20 62 2d 3e 64 6f 74 3b 0a 20 20 7d 0a 20 20 69   b->dot;.  }.  i
21db0 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
21dc0 69 66 28 20 61 20 29 20 72 63 20 3d 20 31 3b 0a  if( a ) rc = 1;.
21dd0 20 20 20 20 69 66 28 20 62 20 29 20 72 63 20 3d      if( b ) rc =
21de0 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   -1;.  }.  retur
21df0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68  n rc;.}../* Hash
21e00 20 61 20 73 74 61 74 65 20 2a 2f 0a 50 52 49 56   a state */.PRIV
21e10 41 54 45 20 69 6e 74 20 73 74 61 74 65 68 61 73  ATE int statehas
21e20 68 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  h(struct config 
21e30 2a 61 29 0a 7b 0a 20 20 69 6e 74 20 68 3d 30 3b  *a).{.  int h=0;
21e40 0a 20 20 77 68 69 6c 65 28 20 61 20 29 7b 0a 20  .  while( a ){. 
21e50 20 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61     h = h*571 + a
21e60 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b  ->rp->index*37 +
21e70 20 61 2d 3e 64 6f 74 3b 0a 20 20 20 20 61 20 3d   a->dot;.    a =
21e80 20 61 2d 3e 62 70 3b 0a 20 20 7d 0a 20 20 72 65   a->bp;.  }.  re
21e90 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c  turn h;.}../* Al
21ea0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 74 61  locate a new sta
21eb0 74 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  te structure */.
21ec0 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53 74  struct state *St
21ed0 61 74 65 5f 6e 65 77 28 29 0a 7b 0a 20 20 73 74  ate_new().{.  st
21ee0 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77 73  ruct state *news
21ef0 74 61 74 65 3b 0a 20 20 6e 65 77 73 74 61 74 65  tate;.  newstate
21f00 20 3d 20 28 73 74 72 75 63 74 20 73 74 61 74 65   = (struct state
21f10 20 2a 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a   *)calloc(1, siz
21f20 65 6f 66 28 73 74 72 75 63 74 20 73 74 61 74 65  eof(struct state
21f30 29 20 29 3b 0a 20 20 4d 65 6d 6f 72 79 43 68 65  ) );.  MemoryChe
21f40 63 6b 28 6e 65 77 73 74 61 74 65 29 3b 0a 20 20  ck(newstate);.  
21f50 72 65 74 75 72 6e 20 6e 65 77 73 74 61 74 65 3b  return newstate;
21f60 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  .}../* There is 
21f70 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
21f80 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
21f90 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
21fa0 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20  .** associative 
21fb0 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
21fc0 33 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f  3"..*/.struct s_
21fd0 78 33 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  x3 {.  int size;
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21ff0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
22000 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e  available slots.
22010 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
22020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22030 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77     Must be a pow
22040 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20  er of 2 greater 
22050 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20  than or */.     
22060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22070 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20       /*   equal 
22080 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  to 1 */.  int co
22090 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  unt;            
220a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
220b0 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66  urrently slots f
220c0 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  illed */.  struc
220d0 74 20 73 5f 78 33 6e 6f 64 65 20 2a 74 62 6c 3b  t s_x3node *tbl;
220e0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74    /* The data st
220f0 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73  ored here */.  s
22100 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a  truct s_x3node *
22110 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61  *ht;  /* Hash ta
22120 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20  ble for lookups 
22130 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  */.};../* There 
22140 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
22150 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
22160 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  e for every data
22170 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61   element.** in a
22180 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  n associative ar
22190 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 33 22  ray of type "x3"
221a0 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
221b0 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 7b 0a 20  uct s_x3node {. 
221c0 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 64   struct state *d
221d0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
221e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
221f0 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f  a */.  struct co
22200 6e 66 69 67 20 2a 6b 65 79 3b 20 20 20 20 20 20  nfig *key;      
22210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22220 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72  The key */.  str
22230 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 6e 65  uct s_x3node *ne
22240 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e  xt;   /* Next en
22250 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
22260 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75  e hash */.  stru
22270 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 66 72  ct s_x3node **fr
22280 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  om;  /* Previous
22290 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 33 6e 6f 64   link */.} x3nod
222a0 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  e;../* There is 
222b0 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63  only one instanc
222c0 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20  e of the array, 
222d0 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c  which is the fol
222e0 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63  lowing */.static
222f0 20 73 74 72 75 63 74 20 73 5f 78 33 20 2a 78 33   struct s_x3 *x3
22300 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  a;../* Allocate 
22310 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76  a new associativ
22320 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20  e array */.void 
22330 53 74 61 74 65 5f 69 6e 69 74 28 29 7b 0a 20 20  State_init(){.  
22340 69 66 28 20 78 33 61 20 29 20 72 65 74 75 72 6e  if( x3a ) return
22350 3b 0a 20 20 78 33 61 20 3d 20 28 73 74 72 75 63  ;.  x3a = (struc
22360 74 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f 63 28 20  t s_x3*)malloc( 
22370 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f  sizeof(struct s_
22380 78 33 29 20 29 3b 0a 20 20 69 66 28 20 78 33 61  x3) );.  if( x3a
22390 20 29 7b 0a 20 20 20 20 78 33 61 2d 3e 73 69 7a   ){.    x3a->siz
223a0 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 33 61  e = 128;.    x3a
223b0 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ->count = 0;.   
223c0 20 78 33 61 2d 3e 74 62 6c 20 3d 20 28 78 33 6e   x3a->tbl = (x3n
223d0 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20  ode*)malloc( .  
223e0 20 20 20 20 28 73 69 7a 65 6f 66 28 78 33 6e 6f      (sizeof(x3no
223f0 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e  de) + sizeof(x3n
22400 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a 20 20  ode*))*128 );.  
22410 20 20 69 66 28 20 78 33 61 2d 3e 74 62 6c 3d 3d    if( x3a->tbl==
22420 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
22430 78 33 61 29 3b 0a 20 20 20 20 20 20 78 33 61 20  x3a);.      x3a 
22440 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
22450 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
22460 20 20 20 78 33 61 2d 3e 68 74 20 3d 20 28 78 33     x3a->ht = (x3
22470 6e 6f 64 65 2a 2a 29 26 28 78 33 61 2d 3e 74 62  node**)&(x3a->tb
22480 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66  l[128]);.      f
22490 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69  or(i=0; i<128; i
224a0 2b 2b 29 20 78 33 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x3a->ht[i] =
224b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
224c0 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  /* Insert a new 
224d0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
224e0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54  array.  Return T
224f0 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75  RUE if successfu
22500 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61  l..** Prior data
22510 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
22520 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72  ey is NOT overwr
22530 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 61  itten */.int Sta
22540 74 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74  te_insert(struct
22550 20 73 74 61 74 65 20 2a 64 61 74 61 2c 20 73 74   state *data, st
22560 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
22570 29 0a 7b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70  ).{.  x3node *np
22580 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74  ;.  int h;.  int
22590 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d   ph;..  if( x3a=
225a0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
225b0 20 70 68 20 3d 20 73 74 61 74 65 68 61 73 68 28   ph = statehash(
225c0 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26  key);.  h = ph &
225d0 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x3a->size-1);.
225e0 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68    np = x3a->ht[h
225f0 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
22600 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74 65 63  {.    if( statec
22610 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d  mp(np->key,key)=
22620 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
22630 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
22640 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
22650 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a  ey is found. */.
22660 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65        /* Fail be
22670 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20  cause overwrite 
22680 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a  is not allows. *
22690 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
226a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d  ;.    }.    np =
226b0 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
226c0 20 69 66 28 20 78 33 61 2d 3e 63 6f 75 6e 74 3e   if( x3a->count>
226d0 3d 78 33 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20  =x3a->size ){.  
226e0 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b    /* Need to mak
226f0 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
22700 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69   bigger */.    i
22710 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73  nt i,size;.    s
22720 74 72 75 63 74 20 73 5f 78 33 20 61 72 72 61 79  truct s_x3 array
22730 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65  ;.    array.size
22740 20 3d 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e 73   = size = x3a->s
22750 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79  ize*2;.    array
22760 2e 63 6f 75 6e 74 20 3d 20 78 33 61 2d 3e 63 6f  .count = x3a->co
22770 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74  unt;.    array.t
22780 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d 61  bl = (x3node*)ma
22790 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a  lloc(.      (siz
227a0 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69  eof(x3node) + si
227b0 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 2a 73  zeof(x3node*))*s
227c0 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61  ize );.    if( a
227d0 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65  rray.tbl==0 ) re
227e0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c  turn 0;  /* Fail
227f0 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66   due to malloc f
22800 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72  ailure */.    ar
22810 72 61 79 2e 68 74 20 3d 20 28 78 33 6e 6f 64 65  ray.ht = (x3node
22820 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73  **)&(array.tbl[s
22830 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  ize]);.    for(i
22840 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29  =0; i<size; i++)
22850 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30   array.ht[i] = 0
22860 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
22870 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b  <x3a->count; i++
22880 29 7b 0a 20 20 20 20 20 20 78 33 6e 6f 64 65 20  ){.      x3node 
22890 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a  *oldnp, *newnp;.
228a0 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28        oldnp = &(
228b0 78 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20  x3a->tbl[i]);.  
228c0 20 20 20 20 68 20 3d 20 73 74 61 74 65 68 61 73      h = statehas
228d0 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20  h(oldnp->key) & 
228e0 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  (size-1);.      
228f0 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e  newnp = &(array.
22900 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  tbl[i]);.      i
22910 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29  f( array.ht[h] )
22920 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72   array.ht[h]->fr
22930 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65  om = &(newnp->ne
22940 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  xt);.      newnp
22950 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68  ->next = array.h
22960 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e  t[h];.      newn
22970 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e  p->key = oldnp->
22980 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  key;.      newnp
22990 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e  ->data = oldnp->
229a0 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e  data;.      newn
229b0 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61  p->from = &(arra
229c0 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20  y.ht[h]);.      
229d0 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65  array.ht[h] = ne
229e0 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  wnp;.    }.    f
229f0 72 65 65 28 78 33 61 2d 3e 74 62 6c 29 3b 0a 20  ree(x3a->tbl);. 
22a00 20 20 20 2a 78 33 61 20 3d 20 61 72 72 61 79 3b     *x3a = array;
22a10 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74  .  }.  /* Insert
22a20 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f   the new data */
22a30 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 33 61  .  h = ph & (x3a
22a40 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
22a50 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 78 33 61  = &(x3a->tbl[x3a
22a60 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e  ->count++]);.  n
22a70 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20  p->key = key;.  
22a80 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b  np->data = data;
22a90 0a 20 20 69 66 28 20 78 33 61 2d 3e 68 74 5b 68  .  if( x3a->ht[h
22aa0 5d 20 29 20 78 33 61 2d 3e 68 74 5b 68 5d 2d 3e  ] ) x3a->ht[h]->
22ab0 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78  from = &(np->nex
22ac0 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d  t);.  np->next =
22ad0 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78   x3a->ht[h];.  x
22ae0 33 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a  3a->ht[h] = np;.
22af0 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78    np->from = &(x
22b00 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65  3a->ht[h]);.  re
22b10 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65  turn 1;.}../* Re
22b20 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
22b30 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20  o data assigned 
22b40 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79  to the given key
22b50 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a  .  Return NULL.*
22b60 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79  * if no such key
22b70 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74  . */.struct stat
22b80 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 73 74  e *State_find(st
22b90 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
22ba0 29 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78  ).{.  int h;.  x
22bb0 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  3node *np;..  if
22bc0 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x3a==0 ) retur
22bd0 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 61 74 65  n 0;.  h = state
22be0 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 33 61  hash(key) & (x3a
22bf0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
22c00 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x3a->ht[h];.  
22c10 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
22c20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e 70   if( statecmp(np
22c30 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20  ->key,key)==0 ) 
22c40 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20  break;.    np = 
22c50 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
22c60 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e  return np ? np->
22c70 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  data : 0;.}../* 
22c80 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20  Return an array 
22c90 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  of pointers to a
22ca0 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  ll data in the t
22cb0 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72  able..** The arr
22cc0 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ay is obtained f
22cd0 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74  rom malloc.  Ret
22ce0 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f  urn NULL if memo
22cf0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
22d00 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66   problems, or if
22d10 20 74 68 65 20 61 72 72 61 79 20 69 73 20 65 6d   the array is em
22d20 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  pty. */.struct s
22d30 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61 72 72  tate **State_arr
22d40 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75 63  ayof().{.  struc
22d50 74 20 73 74 61 74 65 20 2a 2a 61 72 72 61 79 3b  t state **array;
22d60 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20  .  int i,size;. 
22d70 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65   if( x3a==0 ) re
22d80 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65 20 3d  turn 0;.  size =
22d90 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61   x3a->count;.  a
22da0 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20 73  rray = (struct s
22db0 74 61 74 65 20 2a 2a 29 6d 61 6c 6c 6f 63 28 20  tate **)malloc( 
22dc0 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74  sizeof(struct st
22dd0 61 74 65 20 2a 29 2a 73 69 7a 65 20 29 3b 0a 20  ate *)*size );. 
22de0 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a 20 20   if( array ){.  
22df0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
22e00 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d  e; i++) array[i]
22e10 20 3d 20 78 33 61 2d 3e 74 62 6c 5b 69 5d 2e 64   = x3a->tbl[i].d
22e20 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ata;.  }.  retur
22e30 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 48  n array;.}../* H
22e40 61 73 68 20 61 20 63 6f 6e 66 69 67 75 72 61 74  ash a configurat
22e50 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 69  ion */.PRIVATE i
22e60 6e 74 20 63 6f 6e 66 69 67 68 61 73 68 28 73 74  nt confighash(st
22e70 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 29 0a  ruct config *a).
22e80 7b 0a 20 20 69 6e 74 20 68 3d 30 3b 0a 20 20 68  {.  int h=0;.  h
22e90 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70   = h*571 + a->rp
22ea0 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e  ->index*37 + a->
22eb0 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b  dot;.  return h;
22ec0 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  .}../* There is 
22ed0 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
22ee0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
22ef0 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
22f00 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20  .** associative 
22f10 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
22f20 34 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f  4"..*/.struct s_
22f30 78 34 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  x4 {.  int size;
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22f50 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
22f60 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e  available slots.
22f70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22f90 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77     Must be a pow
22fa0 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20  er of 2 greater 
22fb0 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20  than or */.     
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20       /*   equal 
22fe0 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  to 1 */.  int co
22ff0 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  unt;            
23000 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
23010 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66  urrently slots f
23020 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  illed */.  struc
23030 74 20 73 5f 78 34 6e 6f 64 65 20 2a 74 62 6c 3b  t s_x4node *tbl;
23040 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74    /* The data st
23050 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73  ored here */.  s
23060 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a  truct s_x4node *
23070 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61  *ht;  /* Hash ta
23080 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20  ble for lookups 
23090 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  */.};../* There 
230a0 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
230b0 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
230c0 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  e for every data
230d0 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61   element.** in a
230e0 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  n associative ar
230f0 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 34 22  ray of type "x4"
23100 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
23110 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 7b 0a 20  uct s_x4node {. 
23120 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
23130 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  data;           
23140 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
23150 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ta */.  struct s
23160 5f 78 34 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20  _x4node *next;  
23170 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77   /* Next entry w
23180 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73  ith the same has
23190 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  h */.  struct s_
231a0 78 34 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20  x4node **from;  
231b0 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b  /* Previous link
231c0 20 2a 2f 0a 7d 20 78 34 6e 6f 64 65 3b 0a 0a 2f   */.} x4node;../
231d0 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  * There is only 
231e0 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
231f0 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68  the array, which
23200 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   is the followin
23210 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  g */.static stru
23220 63 74 20 73 5f 78 34 20 2a 78 34 61 3b 0a 0a 2f  ct s_x4 *x4a;../
23230 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
23240 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
23250 61 79 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  ay */.void Confi
23260 67 74 61 62 6c 65 5f 69 6e 69 74 28 29 7b 0a 20  gtable_init(){. 
23270 20 69 66 28 20 78 34 61 20 29 20 72 65 74 75 72   if( x4a ) retur
23280 6e 3b 0a 20 20 78 34 61 20 3d 20 28 73 74 72 75  n;.  x4a = (stru
23290 63 74 20 73 5f 78 34 2a 29 6d 61 6c 6c 6f 63 28  ct s_x4*)malloc(
232a0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
232b0 5f 78 34 29 20 29 3b 0a 20 20 69 66 28 20 78 34  _x4) );.  if( x4
232c0 61 20 29 7b 0a 20 20 20 20 78 34 61 2d 3e 73 69  a ){.    x4a->si
232d0 7a 65 20 3d 20 36 34 3b 0a 20 20 20 20 78 34 61  ze = 64;.    x4a
232e0 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ->count = 0;.   
232f0 20 78 34 61 2d 3e 74 62 6c 20 3d 20 28 78 34 6e   x4a->tbl = (x4n
23300 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20  ode*)malloc( .  
23310 20 20 20 20 28 73 69 7a 65 6f 66 28 78 34 6e 6f      (sizeof(x4no
23320 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e  de) + sizeof(x4n
23330 6f 64 65 2a 29 29 2a 36 34 20 29 3b 0a 20 20 20  ode*))*64 );.   
23340 20 69 66 28 20 78 34 61 2d 3e 74 62 6c 3d 3d 30   if( x4a->tbl==0
23350 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78   ){.      free(x
23360 34 61 29 3b 0a 20 20 20 20 20 20 78 34 61 20 3d  4a);.      x4a =
23370 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
23380 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
23390 20 20 78 34 61 2d 3e 68 74 20 3d 20 28 78 34 6e    x4a->ht = (x4n
233a0 6f 64 65 2a 2a 29 26 28 78 34 61 2d 3e 74 62 6c  ode**)&(x4a->tbl
233b0 5b 36 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  [64]);.      for
233c0 28 69 3d 30 3b 20 69 3c 36 34 3b 20 69 2b 2b 29  (i=0; i<64; i++)
233d0 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b   x4a->ht[i] = 0;
233e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20  .    }.  }.}./* 
233f0 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
23400 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72  ord into the arr
23410 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ay.  Return TRUE
23420 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
23430 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69  ** Prior data wi
23440 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
23450 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74  is NOT overwritt
23460 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69 67  en */.int Config
23470 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 73 74 72  table_insert(str
23480 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61  uct config *data
23490 29 0a 7b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70  ).{.  x4node *np
234a0 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74  ;.  int h;.  int
234b0 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d   ph;..  if( x4a=
234c0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
234d0 20 70 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68   ph = confighash
234e0 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68  (data);.  h = ph
234f0 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29   & (x4a->size-1)
23500 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74  ;.  np = x4a->ht
23510 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
23520 20 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66   ){.    if( Conf
23530 69 67 63 6d 70 28 28 63 6f 6e 73 74 20 63 68 61  igcmp((const cha
23540 72 20 2a 29 20 6e 70 2d 3e 64 61 74 61 2c 28 63  r *) np->data,(c
23550 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 64 61 74  onst char *) dat
23560 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  a)==0 ){.      /
23570 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  * An existing en
23580 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
23590 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20  e key is found. 
235a0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  */.      /* Fail
235b0 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69   because overwri
235c0 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73  te is not allows
235d0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
235e0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 0;.    }.    n
235f0 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
23600 7d 0a 20 20 69 66 28 20 78 34 61 2d 3e 63 6f 75  }.  if( x4a->cou
23610 6e 74 3e 3d 78 34 61 2d 3e 73 69 7a 65 20 29 7b  nt>=x4a->size ){
23620 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
23630 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
23640 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20  ble bigger */.  
23650 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20    int i,size;.  
23660 20 20 73 74 72 75 63 74 20 73 5f 78 34 20 61 72    struct s_x4 ar
23670 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73  ray;.    array.s
23680 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 34 61  ize = size = x4a
23690 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72  ->size*2;.    ar
236a0 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 34 61 2d  ray.count = x4a-
236b0 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61  >count;.    arra
236c0 79 2e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a  y.tbl = (x4node*
236d0 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28  )malloc(.      (
236e0 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b  sizeof(x4node) +
236f0 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29   sizeof(x4node*)
23700 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66  )*size );.    if
23710 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29  ( array.tbl==0 )
23720 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46   return 0;  /* F
23730 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f  ail due to mallo
23740 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20  c failure */.   
23750 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 34 6e   array.ht = (x4n
23760 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62  ode**)&(array.tb
23770 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f  l[size]);.    fo
23780 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69  r(i=0; i<size; i
23790 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20  ++) array.ht[i] 
237a0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
237b0 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20  ; i<x4a->count; 
237c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 34 6e 6f  i++){.      x4no
237d0 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e  de *oldnp, *newn
237e0 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d  p;.      oldnp =
237f0 20 26 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 29 3b   &(x4a->tbl[i]);
23800 0a 20 20 20 20 20 20 68 20 3d 20 63 6f 6e 66 69  .      h = confi
23810 67 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74  ghash(oldnp->dat
23820 61 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20  a) & (size-1);. 
23830 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61       newnp = &(a
23840 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20  rray.tbl[i]);.  
23850 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74      if( array.ht
23860 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68  [h] ) array.ht[h
23870 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e  ]->from = &(newn
23880 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20  p->next);.      
23890 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72  newnp->next = ar
238a0 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20  ray.ht[h];.     
238b0 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f   newnp->data = o
238c0 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20  ldnp->data;.    
238d0 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20    newnp->from = 
238e0 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a  &(array.ht[h]);.
238f0 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68        array.ht[h
23900 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d  ] = newnp;.    }
23910 0a 20 20 20 20 66 72 65 65 28 78 34 61 2d 3e 74  .    free(x4a->t
23920 62 6c 29 3b 0a 20 20 20 20 2a 78 34 61 20 3d 20  bl);.    *x4a = 
23930 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20  array;.  }.  /* 
23940 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64  Insert the new d
23950 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20  ata */.  h = ph 
23960 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x4a->size-1);
23970 0a 20 20 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74  .  np = &(x4a->t
23980 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74 2b 2b 5d  bl[x4a->count++]
23990 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20  );.  np->data = 
239a0 64 61 74 61 3b 0a 20 20 69 66 28 20 78 34 61 2d  data;.  if( x4a-
239b0 3e 68 74 5b 68 5d 20 29 20 78 34 61 2d 3e 68 74  >ht[h] ) x4a->ht
239c0 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70  [h]->from = &(np
239d0 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e  ->next);.  np->n
239e0 65 78 74 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d  ext = x4a->ht[h]
239f0 3b 0a 20 20 78 34 61 2d 3e 68 74 5b 68 5d 20 3d  ;.  x4a->ht[h] =
23a00 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20   np;.  np->from 
23a10 3d 20 26 28 78 34 61 2d 3e 68 74 5b 68 5d 29 3b  = &(x4a->ht[h]);
23a20 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
23a30 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
23a40 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69  ter to data assi
23a50 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65  gned to the give
23a60 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e  n key.  Return N
23a70 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63  ULL.** if no suc
23a80 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74  h key. */.struct
23a90 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74   config *Configt
23aa0 61 62 6c 65 5f 66 69 6e 64 28 73 74 72 75 63 74  able_find(struct
23ab0 20 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a   config *key).{.
23ac0 20 20 69 6e 74 20 68 3b 0a 20 20 78 34 6e 6f 64    int h;.  x4nod
23ad0 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 34  e *np;..  if( x4
23ae0 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
23af0 0a 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73  .  h = confighas
23b00 68 28 6b 65 79 29 20 26 20 28 78 34 61 2d 3e 73  h(key) & (x4a->s
23b10 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
23b20 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  4a->ht[h];.  whi
23b30 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
23b40 28 20 43 6f 6e 66 69 67 63 6d 70 28 28 63 6f 6e  ( Configcmp((con
23b50 73 74 20 63 68 61 72 20 2a 29 20 6e 70 2d 3e 64  st char *) np->d
23b60 61 74 61 2c 28 63 6f 6e 73 74 20 63 68 61 72 20  ata,(const char 
23b70 2a 29 20 6b 65 79 29 3d 3d 30 20 29 20 62 72 65  *) key)==0 ) bre
23b80 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d  ak;.    np = np-
23b90 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  >next;.  }.  ret
23ba0 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74  urn np ? np->dat
23bb0 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 6d  a : 0;.}../* Rem
23bc0 6f 76 65 20 61 6c 6c 20 64 61 74 61 20 66 72 6f  ove all data fro
23bd0 6d 20 74 68 65 20 74 61 62 6c 65 2e 20 20 50 61  m the table.  Pa
23be0 73 73 20 65 61 63 68 20 64 61 74 61 20 74 6f 20  ss each data to 
23bf0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 22 66 22  the function "f"
23c00 0a 2a 2a 20 61 73 20 69 74 20 69 73 20 72 65 6d  .** as it is rem
23c10 6f 76 65 64 2e 20 20 28 22 66 22 20 6d 61 79 20  oved.  ("f" may 
23c20 62 65 20 6e 75 6c 6c 20 74 6f 20 61 76 6f 69 64  be null to avoid
23c30 20 74 68 69 73 20 73 74 65 70 2e 29 20 2a 2f 0a   this step.) */.
23c40 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65  void Configtable
23c50 5f 63 6c 65 61 72 28 69 6e 74 28 2a 66 29 28 73  _clear(int(*f)(s
23c60 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 29  truct config *))
23c70 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  .{.  int i;.  if
23c80 28 20 78 34 61 3d 3d 30 20 7c 7c 20 78 34 61 2d  ( x4a==0 || x4a-
23c90 3e 63 6f 75 6e 74 3d 3d 30 20 29 20 72 65 74 75  >count==0 ) retu
23ca0 72 6e 3b 0a 20 20 69 66 28 20 66 20 29 20 66 6f  rn;.  if( f ) fo
23cb0 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f  r(i=0; i<x4a->co
23cc0 75 6e 74 3b 20 69 2b 2b 29 20 28 2a 66 29 28 78  unt; i++) (*f)(x
23cd0 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 29  4a->tbl[i].data)
23ce0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78  ;.  for(i=0; i<x
23cf0 34 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b 29 20 78  4a->size; i++) x
23d00 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  4a->ht[i] = 0;. 
23d10 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b   x4a->count = 0;
23d20 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a           .  return;.}.