/ Hex Artifact Content
Login

Artifact bfd036ab9309c7f34e1357d9a065ad137814e741:


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 76 61 72 61 72 67 73 2e 68  clude <varargs.h
0150: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69  >.#include <stri
0160: 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ng.h>.#include <
0170: 63 74 79 70 65 2e 68 3e 0a 0a 65 78 74 65 72 6e  ctype.h>..extern
0180: 20 76 6f 69 64 20 71 73 6f 72 74 28 29 3b 0a 65   void qsort();.e
0190: 78 74 65 72 6e 20 64 6f 75 62 6c 65 20 73 74 72  xtern double str
01a0: 74 6f 64 28 29 3b 0a 65 78 74 65 72 6e 20 6c 6f  tod();.extern lo
01b0: 6e 67 20 73 74 72 74 6f 6c 28 29 3b 0a 65 78 74  ng strtol();.ext
01c0: 65 72 6e 20 76 6f 69 64 20 66 72 65 65 28 29 3b  ern void free();
01d0: 0a 65 78 74 65 72 6e 20 69 6e 74 20 61 63 63 65  .extern int acce
01e0: 73 73 28 29 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ss();.extern int
01f0: 20 61 74 6f 69 28 29 3b 0a 0a 23 69 66 6e 64 65   atoi();..#ifnde
0200: 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23 20 20 20  f __WIN32__.#   
0210: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
0220: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
0230: 4e 33 32 29 0a 23 09 64 65 66 69 6e 65 20 5f 5f  N32).#.define __
0240: 57 49 4e 33 32 5f 5f 0a 23 20 20 20 65 6e 64 69  WIN32__.#   endi
0250: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65  f.#endif../* #de
0260: 66 69 6e 65 20 50 52 49 56 41 54 45 20 73 74 61  fine PRIVATE sta
0270: 74 69 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  tic */.#define P
0280: 52 49 56 41 54 45 0a 0a 23 69 66 64 65 66 20 54  RIVATE..#ifdef T
0290: 45 53 54 0a 23 64 65 66 69 6e 65 20 4d 41 58 52  EST.#define MAXR
02a0: 48 53 20 35 20 20 20 20 20 20 20 2f 2a 20 53 65  HS 5       /* Se
02b0: 74 20 6c 6f 77 20 74 6f 20 65 78 65 72 63 69 73  t low to exercis
02c0: 65 20 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65  e exception code
02d0: 20 2a 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e   */.#else.#defin
02e0: 65 20 4d 41 58 52 48 53 20 31 30 30 30 0a 23 65  e MAXRHS 1000.#e
02f0: 6e 64 69 66 0a 0a 63 68 61 72 20 2a 6d 73 6f 72  ndif..char *msor
0300: 74 28 29 3b 0a 65 78 74 65 72 6e 20 76 6f 69 64  t();.extern void
0310: 20 2a 6d 61 6c 6c 6f 63 28 29 3b 0a 0a 2f 2a 2a   *malloc();../**
0320: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
0330: 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e 68 22 20  file "action.h" 
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74 20 61 63  *****/.struct ac
0370: 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77  tion *Action_new
0380: 28 29 3b 0a 73 74 72 75 63 74 20 61 63 74 69 6f  ();.struct actio
0390: 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 29  n *Action_sort()
03a0: 3b 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61 64  ;.void Action_ad
03b0: 64 28 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  d();../*********
03c0: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
03d0: 61 73 73 65 72 74 2e 68 22 20 2a 2a 2a 2a 2a 2a  assert.h" ******
03e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0400: 76 6f 69 64 20 6d 79 61 73 73 65 72 74 28 29 3b  void myassert();
0410: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
0420: 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  #  define assert
0430: 28 58 29 20 69 66 28 21 28 58 29 29 6d 79 61 73  (X) if(!(X))myas
0440: 73 65 72 74 28 5f 5f 46 49 4c 45 5f 5f 2c 5f 5f  sert(__FILE__,__
0450: 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73 65 0a 23 20  LINE__).#else.# 
0460: 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 28 58   define assert(X
0470: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 2a 2a 2a 2a  ).#endif../*****
0480: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
0490: 69 6c 65 20 22 62 75 69 6c 64 2e 68 22 20 2a 2a  ile "build.h" **
04a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
04b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
04c0: 2a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c  **/.void FindRul
04d0: 65 50 72 65 63 65 64 65 6e 63 65 73 28 29 3b 0a  ePrecedences();.
04e0: 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53 65  void FindFirstSe
04f0: 74 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 53  ts();.void FindS
0500: 74 61 74 65 73 28 29 3b 0a 76 6f 69 64 20 46 69  tates();.void Fi
0510: 6e 64 4c 69 6e 6b 73 28 29 3b 0a 76 6f 69 64 20  ndLinks();.void 
0520: 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 29  FindFollowSets()
0530: 3b 0a 76 6f 69 64 20 46 69 6e 64 41 63 74 69 6f  ;.void FindActio
0540: 6e 73 28 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ns();../********
0550: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
0560: 22 63 6f 6e 66 69 67 6c 69 73 74 2e 68 22 20 2a  "configlist.h" *
0570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0590: 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  /.void Configlis
05a0: 74 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a  t_init(/* void *
05b0: 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  /);.struct confi
05c0: 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  g *Configlist_ad
05d0: 64 28 2f 2a 20 73 74 72 75 63 74 20 72 75 6c 65  d(/* struct rule
05e0: 20 2a 2c 20 69 6e 74 20 2a 2f 29 3b 0a 73 74 72   *, int */);.str
05f0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
0600: 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28  iglist_addbasis(
0610: 2f 2a 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  /* struct rule *
0620: 2c 20 69 6e 74 20 2a 2f 29 3b 0a 76 6f 69 64 20  , int */);.void 
0630: 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75  Configlist_closu
0640: 72 65 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a  re(/* void */);.
0650: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
0660: 73 6f 72 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29  sort(/* void */)
0670: 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  ;.void Configlis
0680: 74 5f 73 6f 72 74 62 61 73 69 73 28 2f 2a 20 76  t_sortbasis(/* v
0690: 6f 69 64 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20  oid */);.struct 
06a0: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
06b0: 73 74 5f 72 65 74 75 72 6e 28 2f 2a 20 76 6f 69  st_return(/* voi
06c0: 64 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f  d */);.struct co
06d0: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
06e0: 5f 62 61 73 69 73 28 2f 2a 20 76 6f 69 64 20 2a  _basis(/* void *
06f0: 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  /);.void Configl
0700: 69 73 74 5f 65 61 74 28 2f 2a 20 73 74 72 75 63  ist_eat(/* struc
0710: 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a  t config * */);.
0720: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
0730: 72 65 73 65 74 28 2f 2a 20 76 6f 69 64 20 2a 2f  reset(/* void */
0740: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  );../********* F
0750: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 65 72  rom the file "er
0760: 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ror.h" *********
0770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0790: 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 20 2f  void ErrorMsg( /
07a0: 2a 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20 63  * char *, int, c
07b0: 68 61 72 20 2a 2c 20 2e 2e 2e 20 2a 2f 20 29 3b  har *, ... */ );
07c0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ../****** From t
07d0: 68 65 20 66 69 6c 65 20 22 6f 70 74 69 6f 6e 2e  he file "option.
07e0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
07f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73  *************/.s
0810: 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20  truct s_options 
0820: 7b 0a 20 20 65 6e 75 6d 20 7b 20 4f 50 54 5f 46  {.  enum { OPT_F
0830: 4c 41 47 3d 31 2c 20 20 4f 50 54 5f 49 4e 54 2c  LAG=1,  OPT_INT,
0840: 20 20 4f 50 54 5f 44 42 4c 2c 20 20 4f 50 54 5f    OPT_DBL,  OPT_
0850: 53 54 52 2c 0a 20 20 20 20 20 20 20 20 20 4f 50  STR,.         OP
0860: 54 5f 46 46 4c 41 47 2c 20 4f 50 54 5f 46 49 4e  T_FFLAG, OPT_FIN
0870: 54 2c 20 4f 50 54 5f 46 44 42 4c 2c 20 4f 50 54  T, OPT_FDBL, OPT
0880: 5f 46 53 54 52 7d 20 74 79 70 65 3b 0a 20 20 63  _FSTR} type;.  c
0890: 68 61 72 20 2a 6c 61 62 65 6c 3b 0a 20 20 63 68  har *label;.  ch
08a0: 61 72 20 2a 61 72 67 3b 0a 20 20 63 68 61 72 20  ar *arg;.  char 
08b0: 2a 6d 65 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e 74  *message;.};.int
08c0: 20 20 20 20 4f 70 74 49 6e 69 74 28 2f 2a 20 63      OptInit(/* c
08d0: 68 61 72 2a 2a 2c 73 74 72 75 63 74 20 73 5f 6f  har**,struct s_o
08e0: 70 74 69 6f 6e 73 2a 2c 46 49 4c 45 2a 20 2a 2f  ptions*,FILE* */
08f0: 29 3b 0a 69 6e 74 20 20 20 20 4f 70 74 4e 41 72  );.int    OptNAr
0900: 67 73 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a  gs(/* void */);.
0910: 63 68 61 72 20 20 2a 4f 70 74 41 72 67 28 2f 2a  char  *OptArg(/*
0920: 20 69 6e 74 20 2a 2f 29 3b 0a 76 6f 69 64 20 20   int */);.void  
0930: 20 4f 70 74 45 72 72 28 2f 2a 20 69 6e 74 20 2a   OptErr(/* int *
0940: 2f 29 3b 0a 76 6f 69 64 20 20 20 4f 70 74 50 72  /);.void   OptPr
0950: 69 6e 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b  int(/* void */);
0960: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  ../******** From
0970: 20 74 68 65 20 66 69 6c 65 20 22 70 61 72 73 65   the file "parse
0980: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76  *************/.v
09b0: 6f 69 64 20 50 61 72 73 65 28 2f 2a 20 73 74 72  oid Parse(/* str
09c0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 20  uct lemon *lemp 
09d0: 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  */);../*********
09e0: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
09f0: 70 6c 69 6e 6b 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  plink.h" *******
0a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a20: 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  /.struct plink *
0a30: 50 6c 69 6e 6b 5f 6e 65 77 28 2f 2a 20 76 6f 69  Plink_new(/* voi
0a40: 64 20 2a 2f 29 3b 0a 76 6f 69 64 20 50 6c 69 6e  d */);.void Plin
0a50: 6b 5f 61 64 64 28 2f 2a 20 73 74 72 75 63 74 20  k_add(/* struct 
0a60: 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63 74  plink **, struct
0a70: 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 76   config * */);.v
0a80: 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 2f  oid Plink_copy(/
0a90: 2a 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  * struct plink *
0aa0: 2a 2c 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  *, struct plink 
0ab0: 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 50 6c 69 6e  * */);.void Plin
0ac0: 6b 5f 64 65 6c 65 74 65 28 2f 2a 20 73 74 72 75  k_delete(/* stru
0ad0: 63 74 20 70 6c 69 6e 6b 20 2a 20 2a 2f 29 3b 0a  ct plink * */);.
0ae0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ./********** Fro
0af0: 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65 70 6f  m the file "repo
0b00: 72 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rt.h" **********
0b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69  ***********/.voi
0b30: 64 20 52 65 70 72 69 6e 74 28 2f 2a 20 73 74 72  d Reprint(/* str
0b40: 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b  uct lemon * */);
0b50: 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70  .void ReportOutp
0b60: 75 74 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d  ut(/* struct lem
0b70: 6f 6e 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 52  on * */);.void R
0b80: 65 70 6f 72 74 54 61 62 6c 65 28 2f 2a 20 73 74  eportTable(/* st
0b90: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29  ruct lemon * */)
0ba0: 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 48 65 61  ;.void ReportHea
0bb0: 64 65 72 28 2f 2a 20 73 74 72 75 63 74 20 6c 65  der(/* struct le
0bc0: 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20  mon * */);.void 
0bd0: 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28 2f  CompressTables(/
0be0: 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  * struct lemon *
0bf0: 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   */);../********
0c00: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
0c10: 20 22 73 65 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a   "set.h" *******
0c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c40: 2a 2f 0a 76 6f 69 64 20 20 53 65 74 53 69 7a 65  */.void  SetSize
0c50: 28 2f 2a 20 69 6e 74 20 4e 20 2a 2f 29 3b 20 20  (/* int N */);  
0c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
0c70: 6c 20 73 65 74 73 20 77 69 6c 6c 20 62 65 20 6f  l sets will be o
0c80: 66 20 73 69 7a 65 20 4e 20 2a 2f 0a 63 68 61 72  f size N */.char
0c90: 20 2a 53 65 74 4e 65 77 28 2f 2a 20 76 6f 69 64   *SetNew(/* void
0ca0: 20 2a 2f 29 3b 20 20 20 20 20 20 20 20 20 20 20   */);           
0cb0: 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 65 74      /* A new set
0cc0: 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20 30 2e 2e   for element 0..
0cd0: 4e 20 2a 2f 0a 76 6f 69 64 20 20 53 65 74 46 72  N */.void  SetFr
0ce0: 65 65 28 2f 2a 20 63 68 61 72 2a 20 2a 2f 29 3b  ee(/* char* */);
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0d00: 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65 74  Deallocate a set
0d10: 20 2a 2f 0a 0a 69 6e 74 20 53 65 74 41 64 64 28   */..int SetAdd(
0d20: 2f 2a 20 63 68 61 72 2a 2c 69 6e 74 20 2a 2f 29  /* char*,int */)
0d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0d40: 41 64 64 20 65 6c 65 6d 65 6e 74 20 74 6f 20 61  Add element to a
0d50: 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65 74 55   set */.int SetU
0d60: 6e 69 6f 6e 28 2f 2a 20 63 68 61 72 20 2a 41 2c  nion(/* char *A,
0d70: 63 68 61 72 20 2a 42 20 2a 2f 29 3b 20 20 20 20  char *B */);    
0d80: 2f 2a 20 41 20 3c 2d 20 41 20 55 20 42 2c 20 74  /* A <- A U B, t
0d90: 68 72 75 20 65 6c 65 6d 65 6e 74 20 4e 20 2a 2f  hru element N */
0da0: 0a 0a 23 64 65 66 69 6e 65 20 53 65 74 46 69 6e  ..#define SetFin
0db0: 64 28 58 2c 59 29 20 28 58 5b 59 5d 29 20 20 20  d(X,Y) (X[Y])   
0dc0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 59      /* True if Y
0dd0: 20 69 73 20 69 6e 20 73 65 74 20 58 20 2a 2f 0a   is in set X */.
0de0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ./********** Fro
0df0: 6d 20 74 68 65 20 66 69 6c 65 20 22 73 74 72 75  m the file "stru
0e00: 63 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ct.h" **********
0e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
0e30: 2a 2a 20 50 72 69 6e 63 69 70 61 6c 20 64 61 74  ** Principal dat
0e40: 61 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  a structures for
0e50: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
0e60: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
0e70: 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 46  .typedef enum {F
0e80: 41 4c 53 45 3d 30 2c 20 54 52 55 45 7d 20 42 6f  ALSE=0, TRUE} Bo
0e90: 6f 6c 65 61 6e 3b 0a 0a 2f 2a 20 53 79 6d 62 6f  olean;../* Symbo
0ea0: 6c 73 20 28 74 65 72 6d 69 6e 61 6c 73 20 61 6e  ls (terminals an
0eb0: 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 29 20  d nonterminals) 
0ec0: 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 61  of the grammar a
0ed0: 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  re stored.** in 
0ee0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a  the following: *
0ef0: 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
0f00: 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20  {.  char *name; 
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0f20: 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 6d 62  Name of the symb
0f30: 6f 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65  ol */.  int inde
0f40: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
0f50: 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72   /* Index number
0f60: 20 66 6f 72 20 74 68 69 73 20 73 79 6d 62 6f 6c   for this symbol
0f70: 20 2a 2f 0a 20 20 65 6e 75 6d 20 7b 0a 20 20 20   */.  enum {.   
0f80: 20 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 20 20 4e   TERMINAL,.    N
0f90: 4f 4e 54 45 52 4d 49 4e 41 4c 0a 20 20 7d 20 74  ONTERMINAL.  } t
0fa0: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
0fb0: 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 73        /* Symbols
0fc0: 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20   are all either 
0fd0: 54 45 52 4d 49 4e 41 4c 53 20 6f 72 20 4e 54 73  TERMINALS or NTs
0fe0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
0ff0: 65 20 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f  e *rule;       /
1000: 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * Linked list of
1010: 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73 20 28   rules of this (
1020: 69 66 20 61 6e 20 4e 54 29 20 2a 2f 0a 20 20 69  if an NT) */.  i
1030: 6e 74 20 70 72 65 63 3b 20 20 20 20 20 20 20 20  nt prec;        
1040: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63 65          /* Prece
1050: 64 65 6e 63 65 20 69 66 20 64 65 66 69 6e 65 64  dence if defined
1060: 20 28 2d 31 20 6f 74 68 65 72 77 69 73 65 29 20   (-1 otherwise) 
1070: 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f  */.  enum e_asso
1080: 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c 0a 20 20  c {.    LEFT,.  
1090: 20 20 52 49 47 48 54 2c 0a 20 20 20 20 4e 4f 4e    RIGHT,.    NON
10a0: 45 2c 0a 20 20 20 20 55 4e 4b 0a 20 20 7d 20 61  E,.    UNK.  } a
10b0: 73 73 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20  ssoc;           
10c0: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
10d0: 74 69 76 69 74 79 20 69 66 20 70 72 65 64 65 63  tivity if predec
10e0: 65 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64 20  ence is defined 
10f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73 74  */.  char *first
1100: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  set;          /*
1110: 20 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20 61   First-set for a
1120: 6c 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73  ll rules of this
1130: 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f 6f   symbol */.  Boo
1140: 6c 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20 20  lean lambda;    
1150: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1160: 20 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e 65   NT and can gene
1170: 72 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73 74  rate an empty st
1180: 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ring */.  char *
1190: 64 65 73 74 72 75 63 74 6f 72 3b 20 20 20 20 20  destructor;     
11a0: 20 20 20 2f 2a 20 43 6f 64 65 20 77 68 69 63 68     /* Code which
11b0: 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 65 76   executes whenev
11c0: 65 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 69  er this symbol i
11d0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
11f0: 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  popped from the 
1200: 73 74 61 63 6b 20 64 75 72 69 6e 67 20 65 72 72  stack during err
1210: 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  or processing */
1220: 0a 20 20 69 6e 74 20 64 65 73 74 72 75 63 74 6f  .  int destructo
1230: 72 6c 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  rln;        /* L
1240: 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 65  ine number of de
1250: 73 74 72 75 63 74 6f 72 20 63 6f 64 65 20 2a 2f  structor code */
1260: 0a 20 20 63 68 61 72 20 2a 64 61 74 61 74 79 70  .  char *datatyp
1270: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
1280: 68 65 20 64 61 74 61 20 74 79 70 65 20 6f 66 20  he data type of 
1290: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c 64  information held
12a0: 20 62 79 20 74 68 69 73 0a 20 20 20 20 20 20 20   by this.       
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f      ** object. O
12d0: 6e 6c 79 20 75 73 65 64 20 69 66 20 74 79 70 65  nly used if type
12e0: 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f  ==NONTERMINAL */
12f0: 0a 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20 20  .  int dtnum;   
1300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1310: 68 65 20 64 61 74 61 20 74 79 70 65 20 6e 75 6d  he data type num
1320: 62 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61 72  ber.  In the par
1330: 73 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a 20  ser, the value. 
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61            ** sta
1360: 63 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20 20  ck is a union.  
1370: 54 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65 6e  The .yy%d elemen
1380: 74 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20 20  t of this.      
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 20 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20 69 73       ** union is
13b0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 64 61 74   the correct dat
13c0: 61 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20  a type for this 
13d0: 6f 62 6a 65 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  object */.};../*
13e0: 20 45 61 63 68 20 70 72 6f 64 75 63 74 69 6f 6e   Each production
13f0: 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61   rule in the gra
1400: 6d 6d 61 72 20 69 73 20 73 74 6f 72 65 64 20 69  mmar is stored i
1410: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  n the following.
1420: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a  ** structure.  *
1430: 2f 0a 73 74 72 75 63 74 20 72 75 6c 65 20 7b 0a  /.struct rule {.
1440: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1450: 2a 6c 68 73 3b 20 20 20 20 20 20 2f 2a 20 4c 65  *lhs;      /* Le
1460: 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft-hand side of 
1470: 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 63 68  the rule */.  ch
1480: 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20  ar *lhsalias;   
1490: 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20         /* Alias 
14a0: 66 6f 72 20 74 68 65 20 4c 48 53 20 28 4e 55 4c  for the LHS (NUL
14b0: 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20 20  L if none) */.  
14c0: 69 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20 20 20  int ruleline;   
14d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
14e0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
14f0: 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 72  rule */.  int nr
1500: 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hs;             
1510: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1520: 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  RHS symbols */. 
1530: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1540: 2a 72 68 73 3b 20 20 20 20 20 2f 2a 20 54 68 65  *rhs;     /* The
1550: 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a   RHS symbols */.
1560: 20 20 63 68 61 72 20 2a 2a 72 68 73 61 6c 69 61    char **rhsalia
1570: 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  s;         /* An
1580: 20 61 6c 69 61 73 20 66 6f 72 20 65 61 63 68 20   alias for each 
1590: 52 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55 4c 4c  RHS symbol (NULL
15a0: 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69   if none) */.  i
15b0: 6e 74 20 6c 69 6e 65 3b 20 20 20 20 20 20 20 20  nt line;        
15c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
15d0: 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63 68 20  number at which 
15e0: 63 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f 0a 20  code begins */. 
15f0: 20 63 68 61 72 20 2a 63 6f 64 65 3b 20 20 20 20   char *code;    
1600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1610: 20 63 6f 64 65 20 65 78 65 63 75 74 65 64 20 77   code executed w
1620: 68 65 6e 20 74 68 69 73 20 72 75 6c 65 20 69 73  hen this rule is
1630: 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20 73 74   reduced */.  st
1640: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 70 72 65  ruct symbol *pre
1650: 63 73 79 6d 3b 20 20 2f 2a 20 50 72 65 63 65 64  csym;  /* Preced
1660: 65 6e 63 65 20 73 79 6d 62 6f 6c 20 66 6f 72 20  ence symbol for 
1670: 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 69  this rule */.  i
1680: 6e 74 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20  nt index;       
1690: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
16a0: 64 65 78 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  dex number for t
16b0: 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 42 6f  his rule */.  Bo
16c0: 6f 6c 65 61 6e 20 63 61 6e 52 65 64 75 63 65 3b  olean canReduce;
16d0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
16e0: 66 20 74 68 69 73 20 72 75 6c 65 20 69 73 20 65  f this rule is e
16f0: 76 65 72 20 72 65 64 75 63 65 64 20 2a 2f 0a 20  ver reduced */. 
1700: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65   struct rule *ne
1710: 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e 65 78  xtlhs;    /* Nex
1720: 74 20 72 75 6c 65 20 77 69 74 68 20 74 68 65 20  t rule with the 
1730: 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20 73 74  same LHS */.  st
1740: 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78 74 3b  ruct rule *next;
1750: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 72         /* Next r
1760: 75 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f 62 61  ule in the globa
1770: 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  l list */.};../*
1780: 20 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   A configuration
1790: 20 69 73 20 61 20 70 72 6f 64 75 63 74 69 6f 6e   is a production
17a0: 20 72 75 6c 65 20 6f 66 20 74 68 65 20 67 72 61   rule of the gra
17b0: 6d 6d 61 72 20 74 6f 67 65 74 68 65 72 20 77 69  mmar together wi
17c0: 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28 64 6f  th.** a mark (do
17d0: 74 29 20 73 68 6f 77 69 6e 67 20 68 6f 77 20 6d  t) showing how m
17e0: 75 63 68 20 6f 66 20 74 68 61 74 20 72 75 6c 65  uch of that rule
17f0: 20 68 61 73 20 62 65 65 6e 20 70 72 6f 63 65 73   has been proces
1800: 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a 20 43  sed so far..** C
1810: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61 6c  onfigurations al
1820: 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66 6f 6c  so contain a fol
1830: 6c 6f 77 2d 73 65 74 20 77 68 69 63 68 20 69 73  low-set which is
1840: 20 61 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 69   a list of termi
1850: 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73 20 77  nal.** symbols w
1860: 68 69 63 68 20 61 72 65 20 61 6c 6c 6f 77 65 64  hich are allowed
1870: 20 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   to immediately 
1880: 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64 20 6f  follow the end o
1890: 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a 20 45  f the rule..** E
18a0: 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69  very configurati
18b0: 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61  on is recorded a
18c0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
18d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20   the following: 
18e0: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
18f0: 20 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65   {.  struct rule
1900: 20 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a   *rp;         /*
1910: 20 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77   The rule upon w
1920: 68 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75  hich the configu
1930: 72 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20  ration is based 
1940: 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20  */.  int dot;   
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1960: 20 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74   The parse point
1970: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b   */.  char *fws;
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1990: 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72  * Follow-set for
19a0: 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74   this configurat
19b0: 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ion only */.  st
19c0: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70  ruct plink *fplp
19d0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ;      /* Follow
19e0: 2d 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f  -set forward pro
19f0: 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a  pagation links *
1a00: 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  /.  struct plink
1a10: 20 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20   *bplp;      /* 
1a20: 46 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77  Follow-set backw
1a30: 61 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e  ards propagation
1a40: 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75   links */.  stru
1a50: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
1a60: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1a70: 74 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63  to state which c
1a80: 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a  ontains this */.
1a90: 20 20 65 6e 75 6d 20 7b 0a 20 20 20 20 43 4f 4d    enum {.    COM
1aa0: 50 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20 20  PLETE,          
1ab0: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 75      /* The statu
1ac0: 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  s is used during
1ad0: 20 66 6f 6c 6c 6f 77 73 65 74 20 61 6e 64 20 2a   followset and *
1ae0: 2f 0a 20 20 20 20 49 4e 43 4f 4d 50 4c 45 54 45  /.    INCOMPLETE
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b00: 20 20 20 73 68 69 66 74 20 63 6f 6d 70 75 74 61     shift computa
1b10: 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 20 73 74 61  tions */.  } sta
1b20: 74 75 73 3b 0a 20 20 73 74 72 75 63 74 20 63 6f  tus;.  struct co
1b30: 6e 66 69 67 20 2a 6e 65 78 74 3b 20 20 20 20 20  nfig *next;     
1b40: 2f 2a 20 4e 65 78 74 20 63 6f 6e 66 69 67 75 72  /* Next configur
1b50: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74 61  ation in the sta
1b60: 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63  te */.  struct c
1b70: 6f 6e 66 69 67 20 2a 62 70 3b 20 20 20 20 20 20  onfig *bp;      
1b80: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 61 73   /* The next bas
1b90: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
1ba0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79   */.};../* Every
1bb0: 20 73 68 69 66 74 20 6f 72 20 72 65 64 75 63 65   shift or reduce
1bc0: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73 74   operation is st
1bd0: 6f 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20 74  ored as one of t
1be0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
1bf0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b 0a  struct action {.
1c00: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1c10: 2a 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *sp;       /* Th
1c20: 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79 6d  e look-ahead sym
1c30: 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f  bol */.  enum e_
1c40: 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20 53 48 49  action {.    SHI
1c50: 46 54 2c 0a 20 20 20 20 41 43 43 45 50 54 2c 0a  FT,.    ACCEPT,.
1c60: 20 20 20 20 52 45 44 55 43 45 2c 0a 20 20 20 20      REDUCE,.    
1c70: 45 52 52 4f 52 2c 0a 20 20 20 20 43 4f 4e 46 4c  ERROR,.    CONFL
1c80: 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  ICT,            
1c90: 20 20 20 20 2f 2a 20 57 61 73 20 61 20 72 65 64      /* Was a red
1ca0: 75 63 65 2c 20 62 75 74 20 70 61 72 74 20 6f 66  uce, but part of
1cb0: 20 61 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20   a conflict */. 
1cc0: 20 20 20 53 48 5f 52 45 53 4f 4c 56 45 44 2c 20     SH_RESOLVED, 
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1ce0: 61 73 20 61 20 73 68 69 66 74 2e 20 20 50 72 65  as a shift.  Pre
1cf0: 63 65 64 65 6e 63 65 20 72 65 73 6f 6c 76 65 64  cedence resolved
1d00: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20   conflict */.   
1d10: 20 52 44 5f 52 45 53 4f 4c 56 45 44 2c 20 20 20   RD_RESOLVED,   
1d20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73            /* Was
1d30: 20 72 65 64 75 63 65 2e 20 20 50 72 65 63 65 64   reduce.  Preced
1d40: 65 6e 63 65 20 72 65 73 6f 6c 76 65 64 20 63 6f  ence resolved co
1d50: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 4e 4f  nflict */.    NO
1d60: 54 5f 55 53 45 44 20 20 20 20 20 20 20 20 20 20  T_USED          
1d70: 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
1d80: 64 20 62 79 20 63 6f 6d 70 72 65 73 73 69 6f 6e  d by compression
1d90: 20 2a 2f 0a 20 20 7d 20 74 79 70 65 3b 0a 20 20   */.  } type;.  
1da0: 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75  union {.    stru
1db0: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
1dc0: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 73 74     /* The new st
1dd0: 61 74 65 2c 20 69 66 20 61 20 73 68 69 66 74 20  ate, if a shift 
1de0: 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 72 75  */.    struct ru
1df0: 6c 65 20 2a 72 70 3b 20 20 20 20 20 20 20 2f 2a  le *rp;       /*
1e00: 20 54 68 65 20 72 75 6c 65 2c 20 69 66 20 61 20   The rule, if a 
1e10: 72 65 64 75 63 65 20 2a 2f 0a 20 20 7d 20 78 3b  reduce */.  } x;
1e20: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
1e30: 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e   *next;     /* N
1e40: 65 78 74 20 61 63 74 69 6f 6e 20 66 6f 72 20 74  ext action for t
1e50: 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73  his state */.  s
1e60: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 63 6f  truct action *co
1e70: 6c 6c 69 64 65 3b 20 20 2f 2a 20 4e 65 78 74 20  llide;  /* Next 
1e80: 61 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  action with the 
1e90: 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 7d 3b 0a  same hash */.};.
1ea0: 0a 2f 2a 20 45 61 63 68 20 73 74 61 74 65 20 6f  ./* Each state o
1eb0: 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
1ec0: 70 61 72 73 65 72 27 73 20 66 69 6e 69 74 65 20  parser's finite 
1ed0: 73 74 61 74 65 20 6d 61 63 68 69 6e 65 0a 2a 2a  state machine.**
1ee0: 20 69 73 20 65 6e 63 6f 64 65 64 20 61 73 20 61   is encoded as a
1ef0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1f00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1f10: 63 74 75 72 65 2e 20 2a 2f 0a 73 74 72 75 63 74  cture. */.struct
1f20: 20 73 74 61 74 65 20 7b 0a 20 20 73 74 72 75 63   state {.  struc
1f30: 74 20 63 6f 6e 66 69 67 20 2a 62 70 3b 20 20 20  t config *bp;   
1f40: 20 20 20 20 2f 2a 20 54 68 65 20 62 61 73 69 73      /* The basis
1f50: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
1f60: 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20 2a  for this state *
1f70: 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  /.  struct confi
1f80: 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a 20  g *cfp;      /* 
1f90: 41 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  All configuratio
1fa0: 6e 73 20 69 6e 20 74 68 69 73 20 73 65 74 20 2a  ns in this set *
1fb0: 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20 20  /.  int index;  
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fd0: 53 65 71 75 65 6e 63 69 61 6c 20 6e 75 6d 62 65  Sequencial numbe
1fe0: 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  r for this state
1ff0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74   */.  struct act
2000: 69 6f 6e 20 2a 61 70 3b 20 20 20 20 20 20 20 2f  ion *ap;       /
2010: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 6f  * Array of actio
2020: 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74 61 74  ns for this stat
2030: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 61 63 74 69  e */.  int nacti
2040: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
2050: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63 74  /* Number of act
2060: 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74  ions for this st
2070: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62  ate */.  int tab
2080: 73 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20  start;          
2090: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 64 65 78    /* First index
20a0: 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20 74   of the action t
20b0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74 61  able */.  int ta
20c0: 62 64 66 6c 74 61 63 74 3b 20 20 20 20 20 20 20  bdfltact;       
20d0: 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 61 63     /* Default ac
20e0: 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41  tion */.};../* A
20f0: 20 66 6f 6c 6c 6f 77 73 65 74 20 70 72 6f 70 61   followset propa
2100: 67 61 74 69 6f 6e 20 6c 69 6e 6b 20 69 6e 64 69  gation link indi
2110: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
2120: 6f 6e 74 65 6e 74 73 20 6f 66 20 6f 6e 65 0a 2a  ontents of one.*
2130: 2a 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * configuration 
2140: 66 6f 6c 6c 6f 77 73 65 74 20 73 68 6f 75 6c 64  followset should
2150: 20 62 65 20 70 72 6f 70 61 67 61 74 65 64 20 74   be propagated t
2160: 6f 20 61 6e 6f 74 68 65 72 20 77 68 65 6e 65 76  o another whenev
2170: 65 72 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  er.** the first 
2180: 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 73 74 72 75  changes. */.stru
2190: 63 74 20 70 6c 69 6e 6b 20 7b 0a 20 20 73 74 72  ct plink {.  str
21a0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
21b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
21c0: 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 77 68  figuration to wh
21d0: 69 63 68 20 6c 69 6e 6b 65 64 20 2a 2f 0a 20 20  ich linked */.  
21e0: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
21f0: 78 74 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  xt;      /* The 
2200: 6e 65 78 74 20 70 72 6f 70 61 67 61 74 65 20 6c  next propagate l
2210: 69 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68  ink */.};../* Th
2220: 65 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 66  e state vector f
2230: 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  or the entire pa
2240: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69  rser generator i
2250: 73 20 72 65 63 6f 72 64 65 64 20 61 73 0a 2a 2a  s recorded as.**
2260: 20 66 6f 6c 6c 6f 77 73 2e 20 20 28 4c 45 4d 4f   follows.  (LEMO
2270: 4e 20 75 73 65 73 20 6e 6f 20 67 6c 6f 62 61 6c  N uses no global
2280: 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6d   variables and m
2290: 61 6b 65 73 20 6c 69 74 74 6c 65 20 75 73 65 20  akes little use 
22a0: 6f 66 0a 2a 2a 20 73 74 61 74 69 63 20 76 61 72  of.** static var
22b0: 69 61 62 6c 65 73 2e 20 20 46 69 65 6c 64 73 20  iables.  Fields 
22c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
22d0: 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62   structure can b
22e0: 65 20 74 68 6f 75 67 68 74 0a 2a 2a 20 6f 66 20  e thought.** of 
22f0: 61 73 20 62 65 67 69 6e 20 67 6c 6f 62 61 6c 20  as begin global 
2300: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65  variables in the
2310: 20 70 72 6f 67 72 61 6d 2e 29 20 2a 2f 0a 73 74   program.) */.st
2320: 72 75 63 74 20 6c 65 6d 6f 6e 20 7b 0a 20 20 73  ruct lemon {.  s
2330: 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 73 6f  truct state **so
2340: 72 74 65 64 3b 20 20 20 2f 2a 20 54 61 62 6c 65  rted;   /* Table
2350: 20 6f 66 20 73 74 61 74 65 73 20 73 6f 72 74 65   of states sorte
2360: 64 20 62 79 20 73 74 61 74 65 20 6e 75 6d 62 65  d by state numbe
2370: 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  r */.  struct ru
2380: 6c 65 20 2a 72 75 6c 65 3b 20 20 20 20 20 20 20  le *rule;       
2390: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 72  /* List of all r
23a0: 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 73  ules */.  int ns
23b0: 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
23c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
23d0: 73 74 61 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20  states */.  int 
23e0: 6e 72 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20  nrule;          
23f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2400: 66 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74  f rules */.  int
2410: 20 6e 73 79 6d 62 6f 6c 3b 20 20 20 20 20 20 20   nsymbol;       
2420: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2430: 6f 66 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20  of terminal and 
2440: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  nonterminal symb
2450: 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 74 65  ols */.  int nte
2460: 72 6d 69 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  rminal;         
2470: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
2480: 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20  erminal symbols 
2490: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
24a0: 6f 6c 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20 2f 2a  ol **symbols; /*
24b0: 20 53 6f 72 74 65 64 20 61 72 72 61 79 20 6f 66   Sorted array of
24c0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 79 6d   pointers to sym
24d0: 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72  bols */.  int er
24e0: 72 6f 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20  rorcnt;         
24f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2500: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73 74 72 75  errors */.  stru
2510: 63 74 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79  ct symbol *errsy
2520: 6d 3b 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f  m;   /* The erro
2530: 72 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 63 68  r symbol */.  ch
2540: 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20  ar *name;       
2550: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2560: 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
2570: 70 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61 72  parser */.  char
2580: 20 2a 61 72 67 3b 20 20 20 20 20 20 20 20 20 20   *arg;          
2590: 20 20 20 20 20 2f 2a 20 44 65 63 6c 61 72 61 74       /* Declarat
25a0: 69 6f 6e 20 6f 66 20 74 68 65 20 33 74 68 20 61  ion of the 3th a
25b0: 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 72 73 65  rgument to parse
25c0: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  r */.  char *tok
25d0: 65 6e 74 79 70 65 3b 20 20 20 20 20 20 20 20 20  entype;         
25e0: 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 72 6d 69  /* Type of termi
25f0: 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74  nal symbols in t
2600: 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20  he parser stack 
2610: 2a 2f 0a 20 20 63 68 61 72 20 2a 76 61 72 74 79  */.  char *varty
2620: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pe;           /*
2630: 20 54 68 65 20 64 65 66 61 75 6c 74 20 74 79 70   The default typ
2640: 65 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  e of non-termina
2650: 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63  l symbols */.  c
2660: 68 61 72 20 2a 73 74 61 72 74 3b 20 20 20 20 20  har *start;     
2670: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2680: 6f 66 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  of the start sym
2690: 62 6f 6c 20 66 6f 72 20 74 68 65 20 67 72 61 6d  bol for the gram
26a0: 6d 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73  mar */.  char *s
26b0: 74 61 63 6b 73 69 7a 65 3b 20 20 20 20 20 20 20  tacksize;       
26c0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
26d0: 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a 2f   parser stack */
26e0: 0a 20 20 63 68 61 72 20 2a 69 6e 63 6c 75 64 65  .  char *include
26f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
2700: 6f 64 65 20 74 6f 20 70 75 74 20 61 74 20 74 68  ode to put at th
2710: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 43  e start of the C
2720: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 20   file */.  int  
2730: 69 6e 63 6c 75 64 65 6c 6e 3b 20 20 20 20 20 20  includeln;      
2740: 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62      /* Line numb
2750: 65 72 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20  er for start of 
2760: 69 6e 63 6c 75 64 65 20 63 6f 64 65 20 2a 2f 0a  include code */.
2770: 20 20 63 68 61 72 20 2a 65 72 72 6f 72 3b 20 20    char *error;  
2780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2790: 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 77 68  de to execute wh
27a0: 65 6e 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73  en an error is s
27b0: 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 20 65 72  een */.  int  er
27c0: 72 6f 72 6c 6e 3b 20 20 20 20 20 20 20 20 20 20  rorln;          
27d0: 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72    /* Line number
27e0: 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 65 72   for start of er
27f0: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  ror code */.  ch
2800: 61 72 20 2a 6f 76 65 72 66 6c 6f 77 3b 20 20 20  ar *overflow;   
2810: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
2820: 6f 20 65 78 65 63 75 74 65 20 6f 6e 20 61 20 73  o execute on a s
2830: 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77 20 2a 2f  tack overflow */
2840: 0a 20 20 69 6e 74 20 20 6f 76 65 72 66 6c 6f 77  .  int  overflow
2850: 6c 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ln;         /* L
2860: 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73  ine number for s
2870: 74 61 72 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  tart of overflow
2880: 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20   code */.  char 
2890: 2a 66 61 69 6c 75 72 65 3b 20 20 20 20 20 20 20  *failure;       
28a0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65      /* Code to e
28b0: 78 65 63 75 74 65 20 6f 6e 20 70 61 72 73 65 72  xecute on parser
28c0: 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 69 6e   failure */.  in
28d0: 74 20 20 66 61 69 6c 75 72 65 6c 6e 3b 20 20 20  t  failureln;   
28e0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
28f0: 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72 74 20  umber for start 
2900: 6f 66 20 66 61 69 6c 75 72 65 20 63 6f 64 65 20  of failure code 
2910: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 63 63 65 70  */.  char *accep
2920: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
2930: 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65   Code to execute
2940: 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   when the parser
2950: 20 65 78 63 65 70 74 73 20 2a 2f 0a 20 20 69 6e   excepts */.  in
2960: 74 20 20 61 63 63 65 70 74 6c 6e 3b 20 20 20 20  t  acceptln;    
2970: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
2980: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73 74  umber for the st
2990: 61 72 74 20 6f 66 20 61 63 63 65 70 74 20 63 6f  art of accept co
29a0: 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 78  de */.  char *ex
29b0: 74 72 61 63 6f 64 65 3b 20 20 20 20 20 20 20 20  tracode;        
29c0: 20 2f 2a 20 43 6f 64 65 20 61 70 70 65 6e 64 65   /* Code appende
29d0: 64 20 74 6f 20 74 68 65 20 67 65 6e 65 72 61 74  d to the generat
29e0: 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
29f0: 20 20 65 78 74 72 61 63 6f 64 65 6c 6e 3b 20 20    extracodeln;  
2a00: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
2a10: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73 74 61  mber for the sta
2a20: 72 74 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  rt of the extra 
2a30: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
2a40: 74 6f 6b 65 6e 64 65 73 74 3b 20 20 20 20 20 20  tokendest;      
2a50: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
2a60: 65 63 75 74 65 20 74 6f 20 64 65 73 74 72 6f 79  ecute to destroy
2a70: 20 74 6f 6b 65 6e 20 64 61 74 61 20 2a 2f 0a 20   token data */. 
2a80: 20 69 6e 74 20 20 74 6f 6b 65 6e 64 65 73 74 6c   int  tokendestl
2a90: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e  n;        /* Lin
2aa0: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 6f 6b  e number for tok
2ab0: 65 6e 20 64 65 73 74 72 6f 79 65 72 20 63 6f 64  en destroyer cod
2ac0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 76 61 72  e */.  char *var
2ad0: 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
2ae0: 2f 2a 20 43 6f 64 65 20 66 6f 72 20 74 68 65 20  /* Code for the 
2af0: 64 65 66 61 75 6c 74 20 6e 6f 6e 2d 74 65 72 6d  default non-term
2b00: 69 6e 61 6c 20 64 65 73 74 72 75 63 74 6f 72 20  inal destructor 
2b10: 2a 2f 0a 20 20 69 6e 74 20 20 76 61 72 64 65 73  */.  int  vardes
2b20: 74 6c 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  tln;          /*
2b30: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72   Line number for
2b40: 20 64 65 66 61 75 6c 74 20 6e 6f 6e 2d 74 65 72   default non-ter
2b50: 6d 20 64 65 73 74 72 75 63 74 6f 72 20 63 6f 64  m destructor cod
2b60: 65 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69 6c 65  e*/.  char *file
2b70: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f  name;          /
2b80: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
2b90: 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  put file */.  ch
2ba0: 61 72 20 2a 6f 75 74 6e 61 6d 65 3b 20 20 20 20  ar *outname;    
2bb0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2bc0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75  f the current ou
2bd0: 74 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 63  tput file */.  c
2be0: 68 61 72 20 2a 74 6f 6b 65 6e 70 72 65 66 69 78  har *tokenprefix
2bf0: 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 70 72 65  ;       /* A pre
2c00: 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 6f 6b  fix added to tok
2c10: 65 6e 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20  en names in the 
2c20: 2e 68 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  .h file */.  int
2c30: 20 6e 63 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20   nconflict;     
2c40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c50: 6f 66 20 70 61 72 73 69 6e 67 20 63 6f 6e 66 6c  of parsing confl
2c60: 69 63 74 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61  icts */.  int ta
2c70: 62 6c 65 73 69 7a 65 3b 20 20 20 20 20 20 20 20  blesize;        
2c80: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
2c90: 65 20 70 61 72 73 65 20 74 61 62 6c 65 73 20 2a  e parse tables *
2ca0: 2f 0a 20 20 69 6e 74 20 62 61 73 69 73 66 6c 61  /.  int basisfla
2cb0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g;           /* 
2cc0: 50 72 69 6e 74 20 6f 6e 6c 79 20 62 61 73 69 73  Print only basis
2cd0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
2ce0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 76 30  */.  char *argv0
2cf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2d00: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f   Name of the pro
2d10: 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  gram */.};..#def
2d20: 69 6e 65 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28  ine MemoryCheck(
2d30: 58 29 20 69 66 28 28 58 29 3d 3d 30 29 7b 20 5c  X) if((X)==0){ \
2d40: 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d  .  extern void m
2d50: 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c  emory_error(); \
2d60: 0a 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  .  memory_error(
2d70: 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ); \.}../*******
2d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
2d90: 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 68  he file "table.h
2da0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
2db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dc0: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63  ***/./*.** All c
2dd0: 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ode in this file
2de0: 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61   has been automa
2df0: 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
2e00: 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63  d.** from a spec
2e10: 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65  ification in the
2e20: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20   file.**        
2e30: 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a        "table.q".
2e40: 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63 69  ** by the associ
2e50: 61 74 69 76 65 20 61 72 72 61 79 20 63 6f 64 65  ative array code
2e60: 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61   building progra
2e70: 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f  m "aagen"..** Do
2e80: 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20 66   not edit this f
2e90: 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65  ile!  Instead, e
2ea0: 64 69 74 20 74 68 65 20 73 70 65 63 69 66 69 63  dit the specific
2eb0: 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74  ation.** file, t
2ec0: 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e  hen rerun aagen.
2ed0: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66  .*/./*.** Code f
2ee0: 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61  or processing ta
2ef0: 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  bles in the LEMO
2f00: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
2f10: 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52 6f 75 74 69  or..*/../* Routi
2f20: 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67  nes for handling
2f30: 20 61 20 73 74 72 69 6e 67 73 20 2a 2f 0a 0a 63   a strings */..c
2f40: 68 61 72 20 2a 53 74 72 73 61 66 65 28 29 3b 0a  har *Strsafe();.
2f50: 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e  .void Strsafe_in
2f60: 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a  it(/* void */);.
2f70: 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65  int Strsafe_inse
2f80: 72 74 28 2f 2a 20 63 68 61 72 20 2a 20 2a 2f 29  rt(/* char * */)
2f90: 3b 0a 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f  ;.char *Strsafe_
2fa0: 66 69 6e 64 28 2f 2a 20 63 68 61 72 20 2a 20 2a  find(/* char * *
2fb0: 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73  /);../* Routines
2fc0: 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 73 79   for handling sy
2fd0: 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72 61  mbols of the gra
2fe0: 6d 6d 61 72 20 2a 2f 0a 0a 73 74 72 75 63 74 20  mmar */..struct 
2ff0: 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e  symbol *Symbol_n
3000: 65 77 28 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c  ew();.int Symbol
3010: 63 6d 70 70 28 2f 2a 20 73 74 72 75 63 74 20 73  cmpp(/* struct s
3020: 79 6d 62 6f 6c 20 2a 2a 2c 20 73 74 72 75 63 74  ymbol **, struct
3030: 20 73 79 6d 62 6f 6c 20 2a 2a 20 2a 2f 29 3b 0a   symbol ** */);.
3040: 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74  void Symbol_init
3050: 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e  (/* void */);.in
3060: 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28  t Symbol_insert(
3070: 2f 2a 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  /* struct symbol
3080: 20 2a 2c 20 63 68 61 72 20 2a 20 2a 2f 29 3b 0a   *, char * */);.
3090: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
30a0: 79 6d 62 6f 6c 5f 66 69 6e 64 28 2f 2a 20 63 68  ymbol_find(/* ch
30b0: 61 72 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74  ar * */);.struct
30c0: 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
30d0: 4e 74 68 28 2f 2a 20 69 6e 74 20 2a 2f 29 3b 0a  Nth(/* int */);.
30e0: 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74  int Symbol_count
30f0: 28 2f 2a 20 20 2a 2f 29 3b 0a 73 74 72 75 63 74  (/*  */);.struct
3100: 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c   symbol **Symbol
3110: 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20 2a 2f 29  _arrayof(/*  */)
3120: 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 74  ;../* Routines t
3130: 6f 20 6d 61 6e 61 67 65 20 74 68 65 20 73 74 61  o manage the sta
3140: 74 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 69 6e 74  te table */..int
3150: 20 43 6f 6e 66 69 67 63 6d 70 28 2f 2a 20 73 74   Configcmp(/* st
3160: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2c 20 73  ruct config *, s
3170: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a  truct config * *
3180: 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65  /);.struct state
3190: 20 2a 53 74 61 74 65 5f 6e 65 77 28 29 3b 0a 76   *State_new();.v
31a0: 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28 2f  oid State_init(/
31b0: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74 20  * void */);.int 
31c0: 53 74 61 74 65 5f 69 6e 73 65 72 74 28 2f 2a 20  State_insert(/* 
31d0: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2c 20  struct state *, 
31e0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
31f0: 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74  */);.struct stat
3200: 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 2f 2a  e *State_find(/*
3210: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
3220: 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61   */);.struct sta
3230: 74 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79  te **State_array
3240: 6f 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20  of(/*  */);../* 
3250: 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 66 6f  Routines used fo
3260: 72 20 65 66 66 69 63 69 65 6e 63 79 20 69 6e 20  r efficiency in 
3270: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 20 2a  Configlist_add *
3280: 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  /..void Configta
3290: 62 6c 65 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64  ble_init(/* void
32a0: 20 2a 2f 29 3b 0a 69 6e 74 20 43 6f 6e 66 69 67   */);.int Config
32b0: 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 2f 2a 20  table_insert(/* 
32c0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
32d0: 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  */);.struct conf
32e0: 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f  ig *Configtable_
32f0: 66 69 6e 64 28 2f 2a 20 73 74 72 75 63 74 20 63  find(/* struct c
3300: 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 76 6f 69  onfig * */);.voi
3310: 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c  d Configtable_cl
3320: 65 61 72 28 2f 2a 20 69 6e 74 28 2a 29 28 73 74  ear(/* int(*)(st
3330: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 2a  ruct config *) *
3340: 2f 29 3b 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /);./***********
3350: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
3360: 20 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e 63 22   file "action.c"
3370: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
3380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3390: 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  /./*.** Routines
33a0: 20 70 72 6f 63 65 73 73 69 6e 67 20 70 61 72 73   processing pars
33b0: 65 72 20 61 63 74 69 6f 6e 73 20 69 6e 20 74 68  er actions in th
33c0: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
33d0: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
33e0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
33f0: 70 61 72 73 65 72 20 61 63 74 69 6f 6e 20 2a 2f  parser action */
3400: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  .struct action *
3410: 41 63 74 69 6f 6e 5f 6e 65 77 28 29 7b 0a 20 20  Action_new(){.  
3420: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61 63  static struct ac
3430: 74 69 6f 6e 20 2a 66 72 65 65 6c 69 73 74 20 3d  tion *freelist =
3440: 20 30 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74   0;.  struct act
3450: 69 6f 6e 20 2a 6e 65 77 3b 0a 0a 20 20 69 66 28  ion *new;..  if(
3460: 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a   freelist==0 ){.
3470: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
3480: 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20  nt amt = 100;.  
3490: 20 20 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74    freelist = (st
34a0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 6d 61  ruct action *)ma
34b0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
34c0: 75 63 74 20 61 63 74 69 6f 6e 29 2a 61 6d 74 20  uct action)*amt 
34d0: 29 3b 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c  );.    if( freel
34e0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
34f0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
3500: 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  Unable to alloca
3510: 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20  te memory for a 
3520: 6e 65 77 20 70 61 72 73 65 72 20 61 63 74 69 6f  new parser actio
3530: 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74  n.");.      exit
3540: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  (1);.    }.    f
3550: 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b  or(i=0; i<amt-1;
3560: 20 69 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69   i++) freelist[i
3570: 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69  ].next = &freeli
3580: 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65  st[i+1];.    fre
3590: 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78  elist[amt-1].nex
35a0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77  t = 0;.  }.  new
35b0: 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66   = freelist;.  f
35c0: 72 65 65 6c 69 73 74 20 3d 20 66 72 65 65 6c 69  reelist = freeli
35d0: 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75  st->next;.  retu
35e0: 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 43 6f  rn new;.}../* Co
35f0: 6d 70 61 72 65 20 74 77 6f 20 61 63 74 69 6f 6e  mpare two action
3600: 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
3610: 61 63 74 69 6f 6e 63 6d 70 28 61 70 31 2c 61 70  actioncmp(ap1,ap
3620: 32 29 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e  2).struct action
3630: 20 2a 61 70 31 3b 0a 73 74 72 75 63 74 20 61 63   *ap1;.struct ac
3640: 74 69 6f 6e 20 2a 61 70 32 3b 0a 7b 0a 20 20 69  tion *ap2;.{.  i
3650: 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 61 70  nt rc;.  rc = ap
3660: 31 2d 3e 73 70 2d 3e 69 6e 64 65 78 20 2d 20 61  1->sp->index - a
3670: 70 32 2d 3e 73 70 2d 3e 69 6e 64 65 78 3b 0a 20  p2->sp->index;. 
3680: 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
3690: 3d 20 28 69 6e 74 29 61 70 31 2d 3e 74 79 70 65  = (int)ap1->type
36a0: 20 2d 20 28 69 6e 74 29 61 70 32 2d 3e 74 79 70   - (int)ap2->typ
36b0: 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  e;.  if( rc==0 )
36c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70  {.    assert( ap
36d0: 31 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  1->type==REDUCE 
36e0: 7c 7c 20 61 70 31 2d 3e 74 79 70 65 3d 3d 52 44  || ap1->type==RD
36f0: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 20 61 70 31  _RESOLVED || ap1
3700: 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46 4c 49 43 54  ->type==CONFLICT
3710: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
3720: 70 32 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  p2->type==REDUCE
3730: 20 7c 7c 20 61 70 32 2d 3e 74 79 70 65 3d 3d 52   || ap2->type==R
3740: 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 20 61 70  D_RESOLVED || ap
3750: 32 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46 4c 49 43  2->type==CONFLIC
3760: 54 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 70 31  T);.    rc = ap1
3770: 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2d 20  ->x.rp->index - 
3780: 61 70 32 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78  ap2->x.rp->index
3790: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
37a0: 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 70 61  c;.}../* Sort pa
37b0: 72 73 65 72 20 61 63 74 69 6f 6e 73 20 2a 2f 0a  rser actions */.
37c0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41  struct action *A
37d0: 63 74 69 6f 6e 5f 73 6f 72 74 28 61 70 29 0a 73  ction_sort(ap).s
37e0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
37f0: 3b 0a 7b 0a 20 20 61 70 20 3d 20 28 73 74 72 75  ;.{.  ap = (stru
3800: 63 74 20 61 63 74 69 6f 6e 20 2a 29 6d 73 6f 72  ct action *)msor
3810: 74 28 61 70 2c 26 61 70 2d 3e 6e 65 78 74 2c 61  t(ap,&ap->next,a
3820: 63 74 69 6f 6e 63 6d 70 29 3b 0a 20 20 72 65 74  ctioncmp);.  ret
3830: 75 72 6e 20 61 70 3b 0a 7d 0a 0a 76 6f 69 64 20  urn ap;.}..void 
3840: 41 63 74 69 6f 6e 5f 61 64 64 28 61 70 70 2c 74  Action_add(app,t
3850: 79 70 65 2c 73 70 2c 61 72 67 29 0a 73 74 72 75  ype,sp,arg).stru
3860: 63 74 20 61 63 74 69 6f 6e 20 2a 2a 61 70 70 3b  ct action **app;
3870: 0a 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74  .enum e_action t
3880: 79 70 65 3b 0a 73 74 72 75 63 74 20 73 79 6d 62  ype;.struct symb
3890: 6f 6c 20 2a 73 70 3b 0a 63 68 61 72 20 2a 61 72  ol *sp;.char *ar
38a0: 67 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 61 63  g;.{.  struct ac
38b0: 74 69 6f 6e 20 2a 6e 65 77 3b 0a 20 20 6e 65 77  tion *new;.  new
38c0: 20 3d 20 41 63 74 69 6f 6e 5f 6e 65 77 28 29 3b   = Action_new();
38d0: 0a 20 20 6e 65 77 2d 3e 6e 65 78 74 20 3d 20 2a  .  new->next = *
38e0: 61 70 70 3b 0a 20 20 2a 61 70 70 20 3d 20 6e 65  app;.  *app = ne
38f0: 77 3b 0a 20 20 6e 65 77 2d 3e 74 79 70 65 20 3d  w;.  new->type =
3900: 20 74 79 70 65 3b 0a 20 20 6e 65 77 2d 3e 73 70   type;.  new->sp
3910: 20 3d 20 73 70 3b 0a 20 20 69 66 28 20 74 79 70   = sp;.  if( typ
3920: 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20  e==SHIFT ){.    
3930: 6e 65 77 2d 3e 78 2e 73 74 70 20 3d 20 28 73 74  new->x.stp = (st
3940: 72 75 63 74 20 73 74 61 74 65 20 2a 29 61 72 67  ruct state *)arg
3950: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
3960: 65 77 2d 3e 78 2e 72 70 20 3d 20 28 73 74 72 75  ew->x.rp = (stru
3970: 63 74 20 72 75 6c 65 20 2a 29 61 72 67 3b 0a 20  ct rule *)arg;. 
3980: 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   }.}./**********
3990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
39a0: 6d 20 74 68 65 20 66 69 6c 65 20 22 61 73 73 65  m the file "asse
39b0: 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rt.c" **********
39c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
39d0: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20 6d 6f 72 65  **/./*.** A more
39e0: 20 65 66 66 69 63 69 65 6e 74 20 77 61 79 20 6f   efficient way o
39f0: 66 20 68 61 6e 64 6c 69 6e 67 20 61 73 73 65 72  f handling asser
3a00: 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 6d  tions..*/.void m
3a10: 79 61 73 73 65 72 74 28 66 69 6c 65 2c 6c 69 6e  yassert(file,lin
3a20: 65 29 0a 63 68 61 72 20 2a 66 69 6c 65 3b 0a 69  e).char *file;.i
3a30: 6e 74 20 6c 69 6e 65 3b 0a 7b 0a 20 20 66 70 72  nt line;.{.  fpr
3a40: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 41 73 73  intf(stderr,"Ass
3a50: 65 72 74 69 6f 6e 20 66 61 69 6c 65 64 20 6f 6e  ertion failed on
3a60: 20 6c 69 6e 65 20 25 64 20 6f 66 20 66 69 6c 65   line %d of file
3a70: 20 5c 22 25 73 5c 22 5c 6e 22 2c 6c 69 6e 65 2c   \"%s\"\n",line,
3a80: 66 69 6c 65 29 3b 0a 20 20 65 78 69 74 28 31 29  file);.  exit(1)
3a90: 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
3aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
3ab0: 20 74 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64   the file "build
3ac0: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
3ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ae0: 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  */./*.** Routine
3af0: 73 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 69 6f  s to constructio
3b00: 6e 20 74 68 65 20 66 69 6e 69 74 65 20 73 74 61  n the finite sta
3b10: 74 65 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 74  te machine for t
3b20: 68 65 20 4c 45 4d 4f 4e 0a 2a 2a 20 70 61 72 73  he LEMON.** pars
3b30: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
3b40: 0a 0a 2f 2a 20 46 69 6e 64 20 61 20 70 72 65 63  ../* Find a prec
3b50: 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6f 66  edence symbol of
3b60: 20 65 76 65 72 79 20 72 75 6c 65 20 69 6e 20 74   every rule in t
3b70: 68 65 20 67 72 61 6d 6d 61 72 2e 0a 2a 2a 20 0a  he grammar..** .
3b80: 2a 2a 20 54 68 6f 73 65 20 72 75 6c 65 73 20 77  ** Those rules w
3b90: 68 69 63 68 20 68 61 76 65 20 61 20 70 72 65 63  hich have a prec
3ba0: 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 63 6f  edence symbol co
3bb0: 64 65 64 20 69 6e 20 74 68 65 20 69 6e 70 75 74  ded in the input
3bc0: 0a 2a 2a 20 67 72 61 6d 6d 61 72 20 75 73 69 6e  .** grammar usin
3bd0: 67 20 74 68 65 20 22 5b 73 79 6d 62 6f 6c 5d 22  g the "[symbol]"
3be0: 20 63 6f 6e 73 74 72 75 63 74 20 77 69 6c 6c 20   construct will 
3bf0: 61 6c 72 65 61 64 79 20 68 61 76 65 20 74 68 65  already have the
3c00: 0a 2a 2a 20 72 70 2d 3e 70 72 65 63 73 79 6d 20  .** rp->precsym 
3c10: 66 69 65 6c 64 20 66 69 6c 6c 65 64 2e 20 20 4f  field filled.  O
3c20: 74 68 65 72 20 72 75 6c 65 73 20 74 61 6b 65 20  ther rules take 
3c30: 61 73 20 74 68 65 69 72 20 70 72 65 63 65 64 65  as their precede
3c40: 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 74 68  nce.** symbol th
3c50: 65 20 66 69 72 73 74 20 52 48 53 20 73 79 6d 62  e first RHS symb
3c60: 6f 6c 20 77 69 74 68 20 61 20 64 65 66 69 6e 65  ol with a define
3c70: 64 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20 49  d precedence.  I
3c80: 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
3c90: 6f 74 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77  ot RHS symbols w
3ca0: 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 70 72  ith a defined pr
3cb0: 65 63 65 64 65 6e 63 65 2c 20 74 68 65 20 70 72  ecedence, the pr
3cc0: 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62  ecedence.** symb
3cd0: 6f 6c 20 66 69 65 6c 64 20 69 73 20 6c 65 66 74  ol field is left
3ce0: 20 62 6c 61 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64 20   blank..*/.void 
3cf0: 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e  FindRulePreceden
3d00: 63 65 73 28 78 70 29 0a 73 74 72 75 63 74 20 6c  ces(xp).struct l
3d10: 65 6d 6f 6e 20 2a 78 70 3b 0a 7b 0a 20 20 73 74  emon *xp;.{.  st
3d20: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
3d30: 20 66 6f 72 28 72 70 3d 78 70 2d 3e 72 75 6c 65   for(rp=xp->rule
3d40: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
3d50: 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  t){.    if( rp->
3d60: 70 72 65 63 73 79 6d 3d 3d 30 20 29 7b 0a 20 20  precsym==0 ){.  
3d70: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
3d80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
3d90: 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
3da0: 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b      if( rp->rhs[
3db0: 69 5d 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20  i]->prec>=0 ){. 
3dc0: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65           rp->pre
3dd0: 63 73 79 6d 20 3d 20 72 70 2d 3e 72 68 73 5b 69  csym = rp->rhs[i
3de0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ];.          bre
3df0: 61 6b 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20  ak;..}.      }. 
3e00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3e10: 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61 6c  n;.}../* Find al
3e20: 6c 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77  l nonterminals w
3e30: 68 69 63 68 20 77 69 6c 6c 20 67 65 6e 65 72 61  hich will genera
3e40: 74 65 20 74 68 65 20 65 6d 70 74 79 20 73 74 72  te the empty str
3e50: 69 6e 67 2e 0a 2a 2a 20 54 68 65 6e 20 67 6f 20  ing..** Then go 
3e60: 62 61 63 6b 20 61 6e 64 20 63 6f 6d 70 75 74 65  back and compute
3e70: 20 74 68 65 20 66 69 72 73 74 20 73 65 74 73 20   the first sets 
3e80: 6f 66 20 65 76 65 72 79 20 6e 6f 6e 74 65 72 6d  of every nonterm
3e90: 69 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 66 69 72  inal..** The fir
3ea0: 73 74 20 73 65 74 20 69 73 20 74 68 65 20 73 65  st set is the se
3eb0: 74 20 6f 66 20 61 6c 6c 20 74 65 72 6d 69 6e 61  t of all termina
3ec0: 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20  l symbols which 
3ed0: 63 61 6e 20 62 65 67 69 6e 0a 2a 2a 20 61 20 73  can begin.** a s
3ee0: 74 72 69 6e 67 20 67 65 6e 65 72 61 74 65 64 20  tring generated 
3ef0: 62 79 20 74 68 61 74 20 6e 6f 6e 74 65 72 6d 69  by that nontermi
3f00: 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e  nal..*/.void Fin
3f10: 64 46 69 72 73 74 53 65 74 73 28 6c 65 6d 70 29  dFirstSets(lemp)
3f20: 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
3f30: 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  emp;.{.  int i;.
3f40: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
3f50: 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73  p;.  int progres
3f60: 73 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  s;..  for(i=0; i
3f70: 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
3f80: 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e  i++){.    lemp->
3f90: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d 62  symbols[i]->lamb
3fa0: 64 61 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a  da = FALSE;.  }.
3fb0: 20 20 66 6f 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74    for(i=lemp->nt
3fc0: 65 72 6d 69 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d  erminal; i<lemp-
3fd0: 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
3fe0: 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c      lemp->symbol
3ff0: 73 5b 69 5d 2d 3e 66 69 72 73 74 73 65 74 20 3d  s[i]->firstset =
4000: 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a   SetNew();.  }..
4010: 20 20 2f 2a 20 46 69 72 73 74 20 63 6f 6d 70 75    /* First compu
4020: 74 65 20 61 6c 6c 20 6c 61 6d 62 64 61 73 20 2a  te all lambdas *
4030: 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67  /.  do{.    prog
4040: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ress = 0;.    fo
4050: 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
4060: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
4070: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d  ){.      if( rp-
4080: 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 29 20 63  >lhs->lambda ) c
4090: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
40a0: 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
40b0: 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
40c0: 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b 69     if( rp->rhs[i
40d0: 5d 2d 3e 6c 61 6d 62 64 61 3d 3d 46 41 4c 53 45  ]->lambda==FALSE
40e0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
40f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 72  }.      if( i==r
4100: 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20  p->nrhs ){.     
4110: 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62     rp->lhs->lamb
4120: 64 61 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  da = TRUE;.     
4130: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
4140: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4150: 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73   }while( progres
4160: 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63  s );..  /* Now c
4170: 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69 72 73 74  ompute all first
4180: 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20   sets */.  do{. 
4190: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
41a0: 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70   *s1, *s2;.    p
41b0: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
41c0: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
41d0: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
41e0: 65 78 74 29 7b 0a 20 20 20 20 20 20 73 31 20 3d  ext){.      s1 =
41f0: 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20   rp->lhs;.      
4200: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
4210: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
4220: 20 20 20 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b     s2 = rp->rhs[
4230: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
4240: 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  s2->type==TERMIN
4250: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
4260: 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41  progress += SetA
4270: 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c  dd(s1->firstset,
4280: 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  s2->index);.    
4290: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 65        break;..}e
42a0: 6c 73 65 20 69 66 28 20 73 31 3d 3d 73 32 20 29  lse if( s1==s2 )
42b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
42c0: 73 31 2d 3e 6c 61 6d 62 64 61 3d 3d 46 41 4c 53  s1->lambda==FALS
42d0: 45 20 29 20 62 72 65 61 6b 3b 0a 09 7d 65 6c 73  E ) break;..}els
42e0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f  e{.          pro
42f0: 67 72 65 73 73 20 2b 3d 20 53 65 74 55 6e 69 6f  gress += SetUnio
4300: 6e 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73  n(s1->firstset,s
4310: 32 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20  2->firstset);.  
4320: 20 20 20 20 20 20 20 20 69 66 28 20 73 32 2d 3e          if( s2->
4330: 6c 61 6d 62 64 61 3d 3d 46 41 4c 53 45 20 29 20  lambda==FALSE ) 
4340: 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 20 20  break;..}.      
4350: 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  }.    }.  }while
4360: 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 20 20  ( progress );.  
4370: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f  return;.}../* Co
4380: 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29 20  mpute all LR(0) 
4390: 73 74 61 74 65 73 20 66 6f 72 20 74 68 65 20 67  states for the g
43a0: 72 61 6d 6d 61 72 2e 20 20 4c 69 6e 6b 73 0a 2a  rammar.  Links.*
43b0: 2a 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 62  * are added to b
43c0: 65 74 77 65 65 6e 20 73 6f 6d 65 20 73 74 61 74  etween some stat
43d0: 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 4c  es so that the L
43e0: 52 28 31 29 20 66 6f 6c 6c 6f 77 20 73 65 74 73  R(1) follow sets
43f0: 0a 2a 2a 20 63 61 6e 20 62 65 20 63 6f 6d 70 75  .** can be compu
4400: 74 65 64 20 6c 61 74 65 72 2e 0a 2a 2f 0a 50 52  ted later..*/.PR
4410: 49 56 41 54 45 20 73 74 72 75 63 74 20 73 74 61  IVATE struct sta
4420: 74 65 20 2a 67 65 74 73 74 61 74 65 28 2f 2a 20  te *getstate(/* 
4430: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a  struct lemon * *
4440: 2f 29 3b 20 20 2f 2a 20 66 6f 72 77 61 72 64 20  /);  /* forward 
4450: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 76 6f 69  reference */.voi
4460: 64 20 46 69 6e 64 53 74 61 74 65 73 28 6c 65 6d  d FindStates(lem
4470: 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
4480: 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63  *lemp;.{.  struc
4490: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20  t symbol *sp;.  
44a0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
44b0: 0a 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69  ..  Configlist_i
44c0: 6e 69 74 28 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  nit();..  /* Fin
44d0: 64 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62  d the start symb
44e0: 6f 6c 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70  ol */.  if( lemp
44f0: 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20 20 73  ->start ){.    s
4500: 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28  p = Symbol_find(
4510: 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20  lemp->start);.  
4520: 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20    if( sp==0 ){. 
4530: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
4540: 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a  mp->filename,0,.
4550: 22 54 68 65 20 73 70 65 63 69 66 69 65 64 20 73  "The specified s
4560: 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73  tart symbol \"%s
4570: 5c 22 20 69 73 20 6e 6f 74 20 5c 0a 69 6e 20 61  \" is not \.in a
4580: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f 66 20   nonterminal of 
4590: 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 5c 22  the grammar.  \"
45a0: 25 73 5c 22 20 77 69 6c 6c 20 62 65 20 75 73 65  %s\" will be use
45b0: 64 20 61 73 20 74 68 65 20 73 74 61 72 74 20 5c  d as the start \
45c0: 0a 73 79 6d 62 6f 6c 20 69 6e 73 74 65 61 64 2e  .symbol instead.
45d0: 22 2c 6c 65 6d 70 2d 3e 73 74 61 72 74 2c 6c 65  ",lemp->start,le
45e0: 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 2d 3e 6e  mp->rule->lhs->n
45f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70  ame);.      lemp
4600: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
4610: 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72      sp = lemp->r
4620: 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 20 20 7d 0a  ule->lhs;.    }.
4630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20    }else{.    sp 
4640: 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68  = lemp->rule->lh
4650: 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  s;.  }..  /* Mak
4660: 65 20 73 75 72 65 20 74 68 65 20 73 74 61 72 74  e sure the start
4670: 20 73 79 6d 62 6f 6c 20 64 6f 65 73 6e 27 74 20   symbol doesn't 
4680: 6f 63 63 75 72 20 6f 6e 20 74 68 65 20 72 69 67  occur on the rig
4690: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 0a  ht-hand side of.
46a0: 20 20 2a 2a 20 61 6e 79 20 72 75 6c 65 2e 20 20    ** any rule.  
46b0: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
46c0: 69 66 20 69 74 20 64 6f 65 73 2e 20 20 28 59 41  if it does.  (YA
46d0: 43 43 20 77 6f 75 6c 64 20 67 65 6e 65 72 61 74  CC would generat
46e0: 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 73 74 61  e a new.  ** sta
46f0: 72 74 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68 69  rt symbol in thi
4700: 73 20 63 61 73 65 2e 29 20 2a 2f 0a 20 20 66 6f  s case.) */.  fo
4710: 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
4720: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
4730: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
4740: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
4750: 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
4760: 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b 69     if( rp->rhs[i
4770: 5d 3d 3d 73 70 20 29 7b 0a 20 20 20 20 20 20 20  ]==sp ){.       
4780: 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
4790: 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65  filename,0,."The
47a0: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22   start symbol \"
47b0: 25 73 5c 22 20 6f 63 63 75 72 73 20 6f 6e 20 74  %s\" occurs on t
47c0: 68 65 20 5c 0a 72 69 67 68 74 2d 68 61 6e 64 20  he \.right-hand 
47d0: 73 69 64 65 20 6f 66 20 61 20 72 75 6c 65 2e 20  side of a rule. 
47e0: 54 68 69 73 20 77 69 6c 6c 20 72 65 73 75 6c 74  This will result
47f0: 20 69 6e 20 61 20 70 61 72 73 65 72 20 77 68 69   in a parser whi
4800: 63 68 20 5c 0a 64 6f 65 73 20 6e 6f 74 20 77 6f  ch \.does not wo
4810: 72 6b 20 70 72 6f 70 65 72 6c 79 2e 22 2c 73 70  rk properly.",sp
4820: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
4830: 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
4840: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
4850: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62  .  }..  /* The b
4860: 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  asis configurati
4870: 6f 6e 20 73 65 74 20 66 6f 72 20 74 68 65 20 66  on set for the f
4880: 69 72 73 74 20 73 74 61 74 65 0a 20 20 2a 2a 20  irst state.  ** 
4890: 69 73 20 61 6c 6c 20 72 75 6c 65 73 20 77 68 69  is all rules whi
48a0: 63 68 20 68 61 76 65 20 74 68 65 20 73 74 61 72  ch have the star
48b0: 74 20 73 79 6d 62 6f 6c 20 61 73 20 74 68 65 69  t symbol as thei
48c0: 72 0a 20 20 2a 2a 20 6c 65 66 74 2d 68 61 6e 64  r.  ** left-hand
48d0: 20 73 69 64 65 20 2a 2f 0a 20 20 66 6f 72 28 72   side */.  for(r
48e0: 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  p=sp->rule; rp; 
48f0: 72 70 3d 72 70 2d 3e 6e 65 78 74 6c 68 73 29 7b  rp=rp->nextlhs){
4900: 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .    struct conf
4910: 69 67 20 2a 6e 65 77 63 66 70 3b 0a 20 20 20 20  ig *newcfp;.    
4920: 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c  newcfp = Configl
4930: 69 73 74 5f 61 64 64 62 61 73 69 73 28 72 70 2c  ist_addbasis(rp,
4940: 30 29 3b 0a 20 20 20 20 53 65 74 41 64 64 28 6e  0);.    SetAdd(n
4950: 65 77 63 66 70 2d 3e 66 77 73 2c 30 29 3b 0a 20  ewcfp->fws,0);. 
4960: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
4970: 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65   the first state
4980: 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 73 74 61  .  All other sta
4990: 74 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  tes will be.  **
49a0: 20 63 6f 6d 70 75 74 65 64 20 61 75 74 6f 6d 61   computed automa
49b0: 74 69 63 61 6c 6c 79 20 64 75 72 69 6e 67 20 74  tically during t
49c0: 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f  he computation o
49d0: 66 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e  f the first one.
49e0: 0a 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  .  ** The return
49f0: 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ed pointer to th
4a00: 65 20 66 69 72 73 74 20 73 74 61 74 65 20 69 73  e first state is
4a10: 20 6e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20   not used. */.  
4a20: 28 76 6f 69 64 29 67 65 74 73 74 61 74 65 28 6c  (void)getstate(l
4a30: 65 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  emp);.  return;.
4a40: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
4a50: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74  ointer to a stat
4a60: 65 20 77 68 69 63 68 20 69 73 20 64 65 73 63 72  e which is descr
4a70: 69 62 65 64 20 62 79 20 74 68 65 20 63 6f 6e 66  ibed by the conf
4a80: 69 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 6c 69 73  iguration.** lis
4a90: 74 20 77 68 69 63 68 20 68 61 73 20 62 65 65 6e  t which has been
4aa0: 20 62 75 69 6c 74 20 66 72 6f 6d 20 63 61 6c 6c   built from call
4ab0: 73 20 74 6f 20 43 6f 6e 66 69 67 6c 69 73 74 5f  s to Configlist_
4ac0: 61 64 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  add..*/.PRIVATE 
4ad0: 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74 73  void buildshifts
4ae0: 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  (/* struct lemon
4af0: 20 2a 2c 20 73 74 72 75 63 74 20 73 74 61 74 65   *, struct state
4b00: 20 2a 20 2a 2f 29 3b 20 2f 2a 20 46 6f 72 77 64   * */); /* Forwd
4b10: 20 72 65 66 20 2a 2f 0a 50 52 49 56 41 54 45 20   ref */.PRIVATE 
4b20: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 67 65  struct state *ge
4b30: 74 73 74 61 74 65 28 6c 65 6d 70 29 0a 73 74 72  tstate(lemp).str
4b40: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
4b50: 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .{.  struct conf
4b60: 69 67 20 2a 63 66 70 2c 20 2a 62 70 3b 0a 20 20  ig *cfp, *bp;.  
4b70: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
4b80: 70 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74  p;..  /* Extract
4b90: 20 74 68 65 20 73 6f 72 74 65 64 20 62 61 73 69   the sorted basi
4ba0: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 73 74 61  s of the new sta
4bb0: 74 65 2e 20 20 54 68 65 20 62 61 73 69 73 20 77  te.  The basis w
4bc0: 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20  as constructed. 
4bd0: 20 2a 2a 20 62 79 20 70 72 69 6f 72 20 63 61 6c   ** by prior cal
4be0: 6c 73 20 74 6f 20 22 43 6f 6e 66 69 67 6c 69 73  ls to "Configlis
4bf0: 74 5f 61 64 64 62 61 73 69 73 28 29 22 2e 20 2a  t_addbasis()". *
4c00: 2f 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73  /.  Configlist_s
4c10: 6f 72 74 62 61 73 69 73 28 29 3b 0a 20 20 62 70  ortbasis();.  bp
4c20: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61   = Configlist_ba
4c30: 73 69 73 28 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  sis();..  /* Get
4c40: 20 61 20 73 74 61 74 65 20 77 69 74 68 20 74 68   a state with th
4c50: 65 20 73 61 6d 65 20 62 61 73 69 73 20 2a 2f 0a  e same basis */.
4c60: 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f 66 69    stp = State_fi
4c70: 6e 64 28 62 70 29 3b 0a 20 20 69 66 28 20 73 74  nd(bp);.  if( st
4c80: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 73 74  p ){.    /* A st
4c90: 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ate with the sam
4ca0: 65 20 62 61 73 69 73 20 61 6c 72 65 61 64 79 20  e basis already 
4cb0: 65 78 69 73 74 73 21 20 20 43 6f 70 79 20 61 6c  exists!  Copy al
4cc0: 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74  l the follow-set
4cd0: 0a 20 20 20 20 2a 2a 20 70 72 6f 70 61 67 61 74  .    ** propagat
4ce0: 69 6f 6e 20 6c 69 6e 6b 73 20 66 72 6f 6d 20 74  ion links from t
4cf0: 68 65 20 73 74 61 74 65 20 75 6e 64 65 72 20 63  he state under c
4d00: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 74 6f  onstruction into
4d10: 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 65 65   the.    ** pree
4d20: 78 69 73 74 69 6e 67 20 73 74 61 74 65 2c 20 74  xisting state, t
4d30: 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
4d40: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 65  nter to the pree
4d50: 78 69 73 74 69 6e 67 20 73 74 61 74 65 20 2a 2f  xisting state */
4d60: 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .    struct conf
4d70: 69 67 20 2a 78 2c 20 2a 79 3b 0a 20 20 20 20 66  ig *x, *y;.    f
4d80: 6f 72 28 78 3d 62 70 2c 20 79 3d 73 74 70 2d 3e  or(x=bp, y=stp->
4d90: 62 70 3b 20 78 20 26 26 20 79 3b 20 78 3d 78 2d  bp; x && y; x=x-
4da0: 3e 62 70 2c 20 79 3d 79 2d 3e 62 70 29 7b 0a 20  >bp, y=y->bp){. 
4db0: 20 20 20 20 20 50 6c 69 6e 6b 5f 63 6f 70 79 28       Plink_copy(
4dc0: 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e 62 70 6c 70  &y->bplp,x->bplp
4dd0: 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 64  );.      Plink_d
4de0: 65 6c 65 74 65 28 78 2d 3e 66 70 6c 70 29 3b 0a  elete(x->fplp);.
4df0: 20 20 20 20 20 20 78 2d 3e 66 70 6c 70 20 3d 20        x->fplp = 
4e00: 78 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20  x->bplp = 0;.   
4e10: 20 7d 0a 20 20 20 20 63 66 70 20 3d 20 43 6f 6e   }.    cfp = Con
4e20: 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29  figlist_return()
4e30: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74  ;.    Configlist
4e40: 5f 65 61 74 28 63 66 70 29 3b 0a 20 20 7d 65 6c  _eat(cfp);.  }el
4e50: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
4e60: 72 65 61 6c 6c 79 20 69 73 20 61 20 6e 65 77 20  really is a new 
4e70: 73 74 61 74 65 2e 20 20 43 6f 6e 73 74 72 75 63  state.  Construc
4e80: 74 20 61 6c 6c 20 74 68 65 20 64 65 74 61 69 6c  t all the detail
4e90: 73 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c  s */.    Configl
4ea0: 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c 65 6d 70  ist_closure(lemp
4eb0: 29 3b 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  );    /* Compute
4ec0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
4ed0: 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20  on closure */.  
4ee0: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72    Configlist_sor
4ef0: 74 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f  t();           /
4f00: 2a 20 53 6f 72 74 20 74 68 65 20 63 6f 6e 66 69  * Sort the confi
4f10: 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65  guration closure
4f20: 20 2a 2f 0a 20 20 20 20 63 66 70 20 3d 20 43 6f   */.    cfp = Co
4f30: 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28  nfiglist_return(
4f40: 29 3b 20 20 20 2f 2a 20 47 65 74 20 61 20 70 6f  );   /* Get a po
4f50: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6e  inter to the con
4f60: 66 69 67 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20  fig list */.    
4f70: 73 74 70 20 3d 20 53 74 61 74 65 5f 6e 65 77 28  stp = State_new(
4f80: 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );           /* 
4f90: 41 20 6e 65 77 20 73 74 61 74 65 20 73 74 72 75  A new state stru
4fa0: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 4d 65 6d  cture */.    Mem
4fb0: 6f 72 79 43 68 65 63 6b 28 73 74 70 29 3b 0a 20  oryCheck(stp);. 
4fc0: 20 20 20 73 74 70 2d 3e 62 70 20 3d 20 62 70 3b     stp->bp = bp;
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  /* Remember the 
4ff0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 61  configuration ba
5000: 73 69 73 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e  sis */.    stp->
5010: 63 66 70 20 3d 20 63 66 70 3b 20 20 20 20 20 20  cfp = cfp;      
5020: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d          /* Remem
5030: 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ber the configur
5040: 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f  ation closure */
5050: 0a 20 20 20 20 73 74 70 2d 3e 69 6e 64 65 78 20  .    stp->index 
5060: 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b  = lemp->nstate++
5070: 3b 20 2f 2a 20 45 76 65 72 79 20 73 74 61 74 65  ; /* Every state
5080: 20 67 65 74 73 20 61 20 73 65 71 75 65 6e 63 65   gets a sequence
5090: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 73   number */.    s
50a0: 74 70 2d 3e 61 70 20 3d 20 30 3b 20 20 20 20 20  tp->ap = 0;     
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
50c0: 6f 20 61 63 74 69 6f 6e 73 2c 20 79 65 74 2e 20  o actions, yet. 
50d0: 2a 2f 0a 20 20 20 20 53 74 61 74 65 5f 69 6e 73  */.    State_ins
50e0: 65 72 74 28 73 74 70 2c 73 74 70 2d 3e 62 70 29  ert(stp,stp->bp)
50f0: 3b 20 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68  ;   /* Add to th
5100: 65 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f  e state table */
5110: 0a 20 20 20 20 62 75 69 6c 64 73 68 69 66 74 73  .    buildshifts
5120: 28 6c 65 6d 70 2c 73 74 70 29 3b 20 20 20 20 20  (lemp,stp);     
5130: 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79    /* Recursively
5140: 20 63 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73   compute success
5150: 6f 72 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 7d  or states */.  }
5160: 0a 20 20 72 65 74 75 72 6e 20 73 74 70 3b 0a 7d  .  return stp;.}
5170: 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  ../* Construct a
5180: 6c 6c 20 73 75 63 63 65 73 73 6f 72 20 73 74 61  ll successor sta
5190: 74 65 73 20 74 6f 20 74 68 65 20 67 69 76 65 6e  tes to the given
51a0: 20 73 74 61 74 65 2e 20 20 41 20 22 73 75 63 63   state.  A "succ
51b0: 65 73 73 6f 72 22 0a 2a 2a 20 73 74 61 74 65 20  essor".** state 
51c0: 69 73 20 61 6e 79 20 73 74 61 74 65 20 77 68 69  is any state whi
51d0: 63 68 20 63 61 6e 20 62 65 20 72 65 61 63 68 65  ch can be reache
51e0: 64 20 62 79 20 61 20 73 68 69 66 74 20 61 63 74  d by a shift act
51f0: 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ion..*/.PRIVATE 
5200: 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74 73  void buildshifts
5210: 28 6c 65 6d 70 2c 73 74 70 29 0a 73 74 72 75 63  (lemp,stp).struc
5220: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73  t lemon *lemp;.s
5230: 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
5240: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61  ;     /* The sta
5250: 74 65 20 66 72 6f 6d 20 77 68 69 63 68 20 73 75  te from which su
5260: 63 63 65 73 73 6f 72 73 20 61 72 65 20 63 6f 6d  ccessors are com
5270: 70 75 74 65 64 20 2a 2f 0a 7b 0a 20 20 73 74 72  puted */.{.  str
5280: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
5290: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
52a0: 20 74 68 72 75 20 74 68 65 20 63 6f 6e 66 69 67   thru the config
52b0: 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74 70   closure of "stp
52c0: 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f  " */.  struct co
52d0: 6e 66 69 67 20 2a 62 63 66 70 3b 20 2f 2a 20 46  nfig *bcfp; /* F
52e0: 6f 72 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  or the inner loo
52f0: 70 20 6f 6e 20 63 6f 6e 66 69 67 20 63 6c 6f 73  p on config clos
5300: 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a 2f 0a  ure of "stp" */.
5310: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
5320: 2a 6e 65 77 3b 20 20 2f 2a 20 2a 2f 0a 20 20 73  *new;  /* */.  s
5330: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
5340: 3b 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f  ;   /* Symbol fo
5350: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74 20  llowing the dot 
5360: 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  in configuration
5370: 20 22 63 66 70 22 20 2a 2f 0a 20 20 73 74 72 75   "cfp" */.  stru
5380: 63 74 20 73 79 6d 62 6f 6c 20 2a 62 73 70 3b 20  ct symbol *bsp; 
5390: 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f   /* Symbol follo
53a0: 77 69 6e 67 20 74 68 65 20 64 6f 74 20 69 6e 20  wing the dot in 
53b0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 62  configuration "b
53c0: 63 66 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74  cfp" */.  struct
53d0: 20 73 74 61 74 65 20 2a 6e 65 77 73 74 70 3b 20   state *newstp; 
53e0: 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  /* A pointer to 
53f0: 61 20 73 75 63 63 65 73 73 6f 72 20 73 74 61 74  a successor stat
5400: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 61 63 68 20  e */..  /* Each 
5410: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 65  configuration be
5420: 63 6f 6d 65 73 20 63 6f 6d 70 6c 65 74 65 20 61  comes complete a
5430: 66 74 65 72 20 69 74 20 63 6f 6e 74 69 62 75 74  fter it contibut
5440: 65 73 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f  es to a successo
5450: 72 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 49  r.  ** state.  I
5460: 6e 69 74 69 61 6c 6c 79 2c 20 61 6c 6c 20 63 6f  nitially, all co
5470: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61 72 65  nfigurations are
5480: 20 69 6e 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20   incomplete */. 
5490: 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66   for(cfp=stp->cf
54a0: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
54b0: 3e 6e 65 78 74 29 20 63 66 70 2d 3e 73 74 61 74  >next) cfp->stat
54c0: 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b  us = INCOMPLETE;
54d0: 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
54e0: 75 67 68 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72  ugh all configur
54f0: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 74  ations of the st
5500: 61 74 65 20 22 73 74 70 22 20 2a 2f 0a 20 20 66  ate "stp" */.  f
5510: 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b  or(cfp=stp->cfp;
5520: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
5530: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 63 66  ext){.    if( cf
5540: 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c  p->status==COMPL
5550: 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ETE ) continue; 
5560: 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73     /* Already us
5570: 65 64 20 62 79 20 69 6e 6e 65 72 20 6c 6f 6f 70  ed by inner loop
5580: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 66 70 2d   */.    if( cfp-
5590: 3e 64 6f 74 3e 3d 63 66 70 2d 3e 72 70 2d 3e 6e  >dot>=cfp->rp->n
55a0: 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  rhs ) continue; 
55b0: 20 2f 2a 20 43 61 6e 27 74 20 73 68 69 66 74 20   /* Can't shift 
55c0: 74 68 69 73 20 63 6f 6e 66 69 67 20 2a 2f 0a 20  this config */. 
55d0: 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65     Configlist_re
55e0: 73 65 74 28 29 3b 20 20 20 20 20 20 20 20 20 20  set();          
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
5600: 65 73 65 74 20 74 68 65 20 6e 65 77 20 63 6f 6e  eset the new con
5610: 66 69 67 20 73 65 74 20 2a 2f 0a 20 20 20 20 73  fig set */.    s
5620: 70 20 3d 20 63 66 70 2d 3e 72 70 2d 3e 72 68 73  p = cfp->rp->rhs
5630: 5b 63 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20  [cfp->dot];     
5640: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f          /* Symbo
5650: 6c 20 61 66 74 65 72 20 74 68 65 20 64 6f 74 20  l after the dot 
5660: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 65  */..    /* For e
5670: 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69  very configurati
5680: 6f 6e 20 69 6e 20 74 68 65 20 73 74 61 74 65 20  on in the state 
5690: 22 73 74 70 22 20 77 68 69 63 68 20 68 61 73 20  "stp" which has 
56a0: 74 68 65 20 73 79 6d 62 6f 6c 20 22 73 70 22 0a  the symbol "sp".
56b0: 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
56c0: 20 69 74 73 20 64 6f 74 2c 20 61 64 64 20 74 68   its dot, add th
56d0: 65 20 73 61 6d 65 20 63 6f 6e 66 69 67 75 72 61  e same configura
56e0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 62 61 73 69  tion to the basi
56f0: 73 20 73 65 74 20 75 6e 64 65 72 0a 20 20 20 20  s set under.    
5700: 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  ** construction 
5710: 62 75 74 20 77 69 74 68 20 74 68 65 20 64 6f 74  but with the dot
5720: 20 73 68 69 66 74 65 64 20 6f 6e 65 20 73 79 6d   shifted one sym
5730: 62 6f 6c 20 74 6f 20 74 68 65 20 72 69 67 68 74  bol to the right
5740: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 62 63 66  . */.    for(bcf
5750: 70 3d 63 66 70 3b 20 62 63 66 70 3b 20 62 63 66  p=cfp; bcfp; bcf
5760: 70 3d 62 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  p=bcfp->next){. 
5770: 20 20 20 20 20 69 66 28 20 62 63 66 70 2d 3e 73       if( bcfp->s
5780: 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20  tatus==COMPLETE 
5790: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f  ) continue;    /
57a0: 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64 20 2a  * Already used *
57b0: 2f 0a 20 20 20 20 20 20 69 66 28 20 62 63 66 70  /.      if( bcfp
57c0: 2d 3e 64 6f 74 3e 3d 62 63 66 70 2d 3e 72 70 2d  ->dot>=bcfp->rp-
57d0: 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65  >nrhs ) continue
57e0: 3b 20 2f 2a 20 43 61 6e 27 74 20 73 68 69 66 74  ; /* Can't shift
57f0: 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 20   this one */.   
5800: 20 20 20 62 73 70 20 3d 20 62 63 66 70 2d 3e 72     bsp = bcfp->r
5810: 70 2d 3e 72 68 73 5b 62 63 66 70 2d 3e 64 6f 74  p->rhs[bcfp->dot
5820: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ];           /* 
5830: 47 65 74 20 73 79 6d 62 6f 6c 20 61 66 74 65 72  Get symbol after
5840: 20 64 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66   dot */.      if
5850: 28 20 62 73 70 21 3d 73 70 20 29 20 63 6f 6e 74  ( bsp!=sp ) cont
5860: 69 6e 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  inue;           
5870: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
5880: 62 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20 22  be same as for "
5890: 63 66 70 22 20 2a 2f 0a 20 20 20 20 20 20 62 63  cfp" */.      bc
58a0: 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d  fp->status = COM
58b0: 50 4c 45 54 45 3b 20 20 20 20 20 20 20 20 20 20  PLETE;          
58c0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20          /* Mark 
58d0: 74 68 69 73 20 63 6f 6e 66 69 67 20 61 73 20 75  this config as u
58e0: 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 6e 65 77  sed */.      new
58f0: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64   = Configlist_ad
5900: 64 62 61 73 69 73 28 62 63 66 70 2d 3e 72 70 2c  dbasis(bcfp->rp,
5910: 62 63 66 70 2d 3e 64 6f 74 2b 31 29 3b 0a 20 20  bcfp->dot+1);.  
5920: 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6e      Plink_add(&n
5930: 65 77 2d 3e 62 70 6c 70 2c 62 63 66 70 29 3b 0a  ew->bplp,bcfp);.
5940: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
5950: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
5960: 68 65 20 73 74 61 74 65 20 64 65 73 63 72 69 62  he state describ
5970: 65 64 20 62 79 20 74 68 65 20 62 61 73 69 73 20  ed by the basis 
5980: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  configuration se
5990: 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75  t.    ** constru
59a0: 63 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 63  cted in the prec
59b0: 65 64 69 6e 67 20 6c 6f 6f 70 20 2a 2f 0a 20 20  eding loop */.  
59c0: 20 20 6e 65 77 73 74 70 20 3d 20 67 65 74 73 74    newstp = getst
59d0: 61 74 65 28 6c 65 6d 70 29 3b 0a 0a 20 20 20 20  ate(lemp);..    
59e0: 2f 2a 20 54 68 65 20 73 74 61 74 65 20 22 6e 65  /* The state "ne
59f0: 77 73 74 70 22 20 69 73 20 72 65 61 63 68 65 64  wstp" is reached
5a00: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 20   from the state 
5a10: 22 73 74 70 22 20 62 79 20 61 20 73 68 69 66 74  "stp" by a shift
5a20: 20 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f   action.    ** o
5a30: 6e 20 74 68 65 20 73 79 6d 62 6f 6c 20 22 73 70  n the symbol "sp
5a40: 22 20 2a 2f 0a 20 20 20 20 41 63 74 69 6f 6e 5f  " */.    Action_
5a50: 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 53 48 49  add(&stp->ap,SHI
5a60: 46 54 2c 73 70 2c 6e 65 77 73 74 70 29 3b 0a 20  FT,sp,newstp);. 
5a70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
5a80: 74 72 75 63 74 20 74 68 65 20 70 72 6f 70 61 67  truct the propag
5a90: 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2f 0a 76  ation links.*/.v
5aa0: 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28 6c 65  oid FindLinks(le
5ab0: 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
5ac0: 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20   *lemp;.{.  int 
5ad0: 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  i;.  struct conf
5ae0: 69 67 20 2a 63 66 70 2c 20 2a 6f 74 68 65 72 3b  ig *cfp, *other;
5af0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
5b00: 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 70  *stp;.  struct p
5b10: 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a  link *plp;..  /*
5b20: 20 48 6f 75 73 65 6b 65 65 70 69 6e 67 20 64 65   Housekeeping de
5b30: 74 61 69 6c 3a 0a 20 20 2a 2a 20 41 64 64 20 74  tail:.  ** Add t
5b40: 6f 20 65 76 65 72 79 20 70 72 6f 70 61 67 61 74  o every propagat
5b50: 65 20 6c 69 6e 6b 20 61 20 70 6f 69 6e 74 65 72  e link a pointer
5b60: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61   back to the sta
5b70: 74 65 20 74 6f 0a 20 20 2a 2a 20 77 68 69 63 68  te to.  ** which
5b80: 20 74 68 65 20 6c 69 6e 6b 20 69 73 20 61 74 74   the link is att
5b90: 61 63 68 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28  ached. */.  for(
5ba0: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
5bb0: 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
5bc0: 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
5bd0: 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66  d[i];.    for(cf
5be0: 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b  p=stp->cfp; cfp;
5bf0: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
5c00: 0a 20 20 20 20 20 20 63 66 70 2d 3e 73 74 70 20  .      cfp->stp 
5c10: 3d 20 73 74 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  = stp;.    }.  }
5c20: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61  ..  /* Convert a
5c30: 6c 6c 20 62 61 63 6b 6c 69 6e 6b 73 20 69 6e 74  ll backlinks int
5c40: 6f 20 66 6f 72 77 61 72 64 20 6c 69 6e 6b 73 2e  o forward links.
5c50: 20 20 4f 6e 6c 79 20 74 68 65 20 66 6f 72 77 61    Only the forwa
5c60: 72 64 0a 20 20 2a 2a 20 6c 69 6e 6b 73 20 61 72  rd.  ** links ar
5c70: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 66 6f  e used in the fo
5c80: 6c 6c 6f 77 2d 73 65 74 20 63 6f 6d 70 75 74 61  llow-set computa
5c90: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  tion. */.  for(i
5ca0: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
5cb0: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
5cc0: 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
5cd0: 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70  [i];.    for(cfp
5ce0: 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20  =stp->cfp; cfp; 
5cf0: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
5d00: 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d 63 66        for(plp=cf
5d10: 70 2d 3e 62 70 6c 70 3b 20 70 6c 70 3b 20 70 6c  p->bplp; plp; pl
5d20: 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=plp->next){.  
5d30: 20 20 20 20 20 20 6f 74 68 65 72 20 3d 20 70 6c        other = pl
5d40: 70 2d 3e 63 66 70 3b 0a 20 20 20 20 20 20 20 20  p->cfp;.        
5d50: 50 6c 69 6e 6b 5f 61 64 64 28 26 6f 74 68 65 72  Plink_add(&other
5d60: 2d 3e 66 70 6c 70 2c 63 66 70 29 3b 0a 20 20 20  ->fplp,cfp);.   
5d70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
5d80: 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c  ../* Compute all
5d90: 20 66 6f 6c 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a   followsets..**.
5da0: 2a 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 69  ** A followset i
5db0: 73 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c  s the set of all
5dc0: 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63   symbols which c
5dd0: 61 6e 20 63 6f 6d 65 20 69 6d 6d 65 64 69 61 74  an come immediat
5de0: 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 61 20 63  ely.** after a c
5df0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f  onfiguration..*/
5e00: 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77  .void FindFollow
5e10: 53 65 74 73 28 6c 65 6d 70 29 0a 73 74 72 75 63  Sets(lemp).struc
5e20: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
5e30: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
5e40: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a  ct config *cfp;.
5e50: 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
5e60: 70 6c 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72  plp;.  int progr
5e70: 65 73 73 3b 0a 20 20 69 6e 74 20 63 68 61 6e 67  ess;.  int chang
5e80: 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e;..  for(i=0; i
5e90: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
5ea0: 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 63 66 70  ++){.    for(cfp
5eb0: 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d  =lemp->sorted[i]
5ec0: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
5ed0: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
5ee0: 20 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20    cfp->status = 
5ef0: 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20  INCOMPLETE;.    
5f00: 7d 0a 20 20 7d 0a 20 20 0a 20 20 64 6f 7b 0a 20  }.  }.  .  do{. 
5f10: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b     progress = 0;
5f20: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
5f30: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
5f40: 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 63 66  +){.      for(cf
5f50: 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  p=lemp->sorted[i
5f60: 5d 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  ]->cfp; cfp; cfp
5f70: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
5f80: 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e 73 74       if( cfp->st
5f90: 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29  atus==COMPLETE )
5fa0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
5fb0: 20 20 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e     for(plp=cfp->
5fc0: 66 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70  fplp; plp; plp=p
5fd0: 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  lp->next){.     
5fe0: 20 20 20 20 20 63 68 61 6e 67 65 20 3d 20 53 65       change = Se
5ff0: 74 55 6e 69 6f 6e 28 70 6c 70 2d 3e 63 66 70 2d  tUnion(plp->cfp-
6000: 3e 66 77 73 2c 63 66 70 2d 3e 66 77 73 29 3b 0a  >fws,cfp->fws);.
6010: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 68            if( ch
6020: 61 6e 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  ange ){.        
6030: 20 20 20 20 70 6c 70 2d 3e 63 66 70 2d 3e 73 74      plp->cfp->st
6040: 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54  atus = INCOMPLET
6050: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  E;.            p
6060: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 09 20 20  rogress = 1;..  
6070: 7d 0a 09 7d 0a 20 20 20 20 20 20 20 20 63 66 70  }..}.        cfp
6080: 2d 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c  ->status = COMPL
6090: 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ETE;.      }.   
60a0: 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f   }.  }while( pro
60b0: 67 72 65 73 73 20 29 3b 0a 7d 0a 0a 73 74 61 74  gress );.}..stat
60c0: 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63  ic int resolve_c
60d0: 6f 6e 66 6c 69 63 74 28 29 3b 0a 0a 2f 2a 20 43  onflict();../* C
60e0: 6f 6d 70 75 74 65 20 74 68 65 20 72 65 64 75 63  ompute the reduc
60f0: 65 20 61 63 74 69 6f 6e 73 2c 20 61 6e 64 20 72  e actions, and r
6100: 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73  esolve conflicts
6110: 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 41 63  ..*/.void FindAc
6120: 74 69 6f 6e 73 28 6c 65 6d 70 29 0a 73 74 72 75  tions(lemp).stru
6130: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
6140: 7b 0a 20 20 69 6e 74 20 69 2c 6a 3b 0a 20 20 73  {.  int i,j;.  s
6150: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
6160: 70 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  p;.  struct stat
6170: 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74  e *stp;.  struct
6180: 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73   symbol *sp;.  s
6190: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
61a0: 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 6f 66  .  /* Add all of
61b0: 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69   the reduce acti
61c0: 6f 6e 73 20 0a 20 20 2a 2a 20 41 20 72 65 64 75  ons .  ** A redu
61d0: 63 65 20 61 63 74 69 6f 6e 20 69 73 20 61 64 64  ce action is add
61e0: 65 64 20 66 6f 72 20 65 61 63 68 20 65 6c 65 6d  ed for each elem
61f0: 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ent of the follo
6200: 77 73 65 74 20 6f 66 0a 20 20 2a 2a 20 61 20 63  wset of.  ** a c
6210: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 77 68 69  onfiguration whi
6220: 63 68 20 68 61 73 20 69 74 73 20 64 6f 74 20 61  ch has its dot a
6230: 74 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69  t the extreme ri
6240: 67 68 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ght..  */.  for(
6250: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
6260: 61 74 65 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a 20  ate; i++){   /* 
6270: 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73 74  Loop over all st
6280: 61 74 65 73 20 2a 2f 0a 20 20 20 20 73 74 70 20  ates */.    stp 
6290: 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
62a0: 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73  ];.    for(cfp=s
62b0: 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66  tp->cfp; cfp; cf
62c0: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 20 20 2f  p=cfp->next){  /
62d0: 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  * Loop over all 
62e0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a  configurations *
62f0: 2f 0a 20 20 20 20 20 20 69 66 28 20 63 66 70 2d  /.      if( cfp-
6300: 3e 72 70 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e  >rp->nrhs==cfp->
6310: 64 6f 74 20 29 7b 20 20 20 20 20 20 20 20 2f 2a  dot ){        /*
6320: 20 49 73 20 64 6f 74 20 61 74 20 65 78 74 72 65   Is dot at extre
6330: 6d 65 20 72 69 67 68 74 3f 20 2a 2f 0a 20 20 20  me right? */.   
6340: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
6350: 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b  lemp->nterminal;
6360: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
6370: 20 69 66 28 20 53 65 74 46 69 6e 64 28 63 66 70   if( SetFind(cfp
6380: 2d 3e 66 77 73 2c 6a 29 20 29 7b 0a 20 20 20 20  ->fws,j) ){.    
6390: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61          /* Add a
63a0: 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 74   reduce action t
63b0: 6f 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70  o the state "stp
63c0: 22 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65 64  " which will red
63d0: 75 63 65 20 62 79 20 74 68 65 0a 20 20 20 20 20  uce by the.     
63e0: 20 20 20 20 20 20 20 2a 2a 20 72 75 6c 65 20 22         ** rule "
63f0: 63 66 70 2d 3e 72 70 22 20 69 66 20 74 68 65 20  cfp->rp" if the 
6400: 6c 6f 6f 6b 61 68 65 61 64 20 73 79 6d 62 6f 6c  lookahead symbol
6410: 20 69 73 20 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f   is "lemp->symbo
6420: 6c 73 5b 6a 5d 22 20 2a 2f 0a 20 20 20 20 20 20  ls[j]" */.      
6430: 20 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64        Action_add
6440: 28 26 73 74 70 2d 3e 61 70 2c 52 45 44 55 43 45  (&stp->ap,REDUCE
6450: 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a  ,lemp->symbols[j
6460: 5d 2c 63 66 70 2d 3e 72 70 29 3b 0a 20 20 20 20  ],cfp->rp);.    
6470: 20 20 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 20        }..}.     
6480: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
6490: 2f 2a 20 41 64 64 20 74 68 65 20 61 63 63 65 70  /* Add the accep
64a0: 74 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  ting token */.  
64b0: 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20  if( lemp->start 
64c0: 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62  ){.    sp = Symb
64d0: 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74  ol_find(lemp->st
64e0: 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70  art);.    if( sp
64f0: 3d 3d 30 20 29 20 73 70 20 3d 20 6c 65 6d 70 2d  ==0 ) sp = lemp-
6500: 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65  >rule->lhs;.  }e
6510: 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65  lse{.    sp = le
6520: 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20  mp->rule->lhs;. 
6530: 20 7d 0a 20 20 2f 2a 20 41 64 64 20 74 6f 20 74   }.  /* Add to t
6540: 68 65 20 66 69 72 73 74 20 73 74 61 74 65 20 28  he first state (
6550: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20  which is always 
6560: 74 68 65 20 73 74 61 72 74 69 6e 67 20 73 74 61  the starting sta
6570: 74 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  te of the.  ** f
6580: 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68  inite state mach
6590: 69 6e 65 29 20 61 6e 20 61 63 74 69 6f 6e 20 74  ine) an action t
65a0: 6f 20 41 43 43 45 50 54 20 69 66 20 74 68 65 20  o ACCEPT if the 
65b0: 6c 6f 6f 6b 61 68 65 61 64 20 69 73 20 74 68 65  lookahead is the
65c0: 0a 20 20 2a 2a 20 73 74 61 72 74 20 6e 6f 6e 74  .  ** start nont
65d0: 65 72 6d 69 6e 61 6c 2e 20 20 2a 2f 0a 20 20 41  erminal.  */.  A
65e0: 63 74 69 6f 6e 5f 61 64 64 28 26 6c 65 6d 70 2d  ction_add(&lemp-
65f0: 3e 73 6f 72 74 65 64 5b 30 5d 2d 3e 61 70 2c 41  >sorted[0]->ap,A
6600: 43 43 45 50 54 2c 73 70 2c 30 29 3b 0a 0a 20 20  CCEPT,sp,0);..  
6610: 2f 2a 20 52 65 73 6f 6c 76 65 20 63 6f 6e 66 6c  /* Resolve confl
6620: 69 63 74 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  icts */.  for(i=
6630: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
6640: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  e; i++){.    str
6650: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20  uct action *ap, 
6660: 2a 6e 61 70 3b 0a 20 20 20 20 73 74 72 75 63 74  *nap;.    struct
6670: 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 20   state *stp;.   
6680: 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
6690: 74 65 64 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  ted[i];.    asse
66a0: 72 74 28 20 73 74 70 2d 3e 61 70 20 29 3b 0a 20  rt( stp->ap );. 
66b0: 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63 74     stp->ap = Act
66c0: 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70  ion_sort(stp->ap
66d0: 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74  );.    for(ap=st
66e0: 70 2d 3e 61 70 3b 20 61 70 20 26 26 20 61 70 2d  p->ap; ap && ap-
66f0: 3e 6e 65 78 74 3b 20 61 70 3d 6e 61 70 29 7b 0a  >next; ap=nap){.
6700: 20 20 20 20 20 20 66 6f 72 28 6e 61 70 3d 61 70        for(nap=ap
6710: 2d 3e 6e 65 78 74 3b 20 6e 61 70 20 26 26 20 6e  ->next; nap && n
6720: 61 70 2d 3e 73 70 3d 3d 61 70 2d 3e 73 70 3b 20  ap->sp==ap->sp; 
6730: 6e 61 70 3d 6e 61 70 2d 3e 6e 65 78 74 29 7b 0a  nap=nap->next){.
6740: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6750: 74 77 6f 20 61 63 74 69 6f 6e 73 20 22 61 70 22  two actions "ap"
6760: 20 61 6e 64 20 22 6e 61 70 22 20 68 61 76 65 20   and "nap" have 
6770: 74 68 65 20 73 61 6d 65 20 6c 6f 6f 6b 61 68 65  the same lookahe
6780: 61 64 2e 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  ad..         ** 
6790: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
67a0: 20 6f 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 75   one should be u
67b0: 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  sed */.         
67c0: 6c 65 6d 70 2d 3e 6e 63 6f 6e 66 6c 69 63 74 20  lemp->nconflict 
67d0: 2b 3d 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c  += resolve_confl
67e0: 69 63 74 28 61 70 2c 6e 61 70 2c 6c 65 6d 70 2d  ict(ap,nap,lemp-
67f0: 3e 65 72 72 73 79 6d 29 3b 0a 20 20 20 20 20 20  >errsym);.      
6800: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
6810: 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  * Report an erro
6820: 72 20 66 6f 72 20 65 61 63 68 20 72 75 6c 65 20  r for each rule 
6830: 74 68 61 74 20 63 61 6e 20 6e 65 76 65 72 20 62  that can never b
6840: 65 20 72 65 64 75 63 65 64 2e 20 2a 2f 0a 20 20  e reduced. */.  
6850: 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
6860: 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
6870: 78 74 29 20 72 70 2d 3e 63 61 6e 52 65 64 75 63  xt) rp->canReduc
6880: 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 66 6f 72  e = FALSE;.  for
6890: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
68a0: 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
68b0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
68c0: 70 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 6c 65  p;.    for(ap=le
68d0: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 61  mp->sorted[i]->a
68e0: 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
68f0: 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  xt){.      if( a
6900: 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  p->type==REDUCE 
6910: 29 20 61 70 2d 3e 78 2e 72 70 2d 3e 63 61 6e 52  ) ap->x.rp->canR
6920: 65 64 75 63 65 20 3d 20 54 52 55 45 3b 0a 20 20  educe = TRUE;.  
6930: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70    }.  }.  for(rp
6940: 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
6950: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
6960: 20 20 20 69 66 28 20 72 70 2d 3e 63 61 6e 52 65     if( rp->canRe
6970: 64 75 63 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  duce ) continue;
6980: 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65  .    ErrorMsg(le
6990: 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d  mp->filename,rp-
69a0: 3e 72 75 6c 65 6c 69 6e 65 2c 22 54 68 69 73 20  >ruleline,"This 
69b0: 72 75 6c 65 20 63 61 6e 20 6e 6f 74 20 62 65 20  rule can not be 
69c0: 72 65 64 75 63 65 64 2e 5c 6e 22 29 3b 0a 20 20  reduced.\n");.  
69d0: 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
69e0: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65  ++;.  }.}../* Re
69f0: 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63 74  solve a conflict
6a00: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
6a10: 20 67 69 76 65 6e 20 61 63 74 69 6f 6e 73 2e 20   given actions. 
6a20: 20 49 66 20 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c   If the.** confl
6a30: 69 63 74 20 63 61 6e 27 74 20 62 65 20 72 65 73  ict can't be res
6a40: 6f 6c 76 65 2c 20 72 65 74 75 72 6e 20 6e 6f 6e  olve, return non
6a50: 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20  -zero..**.** NO 
6a60: 4c 4f 4e 47 45 52 20 54 52 55 45 3a 0a 2a 2a 20  LONGER TRUE:.** 
6a70: 20 20 54 6f 20 72 65 73 6f 6c 76 65 20 61 20 63    To resolve a c
6a80: 6f 6e 66 6c 69 63 74 2c 20 66 69 72 73 74 20 6c  onflict, first l
6a90: 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 65 69  ook to see if ei
6aa0: 74 68 65 72 20 61 63 74 69 6f 6e 0a 2a 2a 20 20  ther action.**  
6ab0: 20 69 73 20 6f 6e 20 61 6e 20 65 72 72 6f 72 20   is on an error 
6ac0: 72 75 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63  rule.  In that c
6ad0: 61 73 65 2c 20 74 61 6b 65 20 74 68 65 20 61 63  ase, take the ac
6ae0: 74 69 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 20 20  tion which.**   
6af0: 69 73 20 6e 6f 74 20 61 73 73 6f 63 69 61 74 65  is not associate
6b00: 64 20 77 69 74 68 20 74 68 65 20 65 72 72 6f 72  d with the error
6b10: 20 72 75 6c 65 2e 20 20 49 66 20 6e 65 69 74 68   rule.  If neith
6b20: 65 72 20 6f 72 20 62 6f 74 68 0a 2a 2a 20 20 20  er or both.**   
6b30: 61 63 74 69 6f 6e 73 20 61 72 65 20 61 73 73 6f  actions are asso
6b40: 63 69 61 74 65 64 20 77 69 74 68 20 61 6e 20 65  ciated with an e
6b50: 72 72 6f 72 20 72 75 6c 65 2c 20 74 68 65 6e 20  rror rule, then 
6b60: 74 72 79 20 74 6f 0a 2a 2a 20 20 20 75 73 65 20  try to.**   use 
6b70: 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20 72 65  precedence to re
6b80: 73 6f 6c 76 65 20 74 68 65 20 63 6f 6e 66 6c 69  solve the confli
6b90: 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74  ct..**.** If eit
6ba0: 68 65 72 20 61 63 74 69 6f 6e 20 69 73 20 61 20  her action is a 
6bb0: 53 48 49 46 54 2c 20 74 68 65 6e 20 69 74 20 6d  SHIFT, then it m
6bc0: 75 73 74 20 62 65 20 61 70 78 2e 20 20 54 68 69  ust be apx.  Thi
6bd0: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f  s.** function wo
6be0: 6e 27 74 20 77 6f 72 6b 20 69 66 20 61 70 78 2d  n't work if apx-
6bf0: 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 61 6e  >type==REDUCE an
6c00: 64 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49  d apy->type==SHI
6c10: 46 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  FT..*/.static in
6c20: 74 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69  t resolve_confli
6c30: 63 74 28 61 70 78 2c 61 70 79 2c 65 72 72 73 79  ct(apx,apy,errsy
6c40: 6d 29 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e  m).struct action
6c50: 20 2a 61 70 78 3b 0a 73 74 72 75 63 74 20 61 63   *apx;.struct ac
6c60: 74 69 6f 6e 20 2a 61 70 79 3b 0a 73 74 72 75 63  tion *apy;.struc
6c70: 74 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d  t symbol *errsym
6c80: 3b 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72  ;   /* The error
6c90: 20 73 79 6d 62 6f 6c 20 28 69 66 20 64 65 66 69   symbol (if defi
6ca0: 6e 65 64 2e 20 20 4e 55 4c 4c 20 6f 74 68 65 72  ned.  NULL other
6cb0: 77 69 73 65 29 20 2a 2f 0a 7b 0a 20 20 73 74 72  wise) */.{.  str
6cc0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 78 2c  uct symbol *spx,
6cd0: 20 2a 73 70 79 3b 0a 20 20 69 6e 74 20 65 72 72   *spy;.  int err
6ce0: 63 6e 74 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  cnt = 0;.  asser
6cf0: 74 28 20 61 70 78 2d 3e 73 70 3d 3d 61 70 79 2d  t( apx->sp==apy-
6d00: 3e 73 70 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72  >sp );  /* Other
6d10: 77 69 73 65 20 74 68 65 72 65 20 77 6f 75 6c 64  wise there would
6d20: 20 62 65 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 20   be no conflict 
6d30: 2a 2f 0a 20 20 69 66 28 20 61 70 78 2d 3e 74 79  */.  if( apx->ty
6d40: 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70 79  pe==SHIFT && apy
6d50: 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29  ->type==REDUCE )
6d60: 7b 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d  {.    spx = apx-
6d70: 3e 73 70 3b 0a 20 20 20 20 73 70 79 20 3d 20 61  >sp;.    spy = a
6d80: 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79  py->x.rp->precsy
6d90: 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 79 3d 3d  m;.    if( spy==
6da0: 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30  0 || spx->prec<0
6db0: 20 7c 7c 20 73 70 79 2d 3e 70 72 65 63 3c 30 20   || spy->prec<0 
6dc0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ){.      /* Not 
6dd0: 65 6e 6f 75 67 68 20 70 72 65 63 65 64 65 6e 63  enough precedenc
6de0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a  e information. *
6df0: 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  /.      apy->typ
6e00: 65 20 3d 20 43 4f 4e 46 4c 49 43 54 3b 0a 20 20  e = CONFLICT;.  
6e10: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
6e20: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
6e30: 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72 65 63 20  >prec>spy->prec 
6e40: 29 7b 20 20 20 20 2f 2a 20 4c 6f 77 65 72 20 70  ){    /* Lower p
6e50: 72 65 63 65 64 65 6e 63 65 20 77 69 6e 73 20 2a  recedence wins *
6e60: 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  /.      apy->typ
6e70: 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b  e = RD_RESOLVED;
6e80: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
6e90: 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72  px->prec<spy->pr
6ea0: 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70 78 2d  ec ){.      apx-
6eb0: 3e 74 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c  >type = SH_RESOL
6ec0: 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  VED;.    }else i
6ed0: 66 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70  f( spx->prec==sp
6ee0: 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e  y->prec && spx->
6ef0: 61 73 73 6f 63 3d 3d 52 49 47 48 54 20 29 7b 20  assoc==RIGHT ){ 
6f00: 2f 2a 20 55 73 65 20 6f 70 65 72 61 74 6f 72 20  /* Use operator 
6f10: 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  */.      apy->ty
6f20: 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44  pe = RD_RESOLVED
6f30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6f50: 20 61 73 73 6f 63 69 61 74 69 76 69 74 79 20 2a   associativity *
6f60: 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  /.    }else if( 
6f70: 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e  spx->prec==spy->
6f80: 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73  prec && spx->ass
6f90: 6f 63 3d 3d 4c 45 46 54 20 29 7b 20 20 2f 2a 20  oc==LEFT ){  /* 
6fa0: 74 6f 20 62 72 65 61 6b 20 74 69 65 20 2a 2f 0a  to break tie */.
6fb0: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20        apx->type 
6fc0: 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20  = SH_RESOLVED;. 
6fd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6fe0: 61 73 73 65 72 74 28 20 73 70 78 2d 3e 70 72 65  assert( spx->pre
6ff0: 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20  c==spy->prec && 
7000: 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4e 4f 4e 45  spx->assoc==NONE
7010: 20 29 3b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   );.      apy->t
7020: 79 70 65 20 3d 20 43 4f 4e 46 4c 49 43 54 3b 0a  ype = CONFLICT;.
7030: 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a        errcnt++;.
7040: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
7050: 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44  ( apx->type==RED
7060: 55 43 45 20 26 26 20 61 70 79 2d 3e 74 79 70 65  UCE && apy->type
7070: 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  ==REDUCE ){.    
7080: 73 70 78 20 3d 20 61 70 78 2d 3e 78 2e 72 70 2d  spx = apx->x.rp-
7090: 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 73 70  >precsym;.    sp
70a0: 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70  y = apy->x.rp->p
70b0: 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28 20  recsym;.    if( 
70c0: 73 70 78 3d 3d 30 20 7c 7c 20 73 70 79 3d 3d 30  spx==0 || spy==0
70d0: 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30 20   || spx->prec<0 
70e0: 7c 7c 0a 20 20 20 20 73 70 79 2d 3e 70 72 65 63  ||.    spy->prec
70f0: 3c 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3d  <0 || spx->prec=
7100: 3d 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20  =spy->prec ){.  
7110: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
7120: 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20  CONFLICT;.      
7130: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65  errcnt++;.    }e
7140: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
7150: 63 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20  c>spy->prec ){. 
7160: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
7170: 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   RD_RESOLVED;.  
7180: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
7190: 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20  >prec<spy->prec 
71a0: 29 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79  ){.      apx->ty
71b0: 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44  pe = RD_RESOLVED
71c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
71d0: 0a 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 68 61  .    /* Can't ha
71e0: 70 70 65 6e 2e 20 20 53 68 69 66 74 73 20 68 61  ppen.  Shifts ha
71f0: 76 65 20 74 6f 20 63 6f 6d 65 20 62 65 66 6f 72  ve to come befor
7200: 65 20 52 65 64 75 63 65 73 20 6f 6e 20 74 68 65  e Reduces on the
7210: 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 62 65 63  .    ** list bec
7220: 61 75 73 65 20 74 68 65 20 72 65 64 75 63 65 73  ause the reduces
7230: 20 77 65 72 65 20 61 64 64 65 64 20 6c 61 73 74   were added last
7240: 2e 20 20 48 65 6e 63 65 2c 20 69 66 20 61 70 78  .  Hence, if apx
7250: 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 0a 20  ->type==REDUCE. 
7260: 20 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73     ** then it is
7270: 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20   impossible for 
7280: 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54  apy->type==SHIFT
7290: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
72a0: 20 65 72 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a   errcnt;.}./****
72b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72c0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
72d0: 22 63 6f 6e 66 69 67 6c 69 73 74 2e 63 22 20 2a  "configlist.c" *
72e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72f0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
7300: 52 6f 75 74 69 6e 65 73 20 74 6f 20 70 72 6f 63  Routines to proc
7310: 65 73 73 69 6e 67 20 61 20 63 6f 6e 66 69 67 75  essing a configu
7320: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20  ration list and 
7330: 62 75 69 6c 64 69 6e 67 20 61 20 73 74 61 74 65  building a state
7340: 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e  .** in the LEMON
7350: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
7360: 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 73 74  r..*/..static st
7370: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 66 72 65  ruct config *fre
7380: 65 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20  elist = 0;      
7390: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20  /* List of free 
73a0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a  configurations *
73b0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
73c0: 63 6f 6e 66 69 67 20 2a 63 75 72 72 65 6e 74 20  config *current 
73d0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f  = 0;       /* To
73e0: 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 63 6f 6e  p of list of con
73f0: 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  figurations */.s
7400: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
7410: 66 69 67 20 2a 2a 63 75 72 72 65 6e 74 65 6e 64  fig **currentend
7420: 20 3d 20 30 3b 20 20 20 2f 2a 20 4c 61 73 74 20   = 0;   /* Last 
7430: 6f 6e 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69  on list of confi
7440: 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  gs */.static str
7450: 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 61 73 69  uct config *basi
7460: 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  s = 0;         /
7470: 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66  * Top of list of
7480: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 73 20 2a   basis configs *
7490: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
74a0: 63 6f 6e 66 69 67 20 2a 2a 62 61 73 69 73 65 6e  config **basisen
74b0: 64 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 45 6e  d = 0;     /* En
74c0: 64 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73  d of list of bas
74d0: 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 0a 2f  is configs */../
74e0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
74f0: 65 72 20 74 6f 20 61 20 6e 65 77 20 63 6f 6e 66  er to a new conf
7500: 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49  iguration */.PRI
7510: 56 41 54 45 20 73 74 72 75 63 74 20 63 6f 6e 66  VATE struct conf
7520: 69 67 20 2a 6e 65 77 63 6f 6e 66 69 67 28 29 7b  ig *newconfig(){
7530: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
7540: 20 2a 6e 65 77 3b 0a 20 20 69 66 28 20 66 72 65   *new;.  if( fre
7550: 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
7560: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61  int i;.    int a
7570: 6d 74 20 3d 20 33 3b 0a 20 20 20 20 66 72 65 65  mt = 3;.    free
7580: 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20 63  list = (struct c
7590: 6f 6e 66 69 67 20 2a 29 6d 61 6c 6c 6f 63 28 20  onfig *)malloc( 
75a0: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 63 6f  sizeof(struct co
75b0: 6e 66 69 67 29 2a 61 6d 74 20 29 3b 0a 20 20 20  nfig)*amt );.   
75c0: 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30   if( freelist==0
75d0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
75e0: 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65  f(stderr,"Unable
75f0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
7600: 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 63 6f  ory for a new co
7610: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 22 29 3b 0a  nfiguration.");.
7620: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
7630: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
7640: 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20  ; i<amt-1; i++) 
7650: 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74  freelist[i].next
7660: 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31   = &freelist[i+1
7670: 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b  ];.    freelist[
7680: 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b  amt-1].next = 0;
7690: 0a 20 20 7d 0a 20 20 6e 65 77 20 3d 20 66 72 65  .  }.  new = fre
76a0: 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73  elist;.  freelis
76b0: 74 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65  t = freelist->ne
76c0: 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77  xt;.  return new
76d0: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 66  ;.}../* The conf
76e0: 69 67 75 72 61 74 69 6f 6e 20 22 6f 6c 64 22 20  iguration "old" 
76f0: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65  is no longer use
7700: 64 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  d */.PRIVATE voi
7710: 64 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 6f  d deleteconfig(o
7720: 6c 64 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  ld).struct confi
7730: 67 20 2a 6f 6c 64 3b 0a 7b 0a 20 20 6f 6c 64 2d  g *old;.{.  old-
7740: 3e 6e 65 78 74 20 3d 20 66 72 65 65 6c 69 73 74  >next = freelist
7750: 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20 6f  ;.  freelist = o
7760: 6c 64 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61  ld;.}../* Initia
7770: 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69 67  lized the config
7780: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75 69  uration list bui
7790: 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  lder */.void Con
77a0: 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 7b 0a  figlist_init(){.
77b0: 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20    current = 0;. 
77c0: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63   currentend = &c
77d0: 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69 73 20  urrent;.  basis 
77e0: 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20  = 0;.  basisend 
77f0: 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66  = &basis;.  Conf
7800: 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 29 3b 0a  igtable_init();.
7810: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
7820: 49 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20  Initialized the 
7830: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
7840: 73 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f  st builder */.vo
7850: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65  id Configlist_re
7860: 73 65 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74  set(){.  current
7870: 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65   = 0;.  currente
7880: 6e 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20  nd = &current;. 
7890: 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61   basis = 0;.  ba
78a0: 73 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b  sisend = &basis;
78b0: 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63  .  Configtable_c
78c0: 6c 65 61 72 28 30 29 3b 0a 20 20 72 65 74 75 72  lear(0);.  retur
78d0: 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 6e 6f  n;.}../* Add ano
78e0: 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69  ther configurati
78f0: 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67  on to the config
7900: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
7910: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
7920: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 72 70  onfiglist_add(rp
7930: 2c 64 6f 74 29 0a 73 74 72 75 63 74 20 72 75 6c  ,dot).struct rul
7940: 65 20 2a 72 70 3b 20 20 20 20 2f 2a 20 54 68 65  e *rp;    /* The
7950: 20 72 75 6c 65 20 2a 2f 0a 69 6e 74 20 64 6f 74   rule */.int dot
7960: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7970: 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 52  Index into the R
7980: 48 53 20 6f 66 20 74 68 65 20 72 75 6c 65 20 77  HS of the rule w
7990: 68 65 72 65 20 74 68 65 20 64 6f 74 20 67 6f 65  here the dot goe
79a0: 73 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63 74 20  s */.{.  struct 
79b0: 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64  config *cfp, mod
79c0: 65 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  el;..  assert( c
79d0: 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a  urrentend!=0 );.
79e0: 20 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b    model.rp = rp;
79f0: 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64  .  model.dot = d
7a00: 6f 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66  ot;.  cfp = Conf
7a10: 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f  igtable_find(&mo
7a20: 64 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d  del);.  if( cfp=
7a30: 3d 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20  =0 ){.    cfp = 
7a40: 6e 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20  newconfig();.   
7a50: 20 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20   cfp->rp = rp;. 
7a60: 20 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f     cfp->dot = do
7a70: 74 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20  t;.    cfp->fws 
7a80: 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20  = SetNew();.    
7a90: 63 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20  cfp->stp = 0;.  
7aa0: 20 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66    cfp->fplp = cf
7ab0: 70 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20  p->bplp = 0;.   
7ac0: 20 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a   cfp->next = 0;.
7ad0: 20 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b      cfp->bp = 0;
7ae0: 0a 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64  .    *currentend
7af0: 20 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72   = cfp;.    curr
7b00: 65 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e  entend = &cfp->n
7b10: 65 78 74 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74  ext;.    Configt
7b20: 61 62 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29  able_insert(cfp)
7b30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
7b40: 66 70 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20  fp;.}../* Add a 
7b50: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
7b60: 69 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69  ion to the confi
7b70: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  guration list */
7b80: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
7b90: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61  Configlist_addba
7ba0: 73 69 73 28 72 70 2c 64 6f 74 29 0a 73 74 72 75  sis(rp,dot).stru
7bb0: 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 69 6e 74  ct rule *rp;.int
7bc0: 20 64 6f 74 3b 0a 7b 0a 20 20 73 74 72 75 63 74   dot;.{.  struct
7bd0: 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f   config *cfp, mo
7be0: 64 65 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  del;..  assert( 
7bf0: 62 61 73 69 73 65 6e 64 21 3d 30 20 29 3b 0a 20  basisend!=0 );. 
7c00: 20 61 73 73 65 72 74 28 20 63 75 72 72 65 6e 74   assert( current
7c10: 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65  end!=0 );.  mode
7c20: 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64  l.rp = rp;.  mod
7c30: 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20  el.dot = dot;.  
7c40: 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c  cfp = Configtabl
7c50: 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a  e_find(&model);.
7c60: 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a    if( cfp==0 ){.
7c70: 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e      cfp = newcon
7c80: 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e  fig();.    cfp->
7c90: 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66 70  rp = rp;.    cfp
7ca0: 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20  ->dot = dot;.   
7cb0: 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e   cfp->fws = SetN
7cc0: 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73  ew();.    cfp->s
7cd0: 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d  tp = 0;.    cfp-
7ce0: 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c  >fplp = cfp->bpl
7cf0: 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e  p = 0;.    cfp->
7d00: 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 66  next = 0;.    cf
7d10: 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a  p->bp = 0;.    *
7d20: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66 70  currentend = cfp
7d30: 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e 64  ;.    currentend
7d40: 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20   = &cfp->next;. 
7d50: 20 20 20 2a 62 61 73 69 73 65 6e 64 20 3d 20 63     *basisend = c
7d60: 66 70 3b 0a 20 20 20 20 62 61 73 69 73 65 6e 64  fp;.    basisend
7d70: 20 3d 20 26 63 66 70 2d 3e 62 70 3b 0a 20 20 20   = &cfp->bp;.   
7d80: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73   Configtable_ins
7d90: 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20  ert(cfp);.  }.  
7da0: 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f  return cfp;.}../
7db0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6c  * Compute the cl
7dc0: 6f 73 75 72 65 20 6f 66 20 74 68 65 20 63 6f 6e  osure of the con
7dd0: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
7de0: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
7df0: 73 74 5f 63 6c 6f 73 75 72 65 28 6c 65 6d 70 29  st_closure(lemp)
7e00: 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
7e10: 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  emp;.{.  struct 
7e20: 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6e 65  config *cfp, *ne
7e30: 77 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 72  wcfp;.  struct r
7e40: 75 6c 65 20 2a 72 70 2c 20 2a 6e 65 77 72 70 3b  ule *rp, *newrp;
7e50: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
7e60: 20 2a 73 70 2c 20 2a 78 73 70 3b 0a 20 20 69 6e   *sp, *xsp;.  in
7e70: 74 20 69 2c 20 64 6f 74 3b 0a 0a 20 20 61 73 73  t i, dot;..  ass
7e80: 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21  ert( currentend!
7e90: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 63 66 70 3d  =0 );.  for(cfp=
7ea0: 63 75 72 72 65 6e 74 3b 20 63 66 70 3b 20 63 66  current; cfp; cf
7eb0: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=cfp->next){.  
7ec0: 20 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a    rp = cfp->rp;.
7ed0: 20 20 20 20 64 6f 74 20 3d 20 63 66 70 2d 3e 64      dot = cfp->d
7ee0: 6f 74 3b 0a 20 20 20 20 69 66 28 20 64 6f 74 3e  ot;.    if( dot>
7ef0: 3d 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74  =rp->nrhs ) cont
7f00: 69 6e 75 65 3b 0a 20 20 20 20 73 70 20 3d 20 72  inue;.    sp = r
7f10: 70 2d 3e 72 68 73 5b 64 6f 74 5d 3b 0a 20 20 20  p->rhs[dot];.   
7f20: 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e   if( sp->type==N
7f30: 4f 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  ONTERMINAL ){.  
7f40: 20 20 20 20 69 66 28 20 73 70 2d 3e 72 75 6c 65      if( sp->rule
7f50: 3d 3d 30 20 26 26 20 73 70 21 3d 6c 65 6d 70 2d  ==0 && sp!=lemp-
7f60: 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20  >errsym ){.     
7f70: 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
7f80: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 6c  ->filename,rp->l
7f90: 69 6e 65 2c 22 4e 6f 6e 74 65 72 6d 69 6e 61 6c  ine,"Nonterminal
7fa0: 20 5c 22 25 73 5c 22 20 68 61 73 20 6e 6f 20 72   \"%s\" has no r
7fb0: 75 6c 65 73 2e 22 2c 0a 20 20 20 20 20 20 20 20  ules.",.        
7fc0: 20 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20    sp->name);.   
7fd0: 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
7fe0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  cnt++;.      }. 
7ff0: 20 20 20 20 20 66 6f 72 28 6e 65 77 72 70 3d 73       for(newrp=s
8000: 70 2d 3e 72 75 6c 65 3b 20 6e 65 77 72 70 3b 20  p->rule; newrp; 
8010: 6e 65 77 72 70 3d 6e 65 77 72 70 2d 3e 6e 65 78  newrp=newrp->nex
8020: 74 6c 68 73 29 7b 0a 20 20 20 20 20 20 20 20 6e  tlhs){.        n
8030: 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69  ewcfp = Configli
8040: 73 74 5f 61 64 64 28 6e 65 77 72 70 2c 30 29 3b  st_add(newrp,0);
8050: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 64  .        for(i=d
8060: 6f 74 2b 31 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  ot+1; i<rp->nrhs
8070: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
8080: 20 20 78 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b    xsp = rp->rhs[
8090: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
80a0: 28 20 78 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52  ( xsp->type==TER
80b0: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
80c0: 20 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63       SetAdd(newc
80d0: 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 69 6e 64  fp->fws,xsp->ind
80e0: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ex);.           
80f0: 20 62 72 65 61 6b 3b 0a 09 20 20 7d 65 6c 73 65   break;..  }else
8100: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 65  {.            Se
8110: 74 55 6e 69 6f 6e 28 6e 65 77 63 66 70 2d 3e 66  tUnion(newcfp->f
8120: 77 73 2c 78 73 70 2d 3e 66 69 72 73 74 73 65 74  ws,xsp->firstset
8130: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
8140: 66 28 20 78 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d  f( xsp->lambda==
8150: 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09  FALSE ) break;..
8160: 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 20 20 69    }..}.        i
8170: 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29  f( i==rp->nrhs )
8180: 20 50 6c 69 6e 6b 5f 61 64 64 28 26 63 66 70 2d   Plink_add(&cfp-
8190: 3e 66 70 6c 70 2c 6e 65 77 63 66 70 29 3b 0a 20  >fplp,newcfp);. 
81a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
81b0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
81c0: 20 53 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67   Sort the config
81d0: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
81e0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
81f0: 73 6f 72 74 28 29 7b 0a 20 20 63 75 72 72 65 6e  sort(){.  curren
8200: 74 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66  t = (struct conf
8210: 69 67 20 2a 29 6d 73 6f 72 74 28 63 75 72 72 65  ig *)msort(curre
8220: 6e 74 2c 26 28 63 75 72 72 65 6e 74 2d 3e 6e 65  nt,&(current->ne
8230: 78 74 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a  xt),Configcmp);.
8240: 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30    currentend = 0
8250: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
8260: 2a 20 53 6f 72 74 20 74 68 65 20 62 61 73 69 73  * Sort the basis
8270: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
8280: 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  ist */.void Conf
8290: 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73  iglist_sortbasis
82a0: 28 29 7b 0a 20 20 62 61 73 69 73 20 3d 20 28 73  (){.  basis = (s
82b0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d  truct config *)m
82c0: 73 6f 72 74 28 63 75 72 72 65 6e 74 2c 26 28 63  sort(current,&(c
82d0: 75 72 72 65 6e 74 2d 3e 62 70 29 2c 43 6f 6e 66  urrent->bp),Conf
82e0: 69 67 63 6d 70 29 3b 0a 20 20 62 61 73 69 73 65  igcmp);.  basise
82f0: 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  nd = 0;.  return
8300: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
8310: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
8320: 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66  head of the conf
8330: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  iguration list a
8340: 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  nd.** reset the 
8350: 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63  list */.struct c
8360: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73  onfig *Configlis
8370: 74 5f 72 65 74 75 72 6e 28 29 7b 0a 20 20 73 74  t_return(){.  st
8380: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64  ruct config *old
8390: 3b 0a 20 20 6f 6c 64 20 3d 20 63 75 72 72 65 6e  ;.  old = curren
83a0: 74 3b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30  t;.  current = 0
83b0: 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d  ;.  currentend =
83c0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64   0;.  return old
83d0: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
83e0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
83f0: 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66  head of the conf
8400: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  iguration list a
8410: 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  nd.** reset the 
8420: 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63  list */.struct c
8430: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73  onfig *Configlis
8440: 74 5f 62 61 73 69 73 28 29 7b 0a 20 20 73 74 72  t_basis(){.  str
8450: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b  uct config *old;
8460: 0a 20 20 6f 6c 64 20 3d 20 62 61 73 69 73 3b 0a  .  old = basis;.
8470: 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62    basis = 0;.  b
8480: 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72  asisend = 0;.  r
8490: 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a  eturn old;.}../*
84a0: 20 46 72 65 65 20 61 6c 6c 20 65 6c 65 6d 65 6e   Free all elemen
84b0: 74 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ts of the given 
84c0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
84d0: 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  st */.void Confi
84e0: 67 6c 69 73 74 5f 65 61 74 28 63 66 70 29 0a 73  glist_eat(cfp).s
84f0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
8500: 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  p;.{.  struct co
8510: 6e 66 69 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20  nfig *nextcfp;. 
8520: 20 66 6f 72 28 3b 20 63 66 70 3b 20 63 66 70 3d   for(; cfp; cfp=
8530: 6e 65 78 74 63 66 70 29 7b 0a 20 20 20 20 6e 65  nextcfp){.    ne
8540: 78 74 63 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78  xtcfp = cfp->nex
8550: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  t;.    assert( c
8560: 66 70 2d 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20  fp->fplp==0 );. 
8570: 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e     assert( cfp->
8580: 62 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69  bplp==0 );.    i
8590: 66 28 20 63 66 70 2d 3e 66 77 73 20 29 20 53 65  f( cfp->fws ) Se
85a0: 74 46 72 65 65 28 63 66 70 2d 3e 66 77 73 29 3b  tFree(cfp->fws);
85b0: 0a 20 20 20 20 64 65 6c 65 74 65 63 6f 6e 66 69  .    deleteconfi
85c0: 67 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65  g(cfp);.  }.  re
85d0: 74 75 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  turn;.}./*******
85e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
85f0: 74 68 65 20 66 69 6c 65 20 22 65 72 72 6f 72 2e  the file "error.
8600: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
8610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8620: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  ****/./*.** Code
8630: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 65 72   for printing er
8640: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
8650: 0a 2f 2a 20 46 69 6e 64 20 61 20 67 6f 6f 64 20  ./* Find a good 
8660: 70 6c 61 63 65 20 74 6f 20 62 72 65 61 6b 20 22  place to break "
8670: 6d 73 67 22 20 73 6f 20 74 68 61 74 20 69 74 73  msg" so that its
8680: 20 6c 65 6e 67 74 68 20 69 73 20 61 74 20 6c 65   length is at le
8690: 61 73 74 20 22 6d 69 6e 22 0a 2a 2a 20 62 75 74  ast "min".** but
86a0: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 22 6d   no more than "m
86b0: 61 78 22 2e 20 20 4d 61 6b 65 20 74 68 65 20 70  ax".  Make the p
86c0: 6f 69 6e 74 20 61 73 20 63 6c 6f 73 65 20 74 6f  oint as close to
86d0: 20 6d 61 78 20 61 73 20 70 6f 73 73 69 62 6c 65   max as possible
86e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
86f0: 66 69 6e 64 62 72 65 61 6b 28 6d 73 67 2c 6d 69  findbreak(msg,mi
8700: 6e 2c 6d 61 78 29 0a 63 68 61 72 20 2a 6d 73 67  n,max).char *msg
8710: 3b 0a 69 6e 74 20 6d 69 6e 3b 0a 69 6e 74 20 6d  ;.int min;.int m
8720: 61 78 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 73 70  ax;.{.  int i,sp
8730: 6f 74 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20  ot;.  char c;.  
8740: 66 6f 72 28 69 3d 73 70 6f 74 3d 6d 69 6e 3b 20  for(i=spot=min; 
8750: 69 3c 3d 6d 61 78 3b 20 69 2b 2b 29 7b 0a 20 20  i<=max; i++){.  
8760: 20 20 63 20 3d 20 6d 73 67 5b 69 5d 3b 0a 20 20    c = msg[i];.  
8770: 20 20 69 66 28 20 63 3d 3d 27 5c 74 27 20 29 20    if( c=='\t' ) 
8780: 6d 73 67 5b 69 5d 20 3d 20 27 20 27 3b 0a 20 20  msg[i] = ' ';.  
8790: 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b    if( c=='\n' ){
87a0: 20 6d 73 67 5b 69 5d 20 3d 20 27 20 27 3b 20 73   msg[i] = ' '; s
87b0: 70 6f 74 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20  pot = i; break; 
87c0: 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29  }.    if( c==0 )
87d0: 7b 20 73 70 6f 74 20 3d 20 69 3b 20 62 72 65 61  { spot = i; brea
87e0: 6b 3b 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d  k; }.    if( c==
87f0: 27 2d 27 20 26 26 20 69 3c 6d 61 78 2d 31 20 29  '-' && i<max-1 )
8800: 20 73 70 6f 74 20 3d 20 69 2b 31 3b 0a 20 20 20   spot = i+1;.   
8810: 20 69 66 28 20 63 3d 3d 27 20 27 20 29 20 73 70   if( c==' ' ) sp
8820: 6f 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65  ot = i;.  }.  re
8830: 74 75 72 6e 20 73 70 6f 74 3b 0a 7d 0a 0a 2f 2a  turn spot;.}../*
8840: 0a 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 6d 65  .** The error me
8850: 73 73 61 67 65 20 69 73 20 73 70 6c 69 74 20 61  ssage is split a
8860: 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 20 6c  cross multiple l
8870: 69 6e 65 73 20 69 66 20 6e 65 63 65 73 73 61 72  ines if necessar
8880: 79 2e 20 20 54 68 65 0a 2a 2a 20 73 70 6c 69 74  y.  The.** split
8890: 73 20 6f 63 63 75 72 20 61 74 20 61 20 73 70 61  s occur at a spa
88a0: 63 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  ce, if there is 
88b0: 61 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  a space availabl
88c0: 65 20 6e 65 61 72 20 74 68 65 20 65 6e 64 0a 2a  e near the end.*
88d0: 2a 20 6f 66 20 74 68 65 20 6c 69 6e 65 2e 0a 2a  * of the line..*
88e0: 2f 0a 23 64 65 66 69 6e 65 20 45 52 52 4d 53 47  /.#define ERRMSG
88f0: 53 49 5a 45 20 20 31 30 30 30 30 20 2f 2a 20 48  SIZE  10000 /* H
8900: 6f 70 65 20 74 68 69 73 20 69 73 20 62 69 67 20  ope this is big 
8910: 65 6e 6f 75 67 68 2e 20 20 4e 6f 20 77 61 79 20  enough.  No way 
8920: 74 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 20 2a  to error check *
8930: 2f 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 57 49  /.#define LINEWI
8940: 44 54 48 20 20 20 20 20 20 37 39 20 2f 2a 20 4d  DTH      79 /* M
8950: 61 78 20 77 69 64 74 68 20 6f 66 20 61 6e 79 20  ax width of any 
8960: 6f 75 74 70 75 74 20 6c 69 6e 65 20 2a 2f 0a 23  output line */.#
8970: 64 65 66 69 6e 65 20 50 52 45 46 49 58 4c 49 4d  define PREFIXLIM
8980: 49 54 20 20 20 20 33 30 20 2f 2a 20 4d 61 78 20  IT    30 /* Max 
8990: 77 69 64 74 68 20 6f 66 20 74 68 65 20 70 72 65  width of the pre
89a0: 66 69 78 20 6f 6e 20 65 61 63 68 20 6c 69 6e 65  fix on each line
89b0: 20 2a 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73   */.void ErrorMs
89c0: 67 28 76 61 5f 61 6c 69 73 74 29 0a 76 61 5f 64  g(va_alist).va_d
89d0: 63 6c 0a 7b 0a 20 20 63 68 61 72 20 2a 66 69 6c  cl.{.  char *fil
89e0: 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6c 69 6e  ename;.  int lin
89f0: 65 6e 6f 3b 0a 20 20 63 68 61 72 20 2a 66 6f 72  eno;.  char *for
8a00: 6d 61 74 3b 0a 20 20 63 68 61 72 20 65 72 72 6d  mat;.  char errm
8a10: 73 67 5b 45 52 52 4d 53 47 53 49 5a 45 5d 3b 0a  sg[ERRMSGSIZE];.
8a20: 20 20 63 68 61 72 20 70 72 65 66 69 78 5b 50 52    char prefix[PR
8a30: 45 46 49 58 4c 49 4d 49 54 2b 31 30 5d 3b 0a 20  EFIXLIMIT+10];. 
8a40: 20 69 6e 74 20 65 72 72 6d 73 67 73 69 7a 65 3b   int errmsgsize;
8a50: 0a 20 20 69 6e 74 20 70 72 65 66 69 78 73 69 7a  .  int prefixsiz
8a60: 65 3b 0a 20 20 69 6e 74 20 61 76 61 69 6c 61 62  e;.  int availab
8a70: 6c 65 77 69 64 74 68 3b 0a 20 20 76 61 5f 6c 69  lewidth;.  va_li
8a80: 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 65 6e 64  st ap;.  int end
8a90: 2c 20 72 65 73 74 61 72 74 2c 20 62 61 73 65 3b  , restart, base;
8aa0: 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 29  ..  va_start(ap)
8ab0: 3b 0a 20 20 66 69 6c 65 6e 61 6d 65 20 3d 20 76  ;.  filename = v
8ac0: 61 5f 61 72 67 28 61 70 2c 63 68 61 72 2a 29 3b  a_arg(ap,char*);
8ad0: 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 76 61 5f 61  .  lineno = va_a
8ae0: 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 66 6f  rg(ap,int);.  fo
8af0: 72 6d 61 74 20 3d 20 76 61 5f 61 72 67 28 61 70  rmat = va_arg(ap
8b00: 2c 63 68 61 72 2a 29 3b 0a 20 20 2f 2a 20 50 72  ,char*);.  /* Pr
8b10: 65 70 61 72 65 20 61 20 70 72 65 66 69 78 20 74  epare a prefix t
8b20: 6f 20 62 65 20 70 72 65 70 65 6e 64 65 64 20 74  o be prepended t
8b30: 6f 20 65 76 65 72 79 20 6f 75 74 70 75 74 20 6c  o every output l
8b40: 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 6c 69 6e  ine */.  if( lin
8b50: 65 6e 6f 3e 30 20 29 7b 0a 20 20 20 20 73 70 72  eno>0 ){.    spr
8b60: 69 6e 74 66 28 70 72 65 66 69 78 2c 22 25 2e 2a  intf(prefix,"%.*
8b70: 73 3a 25 64 3a 20 22 2c 50 52 45 46 49 58 4c 49  s:%d: ",PREFIXLI
8b80: 4d 49 54 2d 31 30 2c 66 69 6c 65 6e 61 6d 65 2c  MIT-10,filename,
8b90: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65  lineno);.  }else
8ba0: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 70 72  {.    sprintf(pr
8bb0: 65 66 69 78 2c 22 25 2e 2a 73 3a 20 22 2c 50 52  efix,"%.*s: ",PR
8bc0: 45 46 49 58 4c 49 4d 49 54 2d 31 30 2c 66 69 6c  EFIXLIMIT-10,fil
8bd0: 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 72  ename);.  }.  pr
8be0: 65 66 69 78 73 69 7a 65 20 3d 20 73 74 72 6c 65  efixsize = strle
8bf0: 6e 28 70 72 65 66 69 78 29 3b 0a 20 20 61 76 61  n(prefix);.  ava
8c00: 69 6c 61 62 6c 65 77 69 64 74 68 20 3d 20 4c 49  ilablewidth = LI
8c10: 4e 45 57 49 44 54 48 20 2d 20 70 72 65 66 69 78  NEWIDTH - prefix
8c20: 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  size;..  /* Gene
8c30: 72 61 74 65 20 74 68 65 20 65 72 72 6f 72 20 6d  rate the error m
8c40: 65 73 73 61 67 65 20 2a 2f 0a 20 20 76 73 70 72  essage */.  vspr
8c50: 69 6e 74 66 28 65 72 72 6d 73 67 2c 66 6f 72 6d  intf(errmsg,form
8c60: 61 74 2c 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  at,ap);.  va_end
8c70: 28 61 70 29 3b 0a 20 20 65 72 72 6d 73 67 73 69  (ap);.  errmsgsi
8c80: 7a 65 20 3d 20 73 74 72 6c 65 6e 28 65 72 72 6d  ze = strlen(errm
8c90: 73 67 29 3b 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  sg);.  /* Remove
8ca0: 20 74 72 61 69 6c 69 6e 67 20 27 5c 6e 27 73 20   trailing '\n's 
8cb0: 66 72 6f 6d 20 74 68 65 20 65 72 72 6f 72 20 6d  from the error m
8cc0: 65 73 73 61 67 65 2e 20 2a 2f 0a 20 20 77 68 69  essage. */.  whi
8cd0: 6c 65 28 20 65 72 72 6d 73 67 73 69 7a 65 3e 30  le( errmsgsize>0
8ce0: 20 26 26 20 65 72 72 6d 73 67 5b 65 72 72 6d 73   && errmsg[errms
8cf0: 67 73 69 7a 65 2d 31 5d 3d 3d 27 5c 6e 27 20 29  gsize-1]=='\n' )
8d00: 7b 0a 20 20 20 20 20 65 72 72 6d 73 67 5b 2d 2d  {.     errmsg[--
8d10: 65 72 72 6d 73 67 73 69 7a 65 5d 20 3d 20 30 3b  errmsgsize] = 0;
8d20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e 74  .  }..  /* Print
8d30: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
8d40: 67 65 20 2a 2f 0a 20 20 62 61 73 65 20 3d 20 30  ge */.  base = 0
8d50: 3b 0a 20 20 77 68 69 6c 65 28 20 65 72 72 6d 73  ;.  while( errms
8d60: 67 5b 62 61 73 65 5d 21 3d 30 20 29 7b 0a 20 20  g[base]!=0 ){.  
8d70: 20 20 65 6e 64 20 3d 20 72 65 73 74 61 72 74 20    end = restart 
8d80: 3d 20 66 69 6e 64 62 72 65 61 6b 28 26 65 72 72  = findbreak(&err
8d90: 6d 73 67 5b 62 61 73 65 5d 2c 30 2c 61 76 61 69  msg[base],0,avai
8da0: 6c 61 62 6c 65 77 69 64 74 68 29 3b 0a 20 20 20  lablewidth);.   
8db0: 20 72 65 73 74 61 72 74 20 2b 3d 20 62 61 73 65   restart += base
8dc0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 65 72 72  ;.    while( err
8dd0: 6d 73 67 5b 72 65 73 74 61 72 74 5d 3d 3d 27 20  msg[restart]==' 
8de0: 27 20 29 20 72 65 73 74 61 72 74 2b 2b 3b 0a 20  ' ) restart++;. 
8df0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75     fprintf(stdou
8e00: 74 2c 22 25 73 25 2e 2a 73 5c 6e 22 2c 70 72 65  t,"%s%.*s\n",pre
8e10: 66 69 78 2c 65 6e 64 2c 26 65 72 72 6d 73 67 5b  fix,end,&errmsg[
8e20: 62 61 73 65 5d 29 3b 0a 20 20 20 20 62 61 73 65  base]);.    base
8e30: 20 3d 20 72 65 73 74 61 72 74 3b 0a 20 20 7d 0a   = restart;.  }.
8e40: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
8e50: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
8e60: 65 20 22 6d 61 69 6e 2e 63 22 20 2a 2a 2a 2a 2a  e "main.c" *****
8e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
8e90: 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20 70 72 6f 67  ./*.** Main prog
8ea0: 72 61 6d 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ram file for the
8eb0: 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
8ec0: 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20  nerator..*/../* 
8ed0: 52 65 70 6f 72 74 20 61 6e 20 6f 75 74 2d 6f 66  Report an out-of
8ee0: 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64 69 74 69 6f  -memory conditio
8ef0: 6e 20 61 6e 64 20 61 62 6f 72 74 2e 20 20 54 68  n and abort.  Th
8f00: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
8f10: 73 20 75 73 65 64 20 6d 6f 73 74 6c 79 20 62 79  s used mostly by
8f20: 20 74 68 65 20 22 4d 65 6d 6f 72 79 43 68 65 63   the "MemoryChec
8f30: 6b 22 20 6d 61 63 72 6f 20 69 6e 20 73 74 72 75  k" macro in stru
8f40: 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64 20 6d 65 6d  ct.h.*/.void mem
8f50: 6f 72 79 5f 65 72 72 6f 72 28 29 7b 0a 20 20 66  ory_error(){.  f
8f60: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f  printf(stderr,"O
8f70: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 20 41  ut of memory.  A
8f80: 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e 22 29 3b 0a  borting...\n");.
8f90: 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 0a 2f    exit(1);.}.../
8fa0: 2a 20 54 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  * The main progr
8fb0: 61 6d 2e 20 20 50 61 72 73 65 20 74 68 65 20 63  am.  Parse the c
8fc0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 6e 64 20  ommand line and 
8fd0: 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a 69 6e 74 20  do it... */.int 
8fe0: 6d 61 69 6e 28 61 72 67 63 2c 61 72 67 76 29 0a  main(argc,argv).
8ff0: 69 6e 74 20 61 72 67 63 3b 0a 63 68 61 72 20 2a  int argc;.char *
9000: 2a 61 72 67 76 3b 0a 7b 0a 20 20 73 74 61 74 69  *argv;.{.  stati
9010: 63 20 69 6e 74 20 76 65 72 73 69 6f 6e 20 3d 20  c int version = 
9020: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
9030: 72 70 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74  rpflag = 0;.  st
9040: 61 74 69 63 20 69 6e 74 20 62 61 73 69 73 66 6c  atic int basisfl
9050: 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ag = 0;.  static
9060: 20 69 6e 74 20 63 6f 6d 70 72 65 73 73 20 3d 20   int compress = 
9070: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
9080: 71 75 69 65 74 20 3d 20 30 3b 0a 20 20 73 74 61  quiet = 0;.  sta
9090: 74 69 63 20 69 6e 74 20 73 74 61 74 69 73 74 69  tic int statisti
90a0: 63 73 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  cs = 0;.  static
90b0: 20 69 6e 74 20 6d 68 66 6c 61 67 20 3d 20 30 3b   int mhflag = 0;
90c0: 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
90d0: 20 73 5f 6f 70 74 69 6f 6e 73 20 6f 70 74 69 6f   s_options optio
90e0: 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 4f 50  ns[] = {.    {OP
90f0: 54 5f 46 4c 41 47 2c 20 22 62 22 2c 20 28 63 68  T_FLAG, "b", (ch
9100: 61 72 2a 29 26 62 61 73 69 73 66 6c 61 67 2c 20  ar*)&basisflag, 
9110: 22 50 72 69 6e 74 20 6f 6e 6c 79 20 74 68 65 20  "Print only the 
9120: 62 61 73 69 73 20 69 6e 20 72 65 70 6f 72 74 2e  basis in report.
9130: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
9140: 47 2c 20 22 63 22 2c 20 28 63 68 61 72 2a 29 26  G, "c", (char*)&
9150: 63 6f 6d 70 72 65 73 73 2c 20 22 44 6f 6e 27 74  compress, "Don't
9160: 20 63 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63   compress the ac
9170: 74 69 6f 6e 20 74 61 62 6c 65 2e 22 7d 2c 0a 20  tion table."},. 
9180: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 67     {OPT_FLAG, "g
9190: 22 2c 20 28 63 68 61 72 2a 29 26 72 70 66 6c 61  ", (char*)&rpfla
91a0: 67 2c 20 22 50 72 69 6e 74 20 67 72 61 6d 6d 61  g, "Print gramma
91b0: 72 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f 6e  r without action
91c0: 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  s."},.    {OPT_F
91d0: 4c 41 47 2c 20 22 6d 22 2c 20 28 63 68 61 72 2a  LAG, "m", (char*
91e0: 29 26 6d 68 66 6c 61 67 2c 20 22 4f 75 74 70 75  )&mhflag, "Outpu
91f0: 74 20 61 20 6d 61 6b 65 68 65 61 64 65 72 73 20  t a makeheaders 
9200: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 22  compatible file"
9210: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
9220: 2c 20 22 71 22 2c 20 28 63 68 61 72 2a 29 26 71  , "q", (char*)&q
9230: 75 69 65 74 2c 20 22 28 51 75 69 65 74 29 20 44  uiet, "(Quiet) D
9240: 6f 6e 27 74 20 70 72 69 6e 74 20 74 68 65 20 72  on't print the r
9250: 65 70 6f 72 74 20 66 69 6c 65 2e 22 7d 2c 0a 20  eport file."},. 
9260: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 73     {OPT_FLAG, "s
9270: 22 2c 20 28 63 68 61 72 2a 29 26 73 74 61 74 69  ", (char*)&stati
9280: 73 74 69 63 73 2c 20 22 50 72 69 6e 74 20 70 61  stics, "Print pa
9290: 72 73 65 72 20 73 74 61 74 73 20 74 6f 20 73 74  rser stats to st
92a0: 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 22 7d  andard output."}
92b0: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
92c0: 20 22 78 22 2c 20 28 63 68 61 72 2a 29 26 76 65   "x", (char*)&ve
92d0: 72 73 69 6f 6e 2c 20 22 50 72 69 6e 74 20 74 68  rsion, "Print th
92e0: 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
92f0: 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  ."},.    {OPT_FL
9300: 41 47 2c 30 2c 30 2c 30 7d 0a 20 20 7d 3b 0a 20  AG,0,0,0}.  };. 
9310: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
9320: 20 6c 65 6d 6f 6e 20 6c 65 6d 3b 0a 0a 20 20 4f   lemon lem;..  O
9330: 70 74 49 6e 69 74 28 61 72 67 76 2c 6f 70 74 69  ptInit(argv,opti
9340: 6f 6e 73 2c 73 74 64 65 72 72 29 3b 0a 20 20 69  ons,stderr);.  i
9350: 66 28 20 76 65 72 73 69 6f 6e 20 29 7b 0a 20 20  f( version ){.  
9360: 20 20 20 70 72 69 6e 74 66 28 22 4c 65 6d 6f 6e     printf("Lemon
9370: 20 76 65 72 73 69 6f 6e 20 31 2e 30 5c 6e 22 29   version 1.0\n")
9380: 3b 0a 20 20 20 20 20 65 78 69 74 28 30 29 3b 20  ;.     exit(0); 
9390: 0a 20 20 7d 0a 20 20 69 66 28 20 4f 70 74 4e 41  .  }.  if( OptNA
93a0: 72 67 73 28 29 21 3d 31 20 29 7b 0a 20 20 20 20  rgs()!=1 ){.    
93b0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
93c0: 45 78 61 63 74 6c 79 20 6f 6e 65 20 66 69 6c 65  Exactly one file
93d0: 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
93e0: 20 72 65 71 75 69 72 65 64 2e 5c 6e 22 29 3b 0a   required.\n");.
93f0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
9400: 0a 20 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20  .  lem.errorcnt 
9410: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  = 0;..  /* Initi
9420: 61 6c 69 7a 65 20 74 68 65 20 6d 61 63 68 69 6e  alize the machin
9430: 65 20 2a 2f 0a 20 20 53 74 72 73 61 66 65 5f 69  e */.  Strsafe_i
9440: 6e 69 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f  nit();.  Symbol_
9450: 69 6e 69 74 28 29 3b 0a 20 20 53 74 61 74 65 5f  init();.  State_
9460: 69 6e 69 74 28 29 3b 0a 20 20 6c 65 6d 2e 61 72  init();.  lem.ar
9470: 67 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20  gv0 = argv[0];. 
9480: 20 6c 65 6d 2e 66 69 6c 65 6e 61 6d 65 20 3d 20   lem.filename = 
9490: 4f 70 74 41 72 67 28 30 29 3b 0a 20 20 6c 65 6d  OptArg(0);.  lem
94a0: 2e 62 61 73 69 73 66 6c 61 67 20 3d 20 62 61 73  .basisflag = bas
94b0: 69 73 66 6c 61 67 3b 0a 20 20 6c 65 6d 2e 6e 63  isflag;.  lem.nc
94c0: 6f 6e 66 6c 69 63 74 20 3d 20 30 3b 0a 20 20 6c  onflict = 0;.  l
94d0: 65 6d 2e 6e 61 6d 65 20 3d 20 6c 65 6d 2e 69 6e  em.name = lem.in
94e0: 63 6c 75 64 65 20 3d 20 6c 65 6d 2e 61 72 67 20  clude = lem.arg 
94f0: 3d 20 6c 65 6d 2e 74 6f 6b 65 6e 74 79 70 65 20  = lem.tokentype 
9500: 3d 20 6c 65 6d 2e 73 74 61 72 74 20 3d 20 30 3b  = lem.start = 0;
9510: 0a 20 20 6c 65 6d 2e 76 61 72 74 79 70 65 20 3d  .  lem.vartype =
9520: 20 30 3b 0a 20 20 6c 65 6d 2e 73 74 61 63 6b 73   0;.  lem.stacks
9530: 69 7a 65 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 65  ize = 0;.  lem.e
9540: 72 72 6f 72 20 3d 20 6c 65 6d 2e 6f 76 65 72 66  rror = lem.overf
9550: 6c 6f 77 20 3d 20 6c 65 6d 2e 66 61 69 6c 75 72  low = lem.failur
9560: 65 20 3d 20 6c 65 6d 2e 61 63 63 65 70 74 20 3d  e = lem.accept =
9570: 20 6c 65 6d 2e 74 6f 6b 65 6e 64 65 73 74 20 3d   lem.tokendest =
9580: 0a 20 20 20 20 20 6c 65 6d 2e 74 6f 6b 65 6e 70  .     lem.tokenp
9590: 72 65 66 69 78 20 3d 20 6c 65 6d 2e 6f 75 74 6e  refix = lem.outn
95a0: 61 6d 65 20 3d 20 6c 65 6d 2e 65 78 74 72 61 63  ame = lem.extrac
95b0: 6f 64 65 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 76  ode = 0;.  lem.v
95c0: 61 72 64 65 73 74 20 3d 20 30 3b 0a 20 20 6c 65  ardest = 0;.  le
95d0: 6d 2e 74 61 62 6c 65 73 69 7a 65 20 3d 20 30 3b  m.tablesize = 0;
95e0: 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 24  .  Symbol_new("$
95f0: 22 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d  ");.  lem.errsym
9600: 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 65   = Symbol_new("e
9610: 72 72 6f 72 22 29 3b 0a 0a 20 20 2f 2a 20 50 61  rror");..  /* Pa
9620: 72 73 65 20 74 68 65 20 69 6e 70 75 74 20 66 69  rse the input fi
9630: 6c 65 20 2a 2f 0a 20 20 50 61 72 73 65 28 26 6c  le */.  Parse(&l
9640: 65 6d 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 65  em);.  if( lem.e
9650: 72 72 6f 72 63 6e 74 20 29 20 65 78 69 74 28 6c  rrorcnt ) exit(l
9660: 65 6d 2e 65 72 72 6f 72 63 6e 74 29 3b 0a 20 20  em.errorcnt);.  
9670: 69 66 28 20 6c 65 6d 2e 72 75 6c 65 3d 3d 30 20  if( lem.rule==0 
9680: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
9690: 74 64 65 72 72 2c 22 45 6d 70 74 79 20 67 72 61  tderr,"Empty gra
96a0: 6d 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20 20 20 65  mmar.\n");.    e
96b0: 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  xit(1);.  }..  /
96c0: 2a 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e 64 65  * Count and inde
96d0: 78 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 6f 66  x the symbols of
96e0: 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a   the grammar */.
96f0: 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20    lem.nsymbol = 
9700: 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a  Symbol_count();.
9710: 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64    Symbol_new("{d
9720: 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c 65 6d  efault}");.  lem
9730: 2e 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d 62 6f  .symbols = Symbo
9740: 6c 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20 20 71  l_arrayof();.  q
9750: 73 6f 72 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73  sort(lem.symbols
9760: 2c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2b 31 2c 73  ,lem.nsymbol+1,s
9770: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
9780: 62 6f 6c 2a 29 2c 0a 20 20 20 20 20 20 20 20 28  bol*),.        (
9790: 69 6e 74 28 2a 29 28 29 29 53 79 6d 62 6f 6c 63  int(*)())Symbolc
97a0: 6d 70 70 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  mpp);.  for(i=0;
97b0: 20 69 3c 3d 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b   i<=lem.nsymbol;
97c0: 20 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c   i++) lem.symbol
97d0: 73 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b  s[i]->index = i;
97e0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 73 75 70  .  for(i=1; isup
97f0: 70 65 72 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b  per(lem.symbols[
9800: 69 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 3b 20 69 2b  i]->name[0]); i+
9810: 2b 29 3b 0a 20 20 6c 65 6d 2e 6e 74 65 72 6d 69  +);.  lem.ntermi
9820: 6e 61 6c 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 47  nal = i;..  /* G
9830: 65 6e 65 72 61 74 65 20 61 20 72 65 70 72 69 6e  enerate a reprin
9840: 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72  t of the grammar
9850: 2c 20 69 66 20 72 65 71 75 65 73 74 65 64 20 6f  , if requested o
9860: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
9870: 6e 65 20 2a 2f 0a 20 20 69 66 28 20 72 70 66 6c  ne */.  if( rpfl
9880: 61 67 20 29 7b 0a 20 20 20 20 52 65 70 72 69 6e  ag ){.    Reprin
9890: 74 28 26 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73 65  t(&lem);.  }else
98a0: 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
98b0: 69 7a 65 20 74 68 65 20 73 69 7a 65 20 66 6f 72  ize the size for
98c0: 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64 20   all follow and 
98d0: 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20  first sets */.  
98e0: 20 20 53 65 74 53 69 7a 65 28 6c 65 6d 2e 6e 74    SetSize(lem.nt
98f0: 65 72 6d 69 6e 61 6c 29 3b 0a 0a 20 20 20 20 2f  erminal);..    /
9900: 2a 20 46 69 6e 64 20 74 68 65 20 70 72 65 63 65  * Find the prece
9910: 64 65 6e 63 65 20 66 6f 72 20 65 76 65 72 79 20  dence for every 
9920: 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20  production rule 
9930: 28 74 68 61 74 20 68 61 73 20 6f 6e 65 29 20 2a  (that has one) *
9940: 2f 0a 20 20 20 20 46 69 6e 64 52 75 6c 65 50 72  /.    FindRulePr
9950: 65 63 65 64 65 6e 63 65 73 28 26 6c 65 6d 29 3b  ecedences(&lem);
9960: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
9970: 20 74 68 65 20 6c 61 6d 62 64 61 2d 6e 6f 6e 74   the lambda-nont
9980: 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 74 68 65  erminals and the
9990: 20 66 69 72 73 74 2d 73 65 74 73 20 66 6f 72 20   first-sets for 
99a0: 65 76 65 72 79 0a 20 20 20 20 2a 2a 20 6e 6f 6e  every.    ** non
99b0: 74 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20 20 20  terminal */.    
99c0: 46 69 6e 64 46 69 72 73 74 53 65 74 73 28 26 6c  FindFirstSets(&l
99d0: 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  em);..    /* Com
99e0: 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29 20 73  pute all LR(0) s
99f0: 74 61 74 65 73 2e 20 20 41 6c 73 6f 20 72 65 63  tates.  Also rec
9a00: 6f 72 64 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70  ord follow-set p
9a10: 72 6f 70 61 67 61 74 69 6f 6e 0a 20 20 20 20 2a  ropagation.    *
9a20: 2a 20 6c 69 6e 6b 73 20 73 6f 20 74 68 61 74 20  * links so that 
9a30: 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63  the follow-set c
9a40: 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c  an be computed l
9a50: 61 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65 6d 2e  ater */.    lem.
9a60: 6e 73 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  nstate = 0;.    
9a70: 46 69 6e 64 53 74 61 74 65 73 28 26 6c 65 6d 29  FindStates(&lem)
9a80: 3b 0a 20 20 20 20 6c 65 6d 2e 73 6f 72 74 65 64  ;.    lem.sorted
9a90: 20 3d 20 53 74 61 74 65 5f 61 72 72 61 79 6f 66   = State_arrayof
9aa0: 28 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 69 65 20  ();..    /* Tie 
9ab0: 75 70 20 6c 6f 6f 73 65 20 65 6e 64 73 20 6f 6e  up loose ends on
9ac0: 20 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e   the propagation
9ad0: 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20 20 46 69   links */.    Fi
9ae0: 6e 64 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b 0a 0a  ndLinks(&lem);..
9af0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
9b00: 68 65 20 66 6f 6c 6c 6f 77 20 73 65 74 20 6f 66  he follow set of
9b10: 20 65 76 65 72 79 20 72 65 64 75 63 69 62 6c 65   every reducible
9b20: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a   configuration *
9b30: 2f 0a 20 20 20 20 46 69 6e 64 46 6f 6c 6c 6f 77  /.    FindFollow
9b40: 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20  Sets(&lem);..   
9b50: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
9b60: 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f  action tables */
9b70: 0a 20 20 20 20 46 69 6e 64 41 63 74 69 6f 6e 73  .    FindActions
9b80: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
9b90: 43 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63 74  Compress the act
9ba0: 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ion tables */.  
9bb0: 20 20 69 66 28 20 63 6f 6d 70 72 65 73 73 3d 3d    if( compress==
9bc0: 30 20 29 20 43 6f 6d 70 72 65 73 73 54 61 62 6c  0 ) CompressTabl
9bd0: 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  es(&lem);..    /
9be0: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 72 65 70  * Generate a rep
9bf0: 6f 72 74 20 6f 66 20 74 68 65 20 70 61 72 73 65  ort of the parse
9c00: 72 20 67 65 6e 65 72 61 74 65 64 2e 20 20 28 74  r generated.  (t
9c10: 68 65 20 22 79 2e 6f 75 74 70 75 74 22 20 66 69  he "y.output" fi
9c20: 6c 65 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  le) */.    if( !
9c30: 71 75 69 65 74 20 29 20 52 65 70 6f 72 74 4f 75  quiet ) ReportOu
9c40: 74 70 75 74 28 26 6c 65 6d 29 3b 0a 0a 20 20 20  tput(&lem);..   
9c50: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
9c60: 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72   source code for
9c70: 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 20   the parser */. 
9c80: 20 20 20 52 65 70 6f 72 74 54 61 62 6c 65 28 26     ReportTable(&
9c90: 6c 65 6d 2c 20 6d 68 66 6c 61 67 29 3b 0a 0a 20  lem, mhflag);.. 
9ca0: 20 20 20 2f 2a 20 50 72 6f 64 75 63 65 20 61 20     /* Produce a 
9cb0: 68 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20  header file for 
9cc0: 75 73 65 20 62 79 20 74 68 65 20 73 63 61 6e 6e  use by the scann
9cd0: 65 72 2e 20 20 28 54 68 69 73 20 73 74 65 70 20  er.  (This step 
9ce0: 69 73 0a 20 20 20 20 2a 2a 20 6f 6d 69 74 74 65  is.    ** omitte
9cf0: 64 20 69 66 20 74 68 65 20 22 2d 6d 22 20 6f 70  d if the "-m" op
9d00: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 65 63  tion is used bec
9d10: 61 75 73 65 20 6d 61 6b 65 68 65 61 64 65 72 73  ause makeheaders
9d20: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e   will.    ** gen
9d30: 65 72 61 74 65 20 74 68 65 20 66 69 6c 65 20 66  erate the file f
9d40: 6f 72 20 75 73 2e 29 20 2a 2f 0a 20 20 20 20 69  or us.) */.    i
9d50: 66 28 20 21 6d 68 66 6c 61 67 20 29 20 52 65 70  f( !mhflag ) Rep
9d60: 6f 72 74 48 65 61 64 65 72 28 26 6c 65 6d 29 3b  ortHeader(&lem);
9d70: 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 69  .  }.  if( stati
9d80: 73 74 69 63 73 20 29 7b 0a 20 20 20 20 70 72 69  stics ){.    pri
9d90: 6e 74 66 28 22 50 61 72 73 65 72 20 73 74 61 74  ntf("Parser stat
9da0: 69 73 74 69 63 73 3a 20 25 64 20 74 65 72 6d 69  istics: %d termi
9db0: 6e 61 6c 73 2c 20 25 64 20 6e 6f 6e 74 65 72 6d  nals, %d nonterm
9dc0: 69 6e 61 6c 73 2c 20 25 64 20 72 75 6c 65 73 5c  inals, %d rules\
9dd0: 6e 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 74  n",.      lem.nt
9de0: 65 72 6d 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 73 79  erminal, lem.nsy
9df0: 6d 62 6f 6c 20 2d 20 6c 65 6d 2e 6e 74 65 72 6d  mbol - lem.nterm
9e00: 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29  inal, lem.nrule)
9e10: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 20  ;.    printf("  
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e30: 20 25 64 20 73 74 61 74 65 73 2c 20 25 64 20 70   %d states, %d p
9e40: 61 72 73 65 72 20 74 61 62 6c 65 20 65 6e 74 72  arser table entr
9e50: 69 65 73 2c 20 25 64 20 63 6f 6e 66 6c 69 63 74  ies, %d conflict
9e60: 73 5c 6e 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e  s\n",.      lem.
9e70: 6e 73 74 61 74 65 2c 20 6c 65 6d 2e 74 61 62 6c  nstate, lem.tabl
9e80: 65 73 69 7a 65 2c 20 6c 65 6d 2e 6e 63 6f 6e 66  esize, lem.nconf
9e90: 6c 69 63 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  lict);.  }.  if(
9ea0: 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 29   lem.nconflict )
9eb0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
9ec0: 64 65 72 72 2c 22 25 64 20 70 61 72 73 69 6e 67  derr,"%d parsing
9ed0: 20 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c   conflicts.\n",l
9ee0: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20  em.nconflict);. 
9ef0: 20 7d 0a 20 20 65 78 69 74 28 6c 65 6d 2e 65 72   }.  exit(lem.er
9f00: 72 6f 72 63 6e 74 20 2b 20 6c 65 6d 2e 6e 63 6f  rorcnt + lem.nco
9f10: 6e 66 6c 69 63 74 29 3b 0a 7d 0a 2f 2a 2a 2a 2a  nflict);.}./****
9f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9f30: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
9f40: 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  msort.c" *******
9f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9f60: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
9f70: 41 20 67 65 6e 65 72 69 63 20 6d 65 72 67 65 2d  A generic merge-
9f80: 73 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a  sort program..**
9f90: 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c 65  .** USAGE:.** Le
9fa0: 74 20 22 70 74 72 22 20 62 65 20 61 20 70 6f 69  t "ptr" be a poi
9fb0: 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20 73 74 72  nter to some str
9fc0: 75 63 74 75 72 65 20 77 68 69 63 68 20 69 73 20  ucture which is 
9fd0: 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 0a 2a  at the head of.*
9fe0: 2a 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61  * a null-termina
9ff0: 74 65 64 20 6c 69 73 74 2e 20 20 54 68 65 6e 20  ted list.  Then 
a000: 74 6f 20 73 6f 72 74 20 74 68 65 20 6c 69 73 74  to sort the list
a010: 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   call:.**.**    
a020: 20 70 74 72 20 3d 20 6d 73 6f 72 74 28 70 74 72   ptr = msort(ptr
a030: 2c 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63 6d  ,&(ptr->next),cm
a040: 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20  pfnc);.**.** In 
a050: 74 68 65 20 61 62 6f 76 65 2c 20 22 63 6d 70 66  the above, "cmpf
a060: 6e 63 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72  nc" is a pointer
a070: 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 77   to a function w
a080: 68 69 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a 2a  hich compares.**
a090: 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f   two instances o
a0a0: 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
a0b0: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20 69  and returns an i
a0c0: 6e 74 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a 2a  nteger, as in.**
a0d0: 20 73 74 72 63 6d 70 2e 20 20 54 68 65 20 73 65   strcmp.  The se
a0e0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
a0f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
a100: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
a110: 0a 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  .** second eleme
a120: 6e 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64  nt of the linked
a130: 20 6c 69 73 74 2e 20 20 54 68 69 73 20 61 64 64   list.  This add
a140: 72 65 73 73 20 69 73 20 75 73 65 64 20 74 6f 20  ress is used to 
a150: 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 6f  compute.** the o
a160: 66 66 73 65 74 20 74 6f 20 74 68 65 20 22 6e 65  ffset to the "ne
a170: 78 74 22 20 66 69 65 6c 64 20 77 69 74 68 69 6e  xt" field within
a180: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20   the structure. 
a190: 20 54 68 65 20 6f 66 66 73 65 74 20 74 6f 0a 2a   The offset to.*
a1a0: 2a 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65  * the "next" fie
a1b0: 6c 64 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  ld must be const
a1c0: 61 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74 72 75  ant for all stru
a1d0: 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 6c 69  ctures in the li
a1e0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75  st..**.** The fu
a1f0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
a200: 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 77 68 69   new pointer whi
a210: 63 68 20 69 73 20 74 68 65 20 68 65 61 64 20 6f  ch is the head o
a220: 66 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61 66  f the list.** af
a230: 74 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a 0a  ter sorting..**.
a240: 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a  ** ALGORITHM:.**
a250: 20 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f 0a   Merge-sort..*/.
a260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
a270: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
a280: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 69 6e  ext structure in
a290: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
a2a0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45 58  ..*/.#define NEX
a2b0: 54 28 41 29 20 28 2a 28 63 68 61 72 2a 2a 29 28  T(A) (*(char**)(
a2c0: 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
a2d0: 41 29 2b 6f 66 66 73 65 74 29 29 0a 0a 2f 2a 0a  A)+offset))../*.
a2e0: 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20  ** Inputs:.**   
a2f0: 61 3a 20 20 20 20 20 20 20 41 20 73 6f 72 74 65  a:       A sorte
a300: 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74  d, null-terminat
a310: 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20  ed linked list. 
a320: 20 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a   (May be null)..
a330: 2a 2a 20 20 20 62 3a 20 20 20 20 20 20 20 41 20  **   b:       A 
a340: 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72  sorted, null-ter
a350: 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c  minated linked l
a360: 69 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75  ist.  (May be nu
a370: 6c 6c 29 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20 20  ll)..**   cmp:  
a380: 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20     A pointer to 
a390: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  the comparison f
a3a0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20 6f 66  unction..**   of
a3b0: 66 73 65 74 3a 20 20 4f 66 66 73 65 74 20 69 6e  fset:  Offset in
a3c0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 74   the structure t
a3d0: 6f 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65  o the "next" fie
a3e0: 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ld..**.** Return
a3f0: 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70   Value:.**   A p
a400: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
a410: 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20 6c  ad of a sorted l
a420: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ist containing t
a430: 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20  he elements.**  
a440: 20 6f 66 20 62 6f 74 68 20 61 20 61 6e 64 20 62   of both a and b
a450: 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66 66  ..**.** Side eff
a460: 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20 22  ects:.**   The "
a470: 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20 66  next" pointers f
a480: 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  or elements in t
a490: 68 65 20 6c 69 73 74 73 20 61 20 61 6e 64 20 62  he lists a and b
a4a0: 20 61 72 65 0a 2a 2a 20 20 20 63 68 61 6e 67 65   are.**   change
a4b0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  d..*/.static cha
a4c0: 72 20 2a 6d 65 72 67 65 28 61 2c 62 2c 63 6d 70  r *merge(a,b,cmp
a4d0: 2c 6f 66 66 73 65 74 29 0a 63 68 61 72 20 2a 61  ,offset).char *a
a4e0: 3b 0a 63 68 61 72 20 2a 62 3b 0a 69 6e 74 20 28  ;.char *b;.int (
a4f0: 2a 63 6d 70 29 28 29 3b 0a 69 6e 74 20 6f 66 66  *cmp)();.int off
a500: 73 65 74 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 70  set;.{.  char *p
a510: 74 72 2c 20 2a 68 65 61 64 3b 0a 0a 20 20 69 66  tr, *head;..  if
a520: 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 68 65  ( a==0 ){.    he
a530: 61 64 20 3d 20 62 3b 0a 20 20 7d 65 6c 73 65 20  ad = b;.  }else 
a540: 69 66 28 20 62 3d 3d 30 20 29 7b 0a 20 20 20 20  if( b==0 ){.    
a550: 68 65 61 64 20 3d 20 61 3b 0a 20 20 7d 65 6c 73  head = a;.  }els
a560: 65 7b 0a 20 20 20 20 69 66 28 20 28 2a 63 6d 70  e{.    if( (*cmp
a570: 29 28 61 2c 62 29 3c 30 20 29 7b 0a 20 20 20 20  )(a,b)<0 ){.    
a580: 20 20 70 74 72 20 3d 20 61 3b 0a 20 20 20 20 20    ptr = a;.     
a590: 20 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20 20   a = NEXT(a);.  
a5a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
a5b0: 74 72 20 3d 20 62 3b 0a 20 20 20 20 20 20 62 20  tr = b;.      b 
a5c0: 3d 20 4e 45 58 54 28 62 29 3b 0a 20 20 20 20 7d  = NEXT(b);.    }
a5d0: 0a 20 20 20 20 68 65 61 64 20 3d 20 70 74 72 3b  .    head = ptr;
a5e0: 0a 20 20 20 20 77 68 69 6c 65 28 20 61 20 26 26  .    while( a &&
a5f0: 20 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20   b ){.      if( 
a600: 28 2a 63 6d 70 29 28 61 2c 62 29 3c 30 20 29 7b  (*cmp)(a,b)<0 ){
a610: 0a 20 20 20 20 20 20 20 20 4e 45 58 54 28 70 74  .        NEXT(pt
a620: 72 29 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  r) = a;.        
a630: 70 74 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20  ptr = a;.       
a640: 20 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20 20   a = NEXT(a);.  
a650: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a660: 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 62     NEXT(ptr) = b
a670: 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d 20  ;.        ptr = 
a680: 62 3b 0a 20 20 20 20 20 20 20 20 62 20 3d 20 4e  b;.        b = N
a690: 45 58 54 28 62 29 3b 0a 20 20 20 20 20 20 7d 0a  EXT(b);.      }.
a6a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 20      }.    if( a 
a6b0: 29 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61 3b  ) NEXT(ptr) = a;
a6c0: 0a 20 20 20 20 65 6c 73 65 20 20 20 20 4e 45 58  .    else    NEX
a6d0: 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 7d 0a  T(ptr) = b;.  }.
a6e0: 20 20 72 65 74 75 72 6e 20 68 65 61 64 3b 0a 7d    return head;.}
a6f0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a  ../*.** Inputs:.
a700: 2a 2a 20 20 20 6c 69 73 74 3a 20 20 20 20 20 20  **   list:      
a710: 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e  Pointer to a sin
a720: 67 6c 79 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 20  gly-linked list 
a730: 6f 66 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  of structures..*
a740: 2a 20 20 20 6e 65 78 74 3a 20 20 20 20 20 20 50  *   next:      P
a750: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 65  ointer to pointe
a760: 72 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 20  r to the second 
a770: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c  element of the l
a780: 69 73 74 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20 20  ist..**   cmp:  
a790: 20 20 20 20 20 41 20 63 6f 6d 70 61 72 69 73 6f       A compariso
a7a0: 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  n function..**.*
a7b0: 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a  * Return Value:.
a7c0: 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74  **   A pointer t
a7d0: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61 20  o the head of a 
a7e0: 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e 74  sorted list cont
a7f0: 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d 65  aining the eleme
a800: 6e 74 73 0a 2a 2a 20 20 20 6f 72 67 69 6e 61 6c  nts.**   orginal
a810: 6c 79 20 69 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ly in list..**.*
a820: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
a830: 2a 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22 20  **   The "next" 
a840: 70 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65  pointers for ele
a850: 6d 65 6e 74 73 20 69 6e 20 6c 69 73 74 20 61 72  ments in list ar
a860: 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 64  e changed..*/.#d
a870: 65 66 69 6e 65 20 4c 49 53 54 53 49 5a 45 20 33  efine LISTSIZE 3
a880: 30 0a 63 68 61 72 20 2a 6d 73 6f 72 74 28 6c 69  0.char *msort(li
a890: 73 74 2c 6e 65 78 74 2c 63 6d 70 29 0a 63 68 61  st,next,cmp).cha
a8a0: 72 20 2a 6c 69 73 74 3b 0a 63 68 61 72 20 2a 2a  r *list;.char **
a8b0: 6e 65 78 74 3b 0a 69 6e 74 20 28 2a 63 6d 70 29  next;.int (*cmp)
a8c0: 28 29 3b 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ();.{.  unsigned
a8d0: 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20 20   long offset;.  
a8e0: 63 68 61 72 20 2a 65 70 3b 0a 20 20 63 68 61 72  char *ep;.  char
a8f0: 20 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d 3b   *set[LISTSIZE];
a900: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66 73  .  int i;.  offs
a910: 65 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  et = (unsigned l
a920: 6f 6e 67 29 6e 65 78 74 20 2d 20 28 75 6e 73 69  ong)next - (unsi
a930: 67 6e 65 64 20 6c 6f 6e 67 29 6c 69 73 74 3b 0a  gned long)list;.
a940: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53    for(i=0; i<LIS
a950: 54 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65 74 5b  TSIZE; i++) set[
a960: 69 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  i] = 0;.  while(
a970: 20 6c 69 73 74 20 29 7b 0a 20 20 20 20 65 70 20   list ){.    ep 
a980: 3d 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69 73 74  = list;.    list
a990: 20 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b 0a 20   = NEXT(list);. 
a9a0: 20 20 20 4e 45 58 54 28 65 70 29 20 3d 20 30 3b     NEXT(ep) = 0;
a9b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
a9c0: 4c 49 53 54 53 49 5a 45 2d 31 20 26 26 20 73 65  LISTSIZE-1 && se
a9d0: 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  t[i]!=0; i++){. 
a9e0: 20 20 20 20 20 65 70 20 3d 20 6d 65 72 67 65 28       ep = merge(
a9f0: 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66  ep,set[i],cmp,of
aa00: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 65 74  fset);.      set
aa10: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
aa20: 20 20 20 73 65 74 5b 69 5d 20 3d 20 65 70 3b 0a     set[i] = ep;.
aa30: 20 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a 20 20    }.  ep = 0;.  
aa40: 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53  for(i=0; i<LISTS
aa50: 49 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20 73 65  IZE; i++) if( se
aa60: 74 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65 72 67  t[i] ) ep = merg
aa70: 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c  e(ep,set[i],cmp,
aa80: 6f 66 66 73 65 74 29 3b 0a 20 20 72 65 74 75 72  offset);.  retur
aa90: 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  n ep;.}./*******
aaa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aab0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
aac0: 22 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a  "option.c" *****
aad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aae0: 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 63 68  *****/.static ch
aaf0: 61 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61 74 69  ar **argv;.stati
ab00: 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f  c struct s_optio
ab10: 6e 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63 20 46  ns *op;.static F
ab20: 49 4c 45 20 2a 65 72 72 73 74 72 65 61 6d 3b 0a  ILE *errstream;.
ab30: 0a 23 64 65 66 69 6e 65 20 49 53 4f 50 54 28 58  .#define ISOPT(X
ab40: 29 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c 7c  ) ((X)[0]=='-'||
ab50: 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74 72  (X)[0]=='+'||str
ab60: 63 68 72 28 28 58 29 2c 27 3d 27 29 21 3d 30 29  chr((X),'=')!=0)
ab70: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  ../*.** Print th
ab80: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77  e command line w
ab90: 69 74 68 20 61 20 63 61 72 72 6f 74 20 70 6f 69  ith a carrot poi
aba0: 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6b 2d 74  nting to the k-t
abb0: 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f  h character.** o
abc0: 66 20 74 68 65 20 6e 2d 74 68 20 66 69 65 6c 64  f the n-th field
abd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
abe0: 20 65 72 72 6c 69 6e 65 28 6e 2c 6b 2c 65 72 72   errline(n,k,err
abf0: 29 0a 69 6e 74 20 6e 3b 0a 69 6e 74 20 6b 3b 0a  ).int n;.int k;.
ac00: 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69  FILE *err;.{.  i
ac10: 6e 74 20 73 70 63 6e 74 2c 20 69 3b 0a 20 20 73  nt spcnt, i;.  s
ac20: 70 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  pcnt = 0;.  if( 
ac30: 61 72 67 76 5b 30 5d 20 29 20 66 70 72 69 6e 74  argv[0] ) fprint
ac40: 66 28 65 72 72 2c 22 25 73 22 2c 61 72 67 76 5b  f(err,"%s",argv[
ac50: 30 5d 29 3b 0a 20 20 73 70 63 6e 74 20 3d 20 73  0]);.  spcnt = s
ac60: 74 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 20 2b  trlen(argv[0]) +
ac70: 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   1;.  for(i=1; i
ac80: 3c 6e 20 26 26 20 61 72 67 76 5b 69 5d 3b 20 69  <n && argv[i]; i
ac90: 2b 2b 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  ++){.    fprintf
aca0: 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76 5b  (err," %s",argv[
acb0: 69 5d 29 3b 0a 20 20 20 20 73 70 63 6e 74 20 2b  i]);.    spcnt +
acc0: 3d 20 73 74 72 6c 65 6e 28 61 72 67 76 5b 69 5d  = strlen(argv[i]
acd0: 2b 31 29 3b 0a 20 20 7d 0a 20 20 73 70 63 6e 74  +1);.  }.  spcnt
ace0: 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b 20 61   += k;.  for(; a
acf0: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 20 66 70 72  rgv[i]; i++) fpr
ad00: 69 6e 74 66 28 65 72 72 2c 22 20 25 73 22 2c 61  intf(err," %s",a
ad10: 72 67 76 5b 69 5d 29 3b 0a 20 20 69 66 28 20 73  rgv[i]);.  if( s
ad20: 70 63 6e 74 3c 32 30 20 29 7b 0a 20 20 20 20 66  pcnt<20 ){.    f
ad30: 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a  printf(err,"\n%*
ad40: 73 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c 73 70 63  s^-- here\n",spc
ad50: 6e 74 2c 22 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  nt,"");.  }else{
ad60: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
ad70: 2c 22 5c 6e 25 2a 73 68 65 72 65 20 2d 2d 5e 5c  ,"\n%*shere --^\
ad80: 6e 22 2c 73 70 63 6e 74 2d 37 2c 22 22 29 3b 0a  n",spcnt-7,"");.
ad90: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
ada0: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
adb0: 20 74 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d 73 77   the N-th non-sw
adc0: 69 74 63 68 20 61 72 67 75 6d 65 6e 74 2e 20 20  itch argument.  
add0: 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
ade0: 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67  N is out of rang
adf0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
ae00: 20 61 72 67 69 6e 64 65 78 28 6e 29 0a 69 6e 74   argindex(n).int
ae10: 20 6e 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   n;.{.  int i;. 
ae20: 20 69 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20   int dashdash = 
ae30: 30 3b 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30  0;.  if( argv!=0
ae40: 20 26 26 20 2a 61 72 67 76 21 3d 30 20 29 7b 0a   && *argv!=0 ){.
ae50: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67      for(i=1; arg
ae60: 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  v[i]; i++){.    
ae70: 20 20 69 66 28 20 64 61 73 68 64 61 73 68 20 7c    if( dashdash |
ae80: 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d  | !ISOPT(argv[i]
ae90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
aea0: 20 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69   n==0 ) return i
aeb0: 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20  ;.        n--;. 
aec0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
aed0: 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c   strcmp(argv[i],
aee0: 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64  "--")==0 ) dashd
aef0: 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ash = 1;.    }. 
af00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
af10: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 65  }..static char e
af20: 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64  msg[] = "Command
af30: 20 6c 69 6e 65 20 73 79 6e 74 61 78 20 65 72 72   line syntax err
af40: 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72  or: ";../*.** Pr
af50: 6f 63 65 73 73 20 61 20 66 6c 61 67 20 63 6f 6d  ocess a flag com
af60: 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65  mand line argume
af70: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
af80: 74 20 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 2c  t handleflags(i,
af90: 65 72 72 29 0a 69 6e 74 20 69 3b 0a 46 49 4c 45  err).int i;.FILE
afa0: 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 76   *err;.{.  int v
afb0: 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d  ;.  int errcnt =
afc0: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66   0;.  int j;.  f
afd0: 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61  or(j=0; op[j].la
afe0: 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  bel; j++){.    i
aff0: 66 28 20 73 74 72 63 6d 70 28 26 61 72 67 76 5b  f( strcmp(&argv[
b000: 69 5d 5b 31 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65  i][1],op[j].labe
b010: 6c 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  l)==0 ) break;. 
b020: 20 7d 0a 20 20 76 20 3d 20 61 72 67 76 5b 69 5d   }.  v = argv[i]
b030: 5b 30 5d 3d 3d 27 2d 27 20 3f 20 31 20 3a 20 30  [0]=='-' ? 1 : 0
b040: 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61  ;.  if( op[j].la
b050: 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  bel==0 ){.    if
b060: 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66  ( err ){.      f
b070: 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75 6e  printf(err,"%sun
b080: 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c  defined option.\
b090: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
b0a0: 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29  errline(i,1,err)
b0b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63  ;.    }.    errc
b0c0: 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  nt++;.  }else if
b0d0: 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50  ( op[j].type==OP
b0e0: 54 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a 28  T_FLAG ){.    *(
b0f0: 28 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29  (int*)op[j].arg)
b100: 20 3d 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = v;.  }else if
b110: 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50  ( op[j].type==OP
b120: 54 5f 46 46 4c 41 47 20 29 7b 0a 20 20 20 20 28  T_FFLAG ){.    (
b130: 2a 28 76 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b  *(void(*)())(op[
b140: 6a 5d 2e 61 72 67 29 29 28 76 29 3b 0a 20 20 7d  j].arg))(v);.  }
b150: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 65 72  else{.    if( er
b160: 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  r ){.      fprin
b170: 74 66 28 65 72 72 2c 22 25 73 6d 69 73 73 69 6e  tf(err,"%smissin
b180: 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 73 77  g argument on sw
b190: 69 74 63 68 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  itch.\n",emsg);.
b1a0: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
b1b0: 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  1,err);.    }.  
b1c0: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a    errcnt++;.  }.
b1d0: 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b    return errcnt;
b1e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73  .}../*.** Proces
b1f0: 73 20 61 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  s a command line
b200: 20 73 77 69 74 63 68 20 77 68 69 63 68 20 68 61   switch which ha
b210: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  s an argument..*
b220: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 6e  /.static int han
b230: 64 6c 65 73 77 69 74 63 68 28 69 2c 65 72 72 29  dleswitch(i,err)
b240: 0a 69 6e 74 20 69 3b 0a 46 49 4c 45 20 2a 65 72  .int i;.FILE *er
b250: 72 3b 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d 20  r;.{.  int lv = 
b260: 30 3b 0a 20 20 64 6f 75 62 6c 65 20 64 76 20 3d  0;.  double dv =
b270: 20 30 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73 76   0.0;.  char *sv
b280: 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63 68   = 0, *end;.  ch
b290: 61 72 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a 3b  ar *cp;.  int j;
b2a0: 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20  .  int errcnt = 
b2b0: 30 3b 0a 20 20 63 70 20 3d 20 73 74 72 63 68 72  0;.  cp = strchr
b2c0: 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20  (argv[i],'=');. 
b2d0: 20 2a 63 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28   *cp = 0;.  for(
b2e0: 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c  j=0; op[j].label
b2f0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
b300: 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 6f  strcmp(argv[i],o
b310: 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20 29  p[j].label)==0 )
b320: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a 63   break;.  }.  *c
b330: 70 20 3d 20 27 3d 27 3b 0a 20 20 69 66 28 20 6f  p = '=';.  if( o
b340: 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b  p[j].label==0 ){
b350: 0a 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a  .    if( err ){.
b360: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
b370: 72 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f  r,"%sundefined o
b380: 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b  ption.\n",emsg);
b390: 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69  .      errline(i
b3a0: 2c 30 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20  ,0,err);.    }. 
b3b0: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d     errcnt++;.  }
b3c0: 65 6c 73 65 7b 0a 20 20 20 20 63 70 2b 2b 3b 0a  else{.    cp++;.
b3d0: 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a      switch( op[j
b3e0: 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  ].type ){.      
b3f0: 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20  case OPT_FLAG:. 
b400: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46       case OPT_FF
b410: 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 69 66 28  LAG:.        if(
b420: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20   err ){.        
b430: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25    fprintf(err,"%
b440: 73 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73  soption requires
b450: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22   an argument.\n"
b460: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  ,emsg);.        
b470: 20 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72    errline(i,0,er
b480: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
b490: 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a        errcnt++;.
b4a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b4b0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42       case OPT_DB
b4c0: 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  L:.      case OP
b4d0: 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20  T_FDBL:.        
b4e0: 64 76 20 3d 20 73 74 72 74 6f 64 28 63 70 2c 26  dv = strtod(cp,&
b4f0: 65 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66  end);.        if
b500: 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20  ( *end ){.      
b510: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
b520: 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
b530: 74 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61  tf(err,"%sillega
b540: 6c 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 66  l character in f
b550: 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 61 72  loating-point ar
b560: 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29  gument.\n",emsg)
b570: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72  ;.            er
b580: 72 6c 69 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e  rline(i,((unsign
b590: 65 64 20 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e  ed long)end)-(un
b5a0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76  signed long)argv
b5b0: 5b 69 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20 20  [i],err);.      
b5c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b5d0: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  errcnt++;.      
b5e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
b5f0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
b600: 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73  T_INT:.      cas
b610: 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20  e OPT_FINT:.    
b620: 20 20 20 20 6c 76 20 3d 20 73 74 72 74 6f 6c 28      lv = strtol(
b630: 63 70 2c 26 65 6e 64 2c 30 29 3b 0a 20 20 20 20  cp,&end,0);.    
b640: 20 20 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a      if( *end ){.
b650: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72            if( er
b660: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
b670: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
b680: 69 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65  illegal characte
b690: 72 20 69 6e 20 69 6e 74 65 67 65 72 20 61 72 67  r in integer arg
b6a0: 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b  ument.\n",emsg);
b6b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72  .            err
b6c0: 6c 69 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e 65  line(i,((unsigne
b6d0: 64 20 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73  d long)end)-(uns
b6e0: 69 67 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b  igned long)argv[
b6f0: 69 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20  i],err);.       
b700: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65     }.          e
b710: 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  rrcnt++;.       
b720: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
b730: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
b740: 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65  _STR:.      case
b750: 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20   OPT_FSTR:.     
b760: 20 20 20 73 76 20 3d 20 63 70 3b 0a 20 20 20 20     sv = cp;.    
b770: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b780: 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b  .    switch( op[
b790: 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20  j].type ){.     
b7a0: 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a   case OPT_FLAG:.
b7b0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
b7c0: 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72  FLAG:.        br
b7d0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b7e0: 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20  OPT_DBL:.       
b7f0: 20 2a 28 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a   *(double*)(op[j
b800: 5d 2e 61 72 67 29 20 3d 20 64 76 3b 0a 20 20 20  ].arg) = dv;.   
b810: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b820: 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a    case OPT_FDBL:
b830: 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64  .        (*(void
b840: 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67  (*)())(op[j].arg
b850: 29 29 28 64 76 29 3b 0a 20 20 20 20 20 20 20 20  ))(dv);.        
b860: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b870: 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20  e OPT_INT:.     
b880: 20 20 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d     *(int*)(op[j]
b890: 2e 61 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20 20  .arg) = lv;.    
b8a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b8b0: 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a   case OPT_FINT:.
b8c0: 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28          (*(void(
b8d0: 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  *)())(op[j].arg)
b8e0: 29 28 28 69 6e 74 29 6c 76 29 3b 0a 20 20 20 20  )((int)lv);.    
b8f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b900: 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20   case OPT_STR:. 
b910: 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29         *(char**)
b920: 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 73 76  (op[j].arg) = sv
b930: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
b940: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
b950: 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 28 2a  FSTR:.        (*
b960: 28 76 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a  (void(*)())(op[j
b970: 5d 2e 61 72 67 29 29 28 73 76 29 3b 0a 20 20 20  ].arg))(sv);.   
b980: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b990: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65  }.  }.  return e
b9a0: 72 72 63 6e 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70  rrcnt;.}..int Op
b9b0: 74 49 6e 69 74 28 61 2c 6f 2c 65 72 72 29 0a 63  tInit(a,o,err).c
b9c0: 68 61 72 20 2a 2a 61 3b 0a 73 74 72 75 63 74 20  har **a;.struct 
b9d0: 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 3b 0a 46 49  s_options *o;.FI
b9e0: 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74  LE *err;.{.  int
b9f0: 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61   errcnt = 0;.  a
ba00: 72 67 76 20 3d 20 61 3b 0a 20 20 6f 70 20 3d 20  rgv = a;.  op = 
ba10: 6f 3b 0a 20 20 65 72 72 73 74 72 65 61 6d 20 3d  o;.  errstream =
ba20: 20 65 72 72 3b 0a 20 20 69 66 28 20 61 72 67 76   err;.  if( argv
ba30: 20 26 26 20 2a 61 72 67 76 20 26 26 20 6f 70 20   && *argv && op 
ba40: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
ba50: 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b    for(i=1; argv[
ba60: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
ba70: 69 66 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d  if( argv[i][0]==
ba80: 27 2b 27 20 7c 7c 20 61 72 67 76 5b 69 5d 5b 30  '+' || argv[i][0
ba90: 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
baa0: 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64    errcnt += hand
bab0: 6c 65 66 6c 61 67 73 28 69 2c 65 72 72 29 3b 0a  leflags(i,err);.
bac0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
bad0: 73 74 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27  strchr(argv[i],'
bae0: 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65  =') ){.        e
baf0: 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 73  rrcnt += handles
bb00: 77 69 74 63 68 28 69 2c 65 72 72 29 3b 0a 20 20  witch(i,err);.  
bb10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
bb20: 20 20 69 66 28 20 65 72 72 63 6e 74 3e 30 20 29    if( errcnt>0 )
bb30: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72  {.    fprintf(er
bb40: 72 2c 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e 64  r,"Valid command
bb50: 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66 6f   line options fo
bb60: 72 20 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e 22  r \"%s\" are:\n"
bb70: 2c 2a 61 29 3b 0a 20 20 20 20 4f 70 74 50 72 69  ,*a);.    OptPri
bb80: 6e 74 28 29 3b 0a 20 20 20 20 65 78 69 74 28 31  nt();.    exit(1
bb90: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
bba0: 30 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41 72  0;.}..int OptNAr
bbb0: 67 73 28 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  gs(){.  int cnt 
bbc0: 3d 20 30 3b 0a 20 20 69 6e 74 20 64 61 73 68 64  = 0;.  int dashd
bbd0: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
bbe0: 3b 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20  ;.  if( argv!=0 
bbf0: 26 26 20 61 72 67 76 5b 30 5d 21 3d 30 20 29 7b  && argv[0]!=0 ){
bc00: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72  .    for(i=1; ar
bc10: 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  gv[i]; i++){.   
bc20: 20 20 20 69 66 28 20 64 61 73 68 64 61 73 68 20     if( dashdash 
bc30: 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69  || !ISOPT(argv[i
bc40: 5d 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20  ]) ) cnt++;.    
bc50: 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
bc60: 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20  v[i],"--")==0 ) 
bc70: 64 61 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20  dashdash = 1;.  
bc80: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
bc90: 20 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f   cnt;.}..char *O
bca0: 70 74 41 72 67 28 6e 29 0a 69 6e 74 20 6e 3b 0a  ptArg(n).int n;.
bcb0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
bcc0: 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20   argindex(n);.  
bcd0: 72 65 74 75 72 6e 20 69 3e 3d 30 20 3f 20 61 72  return i>=0 ? ar
bce0: 67 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f  gv[i] : 0;.}..vo
bcf0: 69 64 20 4f 70 74 45 72 72 28 6e 29 0a 69 6e 74  id OptErr(n).int
bd00: 20 6e 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   n;.{.  int i;. 
bd10: 20 69 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29   i = argindex(n)
bd20: 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 65  ;.  if( i>=0 ) e
bd30: 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 73 74  rrline(i,0,errst
bd40: 72 65 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f  ream);.}..void O
bd50: 70 74 50 72 69 6e 74 28 29 7b 0a 20 20 69 6e 74  ptPrint(){.  int
bd60: 20 69 3b 0a 20 20 69 6e 74 20 6d 61 78 2c 20 6c   i;.  int max, l
bd70: 65 6e 3b 0a 20 20 6d 61 78 20 3d 20 30 3b 0a 20  en;.  max = 0;. 
bd80: 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e   for(i=0; op[i].
bd90: 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  label; i++){.   
bda0: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6f 70   len = strlen(op
bdb0: 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b 20 31 3b 0a  [i].label) + 1;.
bdc0: 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 69      switch( op[i
bdd0: 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  ].type ){.      
bde0: 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20  case OPT_FLAG:. 
bdf0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46       case OPT_FF
be00: 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65  LAG:.        bre
be10: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
be20: 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61  PT_INT:.      ca
be30: 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20  se OPT_FINT:.   
be40: 20 20 20 20 20 6c 65 6e 20 2b 3d 20 39 3b 20 20       len += 9;  
be50: 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f       /* length o
be60: 66 20 22 3c 69 6e 74 65 67 65 72 3e 22 20 2a 2f  f "<integer>" */
be70: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
be80: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44        case OPT_D
be90: 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  BL:.      case O
bea0: 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20  PT_FDBL:.       
beb0: 20 6c 65 6e 20 2b 3d 20 36 3b 20 20 20 20 20 20   len += 6;      
bec0: 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c   /* length of "<
bed0: 72 65 61 6c 3e 22 20 2a 2f 0a 20 20 20 20 20 20  real>" */.      
bee0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bef0: 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20  ase OPT_STR:.   
bf00: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52     case OPT_FSTR
bf10: 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d  :.        len +=
bf20: 20 38 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e   8;       /* len
bf30: 67 74 68 20 6f 66 20 22 3c 73 74 72 69 6e 67 3e  gth of "<string>
bf40: 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  " */.        bre
bf50: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
bf60: 28 20 6c 65 6e 3e 6d 61 78 20 29 20 6d 61 78 20  ( len>max ) max 
bf70: 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72  = len;.  }.  for
bf80: 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65  (i=0; op[i].labe
bf90: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69  l; i++){.    swi
bfa0: 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20  tch( op[i].type 
bfb0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  ){.      case OP
bfc0: 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61  T_FLAG:.      ca
bfd0: 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20  se OPT_FFLAG:.  
bfe0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
bff0: 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 2d 2a 73  rstream,"  -%-*s
c000: 20 20 25 73 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69    %s\n",max,op[i
c010: 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65  ].label,op[i].me
c020: 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
c030: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c040: 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20  e OPT_INT:.     
c050: 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a   case OPT_FINT:.
c060: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
c070: 65 72 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d  errstream,"  %s=
c080: 3c 69 6e 74 65 67 65 72 3e 25 2a 73 20 20 25 73  <integer>%*s  %s
c090: 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c  \n",op[i].label,
c0a0: 0a 20 20 20 20 20 20 20 20 20 20 6d 61 78 2d 73  .          max-s
c0b0: 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65  trlen(op[i].labe
c0c0: 6c 29 2d 39 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65  l)-9,"",op[i].me
c0d0: 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
c0e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c0f0: 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20  e OPT_DBL:.     
c100: 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a   case OPT_FDBL:.
c110: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
c120: 65 72 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d  errstream,"  %s=
c130: 3c 72 65 61 6c 3e 25 2a 73 20 20 25 73 5c 6e 22  <real>%*s  %s\n"
c140: 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20  ,op[i].label,.  
c150: 20 20 20 20 20 20 20 20 6d 61 78 2d 73 74 72 6c          max-strl
c160: 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d  en(op[i].label)-
c170: 36 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61  6,"",op[i].messa
c180: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ge);.        bre
c190: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
c1a0: 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61  PT_STR:.      ca
c1b0: 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20  se OPT_FSTR:.   
c1c0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
c1d0: 73 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 73 74  stream,"  %s=<st
c1e0: 72 69 6e 67 3e 25 2a 73 20 20 25 73 5c 6e 22 2c  ring>%*s  %s\n",
c1f0: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20  op[i].label,.   
c200: 20 20 20 20 20 20 20 6d 61 78 2d 73 74 72 6c 65         max-strle
c210: 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 38  n(op[i].label)-8
c220: 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67  ,"",op[i].messag
c230: 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
c240: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f  k;.    }.  }.}./
c250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c260: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
c270: 20 66 69 6c 65 20 22 70 61 72 73 65 2e 63 22 20   file "parse.c" 
c280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
c2a0: 0a 2a 2a 20 49 6e 70 75 74 20 66 69 6c 65 20 70  .** Input file p
c2b0: 61 72 73 65 72 20 66 6f 72 20 74 68 65 20 4c 45  arser for the LE
c2c0: 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
c2d0: 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68 65  ator..*/../* The
c2e0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
c2f0: 72 73 65 72 20 2a 2f 0a 73 74 72 75 63 74 20 70  rser */.struct p
c300: 73 74 61 74 65 20 7b 0a 20 20 63 68 61 72 20 2a  state {.  char *
c310: 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  filename;       
c320: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
c330: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69  nput file */.  i
c340: 6e 74 20 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 20  nt tokenlineno; 
c350: 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62       /* Linenumb
c360: 65 72 20 61 74 20 77 68 69 63 68 20 63 75 72 72  er at which curr
c370: 65 6e 74 20 74 6f 6b 65 6e 20 73 74 61 72 74 73  ent token starts
c380: 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f 72 63   */.  int errorc
c390: 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  nt;         /* N
c3a0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
c3b0: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68 61 72  so far */.  char
c3c0: 20 2a 74 6f 6b 65 6e 73 74 61 72 74 3b 20 20 20   *tokenstart;   
c3d0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 63 75 72    /* Text of cur
c3e0: 72 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  rent token */.  
c3f0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67 70  struct lemon *gp
c400: 3b 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20  ;     /* Global 
c410: 73 74 61 74 65 20 76 65 63 74 6f 72 20 2a 2f 0a  state vector */.
c420: 20 20 65 6e 75 6d 20 65 5f 73 74 61 74 65 20 7b    enum e_state {
c430: 0a 20 20 20 20 49 4e 49 54 49 41 4c 49 5a 45 2c  .    INITIALIZE,
c440: 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  .    WAITING_FOR
c450: 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c 0a 20  _DECL_OR_RULE,. 
c460: 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44     WAITING_FOR_D
c470: 45 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a 20 20 20  ECL_KEYWORD,.   
c480: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
c490: 4c 5f 41 52 47 2c 0a 20 20 20 20 57 41 49 54 49  L_ARG,.    WAITI
c4a0: 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43  NG_FOR_PRECEDENC
c4b0: 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20 20 57 41  E_SYMBOL,.    WA
c4c0: 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 2c  ITING_FOR_ARROW,
c4d0: 0a 20 20 20 20 49 4e 5f 52 48 53 2c 0a 20 20 20  .    IN_RHS,.   
c4e0: 20 4c 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20   LHS_ALIAS_1,.  
c4f0: 20 20 4c 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20    LHS_ALIAS_2,. 
c500: 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 33 2c 0a     LHS_ALIAS_3,.
c510: 20 20 20 20 52 48 53 5f 41 4c 49 41 53 5f 31 2c      RHS_ALIAS_1,
c520: 0a 20 20 20 20 52 48 53 5f 41 4c 49 41 53 5f 32  .    RHS_ALIAS_2
c530: 2c 0a 20 20 20 20 50 52 45 43 45 44 45 4e 43 45  ,.    PRECEDENCE
c540: 5f 4d 41 52 4b 5f 31 2c 0a 20 20 20 20 50 52 45  _MARK_1,.    PRE
c550: 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c 0a  CEDENCE_MARK_2,.
c560: 20 20 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52      RESYNC_AFTER
c570: 5f 52 55 4c 45 5f 45 52 52 4f 52 2c 0a 20 20 20  _RULE_ERROR,.   
c580: 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
c590: 43 4c 5f 45 52 52 4f 52 2c 0a 20 20 20 20 57 41  CL_ERROR,.    WA
c5a0: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55  ITING_FOR_DESTRU
c5b0: 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20  CTOR_SYMBOL,.   
c5c0: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54   WAITING_FOR_DAT
c5d0: 41 54 59 50 45 5f 53 59 4d 42 4f 4c 0a 20 20 7d  ATYPE_SYMBOL.  }
c5e0: 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20   state;         
c5f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c600: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
c610: 72 73 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74  rser */.  struct
c620: 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20   symbol *lhs;   
c630: 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e       /* Left-han
c640: 64 20 73 69 64 65 20 6f 66 20 63 75 72 72 65 6e  d side of curren
c650: 74 20 72 75 6c 65 20 2a 2f 0a 20 20 63 68 61 72  t rule */.  char
c660: 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 20   *lhsalias;     
c670: 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20         /* Alias 
c680: 66 6f 72 20 74 68 65 20 4c 48 53 20 2a 2f 0a 20  for the LHS */. 
c690: 20 69 6e 74 20 6e 72 68 73 3b 20 20 20 20 20 20   int nrhs;      
c6a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c6b0: 75 6d 62 65 72 20 6f 66 20 72 69 67 68 74 2d 68  umber of right-h
c6c0: 61 6e 64 20 73 69 64 65 20 73 79 6d 62 6f 6c 73  and side symbols
c6d0: 20 73 65 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63   seen */.  struc
c6e0: 74 20 73 79 6d 62 6f 6c 20 2a 72 68 73 5b 4d 41  t symbol *rhs[MA
c6f0: 58 52 48 53 5d 3b 20 20 2f 2a 20 52 48 53 20 73  XRHS];  /* RHS s
c700: 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72  ymbols */.  char
c710: 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d 3b   *alias[MAXRHS];
c720: 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 65         /* Aliase
c730: 73 20 66 6f 72 20 65 61 63 68 20 52 48 53 20 73  s for each RHS s
c740: 79 6d 62 6f 6c 20 28 6f 72 20 4e 55 4c 4c 29 20  ymbol (or NULL) 
c750: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
c760: 20 2a 70 72 65 76 72 75 6c 65 3b 20 20 20 20 20   *prevrule;     
c770: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 75 6c 65  /* Previous rule
c780: 20 70 61 72 73 65 64 20 2a 2f 0a 20 20 63 68 61   parsed */.  cha
c790: 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b 20  r *declkeyword; 
c7a0: 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 77 6f          /* Keywo
c7b0: 72 64 20 6f 66 20 61 20 64 65 63 6c 61 72 61 74  rd of a declarat
c7c0: 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ion */.  char **
c7d0: 64 65 63 6c 61 72 67 73 6c 6f 74 3b 20 20 20 20  declargslot;    
c7e0: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68 65      /* Where the
c7f0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 61 72 67   declaration arg
c800: 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20  ument should be 
c810: 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 64 65  put */.  int *de
c820: 63 6c 6c 6e 73 6c 6f 74 3b 20 20 20 20 20 20 20  cllnslot;       
c830: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68 65      /* Where the
c840: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6c 69 6e   declaration lin
c850: 65 6e 75 6d 62 65 72 20 69 73 20 70 75 74 20 2a  enumber is put *
c860: 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63  /.  enum e_assoc
c870: 20 64 65 63 6c 61 73 73 6f 63 3b 20 20 20 20 2f   declassoc;    /
c880: 2a 20 41 73 73 69 67 6e 20 74 68 69 73 20 61 73  * Assign this as
c890: 73 6f 63 69 61 74 69 6f 6e 20 74 6f 20 64 65 63  sociation to dec
c8a0: 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  l arguments */. 
c8b0: 20 69 6e 74 20 70 72 65 63 63 6f 75 6e 74 65 72   int preccounter
c8c0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
c8d0: 73 73 69 67 6e 20 74 68 69 73 20 70 72 65 63 65  ssign this prece
c8e0: 64 65 6e 63 65 20 74 6f 20 64 65 63 6c 20 61 72  dence to decl ar
c8f0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74 72  guments */.  str
c900: 75 63 74 20 72 75 6c 65 20 2a 66 69 72 73 74 72  uct rule *firstr
c910: 75 6c 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ule;    /* Point
c920: 65 72 20 74 6f 20 66 69 72 73 74 20 72 75 6c 65  er to first rule
c930: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
c940: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
c950: 20 2a 6c 61 73 74 72 75 6c 65 3b 20 20 20 20 20   *lastrule;     
c960: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
c970: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
c980: 70 61 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a 7d  parsed rule */.}
c990: 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20 73 69  ;../* Parse a si
c9a0: 6e 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74  ngle token */.st
c9b0: 61 74 69 63 20 76 6f 69 64 20 70 61 72 73 65 6f  atic void parseo
c9c0: 6e 65 74 6f 6b 65 6e 28 70 73 70 29 0a 73 74 72  netoken(psp).str
c9d0: 75 63 74 20 70 73 74 61 74 65 20 2a 70 73 70 3b  uct pstate *psp;
c9e0: 0a 7b 0a 20 20 63 68 61 72 20 2a 78 3b 0a 20 20  .{.  char *x;.  
c9f0: 78 20 3d 20 53 74 72 73 61 66 65 28 70 73 70 2d  x = Strsafe(psp-
ca00: 3e 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20 20 20  >tokenstart);   
ca10: 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 74 6f    /* Save the to
ca20: 6b 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20  ken permanently 
ca30: 2a 2f 0a 23 69 66 20 30 0a 20 20 70 72 69 6e 74  */.#if 0.  print
ca40: 66 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d  f("%s:%d: Token=
ca50: 5b 25 73 5d 20 73 74 61 74 65 3d 25 64 5c 6e 22  [%s] state=%d\n"
ca60: 2c 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  ,psp->filename,p
ca70: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
ca80: 0a 20 20 20 20 78 2c 70 73 70 2d 3e 73 74 61 74  .    x,psp->stat
ca90: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 77 69  e);.#endif.  swi
caa0: 74 63 68 28 20 70 73 70 2d 3e 73 74 61 74 65 20  tch( psp->state 
cab0: 29 7b 0a 20 20 20 20 63 61 73 65 20 49 4e 49 54  ){.    case INIT
cac0: 49 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20 70 73  IALIZE:.      ps
cad0: 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b  p->prevrule = 0;
cae0: 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63  .      psp->prec
caf0: 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 20  counter = 0;.   
cb00: 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c     psp->firstrul
cb10: 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c  e = psp->lastrul
cb20: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70  e = 0;.      psp
cb30: 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b  ->gp->nrule = 0;
cb40: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
cb50: 68 72 75 20 74 6f 20 6e 65 78 74 20 63 61 73 65  hru to next case
cb60: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 57 41 49   */.    case WAI
cb70: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
cb80: 5f 52 55 4c 45 3a 0a 20 20 20 20 20 20 69 66 28  _RULE:.      if(
cb90: 20 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a 20 20   x[0]=='%' ){.  
cba0: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
cbb0: 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
cbc0: 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20  ECL_KEYWORD;.   
cbd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 6c     }else if( isl
cbe0: 6f 77 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20  ower(x[0]) ){.  
cbf0: 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 20 3d        psp->lhs =
cc00: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
cc10: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72 68          psp->nrh
cc20: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  s = 0;.        p
cc30: 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 30  sp->lhsalias = 0
cc40: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
cc50: 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
cc60: 4f 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20 20 20  OR_ARROW;.      
cc70: 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d  }else if( x[0]==
cc80: 27 7b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '{' ){.        i
cc90: 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65  f( psp->prevrule
cca0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
ccb0: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
ccc0: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
ccd0: 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65 72 65  enlineno,."There
cce0: 20 69 73 20 6e 6f 74 20 70 72 69 6f 72 20 72 75   is not prior ru
ccf0: 6c 65 20 6f 70 6f 6e 20 77 68 69 63 68 20 74 6f  le opon which to
cd00: 20 61 74 74 61 63 68 20 74 68 65 20 63 6f 64 65   attach the code
cd10: 20 5c 0a 66 72 61 67 6d 65 6e 74 20 77 68 69 63   \.fragment whic
cd20: 68 20 62 65 67 69 6e 73 20 6f 6e 20 74 68 69 73  h begins on this
cd30: 20 6c 69 6e 65 2e 22 29 3b 0a 20 20 20 20 20 20   line.");.      
cd40: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
cd50: 74 2b 2b 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  t++;..}else if( 
cd60: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63  psp->prevrule->c
cd70: 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode!=0 ){.      
cd80: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
cd90: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
cda0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 6f  tokenlineno,."Co
cdb0: 64 65 20 66 72 61 67 6d 65 6e 74 20 62 65 67 69  de fragment begi
cdc0: 6e 6e 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69  nning on this li
cdd0: 6e 65 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69  ne is not the fi
cde0: 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20  rst \.to follow 
cdf0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 75 6c  the previous rul
ce00: 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e.");.          
ce10: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
ce20: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
ce30: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
ce40: 72 65 76 72 75 6c 65 2d 3e 6c 69 6e 65 20 3d 20  revrule->line = 
ce50: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
ce60: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
ce70: 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65 20  >prevrule->code 
ce80: 3d 20 26 78 5b 31 5d 3b 0a 09 7d 0a 20 20 20 20  = &x[1];..}.    
ce90: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d    }else if( x[0]
cea0: 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='[' ){.       
ceb0: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50 52   psp->state = PR
cec0: 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3b  ECEDENCE_MARK_1;
ced0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
cee0: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
cef0: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
cf00: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
cf10: 20 20 20 20 20 20 20 20 20 22 54 6f 6b 65 6e 20           "Token 
cf20: 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65  \"%s\" should be
cf30: 20 65 69 74 68 65 72 20 5c 22 25 25 5c 22 20 6f   either \"%%\" o
cf40: 72 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20  r a nonterminal 
cf50: 6e 61 6d 65 2e 22 2c 0a 20 20 20 20 20 20 20 20  name.",.        
cf60: 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73    x);.        ps
cf70: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
cf80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
cf90: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45  ak;.    case PRE
cfa0: 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a 0a  CEDENCE_MARK_1:.
cfb0: 20 20 20 20 20 20 69 66 28 20 21 69 73 75 70 70        if( !isupp
cfc0: 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  er(x[0]) ){.    
cfd0: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
cfe0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
cff0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
d000: 20 20 20 20 20 20 20 22 54 68 65 20 70 72 65 63         "The prec
d010: 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6d 75  edence symbol mu
d020: 73 74 20 62 65 20 61 20 74 65 72 6d 69 6e 61 6c  st be a terminal
d030: 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  .");.        psp
d040: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
d050: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73      }else if( ps
d060: 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20 29  p->prevrule==0 )
d070: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
d080: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
d090: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
d0a0: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54 68  o,.          "Th
d0b0: 65 72 65 20 69 73 20 6e 6f 20 70 72 69 6f 72 20  ere is no prior 
d0c0: 72 75 6c 65 20 74 6f 20 61 73 73 69 67 6e 20 70  rule to assign p
d0d0: 72 65 63 65 64 65 6e 63 65 20 5c 22 5b 25 73 5d  recedence \"[%s]
d0e0: 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  \".",x);.       
d0f0: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
d100: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
d110: 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d  ( psp->prevrule-
d120: 3e 70 72 65 63 73 79 6d 21 3d 30 20 29 7b 0a 20  >precsym!=0 ){. 
d130: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
d140: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
d150: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
d160: 22 50 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b  "Precedence mark
d170: 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73   on this line is
d180: 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 20 5c   not the first \
d190: 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70  .to follow the p
d1a0: 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b  revious rule.");
d1b0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
d1c0: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
d1d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
d1e0: 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72  sp->prevrule->pr
d1f0: 65 63 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e  ecsym = Symbol_n
d200: 65 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ew(x);.      }. 
d210: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
d220: 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52  = PRECEDENCE_MAR
d230: 4b 5f 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  K_2;.      break
d240: 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45 43 45  ;.    case PRECE
d250: 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20 20  DENCE_MARK_2:.  
d260: 20 20 20 20 69 66 28 20 78 5b 30 5d 21 3d 27 5d      if( x[0]!=']
d270: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ' ){.        Err
d280: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
d290: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
d2a0: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
d2b0: 22 4d 69 73 73 69 6e 67 20 5c 22 5d 5c 22 20 6f  "Missing \"]\" o
d2c0: 6e 20 70 72 65 63 65 64 65 6e 63 65 20 6d 61 72  n precedence mar
d2d0: 6b 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  k.");.        ps
d2e0: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
d2f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 73 70       }.      psp
d300: 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
d310: 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
d320: 4c 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  LE;.      break;
d330: 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
d340: 47 5f 46 4f 52 5f 41 52 52 4f 57 3a 0a 20 20 20  G_FOR_ARROW:.   
d350: 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27     if( x[0]==':'
d360: 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26   && x[1]==':' &&
d370: 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20   x[2]=='=' ){.  
d380: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
d390: 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20   = IN_RHS;.     
d3a0: 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d   }else if( x[0]=
d3b0: 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='(' ){.        
d3c0: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53  psp->state = LHS
d3d0: 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20 20  _ALIAS_1;.      
d3e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
d3f0: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
d400: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
d410: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
d420: 20 20 22 45 78 70 65 63 74 65 64 20 74 6f 20 73    "Expected to s
d430: 65 65 20 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c 6f  ee a \":\" follo
d440: 77 69 6e 67 20 74 68 65 20 4c 48 53 20 73 79 6d  wing the LHS sym
d450: 62 6f 6c 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20  bol \"%s\".",.  
d460: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73          psp->lhs
d470: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
d480: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
d490: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
d4a0: 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
d4b0: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
d4c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
d4d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48  eak;.    case LH
d4e0: 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20  S_ALIAS_1:.     
d4f0: 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30   if( isalpha(x[0
d500: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  ]) ){.        ps
d510: 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 78 3b  p->lhsalias = x;
d520: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
d530: 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f  ate = LHS_ALIAS_
d540: 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
d550: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
d560: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
d570: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
d580: 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 25 73  .          "\"%s
d590: 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69  \" is not a vali
d5a0: 64 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20  d alias for the 
d5b0: 4c 48 53 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20  LHS \"%s\"\n",. 
d5c0: 20 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d 3e           x,psp->
d5d0: 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  lhs->name);.    
d5e0: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
d5f0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
d600: 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
d610: 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
d620: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
d630: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
d640: 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20   LHS_ALIAS_2:.  
d650: 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29      if( x[0]==')
d660: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
d670: 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c  ->state = LHS_AL
d680: 49 41 53 5f 33 3b 0a 20 20 20 20 20 20 7d 65 6c  IAS_3;.      }el
d690: 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
d6a0: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
d6b0: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
d6c0: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
d6d0: 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f  Missing \")\" fo
d6e0: 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69 61  llowing LHS alia
d6f0: 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c  s name \"%s\".",
d700: 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a  psp->lhsalias);.
d710: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
d720: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
d730: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
d740: 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
d750: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
d760: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d770: 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 33  case LHS_ALIAS_3
d780: 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
d790: 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27  ==':' && x[1]=='
d7a0: 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20  :' && x[2]=='=' 
d7b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
d7c0: 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a  state = IN_RHS;.
d7d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d7e0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
d7f0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
d800: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
d810: 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67          "Missing
d820: 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69 6e   \"->\" followin
d830: 67 3a 20 5c 22 25 73 28 25 73 29 5c 22 2e 22 2c  g: \"%s(%s)\".",
d840: 0a 20 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  .           psp-
d850: 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d 3e  >lhs->name,psp->
d860: 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20  lhsalias);.     
d870: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
d880: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
d890: 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
d8a0: 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
d8b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d8c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
d8d0: 49 4e 5f 52 48 53 3a 0a 20 20 20 20 20 20 69 66  IN_RHS:.      if
d8e0: 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
d8f0: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 72 75         struct ru
d900: 6c 65 20 2a 72 70 3b 0a 20 20 20 20 20 20 20 20  le *rp;.        
d910: 72 70 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c  rp = (struct rul
d920: 65 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  e *)malloc( size
d930: 6f 66 28 73 74 72 75 63 74 20 72 75 6c 65 29 20  of(struct rule) 
d940: 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  + .             
d950: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79  sizeof(struct sy
d960: 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68 73  mbol*)*psp->nrhs
d970: 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29   + sizeof(char*)
d980: 2a 70 73 70 2d 3e 6e 72 68 73 20 29 3b 0a 20 20  *psp->nrhs );.  
d990: 20 20 20 20 20 20 69 66 28 20 72 70 3d 3d 30 20        if( rp==0 
d9a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
d9b0: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
d9c0: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
d9d0: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
d9e0: 20 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74    "Can't allocat
d9f0: 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20  e enough memory 
da00: 66 6f 72 20 74 68 69 73 20 72 75 6c 65 2e 22 29  for this rule.")
da10: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
da20: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
da30: 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76         psp->prev
da40: 72 75 6c 65 20 3d 20 30 3b 0a 09 7d 65 6c 73 65  rule = 0;..}else
da50: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
da60: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  i;.          rp-
da70: 3e 72 75 6c 65 6c 69 6e 65 20 3d 20 70 73 70 2d  >ruleline = psp-
da80: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20  >tokenlineno;.  
da90: 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 20          rp->rhs 
daa0: 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  = (struct symbol
dab0: 2a 2a 29 26 72 70 5b 31 5d 3b 0a 20 20 20 20 20  **)&rp[1];.     
dac0: 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61       rp->rhsalia
dad0: 73 20 3d 20 28 63 68 61 72 2a 2a 29 26 28 72 70  s = (char**)&(rp
dae0: 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d  ->rhs[psp->nrhs]
daf0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
db00: 28 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e 72 68  (i=0; i<psp->nrh
db10: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  s; i++){.       
db20: 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 20       rp->rhs[i] 
db30: 3d 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20  = psp->rhs[i];. 
db40: 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72             rp->r
db50: 68 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70 73 70  hsalias[i] = psp
db60: 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a 09 20 20 7d  ->alias[i];..  }
db70: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c  .          rp->l
db80: 68 73 20 3d 20 70 73 70 2d 3e 6c 68 73 3b 0a 20  hs = psp->lhs;. 
db90: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73           rp->lhs
dba0: 61 6c 69 61 73 20 3d 20 70 73 70 2d 3e 6c 68 73  alias = psp->lhs
dbb0: 61 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  alias;.         
dbc0: 20 72 70 2d 3e 6e 72 68 73 20 3d 20 70 73 70 2d   rp->nrhs = psp-
dbd0: 3e 6e 72 68 73 3b 0a 20 20 20 20 20 20 20 20 20  >nrhs;.         
dbe0: 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20   rp->code = 0;. 
dbf0: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65           rp->pre
dc00: 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  csym = 0;.      
dc10: 20 20 20 20 72 70 2d 3e 69 6e 64 65 78 20 3d 20      rp->index = 
dc20: 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 2b 2b  psp->gp->nrule++
dc30: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
dc40: 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e 6c 68  nextlhs = rp->lh
dc50: 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20 20 20  s->rule;.       
dc60: 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65     rp->lhs->rule
dc70: 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20   = rp;.         
dc80: 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20   rp->next = 0;. 
dc90: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70           if( psp
dca0: 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30 20 29  ->firstrule==0 )
dcb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73  {.            ps
dcc0: 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70  p->firstrule = p
dcd0: 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72  sp->lastrule = r
dce0: 70 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p;..  }else{.   
dcf0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61           psp->la
dd00: 73 74 72 75 6c 65 2d 3e 6e 65 78 74 20 3d 20 72  strule->next = r
dd10: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  p;.            p
dd20: 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72  sp->lastrule = r
dd30: 70 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20 20 20  p;..  }.        
dd40: 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20    psp->prevrule 
dd50: 3d 20 72 70 3b 0a 09 7d 0a 20 20 20 20 20 20 20  = rp;..}.       
dd60: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
dd70: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
dd80: 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65  R_RULE;.      }e
dd90: 6c 73 65 20 69 66 28 20 69 73 61 6c 70 68 61 28  lse if( isalpha(
dda0: 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
ddb0: 20 69 66 28 20 70 73 70 2d 3e 6e 72 68 73 3e 3d   if( psp->nrhs>=
ddc0: 4d 41 58 52 48 53 20 29 7b 0a 20 20 20 20 20 20  MAXRHS ){.      
ddd0: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
dde0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
ddf0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
de00: 20 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d 61           "Too ma
de10: 6e 79 20 73 79 6d 62 6f 6c 20 6f 6e 20 52 48 53  ny symbol on RHS
de20: 20 6f 72 20 72 75 6c 65 20 62 65 67 69 6e 6e 69   or rule beginni
de30: 6e 67 20 61 74 20 5c 22 25 73 5c 22 2e 22 2c 0a  ng at \"%s\".",.
de40: 20 20 20 20 20 20 20 20 20 20 20 20 78 29 3b 0a              x);.
de50: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
de60: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
de70: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
de80: 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
de90: 55 4c 45 5f 45 52 52 4f 52 3b 0a 09 7d 65 6c 73  ULE_ERROR;..}els
dea0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  e{.          psp
deb0: 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d  ->rhs[psp->nrhs]
dec0: 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
ded0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
dee0: 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73  >alias[psp->nrhs
def0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
df00: 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 09 7d   psp->nrhs++;..}
df10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
df20: 20 78 5b 30 5d 3d 3d 27 28 27 20 26 26 20 70 73   x[0]=='(' && ps
df30: 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20  p->nrhs>0 ){.   
df40: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
df50: 3d 20 52 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20  = RHS_ALIAS_1;. 
df60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
df70: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
df80: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
df90: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
dfa0: 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20         "Illegal 
dfb0: 63 68 61 72 61 63 74 65 72 20 6f 6e 20 52 48 53  character on RHS
dfc0: 20 6f 66 20 72 75 6c 65 3a 20 5c 22 25 73 5c 22   of rule: \"%s\"
dfd0: 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  .",x);.        p
dfe0: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
dff0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
e000: 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
e010: 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20  R_RULE_ERROR;.  
e020: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
e030: 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 48 53 5f  k;.    case RHS_
e040: 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69  ALIAS_1:.      i
e050: 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  f( isalpha(x[0])
e060: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
e070: 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73  >alias[psp->nrhs
e080: 2d 31 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20  -1] = x;.       
e090: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 48   psp->state = RH
e0a0: 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20 20 20  S_ALIAS_2;.     
e0b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e0c0: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
e0d0: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
e0e0: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
e0f0: 20 20 20 22 5c 22 25 73 5c 22 20 69 73 20 6e 6f     "\"%s\" is no
e100: 74 20 61 20 76 61 6c 69 64 20 61 6c 69 61 73 20  t a valid alias 
e110: 66 6f 72 20 74 68 65 20 52 48 53 20 73 79 6d 62  for the RHS symb
e120: 6f 6c 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20  ol \"%s\"\n",.  
e130: 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d 3e 72          x,psp->r
e140: 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 2d  hs[psp->nrhs-1]-
e150: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
e160: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
e170: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
e180: 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
e190: 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20  ER_RULE_ERROR;. 
e1a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
e1b0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 48 53  ak;.    case RHS
e1c0: 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20 20  _ALIAS_2:.      
e1d0: 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b  if( x[0]==')' ){
e1e0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
e1f0: 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20  ate = IN_RHS;.  
e200: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e210: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
e220: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
e230: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
e240: 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c        "Missing \
e250: 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c  ")\" following L
e260: 48 53 20 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22  HS alias name \"
e270: 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61  %s\".",psp->lhsa
e280: 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70  lias);.        p
e290: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
e2a0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
e2b0: 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
e2c0: 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20  R_RULE_ERROR;.  
e2d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
e2e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
e2f0: 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59  ING_FOR_DECL_KEY
e300: 57 4f 52 44 3a 0a 20 20 20 20 20 20 69 66 28 20  WORD:.      if( 
e310: 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b  isalpha(x[0]) ){
e320: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65  .        psp->de
e330: 63 6c 6b 65 79 77 6f 72 64 20 3d 20 78 3b 0a 20  clkeyword = x;. 
e340: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
e350: 61 72 67 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20  argslot = 0;.   
e360: 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e       psp->declln
e370: 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  slot = 0;.      
e380: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
e390: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
e3a0: 41 52 47 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ARG;.        if(
e3b0: 20 73 74 72 63 6d 70 28 78 2c 22 6e 61 6d 65 22   strcmp(x,"name"
e3c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
e3d0: 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
e3e0: 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
e3f0: 6e 61 6d 65 29 3b 0a 09 7d 65 6c 73 65 20 69 66  name);..}else if
e400: 28 20 73 74 72 63 6d 70 28 78 2c 22 69 6e 63 6c  ( strcmp(x,"incl
e410: 75 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ude")==0 ){.    
e420: 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
e430: 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
e440: 67 70 2d 3e 69 6e 63 6c 75 64 65 29 3b 0a 20 20  gp->include);.  
e450: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
e460: 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  llnslot = &psp->
e470: 67 70 2d 3e 69 6e 63 6c 75 64 65 6c 6e 3b 0a 09  gp->includeln;..
e480: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
e490: 28 78 2c 22 63 6f 64 65 22 29 3d 3d 30 20 29 7b  (x,"code")==0 ){
e4a0: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
e4b0: 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
e4c0: 70 73 70 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f  psp->gp->extraco
e4d0: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  de);.          p
e4e0: 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d  sp->decllnslot =
e4f0: 20 26 70 73 70 2d 3e 67 70 2d 3e 65 78 74 72 61   &psp->gp->extra
e500: 63 6f 64 65 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69  codeln;..}else i
e510: 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b  f( strcmp(x,"tok
e520: 65 6e 5f 64 65 73 74 72 75 63 74 6f 72 22 29 3d  en_destructor")=
e530: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
e540: 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
e550: 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b   = &psp->gp->tok
e560: 65 6e 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20  endest;.        
e570: 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f    psp->decllnslo
e580: 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f  t = &psp->gp->to
e590: 6b 65 6e 64 65 73 74 6c 6e 3b 0a 09 7d 65 6c 73  kendestln;..}els
e5a0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
e5b0: 64 65 66 61 75 6c 74 5f 64 65 73 74 72 75 63 74  default_destruct
e5c0: 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  or")==0 ){.     
e5d0: 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
e5e0: 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70  gslot = &psp->gp
e5f0: 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20 20 20  ->vardest;.     
e600: 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e       psp->declln
e610: 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d  slot = &psp->gp-
e620: 3e 76 61 72 64 65 73 74 6c 6e 3b 0a 09 7d 65 6c  >vardestln;..}el
e630: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
e640: 22 74 6f 6b 65 6e 5f 70 72 65 66 69 78 22 29 3d  "token_prefix")=
e650: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
e660: 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
e670: 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b   = &psp->gp->tok
e680: 65 6e 70 72 65 66 69 78 3b 0a 09 7d 65 6c 73 65  enprefix;..}else
e690: 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73   if( strcmp(x,"s
e6a0: 79 6e 74 61 78 5f 65 72 72 6f 72 22 29 3d 3d 30  yntax_error")==0
e6b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
e6c0: 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
e6d0: 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65 72 72 6f   &(psp->gp->erro
e6e0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  r);.          ps
e6f0: 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20  p->decllnslot = 
e700: 26 70 73 70 2d 3e 67 70 2d 3e 65 72 72 6f 72 6c  &psp->gp->errorl
e710: 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  n;..}else if( st
e720: 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 61 63  rcmp(x,"parse_ac
e730: 63 65 70 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  cept")==0 ){.   
e740: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
e750: 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
e760: 3e 67 70 2d 3e 61 63 63 65 70 74 29 3b 0a 20 20  >gp->accept);.  
e770: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
e780: 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  llnslot = &psp->
e790: 67 70 2d 3e 61 63 63 65 70 74 6c 6e 3b 0a 09 7d  gp->acceptln;..}
e7a0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
e7b0: 78 2c 22 70 61 72 73 65 5f 66 61 69 6c 75 72 65  x,"parse_failure
e7c0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
e7d0: 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
e7e0: 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
e7f0: 3e 66 61 69 6c 75 72 65 29 3b 0a 20 20 20 20 20  >failure);.     
e800: 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e       psp->declln
e810: 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d  slot = &psp->gp-
e820: 3e 66 61 69 6c 75 72 65 6c 6e 3b 0a 09 7d 65 6c  >failureln;..}el
e830: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
e840: 22 73 74 61 63 6b 5f 6f 76 65 72 66 6c 6f 77 22  "stack_overflow"
e850: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
e860: 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
e870: 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
e880: 6f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20  overflow);.     
e890: 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e       psp->declln
e8a0: 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d  slot = &psp->gp-
e8b0: 3e 6f 76 65 72 66 6c 6f 77 6c 6e 3b 0a 20 20 20  >overflowln;.   
e8c0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
e8d0: 74 72 63 6d 70 28 78 2c 22 65 78 74 72 61 5f 61  trcmp(x,"extra_a
e8e0: 72 67 75 6d 65 6e 74 22 29 3d 3d 30 20 29 7b 0a  rgument")==0 ){.
e8f0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
e900: 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
e910: 73 70 2d 3e 67 70 2d 3e 61 72 67 29 3b 0a 20 20  sp->gp->arg);.  
e920: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e930: 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f  strcmp(x,"token_
e940: 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  type")==0 ){.   
e950: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
e960: 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
e970: 3e 67 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3b  >gp->tokentype);
e980: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
e990: 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66  f( strcmp(x,"def
e9a0: 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20 29  ault_type")==0 )
e9b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
e9c0: 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
e9d0: 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79 70  (psp->gp->vartyp
e9e0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
e9f0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
ea00: 73 74 61 63 6b 5f 73 69 7a 65 22 29 3d 3d 30 20  stack_size")==0 
ea10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
ea20: 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
ea30: 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61 63 6b  &(psp->gp->stack
ea40: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  size);.        }
ea50: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
ea60: 78 2c 22 73 74 61 72 74 5f 73 79 6d 62 6f 6c 22  x,"start_symbol"
ea70: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
ea80: 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
ea90: 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
eaa0: 73 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  start);.        
eab0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
eac0: 28 78 2c 22 6c 65 66 74 22 29 3d 3d 30 20 29 7b  (x,"left")==0 ){
ead0: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
eae0: 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  preccounter++;. 
eaf0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
eb00: 63 6c 61 73 73 6f 63 20 3d 20 4c 45 46 54 3b 0a  classoc = LEFT;.
eb10: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
eb20: 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
eb30: 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59  OR_PRECEDENCE_SY
eb40: 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65  MBOL;.        }e
eb50: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
eb60: 2c 22 72 69 67 68 74 22 29 3d 3d 30 20 29 7b 0a  ,"right")==0 ){.
eb70: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
eb80: 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  reccounter++;.  
eb90: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
eba0: 6c 61 73 73 6f 63 20 3d 20 52 49 47 48 54 3b 0a  lassoc = RIGHT;.
ebb0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
ebc0: 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
ebd0: 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59  OR_PRECEDENCE_SY
ebe0: 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65  MBOL;.        }e
ebf0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
ec00: 2c 22 6e 6f 6e 61 73 73 6f 63 22 29 3d 3d 30 20  ,"nonassoc")==0 
ec10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
ec20: 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b  ->preccounter++;
ec30: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
ec40: 64 65 63 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e 45  declassoc = NONE
ec50: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
ec60: 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
ec70: 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f  _FOR_PRECEDENCE_
ec80: 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20 69  SYMBOL;..}else i
ec90: 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65 73  f( strcmp(x,"des
eca0: 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a  tructor")==0 ){.
ecb0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
ecc0: 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
ecd0: 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59  OR_DESTRUCTOR_SY
ece0: 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20 69 66 28  MBOL;..}else if(
ecf0: 20 73 74 72 63 6d 70 28 78 2c 22 74 79 70 65 22   strcmp(x,"type"
ed00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
ed10: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
ed20: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54  AITING_FOR_DATAT
ed30: 59 50 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20  YPE_SYMBOL;.    
ed40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ed50: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
ed60: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
ed70: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
ed80: 20 20 20 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f            "Unkno
ed90: 77 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b  wn declaration k
eda0: 65 79 77 6f 72 64 3a 20 5c 22 25 25 25 73 5c 22  eyword: \"%%%s\"
edb0: 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20  .",x);.         
edc0: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
edd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
ede0: 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
edf0: 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
ee00: 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65  ;..}.      }else
ee10: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
ee20: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
ee30: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
ee40: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c  o,.          "Il
ee50: 6c 65 67 61 6c 20 64 65 63 6c 61 72 61 74 69 6f  legal declaratio
ee60: 6e 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25 73 5c  n keyword: \"%s\
ee70: 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20  ".",x);.        
ee80: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
ee90: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
eea0: 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
eeb0: 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
eec0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
eed0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
eee0: 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43  TING_FOR_DESTRUC
eef0: 54 4f 52 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20  TOR_SYMBOL:.    
ef00: 20 20 69 66 28 20 21 69 73 61 6c 70 68 61 28 78    if( !isalpha(x
ef10: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
ef20: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
ef30: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
ef40: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
ef50: 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20     "Symbol name 
ef60: 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20 25 64  missing after %d
ef70: 65 73 74 72 75 63 74 6f 72 20 6b 65 79 77 6f 72  estructor keywor
ef80: 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  d");.        psp
ef90: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
efa0: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
efb0: 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
efc0: 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20  DECL_ERROR;.    
efd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
efe0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
eff0: 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
f000: 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
f010: 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
f020: 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a  sp->destructor;.
f030: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
f040: 6c 6c 6e 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64  llnslot = &sp->d
f050: 65 73 74 72 75 63 74 6f 72 6c 6e 3b 0a 20 20 20  estructorln;.   
f060: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
f070: 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
f080: 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a  CL_ARG;.      }.
f090: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f0a0: 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
f0b0: 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f  R_DATATYPE_SYMBO
f0c0: 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  L:.      if( !is
f0d0: 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
f0e0: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f0f0: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f100: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f110: 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f            "Symbo
f120: 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61  l name missing a
f130: 66 74 65 72 20 25 64 65 73 74 72 75 63 74 6f 72  fter %destructor
f140: 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20   keyword");.    
f150: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
f160: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
f170: 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
f180: 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
f190: 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
f1a0: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
f1b0: 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62  ymbol *sp = Symb
f1c0: 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
f1d0: 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
f1e0: 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61 74 61 74  lot = &sp->datat
f1f0: 79 70 65 3b 0a 20 20 20 20 20 20 20 20 70 73 70  ype;.        psp
f200: 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 30  ->decllnslot = 0
f210: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
f220: 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
f230: 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20  OR_DECL_ARG;.   
f240: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
f250: 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
f260: 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43  NG_FOR_PRECEDENC
f270: 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20  E_SYMBOL:.      
f280: 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b  if( x[0]=='.' ){
f290: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
f2a0: 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
f2b0: 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
f2c0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f2d0: 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b  isupper(x[0]) ){
f2e0: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
f2f0: 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 20 20  symbol *sp;.    
f300: 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f      sp = Symbol_
f310: 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
f320: 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20  if( sp->prec>=0 
f330: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
f340: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
f350: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
f360: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
f370: 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c 22    "Symbol \"%s\"
f380: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 20   has already be 
f390: 67 69 76 65 6e 20 61 20 70 72 65 63 65 64 65 6e  given a preceden
f3a0: 63 65 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  ce.",x);.       
f3b0: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
f3c0: 2b 2b 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20  ++;..}else{.    
f3d0: 20 20 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d        sp->prec =
f3e0: 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65   psp->preccounte
f3f0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d  r;.          sp-
f400: 3e 61 73 73 6f 63 20 3d 20 70 73 70 2d 3e 64 65  >assoc = psp->de
f410: 63 6c 61 73 73 6f 63 3b 0a 09 7d 0a 20 20 20 20  classoc;..}.    
f420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f430: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
f440: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
f450: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
f460: 20 20 20 20 22 43 61 6e 27 74 20 61 73 73 69 67      "Can't assig
f470: 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 74  n a precedence t
f480: 6f 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20  o \"%s\".",x);. 
f490: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
f4a0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
f4b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f4c0: 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
f4d0: 52 5f 44 45 43 4c 5f 41 52 47 3a 0a 20 20 20 20  R_DECL_ARG:.    
f4e0: 20 20 69 66 28 20 28 78 5b 30 5d 3d 3d 27 7b 27    if( (x[0]=='{'
f4f0: 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c   || x[0]=='\"' |
f500: 7c 20 69 73 61 6c 6e 75 6d 28 78 5b 30 5d 29 29  | isalnum(x[0]))
f510: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
f520: 2a 28 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c  *(psp->declargsl
f530: 6f 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ot)!=0 ){.      
f540: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
f550: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
f560: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
f570: 20 20 20 20 20 20 20 20 20 22 54 68 65 20 61 72           "The ar
f580: 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 74 6f  gument \"%s\" to
f590: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 5c 22 25   declaration \"%
f5a0: 25 25 73 5c 22 20 69 73 20 6e 6f 74 20 74 68 65  %%s\" is not the
f5b0: 20 66 69 72 73 74 2e 22 2c 0a 20 20 20 20 20 20   first.",.      
f5c0: 20 20 20 20 20 20 78 5b 30 5d 3d 3d 27 5c 22 27        x[0]=='\"'
f5d0: 20 3f 20 26 78 5b 31 5d 20 3a 20 78 2c 70 73 70   ? &x[1] : x,psp
f5e0: 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 29 3b 0a  ->declkeyword);.
f5f0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
f600: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f610: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
f620: 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
f630: 45 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 65 6c 73  ECL_ERROR;..}els
f640: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 70  e{.          *(p
f650: 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 29  sp->declargslot)
f660: 20 3d 20 28 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c   = (x[0]=='\"' |
f670: 7c 20 78 5b 30 5d 3d 3d 27 7b 27 29 20 3f 20 26  | x[0]=='{') ? &
f680: 78 5b 31 5d 20 3a 20 78 3b 0a 20 20 20 20 20 20  x[1] : x;.      
f690: 20 20 20 20 69 66 28 20 70 73 70 2d 3e 64 65 63      if( psp->dec
f6a0: 6c 6c 6e 73 6c 6f 74 20 29 20 2a 70 73 70 2d 3e  llnslot ) *psp->
f6b0: 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 70 73 70  decllnslot = psp
f6c0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20  ->tokenlineno;. 
f6d0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
f6e0: 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
f6f0: 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
f700: 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .}.      }else{.
f710: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
f720: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
f730: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
f740: 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65  .          "Ille
f750: 67 61 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  gal argument to 
f760: 25 25 25 73 3a 20 25 73 22 2c 70 73 70 2d 3e 64  %%%s: %s",psp->d
f770: 65 63 6c 6b 65 79 77 6f 72 64 2c 78 29 3b 0a 20  eclkeyword,x);. 
f780: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
f790: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
f7a0: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
f7b0: 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
f7c0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
f7d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
f7e0: 61 73 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52  ase RESYNC_AFTER
f7f0: 5f 52 55 4c 45 5f 45 52 52 4f 52 3a 0a 2f 2a 20  _RULE_ERROR:./* 
f800: 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
f810: 2e 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20  .' ) psp->state 
f820: 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
f830: 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 2a 2a 20 20  CL_OR_RULE;.**  
f840: 20 20 20 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20      break; */.  
f850: 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41 46    case RESYNC_AF
f860: 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3a 0a  TER_DECL_ERROR:.
f870: 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
f880: 27 2e 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65  '.' ) psp->state
f890: 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
f8a0: 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20  ECL_OR_RULE;.   
f8b0: 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27     if( x[0]=='%'
f8c0: 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20   ) psp->state = 
f8d0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
f8e0: 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20  _KEYWORD;.      
f8f0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  break;.  }.}../*
f900: 20 49 6e 20 73 70 69 74 65 20 6f 66 20 69 74 73   In spite of its
f910: 20 6e 61 6d 65 2c 20 74 68 69 73 20 66 75 6e 63   name, this func
f920: 74 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20 61  tion is really a
f930: 20 73 63 61 6e 6e 65 72 2e 20 20 49 74 20 72 65   scanner.  It re
f940: 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 65 6e 74  ad.** in the ent
f950: 69 72 65 20 69 6e 70 75 74 20 66 69 6c 65 20 28  ire input file (
f960: 61 6c 6c 20 61 74 20 6f 6e 63 65 29 20 74 68 65  all at once) the
f970: 6e 20 74 6f 6b 65 6e 69 7a 65 73 20 69 74 2e 20  n tokenizes it. 
f980: 20 45 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20 69   Each.** token i
f990: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
f9a0: 66 75 6e 63 74 69 6f 6e 20 22 70 61 72 73 65 6f  function "parseo
f9b0: 6e 65 74 6f 6b 65 6e 22 20 77 68 69 63 68 20 62  netoken" which b
f9c0: 75 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20 74 68 65  uilds all.** the
f9d0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 61 74   appropriate dat
f9e0: 61 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20  a structures in 
f9f0: 74 68 65 20 67 6c 6f 62 61 6c 20 73 74 61 74 65  the global state
fa00: 20 76 65 63 74 6f 72 20 22 67 70 22 2e 0a 2a 2f   vector "gp"..*/
fa10: 0a 76 6f 69 64 20 50 61 72 73 65 28 67 70 29 0a  .void Parse(gp).
fa20: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67 70  struct lemon *gp
fa30: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 73 74  ;.{.  struct pst
fa40: 61 74 65 20 70 73 3b 0a 20 20 46 49 4c 45 20 2a  ate ps;.  FILE *
fa50: 66 70 3b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65  fp;.  char *file
fa60: 62 75 66 3b 0a 20 20 69 6e 74 20 66 69 6c 65 73  buf;.  int files
fa70: 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e  ize;.  int linen
fa80: 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68  o;.  int c;.  ch
fa90: 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63 70 3b  ar *cp, *nextcp;
faa0: 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e 65  .  int startline
fab0: 20 3d 20 30 3b 0a 0a 20 20 70 73 2e 67 70 20 3d   = 0;..  ps.gp =
fac0: 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65 6e 61   gp;.  ps.filena
fad0: 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e 61 6d  me = gp->filenam
fae0: 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63 6e 74  e;.  ps.errorcnt
faf0: 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61 74 65   = 0;.  ps.state
fb00: 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b 0a 0a   = INITIALIZE;..
fb10: 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 65    /* Begin by re
fb20: 61 64 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20  ading the input 
fb30: 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d 20 66  file */.  fp = f
fb40: 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61 6d 65  open(ps.filename
fb50: 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 66 70  ,"rb");.  if( fp
fb60: 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ==0 ){.    Error
fb70: 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
fb80: 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68  0,"Can't open th
fb90: 69 73 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  is file for read
fba0: 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70 2d 3e  ing.");.    gp->
fbb0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
fbc0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 73  return;.  }.  fs
fbd0: 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20 20 66  eek(fp,0,2);.  f
fbe0: 69 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c 6c 28  ilesize = ftell(
fbf0: 66 70 29 3b 0a 20 20 72 65 77 69 6e 64 28 66 70  fp);.  rewind(fp
fc00: 29 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d 20 28  );.  filebuf = (
fc10: 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 66  char *)malloc( f
fc20: 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20 20 69  ilesize+1 );.  i
fc30: 66 28 20 66 69 6c 65 62 75 66 3d 3d 30 20 29 7b  f( filebuf==0 ){
fc40: 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73  .    ErrorMsg(ps
fc50: 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e  .filename,0,"Can
fc60: 27 74 20 61 6c 6c 6f 63 61 74 65 20 25 64 20 6f  't allocate %d o
fc70: 66 20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64  f memory to hold
fc80: 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20   this file.",.  
fc90: 20 20 20 20 66 69 6c 65 73 69 7a 65 2b 31 29 3b      filesize+1);
fca0: 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e  .    gp->errorcn
fcb0: 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  t++;.    return;
fcc0: 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 61 64  .  }.  if( fread
fcd0: 28 66 69 6c 65 62 75 66 2c 31 2c 66 69 6c 65 73  (filebuf,1,files
fce0: 69 7a 65 2c 66 70 29 21 3d 66 69 6c 65 73 69 7a  ize,fp)!=filesiz
fcf0: 65 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73  e ){.    ErrorMs
fd00: 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c  g(ps.filename,0,
fd10: 22 43 61 6e 27 74 20 72 65 61 64 20 69 6e 20 61  "Can't read in a
fd20: 6c 6c 20 25 64 20 62 79 74 65 73 20 6f 66 20 74  ll %d bytes of t
fd30: 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20 20 20  his file.",.    
fd40: 20 20 66 69 6c 65 73 69 7a 65 29 3b 0a 20 20 20    filesize);.   
fd50: 20 66 72 65 65 28 66 69 6c 65 62 75 66 29 3b 0a   free(filebuf);.
fd60: 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74      gp->errorcnt
fd70: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
fd80: 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70 29    }.  fclose(fp)
fd90: 3b 0a 20 20 66 69 6c 65 62 75 66 5b 66 69 6c 65  ;.  filebuf[file
fda0: 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a  size] = 0;..  /*
fdb0: 20 4e 6f 77 20 73 63 61 6e 20 74 68 65 20 74 65   Now scan the te
fdc0: 78 74 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  xt of the input 
fdd0: 66 69 6c 65 20 2a 2f 0a 20 20 6c 69 6e 65 6e 6f  file */.  lineno
fde0: 20 3d 20 31 3b 0a 20 20 66 6f 72 28 63 70 3d 66   = 1;.  for(cp=f
fdf0: 69 6c 65 62 75 66 3b 20 28 63 3d 20 2a 63 70 29  ilebuf; (c= *cp)
fe00: 21 3d 30 3b 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0; ){.    if( 
fe10: 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f  c=='\n' ) lineno
fe20: 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ++;             
fe30: 20 2f 2a 20 4b 65 65 70 20 74 72 61 63 6b 20 6f   /* Keep track o
fe40: 66 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65  f the line numbe
fe50: 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 73  r */.    if( iss
fe60: 70 61 63 65 28 63 29 20 29 7b 20 63 70 2b 2b 3b  pace(c) ){ cp++;
fe70: 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 20 20 2f 2a   continue; }  /*
fe80: 20 53 6b 69 70 20 61 6c 6c 20 77 68 69 74 65 20   Skip all white 
fe90: 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 66 28  space */.    if(
fea0: 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d   c=='/' && cp[1]
feb0: 3d 3d 27 2f 27 20 29 7b 20 20 20 20 20 20 20 20  =='/' ){        
fec0: 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74    /* Skip C++ st
fed0: 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a  yle comments */.
fee0: 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20        cp+=2;.   
fef0: 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63     while( (c= *c
ff00: 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27  p)!=0 && c!='\n'
ff10: 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63   ) cp++;.      c
ff20: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
ff30: 20 20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26     if( c=='/' &&
ff40: 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20   cp[1]=='*' ){  
ff50: 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20          /* Skip 
ff60: 43 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73  C style comments
ff70: 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b   */.      cp+=2;
ff80: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
ff90: 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21  = *cp)!=0 && (c!
ffa0: 3d 27 2f 27 20 7c 7c 20 63 70 5b 2d 31 5d 21 3d  ='/' || cp[-1]!=
ffb0: 27 2a 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '*') ){.        
ffc0: 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
ffd0: 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
ffe0: 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  cp++;.      }.  
fff0: 20 20 20 20 69 66 28 20 63 20 29 20 63 70 2b 2b      if( c ) cp++
10000 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
10010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 73 2e 74  ;.    }.    ps.t
10020 6f 6b 65 6e 73 74 61 72 74 20 3d 20 63 70 3b 20  okenstart = cp; 
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10040 2a 20 4d 61 72 6b 20 74 68 65 20 62 65 67 69 6e  * Mark the begin
10050 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 6f 6b 65  ning of the toke
10060 6e 20 2a 2f 0a 20 20 20 20 70 73 2e 74 6f 6b 65  n */.    ps.toke
10070 6e 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f  nlineno = lineno
10080 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
10090 69 6e 65 6e 75 6d 62 65 72 20 6f 6e 20 77 68 69  inenumber on whi
100a0 63 68 20 74 6f 6b 65 6e 20 62 65 67 69 6e 73 20  ch token begins 
100b0 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  */.    if( c=='\
100c0 22 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  "' ){           
100d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72            /* Str
100e0 69 6e 67 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a  ing literals */.
100f0 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20        cp++;.    
10100 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70    while( (c= *cp
10110 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 22 27 20  )!=0 && c!='\"' 
10120 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
10130 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
10140 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b 2b 3b  +;.        cp++;
10150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
10160 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
10170 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66     ErrorMsg(ps.f
10180 69 6c 65 6e 61 6d 65 2c 73 74 61 72 74 6c 69 6e  ilename,startlin
10190 65 2c 0a 22 53 74 72 69 6e 67 20 73 74 61 72 74  e,."String start
101a0 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65  ing on this line
101b0 20 69 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74   is not terminat
101c0 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e  ed before the en
101d0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 22 29  d of the file.")
101e0 3b 0a 20 20 20 20 20 20 20 20 70 73 2e 65 72 72  ;.        ps.err
101f0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
10200 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20   nextcp = cp;.  
10210 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10220 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 2b 31     nextcp = cp+1
10230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
10240 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29  lse if( c=='{' )
10250 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
10260 2f 2a 20 41 20 62 6c 6f 63 6b 20 6f 66 20 43 20  /* A block of C 
10270 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  code */.      in
10280 74 20 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 63  t level;.      c
10290 70 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6c  p++;.      for(l
102a0 65 76 65 6c 3d 31 3b 20 28 63 3d 20 2a 63 70 29  evel=1; (c= *cp)
102b0 21 3d 30 20 26 26 20 28 6c 65 76 65 6c 3e 31 20  !=0 && (level>1 
102c0 7c 7c 20 63 21 3d 27 7d 27 29 3b 20 63 70 2b 2b  || c!='}'); cp++
102d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
102e0 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
102f0 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20  +;.        else 
10300 69 66 28 20 63 3d 3d 27 7b 27 20 29 20 6c 65 76  if( c=='{' ) lev
10310 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c  el++;.        el
10320 73 65 20 69 66 28 20 63 3d 3d 27 7d 27 20 29 20  se if( c=='}' ) 
10330 6c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 20  level--;.       
10340 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f 27   else if( c=='/'
10350 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29   && cp[1]=='*' )
10360 7b 20 20 2f 2a 20 53 6b 69 70 20 63 6f 6d 6d 65  {  /* Skip comme
10370 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  nts */.         
10380 20 69 6e 74 20 70 72 65 76 63 3b 0a 20 20 20 20   int prevc;.    
10390 20 20 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32        cp = &cp[2
103a0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65  ];.          pre
103b0 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  vc = 0;.        
103c0 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70    while( (c= *cp
103d0 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f 27 20  )!=0 && (c!='/' 
103e0 7c 7c 20 70 72 65 76 63 21 3d 27 2a 27 29 20 29  || prevc!='*') )
103f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
10400 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  ( c=='\n' ) line
10410 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  no++;.          
10420 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 20 20 20    prevc = c;.   
10430 20 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 09           cp++;..
10440 20 20 7d 0a 09 7d 65 6c 73 65 20 69 66 28 20 63    }..}else if( c
10450 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d  =='/' && cp[1]==
10460 27 2f 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20  '/' ){  /* Skip 
10470 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e  C++ style commen
10480 74 73 20 74 6f 6f 20 2a 2f 0a 20 20 20 20 20 20  ts too */.      
10490 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b      cp = &cp[2];
104a0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
104b0 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ( (c= *cp)!=0 &&
104c0 20 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b   c!='\n' ) cp++;
104d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
104e0 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 09 7d 65   ) lineno++;..}e
104f0 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20  lse if( c=='\'' 
10500 7c 7c 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20  || c=='\"' ){   
10510 20 2f 2a 20 53 74 72 69 6e 67 20 61 20 63 68 61   /* String a cha
10520 72 61 63 74 65 72 20 6c 69 74 65 72 61 6c 73 20  racter literals 
10530 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  */.          int
10540 20 73 74 61 72 74 63 68 61 72 2c 20 70 72 65 76   startchar, prev
10550 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  c;.          sta
10560 72 74 63 68 61 72 20 3d 20 63 3b 0a 20 20 20 20  rtchar = c;.    
10570 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b        prevc = 0;
10580 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 63  .          for(c
10590 70 2b 2b 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30  p++; (c= *cp)!=0
105a0 20 26 26 20 28 63 21 3d 73 74 61 72 74 63 68 61   && (c!=startcha
105b0 72 20 7c 7c 20 70 72 65 76 63 3d 3d 27 5c 5c 27  r || prevc=='\\'
105c0 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ); cp++){.      
105d0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
105e0 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
105f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72            if( pr
10600 65 76 63 3d 3d 27 5c 5c 27 20 29 20 70 72 65 76  evc=='\\' ) prev
10610 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  c = 0;.         
10620 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
10630 20 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b 0a       prevc = c;.
10640 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a  .  }..}.      }.
10650 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
10660 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
10670 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 70  sg(ps.filename,p
10680 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22  s.tokenlineno,."
10690 43 20 63 6f 64 65 20 73 74 61 72 74 69 6e 67 20  C code starting 
106a0 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20  on this line is 
106b0 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62  not terminated b
106c0 65 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66  efore the end of
106d0 20 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20   the file.");.  
106e0 20 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e        ps.errorcn
106f0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78  t++;.        nex
10700 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20  tcp = cp;.      
10710 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
10720 65 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20  extcp = cp+1;.  
10730 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
10740 69 66 28 20 69 73 61 6c 6e 75 6d 28 63 29 20 29  if( isalnum(c) )
10750 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64  {          /* Id
10760 65 6e 74 69 66 69 65 72 73 20 2a 2f 0a 20 20 20  entifiers */.   
10770 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63     while( (c= *c
10780 70 29 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75  p)!=0 && (isalnu
10790 6d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20  m(c) || c=='_') 
107a0 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65  ) cp++;.      ne
107b0 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d  xtcp = cp;.    }
107c0 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 3a 27 20  else if( c==':' 
107d0 26 26 20 63 70 5b 31 5d 3d 3d 27 3a 27 20 26 26  && cp[1]==':' &&
107e0 20 63 70 5b 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f   cp[2]=='=' ){ /
107f0 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 22  * The operator "
10800 3a 3a 3d 22 20 2a 2f 0a 20 20 20 20 20 20 63 70  ::=" */.      cp
10810 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 6e 65 78   += 3;.      nex
10820 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65  tcp = cp;.    }e
10830 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10850 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20   All other (one 
10860 63 68 61 72 61 63 74 65 72 29 20 6f 70 65 72 61  character) opera
10870 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 63 70  tors */.      cp
10880 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70  ++;.      nextcp
10890 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20   = cp;.    }.   
108a0 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63   c = *cp;.    *c
108b0 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
108d0 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   Null terminate 
108e0 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20  the token */.   
108f0 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26   parseonetoken(&
10900 70 73 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ps);            
10910 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 74 6f   /* Parse the to
10920 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d  ken */.    *cp =
10930 20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   c;             
10940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10950 73 74 6f 72 65 20 74 68 65 20 62 75 66 66 65 72  store the buffer
10960 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65 78   */.    cp = nex
10970 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28  tcp;.  }.  free(
10980 66 69 6c 65 62 75 66 29 3b 20 20 20 20 20 20 20  filebuf);       
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
109a0 52 65 6c 65 61 73 65 20 74 68 65 20 62 75 66 66  Release the buff
109b0 65 72 20 61 66 74 65 72 20 70 61 72 73 69 6e 67  er after parsing
109c0 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d   */.  gp->rule =
109d0 20 70 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20   ps.firstrule;. 
109e0 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20   gp->errorcnt = 
109f0 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f  ps.errorcnt;.}./
10a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
10a20 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b   the file "plink
10a30 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
10a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
10a50 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73   Routines proces
10a60 73 69 6e 67 20 63 6f 6e 66 69 67 75 72 61 74 69  sing configurati
10a70 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72  on follow-set pr
10a80 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a  opagation links.
10a90 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20  ** in the LEMON 
10aa0 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
10ab0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
10ac0 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f  ct plink *plink_
10ad0 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f  freelist = 0;../
10ae0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
10af0 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74   plink */.struct
10b00 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65   plink *Plink_ne
10b10 77 28 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c  w(){.  struct pl
10b20 69 6e 6b 20 2a 6e 65 77 3b 0a 0a 20 20 69 66 28  ink *new;..  if(
10b30 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d   plink_freelist=
10b40 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
10b50 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31  .    int amt = 1
10b60 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72  00;.    plink_fr
10b70 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74  eelist = (struct
10b80 20 70 6c 69 6e 6b 20 2a 29 6d 61 6c 6c 6f 63 28   plink *)malloc(
10b90 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 70   sizeof(struct p
10ba0 6c 69 6e 6b 29 2a 61 6d 74 20 29 3b 0a 20 20 20  link)*amt );.   
10bb0 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c   if( plink_freel
10bc0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
10bd0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a  fprintf(stderr,.
10be0 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f        "Unable to
10bf0 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
10c00 20 66 6f 72 20 61 20 6e 65 77 20 66 6f 6c 6c 6f   for a new follo
10c10 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f  w-set propagatio
10c20 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20 20 20  n link.\n");.   
10c30 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
10c40 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
10c50 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 70 6c 69  <amt-1; i++) pli
10c60 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e  nk_freelist[i].n
10c70 65 78 74 20 3d 20 26 70 6c 69 6e 6b 5f 66 72 65  ext = &plink_fre
10c80 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20  elist[i+1];.    
10c90 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 61  plink_freelist[a
10ca0 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a  mt-1].next = 0;.
10cb0 20 20 7d 0a 20 20 6e 65 77 20 3d 20 70 6c 69 6e    }.  new = plin
10cc0 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 70 6c  k_freelist;.  pl
10cd0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70  ink_freelist = p
10ce0 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 2d 3e 6e  link_freelist->n
10cf0 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65  ext;.  return ne
10d00 77 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70  w;.}../* Add a p
10d10 6c 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20  link to a plink 
10d20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69  list */.void Pli
10d30 6e 6b 5f 61 64 64 28 70 6c 70 70 2c 63 66 70 29  nk_add(plpp,cfp)
10d40 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a  .struct plink **
10d50 70 6c 70 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e  plpp;.struct con
10d60 66 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74  fig *cfp;.{.  st
10d70 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 3b  ruct plink *new;
10d80 0a 20 20 6e 65 77 20 3d 20 50 6c 69 6e 6b 5f 6e  .  new = Plink_n
10d90 65 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65 78  ew();.  new->nex
10da0 74 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c  t = *plpp;.  *pl
10db0 70 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d  pp = new;.  new-
10dc0 3e 63 66 70 20 3d 20 63 66 70 3b 0a 7d 0a 0a 2f  >cfp = cfp;.}../
10dd0 2a 20 54 72 61 6e 73 66 65 72 20 65 76 65 72 79  * Transfer every
10de0 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69   plink on the li
10df0 73 74 20 22 66 72 6f 6d 22 20 74 6f 20 74 68 65  st "from" to the
10e00 20 6c 69 73 74 20 22 74 6f 22 20 2a 2f 0a 76 6f   list "to" */.vo
10e10 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 74 6f  id Plink_copy(to
10e20 2c 66 72 6f 6d 29 0a 73 74 72 75 63 74 20 70 6c  ,from).struct pl
10e30 69 6e 6b 20 2a 2a 74 6f 3b 0a 73 74 72 75 63 74  ink **to;.struct
10e40 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d 3b 0a 7b 0a   plink *from;.{.
10e50 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
10e60 6e 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28  nextpl;.  while(
10e70 20 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78   from ){.    nex
10e80 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74  tpl = from->next
10e90 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74  ;.    from->next
10ea0 20 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20   = *to;.    *to 
10eb0 3d 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d  = from;.    from
10ec0 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d   = nextpl;.  }.}
10ed0 0a 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72  ../* Delete ever
10ee0 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c  y plink on the l
10ef0 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  ist */.void Plin
10f00 6b 5f 64 65 6c 65 74 65 28 70 6c 70 29 0a 73 74  k_delete(plp).st
10f10 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b  ruct plink *plp;
10f20 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  .{.  struct plin
10f30 6b 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20 77 68  k *nextpl;..  wh
10f40 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20  ile( plp ){.    
10f50 6e 65 78 74 70 6c 20 3d 20 70 6c 70 2d 3e 6e 65  nextpl = plp->ne
10f60 78 74 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e 65 78  xt;.    plp->nex
10f70 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  t = plink_freeli
10f80 73 74 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72  st;.    plink_fr
10f90 65 65 6c 69 73 74 20 3d 20 70 6c 70 3b 0a 20 20  eelist = plp;.  
10fa0 20 20 70 6c 70 20 3d 20 6e 65 78 74 70 6c 3b 0a    plp = nextpl;.
10fb0 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a    }.}./*********
10fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
10fd0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65  rom the file "re
10fe0 70 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  port.c" ********
10ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11000 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 64  **/./*.** Proced
11010 75 72 65 73 20 66 6f 72 20 67 65 6e 65 72 61 74  ures for generat
11020 69 6e 67 20 72 65 70 6f 72 74 73 20 61 6e 64 20  ing reports and 
11030 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45  tables in the LE
11040 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
11050 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e  ator..*/../* Gen
11060 65 72 61 74 65 20 61 20 66 69 6c 65 6e 61 6d 65  erate a filename
11070 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
11080 73 75 66 66 69 78 2e 20 20 53 70 61 63 65 20 74  suffix.  Space t
11090 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 6e 61  o hold the.** na
110a0 6d 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20 6d 61  me comes from ma
110b0 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
110c0 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
110d0 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
110e0 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ion..*/.PRIVATE 
110f0 63 68 61 72 20 2a 66 69 6c 65 5f 6d 61 6b 65 6e  char *file_maken
11100 61 6d 65 28 6c 65 6d 70 2c 73 75 66 66 69 78 29  ame(lemp,suffix)
11110 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
11120 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66 66 69  emp;.char *suffi
11130 78 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d  x;.{.  char *nam
11140 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a  e;.  char *cp;..
11150 20 20 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28    name = malloc(
11160 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69   strlen(lemp->fi
11170 6c 65 6e 61 6d 65 29 20 2b 20 73 74 72 6c 65 6e  lename) + strlen
11180 28 73 75 66 66 69 78 29 20 2b 20 35 20 29 3b 0a  (suffix) + 5 );.
11190 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29 7b    if( name==0 ){
111a0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
111b0 65 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63  err,"Can't alloc
111c0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20  ate space for a 
111d0 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20  filename.\n");. 
111e0 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
111f0 20 20 73 74 72 63 70 79 28 6e 61 6d 65 2c 6c 65    strcpy(name,le
11200 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
11210 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 6e 61   cp = strrchr(na
11220 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63  me,'.');.  if( c
11230 70 20 29 20 2a 63 70 20 3d 20 30 3b 0a 20 20 73  p ) *cp = 0;.  s
11240 74 72 63 61 74 28 6e 61 6d 65 2c 73 75 66 66 69  trcat(name,suffi
11250 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d  x);.  return nam
11260 65 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20  e;.}../* Open a 
11270 66 69 6c 65 20 77 69 74 68 20 61 20 6e 61 6d 65  file with a name
11280 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6e 61   based on the na
11290 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  me of the input 
112a0 66 69 6c 65 2c 0a 2a 2a 20 62 75 74 20 77 69 74  file,.** but wit
112b0 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 28 73  h a different (s
112c0 70 65 63 69 66 69 65 64 29 20 73 75 66 66 69 78  pecified) suffix
112d0 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  , and return a p
112e0 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
112f0 20 73 74 72 65 61 6d 20 2a 2f 0a 50 52 49 56 41   stream */.PRIVA
11300 54 45 20 46 49 4c 45 20 2a 66 69 6c 65 5f 6f 70  TE FILE *file_op
11310 65 6e 28 6c 65 6d 70 2c 73 75 66 66 69 78 2c 6d  en(lemp,suffix,m
11320 6f 64 65 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  ode).struct lemo
11330 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73  n *lemp;.char *s
11340 75 66 66 69 78 3b 0a 63 68 61 72 20 2a 6d 6f 64  uffix;.char *mod
11350 65 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b  e;.{.  FILE *fp;
11360 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75  ..  if( lemp->ou
11370 74 6e 61 6d 65 20 29 20 66 72 65 65 28 6c 65 6d  tname ) free(lem
11380 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c  p->outname);.  l
11390 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66  emp->outname = f
113a0 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d  ile_makename(lem
113b0 70 2c 20 73 75 66 66 69 78 29 3b 0a 20 20 66 70  p, suffix);.  fp
113c0 20 3d 20 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f   = fopen(lemp->o
113d0 75 74 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20  utname,mode);.  
113e0 69 66 28 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f  if( fp==0 && *mo
113f0 64 65 3d 3d 27 77 27 20 29 7b 0a 20 20 20 20 66  de=='w' ){.    f
11400 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43  printf(stderr,"C
11410 61 6e 27 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c  an't open file \
11420 22 25 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e  "%s\".\n",lemp->
11430 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65  outname);.    le
11440 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
11450 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
11460 7d 0a 20 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d  }.  return fp;.}
11470 0a 0a 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74  ../* Duplicate t
11480 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 77 69  he input file wi
11490 74 68 6f 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61  thout comments a
114a0 6e 64 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f  nd without actio
114b0 6e 73 20 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20  ns .** on rules 
114c0 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28  */.void Reprint(
114d0 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
114e0 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74  on *lemp;.{.  st
114f0 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
11500 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
11510 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  sp;.  int i, j, 
11520 6d 61 78 6c 65 6e 2c 20 6c 65 6e 2c 20 6e 63 6f  maxlen, len, nco
11530 6c 75 6d 6e 73 2c 20 73 6b 69 70 3b 0a 20 20 70  lumns, skip;.  p
11540 72 69 6e 74 66 28 22 2f 2f 20 52 65 70 72 69 6e  rintf("// Reprin
11550 74 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20  t of input file 
11560 5c 22 25 73 5c 22 2e 5c 6e 2f 2f 20 53 79 6d 62  \"%s\".\n// Symb
11570 6f 6c 73 3a 5c 6e 22 2c 6c 65 6d 70 2d 3e 66 69  ols:\n",lemp->fi
11580 6c 65 6e 61 6d 65 29 3b 0a 20 20 6d 61 78 6c 65  lename);.  maxle
11590 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28 69 3d  n = 10;.  for(i=
115a0 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
115b0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70  ol; i++){.    sp
115c0 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
115d0 5b 69 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  [i];.    len = s
115e0 74 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b  trlen(sp->name);
115f0 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78  .    if( len>max
11600 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c  len ) maxlen = l
11610 65 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d  en;.  }.  ncolum
11620 6e 73 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b  ns = 76/(maxlen+
11630 35 29 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d  5);.  if( ncolum
11640 6e 73 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20  ns<1 ) ncolumns 
11650 3d 20 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c  = 1;.  skip = (l
11660 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e  emp->nsymbol + n
11670 63 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f  columns - 1)/nco
11680 6c 75 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30  lumns;.  for(i=0
11690 3b 20 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a  ; i<skip; i++){.
116a0 20 20 20 20 70 72 69 6e 74 66 28 22 2f 2f 22 29      printf("//")
116b0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a  ;.    for(j=i; j
116c0 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
116d0 6a 2b 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20 20  j+=skip){.      
116e0 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
116f0 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73  ls[j];.      ass
11700 65 72 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d  ert( sp->index==
11710 6a 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74  j );.      print
11720 66 28 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c  f(" %3d %-*.*s",
11730 6a 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c  j,maxlen,maxlen,
11740 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  sp->name);.    }
11750 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22  .    printf("\n"
11760 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d  );.  }.  for(rp=
11770 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
11780 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
11790 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c 72 70    printf("%s",rp
117a0 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 2f 2a  ->lhs->name);./*
117b0 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61      if( rp->lhsa
117c0 6c 69 61 73 20 29 20 70 72 69 6e 74 66 28 22 28  lias ) printf("(
117d0 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  %s)",rp->lhsalia
117e0 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74  s); */.    print
117f0 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20 66  f(" ::=");.    f
11800 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
11810 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
11820 70 72 69 6e 74 66 28 22 20 25 73 22 2c 72 70 2d  printf(" %s",rp-
11830 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a  >rhs[i]->name);.
11840 2f 2a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e  /*      if( rp->
11850 72 68 73 61 6c 69 61 73 5b 69 5d 20 29 20 70 72  rhsalias[i] ) pr
11860 69 6e 74 66 28 22 28 25 73 29 22 2c 72 70 2d 3e  intf("(%s)",rp->
11870 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f  rhsalias[i]); */
11880 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74  .    }.    print
11890 66 28 22 2e 22 29 3b 0a 20 20 20 20 69 66 28 20  f(".");.    if( 
118a0 72 70 2d 3e 70 72 65 63 73 79 6d 20 29 20 70 72  rp->precsym ) pr
118b0 69 6e 74 66 28 22 20 5b 25 73 5d 22 2c 72 70 2d  intf(" [%s]",rp-
118c0 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b  >precsym->name);
118d0 0a 2f 2a 20 20 20 20 69 66 28 20 72 70 2d 3e 63  ./*    if( rp->c
118e0 6f 64 65 20 29 20 70 72 69 6e 74 66 28 22 5c 6e  ode ) printf("\n
118f0 20 20 20 20 25 73 22 2c 72 70 2d 3e 63 6f 64 65      %s",rp->code
11900 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66  ); */.    printf
11910 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 76  ("\n");.  }.}..v
11920 6f 69 64 20 43 6f 6e 66 69 67 50 72 69 6e 74 28  oid ConfigPrint(
11930 66 70 2c 63 66 70 29 0a 46 49 4c 45 20 2a 66 70  fp,cfp).FILE *fp
11940 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
11950 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74  *cfp;.{.  struct
11960 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74   rule *rp;.  int
11970 20 69 3b 0a 20 20 72 70 20 3d 20 63 66 70 2d 3e   i;.  rp = cfp->
11980 72 70 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70  rp;.  fprintf(fp
11990 2c 22 25 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c 68  ,"%s ::=",rp->lh
119a0 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  s->name);.  for(
119b0 69 3d 30 3b 20 69 3c 3d 72 70 2d 3e 6e 72 68 73  i=0; i<=rp->nrhs
119c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
119d0 69 3d 3d 63 66 70 2d 3e 64 6f 74 20 29 20 66 70  i==cfp->dot ) fp
119e0 72 69 6e 74 66 28 66 70 2c 22 20 2a 22 29 3b 0a  rintf(fp," *");.
119f0 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e      if( i==rp->n
11a00 72 68 73 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  rhs ) break;.   
11a10 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73   fprintf(fp," %s
11a20 22 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61  ",rp->rhs[i]->na
11a30 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 23  me);.  }.}../* #
11a40 64 65 66 69 6e 65 20 54 45 53 54 20 2a 2f 0a 23  define TEST */.#
11a50 69 66 64 65 66 20 54 45 53 54 0a 2f 2a 20 50 72  ifdef TEST./* Pr
11a60 69 6e 74 20 61 20 73 65 74 20 2a 2f 0a 50 52 49  int a set */.PRI
11a70 56 41 54 45 20 76 6f 69 64 20 53 65 74 50 72 69  VATE void SetPri
11a80 6e 74 28 6f 75 74 2c 73 65 74 2c 6c 65 6d 70 29  nt(out,set,lemp)
11a90 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 63 68 61 72  .FILE *out;.char
11aa0 20 2a 73 65 74 3b 0a 73 74 72 75 63 74 20 6c 65   *set;.struct le
11ab0 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69  mon *lemp;.{.  i
11ac0 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 73 70  nt i;.  char *sp
11ad0 61 63 65 72 3b 0a 20 20 73 70 61 63 65 72 20 3d  acer;.  spacer =
11ae0 20 22 22 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f   "";.  fprintf(o
11af0 75 74 2c 22 25 31 32 73 5b 22 2c 22 22 29 3b 0a  ut,"%12s[","");.
11b00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
11b10 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b  p->nterminal; i+
11b20 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 65 74 46  +){.    if( SetF
11b30 69 6e 64 28 73 65 74 2c 69 29 20 29 7b 0a 20 20  ind(set,i) ){.  
11b40 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
11b50 22 25 73 25 73 22 2c 73 70 61 63 65 72 2c 6c 65  "%s%s",spacer,le
11b60 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
11b70 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 70 61  name);.      spa
11b80 63 65 72 20 3d 20 22 20 22 3b 0a 20 20 20 20 7d  cer = " ";.    }
11b90 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
11ba0 75 74 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a  ut,"]\n");.}../*
11bb0 20 50 72 69 6e 74 20 61 20 70 6c 69 6e 6b 20 63   Print a plink c
11bc0 68 61 69 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20  hain */.PRIVATE 
11bd0 76 6f 69 64 20 50 6c 69 6e 6b 50 72 69 6e 74 28  void PlinkPrint(
11be0 6f 75 74 2c 70 6c 70 2c 74 61 67 29 0a 46 49 4c  out,plp,tag).FIL
11bf0 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 70  E *out;.struct p
11c00 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 63 68 61 72 20  link *plp;.char 
11c10 2a 74 61 67 3b 0a 7b 0a 20 20 77 68 69 6c 65 28  *tag;.{.  while(
11c20 20 70 6c 70 20 29 7b 0a 20 20 20 20 66 70 72 69   plp ){.    fpri
11c30 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 25 73 20  ntf(out,"%12s%s 
11c40 28 73 74 61 74 65 20 25 32 64 29 20 22 2c 22 22  (state %2d) ",""
11c50 2c 74 61 67 2c 70 6c 70 2d 3e 63 66 70 2d 3e 73  ,tag,plp->cfp->s
11c60 74 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  tp->index);.    
11c70 43 6f 6e 66 69 67 50 72 69 6e 74 28 6f 75 74 2c  ConfigPrint(out,
11c80 70 6c 70 2d 3e 63 66 70 29 3b 0a 20 20 20 20 66  plp->cfp);.    f
11c90 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29  printf(out,"\n")
11ca0 3b 0a 20 20 20 20 70 6c 70 20 3d 20 70 6c 70 2d  ;.    plp = plp-
11cb0 3e 6e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  >next;.  }.}.#en
11cc0 64 69 66 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 6e  dif../* Print an
11cd0 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 67   action to the g
11ce0 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
11cf0 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 46 41  ptor.  Return FA
11d00 4c 53 45 20 69 66 0a 2a 2a 20 6e 6f 74 68 69 6e  LSE if.** nothin
11d10 67 20 77 61 73 20 61 63 74 75 61 6c 6c 79 20 70  g was actually p
11d20 72 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 50  rinted..*/.int P
11d30 72 69 6e 74 41 63 74 69 6f 6e 28 73 74 72 75 63  rintAction(struc
11d40 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 46 49  t action *ap, FI
11d50 4c 45 20 2a 66 70 2c 20 69 6e 74 20 69 6e 64 65  LE *fp, int inde
11d60 6e 74 29 7b 0a 20 20 69 6e 74 20 72 65 73 75 6c  nt){.  int resul
11d70 74 20 3d 20 31 3b 0a 20 20 73 77 69 74 63 68 28  t = 1;.  switch(
11d80 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20   ap->type ){.   
11d90 20 63 61 73 65 20 53 48 49 46 54 3a 0a 20 20 20   case SHIFT:.   
11da0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
11db0 2a 73 20 73 68 69 66 74 20 20 25 64 22 2c 69 6e  *s shift  %d",in
11dc0 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
11dd0 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e 69 6e 64  e,ap->x.stp->ind
11de0 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
11df0 3b 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43  ;.    case REDUC
11e00 45 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  E:.      fprintf
11e10 28 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20  (fp,"%*s reduce 
11e20 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73  %d",indent,ap->s
11e30 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70  p->name,ap->x.rp
11e40 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
11e50 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
11e60 41 43 43 45 50 54 3a 0a 20 20 20 20 20 20 66 70  ACCEPT:.      fp
11e70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 61 63  rintf(fp,"%*s ac
11e80 63 65 70 74 22 2c 69 6e 64 65 6e 74 2c 61 70 2d  cept",indent,ap-
11e90 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  >sp->name);.    
11ea0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11eb0 65 20 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 66  e ERROR:.      f
11ec0 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 65  printf(fp,"%*s e
11ed0 72 72 6f 72 22 2c 69 6e 64 65 6e 74 2c 61 70 2d  rror",indent,ap-
11ee0 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  >sp->name);.    
11ef0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11f00 65 20 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20  e CONFLICT:.    
11f10 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
11f20 73 20 72 65 64 75 63 65 20 25 2d 33 64 20 2a 2a  s reduce %-3d **
11f30 20 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63   Parsing conflic
11f40 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20 20 69  t **",.        i
11f50 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61  ndent,ap->sp->na
11f60 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64  me,ap->x.rp->ind
11f70 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
11f80 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52 45  ;.    case SH_RE
11f90 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61 73 65  SOLVED:.    case
11fa0 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20   RD_RESOLVED:.  
11fb0 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44 3a    case NOT_USED:
11fc0 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20  .      result = 
11fd0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
11fe0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
11ff0 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72  ult;.}../* Gener
12000 61 74 65 20 74 68 65 20 22 79 2e 6f 75 74 70 75  ate the "y.outpu
12010 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76  t" log file */.v
12020 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74  oid ReportOutput
12030 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65  (lemp).struct le
12040 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69  mon *lemp;.{.  i
12050 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
12060 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72  tate *stp;.  str
12070 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
12080 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
12090 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a 66 70   *ap;.  FILE *fp
120a0 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f 6f  ;..  fp = file_o
120b0 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22 2c  pen(lemp,".out",
120c0 22 77 22 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d  "w");.  if( fp==
120d0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 70  0 ) return;.  fp
120e0 72 69 6e 74 66 28 66 70 2c 22 20 5c 62 22 29 3b  rintf(fp," \b");
120f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
12100 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
12110 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  {.    stp = lemp
12120 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
12130 20 66 70 72 69 6e 74 66 28 66 70 2c 22 53 74 61   fprintf(fp,"Sta
12140 74 65 20 25 64 3a 5c 6e 22 2c 73 74 70 2d 3e 69  te %d:\n",stp->i
12150 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 6c  ndex);.    if( l
12160 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29  emp->basisflag )
12170 20 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20   cfp=stp->bp;.  
12180 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
12190 20 20 20 20 20 20 20 20 63 66 70 3d 73 74 70 2d          cfp=stp-
121a0 3e 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65 28  >cfp;.    while(
121b0 20 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63 68   cfp ){.      ch
121c0 61 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20  ar buf[20];.    
121d0 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d    if( cfp->dot==
121e0 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b  cfp->rp->nrhs ){
121f0 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
12200 28 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d  (buf,"(%d)",cfp-
12210 3e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  >rp->index);.   
12220 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
12230 22 20 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b  "    %5s ",buf);
12240 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12250 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
12260 2c 22 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a  ,"          ");.
12270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f        }.      Co
12280 6e 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70  nfigPrint(fp,cfp
12290 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
122a0 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 64 65  (fp,"\n");.#ifde
122b0 66 20 54 45 53 54 0a 20 20 20 20 20 20 53 65 74  f TEST.      Set
122c0 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 77  Print(fp,cfp->fw
122d0 73 2c 6c 65 6d 70 29 3b 0a 20 20 20 20 20 20 50  s,lemp);.      P
122e0 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70  linkPrint(fp,cfp
122f0 2d 3e 66 70 6c 70 2c 22 54 6f 20 20 22 29 3b 0a  ->fplp,"To  ");.
12300 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74        PlinkPrint
12310 28 66 70 2c 63 66 70 2d 3e 62 70 6c 70 2c 22 46  (fp,cfp->bplp,"F
12320 72 6f 6d 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rom");.#endif.  
12330 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61      if( lemp->ba
12340 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d 63 66  sisflag ) cfp=cf
12350 70 2d 3e 62 70 3b 0a 20 20 20 20 20 20 65 6c 73  p->bp;.      els
12360 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
12370 20 20 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74     cfp=cfp->next
12380 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
12390 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20  ntf(fp,"\n");.  
123a0 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
123b0 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
123c0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50 72  t){.      if( Pr
123d0 69 6e 74 41 63 74 69 6f 6e 28 61 70 2c 66 70 2c  intAction(ap,fp,
123e0 33 30 29 20 29 20 66 70 72 69 6e 74 66 28 66 70  30) ) fprintf(fp
123f0 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ,"\n");.    }.  
12400 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e    fprintf(fp,"\n
12410 22 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  ");.  }.  fclose
12420 28 66 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  (fp);.  return;.
12430 7d 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  }../* Search for
12440 20 74 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22   the file "name"
12450 20 77 68 69 63 68 20 69 73 20 69 6e 20 74 68 65   which is in the
12460 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
12470 61 73 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74  as.** the exacut
12480 61 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20  able */.PRIVATE 
12490 63 68 61 72 20 2a 70 61 74 68 73 65 61 72 63 68  char *pathsearch
124a0 28 61 72 67 76 30 2c 6e 61 6d 65 2c 6d 6f 64 65  (argv0,name,mode
124b0 6d 61 73 6b 29 0a 63 68 61 72 20 2a 61 72 67 76  mask).char *argv
124c0 30 3b 0a 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 69  0;.char *name;.i
124d0 6e 74 20 6d 6f 64 65 6d 61 73 6b 3b 0a 7b 0a 20  nt modemask;.{. 
124e0 20 63 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b   char *pathlist;
124f0 0a 20 20 63 68 61 72 20 2a 70 61 74 68 2c 2a 63  .  char *path,*c
12500 70 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 65  p;.  char c;.  e
12510 78 74 65 72 6e 20 69 6e 74 20 61 63 63 65 73 73  xtern int access
12520 28 29 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49  ();..#ifdef __WI
12530 4e 33 32 5f 5f 0a 20 20 63 70 20 3d 20 73 74 72  N32__.  cp = str
12540 72 63 68 72 28 61 72 67 76 30 2c 27 5c 5c 27 29  rchr(argv0,'\\')
12550 3b 0a 23 65 6c 73 65 0a 20 20 63 70 20 3d 20 73  ;.#else.  cp = s
12560 74 72 72 63 68 72 28 61 72 67 76 30 2c 27 2f 27  trrchr(argv0,'/'
12570 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
12580 63 70 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 63  cp ){.    c = *c
12590 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a  p;.    *cp = 0;.
125a0 20 20 20 20 70 61 74 68 20 3d 20 28 63 68 61 72      path = (char
125b0 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65   *)malloc( strle
125c0 6e 28 61 72 67 76 30 29 20 2b 20 73 74 72 6c 65  n(argv0) + strle
125d0 6e 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b 0a 20  n(name) + 2 );. 
125e0 20 20 20 69 66 28 20 70 61 74 68 20 29 20 73 70     if( path ) sp
125f0 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73 2f 25  rintf(path,"%s/%
12600 73 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29 3b 0a  s",argv0,name);.
12610 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 7d      *cp = c;.  }
12620 65 6c 73 65 7b 0a 20 20 20 20 65 78 74 65 72 6e  else{.    extern
12630 20 63 68 61 72 20 2a 67 65 74 65 6e 76 28 29 3b   char *getenv();
12640 0a 20 20 20 20 70 61 74 68 6c 69 73 74 20 3d 20  .    pathlist = 
12650 67 65 74 65 6e 76 28 22 50 41 54 48 22 29 3b 0a  getenv("PATH");.
12660 20 20 20 20 69 66 28 20 70 61 74 68 6c 69 73 74      if( pathlist
12670 3d 3d 30 20 29 20 70 61 74 68 6c 69 73 74 20 3d  ==0 ) pathlist =
12680 20 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f 62 69   ".:/bin:/usr/bi
12690 6e 22 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28  n";.    path = (
126a0 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 73  char *)malloc( s
126b0 74 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 2b  trlen(pathlist)+
126c0 73 74 72 6c 65 6e 28 6e 61 6d 65 29 2b 32 20 29  strlen(name)+2 )
126d0 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68 21 3d  ;.    if( path!=
126e0 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  0 ){.      while
126f0 28 20 2a 70 61 74 68 6c 69 73 74 20 29 7b 0a 20  ( *pathlist ){. 
12700 20 20 20 20 20 20 20 63 70 20 3d 20 73 74 72 63         cp = strc
12710 68 72 28 70 61 74 68 6c 69 73 74 2c 27 3a 27 29  hr(pathlist,':')
12720 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 70  ;.        if( cp
12730 3d 3d 30 20 29 20 63 70 20 3d 20 26 70 61 74 68  ==0 ) cp = &path
12740 6c 69 73 74 5b 73 74 72 6c 65 6e 28 70 61 74 68  list[strlen(path
12750 6c 69 73 74 29 5d 3b 0a 20 20 20 20 20 20 20 20  list)];.        
12760 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20 20  c = *cp;.       
12770 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 20 20   *cp = 0;.      
12780 20 20 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22    sprintf(path,"
12790 25 73 2f 25 73 22 2c 70 61 74 68 6c 69 73 74 2c  %s/%s",pathlist,
127a0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 2a  name);.        *
127b0 63 70 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  cp = c;.        
127c0 69 66 28 20 63 3d 3d 30 20 29 20 70 61 74 68 6c  if( c==0 ) pathl
127d0 69 73 74 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  ist = "";.      
127e0 20 20 65 6c 73 65 20 70 61 74 68 6c 69 73 74 20    else pathlist 
127f0 3d 20 26 63 70 5b 31 5d 3b 0a 20 20 20 20 20 20  = &cp[1];.      
12800 20 20 69 66 28 20 61 63 63 65 73 73 28 70 61 74    if( access(pat
12810 68 2c 6d 6f 64 65 6d 61 73 6b 29 3d 3d 30 20 29  h,modemask)==0 )
12820 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
12830 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12840 72 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47  rn path;.}../* G
12850 69 76 65 6e 20 61 6e 20 61 63 74 69 6f 6e 2c 20  iven an action, 
12860 63 6f 6d 70 75 74 65 20 74 68 65 20 69 6e 74 65  compute the inte
12870 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ger value for th
12880 61 74 20 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69  at action.** whi
12890 63 68 20 69 73 20 74 6f 20 62 65 20 70 75 74 20  ch is to be put 
128a0 69 6e 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  in the action ta
128b0 62 6c 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ble of the gener
128c0 61 74 65 64 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  ated machine..**
128d0 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
128e0 20 69 66 20 6e 6f 20 61 63 74 69 6f 6e 20 73 68   if no action sh
128f0 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74 65  ould be generate
12900 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e  d..*/.PRIVATE in
12910 74 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e  t compute_action
12920 28 6c 65 6d 70 2c 61 70 29 0a 73 74 72 75 63 74  (lemp,ap).struct
12930 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73 74   lemon *lemp;.st
12940 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b  ruct action *ap;
12950 0a 7b 0a 20 20 69 6e 74 20 61 63 74 3b 0a 20 20  .{.  int act;.  
12960 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65  switch( ap->type
12970 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49   ){.    case SHI
12980 46 54 3a 20 20 61 63 74 20 3d 20 61 70 2d 3e 78  FT:  act = ap->x
12990 2e 73 74 70 2d 3e 69 6e 64 65 78 3b 20 20 20 20  .stp->index;    
129a0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
129b0 3b 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43  ;.    case REDUC
129c0 45 3a 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 72  E: act = ap->x.r
129d0 70 2d 3e 69 6e 64 65 78 20 2b 20 6c 65 6d 70 2d  p->index + lemp-
129e0 3e 6e 73 74 61 74 65 3b 20 62 72 65 61 6b 3b 0a  >nstate; break;.
129f0 20 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a 20      case ERROR: 
12a00 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74   act = lemp->nst
12a10 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c  ate + lemp->nrul
12a20 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e;     break;.  
12a30 20 20 63 61 73 65 20 41 43 43 45 50 54 3a 20 61    case ACCEPT: a
12a40 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  ct = lemp->nstat
12a50 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20  e + lemp->nrule 
12a60 2b 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  + 1; break;.    
12a70 64 65 66 61 75 6c 74 3a 20 20 20 20 20 61 63 74  default:     act
12a80 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20 20   = -1; break;.  
12a90 7d 0a 20 20 72 65 74 75 72 6e 20 61 63 74 3b 0a  }.  return act;.
12aa0 7d 0a 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 53  }..#define LINES
12ab0 49 5a 45 20 31 30 30 30 0a 2f 2a 20 54 68 65 20  IZE 1000./* The 
12ac0 6e 65 78 74 20 63 6c 75 73 74 65 72 20 6f 66 20  next cluster of 
12ad0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 66 6f 72  routines are for
12ae0 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 65 6d   reading the tem
12af0 70 6c 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61 6e  plate file.** an
12b00 64 20 77 72 69 74 69 6e 67 20 74 68 65 20 72 65  d writing the re
12b10 73 75 6c 74 73 20 74 6f 20 74 68 65 20 67 65 6e  sults to the gen
12b20 65 72 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f  erated parser */
12b30 0a 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 75  ./* The first fu
12b40 6e 63 74 69 6f 6e 20 74 72 61 6e 73 66 65 72 73  nction transfers
12b50 20 64 61 74 61 20 66 72 6f 6d 20 22 69 6e 22 20   data from "in" 
12b60 74 6f 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a 2a  to "out" until.*
12b70 2a 20 61 20 6c 69 6e 65 20 69 73 20 73 65 65 6e  * a line is seen
12b80 20 77 68 69 63 68 20 62 65 67 69 6e 73 20 77 69   which begins wi
12b90 74 68 20 22 25 25 22 2e 20 20 54 68 65 20 6c 69  th "%%".  The li
12ba0 6e 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  ne number is.** 
12bb0 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69  tracked..**.** i
12bc0 66 20 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e 20  f name!=0, then 
12bd0 61 6e 79 20 77 6f 72 64 20 74 68 61 74 20 62 65  any word that be
12be0 67 69 6e 20 77 69 74 68 20 22 50 61 72 73 65 22  gin with "Parse"
12bf0 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 2a   is changed to.*
12c00 2a 20 62 65 67 69 6e 20 77 69 74 68 20 2a 6e 61  * begin with *na
12c10 6d 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50  me instead..*/.P
12c20 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74  RIVATE void tplt
12c30 5f 78 66 65 72 28 6e 61 6d 65 2c 69 6e 2c 6f 75  _xfer(name,in,ou
12c40 74 2c 6c 69 6e 65 6e 6f 29 0a 63 68 61 72 20 2a  t,lineno).char *
12c50 6e 61 6d 65 3b 0a 46 49 4c 45 20 2a 69 6e 3b 0a  name;.FILE *in;.
12c60 46 49 4c 45 20 2a 6f 75 74 3b 0a 69 6e 74 20 2a  FILE *out;.int *
12c70 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 6e 74 20  lineno;.{.  int 
12c80 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 63 68 61  i, iStart;.  cha
12c90 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d  r line[LINESIZE]
12ca0 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73  ;.  while( fgets
12cb0 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69  (line,LINESIZE,i
12cc0 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d 21 3d  n) && (line[0]!=
12cd0 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21 3d  '%' || line[1]!=
12ce0 27 25 27 29 20 29 7b 0a 20 20 20 20 28 2a 6c 69  '%') ){.    (*li
12cf0 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69 53 74  neno)++;.    iSt
12d00 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  art = 0;.    if(
12d10 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 66   name ){.      f
12d20 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d 3b  or(i=0; line[i];
12d30 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
12d40 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27 20  f( line[i]=='P' 
12d50 26 26 20 73 74 72 6e 63 6d 70 28 26 6c 69 6e 65  && strncmp(&line
12d60 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35 29 3d 3d  [i],"Parse",5)==
12d70 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
12d80 69 3d 3d 30 20 7c 7c 20 21 69 73 61 6c 70 68 61  i==0 || !isalpha
12d90 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20 20 20  (line[i-1])).   
12da0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
12db0 20 20 69 66 28 20 69 3e 69 53 74 61 72 74 20 29    if( i>iStart )
12dc0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e   fprintf(out,"%.
12dd0 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c 26 6c 69  *s",i-iStart,&li
12de0 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 20  ne[iStart]);.   
12df0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
12e00 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b 0a 20  ut,"%s",name);. 
12e10 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b           i += 4;
12e20 0a 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72  .          iStar
12e30 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20  t = i+1;.       
12e40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
12e50 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
12e60 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53 74 61  ,"%s",&line[iSta
12e70 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  rt]);.  }.}../* 
12e80 54 68 65 20 6e 65 78 74 20 66 75 6e 63 74 69 6f  The next functio
12e90 6e 20 66 69 6e 64 73 20 74 68 65 20 74 65 6d 70  n finds the temp
12ea0 6c 61 74 65 20 66 69 6c 65 20 61 6e 64 20 6f 70  late file and op
12eb0 65 6e 73 20 69 74 2c 20 72 65 74 75 72 6e 69 6e  ens it, returnin
12ec0 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  g.** a pointer t
12ed0 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c  o the opened fil
12ee0 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49  e. */.PRIVATE FI
12ef0 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28 6c 65  LE *tplt_open(le
12f00 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
12f10 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 61 74   *lemp;.{.  stat
12f20 69 63 20 63 68 61 72 20 74 65 6d 70 6c 61 74 65  ic char template
12f30 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70 61 72  name[] = "lempar
12f40 2e 63 22 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  .c";.  char buf[
12f50 31 30 30 30 5d 3b 0a 20 20 46 49 4c 45 20 2a 69  1000];.  FILE *i
12f60 6e 3b 0a 20 20 63 68 61 72 20 2a 74 70 6c 74 6e  n;.  char *tpltn
12f70 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b  ame;.  char *cp;
12f80 0a 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72  ..  cp = strrchr
12f90 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
12fa0 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29  '.');.  if( cp )
12fb0 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 62 75  {.    sprintf(bu
12fc0 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 75 6e 73  f,"%.*s.lt",(uns
12fd0 69 67 6e 65 64 20 6c 6f 6e 67 29 63 70 2d 28 75  igned long)cp-(u
12fe0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 6c 65 6d  nsigned long)lem
12ff0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 6c 65 6d 70  p->filename,lemp
13000 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  ->filename);.  }
13010 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74  else{.    sprint
13020 66 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c 6c 65  f(buf,"%s.lt",le
13030 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
13040 20 7d 0a 20 20 69 66 28 20 61 63 63 65 73 73 28   }.  if( access(
13050 62 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20  buf,004)==0 ){. 
13060 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 62 75     tpltname = bu
13070 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  f;.  }else if( a
13080 63 63 65 73 73 28 74 65 6d 70 6c 61 74 65 6e 61  ccess(templatena
13090 6d 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20  me,004)==0 ){.  
130a0 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74 65 6d    tpltname = tem
130b0 70 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d 65 6c  platename;.  }el
130c0 73 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65  se{.    tpltname
130d0 20 3d 20 70 61 74 68 73 65 61 72 63 68 28 6c 65   = pathsearch(le
130e0 6d 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70 6c 61  mp->argv0,templa
130f0 74 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d 0a 20  tename,0);.  }. 
13100 20 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d 3d 30   if( tpltname==0
13110 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
13120 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69  stderr,"Can't fi
13130 6e 64 20 74 68 65 20 70 61 72 73 65 72 20 64 72  nd the parser dr
13140 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69  iver template fi
13150 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20  le \"%s\".\n",. 
13160 20 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29     templatename)
13170 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  ;.    lemp->erro
13180 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
13190 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d  rn 0;.  }.  in =
131a0 20 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d 65 2c   fopen(tpltname,
131b0 22 72 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  "r");.  if( in==
131c0 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
131d0 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f  (stderr,"Can't o
131e0 70 65 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65  pen the template
131f0 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22   file \"%s\".\n"
13200 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a  ,templatename);.
13210 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
13220 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
13230 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
13240 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74   in;.}../* Print
13250 20 61 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65   a string to the
13260 20 66 69 6c 65 20 61 6e 64 20 6b 65 65 70 20 74   file and keep t
13270 68 65 20 6c 69 6e 65 6e 75 6d 62 65 72 20 75 70  he linenumber up
13280 20 74 6f 20 64 61 74 65 20 2a 2f 0a 50 52 49 56   to date */.PRIV
13290 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 70 72  ATE void tplt_pr
132a0 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 73 74 72  int(out,lemp,str
132b0 2c 73 74 72 6c 6e 2c 6c 69 6e 65 6e 6f 29 0a 46  ,strln,lineno).F
132c0 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74  ILE *out;.struct
132d0 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 63 68   lemon *lemp;.ch
132e0 61 72 20 2a 73 74 72 3b 0a 69 6e 74 20 73 74 72  ar *str;.int str
132f0 6c 6e 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b  ln;.int *lineno;
13300 0a 7b 0a 20 20 69 66 28 20 73 74 72 3d 3d 30 20  .{.  if( str==0 
13310 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 70 72 69  ) return;.  fpri
13320 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25  ntf(out,"#line %
13330 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 73 74 72 6c  d \"%s\"\n",strl
13340 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  n,lemp->filename
13350 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a  ); (*lineno)++;.
13360 20 20 77 68 69 6c 65 28 20 2a 73 74 72 20 29 7b    while( *str ){
13370 0a 20 20 20 20 69 66 28 20 2a 73 74 72 3d 3d 27  .    if( *str=='
13380 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n' ) (*lineno)+
13390 2b 3b 0a 20 20 20 20 70 75 74 63 28 2a 73 74 72  +;.    putc(*str
133a0 2c 6f 75 74 29 3b 0a 20 20 20 20 73 74 72 2b 2b  ,out);.    str++
133b0 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ;.  }.  fprintf(
133c0 6f 75 74 2c 22 5c 6e 23 6c 69 6e 65 20 25 64 20  out,"\n#line %d 
133d0 5c 22 25 73 5c 22 5c 6e 22 2c 2a 6c 69 6e 65 6e  \"%s\"\n",*linen
133e0 6f 2b 32 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  o+2,lemp->outnam
133f0 65 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 3d 32  e); (*lineno)+=2
13400 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
13410 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
13420 6e 67 20 72 6f 75 74 69 6e 65 20 65 6d 69 74 73  ng routine emits
13430 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65   code for the de
13440 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
13450 0a 2a 2a 20 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f  .** symbol sp.*/
13460 0a 76 6f 69 64 20 65 6d 69 74 5f 64 65 73 74 72  .void emit_destr
13470 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 73  uctor_code(out,s
13480 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f 29 0a 46  p,lemp,lineno).F
13490 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74  ILE *out;.struct
134a0 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 73 74 72   symbol *sp;.str
134b0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
134c0 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a  .int *lineno;.{.
134d0 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 69 6e 74   char *cp;.. int
134e0 20 6c 69 6e 65 63 6e 74 20 3d 20 30 3b 0a 20 69   linecnt = 0;. i
134f0 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52  f( sp->type==TER
13500 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 63 70 20 3d  MINAL ){.   cp =
13510 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74   lemp->tokendest
13520 3b 0a 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29  ;.   if( cp==0 )
13530 20 72 65 74 75 72 6e 3b 0a 20 20 20 66 70 72 69   return;.   fpri
13540 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25  ntf(out,"#line %
13550 64 20 5c 22 25 73 5c 22 5c 6e 7b 22 2c 6c 65 6d  d \"%s\"\n{",lem
13560 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 6c 6e 2c 6c  p->tokendestln,l
13570 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a  emp->filename);.
13580 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 64   }else if( sp->d
13590 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
135a0 63 70 20 3d 20 73 70 2d 3e 64 65 73 74 72 75 63  cp = sp->destruc
135b0 74 6f 72 3b 0a 20 20 20 66 70 72 69 6e 74 66 28  tor;.   fprintf(
135c0 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22  out,"#line %d \"
135d0 25 73 5c 22 5c 6e 7b 22 2c 73 70 2d 3e 64 65 73  %s\"\n{",sp->des
135e0 74 72 75 63 74 6f 72 6c 6e 2c 6c 65 6d 70 2d 3e  tructorln,lemp->
135f0 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 7d 65 6c 73  filename);. }els
13600 65 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64  e if( lemp->vard
13610 65 73 74 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c  est ){.   cp = l
13620 65 6d 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20  emp->vardest;.  
13630 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74   if( cp==0 ) ret
13640 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28  urn;.   fprintf(
13650 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22  out,"#line %d \"
13660 25 73 5c 22 5c 6e 7b 22 2c 6c 65 6d 70 2d 3e 76  %s\"\n{",lemp->v
13670 61 72 64 65 73 74 6c 6e 2c 6c 65 6d 70 2d 3e 66  ardestln,lemp->f
13680 69 6c 65 6e 61 6d 65 29 3b 0a 20 7d 0a 20 66 6f  ilename);. }. fo
13690 72 28 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a  r(; *cp; cp++){.
136a0 20 20 20 69 66 28 20 2a 63 70 3d 3d 27 24 27 20     if( *cp=='$' 
136b0 26 26 20 63 70 5b 31 5d 3d 3d 27 24 27 20 29 7b  && cp[1]=='$' ){
136c0 0a 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  .     fprintf(ou
136d0 74 2c 22 28 79 79 70 6d 69 6e 6f 72 2d 3e 79 79  t,"(yypminor->yy
136e0 25 64 29 22 2c 73 70 2d 3e 64 74 6e 75 6d 29 3b  %d)",sp->dtnum);
136f0 0a 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20  .     cp++;.    
13700 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 7d 0a   continue;.   }.
13710 20 20 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27     if( *cp=='\n'
13720 20 29 20 6c 69 6e 65 63 6e 74 2b 2b 3b 0a 20 20   ) linecnt++;.  
13730 20 66 70 75 74 63 28 2a 63 70 2c 6f 75 74 29 3b   fputc(*cp,out);
13740 0a 20 7d 0a 20 28 2a 6c 69 6e 65 6e 6f 29 20 2b  . }. (*lineno) +
13750 3d 20 33 20 2b 20 6c 69 6e 65 63 6e 74 3b 0a 20  = 3 + linecnt;. 
13760 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e  fprintf(out,"}\n
13770 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c  #line %d \"%s\"\
13780 6e 22 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d  n",*lineno,lemp-
13790 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 72 65 74 75  >outname);. retu
137a0 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rn;.}../*.** Ret
137b0 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65  urn TRUE (non-ze
137c0 72 6f 29 20 69 66 20 74 68 65 20 67 69 76 65 6e  ro) if the given
137d0 20 73 79 6d 62 6f 6c 20 68 61 73 20 61 20 64 65   symbol has a de
137e0 73 74 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69 6e 74  structor..*/.int
137f0 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28   has_destructor(
13800 73 70 2c 20 6c 65 6d 70 29 0a 73 74 72 75 63 74  sp, lemp).struct
13810 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 73 74 72   symbol *sp;.str
13820 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
13830 0a 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  .{.  int ret;.  
13840 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45  if( sp->type==TE
13850 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 72 65  RMINAL ){.    re
13860 74 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64  t = lemp->tokend
13870 65 73 74 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b  est!=0;.  }else{
13880 0a 20 20 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d  .    ret = lemp-
13890 3e 76 61 72 64 65 73 74 21 3d 30 20 7c 7c 20 73  >vardest!=0 || s
138a0 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30  p->destructor!=0
138b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
138c0 65 74 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 47 65  et;.}../* .** Ge
138d0 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63  nerate code whic
138e0 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 20  h executes when 
138f0 74 68 65 20 72 75 6c 65 20 22 72 70 22 20 69 73  the rule "rp" is
13900 20 72 65 64 75 63 65 64 2e 20 20 57 72 69 74 65   reduced.  Write
13910 0a 2a 2a 20 74 68 65 20 63 6f 64 65 20 74 6f 20  .** the code to 
13920 22 6f 75 74 22 2e 20 20 4d 61 6b 65 20 73 75 72  "out".  Make sur
13930 65 20 6c 69 6e 65 6e 6f 20 73 74 61 79 73 20 75  e lineno stays u
13940 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 50 52  p-to-date..*/.PR
13950 49 56 41 54 45 20 76 6f 69 64 20 65 6d 69 74 5f  IVATE void emit_
13960 63 6f 64 65 28 6f 75 74 2c 72 70 2c 6c 65 6d 70  code(out,rp,lemp
13970 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a 6f  ,lineno).FILE *o
13980 75 74 3b 0a 73 74 72 75 63 74 20 72 75 6c 65 20  ut;.struct rule 
13990 2a 72 70 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f  *rp;.struct lemo
139a0 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20 2a 6c 69  n *lemp;.int *li
139b0 6e 65 6e 6f 3b 0a 7b 0a 20 63 68 61 72 20 2a 63  neno;.{. char *c
139c0 70 2c 20 2a 78 70 3b 0a 20 69 6e 74 20 6c 69 6e  p, *xp;. int lin
139d0 65 63 6e 74 20 3d 20 30 3b 0a 20 69 6e 74 20 69  ecnt = 0;. int i
139e0 3b 0a 20 63 68 61 72 20 6c 68 73 75 73 65 64 20  ;. char lhsused 
139f0 3d 20 30 3b 20 20 20 20 2f 2a 20 54 72 75 65 20  = 0;    /* True 
13a00 69 66 20 74 68 65 20 4c 48 53 20 65 6c 65 6d 65  if the LHS eleme
13a10 6e 74 20 68 61 73 20 62 65 65 6e 20 75 73 65 64  nt has been used
13a20 20 2a 2f 0a 20 63 68 61 72 20 75 73 65 64 5b 4d   */. char used[M
13a30 41 58 52 48 53 5d 3b 20 20 20 2f 2a 20 54 72 75  AXRHS];   /* Tru
13a40 65 20 66 6f 72 20 65 61 63 68 20 52 48 53 20 65  e for each RHS e
13a50 6c 65 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  lement which is 
13a60 75 73 65 64 20 2a 2f 0a 0a 20 66 6f 72 28 69 3d  used */.. for(i=
13a70 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
13a80 2b 2b 29 20 75 73 65 64 5b 69 5d 20 3d 20 30 3b  ++) used[i] = 0;
13a90 0a 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 0a 0a  . lhsused = 0;..
13aa0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
13ab0 65 20 74 6f 20 64 6f 20 74 68 65 20 72 65 64 75  e to do the redu
13ac0 63 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 69 66  ce action */. if
13ad0 28 20 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20  ( rp->code ){.  
13ae0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 6c   fprintf(out,"#l
13af0 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c 6e 7b  ine %d \"%s\"\n{
13b00 22 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d 70 2d  ",rp->line,lemp-
13b10 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 66  >filename);.   f
13b20 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b 20  or(cp=rp->code; 
13b30 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20  *cp; cp++){.    
13b40 20 69 66 28 20 69 73 61 6c 70 68 61 28 2a 63 70   if( isalpha(*cp
13b50 29 20 26 26 20 28 63 70 3d 3d 72 70 2d 3e 63 6f  ) && (cp==rp->co
13b60 64 65 20 7c 7c 20 21 69 73 61 6c 6e 75 6d 28 63  de || !isalnum(c
13b70 70 5b 2d 31 5d 29 29 20 29 7b 0a 20 20 20 20 20  p[-1])) ){.     
13b80 20 20 63 68 61 72 20 73 61 76 65 64 3b 0a 20 20    char saved;.  
13b90 20 20 20 20 20 66 6f 72 28 78 70 3d 20 26 63 70       for(xp= &cp
13ba0 5b 31 5d 3b 20 69 73 61 6c 6e 75 6d 28 2a 78 70  [1]; isalnum(*xp
13bb0 29 3b 20 78 70 2b 2b 29 3b 0a 20 20 20 20 20 20  ); xp++);.      
13bc0 20 73 61 76 65 64 20 3d 20 2a 78 70 3b 0a 20 20   saved = *xp;.  
13bd0 20 20 20 20 20 2a 78 70 20 3d 20 30 3b 0a 20 20       *xp = 0;.  
13be0 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73       if( rp->lhs
13bf0 61 6c 69 61 73 20 26 26 20 73 74 72 63 6d 70 28  alias && strcmp(
13c00 63 70 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29  cp,rp->lhsalias)
13c10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13c20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 79 79 67  fprintf(out,"yyg
13c30 6f 74 6f 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 72  otominor.yy%d",r
13c40 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 29 3b 0a  p->lhs->dtnum);.
13c50 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 78 70           cp = xp
13c60 3b 0a 20 20 20 20 20 20 20 20 20 6c 68 73 75 73  ;.         lhsus
13c70 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 7d  ed = 1;.       }
13c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 66  else{.         f
13c90 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
13ca0 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
13cb0 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73       if( rp->rhs
13cc0 61 6c 69 61 73 5b 69 5d 20 26 26 20 73 74 72 63  alias[i] && strc
13cd0 6d 70 28 63 70 2c 72 70 2d 3e 72 68 73 61 6c 69  mp(cp,rp->rhsali
13ce0 61 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20  as[i])==0 ){.   
13cf0 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
13d00 66 28 6f 75 74 2c 22 79 79 6d 73 70 5b 25 64 5d  f(out,"yymsp[%d]
13d10 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 69 2d 72  .minor.yy%d",i-r
13d20 70 2d 3e 6e 72 68 73 2b 31 2c 72 70 2d 3e 72 68  p->nrhs+1,rp->rh
13d30 73 5b 69 5d 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20  s[i]->dtnum);.  
13d40 20 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20             cp = 
13d50 78 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  xp;.            
13d60 20 75 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20   used[i] = 1;.  
13d70 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
13d80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ;.           }. 
13d90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13da0 20 7d 0a 20 20 20 20 20 20 20 2a 78 70 20 3d 20   }.       *xp = 
13db0 73 61 76 65 64 3b 0a 20 20 20 20 20 7d 0a 20 20  saved;.     }.  
13dc0 20 20 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27     if( *cp=='\n'
13dd0 20 29 20 6c 69 6e 65 63 6e 74 2b 2b 3b 0a 20 20   ) linecnt++;.  
13de0 20 20 20 66 70 75 74 63 28 2a 63 70 2c 6f 75 74     fputc(*cp,out
13df0 29 3b 0a 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c  );.   } /* End l
13e00 6f 6f 70 20 2a 2f 0a 20 20 20 28 2a 6c 69 6e 65  oop */.   (*line
13e10 6e 6f 29 20 2b 3d 20 33 20 2b 20 6c 69 6e 65 63  no) += 3 + linec
13e20 6e 74 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f  nt;.   fprintf(o
13e30 75 74 2c 22 7d 5c 6e 23 6c 69 6e 65 20 25 64 20  ut,"}\n#line %d 
13e40 5c 22 25 73 5c 22 5c 6e 22 2c 2a 6c 69 6e 65 6e  \"%s\"\n",*linen
13e50 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29  o,lemp->outname)
13e60 3b 0a 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20  ;. } /* End if( 
13e70 72 70 2d 3e 63 6f 64 65 20 29 20 2a 2f 0a 0a 20  rp->code ) */.. 
13e80 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  /* Check to make
13e90 20 73 75 72 65 20 74 68 65 20 4c 48 53 20 68 61   sure the LHS ha
13ea0 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20  s been used */. 
13eb0 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  if( rp->lhsalias
13ec0 20 26 26 20 21 6c 68 73 75 73 65 64 20 29 7b 0a   && !lhsused ){.
13ed0 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
13ee0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72  ->filename,rp->r
13ef0 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 22 4c  uleline,.     "L
13f00 61 62 65 6c 20 5c 22 25 73 5c 22 20 66 6f 72 20  abel \"%s\" for 
13f10 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e 65  \"%s(%s)\" is ne
13f20 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20 20  ver used.",.    
13f30 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c     rp->lhsalias,
13f40 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 72 70  rp->lhs->name,rp
13f50 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
13f60 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
13f70 3b 0a 20 7d 0a 0a 20 2f 2a 20 47 65 6e 65 72 61  ;. }.. /* Genera
13f80 74 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 6f  te destructor co
13f90 64 65 20 66 6f 72 20 52 48 53 20 73 79 6d 62 6f  de for RHS symbo
13fa0 6c 73 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ls which are not
13fb0 20 75 73 65 64 20 69 6e 20 74 68 65 0a 20 2a 2a   used in the. **
13fc0 20 72 65 64 75 63 65 20 63 6f 64 65 20 2a 2f 0a   reduce code */.
13fd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
13fe0 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 69  nrhs; i++){.   i
13ff0 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  f( rp->rhsalias[
14000 69 5d 20 26 26 20 21 75 73 65 64 5b 69 5d 20 29  i] && !used[i] )
14010 7b 0a 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28  {.     ErrorMsg(
14020 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72  lemp->filename,r
14030 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20  p->ruleline,.   
14040 20 20 20 20 22 4c 61 62 65 6c 20 25 73 20 66 6f      "Label %s fo
14050 72 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20  r \"%s(%s)\" is 
14060 6e 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20  never used.",.  
14070 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61       rp->rhsalia
14080 73 5b 69 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d  s[i],rp->rhs[i]-
14090 3e 6e 61 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69  >name,rp->rhsali
140a0 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20 6c 65 6d  as[i]);.     lem
140b0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
140c0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70 2d 3e    }else if( rp->
140d0 72 68 73 61 6c 69 61 73 5b 69 5d 3d 3d 30 20 29  rhsalias[i]==0 )
140e0 7b 0a 20 20 20 20 20 69 66 28 20 68 61 73 5f 64  {.     if( has_d
140f0 65 73 74 72 75 63 74 6f 72 28 72 70 2d 3e 72 68  estructor(rp->rh
14100 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20 20  s[i],lemp) ){.  
14110 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
14120 2c 22 20 20 79 79 5f 64 65 73 74 72 75 63 74 6f  ,"  yy_destructo
14130 72 28 25 64 2c 26 79 79 6d 73 70 5b 25 64 5d 2e  r(%d,&yymsp[%d].
14140 6d 69 6e 6f 72 29 3b 5c 6e 22 2c 0a 20 20 20 20  minor);\n",.    
14150 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d        rp->rhs[i]
14160 2d 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e 72  ->index,i-rp->nr
14170 68 73 2b 31 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29  hs+1); (*lineno)
14180 2b 2b 3b 0a 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ++;.     }else{.
14190 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
141a0 75 74 2c 22 20 20 20 20 20 20 20 20 2f 2a 20 4e  ut,"        /* N
141b0 6f 20 64 65 73 74 72 75 63 74 6f 72 20 64 65 66  o destructor def
141c0 69 6e 65 64 20 66 6f 72 20 25 73 20 2a 2f 5c 6e  ined for %s */\n
141d0 22 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 72  ",.        rp->r
141e0 68 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  hs[i]->name);.  
141f0 20 20 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b        (*lineno)+
14200 2b 3b 0a 20 20 20 20 20 7d 0a 20 20 20 7d 0a 20  +;.     }.   }. 
14210 7d 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  }. return;.}../*
14220 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 64 65  .** Print the de
14230 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  finition of the 
14240 75 6e 69 6f 6e 20 75 73 65 64 20 66 6f 72 20 74  union used for t
14250 68 65 20 70 61 72 73 65 72 27 73 20 64 61 74 61  he parser's data
14260 20 73 74 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20   stack..** This 
14270 75 6e 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 66  union contains f
14280 69 65 6c 64 73 20 66 6f 72 20 65 76 65 72 79 20  ields for every 
14290 70 6f 73 73 69 62 6c 65 20 64 61 74 61 20 74 79  possible data ty
142a0 70 65 20 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a  pe for tokens.**
142b0 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
142c0 73 2e 20 20 49 6e 20 74 68 65 20 70 72 6f 63 65  s.  In the proce
142d0 73 73 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20  ss of computing 
142e0 61 6e 64 20 70 72 69 6e 74 69 6e 67 20 74 68 69  and printing thi
142f0 73 0a 2a 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f  s.** union, also
14300 20 73 65 74 20 74 68 65 20 22 2e 64 74 6e 75 6d   set the ".dtnum
14310 22 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79  " field of every
14320 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f   terminal and no
14330 6e 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d  nterminal.** sym
14340 62 6f 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72 69  bol..*/.void pri
14350 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f  nt_stack_union(o
14360 75 74 2c 6c 65 6d 70 2c 70 6c 69 6e 65 6e 6f 2c  ut,lemp,plineno,
14370 6d 68 66 6c 61 67 29 0a 46 49 4c 45 20 2a 6f 75  mhflag).FILE *ou
14380 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
14390 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
143a0 74 20 73 74 72 65 61 6d 20 2a 2f 0a 73 74 72 75  t stream */.stru
143b0 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 20  ct lemon *lemp; 
143c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
143d0 61 69 6e 20 69 6e 66 6f 20 73 74 72 75 63 74 75  ain info structu
143e0 72 65 20 66 6f 72 20 74 68 69 73 20 70 61 72 73  re for this pars
143f0 65 72 20 2a 2f 0a 69 6e 74 20 2a 70 6c 69 6e 65  er */.int *pline
14400 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
14410 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
14420 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  the line number 
14430 2a 2f 0a 69 6e 74 20 6d 68 66 6c 61 67 3b 20 20  */.int mhflag;  
14440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14450 2a 20 54 72 75 65 20 69 66 20 67 65 6e 65 72 61  * True if genera
14460 74 69 6e 67 20 6d 61 6b 65 68 65 61 64 65 72 73  ting makeheaders
14470 20 6f 75 74 70 75 74 20 2a 2f 0a 7b 0a 20 20 69   output */.{.  i
14480 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69  nt lineno = *pli
14490 6e 65 6e 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20  neno;    /* The 
144a0 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  line number of t
144b0 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63  he output */.  c
144c0 68 61 72 20 2a 2a 74 79 70 65 73 3b 20 20 20 20  har **types;    
144d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 68 61           /* A ha
144e0 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61  sh table of data
144f0 74 79 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61  types */.  int a
14500 72 72 61 79 73 69 7a 65 3b 20 20 20 20 20 20 20  rraysize;       
14510 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
14520 74 68 65 20 22 74 79 70 65 73 22 20 61 72 72 61  the "types" arra
14530 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74  y */.  int maxdt
14540 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 20  length;         
14550 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67   /* Maximum leng
14560 74 68 20 6f 66 20 61 6e 79 20 22 2e 64 61 74 61  th of any ".data
14570 74 79 70 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a  type" field. */.
14580 20 20 63 68 61 72 20 2a 73 74 64 64 74 3b 20 20    char *stddt;  
14590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
145a0 74 61 6e 64 61 72 64 69 7a 65 64 20 6e 61 6d 65  tandardized name
145b0 20 66 6f 72 20 61 20 64 61 74 61 74 79 70 65 20   for a datatype 
145c0 2a 2f 0a 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20  */.  int i,j;   
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
145e0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
145f0 2a 2f 0a 20 20 69 6e 74 20 68 61 73 68 3b 20 20  */.  int hash;  
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14610 2a 20 46 6f 72 20 68 61 73 68 69 6e 67 20 74 68  * For hashing th
14620 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 79 70 65  e name of a type
14630 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65   */.  char *name
14640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14650 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70  /* Name of the p
14660 61 72 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41  arser */..  /* A
14670 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
14680 69 61 6c 69 7a 65 20 74 79 70 65 73 5b 5d 20 61  ialize types[] a
14690 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73 74 64 64  nd allocate stdd
146a0 74 5b 5d 20 2a 2f 0a 20 20 61 72 72 61 79 73 69  t[] */.  arraysi
146b0 7a 65 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  ze = lemp->nsymb
146c0 6f 6c 20 2a 20 32 3b 0a 20 20 74 79 70 65 73 20  ol * 2;.  types 
146d0 3d 20 28 63 68 61 72 2a 2a 29 6d 61 6c 6c 6f 63  = (char**)malloc
146e0 28 20 61 72 72 61 79 73 69 7a 65 20 2a 20 73 69  ( arraysize * si
146f0 7a 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 20  zeof(char*) );. 
14700 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61   for(i=0; i<arra
14710 79 73 69 7a 65 3b 20 69 2b 2b 29 20 74 79 70 65  ysize; i++) type
14720 73 5b 69 5d 20 3d 20 30 3b 0a 20 20 6d 61 78 64  s[i] = 0;.  maxd
14730 74 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 69  tlength = 0;.  i
14740 66 28 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65  f( lemp->vartype
14750 20 29 7b 0a 20 20 20 20 6d 61 78 64 74 6c 65 6e   ){.    maxdtlen
14760 67 74 68 20 3d 20 73 74 72 6c 65 6e 28 6c 65 6d  gth = strlen(lem
14770 70 2d 3e 76 61 72 74 79 70 65 29 3b 0a 20 20 7d  p->vartype);.  }
14780 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
14790 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
147a0 29 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  ){.    int len;.
147b0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
147c0 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  l *sp = lemp->sy
147d0 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66  mbols[i];.    if
147e0 28 20 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d  ( sp->datatype==
147f0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
14800 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 73    len = strlen(s
14810 70 2d 3e 64 61 74 61 74 79 70 65 29 3b 0a 20 20  p->datatype);.  
14820 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 64 74 6c    if( len>maxdtl
14830 65 6e 67 74 68 20 29 20 6d 61 78 64 74 6c 65 6e  ength ) maxdtlen
14840 67 74 68 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20  gth = len;.  }. 
14850 20 73 74 64 64 74 20 3d 20 28 63 68 61 72 2a 29   stddt = (char*)
14860 6d 61 6c 6c 6f 63 28 20 6d 61 78 64 74 6c 65 6e  malloc( maxdtlen
14870 67 74 68 2a 32 20 2b 20 31 20 29 3b 0a 20 20 69  gth*2 + 1 );.  i
14880 66 28 20 74 79 70 65 73 3d 3d 30 20 7c 7c 20 73  f( types==0 || s
14890 74 64 64 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66  tddt==0 ){.    f
148a0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f  printf(stderr,"O
148b0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22  ut of memory.\n"
148c0 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
148d0 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20    }..  /* Build 
148e0 61 20 68 61 73 68 20 74 61 62 6c 65 20 6f 66 20  a hash table of 
148f0 64 61 74 61 74 79 70 65 73 2e 20 54 68 65 20 22  datatypes. The "
14900 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66  .dtnum" field of
14910 20 65 61 63 68 20 73 79 6d 62 6f 6c 0a 20 20 2a   each symbol.  *
14920 2a 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77  * is filled in w
14930 69 74 68 20 74 68 65 20 68 61 73 68 20 69 6e 64  ith the hash ind
14940 65 78 20 70 6c 75 73 20 31 2e 20 20 41 20 22 2e  ex plus 1.  A ".
14950 64 74 6e 75 6d 22 20 76 61 6c 75 65 20 6f 66 20  dtnum" value of 
14960 30 20 69 73 0a 20 20 2a 2a 20 75 73 65 64 20 66  0 is.  ** used f
14970 6f 72 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  or terminal symb
14980 6f 6c 73 2e 20 20 49 66 20 74 68 65 72 65 20 69  ols.  If there i
14990 73 20 6e 6f 20 25 64 65 66 61 75 6c 74 5f 74 79  s no %default_ty
149a0 70 65 20 64 65 66 69 6e 65 64 20 74 68 65 6e 0a  pe defined then.
149b0 20 20 2a 2a 20 30 20 69 73 20 61 6c 73 6f 20 75    ** 0 is also u
149c0 73 65 64 20 61 73 20 74 68 65 20 2e 64 74 6e 75  sed as the .dtnu
149d0 6d 20 76 61 6c 75 65 20 66 6f 72 20 6e 6f 6e 74  m value for nont
149e0 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 64  erminals which d
149f0 6f 20 6e 6f 74 20 73 70 65 63 69 66 79 0a 20 20  o not specify.  
14a00 2a 2a 20 61 20 64 61 74 61 74 79 70 65 20 75 73  ** a datatype us
14a10 69 6e 67 20 74 68 65 20 25 74 79 70 65 20 64 69  ing the %type di
14a20 72 65 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20  rective..  */.  
14a30 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
14a40 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
14a50 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
14a60 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  l *sp = lemp->sy
14a70 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 63 68  mbols[i];.    ch
14a80 61 72 20 2a 63 70 3b 0a 20 20 20 20 69 66 28 20  ar *cp;.    if( 
14a90 73 70 3d 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  sp==lemp->errsym
14aa0 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74   ){.      sp->dt
14ab0 6e 75 6d 20 3d 20 61 72 72 61 79 73 69 7a 65 2b  num = arraysize+
14ac0 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  1;.      continu
14ad0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
14ae0 20 73 70 2d 3e 74 79 70 65 21 3d 4e 4f 4e 54 45   sp->type!=NONTE
14af0 52 4d 49 4e 41 4c 20 7c 7c 20 28 73 70 2d 3e 64  RMINAL || (sp->d
14b00 61 74 61 74 79 70 65 3d 3d 30 20 26 26 20 6c 65  atatype==0 && le
14b10 6d 70 2d 3e 76 61 72 74 79 70 65 3d 3d 30 29 20  mp->vartype==0) 
14b20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e  ){.      sp->dtn
14b30 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  um = 0;.      co
14b40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
14b50 20 20 63 70 20 3d 20 73 70 2d 3e 64 61 74 61 74    cp = sp->datat
14b60 79 70 65 3b 0a 20 20 20 20 69 66 28 20 63 70 3d  ype;.    if( cp=
14b70 3d 30 20 29 20 63 70 20 3d 20 6c 65 6d 70 2d 3e  =0 ) cp = lemp->
14b80 76 61 72 74 79 70 65 3b 0a 20 20 20 20 6a 20 3d  vartype;.    j =
14b90 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69   0;.    while( i
14ba0 73 73 70 61 63 65 28 2a 63 70 29 20 29 20 63 70  sspace(*cp) ) cp
14bb0 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  ++;.    while( *
14bc0 63 70 20 29 20 73 74 64 64 74 5b 6a 2b 2b 5d 20  cp ) stddt[j++] 
14bd0 3d 20 2a 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69  = *cp++;.    whi
14be0 6c 65 28 20 6a 3e 30 20 26 26 20 69 73 73 70 61  le( j>0 && isspa
14bf0 63 65 28 73 74 64 64 74 5b 6a 2d 31 5d 29 20 29  ce(stddt[j-1]) )
14c00 20 6a 2d 2d 3b 0a 20 20 20 20 73 74 64 64 74 5b   j--;.    stddt[
14c10 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 68 61 73 68  j] = 0;.    hash
14c20 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 0;.    for(j=
14c30 30 3b 20 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b 2b  0; stddt[j]; j++
14c40 29 7b 0a 20 20 20 20 20 20 68 61 73 68 20 3d 20  ){.      hash = 
14c50 68 61 73 68 2a 35 33 20 2b 20 73 74 64 64 74 5b  hash*53 + stddt[
14c60 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  j];.    }.    if
14c70 28 20 68 61 73 68 3c 30 20 29 20 68 61 73 68 20  ( hash<0 ) hash 
14c80 3d 20 2d 68 61 73 68 3b 0a 20 20 20 20 68 61 73  = -hash;.    has
14c90 68 20 3d 20 68 61 73 68 25 61 72 72 61 79 73 69  h = hash%arraysi
14ca0 7a 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 74  ze;.    while( t
14cb0 79 70 65 73 5b 68 61 73 68 5d 20 29 7b 0a 20 20  ypes[hash] ){.  
14cc0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 74      if( strcmp(t
14cd0 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74  ypes[hash],stddt
14ce0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
14cf0 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68  sp->dtnum = hash
14d00 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72   + 1;.        br
14d10 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
14d20 20 20 20 68 61 73 68 2b 2b 3b 0a 20 20 20 20 20     hash++;.     
14d30 20 69 66 28 20 68 61 73 68 3e 3d 61 72 72 61 79   if( hash>=array
14d40 73 69 7a 65 20 29 20 68 61 73 68 20 3d 20 30 3b  size ) hash = 0;
14d50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74  .    }.    if( t
14d60 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b  ypes[hash]==0 ){
14d70 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d  .      sp->dtnum
14d80 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20 20   = hash + 1;.   
14d90 20 20 20 74 79 70 65 73 5b 68 61 73 68 5d 20 3d     types[hash] =
14da0 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20   (char*)malloc( 
14db0 73 74 72 6c 65 6e 28 73 74 64 64 74 29 2b 31 20  strlen(stddt)+1 
14dc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74 79 70  );.      if( typ
14dd0 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20  es[hash]==0 ){. 
14de0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
14df0 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65  tderr,"Out of me
14e00 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 20  mory.\n");.     
14e10 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
14e20 20 20 7d 0a 20 20 20 20 20 20 73 74 72 63 70 79    }.      strcpy
14e30 28 74 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64  (types[hash],std
14e40 64 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dt);.    }.  }..
14e50 20 20 2f 2a 20 50 72 69 6e 74 20 6f 75 74 20 74    /* Print out t
14e60 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  he definition of
14e70 20 59 59 54 4f 4b 45 4e 54 59 50 45 20 61 6e 64   YYTOKENTYPE and
14e80 20 59 59 4d 49 4e 4f 52 54 59 50 45 20 2a 2f 0a   YYMINORTYPE */.
14e90 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e    name = lemp->n
14ea0 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65  ame ? lemp->name
14eb0 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20 6c 69   : "Parse";.  li
14ec0 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b  neno = *plineno;
14ed0 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
14ee0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69   fprintf(out,"#i
14ef0 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b  f INTERFACE\n");
14f00 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66   lineno++; }.  f
14f10 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
14f20 69 6e 65 20 25 73 54 4f 4b 45 4e 54 59 50 45 20  ine %sTOKENTYPE 
14f30 25 73 5c 6e 22 2c 6e 61 6d 65 2c 0a 20 20 20 20  %s\n",name,.    
14f40 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3f  lemp->tokentype?
14f50 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3a  lemp->tokentype:
14f60 22 76 6f 69 64 2a 22 29 3b 20 20 6c 69 6e 65 6e  "void*");  linen
14f70 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61  o++;.  if( mhfla
14f80 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74  g ){ fprintf(out
14f90 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69  ,"#endif\n"); li
14fa0 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69  neno++; }.  fpri
14fb0 6e 74 66 28 6f 75 74 2c 22 74 79 70 65 64 65 66  ntf(out,"typedef
14fc0 20 75 6e 69 6f 6e 20 7b 5c 6e 22 29 3b 20 6c 69   union {\n"); li
14fd0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
14fe0 66 28 6f 75 74 2c 22 20 20 25 73 54 4f 4b 45 4e  f(out,"  %sTOKEN
14ff0 54 59 50 45 20 79 79 30 3b 5c 6e 22 2c 6e 61 6d  TYPE yy0;\n",nam
15000 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
15010 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79  for(i=0; i<array
15020 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  size; i++){.    
15030 69 66 28 20 74 79 70 65 73 5b 69 5d 3d 3d 30 20  if( types[i]==0 
15040 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
15050 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25  fprintf(out,"  %
15060 73 20 79 79 25 64 3b 5c 6e 22 2c 74 79 70 65 73  s yy%d;\n",types
15070 5b 69 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f  [i],i+1); lineno
15080 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 74 79 70  ++;.    free(typ
15090 65 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 70  es[i]);.  }.  fp
150a0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e 74  rintf(out,"  int
150b0 20 79 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e   yy%d;\n",lemp->
150c0 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20  errsym->dtnum); 
150d0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 72 65 65  lineno++;.  free
150e0 28 73 74 64 64 74 29 3b 0a 20 20 66 72 65 65 28  (stddt);.  free(
150f0 74 79 70 65 73 29 3b 0a 20 20 66 70 72 69 6e 74  types);.  fprint
15100 66 28 6f 75 74 2c 22 7d 20 59 59 4d 49 4e 4f 52  f(out,"} YYMINOR
15110 54 59 50 45 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  TYPE;\n"); linen
15120 6f 2b 2b 3b 0a 20 20 2a 70 6c 69 6e 65 6e 6f 20  o++;.  *plineno 
15130 3d 20 6c 69 6e 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 20  = lineno;.}../* 
15140 47 65 6e 65 72 61 74 65 20 43 20 73 6f 75 72 63  Generate C sourc
15150 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70  e code for the p
15160 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65  arser */.void Re
15170 70 6f 72 74 54 61 62 6c 65 28 6c 65 6d 70 2c 20  portTable(lemp, 
15180 6d 68 66 6c 61 67 29 0a 73 74 72 75 63 74 20 6c  mhflag).struct l
15190 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20  emon *lemp;.int 
151a0 6d 68 66 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4f  mhflag;     /* O
151b0 75 74 70 75 74 20 69 6e 20 6d 61 6b 65 68 65 61  utput in makehea
151c0 64 65 72 73 20 66 6f 72 6d 61 74 20 69 66 20 74  ders format if t
151d0 72 75 65 20 2a 2f 0a 7b 0a 20 20 46 49 4c 45 20  rue */.{.  FILE 
151e0 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61  *out, *in;.  cha
151f0 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d  r line[LINESIZE]
15200 3b 0a 20 20 69 6e 74 20 20 6c 69 6e 65 6e 6f 3b  ;.  int  lineno;
15210 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
15220 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61  *stp;.  struct a
15230 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 73 74 72  ction *ap;.  str
15240 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
15250 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 61 62  int i;.  int tab
15260 6c 65 63 6e 74 3b 0a 20 20 63 68 61 72 20 2a 6e  lecnt;.  char *n
15270 61 6d 65 3b 0a 0a 20 20 69 6e 20 3d 20 74 70 6c  ame;..  in = tpl
15280 74 5f 6f 70 65 6e 28 6c 65 6d 70 29 3b 0a 20 20  t_open(lemp);.  
15290 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75  if( in==0 ) retu
152a0 72 6e 3b 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65  rn;.  out = file
152b0 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c  _open(lemp,".c",
152c0 22 77 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d  "w");.  if( out=
152d0 3d 30 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65  =0 ){.    fclose
152e0 28 69 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (in);.    return
152f0 3b 0a 20 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d  ;.  }.  lineno =
15300 20 31 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28   1;.  tplt_xfer(
15310 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
15320 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
15330 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 69  * Generate the i
15340 6e 63 6c 75 64 65 20 63 6f 64 65 2c 20 69 66 20  nclude code, if 
15350 61 6e 79 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72  any */.  tplt_pr
15360 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d  int(out,lemp,lem
15370 70 2d 3e 69 6e 63 6c 75 64 65 2c 6c 65 6d 70 2d  p->include,lemp-
15380 3e 69 6e 63 6c 75 64 65 6c 6e 2c 26 6c 69 6e 65  >includeln,&line
15390 6e 6f 29 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61  no);.  if( mhfla
153a0 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 6e  g ){.    char *n
153b0 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e  ame = file_maken
153c0 61 6d 65 28 6c 65 6d 70 2c 20 22 2e 68 22 29 3b  ame(lemp, ".h");
153d0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
153e0 2c 22 23 69 6e 63 6c 75 64 65 20 5c 22 25 73 5c  ,"#include \"%s\
153f0 22 5c 6e 22 2c 20 6e 61 6d 65 29 3b 20 6c 69 6e  "\n", name); lin
15400 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28  eno++;.    free(
15410 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 74 70 6c  name);.  }.  tpl
15420 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
15430 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
15440 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
15450 65 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20 61  e #defines for a
15460 6c 6c 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69  ll tokens */.  i
15470 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20  f( mhflag ){.   
15480 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20   char *prefix;. 
15490 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
154a0 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22  #if INTERFACE\n"
154b0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
154c0 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e   if( lemp->token
154d0 70 72 65 66 69 78 20 29 20 70 72 65 66 69 78 20  prefix ) prefix 
154e0 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65  = lemp->tokenpre
154f0 66 69 78 3b 0a 20 20 20 20 65 6c 73 65 20 20 20  fix;.    else   
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15510 20 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20   prefix = "";.  
15520 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d    for(i=1; i<lem
15530 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b  p->nterminal; i+
15540 2b 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  +){.      fprint
15550 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
15560 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72  s%-30s %2d\n",pr
15570 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  efix,lemp->symbo
15580 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a  ls[i]->name,i);.
15590 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a        lineno++;.
155a0 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
155b0 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22  f(out,"#endif\n"
155c0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
155d0 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
155e0 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
155f0 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
15600 65 6e 65 72 61 74 65 20 74 68 65 20 64 65 66 69  enerate the defi
15610 6e 65 73 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  nes */.  fprintf
15620 28 6f 75 74 2c 22 2f 2a 20 5c 30 30 31 20 2a 2f  (out,"/* \001 */
15630 5c 6e 22 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  \n");.  fprintf(
15640 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 43  out,"#define YYC
15650 4f 44 45 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20  ODETYPE %s\n",. 
15660 20 20 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c     lemp->nsymbol
15670 3e 32 35 30 3f 22 69 6e 74 22 3a 22 75 6e 73 69  >250?"int":"unsi
15680 67 6e 65 64 20 63 68 61 72 22 29 3b 20 20 6c 69  gned char");  li
15690 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
156a0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
156b0 59 4e 4f 43 4f 44 45 20 25 64 5c 6e 22 2c 6c 65  YNOCODE %d\n",le
156c0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 31 29 3b 20  mp->nsymbol+1); 
156d0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
156e0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
156f0 65 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 25  e YYACTIONTYPE %
15700 73 5c 6e 22 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e  s\n",.    lemp->
15710 6e 73 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75  nstate+lemp->nru
15720 6c 65 3e 32 35 30 3f 22 69 6e 74 22 3a 22 75 6e  le>250?"int":"un
15730 73 69 67 6e 65 64 20 63 68 61 72 22 29 3b 20 20  signed char");  
15740 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 70 72 69 6e  lineno++;.  prin
15750 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75  t_stack_union(ou
15760 74 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 2c 6d  t,lemp,&lineno,m
15770 68 66 6c 61 67 29 3b 0a 20 20 69 66 28 20 6c 65  hflag);.  if( le
15780 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 20 29 7b  mp->stacksize ){
15790 0a 20 20 20 20 69 66 28 20 61 74 6f 69 28 6c 65  .    if( atoi(le
157a0 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3c 3d  mp->stacksize)<=
157b0 30 20 29 7b 0a 20 20 20 20 20 20 45 72 72 6f 72  0 ){.      Error
157c0 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  Msg(lemp->filena
157d0 6d 65 2c 30 2c 0a 22 49 6c 6c 65 67 61 6c 20 73  me,0,."Illegal s
157e0 74 61 63 6b 20 73 69 7a 65 3a 20 5b 25 73 5d 2e  tack size: [%s].
157f0 20 20 54 68 65 20 73 74 61 63 6b 20 73 69 7a 65    The stack size
15800 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e   should be an in
15810 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2e 22  teger constant."
15820 2c 0a 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e  ,.        lemp->
15830 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20  stacksize);.    
15840 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
15850 2b 2b 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e  ++;.      lemp->
15860 73 74 61 63 6b 73 69 7a 65 20 3d 20 22 31 30 30  stacksize = "100
15870 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  ";.    }.    fpr
15880 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
15890 65 20 59 59 53 54 41 43 4b 44 45 50 54 48 20 25  e YYSTACKDEPTH %
158a0 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61 63 6b  s\n",lemp->stack
158b0 73 69 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  size);  lineno++
158c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
158d0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
158e0 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54 48  ine YYSTACKDEPTH
158f0 20 31 30 30 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e   100\n");  linen
15900 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  o++;.  }.  if( m
15910 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 66 70 72  hflag ){.    fpr
15920 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e  intf(out,"#if IN
15930 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e  TERFACE\n"); lin
15940 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 61 6d  eno++;.  }.  nam
15950 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f  e = lemp->name ?
15960 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50   lemp->name : "P
15970 61 72 73 65 22 3b 0a 20 20 69 66 28 20 6c 65 6d  arse";.  if( lem
15980 70 2d 3e 61 72 67 20 26 26 20 6c 65 6d 70 2d 3e  p->arg && lemp->
15990 61 72 67 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e  arg[0] ){.    in
159a0 74 20 69 3b 0a 20 20 20 20 69 20 3d 20 73 74 72  t i;.    i = str
159b0 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29 3b 0a  len(lemp->arg);.
159c0 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20      while( i>=1 
159d0 26 26 20 69 73 73 70 61 63 65 28 6c 65 6d 70 2d  && isspace(lemp-
159e0 3e 61 72 67 5b 69 2d 31 5d 29 20 29 20 69 2d 2d  >arg[i-1]) ) i--
159f0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d  ;.    while( i>=
15a00 31 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 6c 65  1 && (isalnum(le
15a10 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 7c 7c  mp->arg[i-1]) ||
15a20 20 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 3d   lemp->arg[i-1]=
15a30 3d 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20 20 20  ='_') ) i--;.   
15a40 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
15a50 65 66 69 6e 65 20 25 73 41 52 47 44 45 43 4c 20  efine %sARGDECL 
15a60 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c 26 6c 65 6d  ,%s\n",name,&lem
15a70 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e  p->arg[i]);  lin
15a80 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
15a90 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
15aa0 25 73 58 41 52 47 44 45 43 4c 20 25 73 3b 5c 6e  %sXARGDECL %s;\n
15ab0 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67  ",name,lemp->arg
15ac0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
15ad0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
15ae0 64 65 66 69 6e 65 20 25 73 41 4e 53 49 41 52 47  define %sANSIARG
15af0 44 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65  DECL ,%s\n",name
15b00 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69  ,lemp->arg);  li
15b10 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  neno++;.  }else{
15b20 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
15b30 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 44  ,"#define %sARGD
15b40 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c  ECL\n",name);  l
15b50 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
15b60 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
15b70 65 20 25 73 58 41 52 47 44 45 43 4c 5c 6e 22 2c  e %sXARGDECL\n",
15b80 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  name);  lineno++
15b90 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
15ba0 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 4e 53  t,"#define %sANS
15bb0 49 41 52 47 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65  IARGDECL\n",name
15bc0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
15bd0 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29  }.  if( mhflag )
15be0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
15bf0 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c  t,"#endif\n"); l
15c00 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66  ineno++;.  }.  f
15c10 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
15c20 69 6e 65 20 59 59 4e 53 54 41 54 45 20 25 64 5c  ine YYNSTATE %d\
15c30 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 29  n",lemp->nstate)
15c40 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ;  lineno++;.  f
15c50 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
15c60 69 6e 65 20 59 59 4e 52 55 4c 45 20 25 64 5c 6e  ine YYNRULE %d\n
15c70 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20  ",lemp->nrule); 
15c80 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
15c90 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
15ca0 65 20 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c 20  e YYERRORSYMBOL 
15cb0 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73  %d\n",lemp->errs
15cc0 79 6d 2d 3e 69 6e 64 65 78 29 3b 20 20 6c 69 6e  ym->index);  lin
15cd0 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
15ce0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
15cf0 45 52 52 53 59 4d 44 54 20 79 79 25 64 5c 6e 22  ERRSYMDT yy%d\n"
15d00 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64  ,lemp->errsym->d
15d10 74 6e 75 6d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  tnum);  lineno++
15d20 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
15d30 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
15d40 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
15d50 47 65 6e 65 72 61 74 65 20 74 68 65 20 61 63 74  Generate the act
15d60 69 6f 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ion table..  **.
15d70 20 20 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20    ** Each entry 
15d80 69 6e 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  in the action ta
15d90 62 6c 65 20 69 73 20 61 6e 20 65 6c 65 6d 65 6e  ble is an elemen
15da0 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t of the followi
15db0 6e 67 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ng .  ** structu
15dc0 72 65 3a 0a 20 20 2a 2a 20 20 20 73 74 72 75 63  re:.  **   struc
15dd0 74 20 79 79 41 63 74 69 6f 6e 45 6e 74 72 79 20  t yyActionEntry 
15de0 7b 0a 20 20 2a 2a 20 20 20 20 20 20 20 59 59 43  {.  **       YYC
15df0 4f 44 45 54 59 50 45 20 20 20 20 20 20 20 20 20  ODETYPE         
15e00 20 20 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20     lookahead;.  
15e10 2a 2a 20 20 20 20 20 20 20 59 59 41 43 54 49 4f  **       YYACTIO
15e20 4e 54 59 50 45 20 20 20 20 20 20 20 20 20 20 61  NTYPE          a
15e30 63 74 69 6f 6e 3b 0a 20 20 2a 2a 20 20 20 20 20  ction;.  **     
15e40 20 20 73 74 72 75 63 74 20 79 79 41 63 74 69 6f    struct yyActio
15e50 6e 45 6e 74 72 79 20 2a 6e 65 78 74 3b 0a 20 20  nEntry *next;.  
15e60 2a 2a 20 20 20 7d 0a 20 20 2a 2a 0a 20 20 2a 2a  **   }.  **.  **
15e70 20 54 68 65 20 65 6e 74 72 69 65 73 20 61 72 65   The entries are
15e80 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 68 61   grouped into ha
15e90 73 68 20 74 61 62 6c 65 73 2c 20 6f 6e 65 20 68  sh tables, one h
15ea0 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 65 61  ash table for ea
15eb0 63 68 0a 20 20 2a 2a 20 70 61 72 73 65 72 20 73  ch.  ** parser s
15ec0 74 61 74 65 2e 20 20 54 68 65 20 68 61 73 68 20  tate.  The hash 
15ed0 74 61 62 6c 65 20 68 61 73 20 61 20 73 69 7a 65  table has a size
15ee0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 6d   which is the sm
15ef0 61 6c 6c 65 73 74 0a 20 20 2a 2a 20 70 6f 77 65  allest.  ** powe
15f00 72 20 6f 66 20 74 77 6f 20 6e 65 65 64 65 64 20  r of two needed 
15f10 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6e 74 72  to hold all entr
15f20 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 74 61 62 6c  ies..  */.  tabl
15f30 65 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ecnt = 0;..  /* 
15f40 4c 6f 6f 70 20 6f 76 65 72 20 70 61 72 73 65 72  Loop over parser
15f50 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 66 6f 72   states */.  for
15f60 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
15f70 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
15f80 69 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b 20 20  int tablesize;  
15f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
15fa0 69 7a 65 20 6f 66 20 74 68 65 20 68 61 73 68 20  ize of the hash 
15fb0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
15fc0 20 6a 2c 6b 3b 20 20 20 20 20 20 20 20 20 20 20   j,k;           
15fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
15fe0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
15ff0 69 6e 74 20 63 6f 6c 6c 69 64 65 5b 32 30 34 38  int collide[2048
16000 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ];          /* T
16010 68 65 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  he collision cha
16020 69 6e 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  in for the table
16030 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 61   */.    struct a
16040 63 74 69 6f 6e 20 2a 74 61 62 6c 65 5b 32 30 34  ction *table[204
16050 38 5d 3b 20 2f 2a 20 42 75 69 6c 64 20 74 68 65  8]; /* Build the
16060 20 68 61 73 68 20 74 61 62 6c 65 20 68 65 72 65   hash table here
16070 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   */..    /* Find
16080 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
16090 63 74 69 6f 6e 73 20 61 6e 64 20 69 6e 69 74 69  ctions and initi
160a0 61 6c 69 7a 65 20 74 68 65 20 68 61 73 68 20 74  alize the hash t
160b0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 74 70 20  able */.    stp 
160c0 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
160d0 5d 3b 0a 20 20 20 20 73 74 70 2d 3e 74 61 62 73  ];.    stp->tabs
160e0 74 61 72 74 20 3d 20 74 61 62 6c 65 63 6e 74 3b  tart = tablecnt;
160f0 0a 20 20 20 20 73 74 70 2d 3e 6e 61 63 74 69 6f  .    stp->nactio
16100 6e 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 61  n = 0;.    for(a
16110 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
16120 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
16130 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69     if( ap->sp->i
16140 6e 64 65 78 21 3d 6c 65 6d 70 2d 3e 6e 73 79 6d  ndex!=lemp->nsym
16150 62 6f 6c 20 26 26 20 63 6f 6d 70 75 74 65 5f 61  bol && compute_a
16160 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 3e 3d  ction(lemp,ap)>=
16170 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 70  0 ){.        stp
16180 2d 3e 6e 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20  ->naction++;.   
16190 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74     }.    }.    t
161a0 61 62 6c 65 73 69 7a 65 20 3d 20 31 3b 0a 20 20  ablesize = 1;.  
161b0 20 20 77 68 69 6c 65 28 20 74 61 62 6c 65 73 69    while( tablesi
161c0 7a 65 3c 73 74 70 2d 3e 6e 61 63 74 69 6f 6e 20  ze<stp->naction 
161d0 29 20 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 74  ) tablesize += t
161e0 61 62 6c 65 73 69 7a 65 3b 0a 20 20 20 20 61 73  ablesize;.    as
161f0 73 65 72 74 28 20 74 61 62 6c 65 73 69 7a 65 3c  sert( tablesize<
16200 3d 20 73 69 7a 65 6f 66 28 74 61 62 6c 65 29 2f  = sizeof(table)/
16210 73 69 7a 65 6f 66 28 74 61 62 6c 65 5b 30 5d 29  sizeof(table[0])
16220 20 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   );.    for(j=0;
16230 20 6a 3c 74 61 62 6c 65 73 69 7a 65 3b 20 6a 2b   j<tablesize; j+
16240 2b 29 7b 0a 20 20 20 20 20 20 74 61 62 6c 65 5b  +){.      table[
16250 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  j] = 0;.      co
16260 6c 6c 69 64 65 5b 6a 5d 20 3d 20 2d 31 3b 0a 20  llide[j] = -1;. 
16270 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 48 61 73     }..    /* Has
16280 68 20 74 68 65 20 61 63 74 69 6f 6e 73 20 69 6e  h the actions in
16290 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  to the hash tabl
162a0 65 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 74 61  e */.    stp->ta
162b0 62 64 66 6c 74 61 63 74 20 3d 20 6c 65 6d 70 2d  bdfltact = lemp-
162c0 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e  >nstate + lemp->
162d0 6e 72 75 6c 65 3b 0a 20 20 20 20 66 6f 72 28 61  nrule;.    for(a
162e0 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
162f0 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
16300 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 20 3d 20     int action = 
16310 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c  compute_action(l
16320 65 6d 70 2c 61 70 29 3b 0a 20 20 20 20 20 20 69  emp,ap);.      i
16330 6e 74 20 68 3b 0a 20 20 20 20 20 20 69 66 28 20  nt h;.      if( 
16340 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c  ap->sp->index==l
16350 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a  emp->nsymbol ){.
16360 20 20 20 20 20 20 20 20 73 74 70 2d 3e 74 61 62          stp->tab
16370 64 66 6c 74 61 63 74 20 3d 20 61 63 74 69 6f 6e  dfltact = action
16380 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
16390 28 20 61 63 74 69 6f 6e 3e 3d 30 20 29 7b 0a 20  ( action>=0 ){. 
163a0 20 20 20 20 20 20 20 68 20 3d 20 61 70 2d 3e 73         h = ap->s
163b0 70 2d 3e 69 6e 64 65 78 20 26 20 28 74 61 62 6c  p->index & (tabl
163c0 65 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  esize-1);.      
163d0 20 20 61 70 2d 3e 63 6f 6c 6c 69 64 65 20 3d 20    ap->collide = 
163e0 74 61 62 6c 65 5b 68 5d 3b 0a 20 20 20 20 20 20  table[h];.      
163f0 20 20 74 61 62 6c 65 5b 68 5d 20 3d 20 61 70 3b    table[h] = ap;
16400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
16410 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 63      /* Resolve c
16420 6f 6c 6c 69 73 69 6f 6e 73 20 2a 2f 0a 20 20 20  ollisions */.   
16430 20 66 6f 72 28 6a 3d 6b 3d 30 3b 20 6a 3c 74 61   for(j=k=0; j<ta
16440 62 6c 65 73 69 7a 65 3b 20 6a 2b 2b 29 7b 0a 20  blesize; j++){. 
16450 20 20 20 20 20 69 66 28 20 74 61 62 6c 65 5b 6a       if( table[j
16460 5d 20 26 26 20 74 61 62 6c 65 5b 6a 5d 2d 3e 63  ] && table[j]->c
16470 6f 6c 6c 69 64 65 20 29 7b 0a 20 20 20 20 20 20  ollide ){.      
16480 20 20 77 68 69 6c 65 28 20 74 61 62 6c 65 5b 6b    while( table[k
16490 5d 20 29 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 20  ] ) k++;.       
164a0 20 74 61 62 6c 65 5b 6b 5d 20 3d 20 74 61 62 6c   table[k] = tabl
164b0 65 5b 6a 5d 2d 3e 63 6f 6c 6c 69 64 65 3b 0a 20  e[j]->collide;. 
164c0 20 20 20 20 20 20 20 63 6f 6c 6c 69 64 65 5b 6a         collide[j
164d0 5d 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 74  ] = k;.        t
164e0 61 62 6c 65 5b 6a 5d 2d 3e 63 6f 6c 6c 69 64 65  able[j]->collide
164f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
16500 28 20 6b 3c 6a 20 29 20 6a 20 3d 20 6b 2d 31 3b  ( k<j ) j = k-1;
16510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
16520 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 74 68 65      /* Print the
16530 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
16540 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
16550 2f 2a 20 53 74 61 74 65 20 25 64 20 2a 2f 5c 6e  /* State %d */\n
16560 22 2c 73 74 70 2d 3e 69 6e 64 65 78 29 3b 20 6c  ",stp->index); l
16570 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 6f 72  ineno++;.    for
16580 28 6a 3d 30 3b 20 6a 3c 74 61 62 6c 65 73 69 7a  (j=0; j<tablesiz
16590 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; j++){.      i
165a0 66 28 20 74 61 62 6c 65 5b 6a 5d 3d 3d 30 20 29  f( table[j]==0 )
165b0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
165c0 66 28 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20  f(out,.         
165d0 20 22 20 20 7b 59 59 4e 4f 43 4f 44 45 2c 30 2c   "  {YYNOCODE,0,
165e0 30 7d 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  0}, /* Unused */
165f0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  \n");.      }els
16600 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  e{.        fprin
16610 74 66 28 6f 75 74 2c 22 20 20 7b 25 34 64 2c 25  tf(out,"  {%4d,%
16620 34 64 2c 20 22 2c 0a 20 20 20 20 20 20 20 20 20  4d, ",.         
16630 20 74 61 62 6c 65 5b 6a 5d 2d 3e 73 70 2d 3e 69   table[j]->sp->i
16640 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 20 20 20  ndex,.          
16650 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c  compute_action(l
16660 65 6d 70 2c 74 61 62 6c 65 5b 6a 5d 29 29 3b 0a  emp,table[j]));.
16670 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 6c          if( coll
16680 69 64 65 5b 6a 5d 3e 3d 30 20 29 7b 0a 20 20 20  ide[j]>=0 ){.   
16690 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
166a0 75 74 2c 22 26 79 79 41 63 74 69 6f 6e 54 61 62  ut,"&yyActionTab
166b0 6c 65 5b 25 34 64 5d 20 7d 2c 20 2f 2a 20 22 2c  le[%4d] }, /* ",
166c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c  .            col
166d0 6c 69 64 65 5b 6a 5d 20 2b 20 74 61 62 6c 65 63  lide[j] + tablec
166e0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  nt);.        }el
166f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70  se{.          fp
16700 72 69 6e 74 66 28 6f 75 74 2c 22 30 20 20 20 20  rintf(out,"0    
16710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16720 7d 2c 20 2f 2a 20 22 29 3b 0a 20 20 20 20 20 20  }, /* ");.      
16730 20 20 7d 0a 20 20 20 20 20 20 20 20 50 72 69 6e    }.        Prin
16740 74 41 63 74 69 6f 6e 28 74 61 62 6c 65 5b 6a 5d  tAction(table[j]
16750 2c 6f 75 74 2c 32 32 29 3b 0a 20 20 20 20 20 20  ,out,22);.      
16760 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
16770 2a 2f 5c 6e 22 29 3b 20 0a 20 20 20 20 20 20 7d  */\n"); .      }
16780 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  .      lineno++;
16790 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
167a0 70 64 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  pdate the table 
167b0 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 74 61 62  count */.    tab
167c0 6c 65 63 6e 74 20 2b 3d 20 74 61 62 6c 65 73 69  lecnt += tablesi
167d0 7a 65 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  ze;.  }.  tplt_x
167e0 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
167f0 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
16800 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a    lemp->tablesiz
16810 65 20 3d 20 74 61 62 6c 65 63 6e 74 3b 0a 0a 20  e = tablecnt;.. 
16820 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
16830 20 73 74 61 74 65 20 74 61 62 6c 65 0a 20 20 2a   state table.  *
16840 2a 0a 20 20 2a 2a 20 45 61 63 68 20 65 6e 74 72  *.  ** Each entr
16850 79 20 69 73 20 61 6e 20 65 6c 65 6d 65 6e 74 20  y is an element 
16860 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
16870 20 73 74 72 75 63 74 75 72 65 3a 0a 20 20 2a 2a   structure:.  **
16880 20 20 20 20 73 74 72 75 63 74 20 79 79 53 74 61      struct yySta
16890 74 65 45 6e 74 72 79 20 7b 0a 20 20 2a 2a 20 20  teEntry {.  **  
168a0 20 20 20 20 73 74 72 75 63 74 20 79 79 41 63 74      struct yyAct
168b0 69 6f 6e 45 6e 74 72 79 20 2a 68 61 73 68 74 62  ionEntry *hashtb
168c0 6c 3b 0a 20 20 2a 2a 20 20 20 20 20 20 69 6e 74  l;.  **      int
168d0 20 6d 61 73 6b 3b 0a 20 20 2a 2a 20 20 20 20 20   mask;.  **     
168e0 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 61 63   YYACTIONTYPE ac
168f0 74 69 6f 6e 44 65 66 61 75 6c 74 3b 0a 20 20 2a  tionDefault;.  *
16900 2a 20 20 20 20 7d 0a 20 20 2a 2f 0a 20 20 66 6f  *    }.  */.  fo
16910 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
16920 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
16930 20 69 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b 0a   int tablesize;.
16940 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
16950 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 74  sorted[i];.    t
16960 61 62 6c 65 73 69 7a 65 20 3d 20 31 3b 0a 20 20  ablesize = 1;.  
16970 20 20 77 68 69 6c 65 28 20 74 61 62 6c 65 73 69    while( tablesi
16980 7a 65 3c 73 74 70 2d 3e 6e 61 63 74 69 6f 6e 20  ze<stp->naction 
16990 29 20 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 74  ) tablesize += t
169a0 61 62 6c 65 73 69 7a 65 3b 0a 20 20 20 20 66 70  ablesize;.    fp
169b0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 7b 20 26  rintf(out,"  { &
169c0 79 79 41 63 74 69 6f 6e 54 61 62 6c 65 5b 25 64  yyActionTable[%d
169d0 5d 2c 20 25 64 2c 20 25 64 7d 2c 5c 6e 22 2c 0a  ], %d, %d},\n",.
169e0 20 20 20 20 20 20 73 74 70 2d 3e 74 61 62 73 74        stp->tabst
169f0 61 72 74 2c 0a 20 20 20 20 20 20 74 61 62 6c 65  art,.      table
16a00 73 69 7a 65 20 2d 20 31 2c 0a 20 20 20 20 20 20  size - 1,.      
16a10 73 74 70 2d 3e 74 61 62 64 66 6c 74 61 63 74 29  stp->tabdfltact)
16a20 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
16a30 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
16a40 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
16a50 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
16a60 6e 65 72 61 74 65 20 61 20 74 61 62 6c 65 20 63  nerate a table c
16a70 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 79  ontaining the sy
16a80 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 6f 66 20 65  mbolic name of e
16a90 76 65 72 79 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20  very symbol */. 
16aa0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
16ab0 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
16ac0 0a 20 20 20 20 73 70 72 69 6e 74 66 28 6c 69 6e  .    sprintf(lin
16ad0 65 2c 22 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d 70  e,"\"%s\",",lemp
16ae0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61  ->symbols[i]->na
16af0 6d 65 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  me);.    fprintf
16b00 28 6f 75 74 2c 22 20 20 25 2d 31 35 73 22 2c 6c  (out,"  %-15s",l
16b10 69 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 28 69  ine);.    if( (i
16b20 26 33 29 3d 3d 33 20 29 7b 20 66 70 72 69 6e 74  &3)==3 ){ fprint
16b30 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e  f(out,"\n"); lin
16b40 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69  eno++; }.  }.  i
16b50 66 28 20 28 69 26 33 29 21 3d 30 20 29 7b 20 66  f( (i&3)!=0 ){ f
16b60 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29  printf(out,"\n")
16b70 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20  ; lineno++; }.  
16b80 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
16b90 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
16ba0 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
16bb0 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
16bc0 65 78 65 63 75 74 65 73 20 65 76 65 72 79 20 74  executes every t
16bd0 69 6d 65 20 61 20 73 79 6d 62 6f 6c 20 69 73 20  ime a symbol is 
16be0 70 6f 70 70 65 64 20 66 72 6f 6d 0a 20 20 2a 2a  popped from.  **
16bf0 20 74 68 65 20 73 74 61 63 6b 20 77 68 69 6c 65   the stack while
16c00 20 70 72 6f 63 65 73 73 69 6e 67 20 65 72 72 6f   processing erro
16c10 72 73 20 6f 72 20 77 68 69 6c 65 20 64 65 73 74  rs or while dest
16c20 72 6f 79 69 6e 67 20 74 68 65 20 70 61 72 73 65  roying the parse
16c30 72 2e 20 0a 20 20 2a 2a 20 28 49 6e 20 6f 74 68  r. .  ** (In oth
16c40 65 72 20 77 6f 72 64 73 2c 20 67 65 6e 65 72 61  er words, genera
16c50 74 65 20 74 68 65 20 25 64 65 73 74 72 75 63 74  te the %destruct
16c60 6f 72 20 61 63 74 69 6f 6e 73 29 20 2a 2f 0a 20  or actions) */. 
16c70 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e   if( lemp->token
16c80 64 65 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  dest ){.    for(
16c90 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
16ca0 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
16cb0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
16cc0 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62  *sp = lemp->symb
16cd0 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ols[i];.      if
16ce0 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74  ( sp==0 || sp->t
16cf0 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 29 20  ype!=TERMINAL ) 
16d00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
16d10 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
16d20 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c 73 70 2d   case %d:\n",sp-
16d30 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b  >index); lineno+
16d40 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  +;.    }.    for
16d50 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
16d60 79 6d 62 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e 73  ymbol && lemp->s
16d70 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65 21  ymbols[i]->type!
16d80 3d 54 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b  =TERMINAL; i++);
16d90 0a 20 20 20 20 69 66 28 20 69 3c 6c 65 6d 70 2d  .    if( i<lemp-
16da0 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20  >nsymbol ){.    
16db0 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f    emit_destructo
16dc0 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d  r_code(out,lemp-
16dd0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70  >symbols[i],lemp
16de0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  ,&lineno);.     
16df0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
16e00 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20      break;\n"); 
16e10 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
16e20 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
16e30 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
16e40 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
16e50 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65   symbol *sp = le
16e60 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
16e70 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c      if( sp==0 ||
16e80 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49   sp->type==TERMI
16e90 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72  NAL || sp->destr
16ea0 75 63 74 6f 72 3d 3d 30 20 29 20 63 6f 6e 74 69  uctor==0 ) conti
16eb0 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  nue;.    fprintf
16ec0 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25  (out,"    case %
16ed0 64 3a 5c 6e 22 2c 73 70 2d 3e 69 6e 64 65 78 29  d:\n",sp->index)
16ee0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
16ef0 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  emit_destructor_
16f00 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73  code(out,lemp->s
16f10 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26  ymbols[i],lemp,&
16f20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72  lineno);.    fpr
16f30 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
16f40 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65  break;\n"); line
16f50 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  no++;.  }.  if( 
16f60 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29 7b  lemp->vardest ){
16f70 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62  .    struct symb
16f80 6f 6c 20 2a 64 66 6c 74 5f 73 70 20 3d 20 30 3b  ol *dflt_sp = 0;
16f90 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
16fa0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
16fb0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
16fc0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
16fd0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
16fe0 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30  .      if( sp==0
16ff0 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45   || sp->type==TE
17000 52 4d 49 4e 41 4c 20 7c 7c 0a 20 20 20 20 20 20  RMINAL ||.      
17010 20 20 20 20 73 70 2d 3e 69 6e 64 65 78 3c 3d 30      sp->index<=0
17020 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74   || sp->destruct
17030 6f 72 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  or!=0 ) continue
17040 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
17050 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64  out,"    case %d
17060 3a 5c 6e 22 2c 73 70 2d 3e 69 6e 64 65 78 29 3b  :\n",sp->index);
17070 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
17080 20 64 66 6c 74 5f 73 70 20 3d 20 73 70 3b 0a 20   dflt_sp = sp;. 
17090 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 66 6c     }.    if( dfl
170a0 74 5f 73 70 21 3d 30 20 29 7b 0a 20 20 20 20 20  t_sp!=0 ){.     
170b0 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72   emit_destructor
170c0 5f 63 6f 64 65 28 6f 75 74 2c 64 66 6c 74 5f 73  _code(out,dflt_s
170d0 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b  p,lemp,&lineno);
170e0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
170f0 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b  ut,"      break;
17100 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
17110 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74 70 6c 74      }.  }.  tplt
17120 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
17130 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
17140 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
17150 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   code which exec
17160 75 74 65 73 20 77 68 65 6e 65 76 65 72 20 74 68  utes whenever th
17170 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 6f  e parser stack o
17180 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 74 70  verflows */.  tp
17190 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d  lt_print(out,lem
171a0 70 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77  p,lemp->overflow
171b0 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77 6c  ,lemp->overflowl
171c0 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70  n,&lineno);.  tp
171d0 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
171e0 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
171f0 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
17200 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20  te the table of 
17210 72 75 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  rule information
17220 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65   .  **.  ** Note
17230 3a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  : This code depe
17240 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
17250 74 68 61 74 20 72 75 6c 65 73 20 61 72 65 20 6e  that rules are n
17260 75 6d 62 65 72 0a 20 20 2a 2a 20 73 65 71 75 65  umber.  ** seque
17270 6e 74 75 61 6c 6c 79 20 62 65 67 69 6e 6e 69 6e  ntually beginnin
17280 67 20 77 69 74 68 20 30 2e 0a 20 20 2a 2f 0a 20  g with 0..  */. 
17290 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
172a0 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
172b0 65 78 74 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  ext){.    fprint
172c0 66 28 6f 75 74 2c 22 20 20 7b 20 25 64 2c 20 25  f(out,"  { %d, %
172d0 64 20 7d 2c 5c 6e 22 2c 72 70 2d 3e 6c 68 73 2d  d },\n",rp->lhs-
172e0 3e 69 6e 64 65 78 2c 72 70 2d 3e 6e 72 68 73 29  >index,rp->nrhs)
172f0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
17300 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
17310 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
17320 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
17330 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63  nerate code whic
17340 68 20 65 78 65 63 75 74 69 6f 6e 20 64 75 72 69  h execution duri
17350 6e 67 20 65 61 63 68 20 52 45 44 55 43 45 20 61  ng each REDUCE a
17360 63 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 72  ction */.  for(r
17370 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
17380 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
17390 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
173a0 22 20 20 20 20 20 20 63 61 73 65 20 25 64 3a 5c  "      case %d:\
173b0 6e 22 2c 72 70 2d 3e 69 6e 64 65 78 29 3b 20 6c  n",rp->index); l
173c0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
173d0 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
173e0 20 20 59 59 54 52 41 43 45 28 5c 22 25 73 20 3a    YYTRACE(\"%s :
173f0 3a 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d  :=",rp->lhs->nam
17400 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  e);.    for(i=0;
17410 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
17420 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20  ) fprintf(out," 
17430 25 73 22 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e  %s",rp->rhs[i]->
17440 6e 61 6d 65 29 3b 0a 20 20 20 20 66 70 72 69 6e  name);.    fprin
17450 74 66 28 6f 75 74 2c 22 5c 22 29 5c 6e 22 29 3b  tf(out,"\")\n");
17460 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 65   lineno++;.    e
17470 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72 70 2c  mit_code(out,rp,
17480 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lemp,&lineno);. 
17490 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
174a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e          break;\n
174b0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
174c0 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
174d0 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
174e0 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
174f0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
17500 69 63 68 20 65 78 65 63 75 74 65 73 20 69 66 20  ich executes if 
17510 61 20 70 61 72 73 65 20 66 61 69 6c 73 20 2a 2f  a parse fails */
17520 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
17530 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 66 61 69  t,lemp,lemp->fai
17540 6c 75 72 65 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75  lure,lemp->failu
17550 72 65 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  reln,&lineno);. 
17560 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
17570 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
17580 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
17590 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
175a0 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 61   executes when a
175b0 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 6f 63   syntax error oc
175c0 63 75 72 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70  curs */.  tplt_p
175d0 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
175e0 6d 70 2d 3e 65 72 72 6f 72 2c 6c 65 6d 70 2d 3e  mp->error,lemp->
175f0 65 72 72 6f 72 6c 6e 2c 26 6c 69 6e 65 6e 6f 29  errorln,&lineno)
17600 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
17610 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
17620 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
17630 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
17640 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65  ich executes whe
17650 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 63 63  n the parser acc
17660 65 70 74 73 20 69 74 73 20 69 6e 70 75 74 20 2a  epts its input *
17670 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  /.  tplt_print(o
17680 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 61 63  ut,lemp,lemp->ac
17690 63 65 70 74 2c 6c 65 6d 70 2d 3e 61 63 63 65 70  cept,lemp->accep
176a0 74 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  tln,&lineno);.  
176b0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
176c0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
176d0 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65  eno);..  /* Appe
176e0 6e 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e 20  nd any addition 
176f0 63 6f 64 65 20 74 68 65 20 75 73 65 72 20 64 65  code the user de
17700 73 69 72 65 73 20 2a 2f 0a 20 20 74 70 6c 74 5f  sires */.  tplt_
17710 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
17720 65 6d 70 2d 3e 65 78 74 72 61 63 6f 64 65 2c 6c  emp->extracode,l
17730 65 6d 70 2d 3e 65 78 74 72 61 63 6f 64 65 6c 6e  emp->extracodeln
17740 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66 63  ,&lineno);..  fc
17750 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 66 63 6c 6f  lose(in);.  fclo
17760 73 65 28 6f 75 74 29 3b 0a 20 20 72 65 74 75 72  se(out);.  retur
17770 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74  n;.}../* Generat
17780 65 20 61 20 68 65 61 64 65 72 20 66 69 6c 65 20  e a header file 
17790 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 2a  for the parser *
177a0 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 48 65 61  /.void ReportHea
177b0 64 65 72 28 6c 65 6d 70 29 0a 73 74 72 75 63 74  der(lemp).struct
177c0 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a   lemon *lemp;.{.
177d0 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e    FILE *out, *in
177e0 3b 0a 20 20 63 68 61 72 20 2a 70 72 65 66 69 78  ;.  char *prefix
177f0 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49  ;.  char line[LI
17800 4e 45 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20  NESIZE];.  char 
17810 70 61 74 74 65 72 6e 5b 4c 49 4e 45 53 49 5a 45  pattern[LINESIZE
17820 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  ];.  int i;..  i
17830 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72  f( lemp->tokenpr
17840 65 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20  efix ) prefix = 
17850 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
17860 78 3b 0a 20 20 65 6c 73 65 20 20 20 20 20 20 20  x;.  else       
17870 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
17880 66 69 78 20 3d 20 22 22 3b 0a 20 20 69 6e 20 3d  fix = "";.  in =
17890 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c   file_open(lemp,
178a0 22 2e 68 22 2c 22 72 22 29 3b 0a 20 20 69 66 28  ".h","r");.  if(
178b0 20 69 6e 20 29 7b 0a 20 20 20 20 66 6f 72 28 69   in ){.    for(i
178c0 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =1; i<lemp->nter
178d0 6d 69 6e 61 6c 20 26 26 20 66 67 65 74 73 28 6c  minal && fgets(l
178e0 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29  ine,LINESIZE,in)
178f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 70  ; i++){.      sp
17900 72 69 6e 74 66 28 70 61 74 74 65 72 6e 2c 22 23  rintf(pattern,"#
17910 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25  define %s%-30s %
17920 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d  2d\n",prefix,lem
17930 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
17940 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 69 66  ame,i);.      if
17950 28 20 73 74 72 63 6d 70 28 6c 69 6e 65 2c 70 61  ( strcmp(line,pa
17960 74 74 65 72 6e 29 20 29 20 62 72 65 61 6b 3b 0a  ttern) ) break;.
17970 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65      }.    fclose
17980 28 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 69 3d  (in);.    if( i=
17990 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  =lemp->nterminal
179a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20   ){.      /* No 
179b0 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20 66 69  change in the fi
179c0 6c 65 2e 20 20 44 6f 6e 27 74 20 72 65 77 72 69  le.  Don't rewri
179d0 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20  te it. */.      
179e0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
179f0 7d 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f  }.  out = file_o
17a00 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 77  pen(lemp,".h","w
17a10 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b  ");.  if( out ){
17a20 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
17a30 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b  lemp->nterminal;
17a40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70 72   i++){.      fpr
17a50 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
17a60 65 20 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22  e %s%-30s %2d\n"
17a70 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79  ,prefix,lemp->sy
17a80 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69  mbols[i]->name,i
17a90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c  );.    }.    fcl
17aa0 6f 73 65 28 6f 75 74 29 3b 20 20 0a 20 20 7d 0a  ose(out);  .  }.
17ab0 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
17ac0 52 65 64 75 63 65 20 74 68 65 20 73 69 7a 65 20  Reduce the size 
17ad0 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  of the action ta
17ae0 62 6c 65 73 2c 20 69 66 20 70 6f 73 73 69 62 6c  bles, if possibl
17af0 65 2c 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65  e, by making use
17b00 0a 2a 2a 20 6f 66 20 64 65 66 61 75 6c 74 73 2e  .** of defaults.
17b10 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  .**.** In this v
17b20 65 72 73 69 6f 6e 2c 20 69 66 20 61 6c 6c 20 52  ersion, if all R
17b30 45 44 55 43 45 20 61 63 74 69 6f 6e 73 20 75 73  EDUCE actions us
17b40 65 20 74 68 65 20 73 61 6d 65 20 72 75 6c 65 2c  e the same rule,
17b50 20 6d 61 6b 65 0a 2a 2a 20 74 68 65 6d 20 74 68   make.** them th
17b60 65 20 64 65 66 61 75 6c 74 2e 20 20 4f 6e 6c 79  e default.  Only
17b70 20 64 65 66 61 75 6c 74 20 74 68 65 6d 20 69 66   default them if
17b80 20 74 68 65 72 65 20 61 72 65 20 6d 6f 72 65 20   there are more 
17b90 74 68 61 6e 20 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69  than one..*/.voi
17ba0 64 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73  d CompressTables
17bb0 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65  (lemp).struct le
17bc0 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73  mon *lemp;.{.  s
17bd0 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
17be0 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
17bf0 6e 20 2a 61 70 3b 0a 20 20 73 74 72 75 63 74 20  n *ap;.  struct 
17c00 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74 20  rule *rp;.  int 
17c10 69 3b 0a 20 20 69 6e 74 20 63 6e 74 3b 0a 0a 20  i;.  int cnt;.. 
17c20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
17c30 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
17c40 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
17c50 73 6f 72 74 65 64 5b 69 5d 3b 0a 0a 20 20 20 20  sorted[i];..    
17c60 2f 2a 20 46 69 6e 64 20 74 68 65 20 66 69 72 73  /* Find the firs
17c70 74 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20  t REDUCE action 
17c80 2a 2f 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74  */.    for(ap=st
17c90 70 2d 3e 61 70 3b 20 61 70 20 26 26 20 61 70 2d  p->ap; ap && ap-
17ca0 3e 74 79 70 65 21 3d 52 45 44 55 43 45 3b 20 61  >type!=REDUCE; a
17cb0 70 3d 61 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20  p=ap->next);.   
17cc0 20 69 66 28 20 61 70 3d 3d 30 20 29 20 63 6f 6e   if( ap==0 ) con
17cd0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 52  tinue;..    /* R
17ce0 65 6d 65 6d 62 65 72 20 74 68 65 20 72 75 6c 65  emember the rule
17cf0 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 72 70 20   used */.    rp 
17d00 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 0a 20 20 20  = ap->x.rp;..   
17d10 20 2f 2a 20 53 65 65 20 69 66 20 61 6c 6c 20 6f   /* See if all o
17d20 74 68 65 72 20 52 45 44 55 43 45 20 61 63 69 74  ther REDUCE acit
17d30 6f 6e 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ons use the same
17d40 20 72 75 6c 65 20 2a 2f 0a 20 20 20 20 63 6e 74   rule */.    cnt
17d50 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 61 70   = 1;.    for(ap
17d60 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3b 20 61  =ap->next; ap; a
17d70 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
17d80 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d     if( ap->type=
17d90 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20  =REDUCE ){.     
17da0 20 20 20 69 66 28 20 61 70 2d 3e 78 2e 72 70 21     if( ap->x.rp!
17db0 3d 72 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  =rp ) break;.   
17dc0 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
17dd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
17de0 28 20 61 70 20 7c 7c 20 63 6e 74 3d 3d 31 20 29  ( ap || cnt==1 )
17df0 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
17e00 2f 2a 20 43 6f 6d 62 69 6e 65 20 61 6c 6c 20 52  /* Combine all R
17e10 45 44 55 43 45 20 61 63 74 69 6f 6e 73 20 69 6e  EDUCE actions in
17e20 74 6f 20 61 20 73 69 6e 67 6c 65 20 64 65 66 61  to a single defa
17e30 75 6c 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28 61  ult */.    for(a
17e40 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 20 26 26  p=stp->ap; ap &&
17e50 20 61 70 2d 3e 74 79 70 65 21 3d 52 45 44 55 43   ap->type!=REDUC
17e60 45 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 3b  E; ap=ap->next);
17e70 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70 20  .    assert( ap 
17e80 29 3b 0a 20 20 20 20 61 70 2d 3e 73 70 20 3d 20  );.    ap->sp = 
17e90 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66  Symbol_new("{def
17ea0 61 75 6c 74 7d 22 29 3b 0a 20 20 20 20 66 6f 72  ault}");.    for
17eb0 28 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70  (ap=ap->next; ap
17ec0 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
17ed0 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
17ee0 70 65 3d 3d 52 45 44 55 43 45 20 29 20 61 70 2d  pe==REDUCE ) ap-
17ef0 3e 74 79 70 65 20 3d 20 4e 4f 54 5f 55 53 45 44  >type = NOT_USED
17f00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 70 2d  ;.    }.    stp-
17f10 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72  >ap = Action_sor
17f20 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20 7d 0a  t(stp->ap);.  }.
17f30 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
17f40 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
17f50 6c 65 20 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a  le "set.c" *****
17f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
17f80 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70  ./*.** Set manip
17f90 75 6c 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73  ulation routines
17fa0 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70   for the LEMON p
17fb0 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
17fc0 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
17fd0 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65  size = 0;../* Se
17fe0 74 20 74 68 65 20 73 65 74 20 73 69 7a 65 20 2a  t the set size *
17ff0 2f 0a 76 6f 69 64 20 53 65 74 53 69 7a 65 28 6e  /.void SetSize(n
18000 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 73 69 7a  ).int n;.{.  siz
18010 65 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41  e = n+1;.}../* A
18020 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65  llocate a new se
18030 74 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65  t */.char *SetNe
18040 77 28 29 7b 0a 20 20 63 68 61 72 20 2a 73 3b 0a  w(){.  char *s;.
18050 20 20 69 6e 74 20 69 3b 0a 20 20 73 20 3d 20 28    int i;.  s = (
18060 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  char*)malloc( si
18070 7a 65 20 29 3b 0a 20 20 69 66 28 20 73 3d 3d 30  ze );.  if( s==0
18080 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76   ){.    extern v
18090 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72  oid memory_error
180a0 28 29 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65  ();.    memory_e
180b0 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 66 6f  rror();.  }.  fo
180c0 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69  r(i=0; i<size; i
180d0 2b 2b 29 20 73 5b 69 5d 20 3d 20 30 3b 0a 20 20  ++) s[i] = 0;.  
180e0 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20  return s;.}../* 
180f0 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65 74  Deallocate a set
18100 20 2a 2f 0a 76 6f 69 64 20 53 65 74 46 72 65 65   */.void SetFree
18110 28 73 29 0a 63 68 61 72 20 2a 73 3b 0a 7b 0a 20  (s).char *s;.{. 
18120 20 66 72 65 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20   free(s);.}../* 
18130 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
18140 74 20 74 6f 20 74 68 65 20 73 65 74 2e 20 20 52  t to the set.  R
18150 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
18160 65 20 65 6c 65 6d 65 6e 74 20 77 61 73 20 61 64  e element was ad
18170 64 65 64 0a 2a 2a 20 61 6e 64 20 46 41 4c 53 45  ded.** and FALSE
18180 20 69 66 20 69 74 20 77 61 73 20 61 6c 72 65 61   if it was alrea
18190 64 79 20 74 68 65 72 65 2e 20 2a 2f 0a 69 6e 74  dy there. */.int
181a0 20 53 65 74 41 64 64 28 73 2c 65 29 0a 63 68 61   SetAdd(s,e).cha
181b0 72 20 2a 73 3b 0a 69 6e 74 20 65 3b 0a 7b 0a 20  r *s;.int e;.{. 
181c0 20 69 6e 74 20 72 76 3b 0a 20 20 72 76 20 3d 20   int rv;.  rv = 
181d0 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20 31  s[e];.  s[e] = 1
181e0 3b 0a 20 20 72 65 74 75 72 6e 20 21 72 76 3b 0a  ;.  return !rv;.
181f0 7d 0a 0a 2f 2a 20 41 64 64 20 65 76 65 72 79 20  }../* Add every 
18200 65 6c 65 6d 65 6e 74 20 6f 66 20 73 32 20 74 6f  element of s2 to
18210 20 73 31 2e 20 20 52 65 74 75 72 6e 20 54 52 55   s1.  Return TRU
18220 45 20 69 66 20 73 31 20 63 68 61 6e 67 65 73 2e  E if s1 changes.
18230 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e   */.int SetUnion
18240 28 73 31 2c 73 32 29 0a 63 68 61 72 20 2a 73 31  (s1,s2).char *s1
18250 3b 0a 63 68 61 72 20 2a 73 32 3b 0a 7b 0a 20 20  ;.char *s2;.{.  
18260 69 6e 74 20 69 2c 20 70 72 6f 67 72 65 73 73 3b  int i, progress;
18270 0a 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b  .  progress = 0;
18280 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
18290 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ze; i++){.    if
182a0 28 20 73 32 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  ( s2[i]==0 ) con
182b0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
182c0 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  1[i]==0 ){.     
182d0 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20   progress = 1;. 
182e0 20 20 20 20 20 73 31 5b 69 5d 20 3d 20 31 3b 0a       s1[i] = 1;.
182f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
18300 72 6e 20 70 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f  rn progress;.}./
18310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18320 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
18330 66 69 6c 65 20 22 74 61 62 6c 65 2e 63 22 20 2a  file "table.c" *
18340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
18360 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74  ** All code in t
18370 68 69 73 20 66 69 6c 65 20 68 61 73 20 62 65 65  his file has bee
18380 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  n automatically 
18390 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f  generated.** fro
183a0 6d 20 61 20 73 70 65 63 69 66 69 63 61 74 69 6f  m a specificatio
183b0 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a  n in the file.**
183c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
183d0 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68  able.q".** by th
183e0 65 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  e associative ar
183f0 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e  ray code buildin
18400 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e  g program "aagen
18410 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69  "..** Do not edi
18420 74 20 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e  t this file!  In
18430 73 74 65 61 64 2c 20 65 64 69 74 20 74 68 65 20  stead, edit the 
18440 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a  specification.**
18450 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75   file, then reru
18460 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a  n aagen..*/./*.*
18470 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65  * Code for proce
18480 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20  ssing tables in 
18490 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
184a0 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
184b0 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 72 68  PRIVATE int strh
184c0 61 73 68 28 78 29 0a 63 68 61 72 20 2a 78 3b 0a  ash(x).char *x;.
184d0 7b 0a 20 20 69 6e 74 20 68 20 3d 20 30 3b 0a 20  {.  int h = 0;. 
184e0 20 77 68 69 6c 65 28 20 2a 78 29 20 68 20 3d 20   while( *x) h = 
184f0 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20  h*13 + *(x++);. 
18500 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a   return h;.}../*
18510 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74 72 64   Works like strd
18520 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20 53 61  up, sort of.  Sa
18530 76 65 20 61 20 73 74 72 69 6e 67 20 69 6e 20 6d  ve a string in m
18540 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79 2c 20  alloced memory, 
18550 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74 72 69  but.** keep stri
18560 6e 67 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73  ngs in a table s
18570 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  o that the same 
18580 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 69 6e  string is not in
18590 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e   more.** than on
185a0 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 68 61 72  e place..*/.char
185b0 20 2a 53 74 72 73 61 66 65 28 79 29 0a 63 68 61   *Strsafe(y).cha
185c0 72 20 2a 79 3b 0a 7b 0a 20 20 63 68 61 72 20 2a  r *y;.{.  char *
185d0 7a 3b 0a 0a 20 20 7a 20 3d 20 53 74 72 73 61 66  z;..  z = Strsaf
185e0 65 5f 66 69 6e 64 28 79 29 3b 0a 20 20 69 66 28  e_find(y);.  if(
185f0 20 7a 3d 3d 30 20 26 26 20 28 7a 3d 6d 61 6c 6c   z==0 && (z=mall
18600 6f 63 28 20 73 74 72 6c 65 6e 28 79 29 2b 31 20  oc( strlen(y)+1 
18610 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ))!=0 ){.    str
18620 63 70 79 28 7a 2c 79 29 3b 0a 20 20 20 20 53 74  cpy(z,y);.    St
18630 72 73 61 66 65 5f 69 6e 73 65 72 74 28 7a 29 3b  rsafe_insert(z);
18640 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72 79 43 68 65  .  }.  MemoryChe
18650 63 6b 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ck(z);.  return 
18660 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69  z;.}../* There i
18670 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
18680 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
18690 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
186a0 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76  ch.** associativ
186b0 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
186c0 22 78 31 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  "x1"..*/.struct 
186d0 73 5f 78 31 20 7b 0a 20 20 69 6e 74 20 73 69 7a  s_x1 {.  int siz
186e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
186f0 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
18700 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  f available slot
18710 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
18720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18730 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70  /*   Must be a p
18740 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65  ower of 2 greate
18750 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20  r than or */.   
18760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18770 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61         /*   equa
18780 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20  l to 1 */.  int 
18790 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
187a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
187b0 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73   currently slots
187c0 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72   filled */.  str
187d0 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 74 62  uct s_x1node *tb
187e0 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  l;  /* The data 
187f0 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20  stored here */. 
18800 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
18810 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20   **ht;  /* Hash 
18820 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70  table for lookup
18830 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72  s */.};../* Ther
18840 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
18850 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
18860 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61  ure for every da
18870 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e  ta element.** in
18880 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20   an associative 
18890 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
188a0 31 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  1"..*/.typedef s
188b0 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 7b  truct s_x1node {
188c0 0a 20 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  .  char *data;  
188d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188e0 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
188f0 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
18900 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78   *next;   /* Nex
18910 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  t entry with the
18920 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20   same hash */.  
18930 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20  struct s_x1node 
18940 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76  **from;  /* Prev
18950 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78  ious link */.} x
18960 31 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65  1node;../* There
18970 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73   is only one ins
18980 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72  tance of the arr
18990 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  ay, which is the
189a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74   following */.st
189b0 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 31  atic struct s_x1
189c0 20 2a 78 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63   *x1a;../* Alloc
189d0 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69  ate a new associ
189e0 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76  ative array */.v
189f0 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e 69 74  oid Strsafe_init
18a00 28 29 7b 0a 20 20 69 66 28 20 78 31 61 20 29 20  (){.  if( x1a ) 
18a10 72 65 74 75 72 6e 3b 0a 20 20 78 31 61 20 3d 20  return;.  x1a = 
18a20 28 73 74 72 75 63 74 20 73 5f 78 31 2a 29 6d 61  (struct s_x1*)ma
18a30 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
18a40 75 63 74 20 73 5f 78 31 29 20 29 3b 0a 20 20 69  uct s_x1) );.  i
18a50 66 28 20 78 31 61 20 29 7b 0a 20 20 20 20 78 31  f( x1a ){.    x1
18a60 61 2d 3e 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  a->size = 1024;.
18a70 20 20 20 20 78 31 61 2d 3e 63 6f 75 6e 74 20 3d      x1a->count =
18a80 20 30 3b 0a 20 20 20 20 78 31 61 2d 3e 74 62 6c   0;.    x1a->tbl
18a90 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x1node*)mall
18aa0 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65  oc( .      (size
18ab0 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x1node) + siz
18ac0 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 2a 31 30  eof(x1node*))*10
18ad0 32 34 20 29 3b 0a 20 20 20 20 69 66 28 20 78 31  24 );.    if( x1
18ae0 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
18af0 20 20 20 66 72 65 65 28 78 31 61 29 3b 0a 20 20     free(x1a);.  
18b00 20 20 20 20 78 31 61 20 3d 20 30 3b 0a 20 20 20      x1a = 0;.   
18b10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
18b20 74 20 69 3b 0a 20 20 20 20 20 20 78 31 61 2d 3e  t i;.      x1a->
18b30 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26  ht = (x1node**)&
18b40 28 78 31 61 2d 3e 74 62 6c 5b 31 30 32 34 5d 29  (x1a->tbl[1024])
18b50 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
18b60 20 69 3c 31 30 32 34 3b 20 69 2b 2b 29 20 78 31   i<1024; i++) x1
18b70 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
18b80 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73    }.  }.}./* Ins
18b90 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
18ba0 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e   into the array.
18bb0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
18bc0 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20   successful..** 
18bd0 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20  Prior data with 
18be0 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
18bf0 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20  NOT overwritten 
18c00 2a 2f 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69  */.int Strsafe_i
18c10 6e 73 65 72 74 28 64 61 74 61 29 0a 63 68 61 72  nsert(data).char
18c20 20 2a 64 61 74 61 3b 0a 7b 0a 20 20 78 31 6e 6f   *data;.{.  x1no
18c30 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b  de *np;.  int h;
18c40 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66  .  int ph;..  if
18c50 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x1a==0 ) retur
18c60 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68  n 0;.  ph = strh
18c70 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d  ash(data);.  h =
18c80 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65   ph & (x1a->size
18c90 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d  -1);.  np = x1a-
18ca0 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
18cb0 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73   np ){.    if( s
18cc0 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64  trcmp(np->data,d
18cd0 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ata)==0 ){.     
18ce0 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
18cf0 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
18d00 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64  ame key is found
18d10 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61  . */.      /* Fa
18d20 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77  il because overw
18d30 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  rite is not allo
18d40 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ws. */.      ret
18d50 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
18d60 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
18d70 20 20 7d 0a 20 20 69 66 28 20 78 31 61 2d 3e 63    }.  if( x1a->c
18d80 6f 75 6e 74 3e 3d 78 31 61 2d 3e 73 69 7a 65 20  ount>=x1a->size 
18d90 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74  ){.    /* Need t
18da0 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20  o make the hash 
18db0 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a  table bigger */.
18dc0 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a      int i,size;.
18dd0 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 31 20      struct s_x1 
18de0 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79  array;.    array
18df0 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78  .size = size = x
18e00 31 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20  1a->size*2;.    
18e10 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31  array.count = x1
18e20 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72  a->count;.    ar
18e30 72 61 79 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64  ray.tbl = (x1nod
18e40 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e*)malloc(.     
18e50 20 28 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29   (sizeof(x1node)
18e60 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65   + sizeof(x1node
18e70 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20  *))*size );.    
18e80 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30  if( array.tbl==0
18e90 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
18ea0 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c   Fail due to mal
18eb0 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  loc failure */. 
18ec0 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78     array.ht = (x
18ed0 31 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e  1node**)&(array.
18ee0 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20  tbl[size]);.    
18ef0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
18f00 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69   i++) array.ht[i
18f10 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  ] = 0;.    for(i
18f20 3d 30 3b 20 69 3c 78 31 61 2d 3e 63 6f 75 6e 74  =0; i<x1a->count
18f30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 31  ; i++){.      x1
18f40 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65  node *oldnp, *ne
18f50 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70  wnp;.      oldnp
18f60 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 69 5d   = &(x1a->tbl[i]
18f70 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72  );.      h = str
18f80 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61  hash(oldnp->data
18f90 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20  ) & (size-1);.  
18fa0 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
18fb0 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
18fc0 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
18fd0 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
18fe0 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
18ff0 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
19000 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
19010 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
19020 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
19030 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
19040 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
19050 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
19060 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
19070 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
19080 20 20 20 20 66 72 65 65 28 78 31 61 2d 3e 74 62      free(x1a->tb
19090 6c 29 3b 0a 20 20 20 20 2a 78 31 61 20 3d 20 61  l);.    *x1a = a
190a0 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
190b0 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
190c0 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
190d0 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x1a->size-1);.
190e0 20 20 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62    np = &(x1a->tb
190f0 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x1a->count++])
19100 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
19110 61 74 61 3b 0a 20 20 69 66 28 20 78 31 61 2d 3e  ata;.  if( x1a->
19120 68 74 5b 68 5d 20 29 20 78 31 61 2d 3e 68 74 5b  ht[h] ) x1a->ht[
19130 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
19140 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
19150 78 74 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b  xt = x1a->ht[h];
19160 0a 20 20 78 31 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x1a->ht[h] = 
19170 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
19180 20 26 28 78 31 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x1a->ht[h]);.
19190 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
191a0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
191b0 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
191c0 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
191d0 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
191e0 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
191f0 20 6b 65 79 2e 20 2a 2f 0a 63 68 61 72 20 2a 53   key. */.char *S
19200 74 72 73 61 66 65 5f 66 69 6e 64 28 6b 65 79 29  trsafe_find(key)
19210 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20  .char *key;.{.  
19220 69 6e 74 20 68 3b 0a 20 20 78 31 6e 6f 64 65 20  int h;.  x1node 
19230 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d  *np;..  if( x1a=
19240 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
19250 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79   h = strhash(key
19260 29 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31  ) & (x1a->size-1
19270 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68  );.  np = x1a->h
19280 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
19290 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  p ){.    if( str
192a0 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79  cmp(np->data,key
192b0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
192c0 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
192d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70  .  }.  return np
192e0 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
192f0 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
19300 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 28  pointer to the (
19310 74 65 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74  terminal or nont
19320 65 72 6d 69 6e 61 6c 29 20 73 79 6d 62 6f 6c 20  erminal) symbol 
19330 22 78 22 2e 0a 2a 2a 20 43 72 65 61 74 65 20 61  "x"..** Create a
19340 20 6e 65 77 20 73 79 6d 62 6f 6c 20 69 66 20 74   new symbol if t
19350 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
19360 20 74 69 6d 65 20 22 78 22 20 68 61 73 20 62 65   time "x" has be
19370 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75  en seen..*/.stru
19380 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f  ct symbol *Symbo
19390 6c 5f 6e 65 77 28 78 29 0a 63 68 61 72 20 2a 78  l_new(x).char *x
193a0 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  ;.{.  struct sym
193b0 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73 70 20 3d  bol *sp;..  sp =
193c0 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b   Symbol_find(x);
193d0 0a 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a  .  if( sp==0 ){.
193e0 20 20 20 20 73 70 20 3d 20 28 73 74 72 75 63 74      sp = (struct
193f0 20 73 79 6d 62 6f 6c 20 2a 29 6d 61 6c 6c 6f 63   symbol *)malloc
19400 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
19410 73 79 6d 62 6f 6c 29 20 29 3b 0a 20 20 20 20 4d  symbol) );.    M
19420 65 6d 6f 72 79 43 68 65 63 6b 28 73 70 29 3b 0a  emoryCheck(sp);.
19430 20 20 20 20 73 70 2d 3e 6e 61 6d 65 20 3d 20 53      sp->name = S
19440 74 72 73 61 66 65 28 78 29 3b 0a 20 20 20 20 73  trsafe(x);.    s
19450 70 2d 3e 74 79 70 65 20 3d 20 69 73 75 70 70 65  p->type = isuppe
19460 72 28 2a 78 29 20 3f 20 54 45 52 4d 49 4e 41 4c  r(*x) ? TERMINAL
19470 20 3a 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c 3b 0a   : NONTERMINAL;.
19480 20 20 20 20 73 70 2d 3e 72 75 6c 65 20 3d 20 30      sp->rule = 0
19490 3b 0a 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d  ;.    sp->prec =
194a0 20 2d 31 3b 0a 20 20 20 20 73 70 2d 3e 61 73 73   -1;.    sp->ass
194b0 6f 63 20 3d 20 55 4e 4b 3b 0a 20 20 20 20 73 70  oc = UNK;.    sp
194c0 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 30 3b 0a  ->firstset = 0;.
194d0 20 20 20 20 73 70 2d 3e 6c 61 6d 62 64 61 20 3d      sp->lambda =
194e0 20 46 41 4c 53 45 3b 0a 20 20 20 20 73 70 2d 3e   FALSE;.    sp->
194f0 64 65 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a  destructor = 0;.
19500 20 20 20 20 73 70 2d 3e 64 61 74 61 74 79 70 65      sp->datatype
19510 20 3d 20 30 3b 0a 20 20 20 20 53 79 6d 62 6f 6c   = 0;.    Symbol
19520 5f 69 6e 73 65 72 74 28 73 70 2c 73 70 2d 3e 6e  _insert(sp,sp->n
19530 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame);.  }.  retu
19540 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  rn sp;.}../* Com
19550 70 61 72 65 20 74 77 6f 20 73 79 6d 62 6f 6c 73  pare two symbols
19560 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d   */.int Symbolcm
19570 70 70 28 61 2c 62 29 0a 73 74 72 75 63 74 20 73  pp(a,b).struct s
19580 79 6d 62 6f 6c 20 2a 2a 61 3b 0a 73 74 72 75 63  ymbol **a;.struc
19590 74 20 73 79 6d 62 6f 6c 20 2a 2a 62 3b 0a 7b 0a  t symbol **b;.{.
195a0 20 20 72 65 74 75 72 6e 20 73 74 72 63 6d 70 28    return strcmp(
195b0 28 2a 2a 61 29 2e 6e 61 6d 65 2c 28 2a 2a 62 29  (**a).name,(**b)
195c0 2e 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 20 54 68  .name);.}../* Th
195d0 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
195e0 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
195f0 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66  wing structure f
19600 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63  or each.** assoc
19610 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
19620 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 73 74  type "x2"..*/.st
19630 72 75 63 74 20 73 5f 78 32 20 7b 0a 20 20 69 6e  ruct s_x2 {.  in
19640 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
19650 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
19660 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
19670 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20   slots. */.     
19680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19690 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62       /*   Must b
196a0 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  e a power of 2 g
196b0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a  reater than or *
196c0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
196d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
196e0 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20   equal to 1 */. 
196f0 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20   int count;     
19700 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
19710 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20  er of currently 
19720 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a  slots filled */.
19730 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64    struct s_x2nod
19740 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20  e *tbl;  /* The 
19750 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65  data stored here
19760 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
19770 32 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20  2node **ht;  /* 
19780 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c  Hash table for l
19790 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ookups */.};../*
197a0 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
197b0 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
197c0 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65  tructure for eve
197d0 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a  ry data element.
197e0 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61  ** in an associa
197f0 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
19800 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 74 79 70 65  pe "x2"..*/.type
19810 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 32 6e  def struct s_x2n
19820 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ode {.  struct s
19830 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 20 20 20 20  ymbol *data;    
19840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19850 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 63   The data */.  c
19860 68 61 72 20 2a 6b 65 79 3b 20 20 20 20 20 20 20  har *key;       
19870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19880 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75  he key */.  stru
19890 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 6e 65 78  ct s_x2node *nex
198a0 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  t;   /* Next ent
198b0 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
198c0 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63   hash */.  struc
198d0 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 66 72 6f  t s_x2node **fro
198e0 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  m;  /* Previous 
198f0 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 32 6e 6f 64 65  link */.} x2node
19900 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
19910 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  nly one instance
19920 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77   of the array, w
19930 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c  hich is the foll
19940 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  owing */.static 
19950 73 74 72 75 63 74 20 73 5f 78 32 20 2a 78 32 61  struct s_x2 *x2a
19960 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  ;../* Allocate a
19970 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65   new associative
19980 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53   array */.void S
19990 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 7b 0a 20 20  ymbol_init(){.  
199a0 69 66 28 20 78 32 61 20 29 20 72 65 74 75 72 6e  if( x2a ) return
199b0 3b 0a 20 20 78 32 61 20 3d 20 28 73 74 72 75 63  ;.  x2a = (struc
199c0 74 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28 20  t s_x2*)malloc( 
199d0 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f  sizeof(struct s_
199e0 78 32 29 20 29 3b 0a 20 20 69 66 28 20 78 32 61  x2) );.  if( x2a
199f0 20 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73 69 7a   ){.    x2a->siz
19a00 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 32 61  e = 128;.    x2a
19a10 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ->count = 0;.   
19a20 20 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78 32 6e   x2a->tbl = (x2n
19a30 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20  ode*)malloc( .  
19a40 20 20 20 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f      (sizeof(x2no
19a50 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e  de) + sizeof(x2n
19a60 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a 20 20  ode*))*128 );.  
19a70 20 20 69 66 28 20 78 32 61 2d 3e 74 62 6c 3d 3d    if( x2a->tbl==
19a80 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
19a90 78 32 61 29 3b 0a 20 20 20 20 20 20 78 32 61 20  x2a);.      x2a 
19aa0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
19ab0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
19ac0 20 20 20 78 32 61 2d 3e 68 74 20 3d 20 28 78 32     x2a->ht = (x2
19ad0 6e 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e 74 62  node**)&(x2a->tb
19ae0 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66  l[128]);.      f
19af0 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69  or(i=0; i<128; i
19b00 2b 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x2a->ht[i] =
19b10 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
19b20 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  /* Insert a new 
19b30 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
19b40 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54  array.  Return T
19b50 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75  RUE if successfu
19b60 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61  l..** Prior data
19b70 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
19b80 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72  ey is NOT overwr
19b90 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d  itten */.int Sym
19ba0 62 6f 6c 5f 69 6e 73 65 72 74 28 64 61 74 61 2c  bol_insert(data,
19bb0 6b 65 79 29 0a 73 74 72 75 63 74 20 73 79 6d 62  key).struct symb
19bc0 6f 6c 20 2a 64 61 74 61 3b 0a 63 68 61 72 20 2a  ol *data;.char *
19bd0 6b 65 79 3b 0a 7b 0a 20 20 78 32 6e 6f 64 65 20  key;.{.  x2node 
19be0 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  *np;.  int h;.  
19bf0 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78  int ph;..  if( x
19c00 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  2a==0 ) return 0
19c10 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73 68  ;.  ph = strhash
19c20 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20  (key);.  h = ph 
19c30 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x2a->size-1);
19c40 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b  .  np = x2a->ht[
19c50 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
19c60 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
19c70 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d  p(np->key,key)==
19c80 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  0 ){.      /* An
19c90 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
19ca0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
19cb0 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20  y is found. */. 
19cc0 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63       /* Fail bec
19cd0 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69  ause overwrite i
19ce0 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f  s not allows. */
19cf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
19d00 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20  .    }.    np = 
19d10 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
19d20 69 66 28 20 78 32 61 2d 3e 63 6f 75 6e 74 3e 3d  if( x2a->count>=
19d30 78 32 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20  x2a->size ){.   
19d40 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
19d50 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
19d60 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e  bigger */.    in
19d70 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74  t i,size;.    st
19d80 72 75 63 74 20 73 5f 78 32 20 61 72 72 61 79 3b  ruct s_x2 array;
19d90 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20  .    array.size 
19da0 3d 20 73 69 7a 65 20 3d 20 78 32 61 2d 3e 73 69  = size = x2a->si
19db0 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e  ze*2;.    array.
19dc0 63 6f 75 6e 74 20 3d 20 78 32 61 2d 3e 63 6f 75  count = x2a->cou
19dd0 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62  nt;.    array.tb
19de0 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 6d 61 6c  l = (x2node*)mal
19df0 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65  loc(.      (size
19e00 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x2node) + siz
19e10 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 2a 73 69  eof(x2node*))*si
19e20 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72  ze );.    if( ar
19e30 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74  ray.tbl==0 ) ret
19e40 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20  urn 0;  /* Fail 
19e50 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61  due to malloc fa
19e60 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72  ilure */.    arr
19e70 61 79 2e 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a  ay.ht = (x2node*
19e80 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69  *)&(array.tbl[si
19e90 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ze]);.    for(i=
19ea0 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20  0; i<size; i++) 
19eb0 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b  array.ht[i] = 0;
19ec0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
19ed0 78 32 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x2a->count; i++)
19ee0 7b 0a 20 20 20 20 20 20 78 32 6e 6f 64 65 20 2a  {.      x2node *
19ef0 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20  oldnp, *newnp;. 
19f00 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78       oldnp = &(x
19f10 32 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  2a->tbl[i]);.   
19f20 20 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f     h = strhash(o
19f30 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 73 69  ldnp->key) & (si
19f40 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77  ze-1);.      new
19f50 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c  np = &(array.tbl
19f60 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
19f70 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72  array.ht[h] ) ar
19f80 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  ray.ht[h]->from 
19f90 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29  = &(newnp->next)
19fa0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e  ;.      newnp->n
19fb0 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68  ext = array.ht[h
19fc0 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  ];.      newnp->
19fd0 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79  key = oldnp->key
19fe0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64  ;.      newnp->d
19ff0 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74  ata = oldnp->dat
1a000 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  a;.      newnp->
1a010 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68  from = &(array.h
1a020 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72  t[h]);.      arr
1a030 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70  ay.ht[h] = newnp
1a040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
1a050 28 78 32 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20  (x2a->tbl);.    
1a060 2a 78 32 61 20 3d 20 61 72 72 61 79 3b 0a 20 20  *x2a = array;.  
1a070 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  }.  /* Insert th
1a080 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20  e new data */.  
1a090 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73  h = ph & (x2a->s
1a0a0 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26  ize-1);.  np = &
1a0b0 28 78 32 61 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63  (x2a->tbl[x2a->c
1a0c0 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e  ount++]);.  np->
1a0d0 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d  key = key;.  np-
1a0e0 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20  >data = data;.  
1a0f0 69 66 28 20 78 32 61 2d 3e 68 74 5b 68 5d 20 29  if( x2a->ht[h] )
1a100 20 78 32 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f   x2a->ht[h]->fro
1a110 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b  m = &(np->next);
1a120 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 32  .  np->next = x2
1a130 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 32 61 2d  a->ht[h];.  x2a-
1a140 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e  >ht[h] = np;.  n
1a150 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 32 61 2d  p->from = &(x2a-
1a160 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72  >ht[h]);.  retur
1a170 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  n 1;.}../* Retur
1a180 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  n a pointer to d
1a190 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ata assigned to 
1a1a0 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20  the given key.  
1a1b0 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69  Return NULL.** i
1a1c0 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a  f no such key. *
1a1d0 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
1a1e0 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6b 65 79  *Symbol_find(key
1a1f0 29 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20  ).char *key;.{. 
1a200 20 69 6e 74 20 68 3b 0a 20 20 78 32 6e 6f 64 65   int h;.  x2node
1a210 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 32 61   *np;..  if( x2a
1a220 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1a230 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65    h = strhash(ke
1a240 79 29 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d  y) & (x2a->size-
1a250 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e  1);.  np = x2a->
1a260 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
1a270 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
1a280 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79  rcmp(np->key,key
1a290 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
1a2a0 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
1a2b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70  .  }.  return np
1a2c0 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
1a2d0 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68  .}../* Return th
1a2e0 65 20 6e 2d 74 68 20 64 61 74 61 2e 20 20 52 65  e n-th data.  Re
1a2f0 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 20 69  turn NULL if n i
1a300 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
1a310 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  */.struct symbol
1a320 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 6e 29 0a   *Symbol_Nth(n).
1a330 69 6e 74 20 6e 3b 0a 7b 0a 20 20 73 74 72 75 63  int n;.{.  struc
1a340 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a  t symbol *data;.
1a350 20 20 69 66 28 20 78 32 61 20 26 26 20 6e 3e 30    if( x2a && n>0
1a360 20 26 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f 75 6e   && n<=x2a->coun
1a370 74 20 29 7b 0a 20 20 20 20 64 61 74 61 20 3d 20  t ){.    data = 
1a380 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e 64 61  x2a->tbl[n-1].da
1a390 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ta;.  }else{.   
1a3a0 20 64 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20   data = 0;.  }. 
1a3b0 20 72 65 74 75 72 6e 20 64 61 74 61 3b 0a 7d 0a   return data;.}.
1a3c0 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  ./* Return the s
1a3d0 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
1a3e0 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63   */.int Symbol_c
1a3f0 6f 75 6e 74 28 29 0a 7b 0a 20 20 72 65 74 75 72  ount().{.  retur
1a400 6e 20 78 32 61 20 3f 20 78 32 61 2d 3e 63 6f 75  n x2a ? x2a->cou
1a410 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  nt : 0;.}../* Re
1a420 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  turn an array of
1a430 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
1a440 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 61 62   data in the tab
1a450 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79  le..** The array
1a460 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
1a470 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72  m malloc.  Retur
1a480 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79  n NULL if memory
1a490 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70   allocation.** p
1a4a0 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74  roblems, or if t
1a4b0 68 65 20 61 72 72 61 79 20 69 73 20 65 6d 70 74  he array is empt
1a4c0 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d  y. */.struct sym
1a4d0 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72  bol **Symbol_arr
1a4e0 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75 63  ayof().{.  struc
1a4f0 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 72 72 61 79  t symbol **array
1a500 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a  ;.  int i,size;.
1a510 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72    if( x2a==0 ) r
1a520 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65 20  eturn 0;.  size 
1a530 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x2a->count;.  
1a540 61 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20  array = (struct 
1a550 73 79 6d 62 6f 6c 20 2a 2a 29 6d 61 6c 6c 6f 63  symbol **)malloc
1a560 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
1a570 73 79 6d 62 6f 6c 20 2a 29 2a 73 69 7a 65 20 29  symbol *)*size )
1a580 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20 29 7b  ;.  if( array ){
1a590 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1a5a0 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  size; i++) array
1a5b0 5b 69 5d 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 69  [i] = x2a->tbl[i
1a5c0 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65  ].data;.  }.  re
1a5d0 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f  turn array;.}../
1a5e0 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 63 6f  * Compare two co
1a5f0 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a  nfigurations */.
1a600 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 61 2c  int Configcmp(a,
1a610 62 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  b).struct config
1a620 20 2a 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66   *a;.struct conf
1a630 69 67 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20 78  ig *b;.{.  int x
1a640 3b 0a 20 20 78 20 3d 20 61 2d 3e 72 70 2d 3e 69  ;.  x = a->rp->i
1a650 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e  ndex - b->rp->in
1a660 64 65 78 3b 0a 20 20 69 66 28 20 78 3d 3d 30 20  dex;.  if( x==0 
1a670 29 20 78 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62  ) x = a->dot - b
1a680 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20  ->dot;.  return 
1a690 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65  x;.}../* Compare
1a6a0 20 74 77 6f 20 73 74 61 74 65 73 20 2a 2f 0a 50   two states */.P
1a6b0 52 49 56 41 54 45 20 69 6e 74 20 73 74 61 74 65  RIVATE int state
1a6c0 63 6d 70 28 61 2c 62 29 0a 73 74 72 75 63 74 20  cmp(a,b).struct 
1a6d0 63 6f 6e 66 69 67 20 2a 61 3b 0a 73 74 72 75 63  config *a;.struc
1a6e0 74 20 63 6f 6e 66 69 67 20 2a 62 3b 0a 7b 0a 20  t config *b;.{. 
1a6f0 20 69 6e 74 20 72 63 3b 0a 20 20 66 6f 72 28 72   int rc;.  for(r
1a700 63 3d 30 3b 20 72 63 3d 3d 30 20 26 26 20 61 20  c=0; rc==0 && a 
1a710 26 26 20 62 3b 20 20 61 3d 61 2d 3e 62 70 2c 20  && b;  a=a->bp, 
1a720 62 3d 62 2d 3e 62 70 29 7b 0a 20 20 20 20 72 63  b=b->bp){.    rc
1a730 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20   = a->rp->index 
1a740 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a  - b->rp->index;.
1a750 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20      if( rc==0 ) 
1a760 72 63 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d  rc = a->dot - b-
1a770 3e 64 6f 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >dot;.  }.  if( 
1a780 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
1a790 20 61 20 29 20 72 63 20 3d 20 31 3b 0a 20 20 20   a ) rc = 1;.   
1a7a0 20 69 66 28 20 62 20 29 20 72 63 20 3d 20 2d 31   if( b ) rc = -1
1a7b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1a7c0 63 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20  c;.}../* Hash a 
1a7d0 73 74 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45  state */.PRIVATE
1a7e0 20 69 6e 74 20 73 74 61 74 65 68 61 73 68 28 61   int statehash(a
1a7f0 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ).struct config 
1a800 2a 61 3b 0a 7b 0a 20 20 69 6e 74 20 68 3d 30 3b  *a;.{.  int h=0;
1a810 0a 20 20 77 68 69 6c 65 28 20 61 20 29 7b 0a 20  .  while( a ){. 
1a820 20 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61     h = h*571 + a
1a830 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b  ->rp->index*37 +
1a840 20 61 2d 3e 64 6f 74 3b 0a 20 20 20 20 61 20 3d   a->dot;.    a =
1a850 20 61 2d 3e 62 70 3b 0a 20 20 7d 0a 20 20 72 65   a->bp;.  }.  re
1a860 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c  turn h;.}../* Al
1a870 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 74 61  locate a new sta
1a880 74 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  te structure */.
1a890 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53 74  struct state *St
1a8a0 61 74 65 5f 6e 65 77 28 29 0a 7b 0a 20 20 73 74  ate_new().{.  st
1a8b0 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77 3b  ruct state *new;
1a8c0 0a 20 20 6e 65 77 20 3d 20 28 73 74 72 75 63 74  .  new = (struct
1a8d0 20 73 74 61 74 65 20 2a 29 6d 61 6c 6c 6f 63 28   state *)malloc(
1a8e0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
1a8f0 74 61 74 65 29 20 29 3b 0a 20 20 4d 65 6d 6f 72  tate) );.  Memor
1a900 79 43 68 65 63 6b 28 6e 65 77 29 3b 0a 20 20 72  yCheck(new);.  r
1a910 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a  eturn new;.}../*
1a920 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
1a930 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1a940 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1a950 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73  e for each.** as
1a960 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
1a970 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f  of type "x3"..*/
1a980 0a 73 74 72 75 63 74 20 73 5f 78 33 20 7b 0a 20  .struct s_x3 {. 
1a990 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
1a9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a9b0 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
1a9c0 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20  ble slots. */.  
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9e0 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73          /*   Mus
1a9f0 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
1aa00 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  2 greater than o
1aa10 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  r */.           
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1aa30 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a  *   equal to 1 *
1aa40 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20  /.  int count;  
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1aa60 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74  umber of current
1aa70 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20  ly slots filled 
1aa80 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33  */.  struct s_x3
1aa90 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54  node *tbl;  /* T
1aaa0 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68  he data stored h
1aab0 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ere */.  struct 
1aac0 73 5f 78 33 6e 6f 64 65 20 2a 2a 68 74 3b 20 20  s_x3node **ht;  
1aad0 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f  /* Hash table fo
1aae0 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a  r lookups */.};.
1aaf0 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  ./* There is one
1ab00 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
1ab10 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  s structure for 
1ab20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65  every data eleme
1ab30 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f  nt.** in an asso
1ab40 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
1ab50 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 74   type "x3"..*/.t
1ab60 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f  ypedef struct s_
1ab70 78 33 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63  x3node {.  struc
1ab80 74 20 73 74 61 74 65 20 2a 64 61 74 61 3b 20 20  t state *data;  
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aba0 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
1abb0 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
1abc0 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  key;            
1abd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65         /* The ke
1abe0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  y */.  struct s_
1abf0 78 33 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20  x3node *next;   
1ac00 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
1ac10 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
1ac20 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1ac30 33 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f  3node **from;  /
1ac40 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20  * Previous link 
1ac50 2a 2f 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a  */.} x3node;../*
1ac60 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   There is only o
1ac70 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
1ac80 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  he array, which 
1ac90 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  is the following
1aca0 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
1acb0 74 20 73 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a  t s_x3 *x3a;../*
1acc0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
1acd0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
1ace0 79 20 2a 2f 0a 76 6f 69 64 20 53 74 61 74 65 5f  y */.void State_
1acf0 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 33  init(){.  if( x3
1ad00 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 33  a ) return;.  x3
1ad10 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 33  a = (struct s_x3
1ad20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
1ad30 28 73 74 72 75 63 74 20 73 5f 78 33 29 20 29 3b  (struct s_x3) );
1ad40 0a 20 20 69 66 28 20 78 33 61 20 29 7b 0a 20 20  .  if( x3a ){.  
1ad50 20 20 78 33 61 2d 3e 73 69 7a 65 20 3d 20 31 32    x3a->size = 12
1ad60 38 3b 0a 20 20 20 20 78 33 61 2d 3e 63 6f 75 6e  8;.    x3a->coun
1ad70 74 20 3d 20 30 3b 0a 20 20 20 20 78 33 61 2d 3e  t = 0;.    x3a->
1ad80 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d  tbl = (x3node*)m
1ad90 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73  alloc( .      (s
1ada0 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20  izeof(x3node) + 
1adb0 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29  sizeof(x3node*))
1adc0 2a 31 32 38 20 29 3b 0a 20 20 20 20 69 66 28 20  *128 );.    if( 
1add0 78 33 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20  x3a->tbl==0 ){. 
1ade0 20 20 20 20 20 66 72 65 65 28 78 33 61 29 3b 0a       free(x3a);.
1adf0 20 20 20 20 20 20 78 33 61 20 3d 20 30 3b 0a 20        x3a = 0;. 
1ae00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ae10 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 33 61  int i;.      x3a
1ae20 2d 3e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a  ->ht = (x3node**
1ae30 29 26 28 78 33 61 2d 3e 74 62 6c 5b 31 32 38 5d  )&(x3a->tbl[128]
1ae40 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
1ae50 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 33  ; i<128; i++) x3
1ae60 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
1ae70 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73    }.  }.}./* Ins
1ae80 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
1ae90 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e   into the array.
1aea0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
1aeb0 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20   successful..** 
1aec0 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20  Prior data with 
1aed0 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
1aee0 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20  NOT overwritten 
1aef0 2a 2f 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73  */.int State_ins
1af00 65 72 74 28 64 61 74 61 2c 6b 65 79 29 0a 73 74  ert(data,key).st
1af10 72 75 63 74 20 73 74 61 74 65 20 2a 64 61 74 61  ruct state *data
1af20 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
1af30 2a 6b 65 79 3b 0a 7b 0a 20 20 78 33 6e 6f 64 65  *key;.{.  x3node
1af40 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20   *np;.  int h;. 
1af50 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20   int ph;..  if( 
1af60 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x3a==0 ) return 
1af70 30 3b 0a 20 20 70 68 20 3d 20 73 74 61 74 65 68  0;.  ph = stateh
1af80 61 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20  ash(key);.  h = 
1af90 70 68 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d  ph & (x3a->size-
1afa0 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e  1);.  np = x3a->
1afb0 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
1afc0 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
1afd0 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b  atecmp(np->key,k
1afe0 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ey)==0 ){.      
1aff0 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65  /* An existing e
1b000 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
1b010 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e  me key is found.
1b020 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   */.      /* Fai
1b030 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72  l because overwr
1b040 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ite is not allow
1b050 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  s. */.      retu
1b060 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1b070 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
1b080 20 7d 0a 20 20 69 66 28 20 78 33 61 2d 3e 63 6f   }.  if( x3a->co
1b090 75 6e 74 3e 3d 78 33 61 2d 3e 73 69 7a 65 20 29  unt>=x3a->size )
1b0a0 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
1b0b0 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
1b0c0 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20  able bigger */. 
1b0d0 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20     int i,size;. 
1b0e0 20 20 20 73 74 72 75 63 74 20 73 5f 78 33 20 61     struct s_x3 a
1b0f0 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e  rray;.    array.
1b100 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 33  size = size = x3
1b110 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61  a->size*2;.    a
1b120 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 33 61  rray.count = x3a
1b130 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72  ->count;.    arr
1b140 61 79 2e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65  ay.tbl = (x3node
1b150 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  *)malloc(.      
1b160 28 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20  (sizeof(x3node) 
1b170 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a  + sizeof(x3node*
1b180 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69  ))*size );.    i
1b190 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20  f( array.tbl==0 
1b1a0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
1b1b0 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c  Fail due to mall
1b1c0 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20  oc failure */.  
1b1d0 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 33    array.ht = (x3
1b1e0 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74  node**)&(array.t
1b1f0 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66  bl[size]);.    f
1b200 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20  or(i=0; i<size; 
1b210 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d  i++) array.ht[i]
1b220 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
1b230 30 3b 20 69 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b  0; i<x3a->count;
1b240 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 33 6e   i++){.      x3n
1b250 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77  ode *oldnp, *new
1b260 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20  np;.      oldnp 
1b270 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 69 5d 29  = &(x3a->tbl[i])
1b280 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 61 74  ;.      h = stat
1b290 65 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79  ehash(oldnp->key
1b2a0 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20  ) & (size-1);.  
1b2b0 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
1b2c0 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
1b2d0 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
1b2e0 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
1b2f0 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
1b300 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
1b310 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
1b320 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
1b330 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64  newnp->key = old
1b340 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e  np->key;.      n
1b350 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64  ewnp->data = old
1b360 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20  np->data;.      
1b370 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  newnp->from = &(
1b380 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20  array.ht[h]);.  
1b390 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20      array.ht[h] 
1b3a0 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20  = newnp;.    }. 
1b3b0 20 20 20 66 72 65 65 28 78 33 61 2d 3e 74 62 6c     free(x3a->tbl
1b3c0 29 3b 0a 20 20 20 20 2a 78 33 61 20 3d 20 61 72  );.    *x3a = ar
1b3d0 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e  ray;.  }.  /* In
1b3e0 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74  sert the new dat
1b3f0 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20  a */.  h = ph & 
1b400 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x3a->size-1);. 
1b410 20 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c   np = &(x3a->tbl
1b420 5b 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b  [x3a->count++]);
1b430 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79  .  np->key = key
1b440 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
1b450 61 74 61 3b 0a 20 20 69 66 28 20 78 33 61 2d 3e  ata;.  if( x3a->
1b460 68 74 5b 68 5d 20 29 20 78 33 61 2d 3e 68 74 5b  ht[h] ) x3a->ht[
1b470 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
1b480 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
1b490 78 74 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b  xt = x3a->ht[h];
1b4a0 0a 20 20 78 33 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x3a->ht[h] = 
1b4b0 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
1b4c0 20 26 28 78 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x3a->ht[h]);.
1b4d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1b4e0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1b4f0 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
1b500 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
1b510 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
1b520 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
1b530 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20   key. */.struct 
1b540 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69 6e  state *State_fin
1b550 64 28 6b 65 79 29 0a 73 74 72 75 63 74 20 63 6f  d(key).struct co
1b560 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69  nfig *key;.{.  i
1b570 6e 74 20 68 3b 0a 20 20 78 33 6e 6f 64 65 20 2a  nt h;.  x3node *
1b580 6e 70 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d  np;..  if( x3a==
1b590 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1b5a0 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65  h = statehash(ke
1b5b0 79 29 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d  y) & (x3a->size-
1b5c0 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e  1);.  np = x3a->
1b5d0 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
1b5e0 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
1b5f0 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b  atecmp(np->key,k
1b600 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ey)==0 ) break;.
1b610 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
1b620 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
1b630 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20  np ? np->data : 
1b640 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  0;.}../* Return 
1b650 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
1b660 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61  ters to all data
1b670 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
1b680 2a 20 54 68 65 20 61 72 72 61 79 20 69 73 20 6f  * The array is o
1b690 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
1b6a0 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  loc.  Return NUL
1b6b0 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  L if memory allo
1b6c0 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65  cation.** proble
1b6d0 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72  ms, or if the ar
1b6e0 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f  ray is empty. */
1b6f0 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a  .struct state **
1b700 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28 29 0a  State_arrayof().
1b710 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
1b720 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20   **array;.  int 
1b730 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20 78 33  i,size;.  if( x3
1b740 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
1b750 0a 20 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e 63  .  size = x3a->c
1b760 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20  ount;.  array = 
1b770 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a  (struct state **
1b780 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
1b790 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 2a  struct state *)*
1b7a0 73 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 61 72  size );.  if( ar
1b7b0 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ray ){.    for(i
1b7c0 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29  =0; i<size; i++)
1b7d0 20 61 72 72 61 79 5b 69 5d 20 3d 20 78 33 61 2d   array[i] = x3a-
1b7e0 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20  >tbl[i].data;.  
1b7f0 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 72 61 79  }.  return array
1b800 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 63  ;.}../* Hash a c
1b810 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a  onfiguration */.
1b820 50 52 49 56 41 54 45 20 69 6e 74 20 63 6f 6e 66  PRIVATE int conf
1b830 69 67 68 61 73 68 28 61 29 0a 73 74 72 75 63 74  ighash(a).struct
1b840 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b 0a 20 20   config *a;.{.  
1b850 69 6e 74 20 68 3d 30 3b 0a 20 20 68 20 3d 20 68  int h=0;.  h = h
1b860 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e  *571 + a->rp->in
1b870 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b  dex*37 + a->dot;
1b880 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a  .  return h;.}..
1b890 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
1b8a0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1b8b0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1b8c0 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  ure for each.** 
1b8d0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
1b8e0 79 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a  y of type "x4"..
1b8f0 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 34 20 7b  */.struct s_x4 {
1b900 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
1b910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b920 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
1b930 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a  lable slots. */.
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d            /*   M
1b960 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
1b970 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e  f 2 greater than
1b980 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   or */.         
1b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9a0 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31   /*   equal to 1
1b9b0 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b   */.  int count;
1b9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b9d0 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65   Number of curre
1b9e0 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65  ntly slots fille
1b9f0 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  d */.  struct s_
1ba00 78 34 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a  x4node *tbl;  /*
1ba10 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64   The data stored
1ba20 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63   here */.  struc
1ba30 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 68 74 3b  t s_x4node **ht;
1ba40 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
1ba50 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d  for lookups */.}
1ba60 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
1ba70 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
1ba80 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f  his structure fo
1ba90 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65  r every data ele
1baa0 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73  ment.** in an as
1bab0 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
1bac0 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f  of type "x4"..*/
1bad0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1bae0 73 5f 78 34 6e 6f 64 65 20 7b 0a 20 20 73 74 72  s_x4node {.  str
1baf0 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61  uct config *data
1bb00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bb10 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
1bb20 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e  /.  struct s_x4n
1bb30 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
1bb40 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
1bb50 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
1bb60 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f  .  struct s_x4no
1bb70 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
1bb80 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
1bb90 7d 20 78 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x4node;../* Th
1bba0 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
1bbb0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1bbc0 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
1bbd0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
1bbe0 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
1bbf0 5f 78 34 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41 6c  _x4 *x4a;../* Al
1bc00 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
1bc10 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
1bc20 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62  /.void Configtab
1bc30 6c 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28  le_init(){.  if(
1bc40 20 78 34 61 20 29 20 72 65 74 75 72 6e 3b 0a 20   x4a ) return;. 
1bc50 20 78 34 61 20 3d 20 28 73 74 72 75 63 74 20 73   x4a = (struct s
1bc60 5f 78 34 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  _x4*)malloc( siz
1bc70 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 34 29  eof(struct s_x4)
1bc80 20 29 3b 0a 20 20 69 66 28 20 78 34 61 20 29 7b   );.  if( x4a ){
1bc90 0a 20 20 20 20 78 34 61 2d 3e 73 69 7a 65 20 3d  .    x4a->size =
1bca0 20 36 34 3b 0a 20 20 20 20 78 34 61 2d 3e 63 6f   64;.    x4a->co
1bcb0 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 34 61  unt = 0;.    x4a
1bcc0 2d 3e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a  ->tbl = (x4node*
1bcd0 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20  )malloc( .      
1bce0 28 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20  (sizeof(x4node) 
1bcf0 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a  + sizeof(x4node*
1bd00 29 29 2a 36 34 20 29 3b 0a 20 20 20 20 69 66 28  ))*64 );.    if(
1bd10 20 78 34 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a   x4a->tbl==0 ){.
1bd20 20 20 20 20 20 20 66 72 65 65 28 78 34 61 29 3b        free(x4a);
1bd30 0a 20 20 20 20 20 20 78 34 61 20 3d 20 30 3b 0a  .      x4a = 0;.
1bd40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bd50 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 34   int i;.      x4
1bd60 61 2d 3e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a  a->ht = (x4node*
1bd70 2a 29 26 28 78 34 61 2d 3e 74 62 6c 5b 36 34 5d  *)&(x4a->tbl[64]
1bd80 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
1bd90 3b 20 69 3c 36 34 3b 20 69 2b 2b 29 20 78 34 61  ; i<64; i++) x4a
1bda0 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  ->ht[i] = 0;.   
1bdb0 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65   }.  }.}./* Inse
1bdc0 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
1bdd0 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20  into the array. 
1bde0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1bdf0 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50  successful..** P
1be00 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74  rior data with t
1be10 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e  he same key is N
1be20 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a  OT overwritten *
1be30 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c  /.int Configtabl
1be40 65 5f 69 6e 73 65 72 74 28 64 61 74 61 29 0a 73  e_insert(data).s
1be50 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61  truct config *da
1be60 74 61 3b 0a 7b 0a 20 20 78 34 6e 6f 64 65 20 2a  ta;.{.  x4node *
1be70 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69  np;.  int h;.  i
1be80 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 34  nt ph;..  if( x4
1be90 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
1bea0 0a 20 20 70 68 20 3d 20 63 6f 6e 66 69 67 68 61  .  ph = configha
1beb0 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20  sh(data);.  h = 
1bec0 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d  ph & (x4a->size-
1bed0 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e  1);.  np = x4a->
1bee0 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
1bef0 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 43 6f  np ){.    if( Co
1bf00 6e 66 69 67 63 6d 70 28 6e 70 2d 3e 64 61 74 61  nfigcmp(np->data
1bf10 2c 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20  ,data)==0 ){.   
1bf20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
1bf30 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  g entry with the
1bf40 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75   same key is fou
1bf50 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  nd. */.      /* 
1bf60 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65  Fail because ove
1bf70 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c  rwrite is not al
1bf80 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  lows. */.      r
1bf90 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1bfa0 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
1bfb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 34 61 2d  ;.  }.  if( x4a-
1bfc0 3e 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e 73 69 7a  >count>=x4a->siz
1bfd0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64  e ){.    /* Need
1bfe0 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
1bff0 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a  h table bigger *
1c000 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65  /.    int i,size
1c010 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78  ;.    struct s_x
1c020 34 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72  4 array;.    arr
1c030 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d  ay.size = size =
1c040 20 78 34 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20   x4a->size*2;.  
1c050 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20    array.count = 
1c060 78 34 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20  x4a->count;.    
1c070 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 34 6e  array.tbl = (x4n
1c080 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20  ode*)malloc(.   
1c090 20 20 20 28 73 69 7a 65 6f 66 28 78 34 6e 6f 64     (sizeof(x4nod
1c0a0 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f  e) + sizeof(x4no
1c0b0 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20  de*))*size );.  
1c0c0 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d    if( array.tbl=
1c0d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
1c0e0 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d  /* Fail due to m
1c0f0 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f  alloc failure */
1c100 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20  .    array.ht = 
1c110 28 78 34 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61  (x4node**)&(arra
1c120 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20  y.tbl[size]);.  
1c130 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
1c140 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74  e; i++) array.ht
1c150 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  [i] = 0;.    for
1c160 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75  (i=0; i<x4a->cou
1c170 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
1c180 78 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a  x4node *oldnp, *
1c190 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64  newnp;.      old
1c1a0 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b  np = &(x4a->tbl[
1c1b0 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 63  i]);.      h = c
1c1c0 6f 6e 66 69 67 68 61 73 68 28 6f 6c 64 6e 70 2d  onfighash(oldnp-
1c1d0 3e 64 61 74 61 29 20 26 20 28 73 69 7a 65 2d 31  >data) & (size-1
1c1e0 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
1c1f0 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
1c200 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
1c210 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
1c220 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
1c230 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
1c240 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
1c250 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
1c260 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61       newnp->data
1c270 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a   = oldnp->data;.
1c280 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f        newnp->fro
1c290 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68  m = &(array.ht[h
1c2a0 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e  ]);.      array.
1c2b0 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20  ht[h] = newnp;. 
1c2c0 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 34     }.    free(x4
1c2d0 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 34  a->tbl);.    *x4
1c2e0 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20  a = array;.  }. 
1c2f0 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
1c300 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d  ew data */.  h =
1c310 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65   ph & (x4a->size
1c320 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 34  -1);.  np = &(x4
1c330 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e  a->tbl[x4a->coun
1c340 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74  t++]);.  np->dat
1c350 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
1c360 78 34 61 2d 3e 68 74 5b 68 5d 20 29 20 78 34 61  x4a->ht[h] ) x4a
1c370 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
1c380 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
1c390 70 2d 3e 6e 65 78 74 20 3d 20 78 34 61 2d 3e 68  p->next = x4a->h
1c3a0 74 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e 68 74 5b  t[h];.  x4a->ht[
1c3b0 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
1c3c0 72 6f 6d 20 3d 20 26 28 78 34 61 2d 3e 68 74 5b  rom = &(x4a->ht[
1c3d0 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
1c3e0 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
1c3f0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
1c400 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
1c410 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
1c420 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
1c430 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74   such key. */.st
1c440 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
1c450 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 6b 65  figtable_find(ke
1c460 79 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  y).struct config
1c470 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68   *key;.{.  int h
1c480 3b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a  ;.  x4node *np;.
1c490 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20  .  if( x4a==0 ) 
1c4a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20  return 0;.  h = 
1c4b0 63 6f 6e 66 69 67 68 61 73 68 28 6b 65 79 29 20  confighash(key) 
1c4c0 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x4a->size-1);
1c4d0 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b  .  np = x4a->ht[
1c4e0 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
1c4f0 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69  ){.    if( Confi
1c500 67 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65  gcmp(np->data,ke
1c510 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  y)==0 ) break;. 
1c520 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
1c530 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
1c540 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30  p ? np->data : 0
1c550 3b 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20 61  ;.}../* Remove a
1c560 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ll data from the
1c570 20 74 61 62 6c 65 2e 20 20 50 61 73 73 20 65 61   table.  Pass ea
1c580 63 68 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  ch data to the f
1c590 75 6e 63 74 69 6f 6e 20 22 66 22 0a 2a 2a 20 61  unction "f".** a
1c5a0 73 20 69 74 20 69 73 20 72 65 6d 6f 76 65 64 2e  s it is removed.
1c5b0 20 20 28 22 66 22 20 6d 61 79 20 62 65 20 6e 75    ("f" may be nu
1c5c0 6c 6c 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73  ll to avoid this
1c5d0 20 73 74 65 70 2e 29 20 2a 2f 0a 76 6f 69 64 20   step.) */.void 
1c5e0 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61  Configtable_clea
1c5f0 72 28 66 29 0a 69 6e 74 28 2a 66 29 28 2f 2a 20  r(f).int(*f)(/* 
1c600 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
1c610 2a 2f 29 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  */);.{.  int i;.
1c620 20 20 69 66 28 20 78 34 61 3d 3d 30 20 7c 7c 20    if( x4a==0 || 
1c630 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29 20  x4a->count==0 ) 
1c640 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 66 20  return;.  if( f 
1c650 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61  ) for(i=0; i<x4a
1c660 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 28 2a  ->count; i++) (*
1c670 66 29 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64  f)(x4a->tbl[i].d
1c680 61 74 61 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ata);.  for(i=0;
1c690 20 69 3c 78 34 61 2d 3e 73 69 7a 65 3b 20 69 2b   i<x4a->size; i+
1c6a0 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x4a->ht[i] = 
1c6b0 30 3b 0a 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20  0;.  x4a->count 
1c6c0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  = 0;.  return;.}
1c6d0 0a                                               .