/ Hex Artifact Content
Login

Artifact 022adc2830c2705828f744d2c59798bd462eb465:


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 42  .typedef enum {B
0e80: 5f 46 41 4c 53 45 3d 30 2c 20 42 5f 54 52 55 45  _FALSE=0, B_TRUE
0e90: 7d 20 42 6f 6f 6c 65 61 6e 3b 0a 0a 2f 2a 20 53  } Boolean;../* S
0ea0: 79 6d 62 6f 6c 73 20 28 74 65 72 6d 69 6e 61 6c  ymbols (terminal
0eb0: 73 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61  s and nontermina
0ec0: 6c 73 29 20 6f 66 20 74 68 65 20 67 72 61 6d 6d  ls) of the gramm
0ed0: 61 72 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a  ar are stored.**
0ee0: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
0ef0: 67 3a 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d  g: */.struct sym
0f00: 62 6f 6c 20 7b 0a 20 20 63 68 61 72 20 2a 6e 61  bol {.  char *na
0f10: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
0f20: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
0f30: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 6e 74 20  symbol */.  int 
0f40: 69 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  index;          
0f50: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75       /* Index nu
0f60: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 73 79  mber for this sy
0f70: 6d 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 7b  mbol */.  enum {
0f80: 0a 20 20 20 20 54 45 52 4d 49 4e 41 4c 2c 0a 20  .    TERMINAL,. 
0f90: 20 20 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c 0a 20     NONTERMINAL. 
0fa0: 20 7d 20 74 79 70 65 3b 20 20 20 20 20 20 20 20   } type;        
0fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d            /* Sym
0fc0: 62 6f 6c 73 20 61 72 65 20 61 6c 6c 20 65 69 74  bols are all eit
0fd0: 68 65 72 20 54 45 52 4d 49 4e 41 4c 53 20 6f 72  her TERMINALS or
0fe0: 20 4e 54 73 20 2a 2f 0a 20 20 73 74 72 75 63 74   NTs */.  struct
0ff0: 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20 20 20   rule *rule;    
1000: 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73     /* Linked lis
1010: 74 20 6f 66 20 72 75 6c 65 73 20 6f 66 20 74 68  t of rules of th
1020: 69 73 20 28 69 66 20 61 6e 20 4e 54 29 20 2a 2f  is (if an NT) */
1030: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
1040: 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 2f 2a 20 66   *fallback; /* f
1050: 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20 69 6e  allback token in
1060: 20 63 61 73 65 20 74 68 69 73 20 74 6f 6b 65 6e   case this token
1070: 20 64 6f 65 73 6e 27 74 20 70 61 72 73 65 20 2a   doesn't parse *
1080: 2f 0a 20 20 69 6e 74 20 70 72 65 63 3b 20 20 20  /.  int prec;   
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a0: 50 72 65 63 65 64 65 6e 63 65 20 69 66 20 64 65  Precedence if de
10b0: 66 69 6e 65 64 20 28 2d 31 20 6f 74 68 65 72 77  fined (-1 otherw
10c0: 69 73 65 29 20 2a 2f 0a 20 20 65 6e 75 6d 20 65  ise) */.  enum e
10d0: 5f 61 73 73 6f 63 20 7b 0a 20 20 20 20 4c 45 46  _assoc {.    LEF
10e0: 54 2c 0a 20 20 20 20 52 49 47 48 54 2c 0a 20 20  T,.    RIGHT,.  
10f0: 20 20 4e 4f 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a    NONE,.    UNK.
1100: 20 20 7d 20 61 73 73 6f 63 3b 20 20 20 20 20 20    } assoc;      
1110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
1120: 73 6f 63 69 61 74 69 76 69 74 79 20 69 66 20 70  sociativity if p
1130: 72 65 64 65 63 65 6e 63 65 20 69 73 20 64 65 66  redecence is def
1140: 69 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ined */.  char *
1150: 66 69 72 73 74 73 65 74 3b 20 20 20 20 20 20 20  firstset;       
1160: 20 20 20 2f 2a 20 46 69 72 73 74 2d 73 65 74 20     /* First-set 
1170: 66 6f 72 20 61 6c 6c 20 72 75 6c 65 73 20 6f 66  for all rules of
1180: 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a   this symbol */.
1190: 20 20 42 6f 6f 6c 65 61 6e 20 6c 61 6d 62 64 61    Boolean lambda
11a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
11b0: 75 65 20 69 66 20 4e 54 20 61 6e 64 20 63 61 6e  ue if NT and can
11c0: 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 6d 70   generate an emp
11d0: 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63  ty string */.  c
11e0: 68 61 72 20 2a 64 65 73 74 72 75 63 74 6f 72 3b  har *destructor;
11f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
1200: 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
1210: 68 65 6e 65 76 65 72 20 74 68 69 73 20 73 79 6d  henever this sym
1220: 62 6f 6c 20 69 73 0a 20 20 20 20 20 20 20 20 20  bol is.         
1230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1240: 20 20 2a 2a 20 70 6f 70 70 65 64 20 66 72 6f 6d    ** popped from
1250: 20 74 68 65 20 73 74 61 63 6b 20 64 75 72 69 6e   the stack durin
1260: 67 20 65 72 72 6f 72 20 70 72 6f 63 65 73 73 69  g error processi
1270: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  ng */.  int dest
1280: 72 75 63 74 6f 72 6c 6e 3b 20 20 20 20 20 20 20  ructorln;       
1290: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
12a0: 6f 66 20 64 65 73 74 72 75 63 74 6f 72 20 63 6f  of destructor co
12b0: 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 61  de */.  char *da
12c0: 74 61 74 79 70 65 3b 20 20 20 20 20 20 20 20 20  tatype;         
12d0: 20 2f 2a 20 54 68 65 20 64 61 74 61 20 74 79 70   /* The data typ
12e0: 65 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  e of information
12f0: 20 68 65 6c 64 20 62 79 20 74 68 69 73 0a 20 20   held by this.  
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1310: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65           ** obje
1320: 63 74 2e 20 4f 6e 6c 79 20 75 73 65 64 20 69 66  ct. Only used if
1330: 20 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e   type==NONTERMIN
1340: 41 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 74 6e 75  AL */.  int dtnu
1350: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1360: 20 2f 2a 20 54 68 65 20 64 61 74 61 20 74 79 70   /* The data typ
1370: 65 20 6e 75 6d 62 65 72 2e 20 20 49 6e 20 74 68  e number.  In th
1380: 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 76 61  e parser, the va
1390: 6c 75 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  lue.            
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
13b0: 2a 20 73 74 61 63 6b 20 69 73 20 61 20 75 6e 69  * stack is a uni
13c0: 6f 6e 2e 20 20 54 68 65 20 2e 79 79 25 64 20 65  on.  The .yy%d e
13d0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 69 73 0a 20  lement of this. 
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 6e 69            ** uni
1400: 6f 6e 20 69 73 20 74 68 65 20 63 6f 72 72 65 63  on is the correc
1410: 74 20 64 61 74 61 20 74 79 70 65 20 66 6f 72 20  t data type for 
1420: 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 7d  this object */.}
1430: 3b 0a 0a 2f 2a 20 45 61 63 68 20 70 72 6f 64 75  ;../* Each produ
1440: 63 74 69 6f 6e 20 72 75 6c 65 20 69 6e 20 74 68  ction rule in th
1450: 65 20 67 72 61 6d 6d 61 72 20 69 73 20 73 74 6f  e grammar is sto
1460: 72 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  red in the follo
1470: 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  wing.** structur
1480: 65 2e 20 20 2a 2f 0a 73 74 72 75 63 74 20 72 75  e.  */.struct ru
1490: 6c 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79  le {.  struct sy
14a0: 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20  mbol *lhs;      
14b0: 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64  /* Left-hand sid
14c0: 65 20 6f 66 20 74 68 65 20 72 75 6c 65 20 2a 2f  e of the rule */
14d0: 0a 20 20 63 68 61 72 20 2a 6c 68 73 61 6c 69 61  .  char *lhsalia
14e0: 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  s;          /* A
14f0: 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53  lias for the LHS
1500: 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20   (NULL if none) 
1510: 2a 2f 0a 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e  */.  int rulelin
1520: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1530: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72   Line number for
1540: 20 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69   the rule */.  i
1550: 6e 74 20 6e 72 68 73 3b 20 20 20 20 20 20 20 20  nt nrhs;        
1560: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1570: 72 20 6f 66 20 52 48 53 20 73 79 6d 62 6f 6c 73  r of RHS symbols
1580: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
1590: 62 6f 6c 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f  bol **rhs;     /
15a0: 2a 20 54 68 65 20 52 48 53 20 73 79 6d 62 6f 6c  * The RHS symbol
15b0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 72 68  s */.  char **rh
15c0: 73 61 6c 69 61 73 3b 20 20 20 20 20 20 20 20 20  salias;         
15d0: 2f 2a 20 41 6e 20 61 6c 69 61 73 20 66 6f 72 20  /* An alias for 
15e0: 65 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20  each RHS symbol 
15f0: 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a  (NULL if none) *
1600: 2f 0a 20 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20  /.  int line;   
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1620: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 61 74 20 77  Line number at w
1630: 68 69 63 68 20 63 6f 64 65 20 62 65 67 69 6e 73  hich code begins
1640: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 64 65   */.  char *code
1650: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1660: 2a 20 54 68 65 20 63 6f 64 65 20 65 78 65 63 75  * The code execu
1670: 74 65 64 20 77 68 65 6e 20 74 68 69 73 20 72 75  ted when this ru
1680: 6c 65 20 69 73 20 72 65 64 75 63 65 64 20 2a 2f  le is reduced */
1690: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
16a0: 20 2a 70 72 65 63 73 79 6d 3b 20 20 2f 2a 20 50   *precsym;  /* P
16b0: 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c  recedence symbol
16c0: 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65 20 2a   for this rule *
16d0: 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20 20  /.  int index;  
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16f0: 41 6e 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  An index number 
1700: 66 6f 72 20 74 68 69 73 20 72 75 6c 65 20 2a 2f  for this rule */
1710: 0a 20 20 42 6f 6f 6c 65 61 6e 20 63 61 6e 52 65  .  Boolean canRe
1720: 64 75 63 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  duce;       /* T
1730: 72 75 65 20 69 66 20 74 68 69 73 20 72 75 6c 65  rue if this rule
1740: 20 69 73 20 65 76 65 72 20 72 65 64 75 63 65 64   is ever reduced
1750: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
1760: 65 20 2a 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f  e *nextlhs;    /
1770: 2a 20 4e 65 78 74 20 72 75 6c 65 20 77 69 74 68  * Next rule with
1780: 20 74 68 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f   the same LHS */
1790: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
17a0: 6e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e  next;       /* N
17b0: 65 78 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20  ext rule in the 
17c0: 67 6c 6f 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d  global list */.}
17d0: 3b 0a 0a 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72  ;../* A configur
17e0: 61 74 69 6f 6e 20 69 73 20 61 20 70 72 6f 64 75  ation is a produ
17f0: 63 74 69 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68  ction rule of th
1800: 65 20 67 72 61 6d 6d 61 72 20 74 6f 67 65 74 68  e grammar togeth
1810: 65 72 20 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72  er with.** a mar
1820: 6b 20 28 64 6f 74 29 20 73 68 6f 77 69 6e 67 20  k (dot) showing 
1830: 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 61 74  how much of that
1840: 20 72 75 6c 65 20 68 61 73 20 62 65 65 6e 20 70   rule has been p
1850: 72 6f 63 65 73 73 65 64 20 73 6f 20 66 61 72 2e  rocessed so far.
1860: 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
1870: 6e 73 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  ns also contain 
1880: 61 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69  a follow-set whi
1890: 63 68 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ch is a list of 
18a0: 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62  terminal.** symb
18b0: 6f 6c 73 20 77 68 69 63 68 20 61 72 65 20 61 6c  ols which are al
18c0: 6c 6f 77 65 64 20 74 6f 20 69 6d 6d 65 64 69 61  lowed to immedia
18d0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20  tely follow the 
18e0: 65 6e 64 20 6f 66 20 74 68 65 20 72 75 6c 65 2e  end of the rule.
18f0: 0a 2a 2a 20 45 76 65 72 79 20 63 6f 6e 66 69 67  .** Every config
1900: 75 72 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72  uration is recor
1910: 64 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e  ded as an instan
1920: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1930: 69 6e 67 3a 20 2a 2f 0a 73 74 72 75 63 74 20 63  ing: */.struct c
1940: 6f 6e 66 69 67 20 7b 0a 20 20 73 74 72 75 63 74  onfig {.  struct
1950: 20 72 75 6c 65 20 2a 72 70 3b 20 20 20 20 20 20   rule *rp;      
1960: 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 20 75     /* The rule u
1970: 70 6f 6e 20 77 68 69 63 68 20 74 68 65 20 63 6f  pon which the co
1980: 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 73 20 62  nfiguration is b
1990: 61 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 6f  ased */.  int do
19a0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
19b0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20     /* The parse 
19c0: 70 6f 69 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20  point */.  char 
19d0: 2a 66 77 73 3b 20 20 20 20 20 20 20 20 20 20 20  *fws;           
19e0: 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65      /* Follow-se
19f0: 74 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 66 69  t for this confi
1a00: 67 75 72 61 74 69 6f 6e 20 6f 6e 6c 79 20 2a 2f  guration only */
1a10: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
1a20: 2a 66 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46  *fplp;      /* F
1a30: 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 77 61 72  ollow-set forwar
1a40: 64 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69  d propagation li
1a50: 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nks */.  struct 
1a60: 70 6c 69 6e 6b 20 2a 62 70 6c 70 3b 20 20 20 20  plink *bplp;    
1a70: 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20    /* Follow-set 
1a80: 62 61 63 6b 77 61 72 64 73 20 70 72 6f 70 61 67  backwards propag
1a90: 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20  ation links */. 
1aa0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
1ab0: 74 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  tp;       /* Poi
1ac0: 6e 74 65 72 20 74 6f 20 73 74 61 74 65 20 77 68  nter to state wh
1ad0: 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 69  ich contains thi
1ae0: 73 20 2a 2f 0a 20 20 65 6e 75 6d 20 7b 0a 20 20  s */.  enum {.  
1af0: 20 20 43 4f 4d 50 4c 45 54 45 2c 20 20 20 20 20    COMPLETE,     
1b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b10: 73 74 61 74 75 73 20 69 73 20 75 73 65 64 20 64  status is used d
1b20: 75 72 69 6e 67 20 66 6f 6c 6c 6f 77 73 65 74 20  uring followset 
1b30: 61 6e 64 20 2a 2f 0a 20 20 20 20 49 4e 43 4f 4d  and */.    INCOM
1b40: 50 4c 45 54 45 20 20 20 20 20 20 20 20 20 20 20  PLETE           
1b50: 20 20 2f 2a 20 20 20 20 73 68 69 66 74 20 63 6f    /*    shift co
1b60: 6d 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  mputations */.  
1b70: 7d 20 73 74 61 74 75 73 3b 0a 20 20 73 74 72 75  } status;.  stru
1b80: 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 78 74 3b  ct config *next;
1b90: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 6f 6e       /* Next con
1ba0: 66 69 67 75 72 61 74 69 6f 6e 20 69 6e 20 74 68  figuration in th
1bb0: 65 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72  e state */.  str
1bc0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 70 3b 20  uct config *bp; 
1bd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
1be0: 74 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  t basis configur
1bf0: 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  ation */.};../* 
1c00: 45 76 65 72 79 20 73 68 69 66 74 20 6f 72 20 72  Every shift or r
1c10: 65 64 75 63 65 20 6f 70 65 72 61 74 69 6f 6e 20  educe operation 
1c20: 69 73 20 73 74 6f 72 65 64 20 61 73 20 6f 6e 65  is stored as one
1c30: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1c40: 67 20 2a 2f 0a 73 74 72 75 63 74 20 61 63 74 69  g */.struct acti
1c50: 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79  on {.  struct sy
1c60: 6d 62 6f 6c 20 2a 73 70 3b 20 20 20 20 20 20 20  mbol *sp;       
1c70: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 2d 61 68 65 61  /* The look-ahea
1c80: 64 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 65 6e  d symbol */.  en
1c90: 75 6d 20 65 5f 61 63 74 69 6f 6e 20 7b 0a 20 20  um e_action {.  
1ca0: 20 20 53 48 49 46 54 2c 0a 20 20 20 20 41 43 43    SHIFT,.    ACC
1cb0: 45 50 54 2c 0a 20 20 20 20 52 45 44 55 43 45 2c  EPT,.    REDUCE,
1cc0: 0a 20 20 20 20 45 52 52 4f 52 2c 0a 20 20 20 20  .    ERROR,.    
1cd0: 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20 20 20  CONFLICT,       
1ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20           /* Was 
1cf0: 61 20 72 65 64 75 63 65 2c 20 62 75 74 20 70 61  a reduce, but pa
1d00: 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c 69 63 74  rt of a conflict
1d10: 20 2a 2f 0a 20 20 20 20 53 48 5f 52 45 53 4f 4c   */.    SH_RESOL
1d20: 56 45 44 2c 20 20 20 20 20 20 20 20 20 20 20 20  VED,            
1d30: 20 2f 2a 20 57 61 73 20 61 20 73 68 69 66 74 2e   /* Was a shift.
1d40: 20 20 50 72 65 63 65 64 65 6e 63 65 20 72 65 73    Precedence res
1d50: 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a  olved conflict *
1d60: 2f 0a 20 20 20 20 52 44 5f 52 45 53 4f 4c 56 45  /.    RD_RESOLVE
1d70: 44 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  D,             /
1d80: 2a 20 57 61 73 20 72 65 64 75 63 65 2e 20 20 50  * Was reduce.  P
1d90: 72 65 63 65 64 65 6e 63 65 20 72 65 73 6f 6c 76  recedence resolv
1da0: 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ed conflict */. 
1db0: 20 20 20 4e 4f 54 5f 55 53 45 44 20 20 20 20 20     NOT_USED     
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1dd0: 65 6c 65 74 65 64 20 62 79 20 63 6f 6d 70 72 65  eleted by compre
1de0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 7d 20 74 79 70  ssion */.  } typ
1df0: 65 3b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  e;.  union {.   
1e00: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
1e10: 74 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  tp;     /* The n
1e20: 65 77 20 73 74 61 74 65 2c 20 69 66 20 61 20 73  ew state, if a s
1e30: 68 69 66 74 20 2a 2f 0a 20 20 20 20 73 74 72 75  hift */.    stru
1e40: 63 74 20 72 75 6c 65 20 2a 72 70 3b 20 20 20 20  ct rule *rp;    
1e50: 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 2c 20     /* The rule, 
1e60: 69 66 20 61 20 72 65 64 75 63 65 20 2a 2f 0a 20  if a reduce */. 
1e70: 20 7d 20 78 3b 0a 20 20 73 74 72 75 63 74 20 61   } x;.  struct a
1e80: 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20 20 20 20  ction *next;    
1e90: 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20   /* Next action 
1ea0: 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20 2a  for this state *
1eb0: 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  /.  struct actio
1ec0: 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 2f 2a 20  n *collide;  /* 
1ed0: 4e 65 78 74 20 61 63 74 69 6f 6e 20 77 69 74 68  Next action with
1ee0: 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
1ef0: 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 73 74  /.};../* Each st
1f00: 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ate of the gener
1f10: 61 74 65 64 20 70 61 72 73 65 72 27 73 20 66 69  ated parser's fi
1f20: 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69  nite state machi
1f30: 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f 64 65 64  ne.** is encoded
1f40: 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   as an instance 
1f50: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1f60: 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 73   structure. */.s
1f70: 74 72 75 63 74 20 73 74 61 74 65 20 7b 0a 20 20  truct state {.  
1f80: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
1f90: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
1fa0: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
1fb0: 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74  ions for this st
1fc0: 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
1fd0: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 20 20  config *cfp;    
1fe0: 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66 69 67 75    /* All configu
1ff0: 72 61 74 69 6f 6e 73 20 69 6e 20 74 68 69 73 20  rations in this 
2000: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 64  set */.  int ind
2010: 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
2020: 20 20 2f 2a 20 53 65 71 75 65 6e 63 69 61 6c 20    /* Sequencial 
2030: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
2040: 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  state */.  struc
2050: 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 20 20 20  t action *ap;   
2060: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2070: 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73  actions for this
2080: 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20   state */.  int 
2090: 6e 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  naction;        
20a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20b0: 66 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68  f actions for th
20c0: 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e  is state */.  in
20d0: 74 20 74 61 62 73 74 61 72 74 3b 20 20 20 20 20  t tabstart;     
20e0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
20f0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 61 63 74  index of the act
2100: 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ion table */.  i
2110: 6e 74 20 74 61 62 64 66 6c 74 61 63 74 3b 20 20  nt tabdfltact;  
2120: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75          /* Defau
2130: 6c 74 20 61 63 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a  lt action */.};.
2140: 0a 2f 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20  ./* A followset 
2150: 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
2160: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
2170: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2180: 6f 6e 65 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61  one.** configura
2190: 74 69 6f 6e 20 66 6f 6c 6c 6f 77 73 65 74 20 73  tion followset s
21a0: 68 6f 75 6c 64 20 62 65 20 70 72 6f 70 61 67 61  hould be propaga
21b0: 74 65 64 20 74 6f 20 61 6e 6f 74 68 65 72 20 77  ted to another w
21c0: 68 65 6e 65 76 65 72 0a 2a 2a 20 74 68 65 20 66  henever.** the f
21d0: 69 72 73 74 20 63 68 61 6e 67 65 73 2e 20 2a 2f  irst changes. */
21e0: 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 7b 0a  .struct plink {.
21f0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
2200: 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  *cfp;      /* Th
2210: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
2220: 74 6f 20 77 68 69 63 68 20 6c 69 6e 6b 65 64 20  to which linked 
2230: 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  */.  struct plin
2240: 6b 20 2a 6e 65 78 74 3b 20 20 20 20 20 20 2f 2a  k *next;      /*
2250: 20 54 68 65 20 6e 65 78 74 20 70 72 6f 70 61 67   The next propag
2260: 61 74 65 20 6c 69 6e 6b 20 2a 2f 0a 7d 3b 0a 0a  ate link */.};..
2270: 2f 2a 20 54 68 65 20 73 74 61 74 65 20 76 65 63  /* The state vec
2280: 74 6f 72 20 66 6f 72 20 74 68 65 20 65 6e 74 69  tor for the enti
2290: 72 65 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  re parser genera
22a0: 74 6f 72 20 69 73 20 72 65 63 6f 72 64 65 64 20  tor is recorded 
22b0: 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 2e 20 20  as.** follows.  
22c0: 28 4c 45 4d 4f 4e 20 75 73 65 73 20 6e 6f 20 67  (LEMON uses no g
22d0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
22e0: 61 6e 64 20 6d 61 6b 65 73 20 6c 69 74 74 6c 65  and makes little
22f0: 20 75 73 65 20 6f 66 0a 2a 2a 20 73 74 61 74 69   use of.** stati
2300: 63 20 76 61 72 69 61 62 6c 65 73 2e 20 20 46 69  c variables.  Fi
2310: 65 6c 64 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  elds in the foll
2320: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2330: 63 61 6e 20 62 65 20 74 68 6f 75 67 68 74 0a 2a  can be thought.*
2340: 2a 20 6f 66 20 61 73 20 62 65 67 69 6e 20 67 6c  * of as begin gl
2350: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 69  obal variables i
2360: 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 29 20  n the program.) 
2370: 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  */.struct lemon 
2380: 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
2390: 20 2a 2a 73 6f 72 74 65 64 3b 20 20 20 2f 2a 20   **sorted;   /* 
23a0: 54 61 62 6c 65 20 6f 66 20 73 74 61 74 65 73 20  Table of states 
23b0: 73 6f 72 74 65 64 20 62 79 20 73 74 61 74 65 20  sorted by state 
23c0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72 75  number */.  stru
23d0: 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20  ct rule *rule;  
23e0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
23f0: 61 6c 6c 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69  all rules */.  i
2400: 6e 74 20 6e 73 74 61 74 65 3b 20 20 20 20 20 20  nt nstate;      
2410: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2420: 72 20 6f 66 20 73 74 61 74 65 73 20 2a 2f 0a 20  r of states */. 
2430: 20 69 6e 74 20 6e 72 75 6c 65 3b 20 20 20 20 20   int nrule;     
2440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2450: 62 65 72 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a  ber of rules */.
2460: 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20    int nsymbol;  
2470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2480: 6d 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c  mber of terminal
2490: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
24a0: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e   symbols */.  in
24b0: 74 20 6e 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20  t nterminal;    
24c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
24d0: 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d   of terminal sym
24e0: 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  bols */.  struct
24f0: 20 73 79 6d 62 6f 6c 20 2a 2a 73 79 6d 62 6f 6c   symbol **symbol
2500: 73 3b 20 2f 2a 20 53 6f 72 74 65 64 20 61 72 72  s; /* Sorted arr
2510: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  ay of pointers t
2520: 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69  o symbols */.  i
2530: 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20  nt errorcnt;    
2540: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2550: 72 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20  r of errors */. 
2560: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
2570: 65 72 72 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65  errsym;   /* The
2580: 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c 20 2a 2f   error symbol */
2590: 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20  .  char *name;  
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25b0: 61 6d 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ame of the gener
25c0: 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a 20  ated parser */. 
25d0: 20 63 68 61 72 20 2a 61 72 67 3b 20 20 20 20 20   char *arg;     
25e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63            /* Dec
25f0: 6c 61 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  laration of the 
2600: 33 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  3th argument to 
2610: 70 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61 72  parser */.  char
2620: 20 2a 74 6f 6b 65 6e 74 79 70 65 3b 20 20 20 20   *tokentype;    
2630: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
2640: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
2650: 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 73   in the parser s
2660: 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tack */.  char *
2670: 76 61 72 74 79 70 65 3b 20 20 20 20 20 20 20 20  vartype;        
2680: 20 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c     /* The defaul
2690: 74 20 74 79 70 65 20 6f 66 20 6e 6f 6e 2d 74 65  t type of non-te
26a0: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a  rminal symbols *
26b0: 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 72 74 3b  /.  char *start;
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26d0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 74 61 72  Name of the star
26e0: 74 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 65  t symbol for the
26f0: 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 63 68   grammar */.  ch
2700: 61 72 20 2a 73 74 61 63 6b 73 69 7a 65 3b 20 20  ar *stacksize;  
2710: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2720: 66 20 74 68 65 20 70 61 72 73 65 72 20 73 74 61  f the parser sta
2730: 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 69 6e  ck */.  char *in
2740: 63 6c 75 64 65 3b 20 20 20 20 20 20 20 20 20 20  clude;          
2750: 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70 75 74 20   /* Code to put 
2760: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2770: 74 68 65 20 43 20 66 69 6c 65 20 2a 2f 0a 20 20  the C file */.  
2780: 69 6e 74 20 20 69 6e 63 6c 75 64 65 6c 6e 3b 20  int  includeln; 
2790: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
27a0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72   number for star
27b0: 74 20 6f 66 20 69 6e 63 6c 75 64 65 20 63 6f 64  t of include cod
27c0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 72 72  e */.  char *err
27d0: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
27e0: 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75  /* Code to execu
27f0: 74 65 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72  te when an error
2800: 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e   is seen */.  in
2810: 74 20 20 65 72 72 6f 72 6c 6e 3b 20 20 20 20 20  t  errorln;     
2820: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
2830: 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72 74 20  umber for start 
2840: 6f 66 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  of error code */
2850: 0a 20 20 63 68 61 72 20 2a 6f 76 65 72 66 6c 6f  .  char *overflo
2860: 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  w;          /* C
2870: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f  ode to execute o
2880: 6e 20 61 20 73 74 61 63 6b 20 6f 76 65 72 66 6c  n a stack overfl
2890: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 20 6f 76 65  ow */.  int  ove
28a0: 72 66 6c 6f 77 6c 6e 3b 20 20 20 20 20 20 20 20  rflowln;        
28b0: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
28c0: 66 6f 72 20 73 74 61 72 74 20 6f 66 20 6f 76 65  for start of ove
28d0: 72 66 6c 6f 77 20 63 6f 64 65 20 2a 2f 0a 20 20  rflow code */.  
28e0: 63 68 61 72 20 2a 66 61 69 6c 75 72 65 3b 20 20  char *failure;  
28f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
2900: 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e 20 70   to execute on p
2910: 61 72 73 65 72 20 66 61 69 6c 75 72 65 20 2a 2f  arser failure */
2920: 0a 20 20 69 6e 74 20 20 66 61 69 6c 75 72 65 6c  .  int  failurel
2930: 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  n;          /* L
2940: 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73  ine number for s
2950: 74 61 72 74 20 6f 66 20 66 61 69 6c 75 72 65 20  tart of failure 
2960: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
2970: 61 63 63 65 70 74 3b 20 20 20 20 20 20 20 20 20  accept;         
2980: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
2990: 65 63 75 74 65 20 77 68 65 6e 20 74 68 65 20 70  ecute when the p
29a0: 61 72 73 65 72 20 65 78 63 65 70 74 73 20 2a 2f  arser excepts */
29b0: 0a 20 20 69 6e 74 20 20 61 63 63 65 70 74 6c 6e  .  int  acceptln
29c0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
29d0: 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ine number for t
29e0: 68 65 20 73 74 61 72 74 20 6f 66 20 61 63 63 65  he start of acce
29f0: 70 74 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  pt code */.  cha
2a00: 72 20 2a 65 78 74 72 61 63 6f 64 65 3b 20 20 20  r *extracode;   
2a10: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 70        /* Code ap
2a20: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 67 65  pended to the ge
2a30: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 2a 2f 0a  nerated file */.
2a40: 20 20 69 6e 74 20 20 65 78 74 72 61 63 6f 64 65    int  extracode
2a50: 6c 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  ln;        /* Li
2a60: 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ne number for th
2a70: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 65  e start of the e
2a80: 78 74 72 61 20 63 6f 64 65 20 2a 2f 0a 20 20 63  xtra code */.  c
2a90: 68 61 72 20 2a 74 6f 6b 65 6e 64 65 73 74 3b 20  har *tokendest; 
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2ab0: 74 6f 20 65 78 65 63 75 74 65 20 74 6f 20 64 65  to execute to de
2ac0: 73 74 72 6f 79 20 74 6f 6b 65 6e 20 64 61 74 61  stroy token data
2ad0: 20 2a 2f 0a 20 20 69 6e 74 20 20 74 6f 6b 65 6e   */.  int  token
2ae0: 64 65 73 74 6c 6e 3b 20 20 20 20 20 20 20 20 2f  destln;        /
2af0: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f  * Line number fo
2b00: 72 20 74 6f 6b 65 6e 20 64 65 73 74 72 6f 79 65  r token destroye
2b10: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72  r code */.  char
2b20: 20 2a 76 61 72 64 65 73 74 3b 20 20 20 20 20 20   *vardest;      
2b30: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 66 6f 72       /* Code for
2b40: 20 74 68 65 20 64 65 66 61 75 6c 74 20 6e 6f 6e   the default non
2b50: 2d 74 65 72 6d 69 6e 61 6c 20 64 65 73 74 72 75  -terminal destru
2b60: 63 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 20 76  ctor */.  int  v
2b70: 61 72 64 65 73 74 6c 6e 3b 20 20 20 20 20 20 20  ardestln;       
2b80: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
2b90: 72 20 66 6f 72 20 64 65 66 61 75 6c 74 20 6e 6f  r for default no
2ba0: 6e 2d 74 65 72 6d 20 64 65 73 74 72 75 63 74 6f  n-term destructo
2bb0: 72 20 63 6f 64 65 2a 2f 0a 20 20 63 68 61 72 20  r code*/.  char 
2bc0: 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  *filename;      
2bd0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2be0: 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
2bf0: 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e 61 6d 65  .  char *outname
2c00: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
2c10: 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65  ame of the curre
2c20: 6e 74 20 6f 75 74 70 75 74 20 66 69 6c 65 20 2a  nt output file *
2c30: 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 70  /.  char *tokenp
2c40: 72 65 66 69 78 3b 20 20 20 20 20 20 20 2f 2a 20  refix;       /* 
2c50: 41 20 70 72 65 66 69 78 20 61 64 64 65 64 20 74  A prefix added t
2c60: 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73 20 69 6e  o token names in
2c70: 20 74 68 65 20 2e 68 20 66 69 6c 65 20 2a 2f 0a   the .h file */.
2c80: 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69 63 74 3b    int nconflict;
2c90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2ca0: 6d 62 65 72 20 6f 66 20 70 61 72 73 69 6e 67 20  mber of parsing 
2cb0: 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20 69  conflicts */.  i
2cc0: 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b 20 20 20  nt tablesize;   
2cd0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2ce0: 6f 66 20 74 68 65 20 70 61 72 73 65 20 74 61 62  of the parse tab
2cf0: 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73  les */.  int bas
2d00: 69 73 66 6c 61 67 3b 20 20 20 20 20 20 20 20 20  isflag;         
2d10: 20 20 2f 2a 20 50 72 69 6e 74 20 6f 6e 6c 79 20    /* Print only 
2d20: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
2d30: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 68 61  ions */.  int ha
2d40: 73 5f 66 61 6c 6c 62 61 63 6b 3b 20 20 20 20 20  s_fallback;     
2d50: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
2d60: 79 20 25 66 61 6c 6c 62 61 63 6b 20 69 73 20 73  y %fallback is s
2d70: 65 65 6e 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  een in the gramm
2d80: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72  er */.  char *ar
2d90: 67 76 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  gv0;            
2da0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2db0: 70 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23  program */.};..#
2dc0: 64 65 66 69 6e 65 20 4d 65 6d 6f 72 79 43 68 65  define MemoryChe
2dd0: 63 6b 28 58 29 20 69 66 28 28 58 29 3d 3d 30 29  ck(X) if((X)==0)
2de0: 7b 20 5c 0a 20 20 65 78 74 65 72 6e 20 76 6f 69  { \.  extern voi
2df0: 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29  d memory_error()
2e00: 3b 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f 65 72 72  ; \.  memory_err
2e10: 6f 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a  or(); \.}../****
2e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
2e30: 6d 20 74 68 65 20 66 69 6c 65 20 22 74 61 62 6c  m the file "tabl
2e40: 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.h" ***********
2e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e60: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c  ******/./*.** Al
2e70: 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66  l code in this f
2e80: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75 74  ile has been aut
2e90: 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72  omatically gener
2ea0: 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73  ated.** from a s
2eb0: 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20  pecification in 
2ec0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  the file.**     
2ed0: 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 2e           "table.
2ee0: 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73 73  q".** by the ass
2ef0: 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 63  ociative array c
2f00: 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72 6f  ode building pro
2f10: 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a  gram "aagen"..**
2f20: 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68 69   Do not edit thi
2f30: 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61 64  s file!  Instead
2f40: 2c 20 65 64 69 74 20 74 68 65 20 73 70 65 63 69  , edit the speci
2f50: 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65  fication.** file
2f60: 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61 67  , then rerun aag
2f70: 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64  en..*/./*.** Cod
2f80: 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  e for processing
2f90: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c   tables in the L
2fa0: 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
2fb0: 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52 6f  rator..*/../* Ro
2fc0: 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c  utines for handl
2fd0: 69 6e 67 20 61 20 73 74 72 69 6e 67 73 20 2a 2f  ing a strings */
2fe0: 0a 0a 63 68 61 72 20 2a 53 74 72 73 61 66 65 28  ..char *Strsafe(
2ff0: 29 3b 0a 0a 76 6f 69 64 20 53 74 72 73 61 66 65  );..void Strsafe
3000: 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f  _init(/* void */
3010: 29 3b 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69  );.int Strsafe_i
3020: 6e 73 65 72 74 28 2f 2a 20 63 68 61 72 20 2a 20  nsert(/* char * 
3030: 2a 2f 29 3b 0a 63 68 61 72 20 2a 53 74 72 73 61  */);.char *Strsa
3040: 66 65 5f 66 69 6e 64 28 2f 2a 20 63 68 61 72 20  fe_find(/* char 
3050: 2a 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69  * */);../* Routi
3060: 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67  nes for handling
3070: 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20   symbols of the 
3080: 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a 73 74 72 75  grammar */..stru
3090: 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f  ct symbol *Symbo
30a0: 6c 5f 6e 65 77 28 29 3b 0a 69 6e 74 20 53 79 6d  l_new();.int Sym
30b0: 62 6f 6c 63 6d 70 70 28 2f 2a 20 73 74 72 75 63  bolcmpp(/* struc
30c0: 74 20 73 79 6d 62 6f 6c 20 2a 2a 2c 20 73 74 72  t symbol **, str
30d0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 20 2a 2f  uct symbol ** */
30e0: 29 3b 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69  );.void Symbol_i
30f0: 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b  nit(/* void */);
3100: 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65  .int Symbol_inse
3110: 72 74 28 2f 2a 20 73 74 72 75 63 74 20 73 79 6d  rt(/* struct sym
3120: 62 6f 6c 20 2a 2c 20 63 68 61 72 20 2a 20 2a 2f  bol *, char * */
3130: 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  );.struct symbol
3140: 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 2f 2a   *Symbol_find(/*
3150: 20 63 68 61 72 20 2a 20 2a 2f 29 3b 0a 73 74 72   char * */);.str
3160: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
3170: 6f 6c 5f 4e 74 68 28 2f 2a 20 69 6e 74 20 2a 2f  ol_Nth(/* int */
3180: 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f  );.int Symbol_co
3190: 75 6e 74 28 2f 2a 20 20 2a 2f 29 3b 0a 73 74 72  unt(/*  */);.str
31a0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d  uct symbol **Sym
31b0: 62 6f 6c 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20  bol_arrayof(/*  
31c0: 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65  */);../* Routine
31d0: 73 20 74 6f 20 6d 61 6e 61 67 65 20 74 68 65 20  s to manage the 
31e0: 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 0a  state table */..
31f0: 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 2f 2a  int Configcmp(/*
3200: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
3210: 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
3220: 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 74  * */);.struct st
3230: 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 29  ate *State_new()
3240: 3b 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69  ;.void State_ini
3250: 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69  t(/* void */);.i
3260: 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28  nt State_insert(
3270: 2f 2a 20 73 74 72 75 63 74 20 73 74 61 74 65 20  /* struct state 
3280: 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  *, struct config
3290: 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73   * */);.struct s
32a0: 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64  tate *State_find
32b0: 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e 66 69  (/* struct confi
32c0: 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20  g * */);.struct 
32d0: 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61 72  state **State_ar
32e0: 72 61 79 6f 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a  rayof(/*  */);..
32f0: 2f 2a 20 52 6f 75 74 69 6e 65 73 20 75 73 65 64  /* Routines used
3300: 20 66 6f 72 20 65 66 66 69 63 69 65 6e 63 79 20   for efficiency 
3310: 69 6e 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  in Configlist_ad
3320: 64 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66 69  d */..void Confi
3330: 67 74 61 62 6c 65 5f 69 6e 69 74 28 2f 2a 20 76  gtable_init(/* v
3340: 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74 20 43 6f 6e  oid */);.int Con
3350: 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
3360: 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  /* struct config
3370: 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63   * */);.struct c
3380: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74 61 62  onfig *Configtab
3390: 6c 65 5f 66 69 6e 64 28 2f 2a 20 73 74 72 75 63  le_find(/* struc
33a0: 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a  t config * */);.
33b0: 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65  void Configtable
33c0: 5f 63 6c 65 61 72 28 2f 2a 20 69 6e 74 28 2a 29  _clear(/* int(*)
33d0: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
33e0: 29 20 2a 2f 29 3b 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ) */);./********
33f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
3400: 74 68 65 20 66 69 6c 65 20 22 61 63 74 69 6f 6e  the file "action
3410: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
3420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3430: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ***/./*.** Routi
3440: 6e 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20 70  nes processing p
3450: 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20 69 6e  arser actions in
3460: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
3470: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
3480: 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
3490: 65 77 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e  ew parser action
34a0: 20 2a 2f 0a 73 74 72 75 63 74 20 61 63 74 69 6f   */.struct actio
34b0: 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77 28 29 7b  n *Action_new(){
34c0: 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
34d0: 20 61 63 74 69 6f 6e 20 2a 66 72 65 65 6c 69 73   action *freelis
34e0: 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  t = 0;.  struct 
34f0: 61 63 74 69 6f 6e 20 2a 6e 65 77 3b 0a 0a 20 20  action *new;..  
3500: 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20  if( freelist==0 
3510: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
3520: 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b    int amt = 100;
3530: 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20  .    freelist = 
3540: 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  (struct action *
3550: 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
3560: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 29 2a 61  struct action)*a
3570: 6d 74 20 29 3b 0a 20 20 20 20 69 66 28 20 66 72  mt );.    if( fr
3580: 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
3590: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
35a0: 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  r,"Unable to all
35b0: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
35c0: 20 61 20 6e 65 77 20 70 61 72 73 65 72 20 61 63   a new parser ac
35d0: 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65  tion.");.      e
35e0: 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(1);.    }.  
35f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74    for(i=0; i<amt
3600: 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69 73  -1; i++) freelis
3610: 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65  t[i].next = &fre
3620: 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20  elist[i+1];.    
3630: 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e  freelist[amt-1].
3640: 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  next = 0;.  }.  
3650: 6e 65 77 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a  new = freelist;.
3660: 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65    freelist = fre
3670: 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72  elist->next;.  r
3680: 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a  eturn new;.}../*
3690: 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 61 63 74   Compare two act
36a0: 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  ions */.static i
36b0: 6e 74 20 61 63 74 69 6f 6e 63 6d 70 28 61 70 31  nt actioncmp(ap1
36c0: 2c 61 70 32 29 0a 73 74 72 75 63 74 20 61 63 74  ,ap2).struct act
36d0: 69 6f 6e 20 2a 61 70 31 3b 0a 73 74 72 75 63 74  ion *ap1;.struct
36e0: 20 61 63 74 69 6f 6e 20 2a 61 70 32 3b 0a 7b 0a   action *ap2;.{.
36f0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d    int rc;.  rc =
3700: 20 61 70 31 2d 3e 73 70 2d 3e 69 6e 64 65 78 20   ap1->sp->index 
3710: 2d 20 61 70 32 2d 3e 73 70 2d 3e 69 6e 64 65 78  - ap2->sp->index
3720: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20  ;.  if( rc==0 ) 
3730: 72 63 20 3d 20 28 69 6e 74 29 61 70 31 2d 3e 74  rc = (int)ap1->t
3740: 79 70 65 20 2d 20 28 69 6e 74 29 61 70 32 2d 3e  ype - (int)ap2->
3750: 74 79 70 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d  type;.  if( rc==
3760: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
3770: 20 61 70 31 2d 3e 74 79 70 65 3d 3d 52 45 44 55   ap1->type==REDU
3780: 43 45 20 7c 7c 20 61 70 31 2d 3e 74 79 70 65 3d  CE || ap1->type=
3790: 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 20  =RD_RESOLVED || 
37a0: 61 70 31 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46 4c  ap1->type==CONFL
37b0: 49 43 54 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ICT);.    assert
37c0: 28 20 61 70 32 2d 3e 74 79 70 65 3d 3d 52 45 44  ( ap2->type==RED
37d0: 55 43 45 20 7c 7c 20 61 70 32 2d 3e 74 79 70 65  UCE || ap2->type
37e0: 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c  ==RD_RESOLVED ||
37f0: 20 61 70 32 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46   ap2->type==CONF
3800: 4c 49 43 54 29 3b 0a 20 20 20 20 72 63 20 3d 20  LICT);.    rc = 
3810: 61 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78  ap1->x.rp->index
3820: 20 2d 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69 6e   - ap2->x.rp->in
3830: 64 65 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  dex;.  }.  retur
3840: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74  n rc;.}../* Sort
3850: 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20   parser actions 
3860: 2a 2f 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e  */.struct action
3870: 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 61 70   *Action_sort(ap
3880: 29 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  ).struct action 
3890: 2a 61 70 3b 0a 7b 0a 20 20 61 70 20 3d 20 28 73  *ap;.{.  ap = (s
38a0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 6d  truct action *)m
38b0: 73 6f 72 74 28 61 70 2c 26 61 70 2d 3e 6e 65 78  sort(ap,&ap->nex
38c0: 74 2c 61 63 74 69 6f 6e 63 6d 70 29 3b 0a 20 20  t,actioncmp);.  
38d0: 72 65 74 75 72 6e 20 61 70 3b 0a 7d 0a 0a 76 6f  return ap;.}..vo
38e0: 69 64 20 41 63 74 69 6f 6e 5f 61 64 64 28 61 70  id Action_add(ap
38f0: 70 2c 74 79 70 65 2c 73 70 2c 61 72 67 29 0a 73  p,type,sp,arg).s
3900: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 2a 61  truct action **a
3910: 70 70 3b 0a 65 6e 75 6d 20 65 5f 61 63 74 69 6f  pp;.enum e_actio
3920: 6e 20 74 79 70 65 3b 0a 73 74 72 75 63 74 20 73  n type;.struct s
3930: 79 6d 62 6f 6c 20 2a 73 70 3b 0a 63 68 61 72 20  ymbol *sp;.char 
3940: 2a 61 72 67 3b 0a 7b 0a 20 20 73 74 72 75 63 74  *arg;.{.  struct
3950: 20 61 63 74 69 6f 6e 20 2a 6e 65 77 3b 0a 20 20   action *new;.  
3960: 6e 65 77 20 3d 20 41 63 74 69 6f 6e 5f 6e 65 77  new = Action_new
3970: 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65 78 74 20  ();.  new->next 
3980: 3d 20 2a 61 70 70 3b 0a 20 20 2a 61 70 70 20 3d  = *app;.  *app =
3990: 20 6e 65 77 3b 0a 20 20 6e 65 77 2d 3e 74 79 70   new;.  new->typ
39a0: 65 20 3d 20 74 79 70 65 3b 0a 20 20 6e 65 77 2d  e = type;.  new-
39b0: 3e 73 70 20 3d 20 73 70 3b 0a 20 20 69 66 28 20  >sp = sp;.  if( 
39c0: 74 79 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20  type==SHIFT ){. 
39d0: 20 20 20 6e 65 77 2d 3e 78 2e 73 74 70 20 3d 20     new->x.stp = 
39e0: 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29  (struct state *)
39f0: 61 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  arg;.  }else{.  
3a00: 20 20 6e 65 77 2d 3e 78 2e 72 70 20 3d 20 28 73    new->x.rp = (s
3a10: 74 72 75 63 74 20 72 75 6c 65 20 2a 29 61 72 67  truct rule *)arg
3a20: 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ;.  }.}./*******
3a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
3a40: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 61  From the file "a
3a50: 73 73 65 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  ssert.c" *******
3a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a70: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20 6d  *****/./*.** A m
3a80: 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20 77 61  ore efficient wa
3a90: 79 20 6f 66 20 68 61 6e 64 6c 69 6e 67 20 61 73  y of handling as
3aa0: 73 65 72 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69  sertions..*/.voi
3ab0: 64 20 6d 79 61 73 73 65 72 74 28 66 69 6c 65 2c  d myassert(file,
3ac0: 6c 69 6e 65 29 0a 63 68 61 72 20 2a 66 69 6c 65  line).char *file
3ad0: 3b 0a 69 6e 74 20 6c 69 6e 65 3b 0a 7b 0a 20 20  ;.int line;.{.  
3ae0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
3af0: 41 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 65 64  Assertion failed
3b00: 20 6f 6e 20 6c 69 6e 65 20 25 64 20 6f 66 20 66   on line %d of f
3b10: 69 6c 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 6c 69  ile \"%s\"\n",li
3b20: 6e 65 2c 66 69 6c 65 29 3b 0a 20 20 65 78 69 74  ne,file);.  exit
3b30: 28 31 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  (1);.}./********
3b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
3b50: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 62 75  rom the file "bu
3b60: 69 6c 64 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ild.c" *********
3b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b80: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ****/./*.** Rout
3b90: 69 6e 65 73 20 74 6f 20 63 6f 6e 73 74 72 75 63  ines to construc
3ba0: 74 69 6f 6e 20 74 68 65 20 66 69 6e 69 74 65 20  tion the finite 
3bb0: 73 74 61 74 65 20 6d 61 63 68 69 6e 65 20 66 6f  state machine fo
3bc0: 72 20 74 68 65 20 4c 45 4d 4f 4e 0a 2a 2a 20 70  r the LEMON.** p
3bd0: 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
3be0: 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e 64 20 61 20 70  .*/../* Find a p
3bf0: 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c  recedence symbol
3c00: 20 6f 66 20 65 76 65 72 79 20 72 75 6c 65 20 69   of every rule i
3c10: 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 0a 2a  n the grammar..*
3c20: 2a 20 0a 2a 2a 20 54 68 6f 73 65 20 72 75 6c 65  * .** Those rule
3c30: 73 20 77 68 69 63 68 20 68 61 76 65 20 61 20 70  s which have a p
3c40: 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c  recedence symbol
3c50: 20 63 6f 64 65 64 20 69 6e 20 74 68 65 20 69 6e   coded in the in
3c60: 70 75 74 0a 2a 2a 20 67 72 61 6d 6d 61 72 20 75  put.** grammar u
3c70: 73 69 6e 67 20 74 68 65 20 22 5b 73 79 6d 62 6f  sing the "[symbo
3c80: 6c 5d 22 20 63 6f 6e 73 74 72 75 63 74 20 77 69  l]" construct wi
3c90: 6c 6c 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ll already have 
3ca0: 74 68 65 0a 2a 2a 20 72 70 2d 3e 70 72 65 63 73  the.** rp->precs
3cb0: 79 6d 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 2e  ym field filled.
3cc0: 20 20 4f 74 68 65 72 20 72 75 6c 65 73 20 74 61    Other rules ta
3cd0: 6b 65 20 61 73 20 74 68 65 69 72 20 70 72 65 63  ke as their prec
3ce0: 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c  edence.** symbol
3cf0: 20 74 68 65 20 66 69 72 73 74 20 52 48 53 20 73   the first RHS s
3d00: 79 6d 62 6f 6c 20 77 69 74 68 20 61 20 64 65 66  ymbol with a def
3d10: 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65 2e  ined precedence.
3d20: 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
3d30: 65 20 6e 6f 74 20 52 48 53 20 73 79 6d 62 6f 6c  e not RHS symbol
3d40: 73 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64  s with a defined
3d50: 20 70 72 65 63 65 64 65 6e 63 65 2c 20 74 68 65   precedence, the
3d60: 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73   precedence.** s
3d70: 79 6d 62 6f 6c 20 66 69 65 6c 64 20 69 73 20 6c  ymbol field is l
3d80: 65 66 74 20 62 6c 61 6e 6b 2e 0a 2a 2f 0a 76 6f  eft blank..*/.vo
3d90: 69 64 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65  id FindRulePrece
3da0: 64 65 6e 63 65 73 28 78 70 29 0a 73 74 72 75 63  dences(xp).struc
3db0: 74 20 6c 65 6d 6f 6e 20 2a 78 70 3b 0a 7b 0a 20  t lemon *xp;.{. 
3dc0: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
3dd0: 3b 0a 20 20 66 6f 72 28 72 70 3d 78 70 2d 3e 72  ;.  for(rp=xp->r
3de0: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
3df0: 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72  next){.    if( r
3e00: 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30 20 29 7b  p->precsym==0 ){
3e10: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
3e20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
3e30: 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
3e40: 20 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72         if( rp->r
3e50: 68 73 5b 69 5d 2d 3e 70 72 65 63 3e 3d 30 20 29  hs[i]->prec>=0 )
3e60: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  {.          rp->
3e70: 70 72 65 63 73 79 6d 20 3d 20 72 70 2d 3e 72 68  precsym = rp->rh
3e80: 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  s[i];.          
3e90: 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 20 20  break;..}.      
3ea0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
3eb0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64  turn;.}../* Find
3ec0: 20 61 6c 6c 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   all nonterminal
3ed0: 73 20 77 68 69 63 68 20 77 69 6c 6c 20 67 65 6e  s which will gen
3ee0: 65 72 61 74 65 20 74 68 65 20 65 6d 70 74 79 20  erate the empty 
3ef0: 73 74 72 69 6e 67 2e 0a 2a 2a 20 54 68 65 6e 20  string..** Then 
3f00: 67 6f 20 62 61 63 6b 20 61 6e 64 20 63 6f 6d 70  go back and comp
3f10: 75 74 65 20 74 68 65 20 66 69 72 73 74 20 73 65  ute the first se
3f20: 74 73 20 6f 66 20 65 76 65 72 79 20 6e 6f 6e 74  ts of every nont
3f30: 65 72 6d 69 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20  erminal..** The 
3f40: 66 69 72 73 74 20 73 65 74 20 69 73 20 74 68 65  first set is the
3f50: 20 73 65 74 20 6f 66 20 61 6c 6c 20 74 65 72 6d   set of all term
3f60: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69  inal symbols whi
3f70: 63 68 20 63 61 6e 20 62 65 67 69 6e 0a 2a 2a 20  ch can begin.** 
3f80: 61 20 73 74 72 69 6e 67 20 67 65 6e 65 72 61 74  a string generat
3f90: 65 64 20 62 79 20 74 68 61 74 20 6e 6f 6e 74 65  ed by that nonte
3fa0: 72 6d 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  rminal..*/.void 
3fb0: 46 69 6e 64 46 69 72 73 74 53 65 74 73 28 6c 65  FindFirstSets(le
3fc0: 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
3fd0: 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20   *lemp;.{.  int 
3fe0: 69 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  i;.  struct rule
3ff0: 20 2a 72 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67   *rp;.  int prog
4000: 72 65 73 73 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  ress;..  for(i=0
4010: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
4020: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d  l; i++){.    lem
4030: 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c  p->symbols[i]->l
4040: 61 6d 62 64 61 20 3d 20 42 5f 46 41 4c 53 45 3b  ambda = B_FALSE;
4050: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6c 65 6d  .  }.  for(i=lem
4060: 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 3c  p->nterminal; i<
4070: 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
4080: 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73  ++){.    lemp->s
4090: 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 66 69 72 73 74  ymbols[i]->first
40a0: 73 65 74 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a  set = SetNew();.
40b0: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20    }..  /* First 
40c0: 63 6f 6d 70 75 74 65 20 61 6c 6c 20 6c 61 6d 62  compute all lamb
40d0: 64 61 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20  das */.  do{.   
40e0: 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20   progress = 0;. 
40f0: 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e     for(rp=lemp->
4100: 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
4110: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
4120: 28 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64  ( rp->lhs->lambd
4130: 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  a ) continue;.  
4140: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
4150: 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
4160: 20 20 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e          if( rp->
4170: 72 68 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61 3d 3d  rhs[i]->lambda==
4180: 42 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b  B_FALSE ) break;
4190: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
41a0: 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29  f( i==rp->nrhs )
41b0: 7b 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68  {.        rp->lh
41c0: 73 2d 3e 6c 61 6d 62 64 61 20 3d 20 42 5f 54 52  s->lambda = B_TR
41d0: 55 45 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 67  UE;.        prog
41e0: 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ress = 1;.      
41f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  }.    }.  }while
4200: 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 0a 20  ( progress );.. 
4210: 20 2f 2a 20 4e 6f 77 20 63 6f 6d 70 75 74 65 20   /* Now compute 
4220: 61 6c 6c 20 66 69 72 73 74 20 73 65 74 73 20 2a  all first sets *
4230: 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 73 74 72 75  /.  do{.    stru
4240: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 31 2c 20 2a  ct symbol *s1, *
4250: 73 32 3b 0a 20 20 20 20 70 72 6f 67 72 65 73 73  s2;.    progress
4260: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 72 70   = 0;.    for(rp
4270: 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
4280: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
4290: 20 20 20 20 20 73 31 20 3d 20 72 70 2d 3e 6c 68       s1 = rp->lh
42a0: 73 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  s;.      for(i=0
42b0: 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
42c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 32 20 3d  +){.        s2 =
42d0: 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
42e0: 20 20 20 20 20 69 66 28 20 73 32 2d 3e 74 79 70       if( s2->typ
42f0: 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  e==TERMINAL ){. 
4300: 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73           progres
4310: 73 20 2b 3d 20 53 65 74 41 64 64 28 73 31 2d 3e  s += SetAdd(s1->
4320: 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 69 6e 64  firstset,s2->ind
4330: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ex);.          b
4340: 72 65 61 6b 3b 0a 09 7d 65 6c 73 65 20 69 66 28  reak;..}else if(
4350: 20 73 31 3d 3d 73 32 20 29 7b 0a 20 20 20 20 20   s1==s2 ){.     
4360: 20 20 20 20 20 69 66 28 20 73 31 2d 3e 6c 61 6d       if( s1->lam
4370: 62 64 61 3d 3d 42 5f 46 41 4c 53 45 20 29 20 62  bda==B_FALSE ) b
4380: 72 65 61 6b 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20  reak;..}else{.  
4390: 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73          progress
43a0: 20 2b 3d 20 53 65 74 55 6e 69 6f 6e 28 73 31 2d   += SetUnion(s1-
43b0: 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 66 69  >firstset,s2->fi
43c0: 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20 20 20  rstset);.       
43d0: 20 20 20 69 66 28 20 73 32 2d 3e 6c 61 6d 62 64     if( s2->lambd
43e0: 61 3d 3d 42 5f 46 41 4c 53 45 20 29 20 62 72 65  a==B_FALSE ) bre
43f0: 61 6b 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20  ak;..}.      }. 
4400: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70     }.  }while( p
4410: 72 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 65 74  rogress );.  ret
4420: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75  urn;.}../* Compu
4430: 74 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74 61  te all LR(0) sta
4440: 74 65 73 20 66 6f 72 20 74 68 65 20 67 72 61 6d  tes for the gram
4450: 6d 61 72 2e 20 20 4c 69 6e 6b 73 0a 2a 2a 20 61  mar.  Links.** a
4460: 72 65 20 61 64 64 65 64 20 74 6f 20 62 65 74 77  re added to betw
4470: 65 65 6e 20 73 6f 6d 65 20 73 74 61 74 65 73 20  een some states 
4480: 73 6f 20 74 68 61 74 20 74 68 65 20 4c 52 28 31  so that the LR(1
4490: 29 20 66 6f 6c 6c 6f 77 20 73 65 74 73 0a 2a 2a  ) follow sets.**
44a0: 20 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64   can be computed
44b0: 20 6c 61 74 65 72 2e 0a 2a 2f 0a 50 52 49 56 41   later..*/.PRIVA
44c0: 54 45 20 73 74 72 75 63 74 20 73 74 61 74 65 20  TE struct state 
44d0: 2a 67 65 74 73 74 61 74 65 28 2f 2a 20 73 74 72  *getstate(/* str
44e0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b  uct lemon * */);
44f0: 20 20 2f 2a 20 66 6f 72 77 61 72 64 20 72 65 66    /* forward ref
4500: 65 72 65 6e 63 65 20 2a 2f 0a 76 6f 69 64 20 46  erence */.void F
4510: 69 6e 64 53 74 61 74 65 73 28 6c 65 6d 70 29 0a  indStates(lemp).
4520: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
4530: 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73  mp;.{.  struct s
4540: 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72  ymbol *sp;.  str
4550: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20  uct rule *rp;.. 
4560: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74   Configlist_init
4570: 28 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74  ();..  /* Find t
4580: 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  he start symbol 
4590: 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73  */.  if( lemp->s
45a0: 74 61 72 74 20 29 7b 0a 20 20 20 20 73 70 20 3d  tart ){.    sp =
45b0: 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d   Symbol_find(lem
45c0: 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 69  p->start);.    i
45d0: 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20  f( sp==0 ){.    
45e0: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
45f0: 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68  >filename,0,."Th
4600: 65 20 73 70 65 63 69 66 69 65 64 20 73 74 61 72  e specified star
4610: 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20  t symbol \"%s\" 
4620: 69 73 20 6e 6f 74 20 5c 0a 69 6e 20 61 20 6e 6f  is not \.in a no
4630: 6e 74 65 72 6d 69 6e 61 6c 20 6f 66 20 74 68 65  nterminal of the
4640: 20 67 72 61 6d 6d 61 72 2e 20 20 5c 22 25 73 5c   grammar.  \"%s\
4650: 22 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61  " will be used a
4660: 73 20 74 68 65 20 73 74 61 72 74 20 5c 0a 73 79  s the start \.sy
4670: 6d 62 6f 6c 20 69 6e 73 74 65 61 64 2e 22 2c 6c  mbol instead.",l
4680: 65 6d 70 2d 3e 73 74 61 72 74 2c 6c 65 6d 70 2d  emp->start,lemp-
4690: 3e 72 75 6c 65 2d 3e 6c 68 73 2d 3e 6e 61 6d 65  >rule->lhs->name
46a0: 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65  );.      lemp->e
46b0: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
46c0: 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65   sp = lemp->rule
46d0: 2d 3e 6c 68 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->lhs;.    }.  }
46e0: 65 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c  else{.    sp = l
46f0: 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a  emp->rule->lhs;.
4700: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
4710: 75 72 65 20 74 68 65 20 73 74 61 72 74 20 73 79  ure the start sy
4720: 6d 62 6f 6c 20 64 6f 65 73 6e 27 74 20 6f 63 63  mbol doesn't occ
4730: 75 72 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  ur on the right-
4740: 68 61 6e 64 20 73 69 64 65 20 6f 66 0a 20 20 2a  hand side of.  *
4750: 2a 20 61 6e 79 20 72 75 6c 65 2e 20 20 52 65 70  * any rule.  Rep
4760: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
4770: 69 74 20 64 6f 65 73 2e 20 20 28 59 41 43 43 20  it does.  (YACC 
4780: 77 6f 75 6c 64 20 67 65 6e 65 72 61 74 65 20 61  would generate a
4790: 20 6e 65 77 0a 20 20 2a 2a 20 73 74 61 72 74 20   new.  ** start 
47a0: 73 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73 20 63  symbol in this c
47b0: 61 73 65 2e 29 20 2a 2f 0a 20 20 66 6f 72 28 72  ase.) */.  for(r
47c0: 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
47d0: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
47e0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
47f0: 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
4800: 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
4810: 69 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d 3d 3d  if( rp->rhs[i]==
4820: 73 70 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  sp ){.        Er
4830: 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
4840: 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 74  ename,0,."The st
4850: 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c  art symbol \"%s\
4860: 22 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20  " occurs on the 
4870: 5c 0a 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  \.right-hand sid
4880: 65 20 6f 66 20 61 20 72 75 6c 65 2e 20 54 68 69  e of a rule. Thi
4890: 73 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  s will result in
48a0: 20 61 20 70 61 72 73 65 72 20 77 68 69 63 68 20   a parser which 
48b0: 5c 0a 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  \.does not work 
48c0: 70 72 6f 70 65 72 6c 79 2e 22 2c 73 70 2d 3e 6e  properly.",sp->n
48d0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6c 65  ame);.        le
48e0: 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
48f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4900: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62 61 73 69  }..  /* The basi
4910: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
4920: 73 65 74 20 66 6f 72 20 74 68 65 20 66 69 72 73  set for the firs
4930: 74 20 73 74 61 74 65 0a 20 20 2a 2a 20 69 73 20  t state.  ** is 
4940: 61 6c 6c 20 72 75 6c 65 73 20 77 68 69 63 68 20  all rules which 
4950: 68 61 76 65 20 74 68 65 20 73 74 61 72 74 20 73  have the start s
4960: 79 6d 62 6f 6c 20 61 73 20 74 68 65 69 72 0a 20  ymbol as their. 
4970: 20 2a 2a 20 6c 65 66 74 2d 68 61 6e 64 20 73 69   ** left-hand si
4980: 64 65 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 73  de */.  for(rp=s
4990: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
49a0: 72 70 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20  rp->nextlhs){.  
49b0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
49c0: 2a 6e 65 77 63 66 70 3b 0a 20 20 20 20 6e 65 77  *newcfp;.    new
49d0: 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74  cfp = Configlist
49e0: 5f 61 64 64 62 61 73 69 73 28 72 70 2c 30 29 3b  _addbasis(rp,0);
49f0: 0a 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63  .    SetAdd(newc
4a00: 66 70 2d 3e 66 77 73 2c 30 29 3b 0a 20 20 7d 0a  fp->fws,0);.  }.
4a10: 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
4a20: 65 20 66 69 72 73 74 20 73 74 61 74 65 2e 20 20  e first state.  
4a30: 41 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  All other states
4a40: 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 6f   will be.  ** co
4a50: 6d 70 75 74 65 64 20 61 75 74 6f 6d 61 74 69 63  mputed automatic
4a60: 61 6c 6c 79 20 64 75 72 69 6e 67 20 74 68 65 20  ally during the 
4a70: 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66 20 74  computation of t
4a80: 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 0a 20 20  he first one..  
4a90: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
4aa0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66  pointer to the f
4ab0: 69 72 73 74 20 73 74 61 74 65 20 69 73 20 6e 6f  irst state is no
4ac0: 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 28 76 6f  t used. */.  (vo
4ad0: 69 64 29 67 65 74 73 74 61 74 65 28 6c 65 6d 70  id)getstate(lemp
4ae0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
4af0: 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
4b00: 74 65 72 20 74 6f 20 61 20 73 74 61 74 65 20 77  ter to a state w
4b10: 68 69 63 68 20 69 73 20 64 65 73 63 72 69 62 65  hich is describe
4b20: 64 20 62 79 20 74 68 65 20 63 6f 6e 66 69 67 75  d by the configu
4b30: 72 61 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20 77  ration.** list w
4b40: 68 69 63 68 20 68 61 73 20 62 65 65 6e 20 62 75  hich has been bu
4b50: 69 6c 74 20 66 72 6f 6d 20 63 61 6c 6c 73 20 74  ilt from calls t
4b60: 6f 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64  o Configlist_add
4b70: 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  ..*/.PRIVATE voi
4b80: 64 20 62 75 69 6c 64 73 68 69 66 74 73 28 2f 2a  d buildshifts(/*
4b90: 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c   struct lemon *,
4ba0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 20   struct state * 
4bb0: 2a 2f 29 3b 20 2f 2a 20 46 6f 72 77 64 20 72 65  */); /* Forwd re
4bc0: 66 20 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72  f */.PRIVATE str
4bd0: 75 63 74 20 73 74 61 74 65 20 2a 67 65 74 73 74  uct state *getst
4be0: 61 74 65 28 6c 65 6d 70 29 0a 73 74 72 75 63 74  ate(lemp).struct
4bf0: 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a   lemon *lemp;.{.
4c00: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
4c10: 2a 63 66 70 2c 20 2a 62 70 3b 0a 20 20 73 74 72  *cfp, *bp;.  str
4c20: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
4c30: 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68  .  /* Extract th
4c40: 65 20 73 6f 72 74 65 64 20 62 61 73 69 73 20 6f  e sorted basis o
4c50: 66 20 74 68 65 20 6e 65 77 20 73 74 61 74 65 2e  f the new state.
4c60: 20 20 54 68 65 20 62 61 73 69 73 20 77 61 73 20    The basis was 
4c70: 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a  constructed.  **
4c80: 20 62 79 20 70 72 69 6f 72 20 63 61 6c 6c 73 20   by prior calls 
4c90: 74 6f 20 22 43 6f 6e 66 69 67 6c 69 73 74 5f 61  to "Configlist_a
4ca0: 64 64 62 61 73 69 73 28 29 22 2e 20 2a 2f 0a 20  ddbasis()". */. 
4cb0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74   Configlist_sort
4cc0: 62 61 73 69 73 28 29 3b 0a 20 20 62 70 20 3d 20  basis();.  bp = 
4cd0: 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73  Configlist_basis
4ce0: 28 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20  ();..  /* Get a 
4cf0: 73 74 61 74 65 20 77 69 74 68 20 74 68 65 20 73  state with the s
4d00: 61 6d 65 20 62 61 73 69 73 20 2a 2f 0a 20 20 73  ame basis */.  s
4d10: 74 70 20 3d 20 53 74 61 74 65 5f 66 69 6e 64 28  tp = State_find(
4d20: 62 70 29 3b 0a 20 20 69 66 28 20 73 74 70 20 29  bp);.  if( stp )
4d30: 7b 0a 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65  {.    /* A state
4d40: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 62   with the same b
4d50: 61 73 69 73 20 61 6c 72 65 61 64 79 20 65 78 69  asis already exi
4d60: 73 74 73 21 20 20 43 6f 70 79 20 61 6c 6c 20 74  sts!  Copy all t
4d70: 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 0a 20 20  he follow-set.  
4d80: 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 69 6f 6e    ** propagation
4d90: 20 6c 69 6e 6b 73 20 66 72 6f 6d 20 74 68 65 20   links from the 
4da0: 73 74 61 74 65 20 75 6e 64 65 72 20 63 6f 6e 73  state under cons
4db0: 74 72 75 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68  truction into th
4dc0: 65 0a 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73  e.    ** preexis
4dd0: 74 69 6e 67 20 73 74 61 74 65 2c 20 74 68 65 6e  ting state, then
4de0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
4df0: 72 20 74 6f 20 74 68 65 20 70 72 65 65 78 69 73  r to the preexis
4e00: 74 69 6e 67 20 73 74 61 74 65 20 2a 2f 0a 20 20  ting state */.  
4e10: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
4e20: 2a 78 2c 20 2a 79 3b 0a 20 20 20 20 66 6f 72 28  *x, *y;.    for(
4e30: 78 3d 62 70 2c 20 79 3d 73 74 70 2d 3e 62 70 3b  x=bp, y=stp->bp;
4e40: 20 78 20 26 26 20 79 3b 20 78 3d 78 2d 3e 62 70   x && y; x=x->bp
4e50: 2c 20 79 3d 79 2d 3e 62 70 29 7b 0a 20 20 20 20  , y=y->bp){.    
4e60: 20 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 26 79 2d    Plink_copy(&y-
4e70: 3e 62 70 6c 70 2c 78 2d 3e 62 70 6c 70 29 3b 0a  >bplp,x->bplp);.
4e80: 20 20 20 20 20 20 50 6c 69 6e 6b 5f 64 65 6c 65        Plink_dele
4e90: 74 65 28 78 2d 3e 66 70 6c 70 29 3b 0a 20 20 20  te(x->fplp);.   
4ea0: 20 20 20 78 2d 3e 66 70 6c 70 20 3d 20 78 2d 3e     x->fplp = x->
4eb0: 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  bplp = 0;.    }.
4ec0: 20 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67      cfp = Config
4ed0: 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 0a 20  list_return();. 
4ee0: 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61     Configlist_ea
4ef0: 74 28 63 66 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  t(cfp);.  }else{
4f00: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 65 61  .    /* This rea
4f10: 6c 6c 79 20 69 73 20 61 20 6e 65 77 20 73 74 61  lly is a new sta
4f20: 74 65 2e 20 20 43 6f 6e 73 74 72 75 63 74 20 61  te.  Construct a
4f30: 6c 6c 20 74 68 65 20 64 65 74 61 69 6c 73 20 2a  ll the details *
4f40: 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74  /.    Configlist
4f50: 5f 63 6c 6f 73 75 72 65 28 6c 65 6d 70 29 3b 20  _closure(lemp); 
4f60: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
4f70: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
4f80: 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 43  closure */.    C
4f90: 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 29  onfiglist_sort()
4fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
4fb0: 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ort the configur
4fc0: 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f  ation closure */
4fd0: 0a 20 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  .    cfp = Confi
4fe0: 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 20  glist_return(); 
4ff0: 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74    /* Get a point
5000: 65 72 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67  er to the config
5010: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 73 74 70   list */.    stp
5020: 20 3d 20 53 74 61 74 65 5f 6e 65 77 28 29 3b 20   = State_new(); 
5030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e            /* A n
5040: 65 77 20 73 74 61 74 65 20 73 74 72 75 63 74 75  ew state structu
5050: 72 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 6f 72 79  re */.    Memory
5060: 43 68 65 63 6b 28 73 74 70 29 3b 0a 20 20 20 20  Check(stp);.    
5070: 73 74 70 2d 3e 62 70 20 3d 20 62 70 3b 20 20 20  stp->bp = bp;   
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5090: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e  Remember the con
50a0: 66 69 67 75 72 61 74 69 6f 6e 20 62 61 73 69 73  figuration basis
50b0: 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 63 66 70   */.    stp->cfp
50c0: 20 3d 20 63 66 70 3b 20 20 20 20 20 20 20 20 20   = cfp;         
50d0: 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72       /* Remember
50e0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
50f0: 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20  on closure */.  
5100: 20 20 73 74 70 2d 3e 69 6e 64 65 78 20 3d 20 6c    stp->index = l
5110: 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b 3b 20 2f  emp->nstate++; /
5120: 2a 20 45 76 65 72 79 20 73 74 61 74 65 20 67 65  * Every state ge
5130: 74 73 20 61 20 73 65 71 75 65 6e 63 65 20 6e 75  ts a sequence nu
5140: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 73 74 70 2d  mber */.    stp-
5150: 3e 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  >ap = 0;        
5160: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61           /* No a
5170: 63 74 69 6f 6e 73 2c 20 79 65 74 2e 20 2a 2f 0a  ctions, yet. */.
5180: 20 20 20 20 53 74 61 74 65 5f 69 6e 73 65 72 74      State_insert
5190: 28 73 74 70 2c 73 74 70 2d 3e 62 70 29 3b 20 20  (stp,stp->bp);  
51a0: 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20 73   /* Add to the s
51b0: 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tate table */.  
51c0: 20 20 62 75 69 6c 64 73 68 69 66 74 73 28 6c 65    buildshifts(le
51d0: 6d 70 2c 73 74 70 29 3b 20 20 20 20 20 20 20 2f  mp,stp);       /
51e0: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 63 6f  * Recursively co
51f0: 6d 70 75 74 65 20 73 75 63 63 65 73 73 6f 72 20  mpute successor 
5200: 73 74 61 74 65 73 20 2a 2f 0a 20 20 7d 0a 20 20  states */.  }.  
5210: 72 65 74 75 72 6e 20 73 74 70 3b 0a 7d 0a 0a 2f  return stp;.}../
5220: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20  * Construct all 
5230: 73 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 73  successor states
5240: 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 73 74   to the given st
5250: 61 74 65 2e 20 20 41 20 22 73 75 63 63 65 73 73  ate.  A "success
5260: 6f 72 22 0a 2a 2a 20 73 74 61 74 65 20 69 73 20  or".** state is 
5270: 61 6e 79 20 73 74 61 74 65 20 77 68 69 63 68 20  any state which 
5280: 63 61 6e 20 62 65 20 72 65 61 63 68 65 64 20 62  can be reached b
5290: 79 20 61 20 73 68 69 66 74 20 61 63 74 69 6f 6e  y a shift action
52a0: 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  ..*/.PRIVATE voi
52b0: 64 20 62 75 69 6c 64 73 68 69 66 74 73 28 6c 65  d buildshifts(le
52c0: 6d 70 2c 73 74 70 29 0a 73 74 72 75 63 74 20 6c  mp,stp).struct l
52d0: 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73 74 72 75  emon *lemp;.stru
52e0: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
52f0: 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20     /* The state 
5300: 66 72 6f 6d 20 77 68 69 63 68 20 73 75 63 63 65  from which succe
5310: 73 73 6f 72 73 20 61 72 65 20 63 6f 6d 70 75 74  ssors are comput
5320: 65 64 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63 74  ed */.{.  struct
5330: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 2f   config *cfp;  /
5340: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
5350: 72 75 20 74 68 65 20 63 6f 6e 66 69 67 20 63 6c  ru the config cl
5360: 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a  osure of "stp" *
5370: 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  /.  struct confi
5380: 67 20 2a 62 63 66 70 3b 20 2f 2a 20 46 6f 72 20  g *bcfp; /* For 
5390: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 6f  the inner loop o
53a0: 6e 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65  n config closure
53b0: 20 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20 20 73   of "stp" */.  s
53c0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
53d0: 77 3b 20 20 2f 2a 20 2a 2f 0a 20 20 73 74 72 75  w;  /* */.  stru
53e0: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20  ct symbol *sp;  
53f0: 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f   /* Symbol follo
5400: 77 69 6e 67 20 74 68 65 20 64 6f 74 20 69 6e 20  wing the dot in 
5410: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 63  configuration "c
5420: 66 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  fp" */.  struct 
5430: 73 79 6d 62 6f 6c 20 2a 62 73 70 3b 20 20 2f 2a  symbol *bsp;  /*
5440: 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e   Symbol followin
5450: 67 20 74 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e  g the dot in con
5460: 66 69 67 75 72 61 74 69 6f 6e 20 22 62 63 66 70  figuration "bcfp
5470: 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  " */.  struct st
5480: 61 74 65 20 2a 6e 65 77 73 74 70 3b 20 2f 2a 20  ate *newstp; /* 
5490: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  A pointer to a s
54a0: 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 20 2a  uccessor state *
54b0: 2f 0a 0a 20 20 2f 2a 20 45 61 63 68 20 63 6f 6e  /..  /* Each con
54c0: 66 69 67 75 72 61 74 69 6f 6e 20 62 65 63 6f 6d  figuration becom
54d0: 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 66 74 65  es complete afte
54e0: 72 20 69 74 20 63 6f 6e 74 69 62 75 74 65 73 20  r it contibutes 
54f0: 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72 0a 20  to a successor. 
5500: 20 2a 2a 20 73 74 61 74 65 2e 20 20 49 6e 69 74   ** state.  Init
5510: 69 61 6c 6c 79 2c 20 61 6c 6c 20 63 6f 6e 66 69  ially, all confi
5520: 67 75 72 61 74 69 6f 6e 73 20 61 72 65 20 69 6e  gurations are in
5530: 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 66 6f  complete */.  fo
5540: 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20  r(cfp=stp->cfp; 
5550: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
5560: 78 74 29 20 63 66 70 2d 3e 73 74 61 74 75 73 20  xt) cfp->status 
5570: 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 0a 20  = INCOMPLETE;.. 
5580: 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
5590: 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69   all configurati
55a0: 6f 6e 73 20 6f 66 20 74 68 65 20 73 74 61 74 65  ons of the state
55b0: 20 22 73 74 70 22 20 2a 2f 0a 20 20 66 6f 72 28   "stp" */.  for(
55c0: 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66  cfp=stp->cfp; cf
55d0: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
55e0: 29 7b 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e  ){.    if( cfp->
55f0: 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45  status==COMPLETE
5600: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20   ) continue;    
5610: 2f 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64 20  /* Already used 
5620: 62 79 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  by inner loop */
5630: 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f  .    if( cfp->do
5640: 74 3e 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73  t>=cfp->rp->nrhs
5650: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a   ) continue;  /*
5660: 20 43 61 6e 27 74 20 73 68 69 66 74 20 74 68 69   Can't shift thi
5670: 73 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20  s config */.    
5680: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74  Configlist_reset
5690: 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ();             
56a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 65           /* Rese
56b0: 74 20 74 68 65 20 6e 65 77 20 63 6f 6e 66 69 67  t the new config
56c0: 20 73 65 74 20 2a 2f 0a 20 20 20 20 73 70 20 3d   set */.    sp =
56d0: 20 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 63 66   cfp->rp->rhs[cf
56e0: 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20  p->dot];        
56f0: 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 61       /* Symbol a
5700: 66 74 65 72 20 74 68 65 20 64 6f 74 20 2a 2f 0a  fter the dot */.
5710: 0a 20 20 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  .    /* For ever
5720: 79 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  y configuration 
5730: 69 6e 20 74 68 65 20 73 74 61 74 65 20 22 73 74  in the state "st
5740: 70 22 20 77 68 69 63 68 20 68 61 73 20 74 68 65  p" which has the
5750: 20 73 79 6d 62 6f 6c 20 22 73 70 22 0a 20 20 20   symbol "sp".   
5760: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74   ** following it
5770: 73 20 64 6f 74 2c 20 61 64 64 20 74 68 65 20 73  s dot, add the s
5780: 61 6d 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ame configuratio
5790: 6e 20 74 6f 20 74 68 65 20 62 61 73 69 73 20 73  n to the basis s
57a0: 65 74 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20  et under.    ** 
57b0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 62 75 74  construction but
57c0: 20 77 69 74 68 20 74 68 65 20 64 6f 74 20 73 68   with the dot sh
57d0: 69 66 74 65 64 20 6f 6e 65 20 73 79 6d 62 6f 6c  ifted one symbol
57e0: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20 2a   to the right. *
57f0: 2f 0a 20 20 20 20 66 6f 72 28 62 63 66 70 3d 63  /.    for(bcfp=c
5800: 66 70 3b 20 62 63 66 70 3b 20 62 63 66 70 3d 62  fp; bcfp; bcfp=b
5810: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
5820: 20 20 69 66 28 20 62 63 66 70 2d 3e 73 74 61 74    if( bcfp->stat
5830: 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63  us==COMPLETE ) c
5840: 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41  ontinue;    /* A
5850: 6c 72 65 61 64 79 20 75 73 65 64 20 2a 2f 0a 20  lready used */. 
5860: 20 20 20 20 20 69 66 28 20 62 63 66 70 2d 3e 64       if( bcfp->d
5870: 6f 74 3e 3d 62 63 66 70 2d 3e 72 70 2d 3e 6e 72  ot>=bcfp->rp->nr
5880: 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f  hs ) continue; /
5890: 2a 20 43 61 6e 27 74 20 73 68 69 66 74 20 74 68  * Can't shift th
58a0: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  is one */.      
58b0: 62 73 70 20 3d 20 62 63 66 70 2d 3e 72 70 2d 3e  bsp = bcfp->rp->
58c0: 72 68 73 5b 62 63 66 70 2d 3e 64 6f 74 5d 3b 20  rhs[bcfp->dot]; 
58d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74            /* Get
58e0: 20 73 79 6d 62 6f 6c 20 61 66 74 65 72 20 64 6f   symbol after do
58f0: 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62  t */.      if( b
5900: 73 70 21 3d 73 70 20 29 20 63 6f 6e 74 69 6e 75  sp!=sp ) continu
5910: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5920: 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
5930: 73 61 6d 65 20 61 73 20 66 6f 72 20 22 63 66 70  same as for "cfp
5940: 22 20 2a 2f 0a 20 20 20 20 20 20 62 63 66 70 2d  " */.      bcfp-
5950: 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45  >status = COMPLE
5960: 54 45 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  TE;             
5970: 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 69       /* Mark thi
5980: 73 20 63 6f 6e 66 69 67 20 61 73 20 75 73 65 64  s config as used
5990: 20 2a 2f 0a 20 20 20 20 20 20 6e 65 77 20 3d 20   */.      new = 
59a0: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61  Configlist_addba
59b0: 73 69 73 28 62 63 66 70 2d 3e 72 70 2c 62 63 66  sis(bcfp->rp,bcf
59c0: 70 2d 3e 64 6f 74 2b 31 29 3b 0a 20 20 20 20 20  p->dot+1);.     
59d0: 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6e 65 77 2d   Plink_add(&new-
59e0: 3e 62 70 6c 70 2c 62 63 66 70 29 3b 0a 20 20 20  >bplp,bcfp);.   
59f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 61   }..    /* Get a
5a00: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
5a10: 73 74 61 74 65 20 64 65 73 63 72 69 62 65 64 20  state described 
5a20: 62 79 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e  by the basis con
5a30: 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 0a 20  figuration set. 
5a40: 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65     ** constructe
5a50: 64 20 69 6e 20 74 68 65 20 70 72 65 63 65 64 69  d in the precedi
5a60: 6e 67 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 6e  ng loop */.    n
5a70: 65 77 73 74 70 20 3d 20 67 65 74 73 74 61 74 65  ewstp = getstate
5a80: 28 6c 65 6d 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  (lemp);..    /* 
5a90: 54 68 65 20 73 74 61 74 65 20 22 6e 65 77 73 74  The state "newst
5aa0: 70 22 20 69 73 20 72 65 61 63 68 65 64 20 66 72  p" is reached fr
5ab0: 6f 6d 20 74 68 65 20 73 74 61 74 65 20 22 73 74  om the state "st
5ac0: 70 22 20 62 79 20 61 20 73 68 69 66 74 20 61 63  p" by a shift ac
5ad0: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  tion.    ** on t
5ae0: 68 65 20 73 79 6d 62 6f 6c 20 22 73 70 22 20 2a  he symbol "sp" *
5af0: 2f 0a 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64  /.    Action_add
5b00: 28 26 73 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c  (&stp->ap,SHIFT,
5b10: 73 70 2c 6e 65 77 73 74 70 29 3b 0a 20 20 7d 0a  sp,newstp);.  }.
5b20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
5b30: 63 74 20 74 68 65 20 70 72 6f 70 61 67 61 74 69  ct the propagati
5b40: 6f 6e 20 6c 69 6e 6b 73 0a 2a 2f 0a 76 6f 69 64  on links.*/.void
5b50: 20 46 69 6e 64 4c 69 6e 6b 73 28 6c 65 6d 70 29   FindLinks(lemp)
5b60: 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
5b70: 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  emp;.{.  int i;.
5b80: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
5b90: 2a 63 66 70 2c 20 2a 6f 74 68 65 72 3b 0a 20 20  *cfp, *other;.  
5ba0: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
5bb0: 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  p;.  struct plin
5bc0: 6b 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f  k *plp;..  /* Ho
5bd0: 75 73 65 6b 65 65 70 69 6e 67 20 64 65 74 61 69  usekeeping detai
5be0: 6c 3a 0a 20 20 2a 2a 20 41 64 64 20 74 6f 20 65  l:.  ** Add to e
5bf0: 76 65 72 79 20 70 72 6f 70 61 67 61 74 65 20 6c  very propagate l
5c00: 69 6e 6b 20 61 20 70 6f 69 6e 74 65 72 20 62 61  ink a pointer ba
5c10: 63 6b 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  ck to the state 
5c20: 74 6f 0a 20 20 2a 2a 20 77 68 69 63 68 20 74 68  to.  ** which th
5c30: 65 20 6c 69 6e 6b 20 69 73 20 61 74 74 61 63 68  e link is attach
5c40: 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ed. */.  for(i=0
5c50: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
5c60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
5c70: 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
5c80: 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73  ];.    for(cfp=s
5c90: 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66  tp->cfp; cfp; cf
5ca0: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=cfp->next){.  
5cb0: 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 73      cfp->stp = s
5cc0: 74 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  tp;.    }.  }.. 
5cd0: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20   /* Convert all 
5ce0: 62 61 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20 66  backlinks into f
5cf0: 6f 72 77 61 72 64 20 6c 69 6e 6b 73 2e 20 20 4f  orward links.  O
5d00: 6e 6c 79 20 74 68 65 20 66 6f 72 77 61 72 64 0a  nly the forward.
5d10: 20 20 2a 2a 20 6c 69 6e 6b 73 20 61 72 65 20 75    ** links are u
5d20: 73 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  sed in the follo
5d30: 77 2d 73 65 74 20 63 6f 6d 70 75 74 61 74 69 6f  w-set computatio
5d40: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
5d50: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
5d60: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
5d70: 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
5d80: 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74  ;.    for(cfp=st
5d90: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
5da0: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
5db0: 20 20 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e     for(plp=cfp->
5dc0: 62 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70  bplp; plp; plp=p
5dd0: 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  lp->next){.     
5de0: 20 20 20 6f 74 68 65 72 20 3d 20 70 6c 70 2d 3e     other = plp->
5df0: 63 66 70 3b 0a 20 20 20 20 20 20 20 20 50 6c 69  cfp;.        Pli
5e00: 6e 6b 5f 61 64 64 28 26 6f 74 68 65 72 2d 3e 66  nk_add(&other->f
5e10: 70 6c 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20  plp,cfp);.      
5e20: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
5e30: 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 66 6f  * Compute all fo
5e40: 6c 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20  llowsets..**.** 
5e50: 41 20 66 6f 6c 6c 6f 77 73 65 74 20 69 73 20 74  A followset is t
5e60: 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 73 79  he set of all sy
5e70: 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20  mbols which can 
5e80: 63 6f 6d 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  come immediately
5e90: 0a 2a 2a 20 61 66 74 65 72 20 61 20 63 6f 6e 66  .** after a conf
5ea0: 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  iguration..*/.vo
5eb0: 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74  id FindFollowSet
5ec0: 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  s(lemp).struct l
5ed0: 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
5ee0: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
5ef0: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73  config *cfp;.  s
5f00: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70  truct plink *plp
5f10: 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73  ;.  int progress
5f20: 3b 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 3b 0a  ;.  int change;.
5f30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
5f40: 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
5f50: 7b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65  {.    for(cfp=le
5f60: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63  mp->sorted[i]->c
5f70: 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  fp; cfp; cfp=cfp
5f80: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 63  ->next){.      c
5f90: 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43  fp->status = INC
5fa0: 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20  OMPLETE;.    }. 
5fb0: 20 7d 0a 20 20 0a 20 20 64 6f 7b 0a 20 20 20 20   }.  .  do{.    
5fc0: 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  progress = 0;.  
5fd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
5fe0: 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
5ff0: 0a 20 20 20 20 20 20 66 6f 72 28 63 66 70 3d 6c  .      for(cfp=l
6000: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e  emp->sorted[i]->
6010: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
6020: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
6030: 20 20 69 66 28 20 63 66 70 2d 3e 73 74 61 74 75    if( cfp->statu
6040: 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f  s==COMPLETE ) co
6050: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
6060: 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 66 70 6c  for(plp=cfp->fpl
6070: 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d  p; plp; plp=plp-
6080: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
6090: 20 20 63 68 61 6e 67 65 20 3d 20 53 65 74 55 6e    change = SetUn
60a0: 69 6f 6e 28 70 6c 70 2d 3e 63 66 70 2d 3e 66 77  ion(plp->cfp->fw
60b0: 73 2c 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20  s,cfp->fws);.   
60c0: 20 20 20 20 20 20 20 69 66 28 20 63 68 61 6e 67         if( chang
60d0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
60e0: 20 70 6c 70 2d 3e 63 66 70 2d 3e 73 74 61 74 75   plp->cfp->statu
60f0: 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a  s = INCOMPLETE;.
6100: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 67              prog
6110: 72 65 73 73 20 3d 20 31 3b 0a 09 20 20 7d 0a 09  ress = 1;..  }..
6120: 7d 0a 20 20 20 20 20 20 20 20 63 66 70 2d 3e 73  }.        cfp->s
6130: 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54 45  tatus = COMPLETE
6140: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6150: 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65    }while( progre
6160: 73 73 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ss );.}..static 
6170: 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66  int resolve_conf
6180: 6c 69 63 74 28 29 3b 0a 0a 2f 2a 20 43 6f 6d 70  lict();../* Comp
6190: 75 74 65 20 74 68 65 20 72 65 64 75 63 65 20 61  ute the reduce a
61a0: 63 74 69 6f 6e 73 2c 20 61 6e 64 20 72 65 73 6f  ctions, and reso
61b0: 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73 2e 0a 2a  lve conflicts..*
61c0: 2f 0a 76 6f 69 64 20 46 69 6e 64 41 63 74 69 6f  /.void FindActio
61d0: 6e 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20  ns(lemp).struct 
61e0: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
61f0: 20 69 6e 74 20 69 2c 6a 3b 0a 20 20 73 74 72 75   int i,j;.  stru
6200: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a  ct config *cfp;.
6210: 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
6220: 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79  stp;.  struct sy
6230: 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75  mbol *sp;.  stru
6240: 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20  ct rule *rp;..  
6250: 2f 2a 20 41 64 64 20 61 6c 6c 20 6f 66 20 74 68  /* Add all of th
6260: 65 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73  e reduce actions
6270: 20 0a 20 20 2a 2a 20 41 20 72 65 64 75 63 65 20   .  ** A reduce 
6280: 61 63 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20  action is added 
6290: 66 6f 72 20 65 61 63 68 20 65 6c 65 6d 65 6e 74  for each element
62a0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 73 65   of the followse
62b0: 74 20 6f 66 0a 20 20 2a 2a 20 61 20 63 6f 6e 66  t of.  ** a conf
62c0: 69 67 75 72 61 74 69 6f 6e 20 77 68 69 63 68 20  iguration which 
62d0: 68 61 73 20 69 74 73 20 64 6f 74 20 61 74 20 74  has its dot at t
62e0: 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74  he extreme right
62f0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
6300: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
6310: 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f 6f  ; i++){   /* Loo
6320: 70 20 6f 76 65 72 20 61 6c 6c 20 73 74 61 74 65  p over all state
6330: 73 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 6c  s */.    stp = l
6340: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
6350: 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d      for(cfp=stp-
6360: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
6370: 66 70 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a 20 4c  fp->next){  /* L
6380: 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 63 6f 6e  oop over all con
6390: 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20  figurations */. 
63a0: 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e 72 70       if( cfp->rp
63b0: 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e 64 6f 74  ->nrhs==cfp->dot
63c0: 20 29 7b 20 20 20 20 20 20 20 20 2f 2a 20 49 73   ){        /* Is
63d0: 20 64 6f 74 20 61 74 20 65 78 74 72 65 6d 65 20   dot at extreme 
63e0: 72 69 67 68 74 3f 20 2a 2f 0a 20 20 20 20 20 20  right? */.      
63f0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d    for(j=0; j<lem
6400: 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b  p->nterminal; j+
6410: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
6420: 28 20 53 65 74 46 69 6e 64 28 63 66 70 2d 3e 66  ( SetFind(cfp->f
6430: 77 73 2c 6a 29 20 29 7b 0a 20 20 20 20 20 20 20  ws,j) ){.       
6440: 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 72 65       /* Add a re
6450: 64 75 63 65 20 61 63 74 69 6f 6e 20 74 6f 20 74  duce action to t
6460: 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20 77  he state "stp" w
6470: 68 69 63 68 20 77 69 6c 6c 20 72 65 64 75 63 65  hich will reduce
6480: 20 62 79 20 74 68 65 0a 20 20 20 20 20 20 20 20   by the.        
6490: 20 20 20 20 2a 2a 20 72 75 6c 65 20 22 63 66 70      ** rule "cfp
64a0: 2d 3e 72 70 22 20 69 66 20 74 68 65 20 6c 6f 6f  ->rp" if the loo
64b0: 6b 61 68 65 61 64 20 73 79 6d 62 6f 6c 20 69 73  kahead symbol is
64c0: 20 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b   "lemp->symbols[
64d0: 6a 5d 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  j]" */.         
64e0: 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73     Action_add(&s
64f0: 74 70 2d 3e 61 70 2c 52 45 44 55 43 45 2c 6c 65  tp->ap,REDUCE,le
6500: 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c 63  mp->symbols[j],c
6510: 66 70 2d 3e 72 70 29 3b 0a 20 20 20 20 20 20 20  fp->rp);.       
6520: 20 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a     }..}.      }.
6530: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6540: 41 64 64 20 74 68 65 20 61 63 63 65 70 74 69 6e  Add the acceptin
6550: 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 66 28  g token */.  if(
6560: 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a   lemp->start ){.
6570: 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f      sp = Symbol_
6580: 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74  find(lemp->start
6590: 29 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30  );.    if( sp==0
65a0: 20 29 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75   ) sp = lemp->ru
65b0: 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65 6c 73 65  le->lhs;.  }else
65c0: 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d  {.    sp = lemp-
65d0: 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a  >rule->lhs;.  }.
65e0: 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20    /* Add to the 
65f0: 66 69 72 73 74 20 73 74 61 74 65 20 28 77 68 69  first state (whi
6600: 63 68 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  ch is always the
6610: 20 73 74 61 72 74 69 6e 67 20 73 74 61 74 65 20   starting state 
6620: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 69  of the.  ** fini
6630: 74 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65  te state machine
6640: 29 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20 41  ) an action to A
6650: 43 43 45 50 54 20 69 66 20 74 68 65 20 6c 6f 6f  CCEPT if the loo
6660: 6b 61 68 65 61 64 20 69 73 20 74 68 65 0a 20 20  kahead is the.  
6670: 2a 2a 20 73 74 61 72 74 20 6e 6f 6e 74 65 72 6d  ** start nonterm
6680: 69 6e 61 6c 2e 20 20 2a 2f 0a 20 20 41 63 74 69  inal.  */.  Acti
6690: 6f 6e 5f 61 64 64 28 26 6c 65 6d 70 2d 3e 73 6f  on_add(&lemp->so
66a0: 72 74 65 64 5b 30 5d 2d 3e 61 70 2c 41 43 43 45  rted[0]->ap,ACCE
66b0: 50 54 2c 73 70 2c 30 29 3b 0a 0a 20 20 2f 2a 20  PT,sp,0);..  /* 
66c0: 52 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74  Resolve conflict
66d0: 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  s */.  for(i=0; 
66e0: 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
66f0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
6700: 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 6e 61   action *ap, *na
6710: 70 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  p;.    struct st
6720: 61 74 65 20 2a 73 74 70 3b 0a 20 20 20 20 73 74  ate *stp;.    st
6730: 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
6740: 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
6750: 20 73 74 70 2d 3e 61 70 20 29 3b 0a 20 20 20 20   stp->ap );.    
6760: 73 74 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e  stp->ap = Action
6770: 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a  _sort(stp->ap);.
6780: 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
6790: 61 70 3b 20 61 70 20 26 26 20 61 70 2d 3e 6e 65  ap; ap && ap->ne
67a0: 78 74 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  xt; ap=ap->next)
67b0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 6e 61 70 3d  {.      for(nap=
67c0: 61 70 2d 3e 6e 65 78 74 3b 20 6e 61 70 20 26 26  ap->next; nap &&
67d0: 20 6e 61 70 2d 3e 73 70 3d 3d 61 70 2d 3e 73 70   nap->sp==ap->sp
67e0: 3b 20 6e 61 70 3d 6e 61 70 2d 3e 6e 65 78 74 29  ; nap=nap->next)
67f0: 7b 0a 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  {.         /* Th
6800: 65 20 74 77 6f 20 61 63 74 69 6f 6e 73 20 22 61  e two actions "a
6810: 70 22 20 61 6e 64 20 22 6e 61 70 22 20 68 61 76  p" and "nap" hav
6820: 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 6f 6b 61  e the same looka
6830: 68 65 61 64 2e 0a 20 20 20 20 20 20 20 20 20 2a  head..         *
6840: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69  * Figure out whi
6850: 63 68 20 6f 6e 65 20 73 68 6f 75 6c 64 20 62 65  ch one should be
6860: 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20   used */.       
6870: 20 20 6c 65 6d 70 2d 3e 6e 63 6f 6e 66 6c 69 63    lemp->nconflic
6880: 74 20 2b 3d 20 72 65 73 6f 6c 76 65 5f 63 6f 6e  t += resolve_con
6890: 66 6c 69 63 74 28 61 70 2c 6e 61 70 2c 6c 65 6d  flict(ap,nap,lem
68a0: 70 2d 3e 65 72 72 73 79 6d 29 3b 0a 20 20 20 20  p->errsym);.    
68b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
68c0: 20 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72   /* Report an er
68d0: 72 6f 72 20 66 6f 72 20 65 61 63 68 20 72 75 6c  ror for each rul
68e0: 65 20 74 68 61 74 20 63 61 6e 20 6e 65 76 65 72  e that can never
68f0: 20 62 65 20 72 65 64 75 63 65 64 2e 20 2a 2f 0a   be reduced. */.
6900: 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
6910: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
6920: 6e 65 78 74 29 20 72 70 2d 3e 63 61 6e 52 65 64  next) rp->canRed
6930: 75 63 65 20 3d 20 42 5f 46 41 4c 53 45 3b 0a 20  uce = B_FALSE;. 
6940: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
6950: 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
6960: 20 20 20 20 73 74 72 75 63 74 20 61 63 74 69 6f      struct actio
6970: 6e 20 2a 61 70 3b 0a 20 20 20 20 66 6f 72 28 61  n *ap;.    for(a
6980: 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  p=lemp->sorted[i
6990: 5d 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  ]->ap; ap; ap=ap
69a0: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
69b0: 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44  f( ap->type==RED
69c0: 55 43 45 20 29 20 61 70 2d 3e 78 2e 72 70 2d 3e  UCE ) ap->x.rp->
69d0: 63 61 6e 52 65 64 75 63 65 20 3d 20 42 5f 54 52  canReduce = B_TR
69e0: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  UE;.    }.  }.  
69f0: 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
6a00: 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
6a10: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d  xt){.    if( rp-
6a20: 3e 63 61 6e 52 65 64 75 63 65 20 29 20 63 6f 6e  >canReduce ) con
6a30: 74 69 6e 75 65 3b 0a 20 20 20 20 45 72 72 6f 72  tinue;.    Error
6a40: 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  Msg(lemp->filena
6a50: 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c  me,rp->ruleline,
6a60: 22 54 68 69 73 20 72 75 6c 65 20 63 61 6e 20 6e  "This rule can n
6a70: 6f 74 20 62 65 20 72 65 64 75 63 65 64 2e 5c 6e  ot be reduced.\n
6a80: 22 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72  ");.    lemp->er
6a90: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a  rorcnt++;.  }.}.
6aa0: 0a 2f 2a 20 52 65 73 6f 6c 76 65 20 61 20 63 6f  ./* Resolve a co
6ab0: 6e 66 6c 69 63 74 20 62 65 74 77 65 65 6e 20 74  nflict between t
6ac0: 68 65 20 74 77 6f 20 67 69 76 65 6e 20 61 63 74  he two given act
6ad0: 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 0a 2a 2a  ions.  If the.**
6ae0: 20 63 6f 6e 66 6c 69 63 74 20 63 61 6e 27 74 20   conflict can't 
6af0: 62 65 20 72 65 73 6f 6c 76 65 2c 20 72 65 74 75  be resolve, retu
6b00: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  rn non-zero..**.
6b10: 2a 2a 20 4e 4f 20 4c 4f 4e 47 45 52 20 54 52 55  ** NO LONGER TRU
6b20: 45 3a 0a 2a 2a 20 20 20 54 6f 20 72 65 73 6f 6c  E:.**   To resol
6b30: 76 65 20 61 20 63 6f 6e 66 6c 69 63 74 2c 20 66  ve a conflict, f
6b40: 69 72 73 74 20 6c 6f 6f 6b 20 74 6f 20 73 65 65  irst look to see
6b50: 20 69 66 20 65 69 74 68 65 72 20 61 63 74 69 6f   if either actio
6b60: 6e 0a 2a 2a 20 20 20 69 73 20 6f 6e 20 61 6e 20  n.**   is on an 
6b70: 65 72 72 6f 72 20 72 75 6c 65 2e 20 20 49 6e 20  error rule.  In 
6b80: 74 68 61 74 20 63 61 73 65 2c 20 74 61 6b 65 20  that case, take 
6b90: 74 68 65 20 61 63 74 69 6f 6e 20 77 68 69 63 68  the action which
6ba0: 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20 61 73 73  .**   is not ass
6bb0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
6bc0: 20 65 72 72 6f 72 20 72 75 6c 65 2e 20 20 49 66   error rule.  If
6bd0: 20 6e 65 69 74 68 65 72 20 6f 72 20 62 6f 74 68   neither or both
6be0: 0a 2a 2a 20 20 20 61 63 74 69 6f 6e 73 20 61 72  .**   actions ar
6bf0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
6c00: 68 20 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2c  h an error rule,
6c10: 20 74 68 65 6e 20 74 72 79 20 74 6f 0a 2a 2a 20   then try to.** 
6c20: 20 20 75 73 65 20 70 72 65 63 65 64 65 6e 63 65    use precedence
6c30: 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20   to resolve the 
6c40: 63 6f 6e 66 6c 69 63 74 2e 0a 2a 2a 0a 2a 2a 20  conflict..**.** 
6c50: 49 66 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e  If either action
6c60: 20 69 73 20 61 20 53 48 49 46 54 2c 20 74 68 65   is a SHIFT, the
6c70: 6e 20 69 74 20 6d 75 73 74 20 62 65 20 61 70 78  n it must be apx
6c80: 2e 20 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  .  This.** funct
6c90: 69 6f 6e 20 77 6f 6e 27 74 20 77 6f 72 6b 20 69  ion won't work i
6ca0: 66 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44  f apx->type==RED
6cb0: 55 43 45 20 61 6e 64 20 61 70 79 2d 3e 74 79 70  UCE and apy->typ
6cc0: 65 3d 3d 53 48 49 46 54 2e 0a 2a 2f 0a 73 74 61  e==SHIFT..*/.sta
6cd0: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f  tic int resolve_
6ce0: 63 6f 6e 66 6c 69 63 74 28 61 70 78 2c 61 70 79  conflict(apx,apy
6cf0: 2c 65 72 72 73 79 6d 29 0a 73 74 72 75 63 74 20  ,errsym).struct 
6d00: 61 63 74 69 6f 6e 20 2a 61 70 78 3b 0a 73 74 72  action *apx;.str
6d10: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 79 3b  uct action *apy;
6d20: 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
6d30: 65 72 72 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65  errsym;   /* The
6d40: 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c 20 28 69   error symbol (i
6d50: 66 20 64 65 66 69 6e 65 64 2e 20 20 4e 55 4c 4c  f defined.  NULL
6d60: 20 6f 74 68 65 72 77 69 73 65 29 20 2a 2f 0a 7b   otherwise) */.{
6d70: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
6d80: 20 2a 73 70 78 2c 20 2a 73 70 79 3b 0a 20 20 69   *spx, *spy;.  i
6d90: 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20  nt errcnt = 0;. 
6da0: 20 61 73 73 65 72 74 28 20 61 70 78 2d 3e 73 70   assert( apx->sp
6db0: 3d 3d 61 70 79 2d 3e 73 70 20 29 3b 20 20 2f 2a  ==apy->sp );  /*
6dc0: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 72 65   Otherwise there
6dd0: 20 77 6f 75 6c 64 20 62 65 20 6e 6f 20 63 6f 6e   would be no con
6de0: 66 6c 69 63 74 20 2a 2f 0a 20 20 69 66 28 20 61  flict */.  if( a
6df0: 70 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20  px->type==SHIFT 
6e00: 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45  && apy->type==RE
6e10: 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20  DUCE ){.    spx 
6e20: 3d 20 61 70 78 2d 3e 73 70 3b 0a 20 20 20 20 73  = apx->sp;.    s
6e30: 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e  py = apy->x.rp->
6e40: 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28  precsym;.    if(
6e50: 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e   spy==0 || spx->
6e60: 70 72 65 63 3c 30 20 7c 7c 20 73 70 79 2d 3e 70  prec<0 || spy->p
6e70: 72 65 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f  rec<0 ){.      /
6e80: 2a 20 4e 6f 74 20 65 6e 6f 75 67 68 20 70 72 65  * Not enough pre
6e90: 63 65 64 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74  cedence informat
6ea0: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 70  ion. */.      ap
6eb0: 79 2d 3e 74 79 70 65 20 3d 20 43 4f 4e 46 4c 49  y->type = CONFLI
6ec0: 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e 74  CT;.      errcnt
6ed0: 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ++;.    }else if
6ee0: 28 20 73 70 78 2d 3e 70 72 65 63 3e 73 70 79 2d  ( spx->prec>spy-
6ef0: 3e 70 72 65 63 20 29 7b 20 20 20 20 2f 2a 20 4c  >prec ){    /* L
6f00: 6f 77 65 72 20 70 72 65 63 65 64 65 6e 63 65 20  ower precedence 
6f10: 77 69 6e 73 20 2a 2f 0a 20 20 20 20 20 20 61 70  wins */.      ap
6f20: 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53  y->type = RD_RES
6f30: 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65  OLVED;.    }else
6f40: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3c 73   if( spx->prec<s
6f50: 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20  py->prec ){.    
6f60: 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 53 48    apx->type = SH
6f70: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
6f80: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
6f90: 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26  ec==spy->prec &&
6fa0: 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 52 49 47   spx->assoc==RIG
6fb0: 48 54 20 29 7b 20 2f 2a 20 55 73 65 20 6f 70 65  HT ){ /* Use ope
6fc0: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 61  rator */.      a
6fd0: 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45  py->type = RD_RE
6fe0: 53 4f 4c 56 45 44 3b 20 20 20 20 20 20 20 20 20  SOLVED;         
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7000: 20 20 20 20 2f 2a 20 61 73 73 6f 63 69 61 74 69      /* associati
7010: 76 69 74 79 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  vity */.    }els
7020: 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3d  e if( spx->prec=
7030: 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70  =spy->prec && sp
7040: 78 2d 3e 61 73 73 6f 63 3d 3d 4c 45 46 54 20 29  x->assoc==LEFT )
7050: 7b 20 20 2f 2a 20 74 6f 20 62 72 65 61 6b 20 74  {  /* to break t
7060: 69 65 20 2a 2f 0a 20 20 20 20 20 20 61 70 78 2d  ie */.      apx-
7070: 3e 74 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c  >type = SH_RESOL
7080: 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  VED;.    }else{.
7090: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 70        assert( sp
70a0: 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72  x->prec==spy->pr
70b0: 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63  ec && spx->assoc
70c0: 3d 3d 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  ==NONE );.      
70d0: 61 70 79 2d 3e 74 79 70 65 20 3d 20 43 4f 4e 46  apy->type = CONF
70e0: 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63  LICT;.      errc
70f0: 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  nt++;.    }.  }e
7100: 6c 73 65 20 69 66 28 20 61 70 78 2d 3e 74 79 70  lse if( apx->typ
7110: 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70 79  e==REDUCE && apy
7120: 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29  ->type==REDUCE )
7130: 7b 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d  {.    spx = apx-
7140: 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a  >x.rp->precsym;.
7150: 20 20 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78      spy = apy->x
7160: 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20  .rp->precsym;.  
7170: 20 20 69 66 28 20 73 70 78 3d 3d 30 20 7c 7c 20    if( spx==0 || 
7180: 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70  spy==0 || spx->p
7190: 72 65 63 3c 30 20 7c 7c 0a 20 20 20 20 73 70 79  rec<0 ||.    spy
71a0: 2d 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70 78 2d  ->prec<0 || spx-
71b0: 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63  >prec==spy->prec
71c0: 20 29 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   ){.      apy->t
71d0: 79 70 65 20 3d 20 43 4f 4e 46 4c 49 43 54 3b 0a  ype = CONFLICT;.
71e0: 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a        errcnt++;.
71f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
7200: 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72 65  x->prec>spy->pre
7210: 63 20 29 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e  c ){.      apy->
7220: 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56  type = RD_RESOLV
7230: 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ED;.    }else if
7240: 28 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d  ( spx->prec<spy-
7250: 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61  >prec ){.      a
7260: 70 78 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45  px->type = RD_RE
7270: 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SOLVED;.    }.  
7280: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
7290: 74 28 20 0a 20 20 20 20 20 20 61 70 78 2d 3e 74  t( .      apx->t
72a0: 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44  ype==SH_RESOLVED
72b0: 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   ||.      apx->t
72c0: 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44  ype==RD_RESOLVED
72d0: 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   ||.      apx->t
72e0: 79 70 65 3d 3d 43 4f 4e 46 4c 49 43 54 20 7c 7c  ype==CONFLICT ||
72f0: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
7300: 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c  ==SH_RESOLVED ||
7310: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
7320: 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c  ==RD_RESOLVED ||
7330: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
7340: 3d 3d 43 4f 4e 46 4c 49 43 54 0a 20 20 20 20 29  ==CONFLICT.    )
7350: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 52 45 44  ;.    /* The RED
7360: 55 43 45 2f 53 48 49 46 54 20 63 61 73 65 20 63  UCE/SHIFT case c
7370: 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20 62 65 63  annot happen bec
7380: 61 75 73 65 20 53 48 49 46 54 73 20 63 6f 6d 65  ause SHIFTs come
7390: 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 52   before.    ** R
73a0: 45 44 55 43 45 73 20 6f 6e 20 74 68 65 20 6c 69  EDUCEs on the li
73b0: 73 74 2e 20 20 49 66 20 77 65 20 72 65 61 63 68  st.  If we reach
73c0: 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d   this point it m
73d0: 75 73 74 20 62 65 20 62 65 63 61 75 73 65 0a 20  ust be because. 
73e0: 20 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65 72     ** the parser
73f0: 20 63 6f 6e 66 6c 69 63 74 20 68 61 64 20 61 6c   conflict had al
7400: 72 65 61 64 79 20 62 65 65 6e 20 72 65 73 6f 6c  ready been resol
7410: 76 65 64 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  ved. */.  }.  re
7420: 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 2f  turn errcnt;.}./
7430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7440: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
7450: 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e  ile "configlist.
7460: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
7470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
7480: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
7490: 70 72 6f 63 65 73 73 69 6e 67 20 61 20 63 6f 6e  processing a con
74a0: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
74b0: 61 6e 64 20 62 75 69 6c 64 69 6e 67 20 61 20 73  and building a s
74c0: 74 61 74 65 0a 2a 2a 20 69 6e 20 74 68 65 20 4c  tate.** in the L
74d0: 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
74e0: 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69  rator..*/..stati
74f0: 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  c struct config 
7500: 2a 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 20 20  *freelist = 0;  
7510: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
7520: 72 65 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ree configuratio
7530: 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ns */.static str
7540: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 75 72 72  uct config *curr
7550: 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ent = 0;       /
7560: 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66  * Top of list of
7570: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
7580: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
7590: 20 63 6f 6e 66 69 67 20 2a 2a 63 75 72 72 65 6e   config **curren
75a0: 74 65 6e 64 20 3d 20 30 3b 20 20 20 2f 2a 20 4c  tend = 0;   /* L
75b0: 61 73 74 20 6f 6e 20 6c 69 73 74 20 6f 66 20 63  ast on list of c
75c0: 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74 69 63  onfigs */.static
75d0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
75e0: 62 61 73 69 73 20 3d 20 30 3b 20 20 20 20 20 20  basis = 0;      
75f0: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69 73     /* Top of lis
7600: 74 20 6f 66 20 62 61 73 69 73 20 63 6f 6e 66 69  t of basis confi
7610: 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  gs */.static str
7620: 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a 62 61 73  uct config **bas
7630: 69 73 65 6e 64 20 3d 20 30 3b 20 20 20 20 20 2f  isend = 0;     /
7640: 2a 20 45 6e 64 20 6f 66 20 6c 69 73 74 20 6f 66  * End of list of
7650: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 73 20 2a   basis configs *
7660: 2f 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  /../* Return a p
7670: 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
7680: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f  configuration */
7690: 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74 20  .PRIVATE struct 
76a0: 63 6f 6e 66 69 67 20 2a 6e 65 77 63 6f 6e 66 69  config *newconfi
76b0: 67 28 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  g(){.  struct co
76c0: 6e 66 69 67 20 2a 6e 65 77 3b 0a 20 20 69 66 28  nfig *new;.  if(
76d0: 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a   freelist==0 ){.
76e0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
76f0: 6e 74 20 61 6d 74 20 3d 20 33 3b 0a 20 20 20 20  nt amt = 3;.    
7700: 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75  freelist = (stru
7710: 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d 61 6c 6c  ct config *)mall
7720: 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
7730: 74 20 63 6f 6e 66 69 67 29 2a 61 6d 74 20 29 3b  t config)*amt );
7740: 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c 69 73  .    if( freelis
7750: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  t==0 ){.      fp
7760: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e  rintf(stderr,"Un
7770: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
7780: 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65   memory for a ne
7790: 77 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  w configuration.
77a0: 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  ");.      exit(1
77b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
77c0: 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69  (i=0; i<amt-1; i
77d0: 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e  ++) freelist[i].
77e0: 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69 73 74  next = &freelist
77f0: 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c  [i+1];.    freel
7800: 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20  ist[amt-1].next 
7810: 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 20 3d  = 0;.  }.  new =
7820: 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65   freelist;.  fre
7830: 65 6c 69 73 74 20 3d 20 66 72 65 65 6c 69 73 74  elist = freelist
7840: 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e  ->next;.  return
7850: 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20   new;.}../* The 
7860: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 6f  configuration "o
7870: 6c 64 22 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  ld" is no longer
7880: 20 75 73 65 64 20 2a 2f 0a 50 52 49 56 41 54 45   used */.PRIVATE
7890: 20 76 6f 69 64 20 64 65 6c 65 74 65 63 6f 6e 66   void deleteconf
78a0: 69 67 28 6f 6c 64 29 0a 73 74 72 75 63 74 20 63  ig(old).struct c
78b0: 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 7b 0a 20 20  onfig *old;.{.  
78c0: 6f 6c 64 2d 3e 6e 65 78 74 20 3d 20 66 72 65 65  old->next = free
78d0: 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74  list;.  freelist
78e0: 20 3d 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 49 6e   = old;.}../* In
78f0: 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63 6f  itialized the co
7900: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
7910: 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64   builder */.void
7920: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74   Configlist_init
7930: 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20  (){.  current = 
7940: 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20  0;.  currentend 
7950: 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20 62 61  = &current;.  ba
7960: 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73  sis = 0;.  basis
7970: 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a 20 20  end = &basis;.  
7980: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74  Configtable_init
7990: 28 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  ();.  return;.}.
79a0: 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64 20  ./* Initialized 
79b0: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
79c0: 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20 2a  n list builder *
79d0: 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  /.void Configlis
79e0: 74 5f 72 65 73 65 74 28 29 7b 0a 20 20 63 75 72  t_reset(){.  cur
79f0: 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72  rent = 0;.  curr
7a00: 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65 6e  entend = &curren
7a10: 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a  t;.  basis = 0;.
7a20: 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62 61    basisend = &ba
7a30: 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62  sis;.  Configtab
7a40: 6c 65 5f 63 6c 65 61 72 28 30 29 3b 0a 20 20 72  le_clear(0);.  r
7a50: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64  eturn;.}../* Add
7a60: 20 61 6e 6f 74 68 65 72 20 63 6f 6e 66 69 67 75   another configu
7a70: 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 6f  ration to the co
7a80: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
7a90: 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69   */.struct confi
7aa0: 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  g *Configlist_ad
7ab0: 64 28 72 70 2c 64 6f 74 29 0a 73 74 72 75 63 74  d(rp,dot).struct
7ac0: 20 72 75 6c 65 20 2a 72 70 3b 20 20 20 20 2f 2a   rule *rp;    /*
7ad0: 20 54 68 65 20 72 75 6c 65 20 2a 2f 0a 69 6e 74   The rule */.int
7ae0: 20 64 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20   dot;           
7af0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74   /* Index into t
7b00: 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 72 75  he RHS of the ru
7b10: 6c 65 20 77 68 65 72 65 20 74 68 65 20 64 6f 74  le where the dot
7b20: 20 67 6f 65 73 20 2a 2f 0a 7b 0a 20 20 73 74 72   goes */.{.  str
7b30: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c  uct config *cfp,
7b40: 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65 72   model;..  asser
7b50: 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30  t( currentend!=0
7b60: 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d   );.  model.rp =
7b70: 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74   rp;.  model.dot
7b80: 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20   = dot;.  cfp = 
7b90: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64  Configtable_find
7ba0: 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20  (&model);.  if( 
7bb0: 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66  cfp==0 ){.    cf
7bc0: 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b  p = newconfig();
7bd0: 0a 20 20 20 20 63 66 70 2d 3e 72 70 20 3d 20 72  .    cfp->rp = r
7be0: 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74 20  p;.    cfp->dot 
7bf0: 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e  = dot;.    cfp->
7c00: 66 77 73 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a  fws = SetNew();.
7c10: 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 30      cfp->stp = 0
7c20: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c 70 20  ;.    cfp->fplp 
7c30: 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b  = cfp->bplp = 0;
7c40: 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d  .    cfp->next =
7c50: 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70 20   0;.    cfp->bp 
7c60: 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e  = 0;.    *curren
7c70: 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20  tend = cfp;.    
7c80: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 66  currentend = &cf
7c90: 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 43 6f 6e  p->next;.    Con
7ca0: 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
7cb0: 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  cfp);.  }.  retu
7cc0: 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 41 64  rn cfp;.}../* Ad
7cd0: 64 20 61 20 62 61 73 69 73 20 63 6f 6e 66 69 67  d a basis config
7ce0: 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63  uration to the c
7cf0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
7d00: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
7d10: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61  ig *Configlist_a
7d20: 64 64 62 61 73 69 73 28 72 70 2c 64 6f 74 29 0a  ddbasis(rp,dot).
7d30: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
7d40: 0a 69 6e 74 20 64 6f 74 3b 0a 7b 0a 20 20 73 74  .int dot;.{.  st
7d50: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
7d60: 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65  , model;..  asse
7d70: 72 74 28 20 62 61 73 69 73 65 6e 64 21 3d 30 20  rt( basisend!=0 
7d80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
7d90: 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20  rentend!=0 );.  
7da0: 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20  model.rp = rp;. 
7db0: 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74   model.dot = dot
7dc0: 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67  ;.  cfp = Config
7dd0: 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65  table_find(&mode
7de0: 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30  l);.  if( cfp==0
7df0: 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65   ){.    cfp = ne
7e00: 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63  wconfig();.    c
7e10: 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20  fp->rp = rp;.   
7e20: 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b   cfp->dot = dot;
7e30: 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20  .    cfp->fws = 
7e40: 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66  SetNew();.    cf
7e50: 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20  p->stp = 0;.    
7e60: 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d  cfp->fplp = cfp-
7e70: 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63  >bplp = 0;.    c
7e80: 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  fp->next = 0;.  
7e90: 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20    cfp->bp = 0;. 
7ea0: 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d     *currentend =
7eb0: 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e   cfp;.    curren
7ec0: 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78  tend = &cfp->nex
7ed0: 74 3b 0a 20 20 20 20 2a 62 61 73 69 73 65 6e 64  t;.    *basisend
7ee0: 20 3d 20 63 66 70 3b 0a 20 20 20 20 62 61 73 69   = cfp;.    basi
7ef0: 73 65 6e 64 20 3d 20 26 63 66 70 2d 3e 62 70 3b  send = &cfp->bp;
7f00: 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c 65  .    Configtable
7f10: 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20 20  _insert(cfp);.  
7f20: 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b 0a  }.  return cfp;.
7f30: 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  }../* Compute th
7f40: 65 20 63 6c 6f 73 75 72 65 20 6f 66 20 74 68 65  e closure of the
7f50: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
7f60: 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  ist */.void Conf
7f70: 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c  iglist_closure(l
7f80: 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
7f90: 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72  n *lemp;.{.  str
7fa0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c  uct config *cfp,
7fb0: 20 2a 6e 65 77 63 66 70 3b 0a 20 20 73 74 72 75   *newcfp;.  stru
7fc0: 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 6e 65  ct rule *rp, *ne
7fd0: 77 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79  wrp;.  struct sy
7fe0: 6d 62 6f 6c 20 2a 73 70 2c 20 2a 78 73 70 3b 0a  mbol *sp, *xsp;.
7ff0: 20 20 69 6e 74 20 69 2c 20 64 6f 74 3b 0a 0a 20    int i, dot;.. 
8000: 20 61 73 73 65 72 74 28 20 63 75 72 72 65 6e 74   assert( current
8010: 65 6e 64 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  end!=0 );.  for(
8020: 63 66 70 3d 63 75 72 72 65 6e 74 3b 20 63 66 70  cfp=current; cfp
8030: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
8040: 7b 0a 20 20 20 20 72 70 20 3d 20 63 66 70 2d 3e  {.    rp = cfp->
8050: 72 70 3b 0a 20 20 20 20 64 6f 74 20 3d 20 63 66  rp;.    dot = cf
8060: 70 2d 3e 64 6f 74 3b 0a 20 20 20 20 69 66 28 20  p->dot;.    if( 
8070: 64 6f 74 3e 3d 72 70 2d 3e 6e 72 68 73 20 29 20  dot>=rp->nrhs ) 
8080: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 70  continue;.    sp
8090: 20 3d 20 72 70 2d 3e 72 68 73 5b 64 6f 74 5d 3b   = rp->rhs[dot];
80a0: 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70  .    if( sp->typ
80b0: 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 29  e==NONTERMINAL )
80c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e  {.      if( sp->
80d0: 72 75 6c 65 3d 3d 30 20 26 26 20 73 70 21 3d 6c  rule==0 && sp!=l
80e0: 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20  emp->errsym ){. 
80f0: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
8100: 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72  lemp->filename,r
8110: 70 2d 3e 6c 69 6e 65 2c 22 4e 6f 6e 74 65 72 6d  p->line,"Nonterm
8120: 69 6e 61 6c 20 5c 22 25 73 5c 22 20 68 61 73 20  inal \"%s\" has 
8130: 6e 6f 20 72 75 6c 65 73 2e 22 2c 0a 20 20 20 20  no rules.",.    
8140: 20 20 20 20 20 20 73 70 2d 3e 6e 61 6d 65 29 3b        sp->name);
8150: 0a 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65  .        lemp->e
8160: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
8170: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e 65 77   }.      for(new
8180: 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 6e 65 77  rp=sp->rule; new
8190: 72 70 3b 20 6e 65 77 72 70 3d 6e 65 77 72 70 2d  rp; newrp=newrp-
81a0: 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20 20 20  >nextlhs){.     
81b0: 20 20 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66     newcfp = Conf
81c0: 69 67 6c 69 73 74 5f 61 64 64 28 6e 65 77 72 70  iglist_add(newrp
81d0: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ,0);.        for
81e0: 28 69 3d 64 6f 74 2b 31 3b 20 69 3c 72 70 2d 3e  (i=dot+1; i<rp->
81f0: 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
8200: 20 20 20 20 20 20 78 73 70 20 3d 20 72 70 2d 3e        xsp = rp->
8210: 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  rhs[i];.        
8220: 20 20 69 66 28 20 78 73 70 2d 3e 74 79 70 65 3d    if( xsp->type=
8230: 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  =TERMINAL ){.   
8240: 20 20 20 20 20 20 20 20 20 53 65 74 41 64 64 28           SetAdd(
8250: 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d  newcfp->fws,xsp-
8260: 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20  >index);.       
8270: 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 20 20 7d       break;..  }
8280: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8290: 20 20 53 65 74 55 6e 69 6f 6e 28 6e 65 77 63 66    SetUnion(newcf
82a0: 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 66 69 72 73  p->fws,xsp->firs
82b0: 74 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tset);.         
82c0: 20 20 20 69 66 28 20 78 73 70 2d 3e 6c 61 6d 62     if( xsp->lamb
82d0: 64 61 3d 3d 42 5f 46 41 4c 53 45 20 29 20 62 72  da==B_FALSE ) br
82e0: 65 61 6b 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20  eak;..  }..}.   
82f0: 20 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e       if( i==rp->
8300: 6e 72 68 73 20 29 20 50 6c 69 6e 6b 5f 61 64 64  nrhs ) Plink_add
8310: 28 26 63 66 70 2d 3e 66 70 6c 70 2c 6e 65 77 63  (&cfp->fplp,newc
8320: 66 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  fp);.      }.   
8330: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b   }.  }.  return;
8340: 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20  .}../* Sort the 
8350: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
8360: 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  st */.void Confi
8370: 67 6c 69 73 74 5f 73 6f 72 74 28 29 7b 0a 20 20  glist_sort(){.  
8380: 63 75 72 72 65 6e 74 20 3d 20 28 73 74 72 75 63  current = (struc
8390: 74 20 63 6f 6e 66 69 67 20 2a 29 6d 73 6f 72 74  t config *)msort
83a0: 28 63 75 72 72 65 6e 74 2c 26 28 63 75 72 72 65  (current,&(curre
83b0: 6e 74 2d 3e 6e 65 78 74 29 2c 43 6f 6e 66 69 67  nt->next),Config
83c0: 63 6d 70 29 3b 0a 20 20 63 75 72 72 65 6e 74 65  cmp);.  currente
83d0: 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  nd = 0;.  return
83e0: 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65  ;.}../* Sort the
83f0: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
8400: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69  tion list */.voi
8410: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72  d Configlist_sor
8420: 74 62 61 73 69 73 28 29 7b 0a 20 20 62 61 73 69  tbasis(){.  basi
8430: 73 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66  s = (struct conf
8440: 69 67 20 2a 29 6d 73 6f 72 74 28 63 75 72 72 65  ig *)msort(curre
8450: 6e 74 2c 26 28 63 75 72 72 65 6e 74 2d 3e 62 70  nt,&(current->bp
8460: 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20  ),Configcmp);.  
8470: 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20  basisend = 0;.  
8480: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65  return;.}../* Re
8490: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
84a0: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
84b0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
84c0: 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65  list and.** rese
84d0: 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74  t the list */.st
84e0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
84f0: 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29  figlist_return()
8500: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
8510: 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20  g *old;.  old = 
8520: 63 75 72 72 65 6e 74 3b 0a 20 20 63 75 72 72 65  current;.  curre
8530: 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e  nt = 0;.  curren
8540: 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  tend = 0;.  retu
8550: 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 52 65  rn old;.}../* Re
8560: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
8570: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
8580: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
8590: 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65  list and.** rese
85a0: 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74  t the list */.st
85b0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
85c0: 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29 7b  figlist_basis(){
85d0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
85e0: 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 62   *old;.  old = b
85f0: 61 73 69 73 3b 0a 20 20 62 61 73 69 73 20 3d 20  asis;.  basis = 
8600: 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20  0;.  basisend = 
8610: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b  0;.  return old;
8620: 0a 7d 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20  .}../* Free all 
8630: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
8640: 67 69 76 65 6e 20 63 6f 6e 66 69 67 75 72 61 74  given configurat
8650: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  ion list */.void
8660: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28   Configlist_eat(
8670: 63 66 70 29 0a 73 74 72 75 63 74 20 63 6f 6e 66  cfp).struct conf
8680: 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72  ig *cfp;.{.  str
8690: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 78 74  uct config *next
86a0: 63 66 70 3b 0a 20 20 66 6f 72 28 3b 20 63 66 70  cfp;.  for(; cfp
86b0: 3b 20 63 66 70 3d 6e 65 78 74 63 66 70 29 7b 0a  ; cfp=nextcfp){.
86c0: 20 20 20 20 6e 65 78 74 63 66 70 20 3d 20 63 66      nextcfp = cf
86d0: 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 61 73 73  p->next;.    ass
86e0: 65 72 74 28 20 63 66 70 2d 3e 66 70 6c 70 3d 3d  ert( cfp->fplp==
86f0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8700: 20 63 66 70 2d 3e 62 70 6c 70 3d 3d 30 20 29 3b   cfp->bplp==0 );
8710: 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 66 77  .    if( cfp->fw
8720: 73 20 29 20 53 65 74 46 72 65 65 28 63 66 70 2d  s ) SetFree(cfp-
8730: 3e 66 77 73 29 3b 0a 20 20 20 20 64 65 6c 65 74  >fws);.    delet
8740: 65 63 6f 6e 66 69 67 28 63 66 70 29 3b 0a 20 20  econfig(cfp);.  
8750: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 2f 2a  }.  return;.}./*
8760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8770: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
8780: 65 72 72 6f 72 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  error.c" *******
8790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
87a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
87b0: 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 69 6e 74  * Code for print
87c0: 69 6e 67 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ing error messag
87d0: 65 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e 64 20 61  e..*/../* Find a
87e0: 20 67 6f 6f 64 20 70 6c 61 63 65 20 74 6f 20 62   good place to b
87f0: 72 65 61 6b 20 22 6d 73 67 22 20 73 6f 20 74 68  reak "msg" so th
8800: 61 74 20 69 74 73 20 6c 65 6e 67 74 68 20 69 73  at its length is
8810: 20 61 74 20 6c 65 61 73 74 20 22 6d 69 6e 22 0a   at least "min".
8820: 2a 2a 20 62 75 74 20 6e 6f 20 6d 6f 72 65 20 74  ** but no more t
8830: 68 61 6e 20 22 6d 61 78 22 2e 20 20 4d 61 6b 65  han "max".  Make
8840: 20 74 68 65 20 70 6f 69 6e 74 20 61 73 20 63 6c   the point as cl
8850: 6f 73 65 20 74 6f 20 6d 61 78 20 61 73 20 70 6f  ose to max as po
8860: 73 73 69 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  ssible..*/.stati
8870: 63 20 69 6e 74 20 66 69 6e 64 62 72 65 61 6b 28  c int findbreak(
8880: 6d 73 67 2c 6d 69 6e 2c 6d 61 78 29 0a 63 68 61  msg,min,max).cha
8890: 72 20 2a 6d 73 67 3b 0a 69 6e 74 20 6d 69 6e 3b  r *msg;.int min;
88a0: 0a 69 6e 74 20 6d 61 78 3b 0a 7b 0a 20 20 69 6e  .int max;.{.  in
88b0: 74 20 69 2c 73 70 6f 74 3b 0a 20 20 63 68 61 72  t i,spot;.  char
88c0: 20 63 3b 0a 20 20 66 6f 72 28 69 3d 73 70 6f 74   c;.  for(i=spot
88d0: 3d 6d 69 6e 3b 20 69 3c 3d 6d 61 78 3b 20 69 2b  =min; i<=max; i+
88e0: 2b 29 7b 0a 20 20 20 20 63 20 3d 20 6d 73 67 5b  +){.    c = msg[
88f0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  i];.    if( c=='
8900: 5c 74 27 20 29 20 6d 73 67 5b 69 5d 20 3d 20 27  \t' ) msg[i] = '
8910: 20 27 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   ';.    if( c=='
8920: 5c 6e 27 20 29 7b 20 6d 73 67 5b 69 5d 20 3d 20  \n' ){ msg[i] = 
8930: 27 20 27 3b 20 73 70 6f 74 20 3d 20 69 3b 20 62  ' '; spot = i; b
8940: 72 65 61 6b 3b 20 7d 0a 20 20 20 20 69 66 28 20  reak; }.    if( 
8950: 63 3d 3d 30 20 29 7b 20 73 70 6f 74 20 3d 20 69  c==0 ){ spot = i
8960: 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 69  ; break; }.    i
8970: 66 28 20 63 3d 3d 27 2d 27 20 26 26 20 69 3c 6d  f( c=='-' && i<m
8980: 61 78 2d 31 20 29 20 73 70 6f 74 20 3d 20 69 2b  ax-1 ) spot = i+
8990: 31 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 20  1;.    if( c==' 
89a0: 27 20 29 20 73 70 6f 74 20 3d 20 69 3b 0a 20 20  ' ) spot = i;.  
89b0: 7d 0a 20 20 72 65 74 75 72 6e 20 73 70 6f 74 3b  }.  return spot;
89c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 72  .}../*.** The er
89d0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
89e0: 70 6c 69 74 20 61 63 72 6f 73 73 20 6d 75 6c 74  plit across mult
89f0: 69 70 6c 65 20 6c 69 6e 65 73 20 69 66 20 6e 65  iple lines if ne
8a00: 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a  cessary.  The.**
8a10: 20 73 70 6c 69 74 73 20 6f 63 63 75 72 20 61 74   splits occur at
8a20: 20 61 20 73 70 61 63 65 2c 20 69 66 20 74 68 65   a space, if the
8a30: 72 65 20 69 73 20 61 20 73 70 61 63 65 20 61 76  re is a space av
8a40: 61 69 6c 61 62 6c 65 20 6e 65 61 72 20 74 68 65  ailable near the
8a50: 20 65 6e 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6c   end.** of the l
8a60: 69 6e 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ine..*/.#define 
8a70: 45 52 52 4d 53 47 53 49 5a 45 20 20 31 30 30 30  ERRMSGSIZE  1000
8a80: 30 20 2f 2a 20 48 6f 70 65 20 74 68 69 73 20 69  0 /* Hope this i
8a90: 73 20 62 69 67 20 65 6e 6f 75 67 68 2e 20 20 4e  s big enough.  N
8aa0: 6f 20 77 61 79 20 74 6f 20 65 72 72 6f 72 20 63  o way to error c
8ab0: 68 65 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  heck */.#define 
8ac0: 4c 49 4e 45 57 49 44 54 48 20 20 20 20 20 20 37  LINEWIDTH      7
8ad0: 39 20 2f 2a 20 4d 61 78 20 77 69 64 74 68 20 6f  9 /* Max width o
8ae0: 66 20 61 6e 79 20 6f 75 74 70 75 74 20 6c 69 6e  f any output lin
8af0: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 45  e */.#define PRE
8b00: 46 49 58 4c 49 4d 49 54 20 20 20 20 33 30 20 2f  FIXLIMIT    30 /
8b10: 2a 20 4d 61 78 20 77 69 64 74 68 20 6f 66 20 74  * Max width of t
8b20: 68 65 20 70 72 65 66 69 78 20 6f 6e 20 65 61 63  he prefix on eac
8b30: 68 20 6c 69 6e 65 20 2a 2f 0a 76 6f 69 64 20 45  h line */.void E
8b40: 72 72 6f 72 4d 73 67 28 76 61 5f 61 6c 69 73 74  rrorMsg(va_alist
8b50: 29 0a 76 61 5f 64 63 6c 0a 7b 0a 20 20 63 68 61  ).va_dcl.{.  cha
8b60: 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 0a 20 20 69  r *filename;.  i
8b70: 6e 74 20 6c 69 6e 65 6e 6f 3b 0a 20 20 63 68 61  nt lineno;.  cha
8b80: 72 20 2a 66 6f 72 6d 61 74 3b 0a 20 20 63 68 61  r *format;.  cha
8b90: 72 20 65 72 72 6d 73 67 5b 45 52 52 4d 53 47 53  r errmsg[ERRMSGS
8ba0: 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70 72 65  IZE];.  char pre
8bb0: 66 69 78 5b 50 52 45 46 49 58 4c 49 4d 49 54 2b  fix[PREFIXLIMIT+
8bc0: 31 30 5d 3b 0a 20 20 69 6e 74 20 65 72 72 6d 73  10];.  int errms
8bd0: 67 73 69 7a 65 3b 0a 20 20 69 6e 74 20 70 72 65  gsize;.  int pre
8be0: 66 69 78 73 69 7a 65 3b 0a 20 20 69 6e 74 20 61  fixsize;.  int a
8bf0: 76 61 69 6c 61 62 6c 65 77 69 64 74 68 3b 0a 20  vailablewidth;. 
8c00: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
8c10: 6e 74 20 65 6e 64 2c 20 72 65 73 74 61 72 74 2c  nt end, restart,
8c20: 20 62 61 73 65 3b 0a 0a 20 20 76 61 5f 73 74 61   base;..  va_sta
8c30: 72 74 28 61 70 29 3b 0a 20 20 66 69 6c 65 6e 61  rt(ap);.  filena
8c40: 6d 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 63  me = va_arg(ap,c
8c50: 68 61 72 2a 29 3b 0a 20 20 6c 69 6e 65 6e 6f 20  har*);.  lineno 
8c60: 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
8c70: 3b 0a 20 20 66 6f 72 6d 61 74 20 3d 20 76 61 5f  ;.  format = va_
8c80: 61 72 67 28 61 70 2c 63 68 61 72 2a 29 3b 0a 20  arg(ap,char*);. 
8c90: 20 2f 2a 20 50 72 65 70 61 72 65 20 61 20 70 72   /* Prepare a pr
8ca0: 65 66 69 78 20 74 6f 20 62 65 20 70 72 65 70 65  efix to be prepe
8cb0: 6e 64 65 64 20 74 6f 20 65 76 65 72 79 20 6f 75  nded to every ou
8cc0: 74 70 75 74 20 6c 69 6e 65 20 2a 2f 0a 20 20 69  tput line */.  i
8cd0: 66 28 20 6c 69 6e 65 6e 6f 3e 30 20 29 7b 0a 20  f( lineno>0 ){. 
8ce0: 20 20 20 73 70 72 69 6e 74 66 28 70 72 65 66 69     sprintf(prefi
8cf0: 78 2c 22 25 2e 2a 73 3a 25 64 3a 20 22 2c 50 52  x,"%.*s:%d: ",PR
8d00: 45 46 49 58 4c 49 4d 49 54 2d 31 30 2c 66 69 6c  EFIXLIMIT-10,fil
8d10: 65 6e 61 6d 65 2c 6c 69 6e 65 6e 6f 29 3b 0a 20  ename,lineno);. 
8d20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69   }else{.    spri
8d30: 6e 74 66 28 70 72 65 66 69 78 2c 22 25 2e 2a 73  ntf(prefix,"%.*s
8d40: 3a 20 22 2c 50 52 45 46 49 58 4c 49 4d 49 54 2d  : ",PREFIXLIMIT-
8d50: 31 30 2c 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  10,filename);.  
8d60: 7d 0a 20 20 70 72 65 66 69 78 73 69 7a 65 20 3d  }.  prefixsize =
8d70: 20 73 74 72 6c 65 6e 28 70 72 65 66 69 78 29 3b   strlen(prefix);
8d80: 0a 20 20 61 76 61 69 6c 61 62 6c 65 77 69 64 74  .  availablewidt
8d90: 68 20 3d 20 4c 49 4e 45 57 49 44 54 48 20 2d 20  h = LINEWIDTH - 
8da0: 70 72 65 66 69 78 73 69 7a 65 3b 0a 0a 20 20 2f  prefixsize;..  /
8db0: 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65  * Generate the e
8dc0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a  rror message */.
8dd0: 20 20 76 73 70 72 69 6e 74 66 28 65 72 72 6d 73    vsprintf(errms
8de0: 67 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 20  g,format,ap);.  
8df0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 65 72  va_end(ap);.  er
8e00: 72 6d 73 67 73 69 7a 65 20 3d 20 73 74 72 6c 65  rmsgsize = strle
8e10: 6e 28 65 72 72 6d 73 67 29 3b 0a 20 20 2f 2a 20  n(errmsg);.  /* 
8e20: 52 65 6d 6f 76 65 20 74 72 61 69 6c 69 6e 67 20  Remove trailing 
8e30: 27 5c 6e 27 73 20 66 72 6f 6d 20 74 68 65 20 65  '\n's from the e
8e40: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 2a 2f  rror message. */
8e50: 0a 20 20 77 68 69 6c 65 28 20 65 72 72 6d 73 67  .  while( errmsg
8e60: 73 69 7a 65 3e 30 20 26 26 20 65 72 72 6d 73 67  size>0 && errmsg
8e70: 5b 65 72 72 6d 73 67 73 69 7a 65 2d 31 5d 3d 3d  [errmsgsize-1]==
8e80: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 65 72 72  '\n' ){.     err
8e90: 6d 73 67 5b 2d 2d 65 72 72 6d 73 67 73 69 7a 65  msg[--errmsgsize
8ea0: 5d 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ] = 0;.  }..  /*
8eb0: 20 50 72 69 6e 74 20 74 68 65 20 65 72 72 6f 72   Print the error
8ec0: 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 62 61   message */.  ba
8ed0: 73 65 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  se = 0;.  while(
8ee0: 20 65 72 72 6d 73 67 5b 62 61 73 65 5d 21 3d 30   errmsg[base]!=0
8ef0: 20 29 7b 0a 20 20 20 20 65 6e 64 20 3d 20 72 65   ){.    end = re
8f00: 73 74 61 72 74 20 3d 20 66 69 6e 64 62 72 65 61  start = findbrea
8f10: 6b 28 26 65 72 72 6d 73 67 5b 62 61 73 65 5d 2c  k(&errmsg[base],
8f20: 30 2c 61 76 61 69 6c 61 62 6c 65 77 69 64 74 68  0,availablewidth
8f30: 29 3b 0a 20 20 20 20 72 65 73 74 61 72 74 20 2b  );.    restart +
8f40: 3d 20 62 61 73 65 3b 0a 20 20 20 20 77 68 69 6c  = base;.    whil
8f50: 65 28 20 65 72 72 6d 73 67 5b 72 65 73 74 61 72  e( errmsg[restar
8f60: 74 5d 3d 3d 27 20 27 20 29 20 72 65 73 74 61 72  t]==' ' ) restar
8f70: 74 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  t++;.    fprintf
8f80: 28 73 74 64 6f 75 74 2c 22 25 73 25 2e 2a 73 5c  (stdout,"%s%.*s\
8f90: 6e 22 2c 70 72 65 66 69 78 2c 65 6e 64 2c 26 65  n",prefix,end,&e
8fa0: 72 72 6d 73 67 5b 62 61 73 65 5d 29 3b 0a 20 20  rrmsg[base]);.  
8fb0: 20 20 62 61 73 65 20 3d 20 72 65 73 74 61 72 74    base = restart
8fc0: 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ;.  }.}./*******
8fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
8fe0: 68 65 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63 22  he file "main.c"
8ff0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
9000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9010: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69  *****/./*.** Mai
9020: 6e 20 70 72 6f 67 72 61 6d 20 66 69 6c 65 20 66  n program file f
9030: 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  or the LEMON par
9040: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
9050: 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20  /../* Report an 
9060: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f  out-of-memory co
9070: 6e 64 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72  ndition and abor
9080: 74 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  t.  This functio
9090: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f 73  n.** is used mos
90a0: 74 6c 79 20 62 79 20 74 68 65 20 22 4d 65 6d 6f  tly by the "Memo
90b0: 72 79 43 68 65 63 6b 22 20 6d 61 63 72 6f 20 69  ryCheck" macro i
90c0: 6e 20 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f  n struct.h.*/.vo
90d0: 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  id memory_error(
90e0: 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  ){.  fprintf(std
90f0: 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f  err,"Out of memo
9100: 72 79 2e 20 20 41 62 6f 72 74 69 6e 67 2e 2e 2e  ry.  Aborting...
9110: 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b  \n");.  exit(1);
9120: 0a 7d 0a 0a 0a 2f 2a 20 54 68 65 20 6d 61 69 6e  .}.../* The main
9130: 20 70 72 6f 67 72 61 6d 2e 20 20 50 61 72 73 65   program.  Parse
9140: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
9150: 65 20 61 6e 64 20 64 6f 20 69 74 2e 2e 2e 20 2a  e and do it... *
9160: 2f 0a 69 6e 74 20 6d 61 69 6e 28 61 72 67 63 2c  /.int main(argc,
9170: 61 72 67 76 29 0a 69 6e 74 20 61 72 67 63 3b 0a  argv).int argc;.
9180: 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a 7b 0a 20  char **argv;.{. 
9190: 20 73 74 61 74 69 63 20 69 6e 74 20 76 65 72 73   static int vers
91a0: 69 6f 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  ion = 0;.  stati
91b0: 63 20 69 6e 74 20 72 70 66 6c 61 67 20 3d 20 30  c int rpflag = 0
91c0: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 62  ;.  static int b
91d0: 61 73 69 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20  asisflag = 0;.  
91e0: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6d 70 72  static int compr
91f0: 65 73 73 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  ess = 0;.  stati
9200: 63 20 69 6e 74 20 71 75 69 65 74 20 3d 20 30 3b  c int quiet = 0;
9210: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 73 74  .  static int st
9220: 61 74 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20  atistics = 0;.  
9230: 73 74 61 74 69 63 20 69 6e 74 20 6d 68 66 6c 61  static int mhfla
9240: 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  g = 0;.  static 
9250: 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73  struct s_options
9260: 20 6f 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20   options[] = {. 
9270: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 62     {OPT_FLAG, "b
9280: 22 2c 20 28 63 68 61 72 2a 29 26 62 61 73 69 73  ", (char*)&basis
9290: 66 6c 61 67 2c 20 22 50 72 69 6e 74 20 6f 6e 6c  flag, "Print onl
92a0: 79 20 74 68 65 20 62 61 73 69 73 20 69 6e 20 72  y the basis in r
92b0: 65 70 6f 72 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f  eport."},.    {O
92c0: 50 54 5f 46 4c 41 47 2c 20 22 63 22 2c 20 28 63  PT_FLAG, "c", (c
92d0: 68 61 72 2a 29 26 63 6f 6d 70 72 65 73 73 2c 20  har*)&compress, 
92e0: 22 44 6f 6e 27 74 20 63 6f 6d 70 72 65 73 73 20  "Don't compress 
92f0: 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
9300: 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  ."},.    {OPT_FL
9310: 41 47 2c 20 22 67 22 2c 20 28 63 68 61 72 2a 29  AG, "g", (char*)
9320: 26 72 70 66 6c 61 67 2c 20 22 50 72 69 6e 74 20  &rpflag, "Print 
9330: 67 72 61 6d 6d 61 72 20 77 69 74 68 6f 75 74 20  grammar without 
9340: 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20  actions."},.    
9350: 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 6d 22 2c 20  {OPT_FLAG, "m", 
9360: 28 63 68 61 72 2a 29 26 6d 68 66 6c 61 67 2c 20  (char*)&mhflag, 
9370: 22 4f 75 74 70 75 74 20 61 20 6d 61 6b 65 68 65  "Output a makehe
9380: 61 64 65 72 73 20 63 6f 6d 70 61 74 69 62 6c 65  aders compatible
9390: 20 66 69 6c 65 22 7d 2c 0a 20 20 20 20 7b 4f 50   file"},.    {OP
93a0: 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20 28 63 68  T_FLAG, "q", (ch
93b0: 61 72 2a 29 26 71 75 69 65 74 2c 20 22 28 51 75  ar*)&quiet, "(Qu
93c0: 69 65 74 29 20 44 6f 6e 27 74 20 70 72 69 6e 74  iet) Don't print
93d0: 20 74 68 65 20 72 65 70 6f 72 74 20 66 69 6c 65   the report file
93e0: 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  ."},.    {OPT_FL
93f0: 41 47 2c 20 22 73 22 2c 20 28 63 68 61 72 2a 29  AG, "s", (char*)
9400: 26 73 74 61 74 69 73 74 69 63 73 2c 20 22 50 72  &statistics, "Pr
9410: 69 6e 74 20 70 61 72 73 65 72 20 73 74 61 74 73  int parser stats
9420: 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74   to standard out
9430: 70 75 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  put."},.    {OPT
9440: 5f 46 4c 41 47 2c 20 22 78 22 2c 20 28 63 68 61  _FLAG, "x", (cha
9450: 72 2a 29 26 76 65 72 73 69 6f 6e 2c 20 22 50 72  r*)&version, "Pr
9460: 69 6e 74 20 74 68 65 20 76 65 72 73 69 6f 6e 20  int the version 
9470: 6e 75 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20 7b  number."},.    {
9480: 4f 50 54 5f 46 4c 41 47 2c 30 2c 30 2c 30 7d 0a  OPT_FLAG,0,0,0}.
9490: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
94a0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 6c 65 6d  struct lemon lem
94b0: 3b 0a 0a 20 20 4f 70 74 49 6e 69 74 28 61 72 67  ;..  OptInit(arg
94c0: 76 2c 6f 70 74 69 6f 6e 73 2c 73 74 64 65 72 72  v,options,stderr
94d0: 29 3b 0a 20 20 69 66 28 20 76 65 72 73 69 6f 6e  );.  if( version
94e0: 20 29 7b 0a 20 20 20 20 20 70 72 69 6e 74 66 28   ){.     printf(
94f0: 22 4c 65 6d 6f 6e 20 76 65 72 73 69 6f 6e 20 31  "Lemon version 1
9500: 2e 30 5c 6e 22 29 3b 0a 20 20 20 20 20 65 78 69  .0\n");.     exi
9510: 74 28 30 29 3b 20 0a 20 20 7d 0a 20 20 69 66 28  t(0); .  }.  if(
9520: 20 4f 70 74 4e 41 72 67 73 28 29 21 3d 31 20 29   OptNArgs()!=1 )
9530: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
9540: 64 65 72 72 2c 22 45 78 61 63 74 6c 79 20 6f 6e  derr,"Exactly on
9550: 65 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d  e filename argum
9560: 65 6e 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  ent is required.
9570: 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
9580: 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 2e 65 72 72  );.  }.  lem.err
9590: 6f 72 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  orcnt = 0;..  /*
95a0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
95b0: 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 53 74 72  machine */.  Str
95c0: 73 61 66 65 5f 69 6e 69 74 28 29 3b 0a 20 20 53  safe_init();.  S
95d0: 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 3b 0a 20 20  ymbol_init();.  
95e0: 53 74 61 74 65 5f 69 6e 69 74 28 29 3b 0a 20 20  State_init();.  
95f0: 6c 65 6d 2e 61 72 67 76 30 20 3d 20 61 72 67 76  lem.argv0 = argv
9600: 5b 30 5d 3b 0a 20 20 6c 65 6d 2e 66 69 6c 65 6e  [0];.  lem.filen
9610: 61 6d 65 20 3d 20 4f 70 74 41 72 67 28 30 29 3b  ame = OptArg(0);
9620: 0a 20 20 6c 65 6d 2e 62 61 73 69 73 66 6c 61 67  .  lem.basisflag
9630: 20 3d 20 62 61 73 69 73 66 6c 61 67 3b 0a 20 20   = basisflag;.  
9640: 6c 65 6d 2e 68 61 73 5f 66 61 6c 6c 62 61 63 6b  lem.has_fallback
9650: 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 6e 63 6f 6e   = 0;.  lem.ncon
9660: 66 6c 69 63 74 20 3d 20 30 3b 0a 20 20 6c 65 6d  flict = 0;.  lem
9670: 2e 6e 61 6d 65 20 3d 20 6c 65 6d 2e 69 6e 63 6c  .name = lem.incl
9680: 75 64 65 20 3d 20 6c 65 6d 2e 61 72 67 20 3d 20  ude = lem.arg = 
9690: 6c 65 6d 2e 74 6f 6b 65 6e 74 79 70 65 20 3d 20  lem.tokentype = 
96a0: 6c 65 6d 2e 73 74 61 72 74 20 3d 20 30 3b 0a 20  lem.start = 0;. 
96b0: 20 6c 65 6d 2e 76 61 72 74 79 70 65 20 3d 20 30   lem.vartype = 0
96c0: 3b 0a 20 20 6c 65 6d 2e 73 74 61 63 6b 73 69 7a  ;.  lem.stacksiz
96d0: 65 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 65 72 72  e = 0;.  lem.err
96e0: 6f 72 20 3d 20 6c 65 6d 2e 6f 76 65 72 66 6c 6f  or = lem.overflo
96f0: 77 20 3d 20 6c 65 6d 2e 66 61 69 6c 75 72 65 20  w = lem.failure 
9700: 3d 20 6c 65 6d 2e 61 63 63 65 70 74 20 3d 20 6c  = lem.accept = l
9710: 65 6d 2e 74 6f 6b 65 6e 64 65 73 74 20 3d 0a 20  em.tokendest =. 
9720: 20 20 20 20 6c 65 6d 2e 74 6f 6b 65 6e 70 72 65      lem.tokenpre
9730: 66 69 78 20 3d 20 6c 65 6d 2e 6f 75 74 6e 61 6d  fix = lem.outnam
9740: 65 20 3d 20 6c 65 6d 2e 65 78 74 72 61 63 6f 64  e = lem.extracod
9750: 65 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 76 61 72  e = 0;.  lem.var
9760: 64 65 73 74 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e  dest = 0;.  lem.
9770: 74 61 62 6c 65 73 69 7a 65 20 3d 20 30 3b 0a 20  tablesize = 0;. 
9780: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 24 22 29   Symbol_new("$")
9790: 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 20 3d  ;.  lem.errsym =
97a0: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 65 72 72   Symbol_new("err
97b0: 6f 72 22 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73  or");..  /* Pars
97c0: 65 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  e the input file
97d0: 20 2a 2f 0a 20 20 50 61 72 73 65 28 26 6c 65 6d   */.  Parse(&lem
97e0: 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 65 72 72  );.  if( lem.err
97f0: 6f 72 63 6e 74 20 29 20 65 78 69 74 28 6c 65 6d  orcnt ) exit(lem
9800: 2e 65 72 72 6f 72 63 6e 74 29 3b 0a 20 20 69 66  .errorcnt);.  if
9810: 28 20 6c 65 6d 2e 72 75 6c 65 3d 3d 30 20 29 7b  ( lem.rule==0 ){
9820: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
9830: 65 72 72 2c 22 45 6d 70 74 79 20 67 72 61 6d 6d  err,"Empty gramm
9840: 61 72 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ar.\n");.    exi
9850: 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  t(1);.  }..  /* 
9860: 43 6f 75 6e 74 20 61 6e 64 20 69 6e 64 65 78 20  Count and index 
9870: 74 68 65 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74  the symbols of t
9880: 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20  he grammar */.  
9890: 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53 79  lem.nsymbol = Sy
98a0: 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20 20  mbol_count();.  
98b0: 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66  Symbol_new("{def
98c0: 61 75 6c 74 7d 22 29 3b 0a 20 20 6c 65 6d 2e 73  ault}");.  lem.s
98d0: 79 6d 62 6f 6c 73 20 3d 20 53 79 6d 62 6f 6c 5f  ymbols = Symbol_
98e0: 61 72 72 61 79 6f 66 28 29 3b 0a 20 20 71 73 6f  arrayof();.  qso
98f0: 72 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c  rt(lem.symbols,l
9900: 65 6d 2e 6e 73 79 6d 62 6f 6c 2b 31 2c 73 69 7a  em.nsymbol+1,siz
9910: 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
9920: 6c 2a 29 2c 0a 20 20 20 20 20 20 20 20 28 69 6e  l*),.        (in
9930: 74 28 2a 29 28 29 29 53 79 6d 62 6f 6c 63 6d 70  t(*)())Symbolcmp
9940: 70 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  p);.  for(i=0; i
9950: 3c 3d 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69  <=lem.nsymbol; i
9960: 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b  ++) lem.symbols[
9970: 69 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20  i]->index = i;. 
9980: 20 66 6f 72 28 69 3d 31 3b 20 69 73 75 70 70 65   for(i=1; isuppe
9990: 72 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d  r(lem.symbols[i]
99a0: 2d 3e 6e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29  ->name[0]); i++)
99b0: 3b 0a 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61  ;.  lem.ntermina
99c0: 6c 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 47 65 6e  l = i;..  /* Gen
99d0: 65 72 61 74 65 20 61 20 72 65 70 72 69 6e 74 20  erate a reprint 
99e0: 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2c 20  of the grammar, 
99f0: 69 66 20 72 65 71 75 65 73 74 65 64 20 6f 6e 20  if requested on 
9a00: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
9a10: 20 2a 2f 0a 20 20 69 66 28 20 72 70 66 6c 61 67   */.  if( rpflag
9a20: 20 29 7b 0a 20 20 20 20 52 65 70 72 69 6e 74 28   ){.    Reprint(
9a30: 26 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  &lem);.  }else{.
9a40: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
9a50: 65 20 74 68 65 20 73 69 7a 65 20 66 6f 72 20 61  e the size for a
9a60: 6c 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64 20 66 69  ll follow and fi
9a70: 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20 20 20  rst sets */.    
9a80: 53 65 74 53 69 7a 65 28 6c 65 6d 2e 6e 74 65 72  SetSize(lem.nter
9a90: 6d 69 6e 61 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20  minal);..    /* 
9aa0: 46 69 6e 64 20 74 68 65 20 70 72 65 63 65 64 65  Find the precede
9ab0: 6e 63 65 20 66 6f 72 20 65 76 65 72 79 20 70 72  nce for every pr
9ac0: 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 28 74  oduction rule (t
9ad0: 68 61 74 20 68 61 73 20 6f 6e 65 29 20 2a 2f 0a  hat has one) */.
9ae0: 20 20 20 20 46 69 6e 64 52 75 6c 65 50 72 65 63      FindRulePrec
9af0: 65 64 65 6e 63 65 73 28 26 6c 65 6d 29 3b 0a 0a  edences(&lem);..
9b00: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
9b10: 68 65 20 6c 61 6d 62 64 61 2d 6e 6f 6e 74 65 72  he lambda-nonter
9b20: 6d 69 6e 61 6c 73 20 61 6e 64 20 74 68 65 20 66  minals and the f
9b30: 69 72 73 74 2d 73 65 74 73 20 66 6f 72 20 65 76  irst-sets for ev
9b40: 65 72 79 0a 20 20 20 20 2a 2a 20 6e 6f 6e 74 65  ery.    ** nonte
9b50: 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20 20 20 46 69  rminal */.    Fi
9b60: 6e 64 46 69 72 73 74 53 65 74 73 28 26 6c 65 6d  ndFirstSets(&lem
9b70: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75  );..    /* Compu
9b80: 74 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74 61  te all LR(0) sta
9b90: 74 65 73 2e 20 20 41 6c 73 6f 20 72 65 63 6f 72  tes.  Also recor
9ba0: 64 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f  d follow-set pro
9bb0: 70 61 67 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  pagation.    ** 
9bc0: 6c 69 6e 6b 73 20 73 6f 20 74 68 61 74 20 74 68  links so that th
9bd0: 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 61 6e  e follow-set can
9be0: 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61 74   be computed lat
9bf0: 65 72 20 2a 2f 0a 20 20 20 20 6c 65 6d 2e 6e 73  er */.    lem.ns
9c00: 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 46 69  tate = 0;.    Fi
9c10: 6e 64 53 74 61 74 65 73 28 26 6c 65 6d 29 3b 0a  ndStates(&lem);.
9c20: 20 20 20 20 6c 65 6d 2e 73 6f 72 74 65 64 20 3d      lem.sorted =
9c30: 20 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28 29   State_arrayof()
9c40: 3b 0a 0a 20 20 20 20 2f 2a 20 54 69 65 20 75 70  ;..    /* Tie up
9c50: 20 6c 6f 6f 73 65 20 65 6e 64 73 20 6f 6e 20 74   loose ends on t
9c60: 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  he propagation l
9c70: 69 6e 6b 73 20 2a 2f 0a 20 20 20 20 46 69 6e 64  inks */.    Find
9c80: 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  Links(&lem);..  
9c90: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
9ca0: 20 66 6f 6c 6c 6f 77 20 73 65 74 20 6f 66 20 65   follow set of e
9cb0: 76 65 72 79 20 72 65 64 75 63 69 62 6c 65 20 63  very reducible c
9cc0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a  onfiguration */.
9cd0: 20 20 20 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65      FindFollowSe
9ce0: 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  ts(&lem);..    /
9cf0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63  * Compute the ac
9d00: 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20  tion tables */. 
9d10: 20 20 20 46 69 6e 64 41 63 74 69 6f 6e 73 28 26     FindActions(&
9d20: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  lem);..    /* Co
9d30: 6d 70 72 65 73 73 20 74 68 65 20 61 63 74 69 6f  mpress the actio
9d40: 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  n tables */.    
9d50: 69 66 28 20 63 6f 6d 70 72 65 73 73 3d 3d 30 20  if( compress==0 
9d60: 29 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73  ) CompressTables
9d70: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
9d80: 47 65 6e 65 72 61 74 65 20 61 20 72 65 70 6f 72  Generate a repor
9d90: 74 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20  t of the parser 
9da0: 67 65 6e 65 72 61 74 65 64 2e 20 20 28 74 68 65  generated.  (the
9db0: 20 22 79 2e 6f 75 74 70 75 74 22 20 66 69 6c 65   "y.output" file
9dc0: 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 71 75  ) */.    if( !qu
9dd0: 69 65 74 20 29 20 52 65 70 6f 72 74 4f 75 74 70  iet ) ReportOutp
9de0: 75 74 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  ut(&lem);..    /
9df0: 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73  * Generate the s
9e00: 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74  ource code for t
9e10: 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 20  he parser */.   
9e20: 20 52 65 70 6f 72 74 54 61 62 6c 65 28 26 6c 65   ReportTable(&le
9e30: 6d 2c 20 6d 68 66 6c 61 67 29 3b 0a 0a 20 20 20  m, mhflag);..   
9e40: 20 2f 2a 20 50 72 6f 64 75 63 65 20 61 20 68 65   /* Produce a he
9e50: 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20 75 73  ader file for us
9e60: 65 20 62 79 20 74 68 65 20 73 63 61 6e 6e 65 72  e by the scanner
9e70: 2e 20 20 28 54 68 69 73 20 73 74 65 70 20 69 73  .  (This step is
9e80: 0a 20 20 20 20 2a 2a 20 6f 6d 69 74 74 65 64 20  .    ** omitted 
9e90: 69 66 20 74 68 65 20 22 2d 6d 22 20 6f 70 74 69  if the "-m" opti
9ea0: 6f 6e 20 69 73 20 75 73 65 64 20 62 65 63 61 75  on is used becau
9eb0: 73 65 20 6d 61 6b 65 68 65 61 64 65 72 73 20 77  se makeheaders w
9ec0: 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72  ill.    ** gener
9ed0: 61 74 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72  ate the file for
9ee0: 20 75 73 2e 29 20 2a 2f 0a 20 20 20 20 69 66 28   us.) */.    if(
9ef0: 20 21 6d 68 66 6c 61 67 20 29 20 52 65 70 6f 72   !mhflag ) Repor
9f00: 74 48 65 61 64 65 72 28 26 6c 65 6d 29 3b 0a 20  tHeader(&lem);. 
9f10: 20 7d 0a 20 20 69 66 28 20 73 74 61 74 69 73 74   }.  if( statist
9f20: 69 63 73 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ics ){.    print
9f30: 66 28 22 50 61 72 73 65 72 20 73 74 61 74 69 73  f("Parser statis
9f40: 74 69 63 73 3a 20 25 64 20 74 65 72 6d 69 6e 61  tics: %d termina
9f50: 6c 73 2c 20 25 64 20 6e 6f 6e 74 65 72 6d 69 6e  ls, %d nontermin
9f60: 61 6c 73 2c 20 25 64 20 72 75 6c 65 73 5c 6e 22  als, %d rules\n"
9f70: 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 74 65 72  ,.      lem.nter
9f80: 6d 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 73 79 6d 62  minal, lem.nsymb
9f90: 6f 6c 20 2d 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e  ol - lem.ntermin
9fa0: 61 6c 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a  al, lem.nrule);.
9fb0: 20 20 20 20 70 72 69 6e 74 66 28 22 20 20 20 20      printf("    
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
9fd0: 64 20 73 74 61 74 65 73 2c 20 25 64 20 70 61 72  d states, %d par
9fe0: 73 65 72 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ser table entrie
9ff0: 73 2c 20 25 64 20 63 6f 6e 66 6c 69 63 74 73 5c  s, %d conflicts\
a000: 6e 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 73  n",.      lem.ns
a010: 74 61 74 65 2c 20 6c 65 6d 2e 74 61 62 6c 65 73  tate, lem.tables
a020: 69 7a 65 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69  ize, lem.nconfli
a030: 63 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  ct);.  }.  if( l
a040: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 29 7b 0a  em.nconflict ){.
a050: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
a060: 72 72 2c 22 25 64 20 70 61 72 73 69 6e 67 20 63  rr,"%d parsing c
a070: 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c 65 6d  onflicts.\n",lem
a080: 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 7d  .nconflict);.  }
a090: 0a 20 20 65 78 69 74 28 6c 65 6d 2e 65 72 72 6f  .  exit(lem.erro
a0a0: 72 63 6e 74 20 2b 20 6c 65 6d 2e 6e 63 6f 6e 66  rcnt + lem.nconf
a0b0: 6c 69 63 74 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  lict);.}./******
a0c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
a0d0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6d 73  rom the file "ms
a0e0: 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ort.c" *********
a0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a100: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20  ******/./*.** A 
a110: 67 65 6e 65 72 69 63 20 6d 65 72 67 65 2d 73 6f  generic merge-so
a120: 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a  rt program..**.*
a130: 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c 65 74 20  * USAGE:.** Let 
a140: 22 70 74 72 22 20 62 65 20 61 20 70 6f 69 6e 74  "ptr" be a point
a150: 65 72 20 74 6f 20 73 6f 6d 65 20 73 74 72 75 63  er to some struc
a160: 74 75 72 65 20 77 68 69 63 68 20 69 73 20 61 74  ture which is at
a170: 20 74 68 65 20 68 65 61 64 20 6f 66 0a 2a 2a 20   the head of.** 
a180: 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65  a null-terminate
a190: 64 20 6c 69 73 74 2e 20 20 54 68 65 6e 20 74 6f  d list.  Then to
a1a0: 20 73 6f 72 74 20 74 68 65 20 6c 69 73 74 20 63   sort the list c
a1b0: 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70  all:.**.**     p
a1c0: 74 72 20 3d 20 6d 73 6f 72 74 28 70 74 72 2c 26  tr = msort(ptr,&
a1d0: 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63 6d 70 66  (ptr->next),cmpf
a1e0: 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  nc);.**.** In th
a1f0: 65 20 61 62 6f 76 65 2c 20 22 63 6d 70 66 6e 63  e above, "cmpfnc
a200: 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  " is a pointer t
a210: 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 68 69  o a function whi
a220: 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a 2a 20 74  ch compares.** t
a230: 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  wo instances of 
a240: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  the structure an
a250: 64 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 74  d returns an int
a260: 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a 2a 20 73  eger, as in.** s
a270: 74 72 63 6d 70 2e 20 20 54 68 65 20 73 65 63 6f  trcmp.  The seco
a280: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
a290: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
a2a0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
a2b0: 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  * second element
a2c0: 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   of the linked l
a2d0: 69 73 74 2e 20 20 54 68 69 73 20 61 64 64 72 65  ist.  This addre
a2e0: 73 73 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  ss is used to co
a2f0: 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 6f 66 66  mpute.** the off
a300: 73 65 74 20 74 6f 20 74 68 65 20 22 6e 65 78 74  set to the "next
a310: 22 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74  " field within t
a320: 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  he structure.  T
a330: 68 65 20 6f 66 66 73 65 74 20 74 6f 0a 2a 2a 20  he offset to.** 
a340: 74 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c 64  the "next" field
a350: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
a360: 74 20 66 6f 72 20 61 6c 6c 20 73 74 72 75 63 74  t for all struct
a370: 75 72 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ures in the list
a380: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e 63  ..**.** The func
a390: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 6e  tion returns a n
a3a0: 65 77 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68  ew pointer which
a3b0: 20 69 73 20 74 68 65 20 68 65 61 64 20 6f 66 20   is the head of 
a3c0: 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61 66 74 65  the list.** afte
a3d0: 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r sorting..**.**
a3e0: 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a 20 4d   ALGORITHM:.** M
a3f0: 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a 2f  erge-sort..*/../
a400: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
a410: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78  inter to the nex
a420: 74 20 73 74 72 75 63 74 75 72 65 20 69 6e 20 74  t structure in t
a430: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a  he linked list..
a440: 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45 58 54 28  */.#define NEXT(
a450: 41 29 20 28 2a 28 63 68 61 72 2a 2a 29 28 28 28  A) (*(char**)(((
a460: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 41 29  unsigned long)A)
a470: 2b 6f 66 66 73 65 74 29 29 0a 0a 2f 2a 0a 2a 2a  +offset))../*.**
a480: 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 61 3a   Inputs:.**   a:
a490: 20 20 20 20 20 20 20 41 20 73 6f 72 74 65 64 2c         A sorted,
a4a0: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
a4b0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28   linked list.  (
a4c0: 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a  May be null)..**
a4d0: 20 20 20 62 3a 20 20 20 20 20 20 20 41 20 73 6f     b:       A so
a4e0: 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69  rted, null-termi
a4f0: 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73  nated linked lis
a500: 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75 6c 6c  t.  (May be null
a510: 29 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20 20 20 20  )..**   cmp:    
a520: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
a530: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  e comparison fun
a540: 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20 6f 66 66 73  ction..**   offs
a550: 65 74 3a 20 20 4f 66 66 73 65 74 20 69 6e 20 74  et:  Offset in t
a560: 68 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  he structure to 
a570: 74 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c 64  the "next" field
a580: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 56  ..**.** Return V
a590: 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f 69  alue:.**   A poi
a5a0: 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
a5b0: 20 6f 66 20 61 20 73 6f 72 74 65 64 20 6c 69 73   of a sorted lis
a5c0: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
a5d0: 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f   elements.**   o
a5e0: 66 20 62 6f 74 68 20 61 20 61 6e 64 20 62 2e 0a  f both a and b..
a5f0: 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66 66 65 63  **.** Side effec
a600: 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20 22 6e 65  ts:.**   The "ne
a610: 78 74 22 20 70 6f 69 6e 74 65 72 73 20 66 6f 72  xt" pointers for
a620: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
a630: 20 6c 69 73 74 73 20 61 20 61 6e 64 20 62 20 61   lists a and b a
a640: 72 65 0a 2a 2a 20 20 20 63 68 61 6e 67 65 64 2e  re.**   changed.
a650: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
a660: 2a 6d 65 72 67 65 28 61 2c 62 2c 63 6d 70 2c 6f  *merge(a,b,cmp,o
a670: 66 66 73 65 74 29 0a 63 68 61 72 20 2a 61 3b 0a  ffset).char *a;.
a680: 63 68 61 72 20 2a 62 3b 0a 69 6e 74 20 28 2a 63  char *b;.int (*c
a690: 6d 70 29 28 29 3b 0a 69 6e 74 20 6f 66 66 73 65  mp)();.int offse
a6a0: 74 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 70 74 72  t;.{.  char *ptr
a6b0: 2c 20 2a 68 65 61 64 3b 0a 0a 20 20 69 66 28 20  , *head;..  if( 
a6c0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 68 65 61 64  a==0 ){.    head
a6d0: 20 3d 20 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = b;.  }else if
a6e0: 28 20 62 3d 3d 30 20 29 7b 0a 20 20 20 20 68 65  ( b==0 ){.    he
a6f0: 61 64 20 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  ad = a;.  }else{
a700: 0a 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29 28  .    if( (*cmp)(
a710: 61 2c 62 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  a,b)<0 ){.      
a720: 70 74 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 61  ptr = a;.      a
a730: 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20 20 20 20   = NEXT(a);.    
a740: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 74 72  }else{.      ptr
a750: 20 3d 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20   = b;.      b = 
a760: 4e 45 58 54 28 62 29 3b 0a 20 20 20 20 7d 0a 20  NEXT(b);.    }. 
a770: 20 20 20 68 65 61 64 20 3d 20 70 74 72 3b 0a 20     head = ptr;. 
a780: 20 20 20 77 68 69 6c 65 28 20 61 20 26 26 20 62     while( a && b
a790: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 2a   ){.      if( (*
a7a0: 63 6d 70 29 28 61 2c 62 29 3c 30 20 29 7b 0a 20  cmp)(a,b)<0 ){. 
a7b0: 20 20 20 20 20 20 20 4e 45 58 54 28 70 74 72 29         NEXT(ptr)
a7c0: 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 74   = a;.        pt
a7d0: 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 61  r = a;.        a
a7e0: 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20 20 20 20   = NEXT(a);.    
a7f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a800: 20 4e 45 58 54 28 70 74 72 29 20 3d 20 62 3b 0a   NEXT(ptr) = b;.
a810: 20 20 20 20 20 20 20 20 70 74 72 20 3d 20 62 3b          ptr = b;
a820: 0a 20 20 20 20 20 20 20 20 62 20 3d 20 4e 45 58  .        b = NEX
a830: 54 28 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  T(b);.      }.  
a840: 20 20 7d 0a 20 20 20 20 69 66 28 20 61 20 29 20    }.    if( a ) 
a850: 4e 45 58 54 28 70 74 72 29 20 3d 20 61 3b 0a 20  NEXT(ptr) = a;. 
a860: 20 20 20 65 6c 73 65 20 20 20 20 4e 45 58 54 28     else    NEXT(
a870: 70 74 72 29 20 3d 20 62 3b 0a 20 20 7d 0a 20 20  ptr) = b;.  }.  
a880: 72 65 74 75 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a  return head;.}..
a890: 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a  /*.** Inputs:.**
a8a0: 20 20 20 6c 69 73 74 3a 20 20 20 20 20 20 50 6f     list:      Po
a8b0: 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c  inter to a singl
a8c0: 79 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  y-linked list of
a8d0: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 20   structures..** 
a8e0: 20 20 6e 65 78 74 3a 20 20 20 20 20 20 50 6f 69    next:      Poi
a8f0: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 65 72 20  nter to pointer 
a900: 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c  to the second el
a910: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73  ement of the lis
a920: 74 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20 20 20 20  t..**   cmp:    
a930: 20 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20     A comparison 
a940: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
a950: 52 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a  Return Value:.**
a960: 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20     A pointer to 
a970: 74 68 65 20 68 65 61 64 20 6f 66 20 61 20 73 6f  the head of a so
a980: 72 74 65 64 20 6c 69 73 74 20 63 6f 6e 74 61 69  rted list contai
a990: 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e 74  ning the element
a9a0: 73 0a 2a 2a 20 20 20 6f 72 67 69 6e 61 6c 6c 79  s.**   orginally
a9b0: 20 69 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20   in list..**.** 
a9c0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a  Side effects:.**
a9d0: 20 20 20 54 68 65 20 22 6e 65 78 74 22 20 70 6f     The "next" po
a9e0: 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d 65  inters for eleme
a9f0: 6e 74 73 20 69 6e 20 6c 69 73 74 20 61 72 65 20  nts in list are 
aa00: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 64 65 66  changed..*/.#def
aa10: 69 6e 65 20 4c 49 53 54 53 49 5a 45 20 33 30 0a  ine LISTSIZE 30.
aa20: 63 68 61 72 20 2a 6d 73 6f 72 74 28 6c 69 73 74  char *msort(list
aa30: 2c 6e 65 78 74 2c 63 6d 70 29 0a 63 68 61 72 20  ,next,cmp).char 
aa40: 2a 6c 69 73 74 3b 0a 63 68 61 72 20 2a 2a 6e 65  *list;.char **ne
aa50: 78 74 3b 0a 69 6e 74 20 28 2a 63 6d 70 29 28 29  xt;.int (*cmp)()
aa60: 3b 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  ;.{.  unsigned l
aa70: 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20 20 63 68  ong offset;.  ch
aa80: 61 72 20 2a 65 70 3b 0a 20 20 63 68 61 72 20 2a  ar *ep;.  char *
aa90: 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d 3b 0a 20  set[LISTSIZE];. 
aaa0: 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66 73 65 74   int i;.  offset
aab0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   = (unsigned lon
aac0: 67 29 6e 65 78 74 20 2d 20 28 75 6e 73 69 67 6e  g)next - (unsign
aad0: 65 64 20 6c 6f 6e 67 29 6c 69 73 74 3b 0a 20 20  ed long)list;.  
aae0: 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53  for(i=0; i<LISTS
aaf0: 49 5a 45 3b 20 69 2b 2b 29 20 73 65 74 5b 69 5d  IZE; i++) set[i]
ab00: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 6c   = 0;.  while( l
ab10: 69 73 74 20 29 7b 0a 20 20 20 20 65 70 20 3d 20  ist ){.    ep = 
ab20: 6c 69 73 74 3b 0a 20 20 20 20 6c 69 73 74 20 3d  list;.    list =
ab30: 20 4e 45 58 54 28 6c 69 73 74 29 3b 0a 20 20 20   NEXT(list);.   
ab40: 20 4e 45 58 54 28 65 70 29 20 3d 20 30 3b 0a 20   NEXT(ep) = 0;. 
ab50: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49     for(i=0; i<LI
ab60: 53 54 53 49 5a 45 2d 31 20 26 26 20 73 65 74 5b  STSIZE-1 && set[
ab70: 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  i]!=0; i++){.   
ab80: 20 20 20 65 70 20 3d 20 6d 65 72 67 65 28 65 70     ep = merge(ep
ab90: 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73  ,set[i],cmp,offs
aba0: 65 74 29 3b 0a 20 20 20 20 20 20 73 65 74 5b 69  et);.      set[i
abb0: 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = 0;.    }.   
abc0: 20 73 65 74 5b 69 5d 20 3d 20 65 70 3b 0a 20 20   set[i] = ep;.  
abd0: 7d 0a 20 20 65 70 20 3d 20 30 3b 0a 20 20 66 6f  }.  ep = 0;.  fo
abe0: 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a  r(i=0; i<LISTSIZ
abf0: 45 3b 20 69 2b 2b 29 20 69 66 28 20 73 65 74 5b  E; i++) if( set[
ac00: 69 5d 20 29 20 65 70 20 3d 20 6d 65 72 67 65 28  i] ) ep = merge(
ac10: 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66  ep,set[i],cmp,of
ac20: 66 73 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  fset);.  return 
ac30: 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ep;.}./*********
ac40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
ac50: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6f  From the file "o
ac60: 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  ption.c" *******
ac70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac80: 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ***/.static char
ac90: 20 2a 2a 61 72 67 76 3b 0a 73 74 61 74 69 63 20   **argv;.static 
aca0: 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73  struct s_options
acb0: 20 2a 6f 70 3b 0a 73 74 61 74 69 63 20 46 49 4c   *op;.static FIL
acc0: 45 20 2a 65 72 72 73 74 72 65 61 6d 3b 0a 0a 23  E *errstream;..#
acd0: 64 65 66 69 6e 65 20 49 53 4f 50 54 28 58 29 20  define ISOPT(X) 
ace0: 28 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c 7c 28 58  ((X)[0]=='-'||(X
acf0: 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74 72 63 68  )[0]=='+'||strch
ad00: 72 28 28 58 29 2c 27 3d 27 29 21 3d 30 29 0a 0a  r((X),'=')!=0)..
ad10: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
ad20: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 69 74  command line wit
ad30: 68 20 61 20 63 61 72 72 6f 74 20 70 6f 69 6e 74  h a carrot point
ad40: 69 6e 67 20 74 6f 20 74 68 65 20 6b 2d 74 68 20  ing to the k-th 
ad50: 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20  character.** of 
ad60: 74 68 65 20 6e 2d 74 68 20 66 69 65 6c 64 2e 0a  the n-th field..
ad70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
ad80: 72 72 6c 69 6e 65 28 6e 2c 6b 2c 65 72 72 29 0a  rrline(n,k,err).
ad90: 69 6e 74 20 6e 3b 0a 69 6e 74 20 6b 3b 0a 46 49  int n;.int k;.FI
ada0: 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74  LE *err;.{.  int
adb0: 20 73 70 63 6e 74 2c 20 69 3b 0a 20 20 73 70 63   spcnt, i;.  spc
adc0: 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72  nt = 0;.  if( ar
add0: 67 76 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28  gv[0] ) fprintf(
ade0: 65 72 72 2c 22 25 73 22 2c 61 72 67 76 5b 30 5d  err,"%s",argv[0]
adf0: 29 3b 0a 20 20 73 70 63 6e 74 20 3d 20 73 74 72  );.  spcnt = str
ae00: 6c 65 6e 28 61 72 67 76 5b 30 5d 29 20 2b 20 31  len(argv[0]) + 1
ae10: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e  ;.  for(i=1; i<n
ae20: 20 26 26 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b   && argv[i]; i++
ae30: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65  ){.    fprintf(e
ae40: 72 72 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d  rr," %s",argv[i]
ae50: 29 3b 0a 20 20 20 20 73 70 63 6e 74 20 2b 3d 20  );.    spcnt += 
ae60: 73 74 72 6c 65 6e 28 61 72 67 76 5b 69 5d 2b 31  strlen(argv[i]+1
ae70: 29 3b 0a 20 20 7d 0a 20 20 73 70 63 6e 74 20 2b  );.  }.  spcnt +
ae80: 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b 20 61 72 67  = k;.  for(; arg
ae90: 76 5b 69 5d 3b 20 69 2b 2b 29 20 66 70 72 69 6e  v[i]; i++) fprin
aea0: 74 66 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67  tf(err," %s",arg
aeb0: 76 5b 69 5d 29 3b 0a 20 20 69 66 28 20 73 70 63  v[i]);.  if( spc
aec0: 6e 74 3c 32 30 20 29 7b 0a 20 20 20 20 66 70 72  nt<20 ){.    fpr
aed0: 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73 5e  intf(err,"\n%*s^
aee0: 2d 2d 20 68 65 72 65 5c 6e 22 2c 73 70 63 6e 74  -- here\n",spcnt
aef0: 2c 22 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ,"");.  }else{. 
af00: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
af10: 5c 6e 25 2a 73 68 65 72 65 20 2d 2d 5e 5c 6e 22  \n%*shere --^\n"
af20: 2c 73 70 63 6e 74 2d 37 2c 22 22 29 3b 0a 20 20  ,spcnt-7,"");.  
af30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
af40: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  n the index of t
af50: 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d 73 77 69 74  he N-th non-swit
af60: 63 68 20 61 72 67 75 6d 65 6e 74 2e 20 20 52 65  ch argument.  Re
af70: 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 4e 20  turn -1.** if N 
af80: 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
af90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
afa0: 72 67 69 6e 64 65 78 28 6e 29 0a 69 6e 74 20 6e  rgindex(n).int n
afb0: 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ;.{.  int i;.  i
afc0: 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b  nt dashdash = 0;
afd0: 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20 26  .  if( argv!=0 &
afe0: 26 20 2a 61 72 67 76 21 3d 30 20 29 7b 0a 20 20  & *argv!=0 ){.  
aff0: 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b    for(i=1; argv[
b000: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
b010: 69 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20  if( dashdash || 
b020: 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20  !ISOPT(argv[i]) 
b030: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
b040: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
b050: 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20          n--;.   
b060: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
b070: 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d  trcmp(argv[i],"-
b080: 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73  -")==0 ) dashdas
b090: 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  h = 1;.    }.  }
b0a0: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
b0b0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 65 6d 73  .static char ems
b0c0: 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c  g[] = "Command l
b0d0: 69 6e 65 20 73 79 6e 74 61 78 20 65 72 72 6f 72  ine syntax error
b0e0: 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  : ";../*.** Proc
b0f0: 65 73 73 20 61 20 66 6c 61 67 20 63 6f 6d 6d 61  ess a flag comma
b100: 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd line argument
b110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b120: 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65 72  handleflags(i,er
b130: 72 29 0a 69 6e 74 20 69 3b 0a 46 49 4c 45 20 2a  r).int i;.FILE *
b140: 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a  err;.{.  int v;.
b150: 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30    int errcnt = 0
b160: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72  ;.  int j;.  for
b170: 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65  (j=0; op[j].labe
b180: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; j++){.    if(
b190: 20 73 74 72 63 6d 70 28 26 61 72 67 76 5b 69 5d   strcmp(&argv[i]
b1a0: 5b 31 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29  [1],op[j].label)
b1b0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ==0 ) break;.  }
b1c0: 0a 20 20 76 20 3d 20 61 72 67 76 5b 69 5d 5b 30  .  v = argv[i][0
b1d0: 5d 3d 3d 27 2d 27 20 3f 20 31 20 3a 20 30 3b 0a  ]=='-' ? 1 : 0;.
b1e0: 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65    if( op[j].labe
b1f0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  l==0 ){.    if( 
b200: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72  err ){.      fpr
b210: 69 6e 74 66 28 65 72 72 2c 22 25 73 75 6e 64 65  intf(err,"%sunde
b220: 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22  fined option.\n"
b230: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72  ,emsg);.      er
b240: 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a  rline(i,1,err);.
b250: 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74      }.    errcnt
b260: 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ++;.  }else if( 
b270: 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f  op[j].type==OPT_
b280: 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a 28 28 69  FLAG ){.    *((i
b290: 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d  nt*)op[j].arg) =
b2a0: 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   v;.  }else if( 
b2b0: 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f  op[j].type==OPT_
b2c0: 46 46 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a 28  FFLAG ){.    (*(
b2d0: 76 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d  void(*)())(op[j]
b2e0: 2e 61 72 67 29 29 28 76 29 3b 0a 20 20 7d 65 6c  .arg))(v);.  }el
b2f0: 73 65 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20  se{.    if( err 
b300: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
b310: 28 65 72 72 2c 22 25 73 6d 69 73 73 69 6e 67 20  (err,"%smissing 
b320: 61 72 67 75 6d 65 6e 74 20 6f 6e 20 73 77 69 74  argument on swit
b330: 63 68 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20  ch.\n",emsg);.  
b340: 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c      errline(i,1,
b350: 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  err);.    }.    
b360: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20  errcnt++;.  }.  
b370: 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d  return errcnt;.}
b380: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20  ../*.** Process 
b390: 61 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 73  a command line s
b3a0: 77 69 74 63 68 20 77 68 69 63 68 20 68 61 73 20  witch which has 
b3b0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  an argument..*/.
b3c0: 73 74 61 74 69 63 20 69 6e 74 20 68 61 6e 64 6c  static int handl
b3d0: 65 73 77 69 74 63 68 28 69 2c 65 72 72 29 0a 69  eswitch(i,err).i
b3e0: 6e 74 20 69 3b 0a 46 49 4c 45 20 2a 65 72 72 3b  nt i;.FILE *err;
b3f0: 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d 20 30 3b  .{.  int lv = 0;
b400: 0a 20 20 64 6f 75 62 6c 65 20 64 76 20 3d 20 30  .  double dv = 0
b410: 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73 76 20 3d  .0;.  char *sv =
b420: 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63 68 61 72   0, *end;.  char
b430: 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   *cp;.  int j;. 
b440: 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b   int errcnt = 0;
b450: 0a 20 20 63 70 20 3d 20 73 74 72 63 68 72 28 61  .  cp = strchr(a
b460: 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20 20 2a  rgv[i],'=');.  *
b470: 63 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a 3d  cp = 0;.  for(j=
b480: 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20  0; op[j].label; 
b490: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  j++){.    if( st
b4a0: 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 6f 70 5b  rcmp(argv[i],op[
b4b0: 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20 29 20 62  j].label)==0 ) b
b4c0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70 20  reak;.  }.  *cp 
b4d0: 3d 20 27 3d 27 3b 0a 20 20 69 66 28 20 6f 70 5b  = '=';.  if( op[
b4e0: 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20  j].label==0 ){. 
b4f0: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
b500: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
b510: 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70 74  "%sundefined opt
b520: 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20  ion.\n",emsg);. 
b530: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 30       errline(i,0
b540: 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ,err);.    }.   
b550: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c   errcnt++;.  }el
b560: 73 65 7b 0a 20 20 20 20 63 70 2b 2b 3b 0a 20 20  se{.    cp++;.  
b570: 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e    switch( op[j].
b580: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
b590: 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20  se OPT_FLAG:.   
b5a0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41     case OPT_FFLA
b5b0: 47 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  G:.        if( e
b5c0: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rr ){.          
b5d0: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 6f  fprintf(err,"%so
b5e0: 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61  ption requires a
b5f0: 6e 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65  n argument.\n",e
b600: 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
b610: 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29  errline(i,0,err)
b620: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b630: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
b640: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b650: 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a     case OPT_DBL:
b660: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
b670: 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 64 76  FDBL:.        dv
b680: 20 3d 20 73 74 72 74 6f 64 28 63 70 2c 26 65 6e   = strtod(cp,&en
b690: 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  d);.        if( 
b6a0: 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  *end ){.        
b6b0: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
b6c0: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
b6d0: 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20  (err,"%sillegal 
b6e0: 63 68 61 72 61 63 74 65 72 20 69 6e 20 66 6c 6f  character in flo
b6f0: 61 74 69 6e 67 2d 70 6f 69 6e 74 20 61 72 67 75  ating-point argu
b700: 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  ment.\n",emsg);.
b710: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6c              errl
b720: 69 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e 65 64  ine(i,((unsigned
b730: 20 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69   long)end)-(unsi
b740: 67 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69  gned long)argv[i
b750: 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  ],err);.        
b760: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72    }.          er
b770: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
b780: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
b790: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
b7a0: 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20  INT:.      case 
b7b0: 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20  OPT_FINT:.      
b7c0: 20 20 6c 76 20 3d 20 73 74 72 74 6f 6c 28 63 70    lv = strtol(cp
b7d0: 2c 26 65 6e 64 2c 30 29 3b 0a 20 20 20 20 20 20  ,&end,0);.      
b7e0: 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20    if( *end ){.  
b7f0: 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20          if( err 
b800: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
b810: 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 69 6c  printf(err,"%sil
b820: 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20  legal character 
b830: 69 6e 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  in integer argum
b840: 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20  ent.\n",emsg);. 
b850: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6c 69             errli
b860: 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e 65 64 20  ne(i,((unsigned 
b870: 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69 67  long)end)-(unsig
b880: 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69 5d  ned long)argv[i]
b890: 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ,err);.         
b8a0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72 72   }.          err
b8b0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
b8c0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
b8d0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53        case OPT_S
b8e0: 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  TR:.      case O
b8f0: 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20  PT_FSTR:.       
b900: 20 73 76 20 3d 20 63 70 3b 0a 20 20 20 20 20 20   sv = cp;.      
b910: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b920: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d     switch( op[j]
b930: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
b940: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
b950: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
b960: 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61  AG:.        brea
b970: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
b980: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a  T_DBL:.        *
b990: 28 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e  (double*)(op[j].
b9a0: 61 72 67 29 20 3d 20 64 76 3b 0a 20 20 20 20 20  arg) = dv;.     
b9b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b9c0: 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20  case OPT_FDBL:. 
b9d0: 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a         (*(void(*
b9e0: 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29  )())(op[j].arg))
b9f0: 28 64 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (dv);.        br
ba00: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ba10: 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 20  OPT_INT:.       
ba20: 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e 61   *(int*)(op[j].a
ba30: 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20 20 20 20  rg) = lv;.      
ba40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ba50: 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20  ase OPT_FINT:.  
ba60: 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29        (*(void(*)
ba70: 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28  ())(op[j].arg))(
ba80: 28 69 6e 74 29 6c 76 29 3b 0a 20 20 20 20 20 20  (int)lv);.      
ba90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
baa0: 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20  ase OPT_STR:.   
bab0: 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 28 6f       *(char**)(o
bac0: 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 73 76 3b 0a  p[j].arg) = sv;.
bad0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bae0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53       case OPT_FS
baf0: 54 52 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76  TR:.        (*(v
bb00: 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e  oid(*)())(op[j].
bb10: 61 72 67 29 29 28 73 76 29 3b 0a 20 20 20 20 20  arg))(sv);.     
bb20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bb30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72    }.  return err
bb40: 63 6e 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49  cnt;.}..int OptI
bb50: 6e 69 74 28 61 2c 6f 2c 65 72 72 29 0a 63 68 61  nit(a,o,err).cha
bb60: 72 20 2a 2a 61 3b 0a 73 74 72 75 63 74 20 73 5f  r **a;.struct s_
bb70: 6f 70 74 69 6f 6e 73 20 2a 6f 3b 0a 46 49 4c 45  options *o;.FILE
bb80: 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 65   *err;.{.  int e
bb90: 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61 72 67  rrcnt = 0;.  arg
bba0: 76 20 3d 20 61 3b 0a 20 20 6f 70 20 3d 20 6f 3b  v = a;.  op = o;
bbb0: 0a 20 20 65 72 72 73 74 72 65 61 6d 20 3d 20 65  .  errstream = e
bbc0: 72 72 3b 0a 20 20 69 66 28 20 61 72 67 76 20 26  rr;.  if( argv &
bbd0: 26 20 2a 61 72 67 76 20 26 26 20 6f 70 20 29 7b  & *argv && op ){
bbe0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
bbf0: 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d  for(i=1; argv[i]
bc00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
bc10: 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b  ( argv[i][0]=='+
bc20: 27 20 7c 7c 20 61 72 67 76 5b 69 5d 5b 30 5d 3d  ' || argv[i][0]=
bc30: 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
bc40: 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65  errcnt += handle
bc50: 66 6c 61 67 73 28 69 2c 65 72 72 29 3b 0a 20 20  flags(i,err);.  
bc60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
bc70: 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27  rchr(argv[i],'='
bc80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72  ) ){.        err
bc90: 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77 69  cnt += handleswi
bca0: 74 63 68 28 69 2c 65 72 72 29 3b 0a 20 20 20 20  tch(i,err);.    
bcb0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
bcc0: 69 66 28 20 65 72 72 63 6e 74 3e 30 20 29 7b 0a  if( errcnt>0 ){.
bcd0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
bce0: 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20 6c  "Valid command l
bcf0: 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20  ine options for 
bd00: 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a  \"%s\" are:\n",*
bd10: 61 29 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e 74  a);.    OptPrint
bd20: 28 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ();.    exit(1);
bd30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
bd40: 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67 73  .}..int OptNArgs
bd50: 28 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  (){.  int cnt = 
bd60: 30 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73  0;.  int dashdas
bd70: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
bd80: 20 20 69 66 28 20 61 72 67 76 21 3d 30 20 26 26    if( argv!=0 &&
bd90: 20 61 72 67 76 5b 30 5d 21 3d 30 20 29 7b 0a 20   argv[0]!=0 ){. 
bda0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76     for(i=1; argv
bdb0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
bdc0: 20 69 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c   if( dashdash ||
bdd0: 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29   !ISOPT(argv[i])
bde0: 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20   ) cnt++;.      
bdf0: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
be00: 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61  i],"--")==0 ) da
be10: 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20  shdash = 1;.    
be20: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  }.  }.  return c
be30: 6e 74 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f 70 74  nt;.}..char *Opt
be40: 41 72 67 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a  Arg(n).int n;.{.
be50: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61    int i;.  i = a
be60: 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72 65  rgindex(n);.  re
be70: 74 75 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67 76  turn i>=0 ? argv
be80: 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64  [i] : 0;.}..void
be90: 20 4f 70 74 45 72 72 28 6e 29 0a 69 6e 74 20 6e   OptErr(n).int n
bea0: 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ;.{.  int i;.  i
beb0: 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a   = argindex(n);.
bec0: 20 20 69 66 28 20 69 3e 3d 30 20 29 20 65 72 72    if( i>=0 ) err
bed0: 6c 69 6e 65 28 69 2c 30 2c 65 72 72 73 74 72 65  line(i,0,errstre
bee0: 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74  am);.}..void Opt
bef0: 50 72 69 6e 74 28 29 7b 0a 20 20 69 6e 74 20 69  Print(){.  int i
bf00: 3b 0a 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65 6e  ;.  int max, len
bf10: 3b 0a 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20 66  ;.  max = 0;.  f
bf20: 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61  or(i=0; op[i].la
bf30: 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c  bel; i++){.    l
bf40: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6f 70 5b 69  en = strlen(op[i
bf50: 5d 2e 6c 61 62 65 6c 29 20 2b 20 31 3b 0a 20 20  ].label) + 1;.  
bf60: 20 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e    switch( op[i].
bf70: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
bf80: 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20  se OPT_FLAG:.   
bf90: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41     case OPT_FFLA
bfa0: 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  G:.        break
bfb0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
bfc0: 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65  _INT:.      case
bfd0: 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20   OPT_FINT:.     
bfe0: 20 20 20 6c 65 6e 20 2b 3d 20 39 3b 20 20 20 20     len += 9;    
bff0: 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20     /* length of 
c000: 22 3c 69 6e 74 65 67 65 72 3e 22 20 2a 2f 0a 20  "<integer>" */. 
c010: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c020: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c      case OPT_DBL
c030: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
c040: 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 6c  _FDBL:.        l
c050: 65 6e 20 2b 3d 20 36 3b 20 20 20 20 20 20 20 2f  en += 6;       /
c060: 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 72 65  * length of "<re
c070: 61 6c 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  al>" */.        
c080: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c090: 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20  e OPT_STR:.     
c0a0: 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a   case OPT_FSTR:.
c0b0: 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 38          len += 8
c0c0: 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74  ;       /* lengt
c0d0: 68 20 6f 66 20 22 3c 73 74 72 69 6e 67 3e 22 20  h of "<string>" 
c0e0: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
c0f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
c100: 6c 65 6e 3e 6d 61 78 20 29 20 6d 61 78 20 3d 20  len>max ) max = 
c110: 6c 65 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  len;.  }.  for(i
c120: 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b  =0; op[i].label;
c130: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74 63   i++){.    switc
c140: 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b  h( op[i].type ){
c150: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
c160: 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65  FLAG:.      case
c170: 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20   OPT_FFLAG:.    
c180: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73      fprintf(errs
c190: 74 72 65 61 6d 2c 22 20 20 2d 25 2d 2a 73 20 20  tream,"  -%-*s  
c1a0: 25 73 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e  %s\n",max,op[i].
c1b0: 6c 61 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73  label,op[i].mess
c1c0: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  age);.        br
c1d0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c1e0: 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63  OPT_INT:.      c
c1f0: 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20  ase OPT_FINT:.  
c200: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
c210: 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 69  rstream,"  %s=<i
c220: 6e 74 65 67 65 72 3e 25 2a 73 20 20 25 73 5c 6e  nteger>%*s  %s\n
c230: 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20  ",op[i].label,. 
c240: 20 20 20 20 20 20 20 20 20 6d 61 78 2d 73 74 72           max-str
c250: 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29  len(op[i].label)
c260: 2d 39 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73  -9,"",op[i].mess
c270: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  age);.        br
c280: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c290: 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63  OPT_DBL:.      c
c2a0: 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20  ase OPT_FDBL:.  
c2b0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
c2c0: 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 72  rstream,"  %s=<r
c2d0: 65 61 6c 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f  eal>%*s  %s\n",o
c2e0: 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20  p[i].label,.    
c2f0: 20 20 20 20 20 20 6d 61 78 2d 73 74 72 6c 65 6e        max-strlen
c300: 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 36 2c  (op[i].label)-6,
c310: 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65  "",op[i].message
c320: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
c330: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
c340: 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65  _STR:.      case
c350: 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20   OPT_FSTR:.     
c360: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74     fprintf(errst
c370: 72 65 61 6d 2c 22 20 20 25 73 3d 3c 73 74 72 69  ream,"  %s=<stri
c380: 6e 67 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70  ng>%*s  %s\n",op
c390: 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20  [i].label,.     
c3a0: 20 20 20 20 20 6d 61 78 2d 73 74 72 6c 65 6e 28       max-strlen(
c3b0: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 38 2c 22  op[i].label)-8,"
c3c0: 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29  ",op[i].message)
c3d0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
c3e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 2a  .    }.  }.}./**
c3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c400: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
c410: 69 6c 65 20 22 70 61 72 73 65 2e 63 22 20 2a 2a  ile "parse.c" **
c420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
c440: 2a 20 49 6e 70 75 74 20 66 69 6c 65 20 70 61 72  * Input file par
c450: 73 65 72 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f  ser for the LEMO
c460: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
c470: 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68 65 20 73  or..*/../* The s
c480: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72 73  tate of the pars
c490: 65 72 20 2a 2f 0a 73 74 72 75 63 74 20 70 73 74  er */.struct pst
c4a0: 61 74 65 20 7b 0a 20 20 63 68 61 72 20 2a 66 69  ate {.  char *fi
c4b0: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a  lename;       /*
c4c0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70   Name of the inp
c4d0: 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ut file */.  int
c4e0: 20 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 20 20 20   tokenlineno;   
c4f0: 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72     /* Linenumber
c500: 20 61 74 20 77 68 69 63 68 20 63 75 72 72 65 6e   at which curren
c510: 74 20 74 6f 6b 65 6e 20 73 74 61 72 74 73 20 2a  t token starts *
c520: 2f 0a 20 20 69 6e 74 20 65 72 72 6f 72 63 6e 74  /.  int errorcnt
c530: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
c540: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 6f  ber of errors so
c550: 20 66 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a   far */.  char *
c560: 74 6f 6b 65 6e 73 74 61 72 74 3b 20 20 20 20 20  tokenstart;     
c570: 2f 2a 20 54 65 78 74 20 6f 66 20 63 75 72 72 65  /* Text of curre
c580: 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74  nt token */.  st
c590: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b 20  ruct lemon *gp; 
c5a0: 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 74      /* Global st
c5b0: 61 74 65 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20  ate vector */.  
c5c0: 65 6e 75 6d 20 65 5f 73 74 61 74 65 20 7b 0a 20  enum e_state {. 
c5d0: 20 20 20 49 4e 49 54 49 41 4c 49 5a 45 2c 0a 20     INITIALIZE,. 
c5e0: 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44     WAITING_FOR_D
c5f0: 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c 0a 20 20 20  ECL_OR_RULE,.   
c600: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
c610: 4c 5f 4b 45 59 57 4f 52 44 2c 0a 20 20 20 20 57  L_KEYWORD,.    W
c620: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
c630: 41 52 47 2c 0a 20 20 20 20 57 41 49 54 49 4e 47  ARG,.    WAITING
c640: 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f  _FOR_PRECEDENCE_
c650: 53 59 4d 42 4f 4c 2c 0a 20 20 20 20 57 41 49 54  SYMBOL,.    WAIT
c660: 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 2c 0a 20  ING_FOR_ARROW,. 
c670: 20 20 20 49 4e 5f 52 48 53 2c 0a 20 20 20 20 4c     IN_RHS,.    L
c680: 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 20 20  HS_ALIAS_1,.    
c690: 4c 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 20  LHS_ALIAS_2,.   
c6a0: 20 4c 48 53 5f 41 4c 49 41 53 5f 33 2c 0a 20 20   LHS_ALIAS_3,.  
c6b0: 20 20 52 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20    RHS_ALIAS_1,. 
c6c0: 20 20 20 52 48 53 5f 41 4c 49 41 53 5f 32 2c 0a     RHS_ALIAS_2,.
c6d0: 20 20 20 20 50 52 45 43 45 44 45 4e 43 45 5f 4d      PRECEDENCE_M
c6e0: 41 52 4b 5f 31 2c 0a 20 20 20 20 50 52 45 43 45  ARK_1,.    PRECE
c6f0: 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c 0a 20 20  DENCE_MARK_2,.  
c700: 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52    RESYNC_AFTER_R
c710: 55 4c 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20 52  ULE_ERROR,.    R
c720: 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
c730: 5f 45 52 52 4f 52 2c 0a 20 20 20 20 57 41 49 54  _ERROR,.    WAIT
c740: 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54  ING_FOR_DESTRUCT
c750: 4f 52 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20 20 57  OR_SYMBOL,.    W
c760: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54  AITING_FOR_DATAT
c770: 59 50 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20 20  YPE_SYMBOL,.    
c780: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c  WAITING_FOR_FALL
c790: 42 41 43 4b 5f 49 44 0a 20 20 7d 20 73 74 61 74  BACK_ID.  } stat
c7a0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
c7b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74       /* The stat
c7c0: 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20  e of the parser 
c7d0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
c7e0: 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 20 20  ol *fallback;   
c7f0: 2f 2a 20 54 68 65 20 66 61 6c 6c 62 61 63 6b 20  /* The fallback 
c800: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63  token */.  struc
c810: 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20  t symbol *lhs;  
c820: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61        /* Left-ha
c830: 6e 64 20 73 69 64 65 20 6f 66 20 63 75 72 72 65  nd side of curre
c840: 6e 74 20 72 75 6c 65 20 2a 2f 0a 20 20 63 68 61  nt rule */.  cha
c850: 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20  r *lhsalias;    
c860: 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61 73          /* Alias
c870: 20 66 6f 72 20 74 68 65 20 4c 48 53 20 2a 2f 0a   for the LHS */.
c880: 20 20 69 6e 74 20 6e 72 68 73 3b 20 20 20 20 20    int nrhs;     
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c8a0: 4e 75 6d 62 65 72 20 6f 66 20 72 69 67 68 74 2d  Number of right-
c8b0: 68 61 6e 64 20 73 69 64 65 20 73 79 6d 62 6f 6c  hand side symbol
c8c0: 73 20 73 65 65 6e 20 2a 2f 0a 20 20 73 74 72 75  s seen */.  stru
c8d0: 63 74 20 73 79 6d 62 6f 6c 20 2a 72 68 73 5b 4d  ct symbol *rhs[M
c8e0: 41 58 52 48 53 5d 3b 20 20 2f 2a 20 52 48 53 20  AXRHS];  /* RHS 
c8f0: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61  symbols */.  cha
c900: 72 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d  r *alias[MAXRHS]
c910: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61 73  ;       /* Alias
c920: 65 73 20 66 6f 72 20 65 61 63 68 20 52 48 53 20  es for each RHS 
c930: 73 79 6d 62 6f 6c 20 28 6f 72 20 4e 55 4c 4c 29  symbol (or NULL)
c940: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
c950: 65 20 2a 70 72 65 76 72 75 6c 65 3b 20 20 20 20  e *prevrule;    
c960: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 75 6c   /* Previous rul
c970: 65 20 70 61 72 73 65 64 20 2a 2f 0a 20 20 63 68  e parsed */.  ch
c980: 61 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b  ar *declkeyword;
c990: 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 77           /* Keyw
c9a0: 6f 72 64 20 6f 66 20 61 20 64 65 63 6c 61 72 61  ord of a declara
c9b0: 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tion */.  char *
c9c0: 2a 64 65 63 6c 61 72 67 73 6c 6f 74 3b 20 20 20  *declargslot;   
c9d0: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68       /* Where th
c9e0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 61 72  e declaration ar
c9f0: 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65  gument should be
ca00: 20 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 64   put */.  int *d
ca10: 65 63 6c 6c 6e 73 6c 6f 74 3b 20 20 20 20 20 20  ecllnslot;      
ca20: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68       /* Where th
ca30: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6c 69  e declaration li
ca40: 6e 65 6e 75 6d 62 65 72 20 69 73 20 70 75 74 20  nenumber is put 
ca50: 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f  */.  enum e_asso
ca60: 63 20 64 65 63 6c 61 73 73 6f 63 3b 20 20 20 20  c declassoc;    
ca70: 2f 2a 20 41 73 73 69 67 6e 20 74 68 69 73 20 61  /* Assign this a
ca80: 73 73 6f 63 69 61 74 69 6f 6e 20 74 6f 20 64 65  ssociation to de
ca90: 63 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  cl arguments */.
caa0: 20 20 69 6e 74 20 70 72 65 63 63 6f 75 6e 74 65    int preccounte
cab0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
cac0: 41 73 73 69 67 6e 20 74 68 69 73 20 70 72 65 63  Assign this prec
cad0: 65 64 65 6e 63 65 20 74 6f 20 64 65 63 6c 20 61  edence to decl a
cae0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74  rguments */.  st
caf0: 72 75 63 74 20 72 75 6c 65 20 2a 66 69 72 73 74  ruct rule *first
cb00: 72 75 6c 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e  rule;    /* Poin
cb10: 74 65 72 20 74 6f 20 66 69 72 73 74 20 72 75 6c  ter to first rul
cb20: 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72  e in the grammar
cb30: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
cb40: 65 20 2a 6c 61 73 74 72 75 6c 65 3b 20 20 20 20  e *lastrule;    
cb50: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
cb60: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
cb70: 20 70 61 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a   parsed rule */.
cb80: 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20 73  };../* Parse a s
cb90: 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73  ingle token */.s
cba0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 72 73 65  tatic void parse
cbb0: 6f 6e 65 74 6f 6b 65 6e 28 70 73 70 29 0a 73 74  onetoken(psp).st
cbc0: 72 75 63 74 20 70 73 74 61 74 65 20 2a 70 73 70  ruct pstate *psp
cbd0: 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 78 3b 0a 20  ;.{.  char *x;. 
cbe0: 20 78 20 3d 20 53 74 72 73 61 66 65 28 70 73 70   x = Strsafe(psp
cbf0: 2d 3e 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20 20  ->tokenstart);  
cc00: 20 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 74     /* Save the t
cc10: 6f 6b 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c 79  oken permanently
cc20: 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70 72 69 6e   */.#if 0.  prin
cc30: 74 66 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65 6e  tf("%s:%d: Token
cc40: 3d 5b 25 73 5d 20 73 74 61 74 65 3d 25 64 5c 6e  =[%s] state=%d\n
cc50: 22 2c 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  ",psp->filename,
cc60: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
cc70: 2c 0a 20 20 20 20 78 2c 70 73 70 2d 3e 73 74 61  ,.    x,psp->sta
cc80: 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 77  te);.#endif.  sw
cc90: 69 74 63 68 28 20 70 73 70 2d 3e 73 74 61 74 65  itch( psp->state
cca0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 49 4e 49   ){.    case INI
ccb0: 54 49 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20 70  TIALIZE:.      p
ccc0: 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 30  sp->prevrule = 0
ccd0: 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65  ;.      psp->pre
cce0: 63 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20  ccounter = 0;.  
ccf0: 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75      psp->firstru
cd00: 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75  le = psp->lastru
cd10: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73  le = 0;.      ps
cd20: 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20 30  p->gp->nrule = 0
cd30: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
cd40: 74 68 72 75 20 74 6f 20 6e 65 78 74 20 63 61 73  thru to next cas
cd50: 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 57 41  e */.    case WA
cd60: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
cd70: 52 5f 52 55 4c 45 3a 0a 20 20 20 20 20 20 69 66  R_RULE:.      if
cd80: 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a 20  ( x[0]=='%' ){. 
cd90: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
cda0: 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
cdb0: 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20  DECL_KEYWORD;.  
cdc0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
cdd0: 6c 6f 77 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20  lower(x[0]) ){. 
cde0: 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 20         psp->lhs 
cdf0: 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
ce00: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72  .        psp->nr
ce10: 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  hs = 0;.        
ce20: 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20  psp->lhsalias = 
ce30: 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
ce40: 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
ce50: 46 4f 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20 20  FOR_ARROW;.     
ce60: 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d   }else if( x[0]=
ce70: 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='{' ){.        
ce80: 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c  if( psp->prevrul
ce90: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
cea0: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
ceb0: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
cec0: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65 72  kenlineno,."Ther
ced0: 65 20 69 73 20 6e 6f 74 20 70 72 69 6f 72 20 72  e is not prior r
cee0: 75 6c 65 20 6f 70 6f 6e 20 77 68 69 63 68 20 74  ule opon which t
cef0: 6f 20 61 74 74 61 63 68 20 74 68 65 20 63 6f 64  o attach the cod
cf00: 65 20 5c 0a 66 72 61 67 6d 65 6e 74 20 77 68 69  e \.fragment whi
cf10: 63 68 20 62 65 67 69 6e 73 20 6f 6e 20 74 68 69  ch begins on thi
cf20: 73 20 6c 69 6e 65 2e 22 29 3b 0a 20 20 20 20 20  s line.");.     
cf30: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
cf40: 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 20 69 66 28  nt++;..}else if(
cf50: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e   psp->prevrule->
cf60: 63 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  code!=0 ){.     
cf70: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
cf80: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
cf90: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43  >tokenlineno,."C
cfa0: 6f 64 65 20 66 72 61 67 6d 65 6e 74 20 62 65 67  ode fragment beg
cfb0: 69 6e 6e 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c  inning on this l
cfc0: 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 65 20 66  ine is not the f
cfd0: 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77  irst \.to follow
cfe0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 75   the previous ru
cff0: 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  le.");.         
d000: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
d010: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d020: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
d030: 70 72 65 76 72 75 6c 65 2d 3e 6c 69 6e 65 20 3d  prevrule->line =
d040: 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
d050: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  o;.          psp
d060: 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65  ->prevrule->code
d070: 20 3d 20 26 78 5b 31 5d 3b 0a 09 7d 0a 20 20 20   = &x[1];..}.   
d080: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30     }else if( x[0
d090: 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  ]=='[' ){.      
d0a0: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50    psp->state = P
d0b0: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31  RECEDENCE_MARK_1
d0c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d0d0: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
d0e0: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
d0f0: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
d100: 20 20 20 20 20 20 20 20 20 20 22 54 6f 6b 65 6e            "Token
d110: 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62   \"%s\" should b
d120: 65 20 65 69 74 68 65 72 20 5c 22 25 25 5c 22 20  e either \"%%\" 
d130: 6f 72 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  or a nonterminal
d140: 20 6e 61 6d 65 2e 22 2c 0a 20 20 20 20 20 20 20   name.",.       
d150: 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70     x);.        p
d160: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
d170: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
d180: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52  eak;.    case PR
d190: 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a  ECEDENCE_MARK_1:
d1a0: 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 75 70  .      if( !isup
d1b0: 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  per(x[0]) ){.   
d1c0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
d1d0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
d1e0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
d1f0: 20 20 20 20 20 20 20 20 22 54 68 65 20 70 72 65          "The pre
d200: 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6d  cedence symbol m
d210: 75 73 74 20 62 65 20 61 20 74 65 72 6d 69 6e 61  ust be a termina
d220: 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  l.");.        ps
d230: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
d240: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
d250: 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20  sp->prevrule==0 
d260: 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
d270: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
d280: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
d290: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54  no,.          "T
d2a0: 68 65 72 65 20 69 73 20 6e 6f 20 70 72 69 6f 72  here is no prior
d2b0: 20 72 75 6c 65 20 74 6f 20 61 73 73 69 67 6e 20   rule to assign 
d2c0: 70 72 65 63 65 64 65 6e 63 65 20 5c 22 5b 25 73  precedence \"[%s
d2d0: 5d 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  ]\".",x);.      
d2e0: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
d2f0: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
d300: 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65  f( psp->prevrule
d310: 2d 3e 70 72 65 63 73 79 6d 21 3d 30 20 29 7b 0a  ->precsym!=0 ){.
d320: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
d330: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
d340: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
d350: 0a 22 50 72 65 63 65 64 65 6e 63 65 20 6d 61 72  ."Precedence mar
d360: 6b 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69  k on this line i
d370: 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 20  s not the first 
d380: 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20  \.to follow the 
d390: 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22 29  previous rule.")
d3a0: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
d3b0: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
d3c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d3d0: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70  psp->prevrule->p
d3e0: 72 65 63 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f  recsym = Symbol_
d3f0: 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a  new(x);.      }.
d400: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
d410: 20 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41   = PRECEDENCE_MA
d420: 52 4b 5f 32 3b 0a 20 20 20 20 20 20 62 72 65 61  RK_2;.      brea
d430: 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45 43  k;.    case PREC
d440: 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20  EDENCE_MARK_2:. 
d450: 20 20 20 20 20 69 66 28 20 78 5b 30 5d 21 3d 27       if( x[0]!='
d460: 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]' ){.        Er
d470: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
d480: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
d490: 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
d4a0: 20 22 4d 69 73 73 69 6e 67 20 5c 22 5d 5c 22 20   "Missing \"]\" 
d4b0: 6f 6e 20 70 72 65 63 65 64 65 6e 63 65 20 6d 61  on precedence ma
d4c0: 72 6b 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  rk.");.        p
d4d0: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
d4e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 73        }.      ps
d4f0: 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
d500: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
d510: 55 4c 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ULE;.      break
d520: 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
d530: 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3a 0a 20 20  NG_FOR_ARROW:.  
d540: 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a      if( x[0]==':
d550: 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26  ' && x[1]==':' &
d560: 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20  & x[2]=='=' ){. 
d570: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
d580: 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20  e = IN_RHS;.    
d590: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d    }else if( x[0]
d5a0: 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20  =='(' ){.       
d5b0: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48   psp->state = LH
d5c0: 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20  S_ALIAS_1;.     
d5d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d5e0: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
d5f0: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
d600: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
d610: 20 20 20 22 45 78 70 65 63 74 65 64 20 74 6f 20     "Expected to 
d620: 73 65 65 20 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c  see a \":\" foll
d630: 6f 77 69 6e 67 20 74 68 65 20 4c 48 53 20 73 79  owing the LHS sy
d640: 6d 62 6f 6c 20 5c 22 25 73 5c 22 2e 22 2c 0a 20  mbol \"%s\".",. 
d650: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68           psp->lh
d660: 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  s->name);.      
d670: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
d680: 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
d690: 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
d6a0: 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
d6b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
d6c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c  reak;.    case L
d6d0: 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20  HS_ALIAS_1:.    
d6e0: 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b    if( isalpha(x[
d6f0: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
d700: 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 78  sp->lhsalias = x
d710: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
d720: 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53  tate = LHS_ALIAS
d730: 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _2;.      }else{
d740: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
d750: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
d760: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
d770: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 25  ,.          "\"%
d780: 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c  s\" is not a val
d790: 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  id alias for the
d7a0: 20 4c 48 53 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a   LHS \"%s\"\n",.
d7b0: 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d            x,psp-
d7c0: 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  >lhs->name);.   
d7d0: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
d7e0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
d7f0: 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
d800: 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
d810: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
d820: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
d830: 65 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20  e LHS_ALIAS_2:. 
d840: 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
d850: 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  )' ){.        ps
d860: 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41  p->state = LHS_A
d870: 4c 49 41 53 5f 33 3b 0a 20 20 20 20 20 20 7d 65  LIAS_3;.      }e
d880: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
d890: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
d8a0: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
d8b0: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
d8c0: 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20 66  "Missing \")\" f
d8d0: 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69  ollowing LHS ali
d8e0: 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22  as name \"%s\"."
d8f0: 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b  ,psp->lhsalias);
d900: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
d910: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
d920: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
d930: 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
d940: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
d950: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d960: 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f   case LHS_ALIAS_
d970: 33 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  3:.      if( x[0
d980: 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d  ]==':' && x[1]==
d990: 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27  ':' && x[2]=='='
d9a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
d9b0: 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b  >state = IN_RHS;
d9c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d9d0: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
d9e0: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
d9f0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
da00: 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e           "Missin
da10: 67 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69  g \"->\" followi
da20: 6e 67 3a 20 5c 22 25 73 28 25 73 29 5c 22 2e 22  ng: \"%s(%s)\"."
da30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 73 70  ,.           psp
da40: 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d  ->lhs->name,psp-
da50: 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20  >lhsalias);.    
da60: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
da70: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
da80: 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
da90: 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
daa0: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
dab0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
dac0: 20 49 4e 5f 52 48 53 3a 0a 20 20 20 20 20 20 69   IN_RHS:.      i
dad0: 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a  f( x[0]=='.' ){.
dae0: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 72          struct r
daf0: 75 6c 65 20 2a 72 70 3b 0a 20 20 20 20 20 20 20  ule *rp;.       
db00: 20 72 70 20 3d 20 28 73 74 72 75 63 74 20 72 75   rp = (struct ru
db10: 6c 65 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  le *)malloc( siz
db20: 65 6f 66 28 73 74 72 75 63 74 20 72 75 6c 65 29  eof(struct rule)
db30: 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   + .            
db40: 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
db50: 79 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68  ymbol*)*psp->nrh
db60: 73 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72 2a  s + sizeof(char*
db70: 29 2a 70 73 70 2d 3e 6e 72 68 73 20 29 3b 0a 20  )*psp->nrhs );. 
db80: 20 20 20 20 20 20 20 69 66 28 20 72 70 3d 3d 30         if( rp==0
db90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72   ){.          Er
dba0: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
dbb0: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
dbc0: 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
dbd0: 20 20 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61     "Can't alloca
dbe0: 74 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79  te enough memory
dbf0: 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65 2e 22   for this rule."
dc00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
dc10: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
dc20: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
dc30: 76 72 75 6c 65 20 3d 20 30 3b 0a 09 7d 65 6c 73  vrule = 0;..}els
dc40: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
dc50: 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70   i;.          rp
dc60: 2d 3e 72 75 6c 65 6c 69 6e 65 20 3d 20 70 73 70  ->ruleline = psp
dc70: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20  ->tokenlineno;. 
dc80: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73           rp->rhs
dc90: 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f   = (struct symbo
dca0: 6c 2a 2a 29 26 72 70 5b 31 5d 3b 0a 20 20 20 20  l**)&rp[1];.    
dcb0: 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69        rp->rhsali
dcc0: 61 73 20 3d 20 28 63 68 61 72 2a 2a 29 26 28 72  as = (char**)&(r
dcd0: 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73  p->rhs[psp->nrhs
dce0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ]);.          fo
dcf0: 72 28 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e 72  r(i=0; i<psp->nr
dd00: 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
dd10: 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d        rp->rhs[i]
dd20: 20 3d 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b 0a   = psp->rhs[i];.
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e              rp->
dd40: 72 68 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70 73  rhsalias[i] = ps
dd50: 70 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a 09 20 20  p->alias[i];..  
dd60: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  }.          rp->
dd70: 6c 68 73 20 3d 20 70 73 70 2d 3e 6c 68 73 3b 0a  lhs = psp->lhs;.
dd80: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68            rp->lh
dd90: 73 61 6c 69 61 73 20 3d 20 70 73 70 2d 3e 6c 68  salias = psp->lh
dda0: 73 61 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  salias;.        
ddb0: 20 20 72 70 2d 3e 6e 72 68 73 20 3d 20 70 73 70    rp->nrhs = psp
ddc0: 2d 3e 6e 72 68 73 3b 0a 20 20 20 20 20 20 20 20  ->nrhs;.        
ddd0: 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a    rp->code = 0;.
dde0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72            rp->pr
ddf0: 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20 20  ecsym = 0;.     
de00: 20 20 20 20 20 72 70 2d 3e 69 6e 64 65 78 20 3d       rp->index =
de10: 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 2b   psp->gp->nrule+
de20: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  +;.          rp-
de30: 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e 6c  >nextlhs = rp->l
de40: 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20 20  hs->rule;.      
de50: 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c      rp->lhs->rul
de60: 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20  e = rp;.        
de70: 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a    rp->next = 0;.
de80: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 73            if( ps
de90: 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30 20  p->firstrule==0 
dea0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
deb0: 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20  sp->firstrule = 
dec0: 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20  psp->lastrule = 
ded0: 72 70 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a 20 20  rp;..  }else{.  
dee0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c            psp->l
def0: 61 73 74 72 75 6c 65 2d 3e 6e 65 78 74 20 3d 20  astrule->next = 
df00: 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  rp;.            
df10: 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20  psp->lastrule = 
df20: 72 70 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20 20  rp;..  }.       
df30: 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
df40: 20 3d 20 72 70 3b 0a 09 7d 0a 20 20 20 20 20 20   = rp;..}.      
df50: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
df60: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
df70: 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d  OR_RULE;.      }
df80: 65 6c 73 65 20 69 66 28 20 69 73 61 6c 70 68 61  else if( isalpha
df90: 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
dfa0: 20 20 69 66 28 20 70 73 70 2d 3e 6e 72 68 73 3e    if( psp->nrhs>
dfb0: 3d 4d 41 58 52 48 53 20 29 7b 0a 20 20 20 20 20  =MAXRHS ){.     
dfc0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
dfd0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
dfe0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
dff0: 20 20 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d            "Too m
e000: 61 6e 79 20 73 79 6d 62 6f 6c 20 6f 6e 20 52 48  any symbol on RH
e010: 53 20 6f 72 20 72 75 6c 65 20 62 65 67 69 6e 6e  S or rule beginn
e020: 69 6e 67 20 61 74 20 5c 22 25 73 5c 22 2e 22 2c  ing at \"%s\".",
e030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 29 3b  .            x);
e040: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
e050: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
e060: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
e070: 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
e080: 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 09 7d 65 6c  RULE_ERROR;..}el
e090: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73  se{.          ps
e0a0: 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73  p->rhs[psp->nrhs
e0b0: 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  ] = Symbol_new(x
e0c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
e0d0: 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68  ->alias[psp->nrh
e0e0: 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  s] = 0;.        
e0f0: 20 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 09    psp->nrhs++;..
e100: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
e110: 28 20 78 5b 30 5d 3d 3d 27 28 27 20 26 26 20 70  ( x[0]=='(' && p
e120: 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20 20  sp->nrhs>0 ){.  
e130: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
e140: 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 31 3b 0a   = RHS_ALIAS_1;.
e150: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e160: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
e170: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
e180: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
e190: 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c          "Illegal
e1a0: 20 63 68 61 72 61 63 74 65 72 20 6f 6e 20 52 48   character on RH
e1b0: 53 20 6f 66 20 72 75 6c 65 3a 20 5c 22 25 73 5c  S of rule: \"%s\
e1c0: 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20  ".",x);.        
e1d0: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
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 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
e200: 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20  ER_RULE_ERROR;. 
e210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
e220: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 48 53  ak;.    case RHS
e230: 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20 20  _ALIAS_1:.      
e240: 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d  if( isalpha(x[0]
e250: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ) ){.        psp
e260: 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68  ->alias[psp->nrh
e270: 73 2d 31 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20  s-1] = x;.      
e280: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
e290: 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20 20  HS_ALIAS_2;.    
e2a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e2b0: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
e2c0: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
e2d0: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
e2e0: 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73 20 6e      "\"%s\" is n
e2f0: 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69 61 73  ot a valid alias
e300: 20 66 6f 72 20 74 68 65 20 52 48 53 20 73 79 6d   for the RHS sym
e310: 62 6f 6c 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20  bol \"%s\"\n",. 
e320: 20 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d 3e           x,psp->
e330: 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d  rhs[psp->nrhs-1]
e340: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
e350: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
e360: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
e370: 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
e380: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
e390: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
e3a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 48  eak;.    case RH
e3b0: 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20  S_ALIAS_2:.     
e3c0: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29   if( x[0]==')' )
e3d0: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
e3e0: 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20  tate = IN_RHS;. 
e3f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e400: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
e410: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
e420: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
e430: 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20         "Missing 
e440: 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20  \")\" following 
e450: 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65 20 5c  LHS alias name \
e460: 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68 73  "%s\".",psp->lhs
e470: 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20  alias);.        
e480: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
e490: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
e4a0: 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
e4b0: 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20  ER_RULE_ERROR;. 
e4c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
e4d0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
e4e0: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45  TING_FOR_DECL_KE
e4f0: 59 57 4f 52 44 3a 0a 20 20 20 20 20 20 69 66 28  YWORD:.      if(
e500: 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29   isalpha(x[0]) )
e510: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64  {.        psp->d
e520: 65 63 6c 6b 65 79 77 6f 72 64 20 3d 20 78 3b 0a  eclkeyword = x;.
e530: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
e540: 6c 61 72 67 73 6c 6f 74 20 3d 20 30 3b 0a 20 20  largslot = 0;.  
e550: 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c        psp->decll
e560: 6e 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20  nslot = 0;.     
e570: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
e580: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
e590: 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20 69 66  _ARG;.        if
e5a0: 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 61 6d 65  ( strcmp(x,"name
e5b0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
e5c0: 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
e5d0: 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
e5e0: 3e 6e 61 6d 65 29 3b 0a 09 7d 65 6c 73 65 20 69  >name);..}else i
e5f0: 66 28 20 73 74 72 63 6d 70 28 78 2c 22 69 6e 63  f( strcmp(x,"inc
e600: 6c 75 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lude")==0 ){.   
e610: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
e620: 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
e630: 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 29 3b 0a 20  >gp->include);. 
e640: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
e650: 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d  cllnslot = &psp-
e660: 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 6c 6e 3b 0a  >gp->includeln;.
e670: 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d  .}else if( strcm
e680: 70 28 78 2c 22 63 6f 64 65 22 29 3d 3d 30 20 29  p(x,"code")==0 )
e690: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
e6a0: 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
e6b0: 28 70 73 70 2d 3e 67 70 2d 3e 65 78 74 72 61 63  (psp->gp->extrac
e6c0: 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ode);.          
e6d0: 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
e6e0: 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 65 78 74 72  = &psp->gp->extr
e6f0: 61 63 6f 64 65 6c 6e 3b 0a 09 7d 65 6c 73 65 20  acodeln;..}else 
e700: 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f  if( strcmp(x,"to
e710: 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72 22 29  ken_destructor")
e720: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
e730: 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
e740: 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f  t = &psp->gp->to
e750: 6b 65 6e 64 65 73 74 3b 0a 20 20 20 20 20 20 20  kendest;.       
e760: 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c     psp->decllnsl
e770: 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74  ot = &psp->gp->t
e780: 6f 6b 65 6e 64 65 73 74 6c 6e 3b 0a 09 7d 65 6c  okendestln;..}el
e790: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
e7a0: 22 64 65 66 61 75 6c 74 5f 64 65 73 74 72 75 63  "default_destruc
e7b0: 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tor")==0 ){.    
e7c0: 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
e7d0: 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67  rgslot = &psp->g
e7e0: 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20 20  p->vardest;.    
e7f0: 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c        psp->decll
e800: 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70  nslot = &psp->gp
e810: 2d 3e 76 61 72 64 65 73 74 6c 6e 3b 0a 09 7d 65  ->vardestln;..}e
e820: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
e830: 2c 22 74 6f 6b 65 6e 5f 70 72 65 66 69 78 22 29  ,"token_prefix")
e840: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
e850: 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
e860: 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f  t = &psp->gp->to
e870: 6b 65 6e 70 72 65 66 69 78 3b 0a 09 7d 65 6c 73  kenprefix;..}els
e880: 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
e890: 73 79 6e 74 61 78 5f 65 72 72 6f 72 22 29 3d 3d  syntax_error")==
e8a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
e8b0: 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
e8c0: 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65 72 72  = &(psp->gp->err
e8d0: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  or);.          p
e8e0: 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d  sp->decllnslot =
e8f0: 20 26 70 73 70 2d 3e 67 70 2d 3e 65 72 72 6f 72   &psp->gp->error
e900: 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73  ln;..}else if( s
e910: 74 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 61  trcmp(x,"parse_a
e920: 63 63 65 70 74 22 29 3d 3d 30 20 29 7b 0a 20 20  ccept")==0 ){.  
e930: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
e940: 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
e950: 2d 3e 67 70 2d 3e 61 63 63 65 70 74 29 3b 0a 20  ->gp->accept);. 
e960: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
e970: 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d  cllnslot = &psp-
e980: 3e 67 70 2d 3e 61 63 63 65 70 74 6c 6e 3b 0a 09  >gp->acceptln;..
e990: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
e9a0: 28 78 2c 22 70 61 72 73 65 5f 66 61 69 6c 75 72  (x,"parse_failur
e9b0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
e9c0: 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
e9d0: 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
e9e0: 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 20 20 20 20  ->failure);.    
e9f0: 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c        psp->decll
ea00: 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70  nslot = &psp->gp
ea10: 2d 3e 66 61 69 6c 75 72 65 6c 6e 3b 0a 09 7d 65  ->failureln;..}e
ea20: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
ea30: 2c 22 73 74 61 63 6b 5f 6f 76 65 72 66 6c 6f 77  ,"stack_overflow
ea40: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
ea50: 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
ea60: 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
ea70: 3e 6f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  >overflow);.    
ea80: 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c        psp->decll
ea90: 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70  nslot = &psp->gp
eaa0: 2d 3e 6f 76 65 72 66 6c 6f 77 6c 6e 3b 0a 20 20  ->overflowln;.  
eab0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
eac0: 73 74 72 63 6d 70 28 78 2c 22 65 78 74 72 61 5f  strcmp(x,"extra_
ead0: 61 72 67 75 6d 65 6e 74 22 29 3d 3d 30 20 29 7b  argument")==0 ){
eae0: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
eaf0: 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
eb00: 70 73 70 2d 3e 67 70 2d 3e 61 72 67 29 3b 0a 20  psp->gp->arg);. 
eb10: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
eb20: 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e   strcmp(x,"token
eb30: 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20  _type")==0 ){.  
eb40: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
eb50: 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
eb60: 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 29  ->gp->tokentype)
eb70: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
eb80: 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65  if( strcmp(x,"de
eb90: 66 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20  fault_type")==0 
eba0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
ebb0: 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
ebc0: 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79  &(psp->gp->varty
ebd0: 70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  pe);.        }el
ebe0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
ebf0: 22 73 74 61 63 6b 5f 73 69 7a 65 22 29 3d 3d 30  "stack_size")==0
ec00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
ec10: 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
ec20: 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61 63   &(psp->gp->stac
ec30: 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  ksize);.        
ec40: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
ec50: 28 78 2c 22 73 74 61 72 74 5f 73 79 6d 62 6f 6c  (x,"start_symbol
ec60: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
ec70: 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
ec80: 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
ec90: 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  >start);.       
eca0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
ecb0: 70 28 78 2c 22 6c 65 66 74 22 29 3d 3d 30 20 29  p(x,"left")==0 )
ecc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
ecd0: 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a  >preccounter++;.
ece0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
ecf0: 65 63 6c 61 73 73 6f 63 20 3d 20 4c 45 46 54 3b  eclassoc = LEFT;
ed00: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
ed10: 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
ed20: 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53  FOR_PRECEDENCE_S
ed30: 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d  YMBOL;.        }
ed40: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
ed50: 78 2c 22 72 69 67 68 74 22 29 3d 3d 30 20 29 7b  x,"right")==0 ){
ed60: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
ed70: 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  preccounter++;. 
ed80: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
ed90: 63 6c 61 73 73 6f 63 20 3d 20 52 49 47 48 54 3b  classoc = RIGHT;
eda0: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
edb0: 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
edc0: 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53  FOR_PRECEDENCE_S
edd0: 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d  YMBOL;.        }
ede0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
edf0: 78 2c 22 6e 6f 6e 61 73 73 6f 63 22 29 3d 3d 30  x,"nonassoc")==0
ee00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
ee10: 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b  p->preccounter++
ee20: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
ee30: 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e  >declassoc = NON
ee40: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  E;.          psp
ee50: 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
ee60: 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45  G_FOR_PRECEDENCE
ee70: 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20  _SYMBOL;..}else 
ee80: 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65  if( strcmp(x,"de
ee90: 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b  structor")==0 ){
eea0: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
eeb0: 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
eec0: 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53  FOR_DESTRUCTOR_S
eed0: 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20 69 66  YMBOL;..}else if
eee0: 28 20 73 74 72 63 6d 70 28 78 2c 22 74 79 70 65  ( strcmp(x,"type
eef0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
ef00: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
ef10: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41  WAITING_FOR_DATA
ef20: 54 59 50 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20  TYPE_SYMBOL;.   
ef30: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
ef40: 74 72 63 6d 70 28 78 2c 22 66 61 6c 6c 62 61 63  trcmp(x,"fallbac
ef50: 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  k")==0 ){.      
ef60: 20 20 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63      psp->fallbac
ef70: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  k = 0;.         
ef80: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
ef90: 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41  ITING_FOR_FALLBA
efa0: 43 4b 5f 49 44 3b 0a 20 20 20 20 20 20 20 20 7d  CK_ID;.        }
efb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
efc0: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
efd0: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
efe0: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
eff0: 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 64 65       "Unknown de
f000: 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72  claration keywor
f010: 64 3a 20 5c 22 25 25 25 73 5c 22 2e 22 2c 78 29  d: \"%%%s\".",x)
f020: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
f030: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
f040: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
f050: 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
f060: 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  _DECL_ERROR;..}.
f070: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f080: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
f090: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
f0a0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
f0b0: 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c          "Illegal
f0c0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79   declaration key
f0d0: 77 6f 72 64 3a 20 5c 22 25 73 5c 22 2e 22 2c 78  word: \"%s\".",x
f0e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
f0f0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
f100: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
f110: 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
f120: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
f130: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f140: 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
f150: 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53  FOR_DESTRUCTOR_S
f160: 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28  YMBOL:.      if(
f170: 20 21 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20   !isalpha(x[0]) 
f180: 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
f190: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
f1a0: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
f1b0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53  no,.          "S
f1c0: 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69  ymbol name missi
f1d0: 6e 67 20 61 66 74 65 72 20 25 64 65 73 74 72 75  ng after %destru
f1e0: 63 74 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b 0a  ctor keyword");.
f1f0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
f200: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
f210: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
f220: 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
f230: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
f240: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  se{.        stru
f250: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
f260: 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20  Symbol_new(x);. 
f270: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
f280: 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64  argslot = &sp->d
f290: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 20 20 20  estructor;.     
f2a0: 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c     psp->decllnsl
f2b0: 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 72 75  ot = &sp->destru
f2c0: 63 74 6f 72 6c 6e 3b 0a 20 20 20 20 20 20 20 20  ctorln;.        
f2d0: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
f2e0: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52  TING_FOR_DECL_AR
f2f0: 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  G;.      }.     
f300: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
f310: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54   WAITING_FOR_DAT
f320: 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20  ATYPE_SYMBOL:.  
f330: 20 20 20 20 69 66 28 20 21 69 73 61 6c 70 68 61      if( !isalpha
f340: 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
f350: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
f360: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
f370: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
f380: 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d       "Symbol nam
f390: 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20  e missing after 
f3a0: 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79 77  %destructor keyw
f3b0: 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ord");.        p
f3c0: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
f3d0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
f3e0: 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
f3f0: 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
f400: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f410: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
f420: 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65   *sp = Symbol_ne
f430: 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  w(x);.        ps
f440: 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
f450: 20 26 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a   &sp->datatype;.
f460: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
f470: 6c 6c 6e 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20  llnslot = 0;.   
f480: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
f490: 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
f4a0: 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a  CL_ARG;.      }.
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 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
f4e0: 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 78  BOL:.      if( x
f4f0: 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
f500: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
f510: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
f520: 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
f530: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 75 70 70   }else if( isupp
f540: 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  er(x[0]) ){.    
f550: 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
f560: 6c 20 2a 73 70 3b 0a 20 20 20 20 20 20 20 20 73  l *sp;.        s
f570: 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  p = Symbol_new(x
f580: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
f590: 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20  p->prec>=0 ){.  
f5a0: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
f5b0: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
f5c0: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
f5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53 79  .            "Sy
f5e0: 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 68 61 73 20  mbol \"%s\" has 
f5f0: 61 6c 72 65 61 64 79 20 62 65 20 67 69 76 65 6e  already be given
f600: 20 61 20 70 72 65 63 65 64 65 6e 63 65 2e 22 2c   a precedence.",
f610: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
f620: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 09  p->errorcnt++;..
f630: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
f640: 20 73 70 2d 3e 70 72 65 63 20 3d 20 70 73 70 2d   sp->prec = psp-
f650: 3e 70 72 65 63 63 6f 75 6e 74 65 72 3b 0a 20 20  >preccounter;.  
f660: 20 20 20 20 20 20 20 20 73 70 2d 3e 61 73 73 6f          sp->asso
f670: 63 20 3d 20 70 73 70 2d 3e 64 65 63 6c 61 73 73  c = psp->declass
f680: 6f 63 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c  oc;..}.      }el
f690: 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
f6a0: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
f6b0: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
f6c0: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
f6d0: 43 61 6e 27 74 20 61 73 73 69 67 6e 20 61 20 70  Can't assign a p
f6e0: 72 65 63 65 64 65 6e 63 65 20 74 6f 20 5c 22 25  recedence to \"%
f6f0: 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  s\".",x);.      
f700: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
f710: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
f720: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
f730: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
f740: 4c 5f 41 52 47 3a 0a 20 20 20 20 20 20 69 66 28  L_ARG:.      if(
f750: 20 28 78 5b 30 5d 3d 3d 27 7b 27 20 7c 7c 20 78   (x[0]=='{' || x
f760: 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c 20 69 73 61  [0]=='\"' || isa
f770: 6c 6e 75 6d 28 78 5b 30 5d 29 29 20 29 7b 0a 20  lnum(x[0])) ){. 
f780: 20 20 20 20 20 20 20 69 66 28 20 2a 28 70 73 70         if( *(psp
f790: 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 29 21 3d  ->declargslot)!=
f7a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
f7b0: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
f7c0: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
f7d0: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
f7e0: 20 20 20 20 22 54 68 65 20 61 72 67 75 6d 65 6e      "The argumen
f7f0: 74 20 5c 22 25 73 5c 22 20 74 6f 20 64 65 63 6c  t \"%s\" to decl
f800: 61 72 61 74 69 6f 6e 20 5c 22 25 25 25 73 5c 22  aration \"%%%s\"
f810: 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73   is not the firs
f820: 74 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  t.",.           
f830: 20 78 5b 30 5d 3d 3d 27 5c 22 27 20 3f 20 26 78   x[0]=='\"' ? &x
f840: 5b 31 5d 20 3a 20 78 2c 70 73 70 2d 3e 64 65 63  [1] : x,psp->dec
f850: 6c 6b 65 79 77 6f 72 64 29 3b 0a 20 20 20 20 20  lkeyword);.     
f860: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
f870: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
f880: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
f890: 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
f8a0: 52 52 4f 52 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20  RROR;..}else{.  
f8b0: 20 20 20 20 20 20 20 20 2a 28 70 73 70 2d 3e 64          *(psp->d
f8c0: 65 63 6c 61 72 67 73 6c 6f 74 29 20 3d 20 28 78  eclargslot) = (x
f8d0: 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c 20 78 5b 30  [0]=='\"' || x[0
f8e0: 5d 3d 3d 27 7b 27 29 20 3f 20 26 78 5b 31 5d 20  ]=='{') ? &x[1] 
f8f0: 3a 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  : x;.          i
f900: 66 28 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c  f( psp->decllnsl
f910: 6f 74 20 29 20 2a 70 73 70 2d 3e 64 65 63 6c 6c  ot ) *psp->decll
f920: 6e 73 6c 6f 74 20 3d 20 70 73 70 2d 3e 74 6f 6b  nslot = psp->tok
f930: 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  enlineno;.      
f940: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
f950: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
f960: 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 09 7d 0a 20 20  L_OR_RULE;..}.  
f970: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f980: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
f990: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
f9a0: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
f9b0: 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 61        "Illegal a
f9c0: 72 67 75 6d 65 6e 74 20 74 6f 20 25 25 25 73 3a  rgument to %%%s:
f9d0: 20 25 73 22 2c 70 73 70 2d 3e 64 65 63 6c 6b 65   %s",psp->declke
f9e0: 79 77 6f 72 64 2c 78 29 3b 0a 20 20 20 20 20 20  yword,x);.      
f9f0: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
fa00: 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
fa10: 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
fa20: 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
fa30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
fa40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
fa50: 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42  AITING_FOR_FALLB
fa60: 41 43 4b 5f 49 44 3a 0a 20 20 20 20 20 20 69 66  ACK_ID:.      if
fa70: 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
fa80: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
fa90: 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
faa0: 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
fab0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69      }else if( !i
fac0: 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a  supper(x[0]) ){.
fad0: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
fae0: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
faf0: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
fb00: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 25 66  ,.          "%%f
fb10: 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74  allback argument
fb20: 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62   \"%s\" should b
fb30: 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a  e a token", x);.
fb40: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
fb50: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
fb60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
fb70: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
fb80: 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
fb90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70  .        if( psp
fba0: 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b  ->fallback==0 ){
fbb0: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
fbc0: 66 61 6c 6c 62 61 63 6b 20 3d 20 73 70 3b 0a 20  fallback = sp;. 
fbd0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
fbe0: 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 29 7b   sp->fallback ){
fbf0: 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
fc00: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
fc10: 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
fc20: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
fc30: 20 22 4d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20   "More than one 
fc40: 66 61 6c 6c 62 61 63 6b 20 61 73 73 69 67 6e 65  fallback assigne
fc50: 64 20 74 6f 20 74 6f 6b 65 6e 20 25 73 22 2c 20  d to token %s", 
fc60: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
fc70: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
fc80: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
fc90: 20 20 20 20 20 20 20 20 73 70 2d 3e 66 61 6c 6c          sp->fall
fca0: 62 61 63 6b 20 3d 20 70 73 70 2d 3e 66 61 6c 6c  back = psp->fall
fcb0: 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  back;.          
fcc0: 70 73 70 2d 3e 67 70 2d 3e 68 61 73 5f 66 61 6c  psp->gp->has_fal
fcd0: 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  lback = 1;.     
fce0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
fcf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
fd00: 73 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f  se RESYNC_AFTER_
fd10: 52 55 4c 45 5f 45 52 52 4f 52 3a 0a 2f 2a 20 20  RULE_ERROR:./*  
fd20: 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e      if( x[0]=='.
fd30: 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d  ' ) psp->state =
fd40: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
fd50: 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 2a 2a 20 20 20  L_OR_RULE;.**   
fd60: 20 20 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20     break; */.   
fd70: 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41 46 54   case RESYNC_AFT
fd80: 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3a 0a 20  ER_DECL_ERROR:. 
fd90: 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
fda0: 2e 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20  .' ) psp->state 
fdb0: 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
fdc0: 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20  CL_OR_RULE;.    
fdd0: 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20    if( x[0]=='%' 
fde0: 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57  ) psp->state = W
fdf0: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
fe00: 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20 62  KEYWORD;.      b
fe10: 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  reak;.  }.}../* 
fe20: 49 6e 20 73 70 69 74 65 20 6f 66 20 69 74 73 20  In spite of its 
fe30: 6e 61 6d 65 2c 20 74 68 69 73 20 66 75 6e 63 74  name, this funct
fe40: 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ion is really a 
fe50: 73 63 61 6e 6e 65 72 2e 20 20 49 74 20 72 65 61  scanner.  It rea
fe60: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 65 6e 74 69  d.** in the enti
fe70: 72 65 20 69 6e 70 75 74 20 66 69 6c 65 20 28 61  re input file (a
fe80: 6c 6c 20 61 74 20 6f 6e 63 65 29 20 74 68 65 6e  ll at once) then
fe90: 20 74 6f 6b 65 6e 69 7a 65 73 20 69 74 2e 20 20   tokenizes it.  
fea0: 45 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20 69 73  Each.** token is
feb0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 66   passed to the f
fec0: 75 6e 63 74 69 6f 6e 20 22 70 61 72 73 65 6f 6e  unction "parseon
fed0: 65 74 6f 6b 65 6e 22 20 77 68 69 63 68 20 62 75  etoken" which bu
fee0: 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20 74 68 65 20  ilds all.** the 
fef0: 61 70 70 72 6f 70 72 69 61 74 65 20 64 61 74 61  appropriate data
ff00: 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74   structures in t
ff10: 68 65 20 67 6c 6f 62 61 6c 20 73 74 61 74 65 20  he global state 
ff20: 76 65 63 74 6f 72 20 22 67 70 22 2e 0a 2a 2f 0a  vector "gp"..*/.
ff30: 76 6f 69 64 20 50 61 72 73 65 28 67 70 29 0a 73  void Parse(gp).s
ff40: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b  truct lemon *gp;
ff50: 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 73 74 61  .{.  struct psta
ff60: 74 65 20 70 73 3b 0a 20 20 46 49 4c 45 20 2a 66  te ps;.  FILE *f
ff70: 70 3b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 62  p;.  char *fileb
ff80: 75 66 3b 0a 20 20 69 6e 74 20 66 69 6c 65 73 69  uf;.  int filesi
ff90: 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f  ze;.  int lineno
ffa0: 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68 61  ;.  int c;.  cha
ffb0: 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63 70 3b 0a  r *cp, *nextcp;.
ffc0: 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e 65 20    int startline 
ffd0: 3d 20 30 3b 0a 0a 20 20 70 73 2e 67 70 20 3d 20  = 0;..  ps.gp = 
ffe0: 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65 6e 61 6d  gp;.  ps.filenam
fff0: 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e 61 6d 65  e = gp->filename
10000 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 20  ;.  ps.errorcnt 
10010 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61 74 65 20  = 0;.  ps.state 
10020 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b 0a 0a 20  = INITIALIZE;.. 
10030 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 65 61   /* Begin by rea
10040 64 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20 66  ding the input f
10050 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d 20 66 6f  ile */.  fp = fo
10060 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  pen(ps.filename,
10070 22 72 62 22 29 3b 0a 20 20 69 66 28 20 66 70 3d  "rb");.  if( fp=
10080 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d  =0 ){.    ErrorM
10090 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30  sg(ps.filename,0
100a0 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 69  ,"Can't open thi
100b0 73 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  s file for readi
100c0 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70 2d 3e 65  ng.");.    gp->e
100d0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72  rrorcnt++;.    r
100e0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 73 65  eturn;.  }.  fse
100f0 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20 20 66 69  ek(fp,0,2);.  fi
10100 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c 6c 28 66  lesize = ftell(f
10110 70 29 3b 0a 20 20 72 65 77 69 6e 64 28 66 70 29  p);.  rewind(fp)
10120 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d 20 28 63  ;.  filebuf = (c
10130 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 66 69  har *)malloc( fi
10140 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20 20 69 66  lesize+1 );.  if
10150 28 20 66 69 6c 65 62 75 66 3d 3d 30 20 29 7b 0a  ( filebuf==0 ){.
10160 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e      ErrorMsg(ps.
10170 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27  filename,0,"Can'
10180 74 20 61 6c 6c 6f 63 61 74 65 20 25 64 20 6f 66  t allocate %d of
10190 20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20   memory to hold 
101a0 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20 20  this file.",.   
101b0 20 20 20 66 69 6c 65 73 69 7a 65 2b 31 29 3b 0a     filesize+1);.
101c0 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74      gp->errorcnt
101d0 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
101e0 20 20 7d 0a 20 20 69 66 28 20 66 72 65 61 64 28    }.  if( fread(
101f0 66 69 6c 65 62 75 66 2c 31 2c 66 69 6c 65 73 69  filebuf,1,filesi
10200 7a 65 2c 66 70 29 21 3d 66 69 6c 65 73 69 7a 65  ze,fp)!=filesize
10210 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67   ){.    ErrorMsg
10220 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22  (ps.filename,0,"
10230 43 61 6e 27 74 20 72 65 61 64 20 69 6e 20 61 6c  Can't read in al
10240 6c 20 25 64 20 62 79 74 65 73 20 6f 66 20 74 68  l %d bytes of th
10250 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20 20 20 20  is file.",.     
10260 20 66 69 6c 65 73 69 7a 65 29 3b 0a 20 20 20 20   filesize);.    
10270 66 72 65 65 28 66 69 6c 65 62 75 66 29 3b 0a 20  free(filebuf);. 
10280 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b     gp->errorcnt+
10290 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
102a0 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70 29 3b   }.  fclose(fp);
102b0 0a 20 20 66 69 6c 65 62 75 66 5b 66 69 6c 65 73  .  filebuf[files
102c0 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ize] = 0;..  /* 
102d0 4e 6f 77 20 73 63 61 6e 20 74 68 65 20 74 65 78  Now scan the tex
102e0 74 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66  t of the input f
102f0 69 6c 65 20 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20  ile */.  lineno 
10300 3d 20 31 3b 0a 20 20 66 6f 72 28 63 70 3d 66 69  = 1;.  for(cp=fi
10310 6c 65 62 75 66 3b 20 28 63 3d 20 2a 63 70 29 21  lebuf; (c= *cp)!
10320 3d 30 3b 20 29 7b 0a 20 20 20 20 69 66 28 20 63  =0; ){.    if( c
10330 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
10340 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +;              
10350 2f 2a 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66  /* Keep track of
10360 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72   the line number
10370 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 73 70   */.    if( issp
10380 61 63 65 28 63 29 20 29 7b 20 63 70 2b 2b 3b 20  ace(c) ){ cp++; 
10390 63 6f 6e 74 69 6e 75 65 3b 20 7d 20 20 2f 2a 20  continue; }  /* 
103a0 53 6b 69 70 20 61 6c 6c 20 77 68 69 74 65 20 73  Skip all white s
103b0 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  pace */.    if( 
103c0 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d  c=='/' && cp[1]=
103d0 3d 27 2f 27 20 29 7b 20 20 20 20 20 20 20 20 20  ='/' ){         
103e0 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74 79   /* Skip C++ sty
103f0 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20  le comments */. 
10400 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20       cp+=2;.    
10410 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70    while( (c= *cp
10420 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20  )!=0 && c!='\n' 
10430 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f  ) cp++;.      co
10440 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
10450 20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20    if( c=='/' && 
10460 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 20  cp[1]=='*' ){   
10470 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43         /* Skip C
10480 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20   style comments 
10490 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a  */.      cp+=2;.
104a0 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
104b0 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d   *cp)!=0 && (c!=
104c0 27 2f 27 20 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27  '/' || cp[-1]!='
104d0 2a 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  *') ){.        i
104e0 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
104f0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63  eno++;.        c
10500 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p++;.      }.   
10510 20 20 20 69 66 28 20 63 20 29 20 63 70 2b 2b 3b     if( c ) cp++;
10520 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
10530 0a 20 20 20 20 7d 0a 20 20 20 20 70 73 2e 74 6f  .    }.    ps.to
10540 6b 65 6e 73 74 61 72 74 20 3d 20 63 70 3b 20 20  kenstart = cp;  
10550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10560 20 4d 61 72 6b 20 74 68 65 20 62 65 67 69 6e 6e   Mark the beginn
10570 69 6e 67 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e  ing of the token
10580 20 2a 2f 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e   */.    ps.token
10590 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b  lineno = lineno;
105a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
105b0 6e 65 6e 75 6d 62 65 72 20 6f 6e 20 77 68 69 63  nenumber on whic
105c0 68 20 74 6f 6b 65 6e 20 62 65 67 69 6e 73 20 2a  h token begins *
105d0 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 22  /.    if( c=='\"
105e0 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ' ){            
105f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
10600 6e 67 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20  ng literals */. 
10610 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20       cp++;.     
10620 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29   while( (c= *cp)
10630 21 3d 30 20 26 26 20 63 21 3d 27 5c 22 27 20 29  !=0 && c!='\"' )
10640 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  {.        if( c=
10650 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
10660 3b 0a 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a  ;.        cp++;.
10670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10680 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c==0 ){.      
10690 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69    ErrorMsg(ps.fi
106a0 6c 65 6e 61 6d 65 2c 73 74 61 72 74 6c 69 6e 65  lename,startline
106b0 2c 0a 22 53 74 72 69 6e 67 20 73 74 61 72 74 69  ,."String starti
106c0 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20  ng on this line 
106d0 69 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  is not terminate
106e0 64 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64  d before the end
106f0 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 22 29 3b   of the file.");
10700 0a 20 20 20 20 20 20 20 20 70 73 2e 65 72 72 6f  .        ps.erro
10710 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
10720 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20  nextcp = cp;.   
10730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10740 20 20 6e 65 78 74 63 70 20 3d 20 63 70 2b 31 3b    nextcp = cp+1;
10750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
10760 73 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 7b  se if( c=='{' ){
10770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10780 2a 20 41 20 62 6c 6f 63 6b 20 6f 66 20 43 20 63  * A block of C c
10790 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ode */.      int
107a0 20 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 63 70   level;.      cp
107b0 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6c 65  ++;.      for(le
107c0 76 65 6c 3d 31 3b 20 28 63 3d 20 2a 63 70 29 21  vel=1; (c= *cp)!
107d0 3d 30 20 26 26 20 28 6c 65 76 65 6c 3e 31 20 7c  =0 && (level>1 |
107e0 7c 20 63 21 3d 27 7d 27 29 3b 20 63 70 2b 2b 29  | c!='}'); cp++)
107f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  {.        if( c=
10800 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
10810 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69  ;.        else i
10820 66 28 20 63 3d 3d 27 7b 27 20 29 20 6c 65 76 65  f( c=='{' ) leve
10830 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c 73  l++;.        els
10840 65 20 69 66 28 20 63 3d 3d 27 7d 27 20 29 20 6c  e if( c=='}' ) l
10850 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20  evel--;.        
10860 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f 27 20  else if( c=='/' 
10870 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b  && cp[1]=='*' ){
10880 20 20 2f 2a 20 53 6b 69 70 20 63 6f 6d 6d 65 6e    /* Skip commen
10890 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ts */.          
108a0 69 6e 74 20 70 72 65 76 63 3b 0a 20 20 20 20 20  int prevc;.     
108b0 20 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32 5d       cp = &cp[2]
108c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76  ;.          prev
108d0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  c = 0;.         
108e0 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29   while( (c= *cp)
108f0 21 3d 30 20 26 26 20 28 63 21 3d 27 2f 27 20 7c  !=0 && (c!='/' |
10900 7c 20 70 72 65 76 63 21 3d 27 2a 27 29 20 29 7b  | prevc!='*') ){
10910 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
10920 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e   c=='\n' ) linen
10930 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  o++;.           
10940 20 70 72 65 76 63 20 3d 20 63 3b 0a 20 20 20 20   prevc = c;.    
10950 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 09 20          cp++;.. 
10960 20 7d 0a 09 7d 65 6c 73 65 20 69 66 28 20 63 3d   }..}else if( c=
10970 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='/' && cp[1]=='
10980 2f 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 43  /' ){  /* Skip C
10990 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74  ++ style comment
109a0 73 20 74 6f 6f 20 2a 2f 0a 20 20 20 20 20 20 20  s too */.       
109b0 20 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a     cp = &cp[2];.
109c0 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
109d0 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
109e0 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a  c!='\n' ) cp++;.
109f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 20            if( c 
10a00 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 09 7d 65 6c  ) lineno++;..}el
10a10 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c  se if( c=='\'' |
10a20 7c 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20  | c=='\"' ){    
10a30 2f 2a 20 53 74 72 69 6e 67 20 61 20 63 68 61 72  /* String a char
10a40 61 63 74 65 72 20 6c 69 74 65 72 61 6c 73 20 2a  acter literals *
10a50 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
10a60 73 74 61 72 74 63 68 61 72 2c 20 70 72 65 76 63  startchar, prevc
10a70 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72  ;.          star
10a80 74 63 68 61 72 20 3d 20 63 3b 0a 20 20 20 20 20  tchar = c;.     
10a90 20 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a       prevc = 0;.
10aa0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 63 70            for(cp
10ab0 2b 2b 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  ++; (c= *cp)!=0 
10ac0 26 26 20 28 63 21 3d 73 74 61 72 74 63 68 61 72  && (c!=startchar
10ad0 20 7c 7c 20 70 72 65 76 63 3d 3d 27 5c 5c 27 29   || prevc=='\\')
10ae0 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; cp++){.       
10af0 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
10b00 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20   ) lineno++;.   
10b10 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72 65           if( pre
10b20 76 63 3d 3d 27 5c 5c 27 20 29 20 70 72 65 76 63  vc=='\\' ) prevc
10b30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
10b40 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
10b50 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 09      prevc = c;..
10b60 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20    }..}.      }. 
10b70 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
10b80 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
10b90 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 70 73  g(ps.filename,ps
10ba0 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43  .tokenlineno,."C
10bb0 20 63 6f 64 65 20 73 74 61 72 74 69 6e 67 20 6f   code starting o
10bc0 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e  n this line is n
10bd0 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65  ot terminated be
10be0 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20  fore the end of 
10bf0 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20  the file.");.   
10c00 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74       ps.errorcnt
10c10 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  ++;.        next
10c20 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d  cp = cp;.      }
10c30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65  else{.        ne
10c40 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20  xtcp = cp+1;.   
10c50 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
10c60 66 28 20 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b  f( isalnum(c) ){
10c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 65            /* Ide
10c80 6e 74 69 66 69 65 72 73 20 2a 2f 0a 20 20 20 20  ntifiers */.    
10c90 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70    while( (c= *cp
10ca0 29 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d  )!=0 && (isalnum
10cb0 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29  (c) || c=='_') )
10cc0 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78   cp++;.      nex
10cd0 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65  tcp = cp;.    }e
10ce0 6c 73 65 20 69 66 28 20 63 3d 3d 27 3a 27 20 26  lse if( c==':' &
10cf0 26 20 63 70 5b 31 5d 3d 3d 27 3a 27 20 26 26 20  & cp[1]==':' && 
10d00 63 70 5b 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a  cp[2]=='=' ){ /*
10d10 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 22 3a   The operator ":
10d20 3a 3d 22 20 2a 2f 0a 20 20 20 20 20 20 63 70 20  :=" */.      cp 
10d30 2b 3d 20 33 3b 0a 20 20 20 20 20 20 6e 65 78 74  += 3;.      next
10d40 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c  cp = cp;.    }el
10d50 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d70 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20 63  All other (one c
10d80 68 61 72 61 63 74 65 72 29 20 6f 70 65 72 61 74  haracter) operat
10d90 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b  ors */.      cp+
10da0 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20  +;.      nextcp 
10db0 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = cp;.    }.    
10dc0 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70  c = *cp;.    *cp
10dd0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10df0 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  Null terminate t
10e00 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  he token */.    
10e10 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26 70  parseonetoken(&p
10e20 73 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  s);             
10e30 2f 2a 20 50 61 72 73 65 20 74 68 65 20 74 6f 6b  /* Parse the tok
10e40 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d 20  en */.    *cp = 
10e50 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
10e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
10e70 74 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20  tore the buffer 
10e80 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65 78 74  */.    cp = next
10e90 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 66  cp;.  }.  free(f
10ea0 69 6c 65 62 75 66 29 3b 20 20 20 20 20 20 20 20  ilebuf);        
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10ec0 65 6c 65 61 73 65 20 74 68 65 20 62 75 66 66 65  elease the buffe
10ed0 72 20 61 66 74 65 72 20 70 61 72 73 69 6e 67 20  r after parsing 
10ee0 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d 20  */.  gp->rule = 
10ef0 70 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20 20  ps.firstrule;.  
10f00 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20 70  gp->errorcnt = p
10f10 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a  s.errorcnt;.}./*
10f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
10f40 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e  the file "plink.
10f50 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
10f60 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
10f70 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73  Routines process
10f80 69 6e 67 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ing configuratio
10f90 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f  n follow-set pro
10fa0 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a  pagation links.*
10fb0 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  * in the LEMON p
10fc0 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
10fd0 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
10fe0 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66  t plink *plink_f
10ff0 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  reelist = 0;../*
11000 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
11010 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74 20  plink */.struct 
11020 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77  plink *Plink_new
11030 28 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  (){.  struct pli
11040 6e 6b 20 2a 6e 65 77 3b 0a 0a 20 20 69 66 28 20  nk *new;..  if( 
11050 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d  plink_freelist==
11060 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
11070 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30      int amt = 10
11080 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65  0;.    plink_fre
11090 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20  elist = (struct 
110a0 70 6c 69 6e 6b 20 2a 29 6d 61 6c 6c 6f 63 28 20  plink *)malloc( 
110b0 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 70 6c  sizeof(struct pl
110c0 69 6e 6b 29 2a 61 6d 74 20 29 3b 0a 20 20 20 20  ink)*amt );.    
110d0 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  if( plink_freeli
110e0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  st==0 ){.      f
110f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20  printf(stderr,. 
11100 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20       "Unable to 
11110 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  allocate memory 
11120 66 6f 72 20 61 20 6e 65 77 20 66 6f 6c 6c 6f 77  for a new follow
11130 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e  -set propagation
11140 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20 20 20 20   link.\n");.    
11150 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d    exit(1);.    }
11160 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11170 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 70 6c 69 6e  amt-1; i++) plin
11180 6b 5f 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65  k_freelist[i].ne
11190 78 74 20 3d 20 26 70 6c 69 6e 6b 5f 66 72 65 65  xt = &plink_free
111a0 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 70  list[i+1];.    p
111b0 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 61 6d  link_freelist[am
111c0 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20  t-1].next = 0;. 
111d0 20 7d 0a 20 20 6e 65 77 20 3d 20 70 6c 69 6e 6b   }.  new = plink
111e0 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 70 6c 69  _freelist;.  pli
111f0 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70 6c  nk_freelist = pl
11200 69 6e 6b 5f 66 72 65 65 6c 69 73 74 2d 3e 6e 65  ink_freelist->ne
11210 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77  xt;.  return new
11220 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c  ;.}../* Add a pl
11230 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c  ink to a plink l
11240 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  ist */.void Plin
11250 6b 5f 61 64 64 28 70 6c 70 70 2c 63 66 70 29 0a  k_add(plpp,cfp).
11260 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 70  struct plink **p
11270 6c 70 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  lpp;.struct conf
11280 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72  ig *cfp;.{.  str
11290 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 3b 0a  uct plink *new;.
112a0 20 20 6e 65 77 20 3d 20 50 6c 69 6e 6b 5f 6e 65    new = Plink_ne
112b0 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65 78 74  w();.  new->next
112c0 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c 70   = *plpp;.  *plp
112d0 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d 3e  p = new;.  new->
112e0 63 66 70 20 3d 20 63 66 70 3b 0a 7d 0a 0a 2f 2a  cfp = cfp;.}../*
112f0 20 54 72 61 6e 73 66 65 72 20 65 76 65 72 79 20   Transfer every 
11300 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73  plink on the lis
11310 74 20 22 66 72 6f 6d 22 20 74 6f 20 74 68 65 20  t "from" to the 
11320 6c 69 73 74 20 22 74 6f 22 20 2a 2f 0a 76 6f 69  list "to" */.voi
11330 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 74 6f 2c  d Plink_copy(to,
11340 66 72 6f 6d 29 0a 73 74 72 75 63 74 20 70 6c 69  from).struct pli
11350 6e 6b 20 2a 2a 74 6f 3b 0a 73 74 72 75 63 74 20  nk **to;.struct 
11360 70 6c 69 6e 6b 20 2a 66 72 6f 6d 3b 0a 7b 0a 20  plink *from;.{. 
11370 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e   struct plink *n
11380 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28 20  extpl;.  while( 
11390 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78 74  from ){.    next
113a0 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b  pl = from->next;
113b0 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74 20  .    from->next 
113c0 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d  = *to;.    *to =
113d0 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d 20   from;.    from 
113e0 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a  = nextpl;.  }.}.
113f0 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79  ./* Delete every
11400 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69   plink on the li
11410 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b  st */.void Plink
11420 5f 64 65 6c 65 74 65 28 70 6c 70 29 0a 73 74 72  _delete(plp).str
11430 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a  uct plink *plp;.
11440 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  {.  struct plink
11450 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20 77 68 69   *nextpl;..  whi
11460 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20 6e  le( plp ){.    n
11470 65 78 74 70 6c 20 3d 20 70 6c 70 2d 3e 6e 65 78  extpl = plp->nex
11480 74 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e 65 78 74  t;.    plp->next
11490 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73   = plink_freelis
114a0 74 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65  t;.    plink_fre
114b0 65 6c 69 73 74 20 3d 20 70 6c 70 3b 0a 20 20 20  elist = plp;.   
114c0 20 70 6c 70 20 3d 20 6e 65 78 74 70 6c 3b 0a 20   plp = nextpl;. 
114d0 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   }.}./**********
114e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
114f0 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65 70  om the file "rep
11500 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ort.c" *********
11510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11520 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 64 75  */./*.** Procedu
11530 72 65 73 20 66 6f 72 20 67 65 6e 65 72 61 74 69  res for generati
11540 6e 67 20 72 65 70 6f 72 74 73 20 61 6e 64 20 74  ng reports and t
11550 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d  ables in the LEM
11560 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
11570 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e 65  tor..*/../* Gene
11580 72 61 74 65 20 61 20 66 69 6c 65 6e 61 6d 65 20  rate a filename 
11590 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 73  with the given s
115a0 75 66 66 69 78 2e 20 20 53 70 61 63 65 20 74 6f  uffix.  Space to
115b0 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 6e 61 6d   hold the.** nam
115c0 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20 6d 61 6c  e comes from mal
115d0 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
115e0 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
115f0 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
11600 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63  on..*/.PRIVATE c
11610 68 61 72 20 2a 66 69 6c 65 5f 6d 61 6b 65 6e 61  har *file_makena
11620 6d 65 28 6c 65 6d 70 2c 73 75 66 66 69 78 29 0a  me(lemp,suffix).
11630 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
11640 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66 66 69 78  mp;.char *suffix
11650 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65  ;.{.  char *name
11660 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20  ;.  char *cp;.. 
11670 20 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20   name = malloc( 
11680 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69 6c  strlen(lemp->fil
11690 65 6e 61 6d 65 29 20 2b 20 73 74 72 6c 65 6e 28  ename) + strlen(
116a0 73 75 66 66 69 78 29 20 2b 20 35 20 29 3b 0a 20  suffix) + 5 );. 
116b0 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a   if( name==0 ){.
116c0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
116d0 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61  rr,"Can't alloca
116e0 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 66  te space for a f
116f0 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20  ilename.\n");.  
11700 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
11710 20 73 74 72 63 70 79 28 6e 61 6d 65 2c 6c 65 6d   strcpy(name,lem
11720 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
11730 63 70 20 3d 20 73 74 72 72 63 68 72 28 6e 61 6d  cp = strrchr(nam
11740 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70  e,'.');.  if( cp
11750 20 29 20 2a 63 70 20 3d 20 30 3b 0a 20 20 73 74   ) *cp = 0;.  st
11760 72 63 61 74 28 6e 61 6d 65 2c 73 75 66 66 69 78  rcat(name,suffix
11770 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d 65  );.  return name
11780 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66  ;.}../* Open a f
11790 69 6c 65 20 77 69 74 68 20 61 20 6e 61 6d 65 20  ile with a name 
117a0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d  based on the nam
117b0 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66  e of the input f
117c0 69 6c 65 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68  ile,.** but with
117d0 20 61 20 64 69 66 66 65 72 65 6e 74 20 28 73 70   a different (sp
117e0 65 63 69 66 69 65 64 29 20 73 75 66 66 69 78 2c  ecified) suffix,
117f0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
11800 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
11810 73 74 72 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54  stream */.PRIVAT
11820 45 20 46 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65  E FILE *file_ope
11830 6e 28 6c 65 6d 70 2c 73 75 66 66 69 78 2c 6d 6f  n(lemp,suffix,mo
11840 64 65 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  de).struct lemon
11850 20 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75   *lemp;.char *su
11860 66 66 69 78 3b 0a 63 68 61 72 20 2a 6d 6f 64 65  ffix;.char *mode
11870 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a  ;.{.  FILE *fp;.
11880 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74  .  if( lemp->out
11890 6e 61 6d 65 20 29 20 66 72 65 65 28 6c 65 6d 70  name ) free(lemp
118a0 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65  ->outname);.  le
118b0 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69  mp->outname = fi
118c0 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70  le_makename(lemp
118d0 2c 20 73 75 66 66 69 78 29 3b 0a 20 20 66 70 20  , suffix);.  fp 
118e0 3d 20 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75  = fopen(lemp->ou
118f0 74 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69  tname,mode);.  i
11900 66 28 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64  f( fp==0 && *mod
11910 65 3d 3d 27 77 27 20 29 7b 0a 20 20 20 20 66 70  e=='w' ){.    fp
11920 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61  rintf(stderr,"Ca
11930 6e 27 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22  n't open file \"
11940 25 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f  %s\".\n",lemp->o
11950 75 74 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d  utname);.    lem
11960 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
11970 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
11980 0a 20 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a  .  return fp;.}.
11990 0a 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68  ./* Duplicate th
119a0 65 20 69 6e 70 75 74 20 66 69 6c 65 20 77 69 74  e input file wit
119b0 68 6f 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e  hout comments an
119c0 64 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f 6e  d without action
119d0 73 20 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a  s .** on rules *
119e0 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28 6c  /.void Reprint(l
119f0 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
11a00 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72  n *lemp;.{.  str
11a10 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
11a20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
11a30 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6d  p;.  int i, j, m
11a40 61 78 6c 65 6e 2c 20 6c 65 6e 2c 20 6e 63 6f 6c  axlen, len, ncol
11a50 75 6d 6e 73 2c 20 73 6b 69 70 3b 0a 20 20 70 72  umns, skip;.  pr
11a60 69 6e 74 66 28 22 2f 2f 20 52 65 70 72 69 6e 74  intf("// Reprint
11a70 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 5c   of input file \
11a80 22 25 73 5c 22 2e 5c 6e 2f 2f 20 53 79 6d 62 6f  "%s\".\n// Symbo
11a90 6c 73 3a 5c 6e 22 2c 6c 65 6d 70 2d 3e 66 69 6c  ls:\n",lemp->fil
11aa0 65 6e 61 6d 65 29 3b 0a 20 20 6d 61 78 6c 65 6e  ename);.  maxlen
11ab0 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28 69 3d 30   = 10;.  for(i=0
11ac0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
11ad0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 20  l; i++){.    sp 
11ae0 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
11af0 69 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74  i];.    len = st
11b00 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a  rlen(sp->name);.
11b10 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c      if( len>maxl
11b20 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65  en ) maxlen = le
11b30 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e  n;.  }.  ncolumn
11b40 73 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35  s = 76/(maxlen+5
11b50 29 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e  );.  if( ncolumn
11b60 73 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d  s<1 ) ncolumns =
11b70 20 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65   1;.  skip = (le
11b80 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63  mp->nsymbol + nc
11b90 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c  olumns - 1)/ncol
11ba0 75 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  umns;.  for(i=0;
11bb0 20 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20   i<skip; i++){. 
11bc0 20 20 20 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b     printf("//");
11bd0 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c  .    for(j=i; j<
11be0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a  lemp->nsymbol; j
11bf0 2b 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20 20 73  +=skip){.      s
11c00 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
11c10 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  s[j];.      asse
11c20 72 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a  rt( sp->index==j
11c30 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66   );.      printf
11c40 28 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a  (" %3d %-*.*s",j
11c50 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73  ,maxlen,maxlen,s
11c60 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  p->name);.    }.
11c70 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29      printf("\n")
11c80 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c  ;.  }.  for(rp=l
11c90 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
11ca0 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
11cb0 20 70 72 69 6e 74 66 28 22 25 73 22 2c 72 70 2d   printf("%s",rp-
11cc0 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 2f 2a 20  >lhs->name);./* 
11cd0 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c     if( rp->lhsal
11ce0 69 61 73 20 29 20 70 72 69 6e 74 66 28 22 28 25  ias ) printf("(%
11cf0 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73  s)",rp->lhsalias
11d00 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66  ); */.    printf
11d10 28 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20 66 6f  (" ::=");.    fo
11d20 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
11d30 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  s; i++){.      p
11d40 72 69 6e 74 66 28 22 20 25 73 22 2c 72 70 2d 3e  rintf(" %s",rp->
11d50 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 2f  rhs[i]->name);./
11d60 2a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72  *      if( rp->r
11d70 68 73 61 6c 69 61 73 5b 69 5d 20 29 20 70 72 69  hsalias[i] ) pri
11d80 6e 74 66 28 22 28 25 73 29 22 2c 72 70 2d 3e 72  ntf("(%s)",rp->r
11d90 68 73 61 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f 0a  hsalias[i]); */.
11da0 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66      }.    printf
11db0 28 22 2e 22 29 3b 0a 20 20 20 20 69 66 28 20 72  (".");.    if( r
11dc0 70 2d 3e 70 72 65 63 73 79 6d 20 29 20 70 72 69  p->precsym ) pri
11dd0 6e 74 66 28 22 20 5b 25 73 5d 22 2c 72 70 2d 3e  ntf(" [%s]",rp->
11de0 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b 0a  precsym->name);.
11df0 2f 2a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f  /*    if( rp->co
11e00 64 65 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 20  de ) printf("\n 
11e10 20 20 20 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29     %s",rp->code)
11e20 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28  ; */.    printf(
11e30 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f  "\n");.  }.}..vo
11e40 69 64 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 66  id ConfigPrint(f
11e50 70 2c 63 66 70 29 0a 46 49 4c 45 20 2a 66 70 3b  p,cfp).FILE *fp;
11e60 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
11e70 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  cfp;.{.  struct 
11e80 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74 20  rule *rp;.  int 
11e90 69 3b 0a 20 20 72 70 20 3d 20 63 66 70 2d 3e 72  i;.  rp = cfp->r
11ea0 70 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c  p;.  fprintf(fp,
11eb0 22 25 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c 68 73  "%s ::=",rp->lhs
11ec0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  ->name);.  for(i
11ed0 3d 30 3b 20 69 3c 3d 72 70 2d 3e 6e 72 68 73 3b  =0; i<=rp->nrhs;
11ee0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
11ef0 3d 3d 63 66 70 2d 3e 64 6f 74 20 29 20 66 70 72  ==cfp->dot ) fpr
11f00 69 6e 74 66 28 66 70 2c 22 20 2a 22 29 3b 0a 20  intf(fp," *");. 
11f10 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72     if( i==rp->nr
11f20 68 73 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  hs ) break;.    
11f30 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73 22  fprintf(fp," %s"
11f40 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d  ,rp->rhs[i]->nam
11f50 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 23 64  e);.  }.}../* #d
11f60 65 66 69 6e 65 20 54 45 53 54 20 2a 2f 0a 23 69  efine TEST */.#i
11f70 66 64 65 66 20 54 45 53 54 0a 2f 2a 20 50 72 69  fdef TEST./* Pri
11f80 6e 74 20 61 20 73 65 74 20 2a 2f 0a 50 52 49 56  nt a set */.PRIV
11f90 41 54 45 20 76 6f 69 64 20 53 65 74 50 72 69 6e  ATE void SetPrin
11fa0 74 28 6f 75 74 2c 73 65 74 2c 6c 65 6d 70 29 0a  t(out,set,lemp).
11fb0 46 49 4c 45 20 2a 6f 75 74 3b 0a 63 68 61 72 20  FILE *out;.char 
11fc0 2a 73 65 74 3b 0a 73 74 72 75 63 74 20 6c 65 6d  *set;.struct lem
11fd0 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e  on *lemp;.{.  in
11fe0 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 73 70 61  t i;.  char *spa
11ff0 63 65 72 3b 0a 20 20 73 70 61 63 65 72 20 3d 20  cer;.  spacer = 
12000 22 22 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  "";.  fprintf(ou
12010 74 2c 22 25 31 32 73 5b 22 2c 22 22 29 3b 0a 20  t,"%12s[","");. 
12020 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
12030 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b  ->nterminal; i++
12040 29 7b 0a 20 20 20 20 69 66 28 20 53 65 74 46 69  ){.    if( SetFi
12050 6e 64 28 73 65 74 2c 69 29 20 29 7b 0a 20 20 20  nd(set,i) ){.   
12060 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
12070 25 73 25 73 22 2c 73 70 61 63 65 72 2c 6c 65 6d  %s%s",spacer,lem
12080 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
12090 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 70 61 63  ame);.      spac
120a0 65 72 20 3d 20 22 20 22 3b 0a 20 20 20 20 7d 0a  er = " ";.    }.
120b0 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
120c0 74 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20  t,"]\n");.}../* 
120d0 50 72 69 6e 74 20 61 20 70 6c 69 6e 6b 20 63 68  Print a plink ch
120e0 61 69 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  ain */.PRIVATE v
120f0 6f 69 64 20 50 6c 69 6e 6b 50 72 69 6e 74 28 6f  oid PlinkPrint(o
12100 75 74 2c 70 6c 70 2c 74 61 67 29 0a 46 49 4c 45  ut,plp,tag).FILE
12110 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 70 6c   *out;.struct pl
12120 69 6e 6b 20 2a 70 6c 70 3b 0a 63 68 61 72 20 2a  ink *plp;.char *
12130 74 61 67 3b 0a 7b 0a 20 20 77 68 69 6c 65 28 20  tag;.{.  while( 
12140 70 6c 70 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  plp ){.    fprin
12150 74 66 28 6f 75 74 2c 22 25 31 32 73 25 73 20 28  tf(out,"%12s%s (
12160 73 74 61 74 65 20 25 32 64 29 20 22 2c 22 22 2c  state %2d) ","",
12170 74 61 67 2c 70 6c 70 2d 3e 63 66 70 2d 3e 73 74  tag,plp->cfp->st
12180 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 43  p->index);.    C
12190 6f 6e 66 69 67 50 72 69 6e 74 28 6f 75 74 2c 70  onfigPrint(out,p
121a0 6c 70 2d 3e 63 66 70 29 3b 0a 20 20 20 20 66 70  lp->cfp);.    fp
121b0 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b  rintf(out,"\n");
121c0 0a 20 20 20 20 70 6c 70 20 3d 20 70 6c 70 2d 3e  .    plp = plp->
121d0 6e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  next;.  }.}.#end
121e0 69 66 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 6e 20  if../* Print an 
121f0 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 67 69  action to the gi
12200 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
12210 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  tor.  Return FAL
12220 53 45 20 69 66 0a 2a 2a 20 6e 6f 74 68 69 6e 67  SE if.** nothing
12230 20 77 61 73 20 61 63 74 75 61 6c 6c 79 20 70 72   was actually pr
12240 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 50 72  inted..*/.int Pr
12250 69 6e 74 41 63 74 69 6f 6e 28 73 74 72 75 63 74  intAction(struct
12260 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 46 49 4c   action *ap, FIL
12270 45 20 2a 66 70 2c 20 69 6e 74 20 69 6e 64 65 6e  E *fp, int inden
12280 74 29 7b 0a 20 20 69 6e 74 20 72 65 73 75 6c 74  t){.  int result
12290 20 3d 20 31 3b 0a 20 20 73 77 69 74 63 68 28 20   = 1;.  switch( 
122a0 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20 20  ap->type ){.    
122b0 63 61 73 65 20 53 48 49 46 54 3a 0a 20 20 20 20  case SHIFT:.    
122c0 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
122d0 73 20 73 68 69 66 74 20 20 25 64 22 2c 69 6e 64  s shift  %d",ind
122e0 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
122f0 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e 69 6e 64 65  ,ap->x.stp->inde
12300 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
12310 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43 45  .    case REDUCE
12320 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
12330 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25  fp,"%*s reduce %
12340 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70  d",indent,ap->sp
12350 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d  ->name,ap->x.rp-
12360 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62  >index);.      b
12370 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41  reak;.    case A
12380 43 43 45 50 54 3a 0a 20 20 20 20 20 20 66 70 72  CCEPT:.      fpr
12390 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 61 63 63  intf(fp,"%*s acc
123a0 65 70 74 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  ept",indent,ap->
123b0 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
123c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
123d0 20 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 66 70   ERROR:.      fp
123e0 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 65 72  rintf(fp,"%*s er
123f0 72 6f 72 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  ror",indent,ap->
12400 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
12410 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
12420 20 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20   CONFLICT:.     
12430 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
12440 20 72 65 64 75 63 65 20 25 2d 33 64 20 2a 2a 20   reduce %-3d ** 
12450 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74  Parsing conflict
12460 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20 20 69 6e   **",.        in
12470 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
12480 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65  e,ap->x.rp->inde
12490 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
124a0 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52 45 53  .    case SH_RES
124b0 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20  OLVED:.    case 
124c0 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20  RD_RESOLVED:.   
124d0 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44 3a 0a   case NOT_USED:.
124e0 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30        result = 0
124f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12500 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75   }.  return resu
12510 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61  lt;.}../* Genera
12520 74 65 20 74 68 65 20 22 79 2e 6f 75 74 70 75 74  te the "y.output
12530 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76 6f  " log file */.vo
12540 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28  id ReportOutput(
12550 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
12560 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e  on *lemp;.{.  in
12570 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
12580 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
12590 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a  ct config *cfp;.
125a0 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
125b0 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b  *ap;.  FILE *fp;
125c0 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f 6f 70  ..  fp = file_op
125d0 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22 2c 22  en(lemp,".out","
125e0 77 22 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30  w");.  if( fp==0
125f0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 70 72   ) return;.  fpr
12600 69 6e 74 66 28 66 70 2c 22 20 5c 62 22 29 3b 0a  intf(fp," \b");.
12610 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
12620 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
12630 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
12640 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
12650 66 70 72 69 6e 74 66 28 66 70 2c 22 53 74 61 74  fprintf(fp,"Stat
12660 65 20 25 64 3a 5c 6e 22 2c 73 74 70 2d 3e 69 6e  e %d:\n",stp->in
12670 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 6c 65  dex);.    if( le
12680 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29 20  mp->basisflag ) 
12690 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20 20  cfp=stp->bp;.   
126a0 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20   else           
126b0 20 20 20 20 20 20 20 63 66 70 3d 73 74 70 2d 3e         cfp=stp->
126c0 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  cfp;.    while( 
126d0 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63 68 61  cfp ){.      cha
126e0 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20 20  r buf[20];.     
126f0 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d 63   if( cfp->dot==c
12700 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b 0a  fp->rp->nrhs ){.
12710 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
12720 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d 3e  buf,"(%d)",cfp->
12730 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  rp->index);.    
12740 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
12750 20 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b 0a      %5s ",buf);.
12760 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12770 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
12780 22 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a 20  "          ");. 
12790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f 6e       }.      Con
127a0 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70 29  figPrint(fp,cfp)
127b0 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
127c0 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 64 65 66  fp,"\n");.#ifdef
127d0 20 54 45 53 54 0a 20 20 20 20 20 20 53 65 74 50   TEST.      SetP
127e0 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 77 73  rint(fp,cfp->fws
127f0 2c 6c 65 6d 70 29 3b 0a 20 20 20 20 20 20 50 6c  ,lemp);.      Pl
12800 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70 2d  inkPrint(fp,cfp-
12810 3e 66 70 6c 70 2c 22 54 6f 20 20 22 29 3b 0a 20  >fplp,"To  ");. 
12820 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28       PlinkPrint(
12830 66 70 2c 63 66 70 2d 3e 62 70 6c 70 2c 22 46 72  fp,cfp->bplp,"Fr
12840 6f 6d 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  om");.#endif.   
12850 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61 73     if( lemp->bas
12860 69 73 66 6c 61 67 20 29 20 63 66 70 3d 63 66 70  isflag ) cfp=cfp
12870 2d 3e 62 70 3b 0a 20 20 20 20 20 20 65 6c 73 65  ->bp;.      else
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12890 20 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 3b    cfp=cfp->next;
128a0 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
128b0 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20  tf(fp,"\n");.   
128c0 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
128d0 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
128e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50 72 69  ){.      if( Pri
128f0 6e 74 41 63 74 69 6f 6e 28 61 70 2c 66 70 2c 33  ntAction(ap,fp,3
12900 30 29 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c  0) ) fprintf(fp,
12910 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  "\n");.    }.   
12920 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22   fprintf(fp,"\n"
12930 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28  );.  }.  fclose(
12940 66 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fp);.  return;.}
12950 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20  ../* Search for 
12960 74 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22 20  the file "name" 
12970 77 68 69 63 68 20 69 73 20 69 6e 20 74 68 65 20  which is in the 
12980 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
12990 73 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74 61  s.** the exacuta
129a0 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 63  ble */.PRIVATE c
129b0 68 61 72 20 2a 70 61 74 68 73 65 61 72 63 68 28  har *pathsearch(
129c0 61 72 67 76 30 2c 6e 61 6d 65 2c 6d 6f 64 65 6d  argv0,name,modem
129d0 61 73 6b 29 0a 63 68 61 72 20 2a 61 72 67 76 30  ask).char *argv0
129e0 3b 0a 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 69 6e  ;.char *name;.in
129f0 74 20 6d 6f 64 65 6d 61 73 6b 3b 0a 7b 0a 20 20  t modemask;.{.  
12a00 63 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b 0a  char *pathlist;.
12a10 20 20 63 68 61 72 20 2a 70 61 74 68 2c 2a 63 70    char *path,*cp
12a20 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 65 78  ;.  char c;.  ex
12a30 74 65 72 6e 20 69 6e 74 20 61 63 63 65 73 73 28  tern int access(
12a40 29 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e  );..#ifdef __WIN
12a50 33 32 5f 5f 0a 20 20 63 70 20 3d 20 73 74 72 72  32__.  cp = strr
12a60 63 68 72 28 61 72 67 76 30 2c 27 5c 5c 27 29 3b  chr(argv0,'\\');
12a70 0a 23 65 6c 73 65 0a 20 20 63 70 20 3d 20 73 74  .#else.  cp = st
12a80 72 72 63 68 72 28 61 72 67 76 30 2c 27 2f 27 29  rrchr(argv0,'/')
12a90 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 63  ;.#endif.  if( c
12aa0 70 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 63 70  p ){.    c = *cp
12ab0 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20  ;.    *cp = 0;. 
12ac0 20 20 20 70 61 74 68 20 3d 20 28 63 68 61 72 20     path = (char 
12ad0 2a 29 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e  *)malloc( strlen
12ae0 28 61 72 67 76 30 29 20 2b 20 73 74 72 6c 65 6e  (argv0) + strlen
12af0 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b 0a 20 20  (name) + 2 );.  
12b00 20 20 69 66 28 20 70 61 74 68 20 29 20 73 70 72    if( path ) spr
12b10 69 6e 74 66 28 70 61 74 68 2c 22 25 73 2f 25 73  intf(path,"%s/%s
12b20 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29 3b 0a 20  ",argv0,name);. 
12b30 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 7d 65     *cp = c;.  }e
12b40 6c 73 65 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  lse{.    extern 
12b50 63 68 61 72 20 2a 67 65 74 65 6e 76 28 29 3b 0a  char *getenv();.
12b60 20 20 20 20 70 61 74 68 6c 69 73 74 20 3d 20 67      pathlist = g
12b70 65 74 65 6e 76 28 22 50 41 54 48 22 29 3b 0a 20  etenv("PATH");. 
12b80 20 20 20 69 66 28 20 70 61 74 68 6c 69 73 74 3d     if( pathlist=
12b90 3d 30 20 29 20 70 61 74 68 6c 69 73 74 20 3d 20  =0 ) pathlist = 
12ba0 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f 62 69 6e  ".:/bin:/usr/bin
12bb0 22 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63  ";.    path = (c
12bc0 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 74  har *)malloc( st
12bd0 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 2b 73  rlen(pathlist)+s
12be0 74 72 6c 65 6e 28 6e 61 6d 65 29 2b 32 20 29 3b  trlen(name)+2 );
12bf0 0a 20 20 20 20 69 66 28 20 70 61 74 68 21 3d 30  .    if( path!=0
12c00 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
12c10 20 2a 70 61 74 68 6c 69 73 74 20 29 7b 0a 20 20   *pathlist ){.  
12c20 20 20 20 20 20 20 63 70 20 3d 20 73 74 72 63 68        cp = strch
12c30 72 28 70 61 74 68 6c 69 73 74 2c 27 3a 27 29 3b  r(pathlist,':');
12c40 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 70 3d  .        if( cp=
12c50 3d 30 20 29 20 63 70 20 3d 20 26 70 61 74 68 6c  =0 ) cp = &pathl
12c60 69 73 74 5b 73 74 72 6c 65 6e 28 70 61 74 68 6c  ist[strlen(pathl
12c70 69 73 74 29 5d 3b 0a 20 20 20 20 20 20 20 20 63  ist)];.        c
12c80 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20 20 20   = *cp;.        
12c90 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  *cp = 0;.       
12ca0 20 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25   sprintf(path,"%
12cb0 73 2f 25 73 22 2c 70 61 74 68 6c 69 73 74 2c 6e  s/%s",pathlist,n
12cc0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 63  ame);.        *c
12cd0 70 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 69  p = c;.        i
12ce0 66 28 20 63 3d 3d 30 20 29 20 70 61 74 68 6c 69  f( c==0 ) pathli
12cf0 73 74 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20  st = "";.       
12d00 20 65 6c 73 65 20 70 61 74 68 6c 69 73 74 20 3d   else pathlist =
12d10 20 26 63 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20   &cp[1];.       
12d20 20 69 66 28 20 61 63 63 65 73 73 28 70 61 74 68   if( access(path
12d30 2c 6d 6f 64 65 6d 61 73 6b 29 3d 3d 30 20 29 20  ,modemask)==0 ) 
12d40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
12d50 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
12d60 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47 69  n path;.}../* Gi
12d70 76 65 6e 20 61 6e 20 61 63 74 69 6f 6e 2c 20 63  ven an action, c
12d80 6f 6d 70 75 74 65 20 74 68 65 20 69 6e 74 65 67  ompute the integ
12d90 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68 61  er value for tha
12da0 74 20 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63  t action.** whic
12db0 68 20 69 73 20 74 6f 20 62 65 20 70 75 74 20 69  h is to be put i
12dc0 6e 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  n the action tab
12dd0 6c 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61  le of the genera
12de0 74 65 64 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20  ted machine..** 
12df0 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20  Return negative 
12e00 69 66 20 6e 6f 20 61 63 74 69 6f 6e 20 73 68 6f  if no action sho
12e10 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74 65 64  uld be generated
12e20 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74  ..*/.PRIVATE int
12e30 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28   compute_action(
12e40 6c 65 6d 70 2c 61 70 29 0a 73 74 72 75 63 74 20  lemp,ap).struct 
12e50 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73 74 72  lemon *lemp;.str
12e60 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
12e70 7b 0a 20 20 69 6e 74 20 61 63 74 3b 0a 20 20 73  {.  int act;.  s
12e80 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65 20  witch( ap->type 
12e90 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49 46  ){.    case SHIF
12ea0 54 3a 20 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e  T:  act = ap->x.
12eb0 73 74 70 2d 3e 69 6e 64 65 78 3b 20 20 20 20 20  stp->index;     
12ec0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
12ed0 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43 45  .    case REDUCE
12ee0 3a 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 72 70  : act = ap->x.rp
12ef0 2d 3e 69 6e 64 65 78 20 2b 20 6c 65 6d 70 2d 3e  ->index + lemp->
12f00 6e 73 74 61 74 65 3b 20 62 72 65 61 6b 3b 0a 20  nstate; break;. 
12f10 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a 20 20     case ERROR:  
12f20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  act = lemp->nsta
12f30 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  te + lemp->nrule
12f40 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
12f50 20 63 61 73 65 20 41 43 43 45 50 54 3a 20 61 63   case ACCEPT: ac
12f60 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  t = lemp->nstate
12f70 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b   + lemp->nrule +
12f80 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64   1; break;.    d
12f90 65 66 61 75 6c 74 3a 20 20 20 20 20 61 63 74 20  efault:     act 
12fa0 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20 20 7d  = -1; break;.  }
12fb0 0a 20 20 72 65 74 75 72 6e 20 61 63 74 3b 0a 7d  .  return act;.}
12fc0 0a 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 53 49  ..#define LINESI
12fd0 5a 45 20 31 30 30 30 0a 2f 2a 20 54 68 65 20 6e  ZE 1000./* The n
12fe0 65 78 74 20 63 6c 75 73 74 65 72 20 6f 66 20 72  ext cluster of r
12ff0 6f 75 74 69 6e 65 73 20 61 72 65 20 66 6f 72 20  outines are for 
13000 72 65 61 64 69 6e 67 20 74 68 65 20 74 65 6d 70  reading the temp
13010 6c 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  late file.** and
13020 20 77 72 69 74 69 6e 67 20 74 68 65 20 72 65 73   writing the res
13030 75 6c 74 73 20 74 6f 20 74 68 65 20 67 65 6e 65  ults to the gene
13040 72 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a  rated parser */.
13050 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 75 6e  /* The first fun
13060 63 74 69 6f 6e 20 74 72 61 6e 73 66 65 72 73 20  ction transfers 
13070 64 61 74 61 20 66 72 6f 6d 20 22 69 6e 22 20 74  data from "in" t
13080 6f 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a 2a 2a  o "out" until.**
13090 20 61 20 6c 69 6e 65 20 69 73 20 73 65 65 6e 20   a line is seen 
130a0 77 68 69 63 68 20 62 65 67 69 6e 73 20 77 69 74  which begins wit
130b0 68 20 22 25 25 22 2e 20 20 54 68 65 20 6c 69 6e  h "%%".  The lin
130c0 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 74  e number is.** t
130d0 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 66  racked..**.** if
130e0 20 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e 20 61   name!=0, then a
130f0 6e 79 20 77 6f 72 64 20 74 68 61 74 20 62 65 67  ny word that beg
13100 69 6e 20 77 69 74 68 20 22 50 61 72 73 65 22 20  in with "Parse" 
13110 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 2a 2a  is changed to.**
13120 20 62 65 67 69 6e 20 77 69 74 68 20 2a 6e 61 6d   begin with *nam
13130 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50 52  e instead..*/.PR
13140 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f  IVATE void tplt_
13150 78 66 65 72 28 6e 61 6d 65 2c 69 6e 2c 6f 75 74  xfer(name,in,out
13160 2c 6c 69 6e 65 6e 6f 29 0a 63 68 61 72 20 2a 6e  ,lineno).char *n
13170 61 6d 65 3b 0a 46 49 4c 45 20 2a 69 6e 3b 0a 46  ame;.FILE *in;.F
13180 49 4c 45 20 2a 6f 75 74 3b 0a 69 6e 74 20 2a 6c  ILE *out;.int *l
13190 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 6e 74 20 69  ineno;.{.  int i
131a0 2c 20 69 53 74 61 72 74 3b 0a 20 20 63 68 61 72  , iStart;.  char
131b0 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b   line[LINESIZE];
131c0 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28  .  while( fgets(
131d0 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e  line,LINESIZE,in
131e0 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d 21 3d 27  ) && (line[0]!='
131f0 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21 3d 27  %' || line[1]!='
13200 25 27 29 20 29 7b 0a 20 20 20 20 28 2a 6c 69 6e  %') ){.    (*lin
13210 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69 53 74 61  eno)++;.    iSta
13220 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  rt = 0;.    if( 
13230 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 66 6f  name ){.      fo
13240 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d 3b 20  r(i=0; line[i]; 
13250 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
13260 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27 20 26  ( line[i]=='P' &
13270 26 20 73 74 72 6e 63 6d 70 28 26 6c 69 6e 65 5b  & strncmp(&line[
13280 69 5d 2c 22 50 61 72 73 65 22 2c 35 29 3d 3d 30  i],"Parse",5)==0
13290 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69  .          && (i
132a0 3d 3d 30 20 7c 7c 20 21 69 73 61 6c 70 68 61 28  ==0 || !isalpha(
132b0 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20 20 20 20  line[i-1])).    
132c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
132d0 20 69 66 28 20 69 3e 69 53 74 61 72 74 20 29 20   if( i>iStart ) 
132e0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a  fprintf(out,"%.*
132f0 73 22 2c 69 2d 69 53 74 61 72 74 2c 26 6c 69 6e  s",i-iStart,&lin
13300 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 20 20  e[iStart]);.    
13310 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
13320 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b 0a 20 20  t,"%s",name);.  
13330 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a          i += 4;.
13340 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74            iStart
13350 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20 20   = i+1;.        
13360 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
13370 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
13380 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53 74 61 72  "%s",&line[iStar
13390 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 54  t]);.  }.}../* T
133a0 68 65 20 6e 65 78 74 20 66 75 6e 63 74 69 6f 6e  he next function
133b0 20 66 69 6e 64 73 20 74 68 65 20 74 65 6d 70 6c   finds the templ
133c0 61 74 65 20 66 69 6c 65 20 61 6e 64 20 6f 70 65  ate file and ope
133d0 6e 73 20 69 74 2c 20 72 65 74 75 72 6e 69 6e 67  ns it, returning
133e0 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
133f0 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65   the opened file
13400 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49 4c  . */.PRIVATE FIL
13410 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d  E *tplt_open(lem
13420 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
13430 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 61 74 69  *lemp;.{.  stati
13440 63 20 63 68 61 72 20 74 65 6d 70 6c 61 74 65 6e  c char templaten
13450 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70 61 72 2e  ame[] = "lempar.
13460 63 22 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 31  c";.  char buf[1
13470 30 30 30 5d 3b 0a 20 20 46 49 4c 45 20 2a 69 6e  000];.  FILE *in
13480 3b 0a 20 20 63 68 61 72 20 2a 74 70 6c 74 6e 61  ;.  char *tpltna
13490 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a  me;.  char *cp;.
134a0 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72 28  .  cp = strrchr(
134b0 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 27  lemp->filename,'
134c0 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29 7b  .');.  if( cp ){
134d0 0a 20 20 20 20 73 70 72 69 6e 74 66 28 62 75 66  .    sprintf(buf
134e0 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 75 6e 73 69  ,"%.*s.lt",(unsi
134f0 67 6e 65 64 20 6c 6f 6e 67 29 63 70 2d 28 75 6e  gned long)cp-(un
13500 73 69 67 6e 65 64 20 6c 6f 6e 67 29 6c 65 6d 70  signed long)lemp
13510 2d 3e 66 69 6c 65 6e 61 6d 65 2c 6c 65 6d 70 2d  ->filename,lemp-
13520 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65  >filename);.  }e
13530 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  lse{.    sprintf
13540 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c 6c 65 6d  (buf,"%s.lt",lem
13550 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
13560 7d 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 62  }.  if( access(b
13570 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20  uf,004)==0 ){.  
13580 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 62 75 66    tpltname = buf
13590 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 63  ;.  }else if( ac
135a0 63 65 73 73 28 74 65 6d 70 6c 61 74 65 6e 61 6d  cess(templatenam
135b0 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20 20  e,004)==0 ){.   
135c0 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74 65 6d 70   tpltname = temp
135d0 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d 65 6c 73  latename;.  }els
135e0 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20  e{.    tpltname 
135f0 3d 20 70 61 74 68 73 65 61 72 63 68 28 6c 65 6d  = pathsearch(lem
13600 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70 6c 61 74  p->argv0,templat
13610 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d 0a 20 20  ename,0);.  }.  
13620 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d 3d 30 20  if( tpltname==0 
13630 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
13640 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69 6e  tderr,"Can't fin
13650 64 20 74 68 65 20 70 61 72 73 65 72 20 64 72 69  d the parser dri
13660 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  ver template fil
13670 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20  e \"%s\".\n",.  
13680 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b    templatename);
13690 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
136a0 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
136b0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20  n 0;.  }.  in = 
136c0 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d 65 2c 22  fopen(tpltname,"
136d0 72 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30  r");.  if( in==0
136e0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
136f0 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f 70  stderr,"Can't op
13700 65 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20  en the template 
13710 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c  file \"%s\".\n",
13720 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20  templatename);. 
13730 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
13740 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t++;.    return 
13750 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
13760 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20  in;.}../* Print 
13770 61 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20  a string to the 
13780 66 69 6c 65 20 61 6e 64 20 6b 65 65 70 20 74 68  file and keep th
13790 65 20 6c 69 6e 65 6e 75 6d 62 65 72 20 75 70 20  e linenumber up 
137a0 74 6f 20 64 61 74 65 20 2a 2f 0a 50 52 49 56 41  to date */.PRIVA
137b0 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 70 72 69  TE void tplt_pri
137c0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 73 74 72 2c  nt(out,lemp,str,
137d0 73 74 72 6c 6e 2c 6c 69 6e 65 6e 6f 29 0a 46 49  strln,lineno).FI
137e0 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20  LE *out;.struct 
137f0 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61  lemon *lemp;.cha
13800 72 20 2a 73 74 72 3b 0a 69 6e 74 20 73 74 72 6c  r *str;.int strl
13810 6e 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a  n;.int *lineno;.
13820 7b 0a 20 20 69 66 28 20 73 74 72 3d 3d 30 20 29  {.  if( str==0 )
13830 20 72 65 74 75 72 6e 3b 0a 20 20 66 70 72 69 6e   return;.  fprin
13840 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64  tf(out,"#line %d
13850 20 5c 22 25 73 5c 22 5c 6e 22 2c 73 74 72 6c 6e   \"%s\"\n",strln
13860 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
13870 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20  ; (*lineno)++;. 
13880 20 77 68 69 6c 65 28 20 2a 73 74 72 20 29 7b 0a   while( *str ){.
13890 20 20 20 20 69 66 28 20 2a 73 74 72 3d 3d 27 5c      if( *str=='\
138a0 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n' ) (*lineno)++
138b0 3b 0a 20 20 20 20 70 75 74 63 28 2a 73 74 72 2c  ;.    putc(*str,
138c0 6f 75 74 29 3b 0a 20 20 20 20 73 74 72 2b 2b 3b  out);.    str++;
138d0 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
138e0 75 74 2c 22 5c 6e 23 6c 69 6e 65 20 25 64 20 5c  ut,"\n#line %d \
138f0 22 25 73 5c 22 5c 6e 22 2c 2a 6c 69 6e 65 6e 6f  "%s\"\n",*lineno
13900 2b 32 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  +2,lemp->outname
13910 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 3d 32 3b  ); (*lineno)+=2;
13920 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
13930 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
13940 67 20 72 6f 75 74 69 6e 65 20 65 6d 69 74 73 20  g routine emits 
13950 63 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65 73  code for the des
13960 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 0a  tructor for the.
13970 2a 2a 20 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f 0a  ** symbol sp.*/.
13980 76 6f 69 64 20 65 6d 69 74 5f 64 65 73 74 72 75  void emit_destru
13990 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 73 70  ctor_code(out,sp
139a0 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f 29 0a 46 49  ,lemp,lineno).FI
139b0 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20  LE *out;.struct 
139c0 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 73 74 72 75  symbol *sp;.stru
139d0 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
139e0 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20  int *lineno;.{. 
139f0 63 68 61 72 20 2a 63 70 3b 0a 0a 20 69 6e 74 20  char *cp;.. int 
13a00 6c 69 6e 65 63 6e 74 20 3d 20 30 3b 0a 20 69 66  linecnt = 0;. if
13a10 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d  ( sp->type==TERM
13a20 49 4e 41 4c 20 29 7b 0a 20 20 20 63 70 20 3d 20  INAL ){.   cp = 
13a30 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b  lemp->tokendest;
13a40 0a 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20  .   if( cp==0 ) 
13a50 72 65 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e  return;.   fprin
13a60 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64  tf(out,"#line %d
13a70 20 5c 22 25 73 5c 22 5c 6e 7b 22 2c 6c 65 6d 70   \"%s\"\n{",lemp
13a80 2d 3e 74 6f 6b 65 6e 64 65 73 74 6c 6e 2c 6c 65  ->tokendestln,le
13a90 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
13aa0 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 64 65  }else if( sp->de
13ab0 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 63  structor ){.   c
13ac0 70 20 3d 20 73 70 2d 3e 64 65 73 74 72 75 63 74  p = sp->destruct
13ad0 6f 72 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f  or;.   fprintf(o
13ae0 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 25  ut,"#line %d \"%
13af0 73 5c 22 5c 6e 7b 22 2c 73 70 2d 3e 64 65 73 74  s\"\n{",sp->dest
13b00 72 75 63 74 6f 72 6c 6e 2c 6c 65 6d 70 2d 3e 66  ructorln,lemp->f
13b10 69 6c 65 6e 61 6d 65 29 3b 0a 20 7d 65 6c 73 65  ilename);. }else
13b20 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65   if( lemp->varde
13b30 73 74 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65  st ){.   cp = le
13b40 6d 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20  mp->vardest;.   
13b50 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75  if( cp==0 ) retu
13b60 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f  rn;.   fprintf(o
13b70 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 25  ut,"#line %d \"%
13b80 73 5c 22 5c 6e 7b 22 2c 6c 65 6d 70 2d 3e 76 61  s\"\n{",lemp->va
13b90 72 64 65 73 74 6c 6e 2c 6c 65 6d 70 2d 3e 66 69  rdestln,lemp->fi
13ba0 6c 65 6e 61 6d 65 29 3b 0a 20 7d 0a 20 66 6f 72  lename);. }. for
13bb0 28 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20  (; *cp; cp++){. 
13bc0 20 20 69 66 28 20 2a 63 70 3d 3d 27 24 27 20 26    if( *cp=='$' &
13bd0 26 20 63 70 5b 31 5d 3d 3d 27 24 27 20 29 7b 0a  & cp[1]=='$' ){.
13be0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
13bf0 2c 22 28 79 79 70 6d 69 6e 6f 72 2d 3e 79 79 25  ,"(yypminor->yy%
13c00 64 29 22 2c 73 70 2d 3e 64 74 6e 75 6d 29 3b 0a  d)",sp->dtnum);.
13c10 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20       cp++;.     
13c20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 7d 0a 20  continue;.   }. 
13c30 20 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20    if( *cp=='\n' 
13c40 29 20 6c 69 6e 65 63 6e 74 2b 2b 3b 0a 20 20 20  ) linecnt++;.   
13c50 66 70 75 74 63 28 2a 63 70 2c 6f 75 74 29 3b 0a  fputc(*cp,out);.
13c60 20 7d 0a 20 28 2a 6c 69 6e 65 6e 6f 29 20 2b 3d   }. (*lineno) +=
13c70 20 33 20 2b 20 6c 69 6e 65 63 6e 74 3b 0a 20 66   3 + linecnt;. f
13c80 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 23  printf(out,"}\n#
13c90 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c 6e  line %d \"%s\"\n
13ca0 22 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e  ",*lineno,lemp->
13cb0 6f 75 74 6e 61 6d 65 29 3b 0a 20 72 65 74 75 72  outname);. retur
13cc0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  n;.}../*.** Retu
13cd0 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72  rn TRUE (non-zer
13ce0 6f 29 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  o) if the given 
13cf0 73 79 6d 62 6f 6c 20 68 61 73 20 61 20 64 65 73  symbol has a des
13d00 74 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  tructor..*/.int 
13d10 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28 73  has_destructor(s
13d20 70 2c 20 6c 65 6d 70 29 0a 73 74 72 75 63 74 20  p, lemp).struct 
13d30 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 73 74 72 75  symbol *sp;.stru
13d40 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
13d50 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 69  {.  int ret;.  i
13d60 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52  f( sp->type==TER
13d70 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 72 65 74  MINAL ){.    ret
13d80 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65   = lemp->tokende
13d90 73 74 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  st!=0;.  }else{.
13da0 20 20 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e      ret = lemp->
13db0 76 61 72 64 65 73 74 21 3d 30 20 7c 7c 20 73 70  vardest!=0 || sp
13dc0 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30 3b  ->destructor!=0;
13dd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
13de0 74 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 47 65 6e  t;.}../* .** Gen
13df0 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
13e00 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 74   executes when t
13e10 68 65 20 72 75 6c 65 20 22 72 70 22 20 69 73 20  he rule "rp" is 
13e20 72 65 64 75 63 65 64 2e 20 20 57 72 69 74 65 0a  reduced.  Write.
13e30 2a 2a 20 74 68 65 20 63 6f 64 65 20 74 6f 20 22  ** the code to "
13e40 6f 75 74 22 2e 20 20 4d 61 6b 65 20 73 75 72 65  out".  Make sure
13e50 20 6c 69 6e 65 6e 6f 20 73 74 61 79 73 20 75 70   lineno stays up
13e60 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 50 52 49  -to-date..*/.PRI
13e70 56 41 54 45 20 76 6f 69 64 20 65 6d 69 74 5f 63  VATE void emit_c
13e80 6f 64 65 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c  ode(out,rp,lemp,
13e90 6c 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a 6f 75  lineno).FILE *ou
13ea0 74 3b 0a 73 74 72 75 63 74 20 72 75 6c 65 20 2a  t;.struct rule *
13eb0 72 70 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  rp;.struct lemon
13ec0 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20 2a 6c 69 6e   *lemp;.int *lin
13ed0 65 6e 6f 3b 0a 7b 0a 20 63 68 61 72 20 2a 63 70  eno;.{. char *cp
13ee0 2c 20 2a 78 70 3b 0a 20 69 6e 74 20 6c 69 6e 65  , *xp;. int line
13ef0 63 6e 74 20 3d 20 30 3b 0a 20 69 6e 74 20 69 3b  cnt = 0;. int i;
13f00 0a 20 63 68 61 72 20 6c 68 73 75 73 65 64 20 3d  . char lhsused =
13f10 20 30 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69   0;    /* True i
13f20 66 20 74 68 65 20 4c 48 53 20 65 6c 65 6d 65 6e  f the LHS elemen
13f30 74 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20  t has been used 
13f40 2a 2f 0a 20 63 68 61 72 20 75 73 65 64 5b 4d 41  */. char used[MA
13f50 58 52 48 53 5d 3b 20 20 20 2f 2a 20 54 72 75 65  XRHS];   /* True
13f60 20 66 6f 72 20 65 61 63 68 20 52 48 53 20 65 6c   for each RHS el
13f70 65 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 75  ement which is u
13f80 73 65 64 20 2a 2f 0a 0a 20 66 6f 72 28 69 3d 30  sed */.. for(i=0
13f90 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
13fa0 2b 29 20 75 73 65 64 5b 69 5d 20 3d 20 30 3b 0a  +) used[i] = 0;.
13fb0 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 0a 0a 20   lhsused = 0;.. 
13fc0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
13fd0 20 74 6f 20 64 6f 20 74 68 65 20 72 65 64 75 63   to do the reduc
13fe0 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 69 66 28  e action */. if(
13ff0 20 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20   rp->code ){.   
14000 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 6c 69  fprintf(out,"#li
14010 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c 6e 7b 22  ne %d \"%s\"\n{"
14020 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d 70 2d 3e  ,rp->line,lemp->
14030 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 66 6f  filename);.   fo
14040 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a  r(cp=rp->code; *
14050 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20  cp; cp++){.     
14060 69 66 28 20 69 73 61 6c 70 68 61 28 2a 63 70 29  if( isalpha(*cp)
14070 20 26 26 20 28 63 70 3d 3d 72 70 2d 3e 63 6f 64   && (cp==rp->cod
14080 65 20 7c 7c 20 28 21 69 73 61 6c 6e 75 6d 28 63  e || (!isalnum(c
14090 70 5b 2d 31 5d 29 20 26 26 20 63 70 5b 2d 31 5d  p[-1]) && cp[-1]
140a0 21 3d 27 5f 27 29 29 20 29 7b 0a 20 20 20 20 20  !='_')) ){.     
140b0 20 20 63 68 61 72 20 73 61 76 65 64 3b 0a 20 20    char saved;.  
140c0 20 20 20 20 20 66 6f 72 28 78 70 3d 20 26 63 70       for(xp= &cp
140d0 5b 31 5d 3b 20 69 73 61 6c 6e 75 6d 28 2a 78 70  [1]; isalnum(*xp
140e0 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20 78  ) || *xp=='_'; x
140f0 70 2b 2b 29 3b 0a 20 20 20 20 20 20 20 73 61 76  p++);.       sav
14100 65 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20 20  ed = *xp;.      
14110 20 2a 78 70 20 3d 20 30 3b 0a 20 20 20 20 20 20   *xp = 0;.      
14120 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61   if( rp->lhsalia
14130 73 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72  s && strcmp(cp,r
14140 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3d 3d 30 20  p->lhsalias)==0 
14150 29 7b 0a 20 20 20 20 20 20 20 20 20 66 70 72 69  ){.         fpri
14160 6e 74 66 28 6f 75 74 2c 22 79 79 67 6f 74 6f 6d  ntf(out,"yygotom
14170 69 6e 6f 72 2e 79 79 25 64 22 2c 72 70 2d 3e 6c  inor.yy%d",rp->l
14180 68 73 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20  hs->dtnum);.    
14190 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20       cp = xp;.  
141a0 20 20 20 20 20 20 20 6c 68 73 75 73 65 64 20 3d         lhsused =
141b0 20 31 3b 0a 20 20 20 20 20 20 20 7d 65 6c 73 65   1;.       }else
141c0 7b 0a 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  {.         for(i
141d0 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
141e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
141f0 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61   if( rp->rhsalia
14200 73 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 63  s[i] && strcmp(c
14210 70 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  p,rp->rhsalias[i
14220 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ])==0 ){.       
14230 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
14240 74 2c 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e  t,"yymsp[%d].min
14250 6f 72 2e 79 79 25 64 22 2c 69 2d 72 70 2d 3e 6e  or.yy%d",i-rp->n
14260 72 68 73 2b 31 2c 72 70 2d 3e 72 68 73 5b 69 5d  rhs+1,rp->rhs[i]
14270 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20  ->dtnum);.      
14280 20 20 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a         cp = xp;.
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65               use
142a0 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20  d[i] = 1;.      
142b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
142c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
142d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 7d 0a 20      }.       }. 
142e0 20 20 20 20 20 20 2a 78 70 20 3d 20 73 61 76 65        *xp = save
142f0 64 3b 0a 20 20 20 20 20 7d 0a 20 20 20 20 20 69  d;.     }.     i
14300 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 6c  f( *cp=='\n' ) l
14310 69 6e 65 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 66  inecnt++;.     f
14320 70 75 74 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20  putc(*cp,out);. 
14330 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
14340 2a 2f 0a 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 20  */.   (*lineno) 
14350 2b 3d 20 33 20 2b 20 6c 69 6e 65 63 6e 74 3b 0a  += 3 + linecnt;.
14360 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
14370 7d 5c 6e 23 6c 69 6e 65 20 25 64 20 5c 22 25 73  }\n#line %d \"%s
14380 5c 22 5c 6e 22 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65  \"\n",*lineno,le
14390 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 7d  mp->outname);. }
143a0 20 2f 2a 20 45 6e 64 20 69 66 28 20 72 70 2d 3e   /* End if( rp->
143b0 63 6f 64 65 20 29 20 2a 2f 0a 0a 20 2f 2a 20 43  code ) */.. /* C
143c0 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
143d0 65 20 74 68 65 20 4c 48 53 20 68 61 73 20 62 65  e the LHS has be
143e0 65 6e 20 75 73 65 64 20 2a 2f 0a 20 69 66 28 20  en used */. if( 
143f0 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20  rp->lhsalias && 
14400 21 6c 68 73 75 73 65 64 20 29 7b 0a 20 20 20 45  !lhsused ){.   E
14410 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
14420 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c  lename,rp->rulel
14430 69 6e 65 2c 0a 20 20 20 20 20 22 4c 61 62 65 6c  ine,.     "Label
14440 20 5c 22 25 73 5c 22 20 66 6f 72 20 5c 22 25 73   \"%s\" for \"%s
14450 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20  (%s)\" is never 
14460 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 72  used.",.       r
14470 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e  p->lhsalias,rp->
14480 6c 68 73 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 6c 68  lhs->name,rp->lh
14490 73 61 6c 69 61 73 29 3b 0a 20 20 20 6c 65 6d 70  salias);.   lemp
144a0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 7d  ->errorcnt++;. }
144b0 0a 0a 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 64  .. /* Generate d
144c0 65 73 74 72 75 63 74 6f 72 20 63 6f 64 65 20 66  estructor code f
144d0 6f 72 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77  or RHS symbols w
144e0 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65  hich are not use
144f0 64 20 69 6e 20 74 68 65 0a 20 2a 2a 20 72 65 64  d in the. ** red
14500 75 63 65 20 63 6f 64 65 20 2a 2f 0a 20 66 6f 72  uce code */. for
14510 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
14520 3b 20 69 2b 2b 29 7b 0a 20 20 20 69 66 28 20 72  ; i++){.   if( r
14530 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26  p->rhsalias[i] &
14540 26 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20 20  & !used[i] ){.  
14550 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
14560 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72  ->filename,rp->r
14570 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20  uleline,.       
14580 22 4c 61 62 65 6c 20 25 73 20 66 6f 72 20 5c 22  "Label %s for \"
14590 25 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65  %s(%s)\" is neve
145a0 72 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20  r used.",.      
145b0 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
145c0 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d  ,rp->rhs[i]->nam
145d0 65 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  e,rp->rhsalias[i
145e0 5d 29 3b 0a 20 20 20 20 20 6c 65 6d 70 2d 3e 65  ]);.     lemp->e
145f0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 7d 65  rrorcnt++;.   }e
14600 6c 73 65 20 69 66 28 20 72 70 2d 3e 72 68 73 61  lse if( rp->rhsa
14610 6c 69 61 73 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  lias[i]==0 ){.  
14620 20 20 20 69 66 28 20 68 61 73 5f 64 65 73 74 72     if( has_destr
14630 75 63 74 6f 72 28 72 70 2d 3e 72 68 73 5b 69 5d  uctor(rp->rhs[i]
14640 2c 6c 65 6d 70 29 20 29 7b 0a 20 20 20 20 20 20  ,lemp) ){.      
14650 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
14660 79 79 5f 64 65 73 74 72 75 63 74 6f 72 28 25 64  yy_destructor(%d
14670 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f  ,&yymsp[%d].mino
14680 72 29 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  r);\n",.        
14690 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 69 6e    rp->rhs[i]->in
146a0 64 65 78 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  dex,i-rp->nrhs+1
146b0 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a  ); (*lineno)++;.
146c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
146d0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
146e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 64 65          /* No de
146f0 73 74 72 75 63 74 6f 72 20 64 65 66 69 6e 65 64  structor defined
14700 20 66 6f 72 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20   for %s */\n",. 
14710 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69         rp->rhs[i
14720 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
14730 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20    (*lineno)++;. 
14740 20 20 20 20 7d 0a 20 20 20 7d 0a 20 7d 0a 20 72      }.   }. }. r
14750 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
14760 50 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e 69  Print the defini
14770 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69 6f  tion of the unio
14780 6e 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 70  n used for the p
14790 61 72 73 65 72 27 73 20 64 61 74 61 20 73 74 61  arser's data sta
147a0 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69 6f  ck..** This unio
147b0 6e 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c 64  n contains field
147c0 73 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73  s for every poss
147d0 69 62 6c 65 20 64 61 74 61 20 74 79 70 65 20 66  ible data type f
147e0 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64  or tokens.** and
147f0 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20 20   nonterminals.  
14800 49 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f  In the process o
14810 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64 20  f computing and 
14820 70 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a 2a  printing this.**
14830 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65 74   union, also set
14840 20 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69   the ".dtnum" fi
14850 65 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65 72  eld of every ter
14860 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72  minal and nonter
14870 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e  minal.** symbol.
14880 0a 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f 73  .*/.void print_s
14890 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c  tack_union(out,l
148a0 65 6d 70 2c 70 6c 69 6e 65 6e 6f 2c 6d 68 66 6c  emp,plineno,mhfl
148b0 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 20 20  ag).FILE *out;  
148c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148d0 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 73 74  /* The output st
148e0 72 65 61 6d 20 2a 2f 0a 73 74 72 75 63 74 20 6c  ream */.struct l
148f0 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 20 20 20 20 20  emon *lemp;     
14900 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
14910 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 66  info structure f
14920 6f 72 20 74 68 69 73 20 70 61 72 73 65 72 20 2a  or this parser *
14930 2f 0a 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 3b 20  /.int *plineno; 
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14950 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
14960 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 69  line number */.i
14970 6e 74 20 6d 68 66 6c 61 67 3b 20 20 20 20 20 20  nt mhflag;      
14980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
14990 75 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e 67  ue if generating
149a0 20 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75 74   makeheaders out
149b0 70 75 74 20 2a 2f 0a 7b 0a 20 20 69 6e 74 20 6c  put */.{.  int l
149c0 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f  ineno = *plineno
149d0 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65  ;    /* The line
149e0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6f   number of the o
149f0 75 74 70 75 74 20 2a 2f 0a 20 20 63 68 61 72 20  utput */.  char 
14a00 2a 2a 74 79 70 65 73 3b 20 20 20 20 20 20 20 20  **types;        
14a10 20 20 20 20 20 2f 2a 20 41 20 68 61 73 68 20 74       /* A hash t
14a20 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65  able of datatype
14a30 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72 61 79  s */.  int array
14a40 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
14a50 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
14a60 22 74 79 70 65 73 22 20 61 72 72 61 79 20 2a 2f  "types" array */
14a70 0a 20 20 69 6e 74 20 6d 61 78 64 74 6c 65 6e 67  .  int maxdtleng
14a80 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  th;          /* 
14a90 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f  Maximum length o
14aa0 66 20 61 6e 79 20 22 2e 64 61 74 61 74 79 70 65  f any ".datatype
14ab0 22 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 63 68  " field. */.  ch
14ac0 61 72 20 2a 73 74 64 64 74 3b 20 20 20 20 20 20  ar *stddt;      
14ad0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 6e 64          /* Stand
14ae0 61 72 64 69 7a 65 64 20 6e 61 6d 65 20 66 6f 72  ardized name for
14af0 20 61 20 64 61 74 61 74 79 70 65 20 2a 2f 0a 20   a datatype */. 
14b00 20 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20 20 20   int i,j;       
14b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
14b20 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
14b30 20 69 6e 74 20 68 61 73 68 3b 20 20 20 20 20 20   int hash;      
14b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
14b50 72 20 68 61 73 68 69 6e 67 20 74 68 65 20 6e 61  r hashing the na
14b60 6d 65 20 6f 66 20 61 20 74 79 70 65 20 2a 2f 0a  me of a type */.
14b70 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20    char *name;   
14b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14b90 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72 73 65  ame of the parse
14ba0 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  r */..  /* Alloc
14bb0 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
14bc0 7a 65 20 74 79 70 65 73 5b 5d 20 61 6e 64 20 61  ze types[] and a
14bd0 6c 6c 6f 63 61 74 65 20 73 74 64 64 74 5b 5d 20  llocate stddt[] 
14be0 2a 2f 0a 20 20 61 72 72 61 79 73 69 7a 65 20 3d  */.  arraysize =
14bf0 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a   lemp->nsymbol *
14c00 20 32 3b 0a 20 20 74 79 70 65 73 20 3d 20 28 63   2;.  types = (c
14c10 68 61 72 2a 2a 29 6d 61 6c 6c 6f 63 28 20 61 72  har**)malloc( ar
14c20 72 61 79 73 69 7a 65 20 2a 20 73 69 7a 65 6f 66  raysize * sizeof
14c30 28 63 68 61 72 2a 29 20 29 3b 0a 20 20 66 6f 72  (char*) );.  for
14c40 28 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a  (i=0; i<arraysiz
14c50 65 3b 20 69 2b 2b 29 20 74 79 70 65 73 5b 69 5d  e; i++) types[i]
14c60 20 3d 20 30 3b 0a 20 20 6d 61 78 64 74 6c 65 6e   = 0;.  maxdtlen
14c70 67 74 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 6c  gth = 0;.  if( l
14c80 65 6d 70 2d 3e 76 61 72 74 79 70 65 20 29 7b 0a  emp->vartype ){.
14c90 20 20 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20      maxdtlength 
14ca0 3d 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 76  = strlen(lemp->v
14cb0 61 72 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20 66  artype);.  }.  f
14cc0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
14cd0 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
14ce0 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
14cf0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
14d00 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
14d10 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70  s[i];.    if( sp
14d20 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 29 20  ->datatype==0 ) 
14d30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c 65  continue;.    le
14d40 6e 20 3d 20 73 74 72 6c 65 6e 28 73 70 2d 3e 64  n = strlen(sp->d
14d50 61 74 61 74 79 70 65 29 3b 0a 20 20 20 20 69 66  atatype);.    if
14d60 28 20 6c 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74  ( len>maxdtlengt
14d70 68 20 29 20 6d 61 78 64 74 6c 65 6e 67 74 68 20  h ) maxdtlength 
14d80 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64  = len;.  }.  std
14d90 64 74 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c  dt = (char*)mall
14da0 6f 63 28 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a  oc( maxdtlength*
14db0 32 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 74  2 + 1 );.  if( t
14dc0 79 70 65 73 3d 3d 30 20 7c 7c 20 73 74 64 64 74  ypes==0 || stddt
14dd0 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
14de0 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f  tf(stderr,"Out o
14df0 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20  f memory.\n");. 
14e00 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
14e10 0a 20 20 2f 2a 20 42 75 69 6c 64 20 61 20 68 61  .  /* Build a ha
14e20 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61  sh table of data
14e30 74 79 70 65 73 2e 20 54 68 65 20 22 2e 64 74 6e  types. The ".dtn
14e40 75 6d 22 20 66 69 65 6c 64 20 6f 66 20 65 61 63  um" field of eac
14e50 68 20 73 79 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73  h symbol.  ** is
14e60 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20   filled in with 
14e70 74 68 65 20 68 61 73 68 20 69 6e 64 65 78 20 70  the hash index p
14e80 6c 75 73 20 31 2e 20 20 41 20 22 2e 64 74 6e 75  lus 1.  A ".dtnu
14e90 6d 22 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73  m" value of 0 is
14ea0 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 74  .  ** used for t
14eb0 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e  erminal symbols.
14ec0 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
14ed0 20 25 64 65 66 61 75 6c 74 5f 74 79 70 65 20 64   %default_type d
14ee0 65 66 69 6e 65 64 20 74 68 65 6e 0a 20 20 2a 2a  efined then.  **
14ef0 20 30 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20   0 is also used 
14f00 61 73 20 74 68 65 20 2e 64 74 6e 75 6d 20 76 61  as the .dtnum va
14f10 6c 75 65 20 66 6f 72 20 6e 6f 6e 74 65 72 6d 69  lue for nontermi
14f20 6e 61 6c 73 20 77 68 69 63 68 20 64 6f 20 6e 6f  nals which do no
14f30 74 20 73 70 65 63 69 66 79 0a 20 20 2a 2a 20 61  t specify.  ** a
14f40 20 64 61 74 61 74 79 70 65 20 75 73 69 6e 67 20   datatype using 
14f50 74 68 65 20 25 74 79 70 65 20 64 69 72 65 63 74  the %type direct
14f60 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ive..  */.  for(
14f70 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
14f80 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
14f90 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
14fa0 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
14fb0 73 5b 69 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a  s[i];.    char *
14fc0 63 70 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d  cp;.    if( sp==
14fd0 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a  lemp->errsym ){.
14fe0 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20        sp->dtnum 
14ff0 3d 20 61 72 72 61 79 73 69 7a 65 2b 31 3b 0a 20  = arraysize+1;. 
15000 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
15010 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 70 2d     }.    if( sp-
15020 3e 74 79 70 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e  >type!=NONTERMIN
15030 41 4c 20 7c 7c 20 28 73 70 2d 3e 64 61 74 61 74  AL || (sp->datat
15040 79 70 65 3d 3d 30 20 26 26 20 6c 65 6d 70 2d 3e  ype==0 && lemp->
15050 76 61 72 74 79 70 65 3d 3d 30 29 20 29 7b 0a 20  vartype==0) ){. 
15060 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d       sp->dtnum =
15070 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
15080 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 70  ue;.    }.    cp
15090 20 3d 20 73 70 2d 3e 64 61 74 61 74 79 70 65 3b   = sp->datatype;
150a0 0a 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29  .    if( cp==0 )
150b0 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 74   cp = lemp->vart
150c0 79 70 65 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a  ype;.    j = 0;.
150d0 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61      while( isspa
150e0 63 65 28 2a 63 70 29 20 29 20 63 70 2b 2b 3b 0a  ce(*cp) ) cp++;.
150f0 20 20 20 20 77 68 69 6c 65 28 20 2a 63 70 20 29      while( *cp )
15100 20 73 74 64 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63   stddt[j++] = *c
15110 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  p++;.    while( 
15120 6a 3e 30 20 26 26 20 69 73 73 70 61 63 65 28 73  j>0 && isspace(s
15130 74 64 64 74 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d  tddt[j-1]) ) j--
15140 3b 0a 20 20 20 20 73 74 64 64 74 5b 6a 5d 20 3d  ;.    stddt[j] =
15150 20 30 3b 0a 20 20 20 20 68 61 73 68 20 3d 20 30   0;.    hash = 0
15160 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 73  ;.    for(j=0; s
15170 74 64 64 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  tddt[j]; j++){. 
15180 20 20 20 20 20 68 61 73 68 20 3d 20 68 61 73 68       hash = hash
15190 2a 35 33 20 2b 20 73 74 64 64 74 5b 6a 5d 3b 0a  *53 + stddt[j];.
151a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 68 61      }.    if( ha
151b0 73 68 3c 30 20 29 20 68 61 73 68 20 3d 20 2d 68  sh<0 ) hash = -h
151c0 61 73 68 3b 0a 20 20 20 20 68 61 73 68 20 3d 20  ash;.    hash = 
151d0 68 61 73 68 25 61 72 72 61 79 73 69 7a 65 3b 0a  hash%arraysize;.
151e0 20 20 20 20 77 68 69 6c 65 28 20 74 79 70 65 73      while( types
151f0 5b 68 61 73 68 5d 20 29 7b 0a 20 20 20 20 20 20  [hash] ){.      
15200 69 66 28 20 73 74 72 63 6d 70 28 74 79 70 65 73  if( strcmp(types
15210 5b 68 61 73 68 5d 2c 73 74 64 64 74 29 3d 3d 30  [hash],stddt)==0
15220 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70 2d 3e   ){.        sp->
15230 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31  dtnum = hash + 1
15240 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
15250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 68  .      }.      h
15260 61 73 68 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ash++;.      if(
15270 20 68 61 73 68 3e 3d 61 72 72 61 79 73 69 7a 65   hash>=arraysize
15280 20 29 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 20   ) hash = 0;.   
15290 20 7d 0a 20 20 20 20 69 66 28 20 74 79 70 65 73   }.    if( types
152a0 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20  [hash]==0 ){.   
152b0 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68     sp->dtnum = h
152c0 61 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 74  ash + 1;.      t
152d0 79 70 65 73 5b 68 61 73 68 5d 20 3d 20 28 63 68  ypes[hash] = (ch
152e0 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 73 74 72 6c  ar*)malloc( strl
152f0 65 6e 28 73 74 64 64 74 29 2b 31 20 29 3b 0a 20  en(stddt)+1 );. 
15300 20 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 68       if( types[h
15310 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ash]==0 ){.     
15320 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
15330 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
15340 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65  .\n");.        e
15350 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a  xit(1);.      }.
15360 20 20 20 20 20 20 73 74 72 63 70 79 28 74 79 70        strcpy(typ
15370 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74 29 3b  es[hash],stddt);
15380 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
15390 20 50 72 69 6e 74 20 6f 75 74 20 74 68 65 20 64   Print out the d
153a0 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 59 59 54  efinition of YYT
153b0 4f 4b 45 4e 54 59 50 45 20 61 6e 64 20 59 59 4d  OKENTYPE and YYM
153c0 49 4e 4f 52 54 59 50 45 20 2a 2f 0a 20 20 6e 61  INORTYPE */.  na
153d0 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20  me = lemp->name 
153e0 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22  ? lemp->name : "
153f0 50 61 72 73 65 22 3b 0a 20 20 6c 69 6e 65 6e 6f  Parse";.  lineno
15400 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 0a 20 20 69   = *plineno;.  i
15410 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72  f( mhflag ){ fpr
15420 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e  intf(out,"#if IN
15430 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e  TERFACE\n"); lin
15440 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e  eno++; }.  fprin
15450 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
15460 25 73 54 4f 4b 45 4e 54 59 50 45 20 25 73 5c 6e  %sTOKENTYPE %s\n
15470 22 2c 6e 61 6d 65 2c 0a 20 20 20 20 6c 65 6d 70  ",name,.    lemp
15480 2d 3e 74 6f 6b 65 6e 74 79 70 65 3f 6c 65 6d 70  ->tokentype?lemp
15490 2d 3e 74 6f 6b 65 6e 74 79 70 65 3a 22 76 6f 69  ->tokentype:"voi
154a0 64 2a 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  d*");  lineno++;
154b0 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
154c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65   fprintf(out,"#e
154d0 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ndif\n"); lineno
154e0 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ++; }.  fprintf(
154f0 6f 75 74 2c 22 74 79 70 65 64 65 66 20 75 6e 69  out,"typedef uni
15500 6f 6e 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  on {\n"); lineno
15510 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
15520 74 2c 22 20 20 25 73 54 4f 4b 45 4e 54 59 50 45  t,"  %sTOKENTYPE
15530 20 79 79 30 3b 5c 6e 22 2c 6e 61 6d 65 29 3b 20   yy0;\n",name); 
15540 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28  lineno++;.  for(
15550 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65  i=0; i<arraysize
15560 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
15570 74 79 70 65 73 5b 69 5d 3d 3d 30 20 29 20 63 6f  types[i]==0 ) co
15580 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69  ntinue;.    fpri
15590 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 20 79 79  ntf(out,"  %s yy
155a0 25 64 3b 5c 6e 22 2c 74 79 70 65 73 5b 69 5d 2c  %d;\n",types[i],
155b0 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i+1); lineno++;.
155c0 20 20 20 20 66 72 65 65 28 74 79 70 65 73 5b 69      free(types[i
155d0 5d 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74  ]);.  }.  fprint
155e0 66 28 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 25  f(out,"  int yy%
155f0 64 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73  d;\n",lemp->errs
15600 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65  ym->dtnum); line
15610 6e 6f 2b 2b 3b 0a 20 20 66 72 65 65 28 73 74 64  no++;.  free(std
15620 64 74 29 3b 0a 20 20 66 72 65 65 28 74 79 70 65  dt);.  free(type
15630 73 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  s);.  fprintf(ou
15640 74 2c 22 7d 20 59 59 4d 49 4e 4f 52 54 59 50 45  t,"} YYMINORTYPE
15650 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
15660 0a 20 20 2a 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69  .  *plineno = li
15670 6e 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  neno;.}../*.** R
15680 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
15690 66 20 61 20 43 20 64 61 74 61 74 79 70 65 20 61  f a C datatype a
156a0 62 6c 65 20 74 6f 20 72 65 70 72 65 73 65 6e 74  ble to represent
156b0 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 0a   values between.
156c0 2a 2a 20 30 20 61 6e 64 20 4e 2c 20 69 6e 63 6c  ** 0 and N, incl
156d0 75 73 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  usive..*/.static
156e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e   const char *min
156f0 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69  imum_size_type(i
15700 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 4e 3c 3d  nt N){.  if( N<=
15710 32 35 35 20 29 7b 0a 20 20 20 20 72 65 74 75 72  255 ){.    retur
15720 6e 20 22 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n "unsigned char
15730 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e  ";.  }else if( N
15740 3c 36 35 35 33 35 20 29 7b 0a 20 20 20 20 72 65  <65535 ){.    re
15750 74 75 72 6e 20 22 75 6e 73 69 67 6e 65 64 20 73  turn "unsigned s
15760 68 6f 72 74 20 69 6e 74 22 3b 0a 20 20 7d 65 6c  hort int";.  }el
15770 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22  se{.    return "
15780 75 6e 73 69 67 6e 65 64 20 69 6e 74 22 3b 0a 20  unsigned int";. 
15790 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74   }.}../* Generat
157a0 65 20 43 20 73 6f 75 72 63 65 20 63 6f 64 65 20  e C source code 
157b0 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 2a  for the parser *
157c0 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61 62  /.void ReportTab
157d0 6c 65 28 6c 65 6d 70 2c 20 6d 68 66 6c 61 67 29  le(lemp, mhflag)
157e0 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
157f0 65 6d 70 3b 0a 69 6e 74 20 6d 68 66 6c 61 67 3b  emp;.int mhflag;
15800 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 69       /* Output i
15810 6e 20 6d 61 6b 65 68 65 61 64 65 72 73 20 66 6f  n makeheaders fo
15820 72 6d 61 74 20 69 66 20 74 72 75 65 20 2a 2f 0a  rmat if true */.
15830 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a  {.  FILE *out, *
15840 69 6e 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b  in;.  char line[
15850 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  LINESIZE];.  int
15860 20 20 6c 69 6e 65 6e 6f 3b 0a 20 20 73 74 72 75    lineno;.  stru
15870 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
15880 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
15890 61 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ap;.  struct rul
158a0 65 20 2a 72 70 3b 0a 20 20 69 6e 74 20 69 2c 20  e *rp;.  int i, 
158b0 6a 3b 0a 20 20 69 6e 74 20 74 61 62 6c 65 63 6e  j;.  int tablecn
158c0 74 3b 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b  t;.  char *name;
158d0 0a 0a 20 20 69 6e 20 3d 20 74 70 6c 74 5f 6f 70  ..  in = tplt_op
158e0 65 6e 28 6c 65 6d 70 29 3b 0a 20 20 69 66 28 20  en(lemp);.  if( 
158f0 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  in==0 ) return;.
15900 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65    out = file_ope
15910 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c 22 77 22 29  n(lemp,".c","w")
15920 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29  ;.  if( out==0 )
15930 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  {.    fclose(in)
15940 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
15950 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a  }.  lineno = 1;.
15960 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
15970 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
15980 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
15990 6e 65 72 61 74 65 20 74 68 65 20 69 6e 63 6c 75  nerate the inclu
159a0 64 65 20 63 6f 64 65 2c 20 69 66 20 61 6e 79 20  de code, if any 
159b0 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
159c0 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 69  out,lemp,lemp->i
159d0 6e 63 6c 75 64 65 2c 6c 65 6d 70 2d 3e 69 6e 63  nclude,lemp->inc
159e0 6c 75 64 65 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b  ludeln,&lineno);
159f0 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
15a00 0a 20 20 20 20 63 68 61 72 20 2a 6e 61 6d 65 20  .    char *name 
15a10 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28  = file_makename(
15a20 6c 65 6d 70 2c 20 22 2e 68 22 29 3b 0a 20 20 20  lemp, ".h");.   
15a30 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69   fprintf(out,"#i
15a40 6e 63 6c 75 64 65 20 5c 22 25 73 5c 22 5c 6e 22  nclude \"%s\"\n"
15a50 2c 20 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  , name); lineno+
15a60 2b 3b 0a 20 20 20 20 66 72 65 65 28 6e 61 6d 65  +;.    free(name
15a70 29 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  );.  }.  tplt_xf
15a80 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
15a90 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
15aa0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 23 64    /* Generate #d
15ab0 65 66 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20 74  efines for all t
15ac0 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 66 28 20 6d  okens */.  if( m
15ad0 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63 68 61  hflag ){.    cha
15ae0 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 20 20 66  r *prefix;.    f
15af0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20  printf(out,"#if 
15b00 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c  INTERFACE\n"); l
15b10 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28  ineno++;.    if(
15b20 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66   lemp->tokenpref
15b30 69 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65  ix ) prefix = le
15b40 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b  mp->tokenprefix;
15b50 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20  .    else       
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
15b70 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f  fix = "";.    fo
15b80 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=1; i<lemp->n
15b90 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a  terminal; i++){.
15ba0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
15bb0 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33  t,"#define %s%-3
15bc0 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78  0s %2d\n",prefix
15bd0 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
15be0 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20  ]->name,i);.    
15bf0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
15c00 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  }.    fprintf(ou
15c10 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c  t,"#endif\n"); l
15c20 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
15c30 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
15c40 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
15c50 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
15c60 61 74 65 20 74 68 65 20 64 65 66 69 6e 65 73 20  ate the defines 
15c70 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
15c80 2c 22 2f 2a 20 5c 30 30 31 20 2a 2f 5c 6e 22 29  ,"/* \001 */\n")
15c90 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
15ca0 22 23 64 65 66 69 6e 65 20 59 59 43 4f 44 45 54  "#define YYCODET
15cb0 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d  YPE %s\n",.    m
15cc0 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65  inimum_size_type
15cd0 28 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 35  (lemp->nsymbol+5
15ce0 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  )); lineno++;.  
15cf0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
15d00 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45 20 25 64  fine YYNOCODE %d
15d10 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  \n",lemp->nsymbo
15d20 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  l+1);  lineno++;
15d30 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
15d40 23 64 65 66 69 6e 65 20 59 59 41 43 54 49 4f 4e  #define YYACTION
15d50 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20  TYPE %s\n",.    
15d60 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
15d70 65 28 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 6c  e(lemp->nstate+l
15d80 65 6d 70 2d 3e 6e 72 75 6c 65 2b 35 29 29 3b 20  emp->nrule+5)); 
15d90 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 70 72 69   lineno++;.  pri
15da0 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f  nt_stack_union(o
15db0 75 74 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 2c  ut,lemp,&lineno,
15dc0 6d 68 66 6c 61 67 29 3b 0a 20 20 69 66 28 20 6c  mhflag);.  if( l
15dd0 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 20 29  emp->stacksize )
15de0 7b 0a 20 20 20 20 69 66 28 20 61 74 6f 69 28 6c  {.    if( atoi(l
15df0 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3c  emp->stacksize)<
15e00 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 72 72 6f  =0 ){.      Erro
15e10 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
15e20 61 6d 65 2c 30 2c 0a 22 49 6c 6c 65 67 61 6c 20  ame,0,."Illegal 
15e30 73 74 61 63 6b 20 73 69 7a 65 3a 20 5b 25 73 5d  stack size: [%s]
15e40 2e 20 20 54 68 65 20 73 74 61 63 6b 20 73 69 7a  .  The stack siz
15e50 65 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69  e should be an i
15e60 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2e  nteger constant.
15e70 22 2c 0a 20 20 20 20 20 20 20 20 6c 65 6d 70 2d  ",.        lemp-
15e80 3e 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20  >stacksize);.   
15e90 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
15ea0 74 2b 2b 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d  t++;.      lemp-
15eb0 3e 73 74 61 63 6b 73 69 7a 65 20 3d 20 22 31 30  >stacksize = "10
15ec0 30 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  0";.    }.    fp
15ed0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
15ee0 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54 48 20  ne YYSTACKDEPTH 
15ef0 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61 63  %s\n",lemp->stac
15f00 6b 73 69 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ksize);  lineno+
15f10 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
15f20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
15f30 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54  fine YYSTACKDEPT
15f40 48 20 31 30 30 5c 6e 22 29 3b 20 20 6c 69 6e 65  H 100\n");  line
15f50 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  no++;.  }.  if( 
15f60 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 66 70  mhflag ){.    fp
15f70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49  rintf(out,"#if I
15f80 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69  NTERFACE\n"); li
15f90 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 61  neno++;.  }.  na
15fa0 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20  me = lemp->name 
15fb0 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22  ? lemp->name : "
15fc0 50 61 72 73 65 22 3b 0a 20 20 69 66 28 20 6c 65  Parse";.  if( le
15fd0 6d 70 2d 3e 61 72 67 20 26 26 20 6c 65 6d 70 2d  mp->arg && lemp-
15fe0 3e 61 72 67 5b 30 5d 20 29 7b 0a 20 20 20 20 69  >arg[0] ){.    i
15ff0 6e 74 20 69 3b 0a 20 20 20 20 69 20 3d 20 73 74  nt i;.    i = st
16000 72 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29 3b  rlen(lemp->arg);
16010 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31  .    while( i>=1
16020 20 26 26 20 69 73 73 70 61 63 65 28 6c 65 6d 70   && isspace(lemp
16030 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 29 20 69 2d  ->arg[i-1]) ) i-
16040 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e  -;.    while( i>
16050 3d 31 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 6c  =1 && (isalnum(l
16060 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 7c  emp->arg[i-1]) |
16070 7c 20 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d  | lemp->arg[i-1]
16080 3d 3d 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20 20  =='_') ) i--;.  
16090 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
160a0 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45  define %sARG_SDE
160b0 43 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c  CL %s;\n",name,l
160c0 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65  emp->arg);  line
160d0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
160e0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
160f0 73 41 52 47 5f 50 44 45 43 4c 20 2c 25 73 5c 6e  sARG_PDECL ,%s\n
16100 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67  ",name,lemp->arg
16110 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
16120 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
16130 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54  define %sARG_FET
16140 43 48 20 25 73 20 3d 20 79 79 70 50 61 72 73 65  CH %s = yypParse
16150 72 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  r->%s\n",.      
16160 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c             name,
16170 6c 65 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d  lemp->arg,&lemp-
16180 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e  >arg[i]);  linen
16190 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
161a0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
161b0 41 52 47 5f 53 54 4f 52 45 20 79 79 70 50 61 72  ARG_STORE yypPar
161c0 73 65 72 2d 3e 25 73 20 3d 20 25 73 5c 6e 22 2c  ser->%s = %s\n",
161d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
161e0 20 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72    name,&lemp->ar
161f0 67 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b  g[i],&lemp->arg[
16200 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i]);  lineno++;.
16210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
16220 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
16230 65 20 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e 22  e %sARG_SDECL\n"
16240 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ,name);  lineno+
16250 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
16260 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
16270 47 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29  G_PDECL\n",name)
16280 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
16290 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
162a0 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43  efine %sARG_FETC
162b0 48 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65  H\n",name); line
162c0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
162d0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
162e0 73 41 52 47 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61  sARG_STORE\n",na
162f0 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
16300 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20   }.  if( mhflag 
16310 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
16320 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20  ut,"#endif\n"); 
16330 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
16340 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
16350 66 69 6e 65 20 59 59 4e 53 54 41 54 45 20 25 64  fine YYNSTATE %d
16360 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  \n",lemp->nstate
16370 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
16380 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
16390 66 69 6e 65 20 59 59 4e 52 55 4c 45 20 25 64 5c  fine YYNRULE %d\
163a0 6e 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b  n",lemp->nrule);
163b0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70    lineno++;.  fp
163c0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
163d0 6e 65 20 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c  ne YYERRORSYMBOL
163e0 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72   %d\n",lemp->err
163f0 73 79 6d 2d 3e 69 6e 64 65 78 29 3b 20 20 6c 69  sym->index);  li
16400 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
16410 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
16420 59 45 52 52 53 59 4d 44 54 20 79 79 25 64 5c 6e  YERRSYMDT yy%d\n
16430 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e  ",lemp->errsym->
16440 64 74 6e 75 6d 29 3b 20 20 6c 69 6e 65 6e 6f 2b  dtnum);  lineno+
16450 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68  +;.  if( lemp->h
16460 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  as_fallback ){. 
16470 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
16480 23 64 65 66 69 6e 65 20 59 59 46 41 4c 4c 42 41  #define YYFALLBA
16490 43 4b 20 31 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e  CK 1\n");  linen
164a0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
164b0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
164c0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
164d0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
164e0 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
164f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 63 68  ..  **.  ** Each
16500 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 61 63   entry in the ac
16510 74 69 6f 6e 20 74 61 62 6c 65 20 69 73 20 61 6e  tion table is an
16520 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
16530 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 2a 2a 20  following .  ** 
16540 73 74 72 75 63 74 75 72 65 3a 0a 20 20 2a 2a 20  structure:.  ** 
16550 20 20 73 74 72 75 63 74 20 79 79 41 63 74 69 6f    struct yyActio
16560 6e 45 6e 74 72 79 20 7b 0a 20 20 2a 2a 20 20 20  nEntry {.  **   
16570 20 20 20 20 59 59 43 4f 44 45 54 59 50 45 20 20      YYCODETYPE  
16580 20 20 20 20 20 20 20 20 20 20 6c 6f 6f 6b 61 68            lookah
16590 65 61 64 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20  ead;.  **       
165a0 59 59 43 4f 44 45 54 59 50 45 20 20 20 20 20 20  YYCODETYPE      
165b0 20 20 20 20 20 20 6e 65 78 74 3b 0a 20 20 2a 2a        next;.  **
165c0 20 20 20 20 20 20 20 59 59 41 43 54 49 4f 4e 54         YYACTIONT
165d0 59 50 45 20 20 20 20 20 20 20 20 20 20 61 63 74  YPE          act
165e0 69 6f 6e 3b 0a 20 20 2a 2a 20 20 20 7d 0a 20 20  ion;.  **   }.  
165f0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 6e 74 72  **.  ** The entr
16600 69 65 73 20 61 72 65 20 67 72 6f 75 70 65 64 20  ies are grouped 
16610 69 6e 74 6f 20 68 61 73 68 20 74 61 62 6c 65 73  into hash tables
16620 2c 20 6f 6e 65 20 68 61 73 68 20 74 61 62 6c 65  , one hash table
16630 20 66 6f 72 20 65 61 63 68 0a 20 20 2a 2a 20 70   for each.  ** p
16640 61 72 73 65 72 20 73 74 61 74 65 2e 20 20 54 68  arser state.  Th
16650 65 20 68 61 73 68 20 74 61 62 6c 65 20 68 61 73  e hash table has
16660 20 61 20 73 69 7a 65 20 77 68 69 63 68 20 69 73   a size which is
16670 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
16680 20 2a 2a 20 65 6e 74 72 69 65 73 20 69 6e 20 74   ** entries in t
16690 68 61 74 20 74 61 62 6c 65 2e 20 20 49 6e 20 63  hat table.  In c
166a0 61 73 65 20 6f 66 20 61 20 63 6f 6c 6c 69 73 69  ase of a collisi
166b0 6f 6e 2c 20 74 68 65 20 22 6e 65 78 74 22 20 76  on, the "next" v
166c0 61 6c 75 65 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  alue.  ** contai
166d0 6e 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  ns one more than
166e0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
166f0 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 6f  the hash table o
16700 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20  f the next.  ** 
16710 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 6f 6c  entry in the col
16720 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 20 20 41  lision chain.  A
16730 20 22 6e 65 78 74 22 20 76 61 6c 75 65 20 6f 66   "next" value of
16740 20 30 20 6d 65 61 6e 73 20 74 68 65 20 65 6e 64   0 means the end
16750 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 68 61  .  ** of the cha
16760 69 6e 20 68 61 73 20 62 65 65 6e 20 72 65 61 63  in has been reac
16770 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 74 61 62 6c  hed..  */.  tabl
16780 65 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ecnt = 0;..  /* 
16790 4c 6f 6f 70 20 6f 76 65 72 20 70 61 72 73 65 72  Loop over parser
167a0 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 66 6f 72   states */.  for
167b0 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
167c0 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
167d0 69 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b 20 20  int tablesize;  
167e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
167f0 69 7a 65 20 6f 66 20 74 68 65 20 68 61 73 68 20  ize of the hash 
16800 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
16810 20 6a 2c 6b 3b 20 20 20 20 20 20 20 20 20 20 20   j,k;           
16820 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
16830 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
16840 69 6e 74 20 63 6f 6c 6c 69 64 65 5b 32 30 34 38  int collide[2048
16850 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ];          /* T
16860 68 65 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  he collision cha
16870 69 6e 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  in for the table
16880 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 61   */.    struct a
16890 63 74 69 6f 6e 20 2a 74 61 62 6c 65 5b 32 30 34  ction *table[204
168a0 38 5d 3b 20 2f 2a 20 42 75 69 6c 64 20 74 68 65  8]; /* Build the
168b0 20 68 61 73 68 20 74 61 62 6c 65 20 68 65 72 65   hash table here
168c0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   */..    /* Find
168d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
168e0 63 74 69 6f 6e 73 20 61 6e 64 20 69 6e 69 74 69  ctions and initi
168f0 61 6c 69 7a 65 20 74 68 65 20 68 61 73 68 20 74  alize the hash t
16900 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 74 70 20  able */.    stp 
16910 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
16920 5d 3b 0a 20 20 20 20 73 74 70 2d 3e 74 61 62 73  ];.    stp->tabs
16930 74 61 72 74 20 3d 20 74 61 62 6c 65 63 6e 74 3b  tart = tablecnt;
16940 0a 20 20 20 20 73 74 70 2d 3e 6e 61 63 74 69 6f  .    stp->nactio
16950 6e 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 61  n = 0;.    for(a
16960 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
16970 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
16980 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69     if( ap->sp->i
16990 6e 64 65 78 21 3d 6c 65 6d 70 2d 3e 6e 73 79 6d  ndex!=lemp->nsym
169a0 62 6f 6c 20 26 26 20 63 6f 6d 70 75 74 65 5f 61  bol && compute_a
169b0 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 3e 3d  ction(lemp,ap)>=
169c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 70  0 ){.        stp
169d0 2d 3e 6e 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20  ->naction++;.   
169e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74     }.    }.    t
169f0 61 62 6c 65 73 69 7a 65 20 3d 20 73 74 70 2d 3e  ablesize = stp->
16a00 6e 61 63 74 69 6f 6e 3b 0a 20 20 20 20 61 73 73  naction;.    ass
16a10 65 72 74 28 20 74 61 62 6c 65 73 69 7a 65 3c 3d  ert( tablesize<=
16a20 20 73 69 7a 65 6f 66 28 74 61 62 6c 65 29 2f 73   sizeof(table)/s
16a30 69 7a 65 6f 66 28 74 61 62 6c 65 5b 30 5d 29 20  izeof(table[0]) 
16a40 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  );.    for(j=0; 
16a50 6a 3c 74 61 62 6c 65 73 69 7a 65 3b 20 6a 2b 2b  j<tablesize; j++
16a60 29 7b 0a 20 20 20 20 20 20 74 61 62 6c 65 5b 6a  ){.      table[j
16a70 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6c  ] = 0;.      col
16a80 6c 69 64 65 5b 6a 5d 20 3d 20 2d 31 3b 0a 20 20  lide[j] = -1;.  
16a90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 48 61 73 68    }..    /* Hash
16aa0 20 74 68 65 20 61 63 74 69 6f 6e 73 20 69 6e 74   the actions int
16ab0 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  o the hash table
16ac0 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 74 61 62   */.    stp->tab
16ad0 64 66 6c 74 61 63 74 20 3d 20 6c 65 6d 70 2d 3e  dfltact = lemp->
16ae0 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e  nstate + lemp->n
16af0 72 75 6c 65 3b 0a 20 20 20 20 66 6f 72 28 61 70  rule;.    for(ap
16b00 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
16b10 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
16b20 20 20 69 6e 74 20 61 63 74 69 6f 6e 20 3d 20 63    int action = c
16b30 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65  ompute_action(le
16b40 6d 70 2c 61 70 29 3b 0a 20 20 20 20 20 20 69 6e  mp,ap);.      in
16b50 74 20 68 3b 0a 20 20 20 20 20 20 69 66 28 20 61  t h;.      if( a
16b60 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65  p->sp->index==le
16b70 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20  mp->nsymbol ){. 
16b80 20 20 20 20 20 20 20 73 74 70 2d 3e 74 61 62 64         stp->tabd
16b90 66 6c 74 61 63 74 20 3d 20 61 63 74 69 6f 6e 3b  fltact = action;
16ba0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
16bb0 20 61 63 74 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20   action>=0 ){.  
16bc0 20 20 20 20 20 20 68 20 3d 20 61 70 2d 3e 73 70        h = ap->sp
16bd0 2d 3e 69 6e 64 65 78 20 25 20 74 61 62 6c 65 73  ->index % tables
16be0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 61 70 2d  ize;.        ap-
16bf0 3e 63 6f 6c 6c 69 64 65 20 3d 20 74 61 62 6c 65  >collide = table
16c00 5b 68 5d 3b 0a 20 20 20 20 20 20 20 20 74 61 62  [h];.        tab
16c10 6c 65 5b 68 5d 20 3d 20 61 70 3b 0a 20 20 20 20  le[h] = ap;.    
16c20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
16c30 2a 20 52 65 73 6f 6c 76 65 20 63 6f 6c 6c 69 73  * Resolve collis
16c40 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ions */.    for(
16c50 6a 3d 6b 3d 30 3b 20 6a 3c 74 61 62 6c 65 73 69  j=k=0; j<tablesi
16c60 7a 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ze; j++){.      
16c70 69 66 28 20 74 61 62 6c 65 5b 6a 5d 20 26 26 20  if( table[j] && 
16c80 74 61 62 6c 65 5b 6a 5d 2d 3e 63 6f 6c 6c 69 64  table[j]->collid
16c90 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
16ca0 6c 65 28 20 74 61 62 6c 65 5b 6b 5d 20 29 20 6b  le( table[k] ) k
16cb0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 74 61 62 6c  ++;.        tabl
16cc0 65 5b 6b 5d 20 3d 20 74 61 62 6c 65 5b 6a 5d 2d  e[k] = table[j]-
16cd0 3e 63 6f 6c 6c 69 64 65 3b 0a 20 20 20 20 20 20  >collide;.      
16ce0 20 20 63 6f 6c 6c 69 64 65 5b 6a 5d 20 3d 20 6b    collide[j] = k
16cf0 3b 0a 20 20 20 20 20 20 20 20 74 61 62 6c 65 5b  ;.        table[
16d00 6a 5d 2d 3e 63 6f 6c 6c 69 64 65 20 3d 20 30 3b  j]->collide = 0;
16d10 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3c 6a  .        if( k<j
16d20 20 29 20 6a 20 3d 20 6b 2d 31 3b 0a 20 20 20 20   ) j = k-1;.    
16d30 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
16d40 2a 20 50 72 69 6e 74 20 74 68 65 20 68 61 73 68  * Print the hash
16d50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 66   table */.    if
16d60 28 20 74 61 62 6c 65 73 69 7a 65 3e 30 20 29 7b  ( tablesize>0 ){
16d70 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
16d80 75 74 2c 22 2f 2a 20 53 74 61 74 65 20 25 64 20  ut,"/* State %d 
16d90 2a 2f 5c 6e 22 2c 73 74 70 2d 3e 69 6e 64 65 78  */\n",stp->index
16da0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
16db0 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20   }.    for(j=0; 
16dc0 6a 3c 74 61 62 6c 65 73 69 7a 65 3b 20 6a 2b 2b  j<tablesize; j++
16dd0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
16de0 20 74 61 62 6c 65 5b 6a 5d 21 3d 30 20 29 3b 0a   table[j]!=0 );.
16df0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
16e00 74 2c 22 20 20 7b 25 34 64 2c 25 34 64 2c 25 34  t,"  {%4d,%4d,%4
16e10 64 7d 2c 20 2f 2a 20 25 32 64 3a 20 22 2c 0a 20  d}, /* %2d: ",. 
16e20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 5b 6a           table[j
16e30 5d 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 0a 20 20  ]->sp->index,.  
16e40 20 20 20 20 20 20 20 20 63 6f 6c 6c 69 64 65 5b          collide[
16e50 6a 5d 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20  j]+1,.          
16e60 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c  compute_action(l
16e70 65 6d 70 2c 74 61 62 6c 65 5b 6a 5d 29 2c 0a 20  emp,table[j]),. 
16e80 20 20 20 20 20 20 20 20 20 6a 2b 31 29 3b 0a 20           j+1);. 
16e90 20 20 20 20 20 50 72 69 6e 74 41 63 74 69 6f 6e       PrintAction
16ea0 28 74 61 62 6c 65 5b 6a 5d 2c 6f 75 74 2c 32 32  (table[j],out,22
16eb0 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
16ec0 28 6f 75 74 2c 22 20 2a 2f 5c 6e 22 29 3b 20 0a  (out," */\n"); .
16ed0 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a        lineno++;.
16ee0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70      }..    /* Up
16ef0 64 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 63  date the table c
16f00 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 74 61 62 6c  ount */.    tabl
16f10 65 63 6e 74 20 2b 3d 20 74 61 62 6c 65 73 69 7a  ecnt += tablesiz
16f20 65 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  e;.  }.  tplt_xf
16f30 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
16f40 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  ,out,&lineno);. 
16f50 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65   lemp->tablesize
16f60 20 3d 20 74 61 62 6c 65 63 6e 74 3b 0a 0a 20 20   = tablecnt;..  
16f70 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
16f80 73 74 61 74 65 20 74 61 62 6c 65 0a 20 20 2a 2a  state table.  **
16f90 0a 20 20 2a 2a 20 45 61 63 68 20 65 6e 74 72 79  .  ** Each entry
16fa0 20 69 73 20 61 6e 20 65 6c 65 6d 65 6e 74 20 6f   is an element o
16fb0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
16fc0 73 74 72 75 63 74 75 72 65 3a 0a 20 20 2a 2a 20  structure:.  ** 
16fd0 20 20 20 73 74 72 75 63 74 20 79 79 53 74 61 74     struct yyStat
16fe0 65 45 6e 74 72 79 20 7b 0a 20 20 2a 2a 20 20 20  eEntry {.  **   
16ff0 20 20 20 73 74 72 75 63 74 20 79 79 41 63 74 69     struct yyActi
17000 6f 6e 45 6e 74 72 79 20 2a 68 61 73 68 74 62 6c  onEntry *hashtbl
17010 3b 0a 20 20 2a 2a 20 20 20 20 20 20 59 59 43 4f  ;.  **      YYCO
17020 44 45 54 59 50 45 20 6e 45 6e 74 72 79 3b 0a 20  DETYPE nEntry;. 
17030 20 2a 2a 20 20 20 20 20 20 59 59 41 43 54 49 4f   **      YYACTIO
17040 4e 54 59 50 45 20 61 63 74 69 6f 6e 44 65 66 61  NTYPE actionDefa
17050 75 6c 74 3b 0a 20 20 2a 2a 20 20 20 20 7d 0a 20  ult;.  **    }. 
17060 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
17070 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
17080 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
17090 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
170a0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
170b0 22 20 20 7b 20 26 79 79 41 63 74 69 6f 6e 54 61  "  { &yyActionTa
170c0 62 6c 65 5b 25 64 5d 2c 25 34 64 2c 25 34 64 20  ble[%d],%4d,%4d 
170d0 7d 2c 5c 6e 22 2c 0a 20 20 20 20 20 20 73 74 70  },\n",.      stp
170e0 2d 3e 74 61 62 73 74 61 72 74 2c 0a 20 20 20 20  ->tabstart,.    
170f0 20 20 73 74 70 2d 3e 6e 61 63 74 69 6f 6e 2c 0a    stp->naction,.
17100 20 20 20 20 20 20 73 74 70 2d 3e 74 61 62 64 66        stp->tabdf
17110 6c 74 61 63 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ltact); lineno++
17120 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
17130 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
17140 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
17150 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
17160 20 74 61 62 6c 65 20 6f 66 20 66 61 6c 6c 62 61   table of fallba
17170 63 6b 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a  ck tokens..  */.
17180 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f    if( lemp->has_
17190 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  fallback ){.    
171a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
171b0 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29  >nterminal; i++)
171c0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
171d0 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d  ymbol *p = lemp-
171e0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
171f0 20 20 20 69 66 28 20 70 2d 3e 66 61 6c 6c 62 61     if( p->fallba
17200 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
17210 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
17220 20 20 20 30 2c 20 20 2f 2a 20 25 31 30 73 20 3d     0,  /* %10s =
17230 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c  > nothing */\n",
17240 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20   p->name);.     
17250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17260 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20  fprintf(out, "  
17270 25 33 64 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e  %3d,  /* %10s =>
17280 20 25 73 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61   %s */\n", p->fa
17290 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20  llback->index,. 
172a0 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 61 6d 65           p->name
172b0 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e  , p->fallback->n
172c0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
172d0 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
172e0 20 20 7d 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78    }.  }.  tplt_x
172f0 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20  fer(lemp->name, 
17300 69 6e 2c 20 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f  in, out, &lineno
17310 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
17320 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  e a table contai
17330 6e 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 69  ning the symboli
17340 63 20 6e 61 6d 65 20 6f 66 20 65 76 65 72 79 20  c name of every 
17350 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f  symbol.  */.  fo
17360 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
17370 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
17380 20 20 73 70 72 69 6e 74 66 28 6c 69 6e 65 2c 22    sprintf(line,"
17390 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73  \"%s\",",lemp->s
173a0 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29  ymbols[i]->name)
173b0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
173c0 74 2c 22 20 20 25 2d 31 35 73 22 2c 6c 69 6e 65  t,"  %-15s",line
173d0 29 3b 0a 20 20 20 20 69 66 28 20 28 69 26 33 29  );.    if( (i&3)
173e0 3d 3d 33 20 29 7b 20 66 70 72 69 6e 74 66 28 6f  ==3 ){ fprintf(o
173f0 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ut,"\n"); lineno
17400 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20  ++; }.  }.  if( 
17410 28 69 26 33 29 21 3d 30 20 29 7b 20 66 70 72 69  (i&3)!=0 ){ fpri
17420 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c  ntf(out,"\n"); l
17430 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c  ineno++; }.  tpl
17440 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
17450 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
17460 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
17470 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  e a table contai
17480 6e 69 6e 67 20 61 20 74 65 78 74 20 73 74 72 69  ning a text stri
17490 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
174a0 73 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 75 6c  s every.  ** rul
174b0 65 20 69 6e 20 74 68 65 20 72 75 6c 65 20 73 65  e in the rule se
174c0 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 65 72  t of the grammer
174d0 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
174e0 69 6f 6e 20 69 73 20 75 73 65 64 0a 20 20 2a 2a  ion is used.  **
174f0 20 77 68 65 6e 20 74 72 61 63 69 6e 67 20 52 45   when tracing RE
17500 44 55 43 45 20 61 63 74 69 6f 6e 73 2e 0a 20 20  DUCE actions..  
17510 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 72 70  */.  for(i=0, rp
17520 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
17530 20 72 70 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b   rp=rp->next, i+
17540 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
17550 72 70 2d 3e 69 6e 64 65 78 3d 3d 69 20 29 3b 0a  rp->index==i );.
17560 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
17570 22 20 2f 2a 20 25 33 64 20 2a 2f 20 5c 22 25 73  " /* %3d */ \"%s
17580 20 3a 3a 3d 22 2c 20 69 2c 20 72 70 2d 3e 6c 68   ::=", i, rp->lh
17590 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  s->name);.    fo
175a0 72 28 6a 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68  r(j=0; j<rp->nrh
175b0 73 3b 20 6a 2b 2b 29 20 66 70 72 69 6e 74 66 28  s; j++) fprintf(
175c0 6f 75 74 2c 22 20 25 73 22 2c 72 70 2d 3e 72 68  out," %s",rp->rh
175d0 73 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  s[j]->name);.   
175e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22   fprintf(out,"\"
175f0 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ,\n"); lineno++;
17600 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
17610 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
17620 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
17630 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
17640 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20   which executes 
17650 65 76 65 72 79 20 74 69 6d 65 20 61 20 73 79 6d  every time a sym
17660 62 6f 6c 20 69 73 20 70 6f 70 70 65 64 20 66 72  bol is popped fr
17670 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63  om.  ** the stac
17680 6b 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  k while processi
17690 6e 67 20 65 72 72 6f 72 73 20 6f 72 20 77 68 69  ng errors or whi
176a0 6c 65 20 64 65 73 74 72 6f 79 69 6e 67 20 74 68  le destroying th
176b0 65 20 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a 20  e parser. .  ** 
176c0 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
176d0 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 25 64   generate the %d
176e0 65 73 74 72 75 63 74 6f 72 20 61 63 74 69 6f 6e  estructor action
176f0 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65  s).  */.  if( le
17700 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29 7b  mp->tokendest ){
17710 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
17720 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
17730 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
17740 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
17750 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
17760 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30  .      if( sp==0
17770 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21 3d 54 45   || sp->type!=TE
17780 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75  RMINAL ) continu
17790 65 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  e;.      fprintf
177a0 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25  (out,"    case %
177b0 64 3a 5c 6e 22 2c 73 70 2d 3e 69 6e 64 65 78 29  d:\n",sp->index)
177c0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
177d0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
177e0 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 26  <lemp->nsymbol &
177f0 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  & lemp->symbols[
17800 69 5d 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e  i]->type!=TERMIN
17810 41 4c 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 69 66  AL; i++);.    if
17820 28 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ( i<lemp->nsymbo
17830 6c 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f  l ){.      emit_
17840 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28  destructor_code(
17850 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  out,lemp->symbol
17860 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e  s[i],lemp,&linen
17870 6f 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  o);.      fprint
17880 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65  f(out,"      bre
17890 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ak;\n"); lineno+
178a0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  +;.    }.  }.  f
178b0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
178c0 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
178d0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
178e0 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d   *sp = lemp->sym
178f0 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28  bols[i];.    if(
17900 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79   sp==0 || sp->ty
17910 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 20  pe==TERMINAL || 
17920 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3d 3d  sp->destructor==
17930 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
17940 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
17950 20 20 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c 73     case %d:\n",s
17960 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e  p->index); linen
17970 6f 2b 2b 3b 0a 20 20 20 20 65 6d 69 74 5f 64 65  o++;.    emit_de
17980 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75  structor_code(ou
17990 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  t,lemp->symbols[
179a0 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  i],lemp,&lineno)
179b0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
179c0 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c  t,"      break;\
179d0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
179e0 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76   }.  if( lemp->v
179f0 61 72 64 65 73 74 20 29 7b 0a 20 20 20 20 73 74  ardest ){.    st
17a00 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66 6c  ruct symbol *dfl
17a10 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20 66 6f  t_sp = 0;.    fo
17a20 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
17a30 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
17a40 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
17a50 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  l *sp = lemp->sy
17a60 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20  mbols[i];.      
17a70 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d  if( sp==0 || sp-
17a80 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20  >type==TERMINAL 
17a90 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d  ||.          sp-
17aa0 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20 73 70 2d  >index<=0 || sp-
17ab0 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30 20 29  >destructor!=0 )
17ac0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
17ad0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
17ae0 20 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c 73 70    case %d:\n",sp
17af0 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f  ->index); lineno
17b00 2b 2b 3b 0a 20 20 20 20 20 20 64 66 6c 74 5f 73  ++;.      dflt_s
17b10 70 20 3d 20 73 70 3b 0a 20 20 20 20 7d 0a 20 20  p = sp;.    }.  
17b20 20 20 69 66 28 20 64 66 6c 74 5f 73 70 21 3d 30    if( dflt_sp!=0
17b30 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64   ){.      emit_d
17b40 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f  estructor_code(o
17b50 75 74 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d 70 2c  ut,dflt_sp,lemp,
17b60 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20  &lineno);.      
17b70 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
17b80 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c     break;\n"); l
17b90 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ineno++;.    }. 
17ba0 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
17bb0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
17bc0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
17bd0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
17be0 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
17bf0 65 6e 65 76 65 72 20 74 68 65 20 70 61 72 73 65  enever the parse
17c00 72 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77  r stack overflow
17c10 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  s */.  tplt_prin
17c20 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
17c30 3e 6f 76 65 72 66 6c 6f 77 2c 6c 65 6d 70 2d 3e  >overflow,lemp->
17c40 6f 76 65 72 66 6c 6f 77 6c 6e 2c 26 6c 69 6e 65  overflowln,&line
17c50 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  no);.  tplt_xfer
17c60 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
17c70 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
17c80 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
17c90 74 61 62 6c 65 20 6f 66 20 72 75 6c 65 20 69 6e  table of rule in
17ca0 66 6f 72 6d 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a  formation .  **.
17cb0 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20    ** Note: This 
17cc0 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
17cd0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 72 75  the fact that ru
17ce0 6c 65 73 20 61 72 65 20 6e 75 6d 62 65 72 0a 20  les are number. 
17cf0 20 2a 2a 20 73 65 71 75 65 6e 74 75 61 6c 6c 79   ** sequentually
17d00 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
17d10 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70  0..  */.  for(rp
17d20 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
17d30 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
17d40 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
17d50 20 20 7b 20 25 64 2c 20 25 64 20 7d 2c 5c 6e 22    { %d, %d },\n"
17d60 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c  ,rp->lhs->index,
17d70 72 70 2d 3e 6e 72 68 73 29 3b 20 6c 69 6e 65 6e  rp->nrhs); linen
17d80 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
17d90 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
17da0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
17db0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
17dc0 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
17dd0 74 69 6f 6e 20 64 75 72 69 6e 67 20 65 61 63 68  tion during each
17de0 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 2a   REDUCE action *
17df0 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  /.  for(rp=lemp-
17e00 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
17e10 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 66 70 72  ->next){.    fpr
17e20 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
17e30 63 61 73 65 20 25 64 3a 5c 6e 22 2c 72 70 2d 3e  case %d:\n",rp->
17e40 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  index); lineno++
17e50 3b 0a 20 20 20 20 65 6d 69 74 5f 63 6f 64 65 28  ;.    emit_code(
17e60 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e  out,rp,lemp,&lin
17e70 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  eno);.    fprint
17e80 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20 62  f(out,"        b
17e90 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
17ea0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
17eb0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
17ec0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
17ed0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
17ee0 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
17ef0 74 65 73 20 69 66 20 61 20 70 61 72 73 65 20 66  tes if a parse f
17f00 61 69 6c 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70  ails */.  tplt_p
17f10 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
17f20 6d 70 2d 3e 66 61 69 6c 75 72 65 2c 6c 65 6d 70  mp->failure,lemp
17f30 2d 3e 66 61 69 6c 75 72 65 6c 6e 2c 26 6c 69 6e  ->failureln,&lin
17f40 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65  eno);.  tplt_xfe
17f50 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
17f60 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
17f70 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
17f80 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
17f90 20 77 68 65 6e 20 61 20 73 79 6e 74 61 78 20 65   when a syntax e
17fa0 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20  rror occurs */. 
17fb0 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
17fc0 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72  lemp,lemp->error
17fd0 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 6c 6e 2c 26  ,lemp->errorln,&
17fe0 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f  lineno);.  tplt_
17ff0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
18000 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
18010 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
18020 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
18030 74 65 73 20 77 68 65 6e 20 74 68 65 20 70 61 72  tes when the par
18040 73 65 72 20 61 63 63 65 70 74 73 20 69 74 73 20  ser accepts its 
18050 69 6e 70 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f  input */.  tplt_
18060 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
18070 65 6d 70 2d 3e 61 63 63 65 70 74 2c 6c 65 6d 70  emp->accept,lemp
18080 2d 3e 61 63 63 65 70 74 6c 6e 2c 26 6c 69 6e 65  ->acceptln,&line
18090 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  no);.  tplt_xfer
180a0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
180b0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
180c0 2f 2a 20 41 70 70 65 6e 64 20 61 6e 79 20 61 64  /* Append any ad
180d0 64 69 74 69 6f 6e 20 63 6f 64 65 20 74 68 65 20  dition code the 
180e0 75 73 65 72 20 64 65 73 69 72 65 73 20 2a 2f 0a  user desires */.
180f0 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
18100 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74 72  ,lemp,lemp->extr
18110 61 63 6f 64 65 2c 6c 65 6d 70 2d 3e 65 78 74 72  acode,lemp->extr
18120 61 63 6f 64 65 6c 6e 2c 26 6c 69 6e 65 6e 6f 29  acodeln,&lineno)
18130 3b 0a 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  ;..  fclose(in);
18140 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a  .  fclose(out);.
18150 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
18160 47 65 6e 65 72 61 74 65 20 61 20 68 65 61 64 65  Generate a heade
18170 72 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70  r file for the p
18180 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65  arser */.void Re
18190 70 6f 72 74 48 65 61 64 65 72 28 6c 65 6d 70 29  portHeader(lemp)
181a0 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
181b0 65 6d 70 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f  emp;.{.  FILE *o
181c0 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20  ut, *in;.  char 
181d0 2a 70 72 65 66 69 78 3b 0a 20 20 63 68 61 72 20  *prefix;.  char 
181e0 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a  line[LINESIZE];.
181f0 20 20 63 68 61 72 20 70 61 74 74 65 72 6e 5b 4c    char pattern[L
18200 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20  INESIZE];.  int 
18210 69 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  i;..  if( lemp->
18220 74 6f 6b 65 6e 70 72 65 66 69 78 20 29 20 70 72  tokenprefix ) pr
18230 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b  efix = lemp->tok
18240 65 6e 70 72 65 66 69 78 3b 0a 20 20 65 6c 73 65  enprefix;.  else
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18260 20 20 20 20 70 72 65 66 69 78 20 3d 20 22 22 3b      prefix = "";
18270 0a 20 20 69 6e 20 3d 20 66 69 6c 65 5f 6f 70 65  .  in = file_ope
18280 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 72 22 29  n(lemp,".h","r")
18290 3b 0a 20 20 69 66 28 20 69 6e 20 29 7b 0a 20 20  ;.  if( in ){.  
182a0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d    for(i=1; i<lem
182b0 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20  p->nterminal && 
182c0 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53  fgets(line,LINES
182d0 49 5a 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20  IZE,in); i++){. 
182e0 20 20 20 20 20 73 70 72 69 6e 74 66 28 70 61 74       sprintf(pat
182f0 74 65 72 6e 2c 22 23 64 65 66 69 6e 65 20 25 73  tern,"#define %s
18300 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65  %-30s %2d\n",pre
18310 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  fix,lemp->symbol
18320 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20  s[i]->name,i);. 
18330 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
18340 6c 69 6e 65 2c 70 61 74 74 65 72 6e 29 20 29 20  line,pattern) ) 
18350 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
18360 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
18370 20 69 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74   if( i==lemp->nt
18380 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20  erminal ){.     
18390 20 2f 2a 20 4e 6f 20 63 68 61 6e 67 65 20 69 6e   /* No change in
183a0 20 74 68 65 20 66 69 6c 65 2e 20 20 44 6f 6e 27   the file.  Don'
183b0 74 20 72 65 77 72 69 74 65 20 69 74 2e 20 2a 2f  t rewrite it. */
183c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
183d0 20 20 20 7d 0a 20 20 7d 0a 20 20 6f 75 74 20 3d     }.  }.  out =
183e0 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c   file_open(lemp,
183f0 22 2e 68 22 2c 22 77 22 29 3b 0a 20 20 69 66 28  ".h","w");.  if(
18400 20 6f 75 74 20 29 7b 0a 20 20 20 20 66 6f 72 28   out ){.    for(
18410 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65  i=1; i<lemp->nte
18420 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  rminal; i++){.  
18430 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
18440 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73  "#define %s%-30s
18450 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c   %2d\n",prefix,l
18460 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
18470 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 7d 0a  >name,i);.    }.
18480 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
18490 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b    .  }.  return;
184a0 0a 7d 0a 0a 2f 2a 20 52 65 64 75 63 65 20 74 68  .}../* Reduce th
184b0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 63  e size of the ac
184c0 74 69 6f 6e 20 74 61 62 6c 65 73 2c 20 69 66 20  tion tables, if 
184d0 70 6f 73 73 69 62 6c 65 2c 20 62 79 20 6d 61 6b  possible, by mak
184e0 69 6e 67 20 75 73 65 0a 2a 2a 20 6f 66 20 64 65  ing use.** of de
184f0 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  faults..**.** In
18500 20 74 68 69 73 20 76 65 72 73 69 6f 6e 2c 20 77   this version, w
18510 65 20 74 61 6b 65 20 74 68 65 20 6d 6f 73 74 20  e take the most 
18520 66 72 65 71 75 65 6e 74 20 52 45 44 55 43 45 20  frequent REDUCE 
18530 61 63 74 69 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a  action and make.
18540 2a 2a 20 69 74 20 74 68 65 20 64 65 66 61 75 6c  ** it the defaul
18550 74 2e 20 20 4f 6e 6c 79 20 64 65 66 61 75 6c 74  t.  Only default
18560 20 61 20 72 65 64 75 63 65 20 69 66 20 74 68 65   a reduce if the
18570 72 65 20 61 72 65 20 6d 6f 72 65 20 74 68 61 6e  re are more than
18580 20 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f   one..*/.void Co
18590 6d 70 72 65 73 73 54 61 62 6c 65 73 28 6c 65 6d  mpressTables(lem
185a0 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
185b0 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63  *lemp;.{.  struc
185c0 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20  t state *stp;.  
185d0 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
185e0 70 2c 20 2a 61 70 32 3b 0a 20 20 73 74 72 75 63  p, *ap2;.  struc
185f0 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 72 70 32  t rule *rp, *rp2
18600 2c 20 2a 72 62 65 73 74 3b 0a 20 20 69 6e 74 20  , *rbest;.  int 
18610 6e 62 65 73 74 2c 20 6e 3b 0a 20 20 69 6e 74 20  nbest, n;.  int 
18620 69 3b 0a 20 20 69 6e 74 20 63 6e 74 3b 0a 0a 20  i;.  int cnt;.. 
18630 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
18640 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
18650 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
18660 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6e  sorted[i];.    n
18670 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 72 62  best = 0;.    rb
18680 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 66 6f  est = 0;..    fo
18690 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
186a0 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
186b0 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
186c0 70 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e  pe!=REDUCE ) con
186d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 70 20  tinue;.      rp 
186e0 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20  = ap->x.rp;.    
186f0 20 20 69 66 28 20 72 70 3d 3d 72 62 65 73 74 20    if( rp==rbest 
18700 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
18710 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66    n = 1;.      f
18720 6f 72 28 61 70 32 3d 61 70 2d 3e 6e 65 78 74 3b  or(ap2=ap->next;
18730 20 61 70 32 3b 20 61 70 32 3d 61 70 32 2d 3e 6e   ap2; ap2=ap2->n
18740 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ext){.        if
18750 28 20 61 70 32 2d 3e 74 79 70 65 21 3d 52 45 44  ( ap2->type!=RED
18760 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UCE ) continue;.
18770 20 20 20 20 20 20 20 20 72 70 32 20 3d 20 61 70          rp2 = ap
18780 32 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 20  2->x.rp;.       
18790 20 69 66 28 20 72 70 32 3d 3d 72 62 65 73 74 20   if( rp2==rbest 
187a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
187b0 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72 70 20      if( rp2==rp 
187c0 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ) n++;.      }. 
187d0 20 20 20 20 20 69 66 28 20 6e 3e 6e 62 65 73 74       if( n>nbest
187e0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 62 65 73   ){.        nbes
187f0 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 72  t = n;.        r
18800 62 65 73 74 20 3d 20 72 70 3b 0a 20 20 20 20 20  best = rp;.     
18810 20 7d 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f   }.    }. .    /
18820 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b 65 20 61 20  * Do not make a 
18830 64 65 66 61 75 6c 74 20 69 66 20 74 68 65 20 6e  default if the n
18840 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73 20 74  umber of rules t
18850 6f 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  o default.    **
18860 20 69 73 20 6e 6f 74 20 61 74 20 6c 65 61 73 74   is not at least
18870 20 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 62   2 */.    if( nb
18880 65 73 74 3c 32 20 29 20 63 6f 6e 74 69 6e 75 65  est<2 ) continue
18890 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69  ;...    /* Combi
188a0 6e 65 20 6d 61 74 63 68 69 6e 67 20 52 45 44 55  ne matching REDU
188b0 43 45 20 61 63 74 69 6f 6e 73 20 69 6e 74 6f 20  CE actions into 
188c0 61 20 73 69 6e 67 6c 65 20 64 65 66 61 75 6c 74  a single default
188d0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 61 70 3d 73   */.    for(ap=s
188e0 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  tp->ap; ap; ap=a
188f0 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
18900 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45  if( ap->type==RE
18910 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70  DUCE && ap->x.rp
18920 3d 3d 72 62 65 73 74 20 29 20 62 72 65 61 6b 3b  ==rbest ) break;
18930 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
18940 74 28 20 61 70 20 29 3b 0a 20 20 20 20 61 70 2d  t( ap );.    ap-
18950 3e 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  >sp = Symbol_new
18960 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20  ("{default}");. 
18970 20 20 20 66 6f 72 28 61 70 3d 61 70 2d 3e 6e 65     for(ap=ap->ne
18980 78 74 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  xt; ap; ap=ap->n
18990 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
189a0 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  ap->type==REDUCE
189b0 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62   && ap->x.rp==rb
189c0 65 73 74 20 29 20 61 70 2d 3e 74 79 70 65 20 3d  est ) ap->type =
189d0 20 4e 4f 54 5f 55 53 45 44 3b 0a 20 20 20 20 7d   NOT_USED;.    }
189e0 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41  .    stp->ap = A
189f0 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e  ction_sort(stp->
18a00 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 2a 2a  ap);.  }.}../***
18a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
18a20 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73 65  rom the file "se
18a30 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t.c" ***********
18a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
18a60 20 53 65 74 20 6d 61 6e 69 70 75 6c 61 74 69 6f   Set manipulatio
18a70 6e 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 74  n routines for t
18a80 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20  he LEMON parser 
18a90 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73  generator..*/..s
18aa0 74 61 74 69 63 20 69 6e 74 20 73 69 7a 65 20 3d  tatic int size =
18ab0 20 30 3b 0a 0a 2f 2a 20 53 65 74 20 74 68 65 20   0;../* Set the 
18ac0 73 65 74 20 73 69 7a 65 20 2a 2f 0a 76 6f 69 64  set size */.void
18ad0 20 53 65 74 53 69 7a 65 28 6e 29 0a 69 6e 74 20   SetSize(n).int 
18ae0 6e 3b 0a 7b 0a 20 20 73 69 7a 65 20 3d 20 6e 2b  n;.{.  size = n+
18af0 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  1;.}../* Allocat
18b00 65 20 61 20 6e 65 77 20 73 65 74 20 2a 2f 0a 63  e a new set */.c
18b10 68 61 72 20 2a 53 65 74 4e 65 77 28 29 7b 0a 20  har *SetNew(){. 
18b20 20 63 68 61 72 20 2a 73 3b 0a 20 20 69 6e 74 20   char *s;.  int 
18b30 69 3b 0a 20 20 73 20 3d 20 28 63 68 61 72 2a 29  i;.  s = (char*)
18b40 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 20 29 3b 0a  malloc( size );.
18b50 20 20 69 66 28 20 73 3d 3d 30 20 29 7b 0a 20 20    if( s==0 ){.  
18b60 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d 65    extern void me
18b70 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20  mory_error();.  
18b80 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29    memory_error()
18b90 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
18ba0 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 73 5b   i<size; i++) s[
18bb0 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  i] = 0;.  return
18bc0 20 73 3b 0a 7d 0a 0a 2f 2a 20 44 65 61 6c 6c 6f   s;.}../* Deallo
18bd0 63 61 74 65 20 61 20 73 65 74 20 2a 2f 0a 76 6f  cate a set */.vo
18be0 69 64 20 53 65 74 46 72 65 65 28 73 29 0a 63 68  id SetFree(s).ch
18bf0 61 72 20 2a 73 3b 0a 7b 0a 20 20 66 72 65 65 28  ar *s;.{.  free(
18c00 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20  s);.}../* Add a 
18c10 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
18c20 68 65 20 73 65 74 2e 20 20 52 65 74 75 72 6e 20  he set.  Return 
18c30 54 52 55 45 20 69 66 20 74 68 65 20 65 6c 65 6d  TRUE if the elem
18c40 65 6e 74 20 77 61 73 20 61 64 64 65 64 0a 2a 2a  ent was added.**
18c50 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 69 74   and FALSE if it
18c60 20 77 61 73 20 61 6c 72 65 61 64 79 20 74 68 65   was already the
18c70 72 65 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 41 64  re. */.int SetAd
18c80 64 28 73 2c 65 29 0a 63 68 61 72 20 2a 73 3b 0a  d(s,e).char *s;.
18c90 69 6e 74 20 65 3b 0a 7b 0a 20 20 69 6e 74 20 72  int e;.{.  int r
18ca0 76 3b 0a 20 20 72 76 20 3d 20 73 5b 65 5d 3b 0a  v;.  rv = s[e];.
18cb0 20 20 73 5b 65 5d 20 3d 20 31 3b 0a 20 20 72 65    s[e] = 1;.  re
18cc0 74 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a 2f 2a 20  turn !rv;.}../* 
18cd0 41 64 64 20 65 76 65 72 79 20 65 6c 65 6d 65 6e  Add every elemen
18ce0 74 20 6f 66 20 73 32 20 74 6f 20 73 31 2e 20 20  t of s2 to s1.  
18cf0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
18d00 31 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 69 6e  1 changes. */.in
18d10 74 20 53 65 74 55 6e 69 6f 6e 28 73 31 2c 73 32  t SetUnion(s1,s2
18d20 29 0a 63 68 61 72 20 2a 73 31 3b 0a 63 68 61 72  ).char *s1;.char
18d30 20 2a 73 32 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c   *s2;.{.  int i,
18d40 20 70 72 6f 67 72 65 73 73 3b 0a 20 20 70 72 6f   progress;.  pro
18d50 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 66 6f 72  gress = 0;.  for
18d60 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
18d70 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 32 5b 69  +){.    if( s2[i
18d80 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
18d90 0a 20 20 20 20 69 66 28 20 73 31 5b 69 5d 3d 3d  .    if( s1[i]==
18da0 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 67 72  0 ){.      progr
18db0 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  ess = 1;.      s
18dc0 31 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  1[i] = 1;.    }.
18dd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 6f    }.  return pro
18de0 67 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  gress;.}./******
18df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e00 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
18e10 74 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  table.c" *******
18e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e30 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c  *****/./*.** All
18e40 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69   code in this fi
18e50 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f  le has been auto
18e60 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61  matically genera
18e70 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70  ted.** from a sp
18e80 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74  ecification in t
18e90 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20  he file.**      
18ea0 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71          "table.q
18eb0 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f  ".** by the asso
18ec0 63 69 61 74 69 76 65 20 61 72 72 61 79 20 63 6f  ciative array co
18ed0 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67  de building prog
18ee0 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20  ram "aagen"..** 
18ef0 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73  Do not edit this
18f00 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c   file!  Instead,
18f10 20 65 64 69 74 20 74 68 65 20 73 70 65 63 69 66   edit the specif
18f20 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c  ication.** file,
18f30 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65   then rerun aage
18f40 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  n..*/./*.** Code
18f50 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
18f60 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45  tables in the LE
18f70 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
18f80 61 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49 56 41 54  ator..*/..PRIVAT
18f90 45 20 69 6e 74 20 73 74 72 68 61 73 68 28 78 29  E int strhash(x)
18fa0 0a 63 68 61 72 20 2a 78 3b 0a 7b 0a 20 20 69 6e  .char *x;.{.  in
18fb0 74 20 68 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  t h = 0;.  while
18fc0 28 20 2a 78 29 20 68 20 3d 20 68 2a 31 33 20 2b  ( *x) h = h*13 +
18fd0 20 2a 28 78 2b 2b 29 3b 0a 20 20 72 65 74 75 72   *(x++);.  retur
18fe0 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b 73  n h;.}../* Works
18ff0 20 6c 69 6b 65 20 73 74 72 64 75 70 2c 20 73 6f   like strdup, so
19000 72 74 20 6f 66 2e 20 20 53 61 76 65 20 61 20 73  rt of.  Save a s
19010 74 72 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f 63 65  tring in malloce
19020 64 20 6d 65 6d 6f 72 79 2c 20 62 75 74 0a 2a 2a  d memory, but.**
19030 20 6b 65 65 70 20 73 74 72 69 6e 67 73 20 69 6e   keep strings in
19040 20 61 20 74 61 62 6c 65 20 73 6f 20 74 68 61 74   a table so that
19050 20 74 68 65 20 73 61 6d 65 20 73 74 72 69 6e 67   the same string
19060 20 69 73 20 6e 6f 74 20 69 6e 20 6d 6f 72 65 0a   is not in more.
19070 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 70 6c 61 63  ** than one plac
19080 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 53 74 72 73  e..*/.char *Strs
19090 61 66 65 28 79 29 0a 63 68 61 72 20 2a 79 3b 0a  afe(y).char *y;.
190a0 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20  {.  char *z;..  
190b0 7a 20 3d 20 53 74 72 73 61 66 65 5f 66 69 6e 64  z = Strsafe_find
190c0 28 79 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  (y);.  if( z==0 
190d0 26 26 20 28 7a 3d 6d 61 6c 6c 6f 63 28 20 73 74  && (z=malloc( st
190e0 72 6c 65 6e 28 79 29 2b 31 20 29 29 21 3d 30 20  rlen(y)+1 ))!=0 
190f0 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 7a 2c  ){.    strcpy(z,
19100 79 29 3b 0a 20 20 20 20 53 74 72 73 61 66 65 5f  y);.    Strsafe_
19110 69 6e 73 65 72 74 28 7a 29 3b 0a 20 20 7d 0a 20  insert(z);.  }. 
19120 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 7a 29 3b   MemoryCheck(z);
19130 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
19140 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
19150 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
19160 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
19170 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  ure for each.** 
19180 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
19190 79 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a  y of type "x1"..
191a0 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 31 20 7b  */.struct s_x1 {
191b0 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
191c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
191d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
191e0 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a  lable slots. */.
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d            /*   M
19210 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
19220 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e  f 2 greater than
19230 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   or */.         
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19250 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31   /*   equal to 1
19260 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b   */.  int count;
19270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19280 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65   Number of curre
19290 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65  ntly slots fille
192a0 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  d */.  struct s_
192b0 78 31 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a  x1node *tbl;  /*
192c0 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64   The data stored
192d0 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63   here */.  struc
192e0 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 68 74 3b  t s_x1node **ht;
192f0 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
19300 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d  for lookups */.}
19310 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
19320 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
19330 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f  his structure fo
19340 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65  r every data ele
19350 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73  ment.** in an as
19360 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
19370 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f  of type "x1"..*/
19380 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
19390 73 5f 78 31 6e 6f 64 65 20 7b 0a 20 20 63 68 61  s_x1node {.  cha
193a0 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  r *data;        
193b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
193c0 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63   data */.  struc
193d0 74 20 73 5f 78 31 6e 6f 64 65 20 2a 6e 65 78 74  t s_x1node *next
193e0 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ;   /* Next entr
193f0 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
19400 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74  hash */.  struct
19410 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 66 72 6f 6d   s_x1node **from
19420 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c  ;  /* Previous l
19430 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e 6f 64 65 3b  ink */.} x1node;
19440 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
19450 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  ly one instance 
19460 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68  of the array, wh
19470 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f  ich is the follo
19480 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73  wing */.static s
19490 74 72 75 63 74 20 73 5f 78 31 20 2a 78 31 61 3b  truct s_x1 *x1a;
194a0 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
194b0 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20  new associative 
194c0 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74  array */.void St
194d0 72 73 61 66 65 5f 69 6e 69 74 28 29 7b 0a 20 20  rsafe_init(){.  
194e0 69 66 28 20 78 31 61 20 29 20 72 65 74 75 72 6e  if( x1a ) return
194f0 3b 0a 20 20 78 31 61 20 3d 20 28 73 74 72 75 63  ;.  x1a = (struc
19500 74 20 73 5f 78 31 2a 29 6d 61 6c 6c 6f 63 28 20  t s_x1*)malloc( 
19510 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f  sizeof(struct s_
19520 78 31 29 20 29 3b 0a 20 20 69 66 28 20 78 31 61  x1) );.  if( x1a
19530 20 29 7b 0a 20 20 20 20 78 31 61 2d 3e 73 69 7a   ){.    x1a->siz
19540 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 78 31  e = 1024;.    x1
19550 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  a->count = 0;.  
19560 20 20 78 31 61 2d 3e 74 62 6c 20 3d 20 28 78 31    x1a->tbl = (x1
19570 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20  node*)malloc( . 
19580 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 31 6e       (sizeof(x1n
19590 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 31  ode) + sizeof(x1
195a0 6e 6f 64 65 2a 29 29 2a 31 30 32 34 20 29 3b 0a  node*))*1024 );.
195b0 20 20 20 20 69 66 28 20 78 31 61 2d 3e 74 62 6c      if( x1a->tbl
195c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65  ==0 ){.      fre
195d0 65 28 78 31 61 29 3b 0a 20 20 20 20 20 20 78 31  e(x1a);.      x1
195e0 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
195f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
19600 20 20 20 20 20 78 31 61 2d 3e 68 74 20 3d 20 28       x1a->ht = (
19610 78 31 6e 6f 64 65 2a 2a 29 26 28 78 31 61 2d 3e  x1node**)&(x1a->
19620 74 62 6c 5b 31 30 32 34 5d 29 3b 0a 20 20 20 20  tbl[1024]);.    
19630 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 30 32    for(i=0; i<102
19640 34 3b 20 69 2b 2b 29 20 78 31 61 2d 3e 68 74 5b  4; i++) x1a->ht[
19650 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
19660 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20  }.}./* Insert a 
19670 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
19680 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75  the array.  Retu
19690 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65  rn TRUE if succe
196a0 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20  ssful..** Prior 
196b0 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61  data with the sa
196c0 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76  me key is NOT ov
196d0 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74  erwritten */.int
196e0 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28   Strsafe_insert(
196f0 64 61 74 61 29 0a 63 68 61 72 20 2a 64 61 74 61  data).char *data
19700 3b 0a 7b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70  ;.{.  x1node *np
19710 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74  ;.  int h;.  int
19720 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d   ph;..  if( x1a=
19730 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
19740 20 70 68 20 3d 20 73 74 72 68 61 73 68 28 64 61   ph = strhash(da
19750 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20  ta);.  h = ph & 
19760 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x1a->size-1);. 
19770 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d   np = x1a->ht[h]
19780 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
19790 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
197a0 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d  np->data,data)==
197b0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  0 ){.      /* An
197c0 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
197d0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
197e0 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20  y is found. */. 
197f0 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63       /* Fail bec
19800 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69  ause overwrite i
19810 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f  s not allows. */
19820 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
19830 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20  .    }.    np = 
19840 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
19850 69 66 28 20 78 31 61 2d 3e 63 6f 75 6e 74 3e 3d  if( x1a->count>=
19860 78 31 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20  x1a->size ){.   
19870 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
19880 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
19890 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e  bigger */.    in
198a0 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74  t i,size;.    st
198b0 72 75 63 74 20 73 5f 78 31 20 61 72 72 61 79 3b  ruct s_x1 array;
198c0 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20  .    array.size 
198d0 3d 20 73 69 7a 65 20 3d 20 78 31 61 2d 3e 73 69  = size = x1a->si
198e0 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e  ze*2;.    array.
198f0 63 6f 75 6e 74 20 3d 20 78 31 61 2d 3e 63 6f 75  count = x1a->cou
19900 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62  nt;.    array.tb
19910 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d 61 6c  l = (x1node*)mal
19920 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65  loc(.      (size
19930 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x1node) + siz
19940 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 2a 73 69  eof(x1node*))*si
19950 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72  ze );.    if( ar
19960 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74  ray.tbl==0 ) ret
19970 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20  urn 0;  /* Fail 
19980 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61  due to malloc fa
19990 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72  ilure */.    arr
199a0 61 79 2e 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a  ay.ht = (x1node*
199b0 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69  *)&(array.tbl[si
199c0 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ze]);.    for(i=
199d0 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20  0; i<size; i++) 
199e0 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b  array.ht[i] = 0;
199f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
19a00 78 31 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x1a->count; i++)
19a10 7b 0a 20 20 20 20 20 20 78 31 6e 6f 64 65 20 2a  {.      x1node *
19a20 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20  oldnp, *newnp;. 
19a30 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78       oldnp = &(x
19a40 31 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  1a->tbl[i]);.   
19a50 20 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f     h = strhash(o
19a60 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 73  ldnp->data) & (s
19a70 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65  ize-1);.      ne
19a80 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62  wnp = &(array.tb
19a90 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  l[i]);.      if(
19aa0 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61   array.ht[h] ) a
19ab0 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  rray.ht[h]->from
19ac0 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74   = &(newnp->next
19ad0 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  );.      newnp->
19ae0 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b  next = array.ht[
19af0 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  h];.      newnp-
19b00 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64  >data = oldnp->d
19b10 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  ata;.      newnp
19b20 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79  ->from = &(array
19b30 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61  .ht[h]);.      a
19b40 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77  rray.ht[h] = new
19b50 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  np;.    }.    fr
19b60 65 65 28 78 31 61 2d 3e 74 62 6c 29 3b 0a 20 20  ee(x1a->tbl);.  
19b70 20 20 2a 78 31 61 20 3d 20 61 72 72 61 79 3b 0a    *x1a = array;.
19b80 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20    }.  /* Insert 
19b90 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a  the new data */.
19ba0 20 20 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d    h = ph & (x1a-
19bb0 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
19bc0 20 26 28 78 31 61 2d 3e 74 62 6c 5b 78 31 61 2d   &(x1a->tbl[x1a-
19bd0 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70  >count++]);.  np
19be0 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20  ->data = data;. 
19bf0 20 69 66 28 20 78 31 61 2d 3e 68 74 5b 68 5d 20   if( x1a->ht[h] 
19c00 29 20 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72  ) x1a->ht[h]->fr
19c10 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29  om = &(np->next)
19c20 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78  ;.  np->next = x
19c30 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 31 61  1a->ht[h];.  x1a
19c40 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20  ->ht[h] = np;.  
19c50 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 31 61  np->from = &(x1a
19c60 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75  ->ht[h]);.  retu
19c70 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  rn 1;.}../* Retu
19c80 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
19c90 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f  data assigned to
19ca0 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20   the given key. 
19cb0 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20   Return NULL.** 
19cc0 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20  if no such key. 
19cd0 2a 2f 0a 63 68 61 72 20 2a 53 74 72 73 61 66 65  */.char *Strsafe
19ce0 5f 66 69 6e 64 28 6b 65 79 29 0a 63 68 61 72 20  _find(key).char 
19cf0 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b  *key;.{.  int h;
19d00 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 0a  .  x1node *np;..
19d10 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29 20 72    if( x1a==0 ) r
19d20 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73  eturn 0;.  h = s
19d30 74 72 68 61 73 68 28 6b 65 79 29 20 26 20 28 78  trhash(key) & (x
19d40 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  1a->size-1);.  n
19d50 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x1a->ht[h];.
19d60 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
19d70 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70     if( strcmp(np
19d80 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30 20 29  ->data,key)==0 )
19d90 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
19da0 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
19db0 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
19dc0 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
19dd0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
19de0 72 20 74 6f 20 74 68 65 20 28 74 65 72 6d 69 6e  r to the (termin
19df0 61 6c 20 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61  al or nontermina
19e00 6c 29 20 73 79 6d 62 6f 6c 20 22 78 22 2e 0a 2a  l) symbol "x"..*
19e10 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 73  * Create a new s
19e20 79 6d 62 6f 6c 20 69 66 20 74 68 69 73 20 69 73  ymbol if this is
19e30 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
19e40 22 78 22 20 68 61 73 20 62 65 65 6e 20 73 65 65  "x" has been see
19e50 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d  n..*/.struct sym
19e60 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28  bol *Symbol_new(
19e70 78 29 0a 63 68 61 72 20 2a 78 3b 0a 7b 0a 20 20  x).char *x;.{.  
19e80 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
19e90 70 3b 0a 0a 20 20 73 70 20 3d 20 53 79 6d 62 6f  p;..  sp = Symbo
19ea0 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20 69 66 28  l_find(x);.  if(
19eb0 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 70   sp==0 ){.    sp
19ec0 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f   = (struct symbo
19ed0 6c 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  l *)malloc( size
19ee0 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
19ef0 29 20 29 3b 0a 20 20 20 20 4d 65 6d 6f 72 79 43  ) );.    MemoryC
19f00 68 65 63 6b 28 73 70 29 3b 0a 20 20 20 20 73 70  heck(sp);.    sp
19f10 2d 3e 6e 61 6d 65 20 3d 20 53 74 72 73 61 66 65  ->name = Strsafe
19f20 28 78 29 3b 0a 20 20 20 20 73 70 2d 3e 74 79 70  (x);.    sp->typ
19f30 65 20 3d 20 69 73 75 70 70 65 72 28 2a 78 29 20  e = isupper(*x) 
19f40 3f 20 54 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e  ? TERMINAL : NON
19f50 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 73 70  TERMINAL;.    sp
19f60 2d 3e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20  ->rule = 0;.    
19f70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30  sp->fallback = 0
19f80 3b 0a 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d  ;.    sp->prec =
19f90 20 2d 31 3b 0a 20 20 20 20 73 70 2d 3e 61 73 73   -1;.    sp->ass
19fa0 6f 63 20 3d 20 55 4e 4b 3b 0a 20 20 20 20 73 70  oc = UNK;.    sp
19fb0 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 30 3b 0a  ->firstset = 0;.
19fc0 20 20 20 20 73 70 2d 3e 6c 61 6d 62 64 61 20 3d      sp->lambda =
19fd0 20 42 5f 46 41 4c 53 45 3b 0a 20 20 20 20 73 70   B_FALSE;.    sp
19fe0 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 3d 20 30  ->destructor = 0
19ff0 3b 0a 20 20 20 20 73 70 2d 3e 64 61 74 61 74 79  ;.    sp->dataty
1a000 70 65 20 3d 20 30 3b 0a 20 20 20 20 53 79 6d 62  pe = 0;.    Symb
1a010 6f 6c 5f 69 6e 73 65 72 74 28 73 70 2c 73 70 2d  ol_insert(sp,sp-
1a020 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65  >name);.  }.  re
1a030 74 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a 20 43  turn sp;.}../* C
1a040 6f 6d 70 61 72 65 20 74 77 6f 20 73 79 6d 62 6f  ompare two symbo
1a050 6c 73 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c  ls */.int Symbol
1a060 63 6d 70 70 28 61 2c 62 29 0a 73 74 72 75 63 74  cmpp(a,b).struct
1a070 20 73 79 6d 62 6f 6c 20 2a 2a 61 3b 0a 73 74 72   symbol **a;.str
1a080 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 62 3b 0a  uct symbol **b;.
1a090 7b 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63 6d  {.  return strcm
1a0a0 70 28 28 2a 2a 61 29 2e 6e 61 6d 65 2c 28 2a 2a  p((**a).name,(**
1a0b0 62 29 2e 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 20  b).name);.}../* 
1a0c0 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
1a0d0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1a0e0 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1a0f0 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73   for each.** ass
1a100 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
1a110 66 20 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a  f type "x2"..*/.
1a120 73 74 72 75 63 74 20 73 5f 78 32 20 7b 0a 20 20  struct s_x2 {.  
1a130 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
1a140 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1a150 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
1a160 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20  le slots. */.   
1a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a180 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74         /*   Must
1a190 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
1a1a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1a1b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a1d0 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f     equal to 1 */
1a1e0 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20  .  int count;   
1a1f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1a200 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c  mber of currentl
1a210 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a  y slots filled *
1a220 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e  /.  struct s_x2n
1a230 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68  ode *tbl;  /* Th
1a240 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65  e data stored he
1a250 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  re */.  struct s
1a260 5f 78 32 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f  _x2node **ht;  /
1a270 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
1a280 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a   lookups */.};..
1a290 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
1a2a0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
1a2b0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
1a2c0 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e  very data elemen
1a2d0 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63  t.** in an assoc
1a2e0 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
1a2f0 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 74 79  type "x2"..*/.ty
1a300 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78  pedef struct s_x
1a310 32 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74  2node {.  struct
1a320 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 20 20   symbol *data;  
1a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a340 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
1a350 20 63 68 61 72 20 2a 6b 65 79 3b 20 20 20 20 20   char *key;     
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a370 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74   The key */.  st
1a380 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 6e  ruct s_x2node *n
1a390 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65  ext;   /* Next e
1a3a0 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
1a3b0 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72  me hash */.  str
1a3c0 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 66  uct s_x2node **f
1a3d0 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75  rom;  /* Previou
1a3e0 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 32 6e 6f  s link */.} x2no
1a3f0 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  de;../* There is
1a400 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e   only one instan
1a410 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c  ce of the array,
1a420 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f   which is the fo
1a430 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69  llowing */.stati
1a440 63 20 73 74 72 75 63 74 20 73 5f 78 32 20 2a 78  c struct s_x2 *x
1a450 32 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  2a;../* Allocate
1a460 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69   a new associati
1a470 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64  ve array */.void
1a480 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 7b 0a   Symbol_init(){.
1a490 20 20 69 66 28 20 78 32 61 20 29 20 72 65 74 75    if( x2a ) retu
1a4a0 72 6e 3b 0a 20 20 78 32 61 20 3d 20 28 73 74 72  rn;.  x2a = (str
1a4b0 75 63 74 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63  uct s_x2*)malloc
1a4c0 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
1a4d0 73 5f 78 32 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x2) );.  if( x
1a4e0 32 61 20 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73  2a ){.    x2a->s
1a4f0 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78  ize = 128;.    x
1a500 32 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20  2a->count = 0;. 
1a510 20 20 20 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78     x2a->tbl = (x
1a520 32 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a  2node*)malloc( .
1a530 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 32        (sizeof(x2
1a540 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
1a550 32 6e 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a  2node*))*128 );.
1a560 20 20 20 20 69 66 28 20 78 32 61 2d 3e 74 62 6c      if( x2a->tbl
1a570 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65  ==0 ){.      fre
1a580 65 28 78 32 61 29 3b 0a 20 20 20 20 20 20 78 32  e(x2a);.      x2
1a590 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
1a5a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1a5b0 20 20 20 20 20 78 32 61 2d 3e 68 74 20 3d 20 28       x2a->ht = (
1a5c0 78 32 6e 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e  x2node**)&(x2a->
1a5d0 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20  tbl[128]);.     
1a5e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b   for(i=0; i<128;
1a5f0 20 69 2b 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d   i++) x2a->ht[i]
1a600 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1a610 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  }./* Insert a ne
1a620 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
1a630 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  e array.  Return
1a640 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73   TRUE if success
1a650 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61  ful..** Prior da
1a660 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ta with the same
1a670 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72   key is NOT over
1a680 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53  written */.int S
1a690 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 64 61 74  ymbol_insert(dat
1a6a0 61 2c 6b 65 79 29 0a 73 74 72 75 63 74 20 73 79  a,key).struct sy
1a6b0 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 63 68 61 72  mbol *data;.char
1a6c0 20 2a 6b 65 79 3b 0a 7b 0a 20 20 78 32 6e 6f 64   *key;.{.  x2nod
1a6d0 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a  e *np;.  int h;.
1a6e0 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28    int ph;..  if(
1a6f0 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x2a==0 ) return
1a700 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61   0;.  ph = strha
1a710 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70  sh(key);.  h = p
1a720 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31  h & (x2a->size-1
1a730 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68  );.  np = x2a->h
1a740 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
1a750 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  p ){.    if( str
1a760 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29  cmp(np->key,key)
1a770 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
1a780 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  An existing entr
1a790 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
1a7a0 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f  key is found. */
1a7b0 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62  .      /* Fail b
1a7c0 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65  ecause overwrite
1a7d0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20   is not allows. 
1a7e0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1a7f0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20  0;.    }.    np 
1a800 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
1a810 20 20 69 66 28 20 78 32 61 2d 3e 63 6f 75 6e 74    if( x2a->count
1a820 3e 3d 78 32 61 2d 3e 73 69 7a 65 20 29 7b 0a 20  >=x2a->size ){. 
1a830 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61     /* Need to ma
1a840 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  ke the hash tabl
1a850 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20  e bigger */.    
1a860 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20  int i,size;.    
1a870 73 74 72 75 63 74 20 73 5f 78 32 20 61 72 72 61  struct s_x2 arra
1a880 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a  y;.    array.siz
1a890 65 20 3d 20 73 69 7a 65 20 3d 20 78 32 61 2d 3e  e = size = x2a->
1a8a0 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61  size*2;.    arra
1a8b0 79 2e 63 6f 75 6e 74 20 3d 20 78 32 61 2d 3e 63  y.count = x2a->c
1a8c0 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e  ount;.    array.
1a8d0 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 6d  tbl = (x2node*)m
1a8e0 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69  alloc(.      (si
1a8f0 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73  zeof(x2node) + s
1a900 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 2a  izeof(x2node*))*
1a910 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  size );.    if( 
1a920 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72  array.tbl==0 ) r
1a930 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69  eturn 0;  /* Fai
1a940 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20  l due to malloc 
1a950 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61  failure */.    a
1a960 72 72 61 79 2e 68 74 20 3d 20 28 78 32 6e 6f 64  rray.ht = (x2nod
1a970 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b  e**)&(array.tbl[
1a980 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28  size]);.    for(
1a990 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
1a9a0 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20  ) array.ht[i] = 
1a9b0 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
1a9c0 69 3c 78 32 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b  i<x2a->count; i+
1a9d0 2b 29 7b 0a 20 20 20 20 20 20 78 32 6e 6f 64 65  +){.      x2node
1a9e0 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b   *oldnp, *newnp;
1a9f0 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26  .      oldnp = &
1aa00 28 78 32 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20  (x2a->tbl[i]);. 
1aa10 20 20 20 20 20 68 20 3d 20 73 74 72 68 61 73 68       h = strhash
1aa20 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28  (oldnp->key) & (
1aa30 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e  size-1);.      n
1aa40 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74  ewnp = &(array.t
1aa50 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  bl[i]);.      if
1aa60 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20  ( array.ht[h] ) 
1aa70 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f  array.ht[h]->fro
1aa80 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78  m = &(newnp->nex
1aa90 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  t);.      newnp-
1aaa0 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74  >next = array.ht
1aab0 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  [h];.      newnp
1aac0 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b  ->key = oldnp->k
1aad0 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  ey;.      newnp-
1aae0 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64  >data = oldnp->d
1aaf0 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  ata;.      newnp
1ab00 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79  ->from = &(array
1ab10 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61  .ht[h]);.      a
1ab20 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77  rray.ht[h] = new
1ab30 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  np;.    }.    fr
1ab40 65 65 28 78 32 61 2d 3e 74 62 6c 29 3b 0a 20 20  ee(x2a->tbl);.  
1ab50 20 20 2a 78 32 61 20 3d 20 61 72 72 61 79 3b 0a    *x2a = array;.
1ab60 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20    }.  /* Insert 
1ab70 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a  the new data */.
1ab80 20 20 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d    h = ph & (x2a-
1ab90 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
1aba0 20 26 28 78 32 61 2d 3e 74 62 6c 5b 78 32 61 2d   &(x2a->tbl[x2a-
1abb0 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70  >count++]);.  np
1abc0 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e  ->key = key;.  n
1abd0 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a  p->data = data;.
1abe0 20 20 69 66 28 20 78 32 61 2d 3e 68 74 5b 68 5d    if( x2a->ht[h]
1abf0 20 29 20 78 32 61 2d 3e 68 74 5b 68 5d 2d 3e 66   ) x2a->ht[h]->f
1ac00 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74  rom = &(np->next
1ac10 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20  );.  np->next = 
1ac20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 32  x2a->ht[h];.  x2
1ac30 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20  a->ht[h] = np;. 
1ac40 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 32   np->from = &(x2
1ac50 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74  a->ht[h]);.  ret
1ac60 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  urn 1;.}../* Ret
1ac70 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1ac80 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74   data assigned t
1ac90 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e  o the given key.
1aca0 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a    Return NULL.**
1acb0 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e   if no such key.
1acc0 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f   */.struct symbo
1acd0 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6b  l *Symbol_find(k
1ace0 65 79 29 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b  ey).char *key;.{
1acf0 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 32 6e 6f  .  int h;.  x2no
1ad00 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78  de *np;..  if( x
1ad10 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  2a==0 ) return 0
1ad20 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68 28  ;.  h = strhash(
1ad30 6b 65 79 29 20 26 20 28 78 32 61 2d 3e 73 69 7a  key) & (x2a->siz
1ad40 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61  e-1);.  np = x2a
1ad50 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
1ad60 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
1ad70 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b  strcmp(np->key,k
1ad80 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ey)==0 ) break;.
1ad90 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
1ada0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
1adb0 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20  np ? np->data : 
1adc0 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  0;.}../* Return 
1add0 74 68 65 20 6e 2d 74 68 20 64 61 74 61 2e 20 20  the n-th data.  
1ade0 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
1adf0 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
1ae00 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62  . */.struct symb
1ae10 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 6e  ol *Symbol_Nth(n
1ae20 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 73 74 72  ).int n;.{.  str
1ae30 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61  uct symbol *data
1ae40 3b 0a 20 20 69 66 28 20 78 32 61 20 26 26 20 6e  ;.  if( x2a && n
1ae50 3e 30 20 26 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f  >0 && n<=x2a->co
1ae60 75 6e 74 20 29 7b 0a 20 20 20 20 64 61 74 61 20  unt ){.    data 
1ae70 3d 20 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e  = x2a->tbl[n-1].
1ae80 64 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  data;.  }else{. 
1ae90 20 20 20 64 61 74 61 20 3d 20 30 3b 0a 20 20 7d     data = 0;.  }
1aea0 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61 3b 0a  .  return data;.
1aeb0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  }../* Return the
1aec0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
1aed0 61 79 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c  ay */.int Symbol
1aee0 5f 63 6f 75 6e 74 28 29 0a 7b 0a 20 20 72 65 74  _count().{.  ret
1aef0 75 72 6e 20 78 32 61 20 3f 20 78 32 61 2d 3e 63  urn x2a ? x2a->c
1af00 6f 75 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  ount : 0;.}../* 
1af10 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20  Return an array 
1af20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  of pointers to a
1af30 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  ll data in the t
1af40 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72  able..** The arr
1af50 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ay is obtained f
1af60 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74  rom malloc.  Ret
1af70 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f  urn NULL if memo
1af80 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
1af90 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66   problems, or if
1afa0 20 74 68 65 20 61 72 72 61 79 20 69 73 20 65 6d   the array is em
1afb0 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  pty. */.struct s
1afc0 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61  ymbol **Symbol_a
1afd0 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72  rrayof().{.  str
1afe0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 72 72  uct symbol **arr
1aff0 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65  ay;.  int i,size
1b000 3b 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29  ;.  if( x2a==0 )
1b010 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a   return 0;.  siz
1b020 65 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a  e = x2a->count;.
1b030 20 20 61 72 72 61 79 20 3d 20 28 73 74 72 75 63    array = (struc
1b040 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 6d 61 6c 6c  t symbol **)mall
1b050 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
1b060 74 20 73 79 6d 62 6f 6c 20 2a 29 2a 73 69 7a 65  t symbol *)*size
1b070 20 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20   );.  if( array 
1b080 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
1b090 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  i<size; i++) arr
1b0a0 61 79 5b 69 5d 20 3d 20 78 32 61 2d 3e 74 62 6c  ay[i] = x2a->tbl
1b0b0 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20  [i].data;.  }.  
1b0c0 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a  return array;.}.
1b0d0 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
1b0e0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a  configurations *
1b0f0 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28  /.int Configcmp(
1b100 61 2c 62 29 0a 73 74 72 75 63 74 20 63 6f 6e 66  a,b).struct conf
1b110 69 67 20 2a 61 3b 0a 73 74 72 75 63 74 20 63 6f  ig *a;.struct co
1b120 6e 66 69 67 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74  nfig *b;.{.  int
1b130 20 78 3b 0a 20 20 78 20 3d 20 61 2d 3e 72 70 2d   x;.  x = a->rp-
1b140 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e  >index - b->rp->
1b150 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 78 3d 3d  index;.  if( x==
1b160 30 20 29 20 78 20 3d 20 61 2d 3e 64 6f 74 20 2d  0 ) x = a->dot -
1b170 20 62 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72   b->dot;.  retur
1b180 6e 20 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61  n x;.}../* Compa
1b190 72 65 20 74 77 6f 20 73 74 61 74 65 73 20 2a 2f  re two states */
1b1a0 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 61  .PRIVATE int sta
1b1b0 74 65 63 6d 70 28 61 2c 62 29 0a 73 74 72 75 63  tecmp(a,b).struc
1b1c0 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 73 74 72  t config *a;.str
1b1d0 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 3b 0a 7b  uct config *b;.{
1b1e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 66 6f 72  .  int rc;.  for
1b1f0 28 72 63 3d 30 3b 20 72 63 3d 3d 30 20 26 26 20  (rc=0; rc==0 && 
1b200 61 20 26 26 20 62 3b 20 20 61 3d 61 2d 3e 62 70  a && b;  a=a->bp
1b210 2c 20 62 3d 62 2d 3e 62 70 29 7b 0a 20 20 20 20  , b=b->bp){.    
1b220 72 63 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65  rc = a->rp->inde
1b230 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78  x - b->rp->index
1b240 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20  ;.    if( rc==0 
1b250 29 20 72 63 20 3d 20 61 2d 3e 64 6f 74 20 2d 20  ) rc = a->dot - 
1b260 62 2d 3e 64 6f 74 3b 0a 20 20 7d 0a 20 20 69 66  b->dot;.  }.  if
1b270 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ( rc==0 ){.    i
1b280 66 28 20 61 20 29 20 72 63 20 3d 20 31 3b 0a 20  f( a ) rc = 1;. 
1b290 20 20 20 69 66 28 20 62 20 29 20 72 63 20 3d 20     if( b ) rc = 
1b2a0 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  -1;.  }.  return
1b2b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20   rc;.}../* Hash 
1b2c0 61 20 73 74 61 74 65 20 2a 2f 0a 50 52 49 56 41  a state */.PRIVA
1b2d0 54 45 20 69 6e 74 20 73 74 61 74 65 68 61 73 68  TE int statehash
1b2e0 28 61 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  (a).struct confi
1b2f0 67 20 2a 61 3b 0a 7b 0a 20 20 69 6e 74 20 68 3d  g *a;.{.  int h=
1b300 30 3b 0a 20 20 77 68 69 6c 65 28 20 61 20 29 7b  0;.  while( a ){
1b310 0a 20 20 20 20 68 20 3d 20 68 2a 35 37 31 20 2b  .    h = h*571 +
1b320 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37   a->rp->index*37
1b330 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 20 20 61   + a->dot;.    a
1b340 20 3d 20 61 2d 3e 62 70 3b 0a 20 20 7d 0a 20 20   = a->bp;.  }.  
1b350 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20  return h;.}../* 
1b360 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73  Allocate a new s
1b370 74 61 74 65 20 73 74 72 75 63 74 75 72 65 20 2a  tate structure *
1b380 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  /.struct state *
1b390 53 74 61 74 65 5f 6e 65 77 28 29 0a 7b 0a 20 20  State_new().{.  
1b3a0 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65  struct state *ne
1b3b0 77 3b 0a 20 20 6e 65 77 20 3d 20 28 73 74 72 75  w;.  new = (stru
1b3c0 63 74 20 73 74 61 74 65 20 2a 29 6d 61 6c 6c 6f  ct state *)mallo
1b3d0 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  c( sizeof(struct
1b3e0 20 73 74 61 74 65 29 20 29 3b 0a 20 20 4d 65 6d   state) );.  Mem
1b3f0 6f 72 79 43 68 65 63 6b 28 6e 65 77 29 3b 0a 20  oryCheck(new);. 
1b400 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a   return new;.}..
1b410 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
1b420 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1b430 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1b440 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  ure for each.** 
1b450 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
1b460 79 20 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a  y of type "x3"..
1b470 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 33 20 7b  */.struct s_x3 {
1b480 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
1b490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b4a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
1b4b0 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a  lable slots. */.
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d            /*   M
1b4e0 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
1b4f0 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e  f 2 greater than
1b500 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   or */.         
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b520 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31   /*   equal to 1
1b530 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b   */.  int count;
1b540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b550 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65   Number of curre
1b560 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65  ntly slots fille
1b570 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  d */.  struct s_
1b580 78 33 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a  x3node *tbl;  /*
1b590 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64   The data stored
1b5a0 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63   here */.  struc
1b5b0 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 68 74 3b  t s_x3node **ht;
1b5c0 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
1b5d0 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d  for lookups */.}
1b5e0 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
1b5f0 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
1b600 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f  his structure fo
1b610 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65  r every data ele
1b620 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73  ment.** in an as
1b630 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
1b640 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f  of type "x3"..*/
1b650 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1b660 73 5f 78 33 6e 6f 64 65 20 7b 0a 20 20 73 74 72  s_x3node {.  str
1b670 75 63 74 20 73 74 61 74 65 20 2a 64 61 74 61 3b  uct state *data;
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b690 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
1b6a0 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
1b6b0 20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20   *key;          
1b6c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b6d0 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  key */.  struct 
1b6e0 73 5f 78 33 6e 6f 64 65 20 2a 6e 65 78 74 3b 20  s_x3node *next; 
1b6f0 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
1b700 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
1b710 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  sh */.  struct s
1b720 5f 78 33 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20  _x3node **from; 
1b730 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e   /* Previous lin
1b740 6b 20 2a 2f 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a  k */.} x3node;..
1b750 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  /* There is only
1b760 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
1b770 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63   the array, whic
1b780 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h is the followi
1b790 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ng */.static str
1b7a0 75 63 74 20 73 5f 78 33 20 2a 78 33 61 3b 0a 0a  uct s_x3 *x3a;..
1b7b0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
1b7c0 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  w associative ar
1b7d0 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74 61 74  ray */.void Stat
1b7e0 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20  e_init(){.  if( 
1b7f0 78 33 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  x3a ) return;.  
1b800 78 33 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f  x3a = (struct s_
1b810 78 33 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  x3*)malloc( size
1b820 6f 66 28 73 74 72 75 63 74 20 73 5f 78 33 29 20  of(struct s_x3) 
1b830 29 3b 0a 20 20 69 66 28 20 78 33 61 20 29 7b 0a  );.  if( x3a ){.
1b840 20 20 20 20 78 33 61 2d 3e 73 69 7a 65 20 3d 20      x3a->size = 
1b850 31 32 38 3b 0a 20 20 20 20 78 33 61 2d 3e 63 6f  128;.    x3a->co
1b860 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 33 61  unt = 0;.    x3a
1b870 2d 3e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a  ->tbl = (x3node*
1b880 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20  )malloc( .      
1b890 28 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20  (sizeof(x3node) 
1b8a0 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a  + sizeof(x3node*
1b8b0 29 29 2a 31 32 38 20 29 3b 0a 20 20 20 20 69 66  ))*128 );.    if
1b8c0 28 20 78 33 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b  ( x3a->tbl==0 ){
1b8d0 0a 20 20 20 20 20 20 66 72 65 65 28 78 33 61 29  .      free(x3a)
1b8e0 3b 0a 20 20 20 20 20 20 78 33 61 20 3d 20 30 3b  ;.      x3a = 0;
1b8f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b900 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78    int i;.      x
1b910 33 61 2d 3e 68 74 20 3d 20 28 78 33 6e 6f 64 65  3a->ht = (x3node
1b920 2a 2a 29 26 28 78 33 61 2d 3e 74 62 6c 5b 31 32  **)&(x3a->tbl[12
1b930 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  8]);.      for(i
1b940 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20  =0; i<128; i++) 
1b950 78 33 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a  x3a->ht[i] = 0;.
1b960 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49      }.  }.}./* I
1b970 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
1b980 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61  rd into the arra
1b990 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  y.  Return TRUE 
1b9a0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
1b9b0 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74  * Prior data wit
1b9c0 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
1b9d0 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65  s NOT overwritte
1b9e0 6e 20 2a 2f 0a 69 6e 74 20 53 74 61 74 65 5f 69  n */.int State_i
1b9f0 6e 73 65 72 74 28 64 61 74 61 2c 6b 65 79 29 0a  nsert(data,key).
1ba00 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 64 61  struct state *da
1ba10 74 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  ta;.struct confi
1ba20 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 78 33 6e 6f  g *key;.{.  x3no
1ba30 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b  de *np;.  int h;
1ba40 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66  .  int ph;..  if
1ba50 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x3a==0 ) retur
1ba60 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 61 74  n 0;.  ph = stat
1ba70 65 68 61 73 68 28 6b 65 79 29 3b 0a 20 20 68 20  ehash(key);.  h 
1ba80 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73 69 7a  = ph & (x3a->siz
1ba90 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61  e-1);.  np = x3a
1baa0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
1bab0 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
1bac0 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79  statecmp(np->key
1bad0 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ,key)==0 ){.    
1bae0 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
1baf0 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
1bb00 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e  same key is foun
1bb10 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46  d. */.      /* F
1bb20 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72  ail because over
1bb30 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c  write is not all
1bb40 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ows. */.      re
1bb50 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1bb60 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
1bb70 0a 20 20 7d 0a 20 20 69 66 28 20 78 33 61 2d 3e  .  }.  if( x3a->
1bb80 63 6f 75 6e 74 3e 3d 78 33 61 2d 3e 73 69 7a 65  count>=x3a->size
1bb90 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20   ){.    /* Need 
1bba0 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68  to make the hash
1bbb0 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f   table bigger */
1bbc0 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b  .    int i,size;
1bbd0 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 33  .    struct s_x3
1bbe0 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61   array;.    arra
1bbf0 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20  y.size = size = 
1bc00 78 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20  x3a->size*2;.   
1bc10 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78   array.count = x
1bc20 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61  3a->count;.    a
1bc30 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 33 6e 6f  rray.tbl = (x3no
1bc40 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20  de*)malloc(.    
1bc50 20 20 28 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65    (sizeof(x3node
1bc60 29 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64  ) + sizeof(x3nod
1bc70 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20  e*))*size );.   
1bc80 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d   if( array.tbl==
1bc90 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  0 ) return 0;  /
1bca0 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61  * Fail due to ma
1bcb0 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a  lloc failure */.
1bcc0 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28      array.ht = (
1bcd0 78 33 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79  x3node**)&(array
1bce0 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20  .tbl[size]);.   
1bcf0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
1bd00 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b  ; i++) array.ht[
1bd10 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  i] = 0;.    for(
1bd20 69 3d 30 3b 20 69 3c 78 33 61 2d 3e 63 6f 75 6e  i=0; i<x3a->coun
1bd30 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78  t; i++){.      x
1bd40 33 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e  3node *oldnp, *n
1bd50 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e  ewnp;.      oldn
1bd60 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 69  p = &(x3a->tbl[i
1bd70 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74  ]);.      h = st
1bd80 61 74 65 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b  atehash(oldnp->k
1bd90 65 79 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a  ey) & (size-1);.
1bda0 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28        newnp = &(
1bdb0 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20  array.tbl[i]);. 
1bdc0 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68       if( array.h
1bdd0 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b  t[h] ) array.ht[
1bde0 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77  h]->from = &(new
1bdf0 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20  np->next);.     
1be00 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61   newnp->next = a
1be10 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20  rray.ht[h];.    
1be20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f    newnp->key = o
1be30 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20  ldnp->key;.     
1be40 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f   newnp->data = o
1be50 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20  ldnp->data;.    
1be60 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20    newnp->from = 
1be70 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a  &(array.ht[h]);.
1be80 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68        array.ht[h
1be90 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d  ] = newnp;.    }
1bea0 0a 20 20 20 20 66 72 65 65 28 78 33 61 2d 3e 74  .    free(x3a->t
1beb0 62 6c 29 3b 0a 20 20 20 20 2a 78 33 61 20 3d 20  bl);.    *x3a = 
1bec0 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20  array;.  }.  /* 
1bed0 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64  Insert the new d
1bee0 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20  ata */.  h = ph 
1bef0 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x3a->size-1);
1bf00 0a 20 20 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74  .  np = &(x3a->t
1bf10 62 6c 5b 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b 5d  bl[x3a->count++]
1bf20 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b  );.  np->key = k
1bf30 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d  ey;.  np->data =
1bf40 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 33 61   data;.  if( x3a
1bf50 2d 3e 68 74 5b 68 5d 20 29 20 78 33 61 2d 3e 68  ->ht[h] ) x3a->h
1bf60 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
1bf70 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e  p->next);.  np->
1bf80 6e 65 78 74 20 3d 20 78 33 61 2d 3e 68 74 5b 68  next = x3a->ht[h
1bf90 5d 3b 0a 20 20 78 33 61 2d 3e 68 74 5b 68 5d 20  ];.  x3a->ht[h] 
1bfa0 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d  = np;.  np->from
1bfb0 20 3d 20 26 28 78 33 61 2d 3e 68 74 5b 68 5d 29   = &(x3a->ht[h])
1bfc0 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
1bfd0 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
1bfe0 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73  nter to data ass
1bff0 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76  igned to the giv
1c000 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20  en key.  Return 
1c010 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75  NULL.** if no su
1c020 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63  ch key. */.struc
1c030 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66  t state *State_f
1c040 69 6e 64 28 6b 65 79 29 0a 73 74 72 75 63 74 20  ind(key).struct 
1c050 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20  config *key;.{. 
1c060 20 69 6e 74 20 68 3b 0a 20 20 78 33 6e 6f 64 65   int h;.  x3node
1c070 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 33 61   *np;..  if( x3a
1c080 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1c090 20 20 68 20 3d 20 73 74 61 74 65 68 61 73 68 28    h = statehash(
1c0a0 6b 65 79 29 20 26 20 28 78 33 61 2d 3e 73 69 7a  key) & (x3a->siz
1c0b0 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61  e-1);.  np = x3a
1c0c0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
1c0d0 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
1c0e0 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79  statecmp(np->key
1c0f0 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,key)==0 ) break
1c100 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  ;.    np = np->n
1c110 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
1c120 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20  n np ? np->data 
1c130 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  : 0;.}../* Retur
1c140 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f  n an array of po
1c150 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61  inters to all da
1c160 74 61 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ta in the table.
1c170 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69 73  .** The array is
1c180 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
1c190 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e  alloc.  Return N
1c1a0 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c  ULL if memory al
1c1b0 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62  location.** prob
1c1c0 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20  lems, or if the 
1c1d0 61 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20  array is empty. 
1c1e0 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  */.struct state 
1c1f0 2a 2a 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28  **State_arrayof(
1c200 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  ).{.  struct sta
1c210 74 65 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e  te **array;.  in
1c220 74 20 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20  t i,size;.  if( 
1c230 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x3a==0 ) return 
1c240 30 3b 0a 20 20 73 69 7a 65 20 3d 20 78 33 61 2d  0;.  size = x3a-
1c250 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20  >count;.  array 
1c260 3d 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20  = (struct state 
1c270 2a 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  **)malloc( sizeo
1c280 66 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  f(struct state *
1c290 29 2a 73 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  )*size );.  if( 
1c2a0 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72  array ){.    for
1c2b0 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
1c2c0 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78 33  +) array[i] = x3
1c2d0 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a  a->tbl[i].data;.
1c2e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 72    }.  return arr
1c2f0 61 79 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61  ay;.}../* Hash a
1c300 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a   configuration *
1c310 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 63 6f  /.PRIVATE int co
1c320 6e 66 69 67 68 61 73 68 28 61 29 0a 73 74 72 75  nfighash(a).stru
1c330 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b 0a  ct config *a;.{.
1c340 20 20 69 6e 74 20 68 3d 30 3b 0a 20 20 68 20 3d    int h=0;.  h =
1c350 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e   h*571 + a->rp->
1c360 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f  index*37 + a->do
1c370 74 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d  t;.  return h;.}
1c380 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
1c390 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
1c3a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1c3b0 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a  cture for each.*
1c3c0 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  * associative ar
1c3d0 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 34 22  ray of type "x4"
1c3e0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 34  ..*/.struct s_x4
1c3f0 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20   {.  int size;  
1c400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c410 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  The number of av
1c420 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a  ailable slots. *
1c430 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1c440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
1c450 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   Must be a power
1c460 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68   of 2 greater th
1c470 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  an or */.       
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c490 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f     /*   equal to
1c4a0 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e   1 */.  int coun
1c4b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1c4c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
1c4d0 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c  rently slots fil
1c4e0 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  led */.  struct 
1c4f0 73 5f 78 34 6e 6f 64 65 20 2a 74 62 6c 3b 20 20  s_x4node *tbl;  
1c500 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72  /* The data stor
1c510 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72  ed here */.  str
1c520 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 68  uct s_x4node **h
1c530 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c  t;  /* Hash tabl
1c540 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f  e for lookups */
1c550 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  .};../* There is
1c560 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
1c570 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
1c580 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65  for every data e
1c590 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20  lement.** in an 
1c5a0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
1c5b0 79 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a  y of type "x4"..
1c5c0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1c5d0 74 20 73 5f 78 34 6e 6f 64 65 20 7b 0a 20 20 73  t s_x4node {.  s
1c5e0 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61  truct config *da
1c5f0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
1c600 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
1c610 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1c620 34 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f  4node *next;   /
1c630 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74  * Next entry wit
1c640 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20  h the same hash 
1c650 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34  */.  struct s_x4
1c660 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a  node **from;  /*
1c670 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a   Previous link *
1c680 2f 0a 7d 20 78 34 6e 6f 64 65 3b 0a 0a 2f 2a 20  /.} x4node;../* 
1c690 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e  There is only on
1c6a0 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
1c6b0 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69  e array, which i
1c6c0 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
1c6d0 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
1c6e0 20 73 5f 78 34 20 2a 78 34 61 3b 0a 0a 2f 2a 20   s_x4 *x4a;../* 
1c6f0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61  Allocate a new a
1c700 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
1c710 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74   */.void Configt
1c720 61 62 6c 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69  able_init(){.  i
1c730 66 28 20 78 34 61 20 29 20 72 65 74 75 72 6e 3b  f( x4a ) return;
1c740 0a 20 20 78 34 61 20 3d 20 28 73 74 72 75 63 74  .  x4a = (struct
1c750 20 73 5f 78 34 2a 29 6d 61 6c 6c 6f 63 28 20 73   s_x4*)malloc( s
1c760 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78  izeof(struct s_x
1c770 34 29 20 29 3b 0a 20 20 69 66 28 20 78 34 61 20  4) );.  if( x4a 
1c780 29 7b 0a 20 20 20 20 78 34 61 2d 3e 73 69 7a 65  ){.    x4a->size
1c790 20 3d 20 36 34 3b 0a 20 20 20 20 78 34 61 2d 3e   = 64;.    x4a->
1c7a0 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78  count = 0;.    x
1c7b0 34 61 2d 3e 74 62 6c 20 3d 20 28 78 34 6e 6f 64  4a->tbl = (x4nod
1c7c0 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20  e*)malloc( .    
1c7d0 20 20 28 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65    (sizeof(x4node
1c7e0 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64  ) + sizeof(x4nod
1c7f0 65 2a 29 29 2a 36 34 20 29 3b 0a 20 20 20 20 69  e*))*64 );.    i
1c800 66 28 20 78 34 61 2d 3e 74 62 6c 3d 3d 30 20 29  f( x4a->tbl==0 )
1c810 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 34 61  {.      free(x4a
1c820 29 3b 0a 20 20 20 20 20 20 78 34 61 20 3d 20 30  );.      x4a = 0
1c830 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c840 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1c850 78 34 61 2d 3e 68 74 20 3d 20 28 78 34 6e 6f 64  x4a->ht = (x4nod
1c860 65 2a 2a 29 26 28 78 34 61 2d 3e 74 62 6c 5b 36  e**)&(x4a->tbl[6
1c870 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  4]);.      for(i
1c880 3d 30 3b 20 69 3c 36 34 3b 20 69 2b 2b 29 20 78  =0; i<64; i++) x
1c890 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  4a->ht[i] = 0;. 
1c8a0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e     }.  }.}./* In
1c8b0 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
1c8c0 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79  d into the array
1c8d0 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
1c8e0 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a  f successful..**
1c8f0 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68   Prior data with
1c900 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
1c910 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e   NOT overwritten
1c920 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61   */.int Configta
1c930 62 6c 65 5f 69 6e 73 65 72 74 28 64 61 74 61 29  ble_insert(data)
1c940 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
1c950 64 61 74 61 3b 0a 7b 0a 20 20 78 34 6e 6f 64 65  data;.{.  x4node
1c960 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20   *np;.  int h;. 
1c970 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20   int ph;..  if( 
1c980 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x4a==0 ) return 
1c990 30 3b 0a 20 20 70 68 20 3d 20 63 6f 6e 66 69 67  0;.  ph = config
1c9a0 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20  hash(data);.  h 
1c9b0 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a  = ph & (x4a->siz
1c9c0 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61  e-1);.  np = x4a
1c9d0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
1c9e0 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
1c9f0 43 6f 6e 66 69 67 63 6d 70 28 6e 70 2d 3e 64 61  Configcmp(np->da
1ca00 74 61 2c 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20  ta,data)==0 ){. 
1ca10 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
1ca20 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74  ing entry with t
1ca30 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66  he same key is f
1ca40 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  ound. */.      /
1ca50 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f  * Fail because o
1ca60 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20  verwrite is not 
1ca70 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  allows. */.     
1ca80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1ca90 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
1caa0 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 34  xt;.  }.  if( x4
1cab0 61 2d 3e 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e 73  a->count>=x4a->s
1cac0 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ize ){.    /* Ne
1cad0 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68  ed to make the h
1cae0 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72  ash table bigger
1caf0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69   */.    int i,si
1cb00 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  ze;.    struct s
1cb10 5f 78 34 20 61 72 72 61 79 3b 0a 20 20 20 20 61  _x4 array;.    a
1cb20 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65  rray.size = size
1cb30 20 3d 20 78 34 61 2d 3e 73 69 7a 65 2a 32 3b 0a   = x4a->size*2;.
1cb40 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20      array.count 
1cb50 3d 20 78 34 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x4a->count;.  
1cb60 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78    array.tbl = (x
1cb70 34 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20  4node*)malloc(. 
1cb80 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 34 6e       (sizeof(x4n
1cb90 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34  ode) + sizeof(x4
1cba0 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a  node*))*size );.
1cbb0 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62      if( array.tb
1cbc0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
1cbd0 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f    /* Fail due to
1cbe0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
1cbf0 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20  */.    array.ht 
1cc00 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 61 72  = (x4node**)&(ar
1cc10 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a  ray.tbl[size]);.
1cc20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
1cc30 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e  ize; i++) array.
1cc40 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66  ht[i] = 0;.    f
1cc50 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63  or(i=0; i<x4a->c
1cc60 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ount; i++){.    
1cc70 20 20 78 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c    x4node *oldnp,
1cc80 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f   *newnp;.      o
1cc90 6c 64 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62  ldnp = &(x4a->tb
1cca0 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d  l[i]);.      h =
1ccb0 20 63 6f 6e 66 69 67 68 61 73 68 28 6f 6c 64 6e   confighash(oldn
1ccc0 70 2d 3e 64 61 74 61 29 20 26 20 28 73 69 7a 65  p->data) & (size
1ccd0 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  -1);.      newnp
1cce0 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69   = &(array.tbl[i
1ccf0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72  ]);.      if( ar
1cd00 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61  ray.ht[h] ) arra
1cd10 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  y.ht[h]->from = 
1cd20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a  &(newnp->next);.
1cd30 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78        newnp->nex
1cd40 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b  t = array.ht[h];
1cd50 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
1cd60 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
1cd70 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
1cd80 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
1cd90 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
1cda0 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
1cdb0 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
1cdc0 78 34 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x4a->tbl);.    *
1cdd0 78 34 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x4a = array;.  }
1cde0 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
1cdf0 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
1ce00 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69   = ph & (x4a->si
1ce10 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
1ce20 78 34 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f  x4a->tbl[x4a->co
1ce30 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64  unt++]);.  np->d
1ce40 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66  ata = data;.  if
1ce50 28 20 78 34 61 2d 3e 68 74 5b 68 5d 20 29 20 78  ( x4a->ht[h] ) x
1ce60 34 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  4a->ht[h]->from 
1ce70 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  = &(np->next);. 
1ce80 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 34 61 2d   np->next = x4a-
1ce90 3e 68 74 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e 68  >ht[h];.  x4a->h
1cea0 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d  t[h] = np;.  np-
1ceb0 3e 66 72 6f 6d 20 3d 20 26 28 78 34 61 2d 3e 68  >from = &(x4a->h
1cec0 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  t[h]);.  return 
1ced0 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  1;.}../* Return 
1cee0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
1cef0 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  a assigned to th
1cf00 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65  e given key.  Re
1cf10 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  turn NULL.** if 
1cf20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a  no such key. */.
1cf30 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
1cf40 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28  onfigtable_find(
1cf50 6b 65 79 29 0a 73 74 72 75 63 74 20 63 6f 6e 66  key).struct conf
1cf60 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74  ig *key;.{.  int
1cf70 20 68 3b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70   h;.  x4node *np
1cf80 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20  ;..  if( x4a==0 
1cf90 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20  ) return 0;.  h 
1cfa0 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 6b 65 79  = confighash(key
1cfb0 29 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31  ) & (x4a->size-1
1cfc0 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68  );.  np = x4a->h
1cfd0 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
1cfe0 70 20 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e  p ){.    if( Con
1cff0 66 69 67 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c  figcmp(np->data,
1d000 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  key)==0 ) break;
1d010 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
1d020 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
1d030 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a   np ? np->data :
1d040 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f 76 65   0;.}../* Remove
1d050 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74   all data from t
1d060 68 65 20 74 61 62 6c 65 2e 20 20 50 61 73 73 20  he table.  Pass 
1d070 65 61 63 68 20 64 61 74 61 20 74 6f 20 74 68 65  each data to the
1d080 20 66 75 6e 63 74 69 6f 6e 20 22 66 22 0a 2a 2a   function "f".**
1d090 20 61 73 20 69 74 20 69 73 20 72 65 6d 6f 76 65   as it is remove
1d0a0 64 2e 20 20 28 22 66 22 20 6d 61 79 20 62 65 20  d.  ("f" may be 
1d0b0 6e 75 6c 6c 20 74 6f 20 61 76 6f 69 64 20 74 68  null to avoid th
1d0c0 69 73 20 73 74 65 70 2e 29 20 2a 2f 0a 76 6f 69  is step.) */.voi
1d0d0 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c  d Configtable_cl
1d0e0 65 61 72 28 66 29 0a 69 6e 74 28 2a 66 29 28 2f  ear(f).int(*f)(/
1d0f0 2a 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  * struct config 
1d100 2a 20 2a 2f 29 3b 0a 7b 0a 20 20 69 6e 74 20 69  * */);.{.  int i
1d110 3b 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 7c  ;.  if( x4a==0 |
1d120 7c 20 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20  | x4a->count==0 
1d130 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1d140 66 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78  f ) for(i=0; i<x
1d150 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20  4a->count; i++) 
1d160 28 2a 66 29 28 78 34 61 2d 3e 74 62 6c 5b 69 5d  (*f)(x4a->tbl[i]
1d170 2e 64 61 74 61 29 3b 0a 20 20 66 6f 72 28 69 3d  .data);.  for(i=
1d180 30 3b 20 69 3c 78 34 61 2d 3e 73 69 7a 65 3b 20  0; i<x4a->size; 
1d190 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20  i++) x4a->ht[i] 
1d1a0 3d 20 30 3b 0a 20 20 78 34 61 2d 3e 63 6f 75 6e  = 0;.  x4a->coun
1d1b0 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  t = 0;.  return;
1d1c0 0a 7d 0a                                         .}.