/ Hex Artifact Content
Login

Artifact 1dc8d53c5ac40f4186ea1bd6ec87a974e18f35a0:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
0010: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 6f 75  contains all sou
0020: 72 63 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  rces (including 
0030: 68 65 61 64 65 72 73 29 20 74 6f 20 74 68 65 20  headers) to the 
0040: 4c 45 4d 4f 4e 0a 2a 2a 20 4c 41 4c 52 28 31 29  LEMON.** LALR(1)
0050: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0060: 72 2e 20 20 54 68 65 20 73 6f 75 72 63 65 73 20  r.  The sources 
0070: 68 61 76 65 20 62 65 65 6e 20 63 6f 6d 62 69 6e  have been combin
0080: 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ed into a.** sin
0090: 67 6c 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b 65  gle file to make
00a0: 20 69 74 20 65 61 73 79 20 74 6f 20 69 6e 63 6c   it easy to incl
00b0: 75 64 65 20 4c 45 4d 4f 4e 20 69 6e 20 74 68 65  ude LEMON in the
00c0: 20 73 6f 75 72 63 65 20 74 72 65 65 0a 2a 2a 20   source tree.** 
00d0: 61 6e 64 20 4d 61 6b 65 66 69 6c 65 20 6f 66 20  and Makefile of 
00e0: 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 2e  another program.
00f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0100: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61  r of this progra
0110: 6d 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  m disclaims copy
0120: 72 69 67 68 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  right..*/.#inclu
0130: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
0140: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0150: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0160: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  g.h>.#include <c
0170: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
0180: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0190: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
01a0: 0a 23 69 66 6e 64 65 66 20 5f 5f 57 49 4e 33 32  .#ifndef __WIN32
01b0: 5f 5f 0a 23 20 20 20 69 66 20 64 65 66 69 6e 65  __.#   if define
01c0: 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
01d0: 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 09 64 65  ined(WIN32).#.de
01e0: 66 69 6e 65 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  fine __WIN32__.#
01f0: 20 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a     endif.#endif.
0200: 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33 32 5f  .#ifdef __WIN32_
0210: 5f 0a 65 78 74 65 72 6e 20 69 6e 74 20 61 63 63  _.extern int acc
0220: 65 73 73 28 29 3b 0a 23 65 6c 73 65 0a 23 69 6e  ess();.#else.#in
0230: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
0240: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66  .#endif../* #def
0250: 69 6e 65 20 50 52 49 56 41 54 45 20 73 74 61 74  ine PRIVATE stat
0260: 69 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  ic */.#define PR
0270: 49 56 41 54 45 0a 0a 23 69 66 64 65 66 20 54 45  IVATE..#ifdef TE
0280: 53 54 0a 23 64 65 66 69 6e 65 20 4d 41 58 52 48  ST.#define MAXRH
0290: 53 20 35 20 20 20 20 20 20 20 2f 2a 20 53 65 74  S 5       /* Set
02a0: 20 6c 6f 77 20 74 6f 20 65 78 65 72 63 69 73 65   low to exercise
02b0: 20 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65 20   exception code 
02c0: 2a 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  */.#else.#define
02d0: 20 4d 41 58 52 48 53 20 31 30 30 30 0a 23 65 6e   MAXRHS 1000.#en
02e0: 64 69 66 0a 0a 73 74 61 74 69 63 20 63 68 61 72  dif..static char
02f0: 20 2a 6d 73 6f 72 74 28 63 68 61 72 2a 2c 63 68   *msort(char*,ch
0300: 61 72 2a 2a 2c 69 6e 74 28 2a 29 28 63 6f 6e 73  ar**,int(*)(cons
0310: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
0320: 61 72 2a 29 29 3b 0a 0a 73 74 61 74 69 63 20 73  ar*));..static s
0330: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41 63  truct action *Ac
0340: 74 69 6f 6e 5f 6e 65 77 28 76 6f 69 64 29 3b 0a  tion_new(void);.
0350: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61 63  static struct ac
0360: 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72  tion *Action_sor
0370: 74 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  t(struct action 
0380: 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);../**********
0390: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
03a0: 62 75 69 6c 64 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  build.h" *******
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76  *************/.v
03d0: 6f 69 64 20 46 69 6e 64 52 75 6c 65 50 72 65 63  oid FindRulePrec
03e0: 65 64 65 6e 63 65 73 28 29 3b 0a 76 6f 69 64 20  edences();.void 
03f0: 46 69 6e 64 46 69 72 73 74 53 65 74 73 28 29 3b  FindFirstSets();
0400: 0a 76 6f 69 64 20 46 69 6e 64 53 74 61 74 65 73  .void FindStates
0410: 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e  ();.void FindLin
0420: 6b 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46  ks();.void FindF
0430: 6f 6c 6c 6f 77 53 65 74 73 28 29 3b 0a 76 6f 69  ollowSets();.voi
0440: 64 20 46 69 6e 64 41 63 74 69 6f 6e 73 28 29 3b  d FindActions();
0450: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ../********* Fro
0460: 6d 20 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66  m the file "conf
0470: 69 67 6c 69 73 74 2e 68 22 20 2a 2a 2a 2a 2a 2a  iglist.h" ******
0480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69  ***********/.voi
04a0: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69  d Configlist_ini
04b0: 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 73  t(/* void */);.s
04c0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
04d0: 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 2f 2a 20  nfiglist_add(/* 
04e0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 2c 20 69  struct rule *, i
04f0: 6e 74 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63  nt */);.struct c
0500: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73  onfig *Configlis
0510: 74 5f 61 64 64 62 61 73 69 73 28 2f 2a 20 73 74  t_addbasis(/* st
0520: 72 75 63 74 20 72 75 6c 65 20 2a 2c 20 69 6e 74  ruct rule *, int
0530: 20 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69   */);.void Confi
0540: 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 2f 2a  glist_closure(/*
0550: 20 76 6f 69 64 20 2a 2f 29 3b 0a 76 6f 69 64 20   void */);.void 
0560: 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28  Configlist_sort(
0570: 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 76 6f 69  /* void */);.voi
0580: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72  d Configlist_sor
0590: 74 62 61 73 69 73 28 2f 2a 20 76 6f 69 64 20 2a  tbasis(/* void *
05a0: 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  /);.struct confi
05b0: 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65  g *Configlist_re
05c0: 74 75 72 6e 28 2f 2a 20 76 6f 69 64 20 2a 2f 29  turn(/* void */)
05d0: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
05e0: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73 69  *Configlist_basi
05f0: 73 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 76  s(/* void */);.v
0600: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65  oid Configlist_e
0610: 61 74 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e  at(/* struct con
0620: 66 69 67 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20  fig * */);.void 
0630: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74  Configlist_reset
0640: 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 0a 2f  (/* void */);../
0650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
0660: 68 65 20 66 69 6c 65 20 22 65 72 72 6f 72 2e 68  he file "error.h
0670: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
0680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20  *********/.void 
06a0: 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63  ErrorMsg(const c
06b0: 68 61 72 20 2a 2c 20 69 6e 74 2c 63 6f 6e 73 74  har *, int,const
06c0: 20 63 68 61 72 20 2a 2c 20 2e 2e 2e 29 3b 0a 0a   char *, ...);..
06d0: 2f 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  /****** From the
06e0: 20 66 69 6c 65 20 22 6f 70 74 69 6f 6e 2e 68 22   file "option.h"
06f0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
0700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72  ***********/.str
0720: 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 7b 0a  uct s_options {.
0730: 20 20 65 6e 75 6d 20 7b 20 4f 50 54 5f 46 4c 41    enum { OPT_FLA
0740: 47 3d 31 2c 20 20 4f 50 54 5f 49 4e 54 2c 20 20  G=1,  OPT_INT,  
0750: 4f 50 54 5f 44 42 4c 2c 20 20 4f 50 54 5f 53 54  OPT_DBL,  OPT_ST
0760: 52 2c 0a 20 20 20 20 20 20 20 20 20 4f 50 54 5f  R,.         OPT_
0770: 46 46 4c 41 47 2c 20 4f 50 54 5f 46 49 4e 54 2c  FFLAG, OPT_FINT,
0780: 20 4f 50 54 5f 46 44 42 4c 2c 20 4f 50 54 5f 46   OPT_FDBL, OPT_F
0790: 53 54 52 7d 20 74 79 70 65 3b 0a 20 20 63 68 61  STR} type;.  cha
07a0: 72 20 2a 6c 61 62 65 6c 3b 0a 20 20 63 68 61 72  r *label;.  char
07b0: 20 2a 61 72 67 3b 0a 20 20 63 68 61 72 20 2a 6d   *arg;.  char *m
07c0: 65 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e 74 20 20  essage;.};.int  
07d0: 20 20 4f 70 74 49 6e 69 74 28 2f 2a 20 63 68 61    OptInit(/* cha
07e0: 72 2a 2a 2c 73 74 72 75 63 74 20 73 5f 6f 70 74  r**,struct s_opt
07f0: 69 6f 6e 73 2a 2c 46 49 4c 45 2a 20 2a 2f 29 3b  ions*,FILE* */);
0800: 0a 69 6e 74 20 20 20 20 4f 70 74 4e 41 72 67 73  .int    OptNArgs
0810: 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 63 68  (/* void */);.ch
0820: 61 72 20 20 2a 4f 70 74 41 72 67 28 2f 2a 20 69  ar  *OptArg(/* i
0830: 6e 74 20 2a 2f 29 3b 0a 76 6f 69 64 20 20 20 4f  nt */);.void   O
0840: 70 74 45 72 72 28 2f 2a 20 69 6e 74 20 2a 2f 29  ptErr(/* int */)
0850: 3b 0a 76 6f 69 64 20 20 20 4f 70 74 50 72 69 6e  ;.void   OptPrin
0860: 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 0a  t(/* void */);..
0870: 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  /******** From t
0880: 68 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e 68  he file "parse.h
0890: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
08a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
08b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69  ***********/.voi
08c0: 64 20 50 61 72 73 65 28 2f 2a 20 73 74 72 75 63  d Parse(/* struc
08d0: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 20 2a 2f  t lemon *lemp */
08e0: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  );../********* F
08f0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 6c  rom the file "pl
0900: 69 6e 6b 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ink.h" *********
0910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0930: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 50 6c  struct plink *Pl
0940: 69 6e 6b 5f 6e 65 77 28 2f 2a 20 76 6f 69 64 20  ink_new(/* void 
0950: 2a 2f 29 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  */);.void Plink_
0960: 61 64 64 28 2f 2a 20 73 74 72 75 63 74 20 70 6c  add(/* struct pl
0970: 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63 74 20 63  ink **, struct c
0980: 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 76 6f 69  onfig * */);.voi
0990: 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 2f 2a 20  d Plink_copy(/* 
09a0: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c  struct plink **,
09b0: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 20   struct plink * 
09c0: 2a 2f 29 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  */);.void Plink_
09d0: 64 65 6c 65 74 65 28 2f 2a 20 73 74 72 75 63 74  delete(/* struct
09e0: 20 70 6c 69 6e 6b 20 2a 20 2a 2f 29 3b 0a 0a 2f   plink * */);../
09f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
0a00: 74 68 65 20 66 69 6c 65 20 22 72 65 70 6f 72 74  the file "report
0a10: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
0a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20  *********/.void 
0a40: 52 65 70 72 69 6e 74 28 2f 2a 20 73 74 72 75 63  Reprint(/* struc
0a50: 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a 76  t lemon * */);.v
0a60: 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74  oid ReportOutput
0a70: 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  (/* struct lemon
0a80: 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 52 65 70   * */);.void Rep
0a90: 6f 72 74 54 61 62 6c 65 28 2f 2a 20 73 74 72 75  ortTable(/* stru
0aa0: 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a  ct lemon * */);.
0ab0: 76 6f 69 64 20 52 65 70 6f 72 74 48 65 61 64 65  void ReportHeade
0ac0: 72 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f  r(/* struct lemo
0ad0: 6e 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f  n * */);.void Co
0ae0: 6d 70 72 65 73 73 54 61 62 6c 65 73 28 2f 2a 20  mpressTables(/* 
0af0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a  struct lemon * *
0b00: 2f 29 3b 0a 76 6f 69 64 20 52 65 73 6f 72 74 53  /);.void ResortS
0b10: 74 61 74 65 73 28 2f 2a 20 73 74 72 75 63 74 20  tates(/* struct 
0b20: 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a 0a 2f 2a  lemon * */);../*
0b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
0b40: 68 65 20 66 69 6c 65 20 22 73 65 74 2e 68 22 20  he file "set.h" 
0b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b70: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 20  ********/.void  
0b80: 53 65 74 53 69 7a 65 28 2f 2a 20 69 6e 74 20 4e  SetSize(/* int N
0b90: 20 2a 2f 29 3b 20 20 20 20 20 20 20 20 20 20 20   */);           
0ba0: 20 20 2f 2a 20 41 6c 6c 20 73 65 74 73 20 77 69    /* All sets wi
0bb0: 6c 6c 20 62 65 20 6f 66 20 73 69 7a 65 20 4e 20  ll be of size N 
0bc0: 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28  */.char *SetNew(
0bd0: 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 20 20 20 20  /* void */);    
0be0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
0bf0: 6e 65 77 20 73 65 74 20 66 6f 72 20 65 6c 65 6d  new set for elem
0c00: 65 6e 74 20 30 2e 2e 4e 20 2a 2f 0a 76 6f 69 64  ent 0..N */.void
0c10: 20 20 53 65 74 46 72 65 65 28 2f 2a 20 63 68 61    SetFree(/* cha
0c20: 72 2a 20 2a 2f 29 3b 20 20 20 20 20 20 20 20 20  r* */);         
0c30: 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74      /* Deallocat
0c40: 65 20 61 20 73 65 74 20 2a 2f 0a 0a 69 6e 74 20  e a set */..int 
0c50: 53 65 74 41 64 64 28 2f 2a 20 63 68 61 72 2a 2c  SetAdd(/* char*,
0c60: 69 6e 74 20 2a 2f 29 3b 20 20 20 20 20 20 20 20  int */);        
0c70: 20 20 20 20 2f 2a 20 41 64 64 20 65 6c 65 6d 65      /* Add eleme
0c80: 6e 74 20 74 6f 20 61 20 73 65 74 20 2a 2f 0a 69  nt to a set */.i
0c90: 6e 74 20 53 65 74 55 6e 69 6f 6e 28 2f 2a 20 63  nt SetUnion(/* c
0ca0: 68 61 72 20 2a 41 2c 63 68 61 72 20 2a 42 20 2a  har *A,char *B *
0cb0: 2f 29 3b 20 20 20 20 2f 2a 20 41 20 3c 2d 20 41  /);    /* A <- A
0cc0: 20 55 20 42 2c 20 74 68 72 75 20 65 6c 65 6d 65   U B, thru eleme
0cd0: 6e 74 20 4e 20 2a 2f 0a 0a 23 64 65 66 69 6e 65  nt N */..#define
0ce0: 20 53 65 74 46 69 6e 64 28 58 2c 59 29 20 28 58   SetFind(X,Y) (X
0cf0: 5b 59 5d 29 20 20 20 20 20 20 20 2f 2a 20 54 72  [Y])       /* Tr
0d00: 75 65 20 69 66 20 59 20 69 73 20 69 6e 20 73 65  ue if Y is in se
0d10: 74 20 58 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  t X */../*******
0d20: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0d30: 65 20 22 73 74 72 75 63 74 2e 68 22 20 2a 2a 2a  e "struct.h" ***
0d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d60: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 63 69  **/./*.** Princi
0d70: 70 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  pal data structu
0d80: 72 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f  res for the LEMO
0d90: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
0da0: 6f 72 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20  or..*/..typedef 
0db0: 65 6e 75 6d 20 7b 4c 45 4d 4f 4e 5f 46 41 4c 53  enum {LEMON_FALS
0dc0: 45 3d 30 2c 20 4c 45 4d 4f 4e 5f 54 52 55 45 7d  E=0, LEMON_TRUE}
0dd0: 20 42 6f 6f 6c 65 61 6e 3b 0a 0a 2f 2a 20 53 79   Boolean;../* Sy
0de0: 6d 62 6f 6c 73 20 28 74 65 72 6d 69 6e 61 6c 73  mbols (terminals
0df0: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
0e00: 73 29 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  s) of the gramma
0e10: 72 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20  r are stored.** 
0e20: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
0e30: 3a 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62  : */.struct symb
0e40: 6f 6c 20 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d  ol {.  char *nam
0e50: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
0e60: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
0e70: 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  ymbol */.  int i
0e80: 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
0e90: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
0ea0: 62 65 72 20 66 6f 72 20 74 68 69 73 20 73 79 6d  ber for this sym
0eb0: 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 7b 0a  bol */.  enum {.
0ec0: 20 20 20 20 54 45 52 4d 49 4e 41 4c 2c 0a 20 20      TERMINAL,.  
0ed0: 20 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c 2c 0a 20    NONTERMINAL,. 
0ee0: 20 20 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c     MULTITERMINAL
0ef0: 0a 20 20 7d 20 74 79 70 65 3b 20 20 20 20 20 20  .  } type;      
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
0f10: 79 6d 62 6f 6c 73 20 61 72 65 20 61 6c 6c 20 65  ymbols are all e
0f20: 69 74 68 65 72 20 54 45 52 4d 49 4e 41 4c 53 20  ither TERMINALS 
0f30: 6f 72 20 4e 54 73 20 2a 2f 0a 20 20 73 74 72 75  or NTs */.  stru
0f40: 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20  ct rule *rule;  
0f50: 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c       /* Linked l
0f60: 69 73 74 20 6f 66 20 72 75 6c 65 73 20 6f 66 20  ist of rules of 
0f70: 74 68 69 73 20 28 69 66 20 61 6e 20 4e 54 29 20  this (if an NT) 
0f80: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
0f90: 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 2f 2a  ol *fallback; /*
0fa0: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20   fallback token 
0fb0: 69 6e 20 63 61 73 65 20 74 68 69 73 20 74 6f 6b  in case this tok
0fc0: 65 6e 20 64 6f 65 73 6e 27 74 20 70 61 72 73 65  en doesn't parse
0fd0: 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63 3b 20   */.  int prec; 
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0ff0: 2a 20 50 72 65 63 65 64 65 6e 63 65 20 69 66 20  * Precedence if 
1000: 64 65 66 69 6e 65 64 20 28 2d 31 20 6f 74 68 65  defined (-1 othe
1010: 72 77 69 73 65 29 20 2a 2f 0a 20 20 65 6e 75 6d  rwise) */.  enum
1020: 20 65 5f 61 73 73 6f 63 20 7b 0a 20 20 20 20 4c   e_assoc {.    L
1030: 45 46 54 2c 0a 20 20 20 20 52 49 47 48 54 2c 0a  EFT,.    RIGHT,.
1040: 20 20 20 20 4e 4f 4e 45 2c 0a 20 20 20 20 55 4e      NONE,.    UN
1050: 4b 0a 20 20 7d 20 61 73 73 6f 63 3b 20 20 20 20  K.  } assoc;    
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1070: 41 73 73 6f 63 69 61 74 69 76 69 74 79 20 69 66  Associativity if
1080: 20 70 72 65 64 65 63 65 6e 63 65 20 69 73 20 64   predecence is d
1090: 65 66 69 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72  efined */.  char
10a0: 20 2a 66 69 72 73 74 73 65 74 3b 20 20 20 20 20   *firstset;     
10b0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 2d 73 65       /* First-se
10c0: 74 20 66 6f 72 20 61 6c 6c 20 72 75 6c 65 73 20  t for all rules 
10d0: 6f 66 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a  of this symbol *
10e0: 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 6c 61 6d 62  /.  Boolean lamb
10f0: 64 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  da;          /* 
1100: 54 72 75 65 20 69 66 20 4e 54 20 61 6e 64 20 63  True if NT and c
1110: 61 6e 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65  an generate an e
1120: 6d 70 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 20  mpty string */. 
1130: 20 69 6e 74 20 75 73 65 43 6e 74 3b 20 20 20 20   int useCnt;    
1140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1150: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 75 73 65  ber of times use
1160: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65 73  d */.  char *des
1170: 74 72 75 63 74 6f 72 3b 20 20 20 20 20 20 20 20  tructor;        
1180: 2f 2a 20 43 6f 64 65 20 77 68 69 63 68 20 65 78  /* Code which ex
1190: 65 63 75 74 65 73 20 77 68 65 6e 65 76 65 72 20  ecutes whenever 
11a0: 74 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 0a 20  this symbol is. 
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 70            ** pop
11d0: 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ped from the sta
11e0: 63 6b 20 64 75 72 69 6e 67 20 65 72 72 6f 72 20  ck during error 
11f0: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
1200: 69 6e 74 20 64 65 73 74 72 75 63 74 6f 72 6c 6e  int destructorln
1210: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65  ;        /* Line
1220: 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 73 74 72   number of destr
1230: 75 63 74 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  uctor code */.  
1240: 63 68 61 72 20 2a 64 61 74 61 74 79 70 65 3b 20  char *datatype; 
1250: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1260: 64 61 74 61 20 74 79 70 65 20 6f 66 20 69 6e 66  data type of inf
1270: 6f 72 6d 61 74 69 6f 6e 20 68 65 6c 64 20 62 79  ormation held by
1280: 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a0: 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e 6c 79   ** object. Only
12b0: 20 75 73 65 64 20 69 66 20 74 79 70 65 3d 3d 4e   used if type==N
12c0: 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a 20 20  ONTERMINAL */.  
12d0: 69 6e 74 20 64 74 6e 75 6d 3b 20 20 20 20 20 20  int dtnum;      
12e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12f0: 64 61 74 61 20 74 79 70 65 20 6e 75 6d 62 65 72  data type number
1300: 2e 20 20 49 6e 20 74 68 65 20 70 61 72 73 65 72  .  In the parser
1310: 2c 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  , the value.    
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1330: 20 20 20 20 20 20 20 2a 2a 20 73 74 61 63 6b 20         ** stack 
1340: 69 73 20 61 20 75 6e 69 6f 6e 2e 20 20 54 68 65  is a union.  The
1350: 20 2e 79 79 25 64 20 65 6c 65 6d 65 6e 74 20 6f   .yy%d element o
1360: 66 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  f this.         
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 2a 2a 20 75 6e 69 6f 6e 20 69 73 20 74 68    ** union is th
1390: 65 20 63 6f 72 72 65 63 74 20 64 61 74 61 20 74  e correct data t
13a0: 79 70 65 20 66 6f 72 20 74 68 69 73 20 6f 62 6a  ype for this obj
13b0: 65 63 74 20 2a 2f 0a 20 20 2f 2a 20 54 68 65 20  ect */.  /* The 
13c0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
13d0: 20 61 72 65 20 75 73 65 64 20 62 79 20 4d 55 4c   are used by MUL
13e0: 54 49 54 45 52 4d 49 4e 41 4c 73 20 6f 6e 6c 79  TITERMINALs only
13f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 75 62 73 79   */.  int nsubsy
1400: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
1410: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73  * Number of cons
1420: 74 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20  tituent symbols 
1430: 69 6e 20 74 68 65 20 4d 55 4c 54 49 20 2a 2f 0a  in the MULTI */.
1440: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1450: 2a 2a 73 75 62 73 79 6d 3b 20 20 2f 2a 20 41 72  **subsym;  /* Ar
1460: 72 61 79 20 6f 66 20 63 6f 6e 73 74 69 74 75 65  ray of constitue
1470: 6e 74 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 7d 3b  nt symbols */.};
1480: 0a 0a 2f 2a 20 45 61 63 68 20 70 72 6f 64 75 63  ../* Each produc
1490: 74 69 6f 6e 20 72 75 6c 65 20 69 6e 20 74 68 65  tion rule in the
14a0: 20 67 72 61 6d 6d 61 72 20 69 73 20 73 74 6f 72   grammar is stor
14b0: 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ed in the follow
14c0: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
14d0: 2e 20 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c  .  */.struct rul
14e0: 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  e {.  struct sym
14f0: 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 2f  bol *lhs;      /
1500: 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  * Left-hand side
1510: 20 6f 66 20 74 68 65 20 72 75 6c 65 20 2a 2f 0a   of the rule */.
1520: 20 20 63 68 61 72 20 2a 6c 68 73 61 6c 69 61 73    char *lhsalias
1530: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  ;          /* Al
1540: 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20  ias for the LHS 
1550: 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a  (NULL if none) *
1560: 2f 0a 20 20 69 6e 74 20 6c 68 73 53 74 61 72 74  /.  int lhsStart
1570: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1580: 54 72 75 65 20 69 66 20 6c 65 66 74 2d 68 61 6e  True if left-han
1590: 64 20 73 69 64 65 20 69 73 20 74 68 65 20 73 74  d side is the st
15a0: 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20  art symbol */.  
15b0: 69 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20 20 20  int ruleline;   
15c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
15d0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
15e0: 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 72  rule */.  int nr
15f0: 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hs;             
1600: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1610: 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  RHS symbols */. 
1620: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1630: 2a 72 68 73 3b 20 20 20 20 20 2f 2a 20 54 68 65  *rhs;     /* The
1640: 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a   RHS symbols */.
1650: 20 20 63 68 61 72 20 2a 2a 72 68 73 61 6c 69 61    char **rhsalia
1660: 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  s;         /* An
1670: 20 61 6c 69 61 73 20 66 6f 72 20 65 61 63 68 20   alias for each 
1680: 52 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55 4c 4c  RHS symbol (NULL
1690: 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69   if none) */.  i
16a0: 6e 74 20 6c 69 6e 65 3b 20 20 20 20 20 20 20 20  nt line;        
16b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
16c0: 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63 68 20  number at which 
16d0: 63 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f 0a 20  code begins */. 
16e0: 20 63 68 61 72 20 2a 63 6f 64 65 3b 20 20 20 20   char *code;    
16f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1700: 20 63 6f 64 65 20 65 78 65 63 75 74 65 64 20 77   code executed w
1710: 68 65 6e 20 74 68 69 73 20 72 75 6c 65 20 69 73  hen this rule is
1720: 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20 73 74   reduced */.  st
1730: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 70 72 65  ruct symbol *pre
1740: 63 73 79 6d 3b 20 20 2f 2a 20 50 72 65 63 65 64  csym;  /* Preced
1750: 65 6e 63 65 20 73 79 6d 62 6f 6c 20 66 6f 72 20  ence symbol for 
1760: 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 69  this rule */.  i
1770: 6e 74 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20  nt index;       
1780: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
1790: 64 65 78 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  dex number for t
17a0: 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 42 6f  his rule */.  Bo
17b0: 6f 6c 65 61 6e 20 63 61 6e 52 65 64 75 63 65 3b  olean canReduce;
17c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
17d0: 66 20 74 68 69 73 20 72 75 6c 65 20 69 73 20 65  f this rule is e
17e0: 76 65 72 20 72 65 64 75 63 65 64 20 2a 2f 0a 20  ver reduced */. 
17f0: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65   struct rule *ne
1800: 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e 65 78  xtlhs;    /* Nex
1810: 74 20 72 75 6c 65 20 77 69 74 68 20 74 68 65 20  t rule with the 
1820: 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20 73 74  same LHS */.  st
1830: 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78 74 3b  ruct rule *next;
1840: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 72         /* Next r
1850: 75 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f 62 61  ule in the globa
1860: 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  l list */.};../*
1870: 20 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   A configuration
1880: 20 69 73 20 61 20 70 72 6f 64 75 63 74 69 6f 6e   is a production
1890: 20 72 75 6c 65 20 6f 66 20 74 68 65 20 67 72 61   rule of the gra
18a0: 6d 6d 61 72 20 74 6f 67 65 74 68 65 72 20 77 69  mmar together wi
18b0: 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28 64 6f  th.** a mark (do
18c0: 74 29 20 73 68 6f 77 69 6e 67 20 68 6f 77 20 6d  t) showing how m
18d0: 75 63 68 20 6f 66 20 74 68 61 74 20 72 75 6c 65  uch of that rule
18e0: 20 68 61 73 20 62 65 65 6e 20 70 72 6f 63 65 73   has been proces
18f0: 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a 20 43  sed so far..** C
1900: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61 6c  onfigurations al
1910: 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66 6f 6c  so contain a fol
1920: 6c 6f 77 2d 73 65 74 20 77 68 69 63 68 20 69 73  low-set which is
1930: 20 61 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 69   a list of termi
1940: 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73 20 77  nal.** symbols w
1950: 68 69 63 68 20 61 72 65 20 61 6c 6c 6f 77 65 64  hich are allowed
1960: 20 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   to immediately 
1970: 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64 20 6f  follow the end o
1980: 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a 20 45  f the rule..** E
1990: 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69  very configurati
19a0: 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61  on is recorded a
19b0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
19c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20   the following: 
19d0: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
19e0: 20 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65   {.  struct rule
19f0: 20 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a   *rp;         /*
1a00: 20 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77   The rule upon w
1a10: 68 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75  hich the configu
1a20: 72 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20  ration is based 
1a30: 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20  */.  int dot;   
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a50: 20 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74   The parse point
1a60: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b   */.  char *fws;
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a80: 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72  * Follow-set for
1a90: 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74   this configurat
1aa0: 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ion only */.  st
1ab0: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70  ruct plink *fplp
1ac0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ;      /* Follow
1ad0: 2d 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f  -set forward pro
1ae0: 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a  pagation links *
1af0: 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  /.  struct plink
1b00: 20 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20   *bplp;      /* 
1b10: 46 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77  Follow-set backw
1b20: 61 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e  ards propagation
1b30: 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75   links */.  stru
1b40: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
1b50: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1b60: 74 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63  to state which c
1b70: 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a  ontains this */.
1b80: 20 20 65 6e 75 6d 20 7b 0a 20 20 20 20 43 4f 4d    enum {.    COM
1b90: 50 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20 20  PLETE,          
1ba0: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 75      /* The statu
1bb0: 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  s is used during
1bc0: 20 66 6f 6c 6c 6f 77 73 65 74 20 61 6e 64 20 2a   followset and *
1bd0: 2f 0a 20 20 20 20 49 4e 43 4f 4d 50 4c 45 54 45  /.    INCOMPLETE
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bf0: 20 20 20 73 68 69 66 74 20 63 6f 6d 70 75 74 61     shift computa
1c00: 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 20 73 74 61  tions */.  } sta
1c10: 74 75 73 3b 0a 20 20 73 74 72 75 63 74 20 63 6f  tus;.  struct co
1c20: 6e 66 69 67 20 2a 6e 65 78 74 3b 20 20 20 20 20  nfig *next;     
1c30: 2f 2a 20 4e 65 78 74 20 63 6f 6e 66 69 67 75 72  /* Next configur
1c40: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74 61  ation in the sta
1c50: 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63  te */.  struct c
1c60: 6f 6e 66 69 67 20 2a 62 70 3b 20 20 20 20 20 20  onfig *bp;      
1c70: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 61 73   /* The next bas
1c80: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
1c90: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79   */.};../* Every
1ca0: 20 73 68 69 66 74 20 6f 72 20 72 65 64 75 63 65   shift or reduce
1cb0: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73 74   operation is st
1cc0: 6f 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20 74  ored as one of t
1cd0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
1ce0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b 0a  struct action {.
1cf0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1d00: 2a 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *sp;       /* Th
1d10: 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79 6d  e look-ahead sym
1d20: 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f  bol */.  enum e_
1d30: 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20 53 48 49  action {.    SHI
1d40: 46 54 2c 0a 20 20 20 20 41 43 43 45 50 54 2c 0a  FT,.    ACCEPT,.
1d50: 20 20 20 20 52 45 44 55 43 45 2c 0a 20 20 20 20      REDUCE,.    
1d60: 45 52 52 4f 52 2c 0a 20 20 20 20 53 53 43 4f 4e  ERROR,.    SSCON
1d70: 46 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20 20  FLICT,          
1d80: 20 20 20 20 2f 2a 20 41 20 73 68 69 66 74 2f 73      /* A shift/s
1d90: 68 69 66 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  hift conflict */
1da0: 0a 20 20 20 20 53 52 43 4f 4e 46 4c 49 43 54 2c  .    SRCONFLICT,
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dc0: 20 57 61 73 20 61 20 72 65 64 75 63 65 2c 20 62   Was a reduce, b
1dd0: 75 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6e  ut part of a con
1de0: 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 52 52 43  flict */.    RRC
1df0: 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20 20 20 20  ONFLICT,        
1e00: 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 72        /* Was a r
1e10: 65 64 75 63 65 2c 20 62 75 74 20 70 61 72 74 20  educe, but part 
1e20: 6f 66 20 61 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  of a conflict */
1e30: 0a 20 20 20 20 53 48 5f 52 45 53 4f 4c 56 45 44  .    SH_RESOLVED
1e40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1e50: 20 57 61 73 20 61 20 73 68 69 66 74 2e 20 20 50   Was a shift.  P
1e60: 72 65 63 65 64 65 6e 63 65 20 72 65 73 6f 6c 76  recedence resolv
1e70: 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ed conflict */. 
1e80: 20 20 20 52 44 5f 52 45 53 4f 4c 56 45 44 2c 20     RD_RESOLVED, 
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1ea0: 61 73 20 72 65 64 75 63 65 2e 20 20 50 72 65 63  as reduce.  Prec
1eb0: 65 64 65 6e 63 65 20 72 65 73 6f 6c 76 65 64 20  edence resolved 
1ec0: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20  conflict */.    
1ed0: 4e 4f 54 5f 55 53 45 44 20 20 20 20 20 20 20 20  NOT_USED        
1ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
1ef0: 74 65 64 20 62 79 20 63 6f 6d 70 72 65 73 73 69  ted by compressi
1f00: 6f 6e 20 2a 2f 0a 20 20 7d 20 74 79 70 65 3b 0a  on */.  } type;.
1f10: 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74    union {.    st
1f20: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
1f30: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
1f40: 73 74 61 74 65 2c 20 69 66 20 61 20 73 68 69 66  state, if a shif
1f50: 74 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  t */.    struct 
1f60: 72 75 6c 65 20 2a 72 70 3b 20 20 20 20 20 20 20  rule *rp;       
1f70: 2f 2a 20 54 68 65 20 72 75 6c 65 2c 20 69 66 20  /* The rule, if 
1f80: 61 20 72 65 64 75 63 65 20 2a 2f 0a 20 20 7d 20  a reduce */.  } 
1f90: 78 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  x;.  struct acti
1fa0: 6f 6e 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a  on *next;     /*
1fb0: 20 4e 65 78 74 20 61 63 74 69 6f 6e 20 66 6f 72   Next action for
1fc0: 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20   this state */. 
1fd0: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
1fe0: 63 6f 6c 6c 69 64 65 3b 20 20 2f 2a 20 4e 65 78  collide;  /* Nex
1ff0: 74 20 61 63 74 69 6f 6e 20 77 69 74 68 20 74 68  t action with th
2000: 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 7d  e same hash */.}
2010: 3b 0a 0a 2f 2a 20 45 61 63 68 20 73 74 61 74 65  ;../* Each state
2020: 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
2030: 64 20 70 61 72 73 65 72 27 73 20 66 69 6e 69 74  d parser's finit
2040: 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 0a  e state machine.
2050: 2a 2a 20 69 73 20 65 6e 63 6f 64 65 64 20 61 73  ** is encoded as
2060: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
2070: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2080: 72 75 63 74 75 72 65 2e 20 2a 2f 0a 73 74 72 75  ructure. */.stru
2090: 63 74 20 73 74 61 74 65 20 7b 0a 20 20 73 74 72  ct state {.  str
20a0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 70 3b 20  uct config *bp; 
20b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 61 73        /* The bas
20c0: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
20d0: 73 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  s for this state
20e0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   */.  struct con
20f0: 66 69 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f  fig *cfp;      /
2100: 2a 20 41 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74  * All configurat
2110: 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 73 65 74  ions in this set
2120: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 61 74 65 6e   */.  int staten
2130: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  um;            /
2140: 2a 20 53 65 71 75 65 6e 63 69 61 6c 20 6e 75 6d  * Sequencial num
2150: 62 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61  ber for this sta
2160: 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61  te */.  struct a
2170: 63 74 69 6f 6e 20 2a 61 70 3b 20 20 20 20 20 20  ction *ap;      
2180: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74   /* Array of act
2190: 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74  ions for this st
21a0: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6b  ate */.  int nTk
21b0: 6e 41 63 74 2c 20 6e 4e 74 41 63 74 3b 20 20 20  nAct, nNtAct;   
21c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
21d0: 63 74 69 6f 6e 73 20 6f 6e 20 74 65 72 6d 69 6e  ctions on termin
21e0: 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69  als and nontermi
21f0: 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  nals */.  int iT
2200: 6b 6e 4f 66 73 74 2c 20 69 4e 74 4f 66 73 74 3b  knOfst, iNtOfst;
2210: 20 20 20 2f 2a 20 79 79 5f 61 63 74 69 6f 6e 5b     /* yy_action[
2220: 5d 20 6f 66 66 73 65 74 20 66 6f 72 20 74 65 72  ] offset for ter
2230: 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65  minals and nonte
2240: 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 69 44 66  rms */.  int iDf
2250: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
2260: 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 61 63 74    /* Default act
2270: 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e  ion */.};.#defin
2280: 65 20 4e 4f 5f 4f 46 46 53 45 54 20 28 2d 32 31  e NO_OFFSET (-21
2290: 34 37 34 38 33 36 34 37 29 0a 0a 2f 2a 20 41 20  47483647)../* A 
22a0: 66 6f 6c 6c 6f 77 73 65 74 20 70 72 6f 70 61 67  followset propag
22b0: 61 74 69 6f 6e 20 6c 69 6e 6b 20 69 6e 64 69 63  ation link indic
22c0: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  ates that the co
22d0: 6e 74 65 6e 74 73 20 6f 66 20 6f 6e 65 0a 2a 2a  ntents of one.**
22e0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
22f0: 6f 6c 6c 6f 77 73 65 74 20 73 68 6f 75 6c 64 20  ollowset should 
2300: 62 65 20 70 72 6f 70 61 67 61 74 65 64 20 74 6f  be propagated to
2310: 20 61 6e 6f 74 68 65 72 20 77 68 65 6e 65 76 65   another wheneve
2320: 72 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  r.** the first c
2330: 68 61 6e 67 65 73 2e 20 2a 2f 0a 73 74 72 75 63  hanges. */.struc
2340: 74 20 70 6c 69 6e 6b 20 7b 0a 20 20 73 74 72 75  t plink {.  stru
2350: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20  ct config *cfp; 
2360: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66       /* The conf
2370: 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 77 68 69  iguration to whi
2380: 63 68 20 6c 69 6e 6b 65 64 20 2a 2f 0a 20 20 73  ch linked */.  s
2390: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78  truct plink *nex
23a0: 74 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  t;      /* The n
23b0: 65 78 74 20 70 72 6f 70 61 67 61 74 65 20 6c 69  ext propagate li
23c0: 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  nk */.};../* The
23d0: 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 66 6f   state vector fo
23e0: 72 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 72  r the entire par
23f0: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 73  ser generator is
2400: 20 72 65 63 6f 72 64 65 64 20 61 73 0a 2a 2a 20   recorded as.** 
2410: 66 6f 6c 6c 6f 77 73 2e 20 20 28 4c 45 4d 4f 4e  follows.  (LEMON
2420: 20 75 73 65 73 20 6e 6f 20 67 6c 6f 62 61 6c 20   uses no global 
2430: 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6d 61  variables and ma
2440: 6b 65 73 20 6c 69 74 74 6c 65 20 75 73 65 20 6f  kes little use o
2450: 66 0a 2a 2a 20 73 74 61 74 69 63 20 76 61 72 69  f.** static vari
2460: 61 62 6c 65 73 2e 20 20 46 69 65 6c 64 73 20 69  ables.  Fields i
2470: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2480: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
2490: 20 74 68 6f 75 67 68 74 0a 2a 2a 20 6f 66 20 61   thought.** of a
24a0: 73 20 62 65 67 69 6e 20 67 6c 6f 62 61 6c 20 76  s begin global v
24b0: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
24c0: 70 72 6f 67 72 61 6d 2e 29 20 2a 2f 0a 73 74 72  program.) */.str
24d0: 75 63 74 20 6c 65 6d 6f 6e 20 7b 0a 20 20 73 74  uct lemon {.  st
24e0: 72 75 63 74 20 73 74 61 74 65 20 2a 2a 73 6f 72  ruct state **sor
24f0: 74 65 64 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20  ted;   /* Table 
2500: 6f 66 20 73 74 61 74 65 73 20 73 6f 72 74 65 64  of states sorted
2510: 20 62 79 20 73 74 61 74 65 20 6e 75 6d 62 65 72   by state number
2520: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
2530: 65 20 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f  e *rule;       /
2540: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 72 75  * List of all ru
2550: 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 74  les */.  int nst
2560: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
2570: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
2580: 74 61 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  tates */.  int n
2590: 72 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  rule;           
25a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25b0: 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20   rules */.  int 
25c0: 6e 73 79 6d 62 6f 6c 3b 20 20 20 20 20 20 20 20  nsymbol;        
25d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25e0: 66 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e  f terminal and n
25f0: 6f 6e 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f  onterminal symbo
2600: 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 74 65 72  ls */.  int nter
2610: 6d 69 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  minal;          
2620: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
2630: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a  rminal symbols *
2640: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
2650: 6c 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20 2f 2a 20  l **symbols; /* 
2660: 53 6f 72 74 65 64 20 61 72 72 61 79 20 6f 66 20  Sorted array of 
2670: 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 79 6d 62  pointers to symb
2680: 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ols */.  int err
2690: 6f 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  orcnt;          
26a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
26b0: 72 72 6f 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  rrors */.  struc
26c0: 74 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d  t symbol *errsym
26d0: 3b 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72  ;   /* The error
26e0: 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72   symbol */.  str
26f0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 77 69 6c 64  uct symbol *wild
2700: 63 61 72 64 3b 20 2f 2a 20 54 6f 6b 65 6e 20 74  card; /* Token t
2710: 68 61 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74  hat matches anyt
2720: 68 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  hing */.  char *
2730: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
2740: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2750: 65 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73  e generated pars
2760: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72  er */.  char *ar
2770: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
2780: 20 2f 2a 20 44 65 63 6c 61 72 61 74 69 6f 6e 20   /* Declaration 
2790: 6f 66 20 74 68 65 20 33 74 68 20 61 72 67 75 6d  of the 3th argum
27a0: 65 6e 74 20 74 6f 20 70 61 72 73 65 72 20 2a 2f  ent to parser */
27b0: 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 74 79  .  char *tokenty
27c0: 70 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  pe;         /* T
27d0: 79 70 65 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20  ype of terminal 
27e0: 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 70  symbols in the p
27f0: 61 72 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20  arser stack */. 
2800: 20 63 68 61 72 20 2a 76 61 72 74 79 70 65 3b 20   char *vartype; 
2810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2820: 20 64 65 66 61 75 6c 74 20 74 79 70 65 20 6f 66   default type of
2830: 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 73 79   non-terminal sy
2840: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20  mbols */.  char 
2850: 2a 73 74 61 72 74 3b 20 20 20 20 20 20 20 20 20  *start;         
2860: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2870: 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  he start symbol 
2880: 66 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72 20  for the grammar 
2890: 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 63 6b  */.  char *stack
28a0: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  size;         /*
28b0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 72   Size of the par
28c0: 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63  ser stack */.  c
28d0: 68 61 72 20 2a 69 6e 63 6c 75 64 65 3b 20 20 20  har *include;   
28e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
28f0: 74 6f 20 70 75 74 20 61 74 20 74 68 65 20 73 74  to put at the st
2900: 61 72 74 20 6f 66 20 74 68 65 20 43 20 66 69 6c  art of the C fil
2910: 65 20 2a 2f 0a 20 20 69 6e 74 20 20 69 6e 63 6c  e */.  int  incl
2920: 75 64 65 6c 6e 3b 20 20 20 20 20 20 20 20 20 20  udeln;          
2930: 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66  /* Line number f
2940: 6f 72 20 73 74 61 72 74 20 6f 66 20 69 6e 63 6c  or start of incl
2950: 75 64 65 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  ude code */.  ch
2960: 61 72 20 2a 65 72 72 6f 72 3b 20 20 20 20 20 20  ar *error;      
2970: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
2980: 6f 20 65 78 65 63 75 74 65 20 77 68 65 6e 20 61  o execute when a
2990: 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20  n error is seen 
29a0: 2a 2f 0a 20 20 69 6e 74 20 20 65 72 72 6f 72 6c  */.  int  errorl
29b0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
29c0: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72   Line number for
29d0: 20 73 74 61 72 74 20 6f 66 20 65 72 72 6f 72 20   start of error 
29e0: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
29f0: 6f 76 65 72 66 6c 6f 77 3b 20 20 20 20 20 20 20  overflow;       
2a00: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
2a10: 65 63 75 74 65 20 6f 6e 20 61 20 73 74 61 63 6b  ecute on a stack
2a20: 20 6f 76 65 72 66 6c 6f 77 20 2a 2f 0a 20 20 69   overflow */.  i
2a30: 6e 74 20 20 6f 76 65 72 66 6c 6f 77 6c 6e 3b 20  nt  overflowln; 
2a40: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
2a50: 6e 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72 74  number for start
2a60: 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 63 6f 64   of overflow cod
2a70: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 61 69  e */.  char *fai
2a80: 6c 75 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  lure;           
2a90: 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75  /* Code to execu
2aa0: 74 65 20 6f 6e 20 70 61 72 73 65 72 20 66 61 69  te on parser fai
2ab0: 6c 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 20 66  lure */.  int  f
2ac0: 61 69 6c 75 72 65 6c 6e 3b 20 20 20 20 20 20 20  ailureln;       
2ad0: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
2ae0: 72 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 66  r for start of f
2af0: 61 69 6c 75 72 65 20 63 6f 64 65 20 2a 2f 0a 20  ailure code */. 
2b00: 20 63 68 61 72 20 2a 61 63 63 65 70 74 3b 20 20   char *accept;  
2b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64            /* Cod
2b20: 65 20 74 6f 20 65 78 65 63 75 74 65 20 77 68 65  e to execute whe
2b30: 6e 20 74 68 65 20 70 61 72 73 65 72 20 65 78 63  n the parser exc
2b40: 65 70 74 73 20 2a 2f 0a 20 20 69 6e 74 20 20 61  epts */.  int  a
2b50: 63 63 65 70 74 6c 6e 3b 20 20 20 20 20 20 20 20  cceptln;        
2b60: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
2b70: 72 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  r for the start 
2b80: 6f 66 20 61 63 63 65 70 74 20 63 6f 64 65 20 2a  of accept code *
2b90: 2f 0a 20 20 63 68 61 72 20 2a 65 78 74 72 61 63  /.  char *extrac
2ba0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ode;         /* 
2bb0: 43 6f 64 65 20 61 70 70 65 6e 64 65 64 20 74 6f  Code appended to
2bc0: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 66   the generated f
2bd0: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 20 65 78  ile */.  int  ex
2be0: 74 72 61 63 6f 64 65 6c 6e 3b 20 20 20 20 20 20  tracodeln;      
2bf0: 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72    /* Line number
2c00: 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
2c10: 66 20 74 68 65 20 65 78 74 72 61 20 63 6f 64 65  f the extra code
2c20: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65   */.  char *toke
2c30: 6e 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 2f  ndest;         /
2c40: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
2c50: 65 20 74 6f 20 64 65 73 74 72 6f 79 20 74 6f 6b  e to destroy tok
2c60: 65 6e 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  en data */.  int
2c70: 20 20 74 6f 6b 65 6e 64 65 73 74 6c 6e 3b 20 20    tokendestln;  
2c80: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
2c90: 6d 62 65 72 20 66 6f 72 20 74 6f 6b 65 6e 20 64  mber for token d
2ca0: 65 73 74 72 6f 79 65 72 20 63 6f 64 65 20 2a 2f  estroyer code */
2cb0: 0a 20 20 63 68 61 72 20 2a 76 61 72 64 65 73 74  .  char *vardest
2cc0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
2cd0: 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65 66 61  ode for the defa
2ce0: 75 6c 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  ult non-terminal
2cf0: 20 64 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20   destructor */. 
2d00: 20 69 6e 74 20 20 76 61 72 64 65 73 74 6c 6e 3b   int  vardestln;
2d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
2d20: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 64 65 66  e number for def
2d30: 61 75 6c 74 20 6e 6f 6e 2d 74 65 72 6d 20 64 65  ault non-term de
2d40: 73 74 72 75 63 74 6f 72 20 63 6f 64 65 2a 2f 0a  structor code*/.
2d50: 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65    char *filename
2d60: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ;          /* Na
2d70: 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  me of the input 
2d80: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2d90: 6f 75 74 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  outname;        
2da0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2db0: 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74  e current output
2dc0: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
2dd0: 2a 74 6f 6b 65 6e 70 72 65 66 69 78 3b 20 20 20  *tokenprefix;   
2de0: 20 20 20 20 2f 2a 20 41 20 70 72 65 66 69 78 20      /* A prefix 
2df0: 61 64 64 65 64 20 74 6f 20 74 6f 6b 65 6e 20 6e  added to token n
2e00: 61 6d 65 73 20 69 6e 20 74 68 65 20 2e 68 20 66  ames in the .h f
2e10: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f  ile */.  int nco
2e20: 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20 20  nflict;         
2e30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2e40: 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73  arsing conflicts
2e50: 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 6c 65 73   */.  int tables
2e60: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ize;           /
2e70: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61  * Size of the pa
2e80: 72 73 65 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  rse tables */.  
2e90: 69 6e 74 20 62 61 73 69 73 66 6c 61 67 3b 20 20  int basisflag;  
2ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 6e           /* Prin
2eb0: 74 20 6f 6e 6c 79 20 62 61 73 69 73 20 63 6f 6e  t only basis con
2ec0: 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20  figurations */. 
2ed0: 20 69 6e 74 20 68 61 73 5f 66 61 6c 6c 62 61 63   int has_fallbac
2ee0: 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  k;        /* Tru
2ef0: 65 20 69 66 20 61 6e 79 20 25 66 61 6c 6c 62 61  e if any %fallba
2f00: 63 6b 20 69 73 20 73 65 65 6e 20 69 6e 20 74 68  ck is seen in th
2f10: 65 20 67 72 61 6d 6d 65 72 20 2a 2f 0a 20 20 63  e grammer */.  c
2f20: 68 61 72 20 2a 61 72 67 76 30 3b 20 20 20 20 20  har *argv0;     
2f30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2f40: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 2a  of the program *
2f50: 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 4d 65  /.};..#define Me
2f60: 6d 6f 72 79 43 68 65 63 6b 28 58 29 20 69 66 28  moryCheck(X) if(
2f70: 28 58 29 3d 3d 30 29 7b 20 5c 0a 20 20 65 78 74  (X)==0){ \.  ext
2f80: 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f  ern void memory_
2f90: 65 72 72 6f 72 28 29 3b 20 5c 0a 20 20 6d 65 6d  error(); \.  mem
2fa0: 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c 0a 7d  ory_error(); \.}
2fb0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
2fc0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
2fd0: 65 20 22 74 61 62 6c 65 2e 68 22 20 2a 2a 2a 2a  e "table.h" ****
2fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
3000: 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e  *.** All code in
3010: 20 74 68 69 73 20 66 69 6c 65 20 68 61 73 20 62   this file has b
3020: 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  een automaticall
3030: 79 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66  y generated.** f
3040: 72 6f 6d 20 61 20 73 70 65 63 69 66 69 63 61 74  rom a specificat
3050: 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  ion in the file.
3060: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3070: 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20  "table.q".** by 
3080: 74 68 65 20 61 73 73 6f 63 69 61 74 69 76 65 20  the associative 
3090: 61 72 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64  array code build
30a0: 69 6e 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67  ing program "aag
30b0: 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65  en"..** Do not e
30c0: 64 69 74 20 74 68 69 73 20 66 69 6c 65 21 20 20  dit this file!  
30d0: 49 6e 73 74 65 61 64 2c 20 65 64 69 74 20 74 68  Instead, edit th
30e0: 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a  e specification.
30f0: 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65  ** file, then re
3100: 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a  run aagen..*/./*
3110: 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f  .** Code for pro
3120: 63 65 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69  cessing tables i
3130: 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
3140: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
3150: 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f  ../* Routines fo
3160: 72 20 68 61 6e 64 6c 69 6e 67 20 61 20 73 74 72  r handling a str
3170: 69 6e 67 73 20 2a 2f 0a 0a 63 68 61 72 20 2a 53  ings */..char *S
3180: 74 72 73 61 66 65 28 29 3b 0a 0a 76 6f 69 64 20  trsafe();..void 
3190: 53 74 72 73 61 66 65 5f 69 6e 69 74 28 2f 2a 20  Strsafe_init(/* 
31a0: 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74 20 53 74  void */);.int St
31b0: 72 73 61 66 65 5f 69 6e 73 65 72 74 28 2f 2a 20  rsafe_insert(/* 
31c0: 63 68 61 72 20 2a 20 2a 2f 29 3b 0a 63 68 61 72  char * */);.char
31d0: 20 2a 53 74 72 73 61 66 65 5f 66 69 6e 64 28 2f   *Strsafe_find(/
31e0: 2a 20 63 68 61 72 20 2a 20 2a 2f 29 3b 0a 0a 2f  * char * */);../
31f0: 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f 72 20 68  * Routines for h
3200: 61 6e 64 6c 69 6e 67 20 73 79 6d 62 6f 6c 73 20  andling symbols 
3210: 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  of the grammar *
3220: 2f 0a 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  /..struct symbol
3230: 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 29 3b 0a   *Symbol_new();.
3240: 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 2f  int Symbolcmpp(/
3250: 2a 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  * struct symbol 
3260: 2a 2a 2c 20 73 74 72 75 63 74 20 73 79 6d 62 6f  **, struct symbo
3270: 6c 20 2a 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 53  l ** */);.void S
3280: 79 6d 62 6f 6c 5f 69 6e 69 74 28 2f 2a 20 76 6f  ymbol_init(/* vo
3290: 69 64 20 2a 2f 29 3b 0a 69 6e 74 20 53 79 6d 62  id */);.int Symb
32a0: 6f 6c 5f 69 6e 73 65 72 74 28 2f 2a 20 73 74 72  ol_insert(/* str
32b0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2c 20 63 68  uct symbol *, ch
32c0: 61 72 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74  ar * */);.struct
32d0: 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
32e0: 66 69 6e 64 28 2f 2a 20 63 68 61 72 20 2a 20 2a  find(/* char * *
32f0: 2f 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  /);.struct symbo
3300: 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 2f 2a  l *Symbol_Nth(/*
3310: 20 69 6e 74 20 2a 2f 29 3b 0a 69 6e 74 20 53 79   int */);.int Sy
3320: 6d 62 6f 6c 5f 63 6f 75 6e 74 28 2f 2a 20 20 2a  mbol_count(/*  *
3330: 2f 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  /);.struct symbo
3340: 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61 79  l **Symbol_array
3350: 6f 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20  of(/*  */);../* 
3360: 52 6f 75 74 69 6e 65 73 20 74 6f 20 6d 61 6e 61  Routines to mana
3370: 67 65 20 74 68 65 20 73 74 61 74 65 20 74 61 62  ge the state tab
3380: 6c 65 20 2a 2f 0a 0a 69 6e 74 20 43 6f 6e 66 69  le */..int Confi
3390: 67 63 6d 70 28 2f 2a 20 73 74 72 75 63 74 20 63  gcmp(/* struct c
33a0: 6f 6e 66 69 67 20 2a 2c 20 73 74 72 75 63 74 20  onfig *, struct 
33b0: 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74  config * */);.st
33c0: 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74  ruct state *Stat
33d0: 65 5f 6e 65 77 28 29 3b 0a 76 6f 69 64 20 53 74  e_new();.void St
33e0: 61 74 65 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64  ate_init(/* void
33f0: 20 2a 2f 29 3b 0a 69 6e 74 20 53 74 61 74 65 5f   */);.int State_
3400: 69 6e 73 65 72 74 28 2f 2a 20 73 74 72 75 63 74  insert(/* struct
3410: 20 73 74 61 74 65 20 2a 2c 20 73 74 72 75 63 74   state *, struct
3420: 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 73   config * */);.s
3430: 74 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61  truct state *Sta
3440: 74 65 5f 66 69 6e 64 28 2f 2a 20 73 74 72 75 63  te_find(/* struc
3450: 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a  t config * */);.
3460: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53  struct state **S
3470: 74 61 74 65 5f 61 72 72 61 79 6f 66 28 2f 2a 20  tate_arrayof(/* 
3480: 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e   */);../* Routin
3490: 65 73 20 75 73 65 64 20 66 6f 72 20 65 66 66 69  es used for effi
34a0: 63 69 65 6e 63 79 20 69 6e 20 43 6f 6e 66 69 67  ciency in Config
34b0: 6c 69 73 74 5f 61 64 64 20 2a 2f 0a 0a 76 6f 69  list_add */..voi
34c0: 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e  d Configtable_in
34d0: 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a  it(/* void */);.
34e0: 69 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  int Configtable_
34f0: 69 6e 73 65 72 74 28 2f 2a 20 73 74 72 75 63 74  insert(/* struct
3500: 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 73   config * */);.s
3510: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
3520: 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 2f  nfigtable_find(/
3530: 2a 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  * struct config 
3540: 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66  * */);.void Conf
3550: 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 2f 2a  igtable_clear(/*
3560: 20 69 6e 74 28 2a 29 28 73 74 72 75 63 74 20 63   int(*)(struct c
3570: 6f 6e 66 69 67 20 2a 29 20 2a 2f 29 3b 0a 2f 2a  onfig *) */);./*
3580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3590: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
35a0: 22 61 63 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a  "action.c" *****
35b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
35d0: 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65  * Routines proce
35e0: 73 73 69 6e 67 20 70 61 72 73 65 72 20 61 63 74  ssing parser act
35f0: 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  ions in the LEMO
3600: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
3610: 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 63  or..*/../* Alloc
3620: 61 74 65 20 61 20 6e 65 77 20 70 61 72 73 65 72  ate a new parser
3630: 20 61 63 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69   action */.stati
3640: 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  c struct action 
3650: 2a 41 63 74 69 6f 6e 5f 6e 65 77 28 76 6f 69 64  *Action_new(void
3660: 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  ){.  static stru
3670: 63 74 20 61 63 74 69 6f 6e 20 2a 66 72 65 65 6c  ct action *freel
3680: 69 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  ist = 0;.  struc
3690: 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 3b 0a 0a  t action *new;..
36a0: 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d    if( freelist==
36b0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
36c0: 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30      int amt = 10
36d0: 30 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20  0;.    freelist 
36e0: 3d 20 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  = (struct action
36f0: 20 2a 29 63 61 6c 6c 6f 63 28 61 6d 74 2c 20 73   *)calloc(amt, s
3700: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 61 63 74  izeof(struct act
3710: 69 6f 6e 29 29 3b 0a 20 20 20 20 69 66 28 20 66  ion));.    if( f
3720: 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reelist==0 ){.  
3730: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
3740: 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c  rr,"Unable to al
3750: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
3760: 72 20 61 20 6e 65 77 20 70 61 72 73 65 72 20 61  r a new parser a
3770: 63 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20  ction.");.      
3780: 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20  exit(1);.    }. 
3790: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d     for(i=0; i<am
37a0: 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69  t-1; i++) freeli
37b0: 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72  st[i].next = &fr
37c0: 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20  eelist[i+1];.   
37d0: 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d   freelist[amt-1]
37e0: 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  .next = 0;.  }. 
37f0: 20 6e 65 77 20 3d 20 66 72 65 65 6c 69 73 74 3b   new = freelist;
3800: 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72  .  freelist = fr
3810: 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20  eelist->next;.  
3820: 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f  return new;.}../
3830: 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 61 63  * Compare two ac
3840: 74 69 6f 6e 73 20 66 6f 72 20 73 6f 72 74 69 6e  tions for sortin
3850: 67 20 70 75 72 70 6f 73 65 73 2e 20 20 52 65 74  g purposes.  Ret
3860: 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
3870: 72 6f 2c 20 6f 72 0a 2a 2a 20 70 6f 73 69 74 69  ro, or.** positi
3880: 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74 20  ve if the first 
3890: 61 63 74 69 6f 6e 20 69 73 20 6c 65 73 73 20 74  action is less t
38a0: 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
38b0: 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a  r greater than.*
38c0: 2a 20 74 68 65 20 66 69 72 73 74 0a 2a 2f 0a 73  * the first.*/.s
38d0: 74 61 74 69 63 20 69 6e 74 20 61 63 74 69 6f 6e  tatic int action
38e0: 63 6d 70 28 0a 20 20 73 74 72 75 63 74 20 61 63  cmp(.  struct ac
38f0: 74 69 6f 6e 20 2a 61 70 31 2c 0a 20 20 73 74 72  tion *ap1,.  str
3900: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 32 0a  uct action *ap2.
3910: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  ){.  int rc;.  r
3920: 63 20 3d 20 61 70 31 2d 3e 73 70 2d 3e 69 6e 64  c = ap1->sp->ind
3930: 65 78 20 2d 20 61 70 32 2d 3e 73 70 2d 3e 69 6e  ex - ap2->sp->in
3940: 64 65 78 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  dex;.  if( rc==0
3950: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 28 69 6e   ){.    rc = (in
3960: 74 29 61 70 31 2d 3e 74 79 70 65 20 2d 20 28 69  t)ap1->type - (i
3970: 6e 74 29 61 70 32 2d 3e 74 79 70 65 3b 0a 20 20  nt)ap2->type;.  
3980: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 26 26  }.  if( rc==0 &&
3990: 20 61 70 31 2d 3e 74 79 70 65 3d 3d 52 45 44 55   ap1->type==REDU
39a0: 43 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 61  CE ){.    rc = a
39b0: 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20  p1->x.rp->index 
39c0: 2d 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69 6e 64  - ap2->x.rp->ind
39d0: 65 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ex;.  }.  return
39e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20   rc;.}../* Sort 
39f0: 70 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20 2a  parser actions *
3a00: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
3a10: 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73  action *Action_s
3a20: 6f 72 74 28 0a 20 20 73 74 72 75 63 74 20 61 63  ort(.  struct ac
3a30: 74 69 6f 6e 20 2a 61 70 0a 29 7b 0a 20 20 61 70  tion *ap.){.  ap
3a40: 20 3d 20 28 73 74 72 75 63 74 20 61 63 74 69 6f   = (struct actio
3a50: 6e 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20  n *)msort((char 
3a60: 2a 29 61 70 2c 28 63 68 61 72 20 2a 2a 29 26 61  *)ap,(char **)&a
3a70: 70 2d 3e 6e 65 78 74 2c 0a 20 20 20 20 20 20 20  p->next,.       
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 20 20 20 20 20 28 69 6e 74 28 2a 29 28 63         (int(*)(c
3aa0: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
3ab0: 20 63 68 61 72 2a 29 29 61 63 74 69 6f 6e 63 6d   char*))actioncm
3ac0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 70 3b  p);.  return ap;
3ad0: 0a 7d 0a 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f  .}..void Action_
3ae0: 61 64 64 28 61 70 70 2c 74 79 70 65 2c 73 70 2c  add(app,type,sp,
3af0: 61 72 67 29 0a 73 74 72 75 63 74 20 61 63 74 69  arg).struct acti
3b00: 6f 6e 20 2a 2a 61 70 70 3b 0a 65 6e 75 6d 20 65  on **app;.enum e
3b10: 5f 61 63 74 69 6f 6e 20 74 79 70 65 3b 0a 73 74  _action type;.st
3b20: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
3b30: 0a 63 68 61 72 20 2a 61 72 67 3b 0a 7b 0a 20 20  .char *arg;.{.  
3b40: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e  struct action *n
3b50: 65 77 3b 0a 20 20 6e 65 77 20 3d 20 41 63 74 69  ew;.  new = Acti
3b60: 6f 6e 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77 2d  on_new();.  new-
3b70: 3e 6e 65 78 74 20 3d 20 2a 61 70 70 3b 0a 20 20  >next = *app;.  
3b80: 2a 61 70 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65  *app = new;.  ne
3b90: 77 2d 3e 74 79 70 65 20 3d 20 74 79 70 65 3b 0a  w->type = type;.
3ba0: 20 20 6e 65 77 2d 3e 73 70 20 3d 20 73 70 3b 0a    new->sp = sp;.
3bb0: 20 20 69 66 28 20 74 79 70 65 3d 3d 53 48 49 46    if( type==SHIF
3bc0: 54 20 29 7b 0a 20 20 20 20 6e 65 77 2d 3e 78 2e  T ){.    new->x.
3bd0: 73 74 70 20 3d 20 28 73 74 72 75 63 74 20 73 74  stp = (struct st
3be0: 61 74 65 20 2a 29 61 72 67 3b 0a 20 20 7d 65 6c  ate *)arg;.  }el
3bf0: 73 65 7b 0a 20 20 20 20 6e 65 77 2d 3e 78 2e 72  se{.    new->x.r
3c00: 70 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65  p = (struct rule
3c10: 20 2a 29 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f 2a   *)arg;.  }.}./*
3c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3c30: 2a 2a 2a 2a 2a 20 4e 65 77 20 63 6f 64 65 20 74  ***** New code t
3c40: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
3c50: 22 61 63 74 74 61 62 22 20 6d 6f 64 75 6c 65 20  "acttab" module 
3c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
3c70: 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69  ** This module i
3c80: 6d 70 6c 65 6d 65 6e 74 73 20 72 6f 75 74 69 6e  mplements routin
3c90: 65 73 20 75 73 65 20 74 6f 20 63 6f 6e 73 74 72  es use to constr
3ca0: 75 63 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f  uct the yy_actio
3cb0: 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f  n[] table..*/../
3cc0: 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65 20 6f  *.** The state o
3cd0: 66 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20  f the yy_action 
3ce0: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
3cf0: 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6e 20 69  truction is an i
3d00: 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68  nstance of.** th
3d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
3d20: 63 74 75 72 65 0a 2a 2f 0a 74 79 70 65 64 65 66  cture.*/.typedef
3d30: 20 73 74 72 75 63 74 20 61 63 74 74 61 62 20 61   struct acttab a
3d40: 63 74 74 61 62 3b 0a 73 74 72 75 63 74 20 61 63  cttab;.struct ac
3d50: 74 74 61 62 20 7b 0a 20 20 69 6e 74 20 6e 41 63  ttab {.  int nAc
3d60: 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tion;           
3d70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3d80: 6f 66 20 75 73 65 64 20 73 6c 6f 74 73 20 69 6e  of used slots in
3d90: 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20   aAction[] */.  
3da0: 69 6e 74 20 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63  int nActionAlloc
3db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3dc0: 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20  Slots allocated 
3dd0: 66 6f 72 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f  for aAction[] */
3de0: 0a 20 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  .  struct {.    
3df0: 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 3b 20 20  int lookahead;  
3e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
3e10: 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61  lue of the looka
3e20: 68 65 61 64 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  head token */.  
3e30: 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 20 20 20    int action;   
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3e50: 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 6f  Action to take o
3e60: 6e 20 74 68 65 20 67 69 76 65 6e 20 6c 6f 6f 6b  n the given look
3e70: 61 68 65 61 64 20 2a 2f 0a 20 20 7d 20 2a 61 41  ahead */.  } *aA
3e80: 63 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  ction,          
3e90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 79          /* The y
3ea0: 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65  y_action[] table
3eb0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
3ec0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 2a 61 4c 6f 6f  ion */.    *aLoo
3ed0: 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20  kahead;         
3ee0: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
3ef0: 65 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  e new transactio
3f00: 6e 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6d  n set */.  int m
3f10: 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20  nLookahead;     
3f20: 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d          /* Minim
3f30: 75 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e  um aLookahead[].
3f40: 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69  lookahead */.  i
3f50: 6e 74 20 6d 6e 41 63 74 69 6f 6e 3b 20 20 20 20  nt mnAction;    
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
3f70: 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64  ction associated
3f80: 20 77 69 74 68 20 6d 6e 4c 6f 6f 6b 61 68 65 61   with mnLookahea
3f90: 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 4c 6f 6f  d */.  int mxLoo
3fa0: 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20  kahead;         
3fb0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
3fc0: 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b  Lookahead[].look
3fd0: 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ahead */.  int n
3fe0: 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  Lookahead;      
3ff0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
4000: 73 6c 6f 74 73 20 69 6e 20 61 4c 6f 6f 6b 61 68  slots in aLookah
4010: 65 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ead[] */.  int n
4020: 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 3b 20  LookaheadAlloc; 
4030: 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73          /* Slots
4040: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61 4c   allocated in aL
4050: 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 7d 3b  ookahead[] */.};
4060: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ../* Return the 
4070: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
4080: 73 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74 69  s in the yy_acti
4090: 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66  on table */.#def
40a0: 69 6e 65 20 61 63 74 74 61 62 5f 73 69 7a 65 28  ine acttab_size(
40b0: 58 29 20 28 28 58 29 2d 3e 6e 41 63 74 69 6f 6e  X) ((X)->nAction
40c0: 29 0a 0a 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  )../* The value 
40d0: 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 65 6e 74  for the N-th ent
40e0: 72 79 20 69 6e 20 79 79 5f 61 63 74 69 6f 6e 20  ry in yy_action 
40f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61  */.#define actta
4100: 62 5f 79 79 61 63 74 69 6f 6e 28 58 2c 4e 29 20  b_yyaction(X,N) 
4110: 20 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e   ((X)->aAction[N
4120: 5d 2e 61 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68  ].action)../* Th
4130: 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
4140: 4e 2d 74 68 20 65 6e 74 72 79 20 69 6e 20 79 79  N-th entry in yy
4150: 5f 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 23 64  _lookahead */.#d
4160: 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79 79 6c  efine acttab_yyl
4170: 6f 6f 6b 61 68 65 61 64 28 58 2c 4e 29 20 20 28  ookahead(X,N)  (
4180: 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e  (X)->aAction[N].
4190: 6c 6f 6f 6b 61 68 65 61 64 29 0a 0a 2f 2a 20 46  lookahead)../* F
41a0: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
41b0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
41c0: 68 65 20 67 69 76 65 6e 20 61 63 74 74 61 62 20  he given acttab 
41d0: 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 66  */.void acttab_f
41e0: 72 65 65 28 61 63 74 74 61 62 20 2a 70 29 7b 0a  ree(acttab *p){.
41f0: 20 20 66 72 65 65 28 20 70 2d 3e 61 41 63 74 69    free( p->aActi
4200: 6f 6e 20 29 3b 0a 20 20 66 72 65 65 28 20 70 2d  on );.  free( p-
4210: 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 29 3b 0a 20  >aLookahead );. 
4220: 20 66 72 65 65 28 20 70 20 29 3b 0a 7d 0a 0a 2f   free( p );.}../
4230: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
4240: 20 61 63 74 74 61 62 20 73 74 72 75 63 74 75 72   acttab structur
4250: 65 20 2a 2f 0a 61 63 74 74 61 62 20 2a 61 63 74  e */.acttab *act
4260: 74 61 62 5f 61 6c 6c 6f 63 28 76 6f 69 64 29 7b  tab_alloc(void){
4270: 0a 20 20 61 63 74 74 61 62 20 2a 70 20 3d 20 63  .  acttab *p = c
4280: 61 6c 6c 6f 63 28 20 31 2c 20 73 69 7a 65 6f 66  alloc( 1, sizeof
4290: 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
42a0: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
42b0: 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65  f(stderr,"Unable
42c0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
42d0: 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 61 63  ory for a new ac
42e0: 74 74 61 62 2e 22 29 3b 0a 20 20 20 20 65 78 69  ttab.");.    exi
42f0: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  t(1);.  }.  mems
4300: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
4310: 2a 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  *p));.  return p
4320: 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65  ;.}../* Add a ne
4330: 77 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  w action to the 
4340: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
4350: 69 6f 6e 20 73 65 74 0a 2a 2f 0a 76 6f 69 64 20  ion set.*/.void 
4360: 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 61 63  acttab_action(ac
4370: 74 74 61 62 20 2a 70 2c 20 69 6e 74 20 6c 6f 6f  ttab *p, int loo
4380: 6b 61 68 65 61 64 2c 20 69 6e 74 20 61 63 74 69  kahead, int acti
4390: 6f 6e 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  on){.  if( p->nL
43a0: 6f 6f 6b 61 68 65 61 64 3e 3d 70 2d 3e 6e 4c 6f  ookahead>=p->nLo
43b0: 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29 7b 0a  okaheadAlloc ){.
43c0: 20 20 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61      p->nLookahea
43d0: 64 41 6c 6c 6f 63 20 2b 3d 20 32 35 3b 0a 20 20  dAlloc += 25;.  
43e0: 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20    p->aLookahead 
43f0: 3d 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 4c  = realloc( p->aL
4400: 6f 6f 6b 61 68 65 61 64 2c 0a 20 20 20 20 20 20  ookahead,.      
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4420: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 2d         sizeof(p-
4430: 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 30 5d 29 2a  >aLookahead[0])*
4440: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c  p->nLookaheadAll
4450: 6f 63 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  oc );.    if( p-
4460: 3e 61 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30 20 29  >aLookahead==0 )
4470: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
4480: 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66  stderr,"malloc f
4490: 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20  ailed\n");.     
44a0: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
44b0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f    }.  if( p->nLo
44c0: 6f 6b 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20  okahead==0 ){.  
44d0: 20 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64    p->mxLookahead
44e0: 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20   = lookahead;.  
44f0: 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64    p->mnLookahead
4500: 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20   = lookahead;.  
4510: 20 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20    p->mnAction = 
4520: 61 63 74 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b  action;.  }else{
4530: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 78 4c 6f  .    if( p->mxLo
4540: 6f 6b 61 68 65 61 64 3c 6c 6f 6f 6b 61 68 65 61  okahead<lookahea
4550: 64 20 29 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65  d ) p->mxLookahe
4560: 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a  ad = lookahead;.
4570: 20 20 20 20 69 66 28 20 70 2d 3e 6d 6e 4c 6f 6f      if( p->mnLoo
4580: 6b 61 68 65 61 64 3e 6c 6f 6f 6b 61 68 65 61 64  kahead>lookahead
4590: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 4c   ){.      p->mnL
45a0: 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61  ookahead = looka
45b0: 68 65 61 64 3b 0a 20 20 20 20 20 20 70 2d 3e 6d  head;.      p->m
45c0: 6e 41 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e  nAction = action
45d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d  ;.    }.  }.  p-
45e0: 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e  >aLookahead[p->n
45f0: 4c 6f 6f 6b 61 68 65 61 64 5d 2e 6c 6f 6f 6b 61  Lookahead].looka
4600: 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64  head = lookahead
4610: 3b 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  ;.  p->aLookahea
4620: 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d  d[p->nLookahead]
4630: 2e 61 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e  .action = action
4640: 3b 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  ;.  p->nLookahea
4650: 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  d++;.}../*.** Ad
4660: 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
4670: 6e 20 73 65 74 20 62 75 69 6c 74 20 75 70 20 77  n set built up w
4680: 69 74 68 20 70 72 69 6f 72 20 63 61 6c 6c 73 20  ith prior calls 
4690: 74 6f 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e  to acttab_action
46a0: 28 29 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 63  ().** into the c
46b0: 75 72 72 65 6e 74 20 61 63 74 69 6f 6e 20 74 61  urrent action ta
46c0: 62 6c 65 2e 20 20 54 68 65 6e 20 72 65 73 65 74  ble.  Then reset
46d0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
46e0: 20 73 65 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20   set back.** to 
46f0: 61 6e 20 65 6d 70 74 79 20 73 65 74 20 69 6e 20  an empty set in 
4700: 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 20  preparation for 
4710: 61 20 6e 65 77 20 72 6f 75 6e 64 20 6f 66 20 61  a new round of a
4720: 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 29 20 63  cttab_action() c
4730: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  alls..**.** Retu
4740: 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  rn the offset in
4750: 74 6f 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  to the action ta
4760: 62 6c 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ble of the new t
4770: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ransaction..*/.i
4780: 6e 74 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74  nt acttab_insert
4790: 28 61 63 74 74 61 62 20 2a 70 29 7b 0a 20 20 69  (acttab *p){.  i
47a0: 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20  nt i, j, k, n;. 
47b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4c 6f 6f   assert( p->nLoo
47c0: 6b 61 68 65 61 64 3e 30 20 29 3b 0a 0a 20 20 2f  kahead>0 );..  /
47d0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
47e0: 61 76 65 20 65 6e 6f 75 67 68 20 73 70 61 63 65  ave enough space
47f0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 78 70   to hold the exp
4800: 61 6e 64 65 64 20 61 63 74 69 6f 6e 20 74 61 62  anded action tab
4810: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 77  le.  ** in the w
4820: 6f 72 73 74 20 63 61 73 65 2e 20 20 54 68 65 20  orst case.  The 
4830: 77 6f 72 73 74 20 63 61 73 65 20 6f 63 63 75 72  worst case occur
4840: 73 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  s if the transac
4850: 74 69 6f 6e 20 73 65 74 0a 20 20 2a 2a 20 6d 75  tion set.  ** mu
4860: 73 74 20 62 65 20 61 70 70 65 6e 64 65 64 20 74  st be appended t
4870: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 63  o the current ac
4880: 74 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  tion table.  */.
4890: 20 20 6e 20 3d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61    n = p->mxLooka
48a0: 68 65 61 64 20 2b 20 31 3b 0a 20 20 69 66 28 20  head + 1;.  if( 
48b0: 70 2d 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e 20 3e  p->nAction + n >
48c0: 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  = p->nActionAllo
48d0: 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64  c ){.    int old
48e0: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69  Alloc = p->nActi
48f0: 6f 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 70 2d 3e  onAlloc;.    p->
4900: 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 3d 20 70  nActionAlloc = p
4910: 2d 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e 20 2b 20  ->nAction + n + 
4920: 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20  p->nActionAlloc 
4930: 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 61 41 63  + 20;.    p->aAc
4940: 74 69 6f 6e 20 3d 20 72 65 61 6c 6c 6f 63 28 20  tion = realloc( 
4950: 70 2d 3e 61 41 63 74 69 6f 6e 2c 0a 20 20 20 20  p->aAction,.    
4960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4970: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e        sizeof(p->
4980: 61 41 63 74 69 6f 6e 5b 30 5d 29 2a 70 2d 3e 6e  aAction[0])*p->n
4990: 41 63 74 69 6f 6e 41 6c 6c 6f 63 29 3b 0a 20 20  ActionAlloc);.  
49a0: 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e    if( p->aAction
49b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
49c0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c  intf(stderr,"mal
49d0: 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a  loc failed\n");.
49e0: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
49f0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6f     }.    for(i=o
4a00: 6c 64 41 6c 6c 6f 63 3b 20 69 3c 70 2d 3e 6e 41  ldAlloc; i<p->nA
4a10: 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 69 2b 2b 29  ctionAlloc; i++)
4a20: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69  {.      p->aActi
4a30: 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20  on[i].lookahead 
4a40: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 61  = -1;.      p->a
4a50: 41 63 74 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e  Action[i].action
4a60: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d   = -1;.    }.  }
4a70: 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20  ..  /* Scan the 
4a80: 65 78 69 73 74 69 6e 67 20 61 63 74 69 6f 6e 20  existing action 
4a90: 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  table looking fo
4aa0: 72 20 61 6e 20 6f 66 66 73 65 74 20 77 68 65 72  r an offset wher
4ab0: 65 20 77 65 20 63 61 6e 0a 20 20 2a 2a 20 69 6e  e we can.  ** in
4ac0: 73 65 72 74 20 74 68 65 20 63 75 72 72 65 6e 74  sert the current
4ad0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
4ae0: 2e 20 20 46 61 6c 6c 20 6f 75 74 20 6f 66 20 74  .  Fall out of t
4af0: 68 65 20 6c 6f 6f 70 20 77 68 65 6e 20 74 68 61  he loop when tha
4b00: 74 0a 20 20 2a 2a 20 6f 66 66 73 65 74 20 69 73  t.  ** offset is
4b10: 20 66 6f 75 6e 64 2e 20 20 49 6e 20 74 68 65 20   found.  In the 
4b20: 77 6f 72 73 74 20 63 61 73 65 2c 20 77 65 20 66  worst case, we f
4b30: 61 6c 6c 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  all out of the l
4b40: 6f 6f 70 20 77 68 65 6e 0a 20 20 2a 2a 20 69 20  oop when.  ** i 
4b50: 72 65 61 63 68 65 73 20 70 2d 3e 6e 41 63 74 69  reaches p->nActi
4b60: 6f 6e 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  on, which means 
4b70: 77 65 20 61 70 70 65 6e 64 20 74 68 65 20 6e 65  we append the ne
4b80: 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  w transaction se
4b90: 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 20 69  t..  **.  ** i i
4ba0: 73 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70  s the index in p
4bb0: 2d 3e 61 41 63 74 69 6f 6e 5b 5d 20 77 68 65 72  ->aAction[] wher
4bc0: 65 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  e p->mnLookahead
4bd0: 20 69 73 20 69 6e 73 65 72 74 65 64 2e 0a 20 20   is inserted..  
4be0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
4bf0: 70 2d 3e 6e 41 63 74 69 6f 6e 2b 70 2d 3e 6d 6e  p->nAction+p->mn
4c00: 4c 6f 6f 6b 61 68 65 61 64 3b 20 69 2b 2b 29 7b  Lookahead; i++){
4c10: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74  .    if( p->aAct
4c20: 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[i].lookahead
4c30: 3c 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  <0 ){.      for(
4c40: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61  j=0; j<p->nLooka
4c50: 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  head; j++){.    
4c60: 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b      k = p->aLook
4c70: 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65  ahead[j].lookahe
4c80: 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68  ad - p->mnLookah
4c90: 65 61 64 20 2b 20 69 3b 0a 20 20 20 20 20 20 20  ead + i;.       
4ca0: 20 69 66 28 20 6b 3c 30 20 29 20 62 72 65 61 6b   if( k<0 ) break
4cb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
4cc0: 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b  >aAction[k].look
4cd0: 61 68 65 61 64 3e 3d 30 20 29 20 62 72 65 61 6b  ahead>=0 ) break
4ce0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4cf0: 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68  if( j<p->nLookah
4d00: 65 61 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ead ) continue;.
4d10: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
4d20: 3c 70 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b  <p->nAction; j++
4d30: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
4d40: 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f  ->aAction[j].loo
4d50: 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c  kahead==j+p->mnL
4d60: 6f 6f 6b 61 68 65 61 64 2d 69 20 29 20 62 72 65  ookahead-i ) bre
4d70: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4d80: 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 41 63 74    if( j==p->nAct
4d90: 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ion ){.        b
4da0: 72 65 61 6b 3b 20 20 2f 2a 20 46 69 74 73 20 69  reak;  /* Fits i
4db0: 6e 20 65 6d 70 74 79 20 73 6c 6f 74 73 20 2a 2f  n empty slots */
4dc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
4dd0: 73 65 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f  se if( p->aActio
4de0: 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d  n[i].lookahead==
4df0: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  p->mnLookahead )
4e00: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  {.      if( p->a
4e10: 41 63 74 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e  Action[i].action
4e20: 21 3d 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 29 20  !=p->mnAction ) 
4e30: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
4e40: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c  for(j=0; j<p->nL
4e50: 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a  ookahead; j++){.
4e60: 20 20 20 20 20 20 20 20 6b 20 3d 20 70 2d 3e 61          k = p->a
4e70: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f  Lookahead[j].loo
4e80: 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f  kahead - p->mnLo
4e90: 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20  okahead + i;.   
4ea0: 20 20 20 20 20 69 66 28 20 6b 3c 30 20 7c 7c 20       if( k<0 || 
4eb0: 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20  k>=p->nAction ) 
4ec0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
4ed0: 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  f( p->aLookahead
4ee0: 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 21 3d 70  [j].lookahead!=p
4ef0: 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f  ->aAction[k].loo
4f00: 6b 61 68 65 61 64 20 29 20 62 72 65 61 6b 3b 0a  kahead ) break;.
4f10: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
4f20: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 61 63 74  Lookahead[j].act
4f30: 69 6f 6e 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b  ion!=p->aAction[
4f40: 6b 5d 2e 61 63 74 69 6f 6e 20 29 20 62 72 65 61  k].action ) brea
4f50: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4f60: 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61   if( j<p->nLooka
4f70: 68 65 61 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  head ) continue;
4f80: 0a 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20  .      n = 0;.  
4f90: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
4fa0: 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b  ->nAction; j++){
4fb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
4fc0: 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61  aAction[j].looka
4fd0: 68 65 61 64 3c 30 20 29 20 63 6f 6e 74 69 6e 75  head<0 ) continu
4fe0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
4ff0: 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f  ->aAction[j].loo
5000: 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c  kahead==j+p->mnL
5010: 6f 6f 6b 61 68 65 61 64 2d 69 20 29 20 6e 2b 2b  ookahead-i ) n++
5020: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5030: 69 66 28 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b 61  if( n==p->nLooka
5040: 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20  head ){.        
5050: 62 72 65 61 6b 3b 20 20 2f 2a 20 53 61 6d 65 20  break;  /* Same 
5060: 61 73 20 61 20 70 72 69 6f 72 20 74 72 61 6e 73  as a prior trans
5070: 61 63 74 69 6f 6e 20 73 65 74 20 2a 2f 0a 20 20  action set */.  
5080: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5090: 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 72 61 6e    /* Insert tran
50a0: 73 61 63 74 69 6f 6e 20 73 65 74 20 61 74 20 69  saction set at i
50b0: 6e 64 65 78 20 69 2e 20 2a 2f 0a 20 20 66 6f 72  ndex i. */.  for
50c0: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b  (j=0; j<p->nLook
50d0: 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ahead; j++){.   
50e0: 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65   k = p->aLookahe
50f0: 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20  ad[j].lookahead 
5100: 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  - p->mnLookahead
5110: 20 2b 20 69 3b 0a 20 20 20 20 70 2d 3e 61 41 63   + i;.    p->aAc
5120: 74 69 6f 6e 5b 6b 5d 20 3d 20 70 2d 3e 61 4c 6f  tion[k] = p->aLo
5130: 6f 6b 61 68 65 61 64 5b 6a 5d 3b 0a 20 20 20 20  okahead[j];.    
5140: 69 66 28 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f  if( k>=p->nActio
5150: 6e 20 29 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 3d  n ) p->nAction =
5160: 20 6b 2b 31 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e   k+1;.  }.  p->n
5170: 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 30 3b 0a 0a  Lookahead = 0;..
5180: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
5190: 6f 66 66 73 65 74 20 74 68 61 74 20 69 73 20 61  offset that is a
51a0: 64 64 65 64 20 74 6f 20 74 68 65 20 6c 6f 6f 6b  dded to the look
51b0: 61 68 65 61 64 20 69 6e 20 6f 72 64 65 72 20 74  ahead in order t
51c0: 6f 20 67 65 74 20 74 68 65 0a 20 20 2a 2a 20 69  o get the.  ** i
51d0: 6e 64 65 78 20 69 6e 74 6f 20 79 79 5f 61 63 74  ndex into yy_act
51e0: 69 6f 6e 20 6f 66 20 74 68 65 20 61 63 74 69 6f  ion of the actio
51f0: 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 69 20  n */.  return i 
5200: 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  - p->mnLookahead
5210: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
5220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
5230: 6d 20 74 68 65 20 66 69 6c 65 20 22 62 75 69 6c  m the file "buil
5240: 64 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  d.c" ***********
5250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5260: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  **/./*.** Routin
5270: 65 73 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 69  es to constructi
5280: 6f 6e 20 74 68 65 20 66 69 6e 69 74 65 20 73 74  on the finite st
5290: 61 74 65 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ate machine for 
52a0: 74 68 65 20 4c 45 4d 4f 4e 0a 2a 2a 20 70 61 72  the LEMON.** par
52b0: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
52c0: 2f 0a 0a 2f 2a 20 46 69 6e 64 20 61 20 70 72 65  /../* Find a pre
52d0: 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6f  cedence symbol o
52e0: 66 20 65 76 65 72 79 20 72 75 6c 65 20 69 6e 20  f every rule in 
52f0: 74 68 65 20 67 72 61 6d 6d 61 72 2e 0a 2a 2a 20  the grammar..** 
5300: 0a 2a 2a 20 54 68 6f 73 65 20 72 75 6c 65 73 20  .** Those rules 
5310: 77 68 69 63 68 20 68 61 76 65 20 61 20 70 72 65  which have a pre
5320: 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 63  cedence symbol c
5330: 6f 64 65 64 20 69 6e 20 74 68 65 20 69 6e 70 75  oded in the inpu
5340: 74 0a 2a 2a 20 67 72 61 6d 6d 61 72 20 75 73 69  t.** grammar usi
5350: 6e 67 20 74 68 65 20 22 5b 73 79 6d 62 6f 6c 5d  ng the "[symbol]
5360: 22 20 63 6f 6e 73 74 72 75 63 74 20 77 69 6c 6c  " construct will
5370: 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 74 68   already have th
5380: 65 0a 2a 2a 20 72 70 2d 3e 70 72 65 63 73 79 6d  e.** rp->precsym
5390: 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 2e 20 20   field filled.  
53a0: 4f 74 68 65 72 20 72 75 6c 65 73 20 74 61 6b 65  Other rules take
53b0: 20 61 73 20 74 68 65 69 72 20 70 72 65 63 65 64   as their preced
53c0: 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 74  ence.** symbol t
53d0: 68 65 20 66 69 72 73 74 20 52 48 53 20 73 79 6d  he first RHS sym
53e0: 62 6f 6c 20 77 69 74 68 20 61 20 64 65 66 69 6e  bol with a defin
53f0: 65 64 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20  ed precedence.  
5400: 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
5410: 6e 6f 74 20 52 48 53 20 73 79 6d 62 6f 6c 73 20  not RHS symbols 
5420: 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 70  with a defined p
5430: 72 65 63 65 64 65 6e 63 65 2c 20 74 68 65 20 70  recedence, the p
5440: 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d  recedence.** sym
5450: 62 6f 6c 20 66 69 65 6c 64 20 69 73 20 6c 65 66  bol field is lef
5460: 74 20 62 6c 61 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64  t blank..*/.void
5470: 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65   FindRulePrecede
5480: 6e 63 65 73 28 78 70 29 0a 73 74 72 75 63 74 20  nces(xp).struct 
5490: 6c 65 6d 6f 6e 20 2a 78 70 3b 0a 7b 0a 20 20 73  lemon *xp;.{.  s
54a0: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
54b0: 20 20 66 6f 72 28 72 70 3d 78 70 2d 3e 72 75 6c    for(rp=xp->rul
54c0: 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
54d0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d  xt){.    if( rp-
54e0: 3e 70 72 65 63 73 79 6d 3d 3d 30 20 29 7b 0a 20  >precsym==0 ){. 
54f0: 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
5500: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5510: 72 70 2d 3e 6e 72 68 73 20 26 26 20 72 70 2d 3e  rp->nrhs && rp->
5520: 70 72 65 63 73 79 6d 3d 3d 30 3b 20 69 2b 2b 29  precsym==0; i++)
5530: 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
5540: 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70   symbol *sp = rp
5550: 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20  ->rhs[i];.      
5560: 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
5570: 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
5580: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
5590: 3d 30 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79  =0; j<sp->nsubsy
55a0: 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; j++){.       
55b0: 20 20 20 20 20 69 66 28 20 73 70 2d 3e 73 75 62       if( sp->sub
55c0: 73 79 6d 5b 6a 5d 2d 3e 70 72 65 63 3e 3d 30 20  sym[j]->prec>=0 
55d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
55e0: 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 73   rp->precsym = s
55f0: 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 3b 0a 20 20  p->subsym[j];.  
5600: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
5610: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
5620: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5630: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
5640: 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20  p->prec>=0 ){.  
5650: 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63          rp->prec
5660: 73 79 6d 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d  sym = rp->rhs[i]
5670: 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20  ;..}.      }.   
5680: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b   }.  }.  return;
5690: 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61 6c 6c 20  .}../* Find all 
56a0: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69  nonterminals whi
56b0: 63 68 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ch will generate
56c0: 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e   the empty strin
56d0: 67 2e 0a 2a 2a 20 54 68 65 6e 20 67 6f 20 62 61  g..** Then go ba
56e0: 63 6b 20 61 6e 64 20 63 6f 6d 70 75 74 65 20 74  ck and compute t
56f0: 68 65 20 66 69 72 73 74 20 73 65 74 73 20 6f 66  he first sets of
5700: 20 65 76 65 72 79 20 6e 6f 6e 74 65 72 6d 69 6e   every nontermin
5710: 61 6c 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  al..** The first
5720: 20 73 65 74 20 69 73 20 74 68 65 20 73 65 74 20   set is the set 
5730: 6f 66 20 61 6c 6c 20 74 65 72 6d 69 6e 61 6c 20  of all terminal 
5740: 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61  symbols which ca
5750: 6e 20 62 65 67 69 6e 0a 2a 2a 20 61 20 73 74 72  n begin.** a str
5760: 69 6e 67 20 67 65 6e 65 72 61 74 65 64 20 62 79  ing generated by
5770: 20 74 68 61 74 20 6e 6f 6e 74 65 72 6d 69 6e 61   that nontermina
5780: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46  l..*/.void FindF
5790: 69 72 73 74 53 65 74 73 28 6c 65 6d 70 29 0a 73  irstSets(lemp).s
57a0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
57b0: 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  p;.{.  int i, j;
57c0: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
57d0: 72 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65  rp;.  int progre
57e0: 73 73 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ss;..  for(i=0; 
57f0: 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
5800: 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d   i++){.    lemp-
5810: 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d  >symbols[i]->lam
5820: 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53  bda = LEMON_FALS
5830: 45 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6c  E;.  }.  for(i=l
5840: 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
5850: 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
5860: 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d   i++){.    lemp-
5870: 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 66 69 72  >symbols[i]->fir
5880: 73 74 73 65 74 20 3d 20 53 65 74 4e 65 77 28 29  stset = SetNew()
5890: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73  ;.  }..  /* Firs
58a0: 74 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20 6c 61  t compute all la
58b0: 6d 62 64 61 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20  mbdas */.  do{. 
58c0: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b     progress = 0;
58d0: 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  .    for(rp=lemp
58e0: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
58f0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
5900: 69 66 28 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d  if( rp->lhs->lam
5910: 62 64 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  bda ) continue;.
5920: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
5930: 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
5940: 0a 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74  .         struct
5950: 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70   symbol *sp = rp
5960: 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20  ->rhs[i];.      
5970: 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 21     if( sp->type!
5980: 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d  =TERMINAL || sp-
5990: 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46  >lambda==LEMON_F
59a0: 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 20 20  ALSE ) break;.  
59b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
59c0: 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20  i==rp->nrhs ){. 
59d0: 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e         rp->lhs->
59e0: 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 54  lambda = LEMON_T
59f0: 52 55 45 3b 0a 20 20 20 20 20 20 20 20 70 72 6f  RUE;.        pro
5a00: 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20  gress = 1;.     
5a10: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
5a20: 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 0a  e( progress );..
5a30: 20 20 2f 2a 20 4e 6f 77 20 63 6f 6d 70 75 74 65    /* Now compute
5a40: 20 61 6c 6c 20 66 69 72 73 74 20 73 65 74 73 20   all first sets 
5a50: 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 73 74 72  */.  do{.    str
5a60: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 31 2c 20  uct symbol *s1, 
5a70: 2a 73 32 3b 0a 20 20 20 20 70 72 6f 67 72 65 73  *s2;.    progres
5a80: 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 72  s = 0;.    for(r
5a90: 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
5aa0: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
5ab0: 20 20 20 20 20 20 73 31 20 3d 20 72 70 2d 3e 6c        s1 = rp->l
5ac0: 68 73 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  hs;.      for(i=
5ad0: 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
5ae0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 32 20  ++){.        s2 
5af0: 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20  = rp->rhs[i];.  
5b00: 20 20 20 20 20 20 69 66 28 20 73 32 2d 3e 74 79        if( s2->ty
5b10: 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  pe==TERMINAL ){.
5b20: 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65            progre
5b30: 73 73 20 2b 3d 20 53 65 74 41 64 64 28 73 31 2d  ss += SetAdd(s1-
5b40: 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 69 6e  >firstset,s2->in
5b50: 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dex);.          
5b60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5b70: 65 6c 73 65 20 69 66 28 20 73 32 2d 3e 74 79 70  else if( s2->typ
5b80: 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
5b90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
5ba0: 72 28 6a 3d 30 3b 20 6a 3c 73 32 2d 3e 6e 73 75  r(j=0; j<s2->nsu
5bb0: 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  bsym; j++){.    
5bc0: 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73          progress
5bd0: 20 2b 3d 20 53 65 74 41 64 64 28 73 31 2d 3e 66   += SetAdd(s1->f
5be0: 69 72 73 74 73 65 74 2c 73 32 2d 3e 73 75 62 73  irstset,s2->subs
5bf0: 79 6d 5b 6a 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20  ym[j]->index);. 
5c00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5c10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 65 6c       break;..}el
5c20: 73 65 20 69 66 28 20 73 31 3d 3d 73 32 20 29 7b  se if( s1==s2 ){
5c30: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
5c40: 31 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e  1->lambda==LEMON
5c50: 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a  _FALSE ) break;.
5c60: 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20  .}else{.        
5c70: 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65    progress += Se
5c80: 74 55 6e 69 6f 6e 28 73 31 2d 3e 66 69 72 73 74  tUnion(s1->first
5c90: 73 65 74 2c 73 32 2d 3e 66 69 72 73 74 73 65 74  set,s2->firstset
5ca0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
5cb0: 20 73 32 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d   s2->lambda==LEM
5cc0: 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b  ON_FALSE ) break
5cd0: 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20  ;..}.      }.   
5ce0: 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f   }.  }while( pro
5cf0: 67 72 65 73 73 20 29 3b 0a 20 20 72 65 74 75 72  gress );.  retur
5d00: 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65  n;.}../* Compute
5d10: 20 61 6c 6c 20 4c 52 28 30 29 20 73 74 61 74 65   all LR(0) state
5d20: 73 20 66 6f 72 20 74 68 65 20 67 72 61 6d 6d 61  s for the gramma
5d30: 72 2e 20 20 4c 69 6e 6b 73 0a 2a 2a 20 61 72 65  r.  Links.** are
5d40: 20 61 64 64 65 64 20 74 6f 20 62 65 74 77 65 65   added to betwee
5d50: 6e 20 73 6f 6d 65 20 73 74 61 74 65 73 20 73 6f  n some states so
5d60: 20 74 68 61 74 20 74 68 65 20 4c 52 28 31 29 20   that the LR(1) 
5d70: 66 6f 6c 6c 6f 77 20 73 65 74 73 0a 2a 2a 20 63  follow sets.** c
5d80: 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c  an be computed l
5d90: 61 74 65 72 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  ater..*/.PRIVATE
5da0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 67   struct state *g
5db0: 65 74 73 74 61 74 65 28 2f 2a 20 73 74 72 75 63  etstate(/* struc
5dc0: 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 20 20  t lemon * */);  
5dd0: 2f 2a 20 66 6f 72 77 61 72 64 20 72 65 66 65 72  /* forward refer
5de0: 65 6e 63 65 20 2a 2f 0a 76 6f 69 64 20 46 69 6e  ence */.void Fin
5df0: 64 53 74 61 74 65 73 28 6c 65 6d 70 29 0a 73 74  dStates(lemp).st
5e00: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
5e10: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  ;.{.  struct sym
5e20: 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63  bol *sp;.  struc
5e30: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 43  t rule *rp;..  C
5e40: 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 29  onfiglist_init()
5e50: 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ;..  /* Find the
5e60: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f   start symbol */
5e70: 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61  .  if( lemp->sta
5e80: 72 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 53  rt ){.    sp = S
5e90: 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d  ymbol_find(lemp-
5ea0: 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66 28  >start);.    if(
5eb0: 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   sp==0 ){.      
5ec0: 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
5ed0: 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20  ilename,0,."The 
5ee0: 73 70 65 63 69 66 69 65 64 20 73 74 61 72 74 20  specified start 
5ef0: 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 69 73  symbol \"%s\" is
5f00: 20 6e 6f 74 20 5c 0a 69 6e 20 61 20 6e 6f 6e 74   not \.in a nont
5f10: 65 72 6d 69 6e 61 6c 20 6f 66 20 74 68 65 20 67  erminal of the g
5f20: 72 61 6d 6d 61 72 2e 20 20 5c 22 25 73 5c 22 20  rammar.  \"%s\" 
5f30: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 73 20  will be used as 
5f40: 74 68 65 20 73 74 61 72 74 20 5c 0a 73 79 6d 62  the start \.symb
5f50: 6f 6c 20 69 6e 73 74 65 61 64 2e 22 2c 6c 65 6d  ol instead.",lem
5f60: 70 2d 3e 73 74 61 72 74 2c 6c 65 6d 70 2d 3e 72  p->start,lemp->r
5f70: 75 6c 65 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b  ule->lhs->name);
5f80: 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  .      lemp->err
5f90: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  orcnt++;.      s
5fa0: 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e  p = lemp->rule->
5fb0: 6c 68 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  lhs;.    }.  }el
5fc0: 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d  se{.    sp = lem
5fd0: 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20  p->rule->lhs;.  
5fe0: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
5ff0: 65 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62  e the start symb
6000: 6f 6c 20 64 6f 65 73 6e 27 74 20 6f 63 63 75 72  ol doesn't occur
6010: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
6020: 6e 64 20 73 69 64 65 20 6f 66 0a 20 20 2a 2a 20  nd side of.  ** 
6030: 61 6e 79 20 72 75 6c 65 2e 20 20 52 65 70 6f 72  any rule.  Repor
6040: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69 74  t an error if it
6050: 20 64 6f 65 73 2e 20 20 28 59 41 43 43 20 77 6f   does.  (YACC wo
6060: 75 6c 64 20 67 65 6e 65 72 61 74 65 20 61 20 6e  uld generate a n
6070: 65 77 0a 20 20 2a 2a 20 73 74 61 72 74 20 73 79  ew.  ** start sy
6080: 6d 62 6f 6c 20 69 6e 20 74 68 69 73 20 63 61 73  mbol in this cas
6090: 65 2e 29 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d  e.) */.  for(rp=
60a0: 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
60b0: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
60c0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
60d0: 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
60e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
60f0: 28 20 72 70 2d 3e 72 68 73 5b 69 5d 3d 3d 73 70  ( rp->rhs[i]==sp
6100: 20 29 7b 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a   ){   /* FIX ME:
6110: 20 20 44 65 61 6c 20 77 69 74 68 20 6d 75 6c 74    Deal with mult
6120: 69 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20  iterminals */.  
6130: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c        ErrorMsg(l
6140: 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c  emp->filename,0,
6150: 0a 22 54 68 65 20 73 74 61 72 74 20 73 79 6d 62  ."The start symb
6160: 6f 6c 20 5c 22 25 73 5c 22 20 6f 63 63 75 72 73  ol \"%s\" occurs
6170: 20 6f 6e 20 74 68 65 20 5c 0a 72 69 67 68 74 2d   on the \.right-
6180: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 72  hand side of a r
6190: 75 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 72  ule. This will r
61a0: 65 73 75 6c 74 20 69 6e 20 61 20 70 61 72 73 65  esult in a parse
61b0: 72 20 77 68 69 63 68 20 5c 0a 64 6f 65 73 20 6e  r which \.does n
61c0: 6f 74 20 77 6f 72 6b 20 70 72 6f 70 65 72 6c 79  ot work properly
61d0: 2e 22 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  .",sp->name);.  
61e0: 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
61f0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
6200: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6210: 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67  The basis config
6220: 75 72 61 74 69 6f 6e 20 73 65 74 20 66 6f 72 20  uration set for 
6230: 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65 0a  the first state.
6240: 20 20 2a 2a 20 69 73 20 61 6c 6c 20 72 75 6c 65    ** is all rule
6250: 73 20 77 68 69 63 68 20 68 61 76 65 20 74 68 65  s which have the
6260: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 61 73   start symbol as
6270: 20 74 68 65 69 72 0a 20 20 2a 2a 20 6c 65 66 74   their.  ** left
6280: 2d 68 61 6e 64 20 73 69 64 65 20 2a 2f 0a 20 20  -hand side */.  
6290: 66 6f 72 28 72 70 3d 73 70 2d 3e 72 75 6c 65 3b  for(rp=sp->rule;
62a0: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
62b0: 6c 68 73 29 7b 0a 20 20 20 20 73 74 72 75 63 74  lhs){.    struct
62c0: 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 70 3b   config *newcfp;
62d0: 0a 20 20 20 20 72 70 2d 3e 6c 68 73 53 74 61 72  .    rp->lhsStar
62e0: 74 20 3d 20 31 3b 0a 20 20 20 20 6e 65 77 63 66  t = 1;.    newcf
62f0: 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61  p = Configlist_a
6300: 64 64 62 61 73 69 73 28 72 70 2c 30 29 3b 0a 20  ddbasis(rp,0);. 
6310: 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66 70     SetAdd(newcfp
6320: 2d 3e 66 77 73 2c 30 29 3b 0a 20 20 7d 0a 0a 20  ->fws,0);.  }.. 
6330: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
6340: 66 69 72 73 74 20 73 74 61 74 65 2e 20 20 41 6c  first state.  Al
6350: 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 20 77  l other states w
6360: 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 6f 6d 70  ill be.  ** comp
6370: 75 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  uted automatical
6380: 6c 79 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  ly during the co
6390: 6d 70 75 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mputation of the
63a0: 20 66 69 72 73 74 20 6f 6e 65 2e 0a 20 20 2a 2a   first one..  **
63b0: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f   The returned po
63c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72  inter to the fir
63d0: 73 74 20 73 74 61 74 65 20 69 73 20 6e 6f 74 20  st state is not 
63e0: 75 73 65 64 2e 20 2a 2f 0a 20 20 28 76 6f 69 64  used. */.  (void
63f0: 29 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b  )getstate(lemp);
6400: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
6410: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
6420: 72 20 74 6f 20 61 20 73 74 61 74 65 20 77 68 69  r to a state whi
6430: 63 68 20 69 73 20 64 65 73 63 72 69 62 65 64 20  ch is described 
6440: 62 79 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  by the configura
6450: 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20 77 68 69  tion.** list whi
6460: 63 68 20 68 61 73 20 62 65 65 6e 20 62 75 69 6c  ch has been buil
6470: 74 20 66 72 6f 6d 20 63 61 6c 6c 73 20 74 6f 20  t from calls to 
6480: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 2e 0a  Configlist_add..
6490: 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
64a0: 62 75 69 6c 64 73 68 69 66 74 73 28 2f 2a 20 73  buildshifts(/* s
64b0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20 73  truct lemon *, s
64c0: 74 72 75 63 74 20 73 74 61 74 65 20 2a 20 2a 2f  truct state * */
64d0: 29 3b 20 2f 2a 20 46 6f 72 77 64 20 72 65 66 20  ); /* Forwd ref 
64e0: 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75 63  */.PRIVATE struc
64f0: 74 20 73 74 61 74 65 20 2a 67 65 74 73 74 61 74  t state *getstat
6500: 65 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  e(lemp).struct l
6510: 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
6520: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
6530: 66 70 2c 20 2a 62 70 3b 0a 20 20 73 74 72 75 63  fp, *bp;.  struc
6540: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 0a 20  t state *stp;.. 
6550: 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
6560: 73 6f 72 74 65 64 20 62 61 73 69 73 20 6f 66 20  sorted basis of 
6570: 74 68 65 20 6e 65 77 20 73 74 61 74 65 2e 20 20  the new state.  
6580: 54 68 65 20 62 61 73 69 73 20 77 61 73 20 63 6f  The basis was co
6590: 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 62  nstructed.  ** b
65a0: 79 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f  y prior calls to
65b0: 20 22 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64   "Configlist_add
65c0: 62 61 73 69 73 28 29 22 2e 20 2a 2f 0a 20 20 43  basis()". */.  C
65d0: 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 62 61  onfiglist_sortba
65e0: 73 69 73 28 29 3b 0a 20 20 62 70 20 3d 20 43 6f  sis();.  bp = Co
65f0: 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29  nfiglist_basis()
6600: 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 73 74  ;..  /* Get a st
6610: 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ate with the sam
6620: 65 20 62 61 73 69 73 20 2a 2f 0a 20 20 73 74 70  e basis */.  stp
6630: 20 3d 20 53 74 61 74 65 5f 66 69 6e 64 28 62 70   = State_find(bp
6640: 29 3b 0a 20 20 69 66 28 20 73 74 70 20 29 7b 0a  );.  if( stp ){.
6650: 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65 20 77      /* A state w
6660: 69 74 68 20 74 68 65 20 73 61 6d 65 20 62 61 73  ith the same bas
6670: 69 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  is already exist
6680: 73 21 20 20 43 6f 70 79 20 61 6c 6c 20 74 68 65  s!  Copy all the
6690: 20 66 6f 6c 6c 6f 77 2d 73 65 74 0a 20 20 20 20   follow-set.    
66a0: 2a 2a 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  ** propagation l
66b0: 69 6e 6b 73 20 66 72 6f 6d 20 74 68 65 20 73 74  inks from the st
66c0: 61 74 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ate under constr
66d0: 75 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 0a  uction into the.
66e0: 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69      ** preexisti
66f0: 6e 67 20 73 74 61 74 65 2c 20 74 68 65 6e 20 72  ng state, then r
6700: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
6710: 74 6f 20 74 68 65 20 70 72 65 65 78 69 73 74 69  to the preexisti
6720: 6e 67 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  ng state */.    
6730: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 78  struct config *x
6740: 2c 20 2a 79 3b 0a 20 20 20 20 66 6f 72 28 78 3d  , *y;.    for(x=
6750: 62 70 2c 20 79 3d 73 74 70 2d 3e 62 70 3b 20 78  bp, y=stp->bp; x
6760: 20 26 26 20 79 3b 20 78 3d 78 2d 3e 62 70 2c 20   && y; x=x->bp, 
6770: 79 3d 79 2d 3e 62 70 29 7b 0a 20 20 20 20 20 20  y=y->bp){.      
6780: 50 6c 69 6e 6b 5f 63 6f 70 79 28 26 79 2d 3e 62  Plink_copy(&y->b
6790: 70 6c 70 2c 78 2d 3e 62 70 6c 70 29 3b 0a 20 20  plp,x->bplp);.  
67a0: 20 20 20 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65      Plink_delete
67b0: 28 78 2d 3e 66 70 6c 70 29 3b 0a 20 20 20 20 20  (x->fplp);.     
67c0: 20 78 2d 3e 66 70 6c 70 20 3d 20 78 2d 3e 62 70   x->fplp = x->bp
67d0: 6c 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  lp = 0;.    }.  
67e0: 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69    cfp = Configli
67f0: 73 74 5f 72 65 74 75 72 6e 28 29 3b 0a 20 20 20  st_return();.   
6800: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28   Configlist_eat(
6810: 63 66 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  cfp);.  }else{. 
6820: 20 20 20 2f 2a 20 54 68 69 73 20 72 65 61 6c 6c     /* This reall
6830: 79 20 69 73 20 61 20 6e 65 77 20 73 74 61 74 65  y is a new state
6840: 2e 20 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c  .  Construct all
6850: 20 74 68 65 20 64 65 74 61 69 6c 73 20 2a 2f 0a   the details */.
6860: 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63      Configlist_c
6870: 6c 6f 73 75 72 65 28 6c 65 6d 70 29 3b 20 20 20  losure(lemp);   
6880: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
6890: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c  configuration cl
68a0: 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 43 6f 6e  osure */.    Con
68b0: 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 29 3b 20  figlist_sort(); 
68c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72            /* Sor
68d0: 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  t the configurat
68e0: 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20  ion closure */. 
68f0: 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c     cfp = Configl
6900: 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 20 20 20  ist_return();   
6910: 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72  /* Get a pointer
6920: 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 20 6c   to the config l
6930: 69 73 74 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d  ist */.    stp =
6940: 20 53 74 61 74 65 5f 6e 65 77 28 29 3b 20 20 20   State_new();   
6950: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77          /* A new
6960: 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65   state structure
6970: 20 2a 2f 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68   */.    MemoryCh
6980: 65 63 6b 28 73 74 70 29 3b 0a 20 20 20 20 73 74  eck(stp);.    st
6990: 70 2d 3e 62 70 20 3d 20 62 70 3b 20 20 20 20 20  p->bp = bp;     
69a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
69b0: 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69  member the confi
69c0: 67 75 72 61 74 69 6f 6e 20 62 61 73 69 73 20 2a  guration basis *
69d0: 2f 0a 20 20 20 20 73 74 70 2d 3e 63 66 70 20 3d  /.    stp->cfp =
69e0: 20 63 66 70 3b 20 20 20 20 20 20 20 20 20 20 20   cfp;           
69f0: 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74     /* Remember t
6a00: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
6a10: 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20   closure */.    
6a20: 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 20 3d 20  stp->statenum = 
6a30: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b 3b 20  lemp->nstate++; 
6a40: 2f 2a 20 45 76 65 72 79 20 73 74 61 74 65 20 67  /* Every state g
6a50: 65 74 73 20 61 20 73 65 71 75 65 6e 63 65 20 6e  ets a sequence n
6a60: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 73 74 70  umber */.    stp
6a70: 2d 3e 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20  ->ap = 0;       
6a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
6a90: 61 63 74 69 6f 6e 73 2c 20 79 65 74 2e 20 2a 2f  actions, yet. */
6aa0: 0a 20 20 20 20 53 74 61 74 65 5f 69 6e 73 65 72  .    State_inser
6ab0: 74 28 73 74 70 2c 73 74 70 2d 3e 62 70 29 3b 20  t(stp,stp->bp); 
6ac0: 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20    /* Add to the 
6ad0: 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20  state table */. 
6ae0: 20 20 20 62 75 69 6c 64 73 68 69 66 74 73 28 6c     buildshifts(l
6af0: 65 6d 70 2c 73 74 70 29 3b 20 20 20 20 20 20 20  emp,stp);       
6b00: 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 63  /* Recursively c
6b10: 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 6f 72  ompute successor
6b20: 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 7d 0a 20   states */.  }. 
6b30: 20 72 65 74 75 72 6e 20 73 74 70 3b 0a 7d 0a 0a   return stp;.}..
6b40: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
6b50: 65 20 69 66 20 74 77 6f 20 73 79 6d 62 6f 6c 73  e if two symbols
6b60: 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 0a 2a   are the same..*
6b70: 2f 0a 69 6e 74 20 73 61 6d 65 5f 73 79 6d 62 6f  /.int same_symbo
6b80: 6c 28 61 2c 62 29 0a 73 74 72 75 63 74 20 73 79  l(a,b).struct sy
6b90: 6d 62 6f 6c 20 2a 61 3b 0a 73 74 72 75 63 74 20  mbol *a;.struct 
6ba0: 73 79 6d 62 6f 6c 20 2a 62 3b 0a 7b 0a 20 20 69  symbol *b;.{.  i
6bb0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 3d 3d 62  nt i;.  if( a==b
6bc0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
6bd0: 66 28 20 61 2d 3e 74 79 70 65 21 3d 4d 55 4c 54  f( a->type!=MULT
6be0: 49 54 45 52 4d 49 4e 41 4c 20 29 20 72 65 74 75  ITERMINAL ) retu
6bf0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 62 2d 3e 74  rn 0;.  if( b->t
6c00: 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype!=MULTITERMIN
6c10: 41 4c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  AL ) return 0;. 
6c20: 20 69 66 28 20 61 2d 3e 6e 73 75 62 73 79 6d 21   if( a->nsubsym!
6c30: 3d 62 2d 3e 6e 73 75 62 73 79 6d 20 29 20 72 65  =b->nsubsym ) re
6c40: 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d  turn 0;.  for(i=
6c50: 30 3b 20 69 3c 61 2d 3e 6e 73 75 62 73 79 6d 3b  0; i<a->nsubsym;
6c60: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
6c70: 2d 3e 73 75 62 73 79 6d 5b 69 5d 21 3d 62 2d 3e  ->subsym[i]!=b->
6c80: 73 75 62 73 79 6d 5b 69 5d 20 29 20 72 65 74 75  subsym[i] ) retu
6c90: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
6ca0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73  rn 1;.}../* Cons
6cb0: 74 72 75 63 74 20 61 6c 6c 20 73 75 63 63 65 73  truct all succes
6cc0: 73 6f 72 20 73 74 61 74 65 73 20 74 6f 20 74 68  sor states to th
6cd0: 65 20 67 69 76 65 6e 20 73 74 61 74 65 2e 20 20  e given state.  
6ce0: 41 20 22 73 75 63 63 65 73 73 6f 72 22 0a 2a 2a  A "successor".**
6cf0: 20 73 74 61 74 65 20 69 73 20 61 6e 79 20 73 74   state is any st
6d00: 61 74 65 20 77 68 69 63 68 20 63 61 6e 20 62 65  ate which can be
6d10: 20 72 65 61 63 68 65 64 20 62 79 20 61 20 73 68   reached by a sh
6d20: 69 66 74 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50  ift action..*/.P
6d30: 52 49 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c  RIVATE void buil
6d40: 64 73 68 69 66 74 73 28 6c 65 6d 70 2c 73 74 70  dshifts(lemp,stp
6d50: 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
6d60: 6c 65 6d 70 3b 0a 73 74 72 75 63 74 20 73 74 61  lemp;.struct sta
6d70: 74 65 20 2a 73 74 70 3b 20 20 20 20 20 2f 2a 20  te *stp;     /* 
6d80: 54 68 65 20 73 74 61 74 65 20 66 72 6f 6d 20 77  The state from w
6d90: 68 69 63 68 20 73 75 63 63 65 73 73 6f 72 73 20  hich successors 
6da0: 61 72 65 20 63 6f 6d 70 75 74 65 64 20 2a 2f 0a  are computed */.
6db0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
6dc0: 67 20 2a 63 66 70 3b 20 20 2f 2a 20 46 6f 72 20  g *cfp;  /* For 
6dd0: 6c 6f 6f 70 69 6e 67 20 74 68 72 75 20 74 68 65  looping thru the
6de0: 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65 20   config closure 
6df0: 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20 20 73 74  of "stp" */.  st
6e00: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 63 66  ruct config *bcf
6e10: 70 3b 20 2f 2a 20 46 6f 72 20 74 68 65 20 69 6e  p; /* For the in
6e20: 6e 65 72 20 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66  ner loop on conf
6e30: 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73  ig closure of "s
6e40: 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  tp" */.  struct 
6e50: 63 6f 6e 66 69 67 20 2a 6e 65 77 3b 20 20 2f 2a  config *new;  /*
6e60: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
6e70: 62 6f 6c 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79  bol *sp;   /* Sy
6e80: 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  mbol following t
6e90: 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67  he dot in config
6ea0: 75 72 61 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f  uration "cfp" */
6eb0: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
6ec0: 20 2a 62 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f   *bsp;  /* Symbo
6ed0: 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  l following the 
6ee0: 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61  dot in configura
6ef0: 74 69 6f 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20  tion "bcfp" */. 
6f00: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e   struct state *n
6f10: 65 77 73 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e  ewstp; /* A poin
6f20: 74 65 72 20 74 6f 20 61 20 73 75 63 63 65 73 73  ter to a success
6f30: 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f  or state */..  /
6f40: 2a 20 45 61 63 68 20 63 6f 6e 66 69 67 75 72 61  * Each configura
6f50: 74 69 6f 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d  tion becomes com
6f60: 70 6c 65 74 65 20 61 66 74 65 72 20 69 74 20 63  plete after it c
6f70: 6f 6e 74 69 62 75 74 65 73 20 74 6f 20 61 20 73  ontibutes to a s
6f80: 75 63 63 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74  uccessor.  ** st
6f90: 61 74 65 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c  ate.  Initially,
6fa0: 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69   all configurati
6fb0: 6f 6e 73 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65  ons are incomple
6fc0: 74 65 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d  te */.  for(cfp=
6fd0: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
6fe0: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 20 63 66  fp=cfp->next) cf
6ff0: 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f  p->status = INCO
7000: 4d 50 4c 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f  MPLETE;..  /* Lo
7010: 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63  op through all c
7020: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 6f 66  onfigurations of
7030: 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22   the state "stp"
7040: 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74   */.  for(cfp=st
7050: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
7060: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
7070: 20 69 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73   if( cfp->status
7080: 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e  ==COMPLETE ) con
7090: 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72  tinue;    /* Alr
70a0: 65 61 64 79 20 75 73 65 64 20 62 79 20 69 6e 6e  eady used by inn
70b0: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  er loop */.    i
70c0: 66 28 20 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70  f( cfp->dot>=cfp
70d0: 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e  ->rp->nrhs ) con
70e0: 74 69 6e 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74  tinue;  /* Can't
70f0: 20 73 68 69 66 74 20 74 68 69 73 20 63 6f 6e 66   shift this conf
7100: 69 67 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67  ig */.    Config
7110: 6c 69 73 74 5f 72 65 73 65 74 28 29 3b 20 20 20  list_reset();   
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7130: 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20     /* Reset the 
7140: 6e 65 77 20 63 6f 6e 66 69 67 20 73 65 74 20 2a  new config set *
7150: 2f 0a 20 20 20 20 73 70 20 3d 20 63 66 70 2d 3e  /.    sp = cfp->
7160: 72 70 2d 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74  rp->rhs[cfp->dot
7170: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
7180: 2a 20 53 79 6d 62 6f 6c 20 61 66 74 65 72 20 74  * Symbol after t
7190: 68 65 20 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f  he dot */..    /
71a0: 2a 20 46 6f 72 20 65 76 65 72 79 20 63 6f 6e 66  * For every conf
71b0: 69 67 75 72 61 74 69 6f 6e 20 69 6e 20 74 68 65  iguration in the
71c0: 20 73 74 61 74 65 20 22 73 74 70 22 20 77 68 69   state "stp" whi
71d0: 63 68 20 68 61 73 20 74 68 65 20 73 79 6d 62 6f  ch has the symbo
71e0: 6c 20 22 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f  l "sp".    ** fo
71f0: 6c 6c 6f 77 69 6e 67 20 69 74 73 20 64 6f 74 2c  llowing its dot,
7200: 20 61 64 64 20 74 68 65 20 73 61 6d 65 20 63 6f   add the same co
7210: 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74  nfiguration to t
7220: 68 65 20 62 61 73 69 73 20 73 65 74 20 75 6e 64  he basis set und
7230: 65 72 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  er.    ** constr
7240: 75 63 74 69 6f 6e 20 62 75 74 20 77 69 74 68 20  uction but with 
7250: 74 68 65 20 64 6f 74 20 73 68 69 66 74 65 64 20  the dot shifted 
7260: 6f 6e 65 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68  one symbol to th
7270: 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
7280: 66 6f 72 28 62 63 66 70 3d 63 66 70 3b 20 62 63  for(bcfp=cfp; bc
7290: 66 70 3b 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e  fp; bcfp=bcfp->n
72a0: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
72b0: 62 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f  bcfp->status==CO
72c0: 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75  MPLETE ) continu
72d0: 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79  e;    /* Already
72e0: 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 69   used */.      i
72f0: 66 28 20 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63  f( bcfp->dot>=bc
7300: 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63  fp->rp->nrhs ) c
7310: 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27  ontinue; /* Can'
7320: 74 20 73 68 69 66 74 20 74 68 69 73 20 6f 6e 65  t shift this one
7330: 20 2a 2f 0a 20 20 20 20 20 20 62 73 70 20 3d 20   */.      bsp = 
7340: 62 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63  bcfp->rp->rhs[bc
7350: 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20  fp->dot];       
7360: 20 20 20 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f      /* Get symbo
7370: 6c 20 61 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20  l after dot */. 
7380: 20 20 20 20 20 69 66 28 20 21 73 61 6d 65 5f 73       if( !same_s
7390: 79 6d 62 6f 6c 28 62 73 70 2c 73 70 29 20 29 20  ymbol(bsp,sp) ) 
73a0: 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 2f  continue;      /
73b0: 2a 20 4d 75 73 74 20 62 65 20 73 61 6d 65 20 61  * Must be same a
73c0: 73 20 66 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20  s for "cfp" */. 
73d0: 20 20 20 20 20 62 63 66 70 2d 3e 73 74 61 74 75       bcfp->statu
73e0: 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20  s = COMPLETE;   
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7400: 2a 20 4d 61 72 6b 20 74 68 69 73 20 63 6f 6e 66  * Mark this conf
7410: 69 67 20 61 73 20 75 73 65 64 20 2a 2f 0a 20 20  ig as used */.  
7420: 20 20 20 20 6e 65 77 20 3d 20 43 6f 6e 66 69 67      new = Config
7430: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 62 63  list_addbasis(bc
7440: 66 70 2d 3e 72 70 2c 62 63 66 70 2d 3e 64 6f 74  fp->rp,bcfp->dot
7450: 2b 31 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b  +1);.      Plink
7460: 5f 61 64 64 28 26 6e 65 77 2d 3e 62 70 6c 70 2c  _add(&new->bplp,
7470: 62 63 66 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  bcfp);.    }..  
7480: 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74    /* Get a point
7490: 65 72 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  er to the state 
74a0: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 68 65  described by the
74b0: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
74c0: 74 69 6f 6e 20 73 65 74 0a 20 20 20 20 2a 2a 20  tion set.    ** 
74d0: 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
74e0: 68 65 20 70 72 65 63 65 64 69 6e 67 20 6c 6f 6f  he preceding loo
74f0: 70 20 2a 2f 0a 20 20 20 20 6e 65 77 73 74 70 20  p */.    newstp 
7500: 3d 20 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29  = getstate(lemp)
7510: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74  ;..    /* The st
7520: 61 74 65 20 22 6e 65 77 73 74 70 22 20 69 73 20  ate "newstp" is 
7530: 72 65 61 63 68 65 64 20 66 72 6f 6d 20 74 68 65  reached from the
7540: 20 73 74 61 74 65 20 22 73 74 70 22 20 62 79 20   state "stp" by 
7550: 61 20 73 68 69 66 74 20 61 63 74 69 6f 6e 0a 20  a shift action. 
7560: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 79 6d     ** on the sym
7570: 62 6f 6c 20 22 73 70 22 20 2a 2f 0a 20 20 20 20  bol "sp" */.    
7580: 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55  if( sp->type==MU
7590: 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
75a0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
75b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 70 2d    for(i=0; i<sp-
75c0: 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a  >nsubsym; i++){.
75d0: 20 20 20 20 20 20 20 20 41 63 74 69 6f 6e 5f 61          Action_a
75e0: 64 64 28 26 73 74 70 2d 3e 61 70 2c 53 48 49 46  dd(&stp->ap,SHIF
75f0: 54 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 69 5d 2c  T,sp->subsym[i],
7600: 28 63 68 61 72 2a 29 6e 65 77 73 74 70 29 3b 0a  (char*)newstp);.
7610: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
7620: 65 7b 0a 20 20 20 20 20 20 41 63 74 69 6f 6e 5f  e{.      Action_
7630: 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 53 48 49  add(&stp->ap,SHI
7640: 46 54 2c 73 70 2c 28 63 68 61 72 20 2a 29 6e 65  FT,sp,(char *)ne
7650: 77 73 74 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  wstp);.    }.  }
7660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
7670: 75 63 74 20 74 68 65 20 70 72 6f 70 61 67 61 74  uct the propagat
7680: 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2f 0a 76 6f 69  ion links.*/.voi
7690: 64 20 46 69 6e 64 4c 69 6e 6b 73 28 6c 65 6d 70  d FindLinks(lemp
76a0: 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
76b0: 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b  lemp;.{.  int i;
76c0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
76d0: 20 2a 63 66 70 2c 20 2a 6f 74 68 65 72 3b 0a 20   *cfp, *other;. 
76e0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
76f0: 74 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  tp;.  struct pli
7700: 6e 6b 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48  nk *plp;..  /* H
7710: 6f 75 73 65 6b 65 65 70 69 6e 67 20 64 65 74 61  ousekeeping deta
7720: 69 6c 3a 0a 20 20 2a 2a 20 41 64 64 20 74 6f 20  il:.  ** Add to 
7730: 65 76 65 72 79 20 70 72 6f 70 61 67 61 74 65 20  every propagate 
7740: 6c 69 6e 6b 20 61 20 70 6f 69 6e 74 65 72 20 62  link a pointer b
7750: 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61 74 65  ack to the state
7760: 20 74 6f 0a 20 20 2a 2a 20 77 68 69 63 68 20 74   to.  ** which t
7770: 68 65 20 6c 69 6e 6b 20 69 73 20 61 74 74 61 63  he link is attac
7780: 68 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  hed. */.  for(i=
7790: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
77a0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
77b0: 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
77c0: 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d  i];.    for(cfp=
77d0: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
77e0: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  fp=cfp->next){. 
77f0: 20 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20       cfp->stp = 
7800: 73 74 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  stp;.    }.  }..
7810: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c    /* Convert all
7820: 20 62 61 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20   backlinks into 
7830: 66 6f 72 77 61 72 64 20 6c 69 6e 6b 73 2e 20 20  forward links.  
7840: 4f 6e 6c 79 20 74 68 65 20 66 6f 72 77 61 72 64  Only the forward
7850: 0a 20 20 2a 2a 20 6c 69 6e 6b 73 20 61 72 65 20  .  ** links are 
7860: 75 73 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c  used in the foll
7870: 6f 77 2d 73 65 74 20 63 6f 6d 70 75 74 61 74 69  ow-set computati
7880: 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  on. */.  for(i=0
7890: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
78a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
78b0: 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
78c0: 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73  ];.    for(cfp=s
78d0: 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66  tp->cfp; cfp; cf
78e0: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=cfp->next){.  
78f0: 20 20 20 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d      for(plp=cfp-
7900: 3e 62 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d  >bplp; plp; plp=
7910: 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  plp->next){.    
7920: 20 20 20 20 6f 74 68 65 72 20 3d 20 70 6c 70 2d      other = plp-
7930: 3e 63 66 70 3b 0a 20 20 20 20 20 20 20 20 50 6c  >cfp;.        Pl
7940: 69 6e 6b 5f 61 64 64 28 26 6f 74 68 65 72 2d 3e  ink_add(&other->
7950: 66 70 6c 70 2c 63 66 70 29 3b 0a 20 20 20 20 20  fplp,cfp);.     
7960: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
7970: 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 66  /* Compute all f
7980: 6f 6c 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a  ollowsets..**.**
7990: 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 69 73 20   A followset is 
79a0: 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 73  the set of all s
79b0: 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e  ymbols which can
79c0: 20 63 6f 6d 65 20 69 6d 6d 65 64 69 61 74 65 6c   come immediatel
79d0: 79 0a 2a 2a 20 61 66 74 65 72 20 61 20 63 6f 6e  y.** after a con
79e0: 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  figuration..*/.v
79f0: 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65  oid FindFollowSe
7a00: 74 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20  ts(lemp).struct 
7a10: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
7a20: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
7a30: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20   config *cfp;.  
7a40: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c  struct plink *pl
7a50: 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73  p;.  int progres
7a60: 73 3b 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 3b  s;.  int change;
7a70: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ..  for(i=0; i<l
7a80: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
7a90: 29 7b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 6c  ){.    for(cfp=l
7aa0: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e  emp->sorted[i]->
7ab0: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
7ac0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
7ad0: 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e  cfp->status = IN
7ae0: 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 7d 0a  COMPLETE;.    }.
7af0: 20 20 7d 0a 20 20 0a 20 20 64 6f 7b 0a 20 20 20    }.  .  do{.   
7b00: 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20   progress = 0;. 
7b10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65     for(i=0; i<le
7b20: 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
7b30: 7b 0a 20 20 20 20 20 20 66 6f 72 28 63 66 70 3d  {.      for(cfp=
7b40: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d  lemp->sorted[i]-
7b50: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
7b60: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  fp->next){.     
7b70: 20 20 20 69 66 28 20 63 66 70 2d 3e 73 74 61 74     if( cfp->stat
7b80: 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63  us==COMPLETE ) c
7b90: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
7ba0: 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 66 70   for(plp=cfp->fp
7bb0: 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70  lp; plp; plp=plp
7bc0: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
7bd0: 20 20 20 63 68 61 6e 67 65 20 3d 20 53 65 74 55     change = SetU
7be0: 6e 69 6f 6e 28 70 6c 70 2d 3e 63 66 70 2d 3e 66  nion(plp->cfp->f
7bf0: 77 73 2c 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20  ws,cfp->fws);.  
7c00: 20 20 20 20 20 20 20 20 69 66 28 20 63 68 61 6e          if( chan
7c10: 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
7c20: 20 20 70 6c 70 2d 3e 63 66 70 2d 3e 73 74 61 74    plp->cfp->stat
7c30: 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b  us = INCOMPLETE;
7c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f  .            pro
7c50: 67 72 65 73 73 20 3d 20 31 3b 0a 09 20 20 7d 0a  gress = 1;..  }.
7c60: 09 7d 0a 20 20 20 20 20 20 20 20 63 66 70 2d 3e  .}.        cfp->
7c70: 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54  status = COMPLET
7c80: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
7c90: 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72  .  }while( progr
7ca0: 65 73 73 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  ess );.}..static
7cb0: 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f 6e   int resolve_con
7cc0: 66 6c 69 63 74 28 29 3b 0a 0a 2f 2a 20 43 6f 6d  flict();../* Com
7cd0: 70 75 74 65 20 74 68 65 20 72 65 64 75 63 65 20  pute the reduce 
7ce0: 61 63 74 69 6f 6e 73 2c 20 61 6e 64 20 72 65 73  actions, and res
7cf0: 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73 2e 0a  olve conflicts..
7d00: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 41 63 74 69  */.void FindActi
7d10: 6f 6e 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74  ons(lemp).struct
7d20: 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a   lemon *lemp;.{.
7d30: 20 20 69 6e 74 20 69 2c 6a 3b 0a 20 20 73 74 72    int i,j;.  str
7d40: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
7d50: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
7d60: 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 73  *stp;.  struct s
7d70: 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72  ymbol *sp;.  str
7d80: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20  uct rule *rp;.. 
7d90: 20 2f 2a 20 41 64 64 20 61 6c 6c 20 6f 66 20 74   /* Add all of t
7da0: 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e  he reduce action
7db0: 73 20 0a 20 20 2a 2a 20 41 20 72 65 64 75 63 65  s .  ** A reduce
7dc0: 20 61 63 74 69 6f 6e 20 69 73 20 61 64 64 65 64   action is added
7dd0: 20 66 6f 72 20 65 61 63 68 20 65 6c 65 6d 65 6e   for each elemen
7de0: 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 73  t of the follows
7df0: 65 74 20 6f 66 0a 20 20 2a 2a 20 61 20 63 6f 6e  et of.  ** a con
7e00: 66 69 67 75 72 61 74 69 6f 6e 20 77 68 69 63 68  figuration which
7e10: 20 68 61 73 20 69 74 73 20 64 6f 74 20 61 74 20   has its dot at 
7e20: 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68  the extreme righ
7e30: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  t..  */.  for(i=
7e40: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
7e50: 65 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f  e; i++){   /* Lo
7e60: 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73 74 61 74  op over all stat
7e70: 65 73 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20  es */.    stp = 
7e80: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
7e90: 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70  .    for(cfp=stp
7ea0: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
7eb0: 63 66 70 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a 20  cfp->next){  /* 
7ec0: 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 63 6f  Loop over all co
7ed0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a  nfigurations */.
7ee0: 20 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e 72        if( cfp->r
7ef0: 70 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e 64 6f  p->nrhs==cfp->do
7f00: 74 20 29 7b 20 20 20 20 20 20 20 20 2f 2a 20 49  t ){        /* I
7f10: 73 20 64 6f 74 20 61 74 20 65 78 74 72 65 6d 65  s dot at extreme
7f20: 20 72 69 67 68 74 3f 20 2a 2f 0a 20 20 20 20 20   right? */.     
7f30: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65     for(j=0; j<le
7f40: 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a  mp->nterminal; j
7f50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
7f60: 66 28 20 53 65 74 46 69 6e 64 28 63 66 70 2d 3e  f( SetFind(cfp->
7f70: 66 77 73 2c 6a 29 20 29 7b 0a 20 20 20 20 20 20  fws,j) ){.      
7f80: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 72        /* Add a r
7f90: 65 64 75 63 65 20 61 63 74 69 6f 6e 20 74 6f 20  educe action to 
7fa0: 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20  the state "stp" 
7fb0: 77 68 69 63 68 20 77 69 6c 6c 20 72 65 64 75 63  which will reduc
7fc0: 65 20 62 79 20 74 68 65 0a 20 20 20 20 20 20 20  e by the.       
7fd0: 20 20 20 20 20 2a 2a 20 72 75 6c 65 20 22 63 66       ** rule "cf
7fe0: 70 2d 3e 72 70 22 20 69 66 20 74 68 65 20 6c 6f  p->rp" if the lo
7ff0: 6f 6b 61 68 65 61 64 20 73 79 6d 62 6f 6c 20 69  okahead symbol i
8000: 73 20 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  s "lemp->symbols
8010: 5b 6a 5d 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  [j]" */.        
8020: 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26      Action_add(&
8030: 73 74 70 2d 3e 61 70 2c 52 45 44 55 43 45 2c 6c  stp->ap,REDUCE,l
8040: 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c  emp->symbols[j],
8050: 28 63 68 61 72 20 2a 29 63 66 70 2d 3e 72 70 29  (char *)cfp->rp)
8060: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 09 7d  ;.          }..}
8070: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8080: 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65   }..  /* Add the
8090: 20 61 63 63 65 70 74 69 6e 67 20 74 6f 6b 65 6e   accepting token
80a0: 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
80b0: 73 74 61 72 74 20 29 7b 0a 20 20 20 20 73 70 20  start ){.    sp 
80c0: 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65  = Symbol_find(le
80d0: 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20  mp->start);.    
80e0: 69 66 28 20 73 70 3d 3d 30 20 29 20 73 70 20 3d  if( sp==0 ) sp =
80f0: 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73   lemp->rule->lhs
8100: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
8110: 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e  p = lemp->rule->
8120: 6c 68 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 64  lhs;.  }.  /* Ad
8130: 64 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 73  d to the first s
8140: 74 61 74 65 20 28 77 68 69 63 68 20 69 73 20 61  tate (which is a
8150: 6c 77 61 79 73 20 74 68 65 20 73 74 61 72 74 69  lways the starti
8160: 6e 67 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  ng state of the.
8170: 20 20 2a 2a 20 66 69 6e 69 74 65 20 73 74 61 74    ** finite stat
8180: 65 20 6d 61 63 68 69 6e 65 29 20 61 6e 20 61 63  e machine) an ac
8190: 74 69 6f 6e 20 74 6f 20 41 43 43 45 50 54 20 69  tion to ACCEPT i
81a0: 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20  f the lookahead 
81b0: 69 73 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72  is the.  ** star
81c0: 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20 20  t nonterminal.  
81d0: 2a 2f 0a 20 20 41 63 74 69 6f 6e 5f 61 64 64 28  */.  Action_add(
81e0: 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d  &lemp->sorted[0]
81f0: 2d 3e 61 70 2c 41 43 43 45 50 54 2c 73 70 2c 30  ->ap,ACCEPT,sp,0
8200: 29 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  );..  /* Resolve
8210: 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20   conflicts */.  
8220: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
8230: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
8240: 20 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e     struct action
8250: 20 2a 61 70 2c 20 2a 6e 61 70 3b 0a 20 20 20 20   *ap, *nap;.    
8260: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
8270: 70 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  p;.    stp = lem
8280: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
8290: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 73 74 70    /* assert( stp
82a0: 2d 3e 61 70 20 29 3b 20 2a 2f 0a 20 20 20 20 73  ->ap ); */.    s
82b0: 74 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f  tp->ap = Action_
82c0: 73 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20  sort(stp->ap);. 
82d0: 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
82e0: 70 3b 20 61 70 20 26 26 20 61 70 2d 3e 6e 65 78  p; ap && ap->nex
82f0: 74 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  t; ap=ap->next){
8300: 0a 20 20 20 20 20 20 66 6f 72 28 6e 61 70 3d 61  .      for(nap=a
8310: 70 2d 3e 6e 65 78 74 3b 20 6e 61 70 20 26 26 20  p->next; nap && 
8320: 6e 61 70 2d 3e 73 70 3d 3d 61 70 2d 3e 73 70 3b  nap->sp==ap->sp;
8330: 20 6e 61 70 3d 6e 61 70 2d 3e 6e 65 78 74 29 7b   nap=nap->next){
8340: 0a 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  .         /* The
8350: 20 74 77 6f 20 61 63 74 69 6f 6e 73 20 22 61 70   two actions "ap
8360: 22 20 61 6e 64 20 22 6e 61 70 22 20 68 61 76 65  " and "nap" have
8370: 20 74 68 65 20 73 61 6d 65 20 6c 6f 6f 6b 61 68   the same lookah
8380: 65 61 64 2e 0a 20 20 20 20 20 20 20 20 20 2a 2a  ead..         **
8390: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63   Figure out whic
83a0: 68 20 6f 6e 65 20 73 68 6f 75 6c 64 20 62 65 20  h one should be 
83b0: 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  used */.        
83c0: 20 6c 65 6d 70 2d 3e 6e 63 6f 6e 66 6c 69 63 74   lemp->nconflict
83d0: 20 2b 3d 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66   += resolve_conf
83e0: 6c 69 63 74 28 61 70 2c 6e 61 70 2c 6c 65 6d 70  lict(ap,nap,lemp
83f0: 2d 3e 65 72 72 73 79 6d 29 3b 0a 20 20 20 20 20  ->errsym);.     
8400: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
8410: 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  /* Report an err
8420: 6f 72 20 66 6f 72 20 65 61 63 68 20 72 75 6c 65  or for each rule
8430: 20 74 68 61 74 20 63 61 6e 20 6e 65 76 65 72 20   that can never 
8440: 62 65 20 72 65 64 75 63 65 64 2e 20 2a 2f 0a 20  be reduced. */. 
8450: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
8460: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
8470: 65 78 74 29 20 72 70 2d 3e 63 61 6e 52 65 64 75  ext) rp->canRedu
8480: 63 65 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45  ce = LEMON_FALSE
8490: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
84a0: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
84b0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 61 63  ){.    struct ac
84c0: 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 20 20 66 6f  tion *ap;.    fo
84d0: 72 28 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65  r(ap=lemp->sorte
84e0: 64 5b 69 5d 2d 3e 61 70 3b 20 61 70 3b 20 61 70  d[i]->ap; ap; ap
84f0: 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
8500: 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d    if( ap->type==
8510: 52 45 44 55 43 45 20 29 20 61 70 2d 3e 78 2e 72  REDUCE ) ap->x.r
8520: 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 4c  p->canReduce = L
8530: 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20 7d  EMON_TRUE;.    }
8540: 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65  .  }.  for(rp=le
8550: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
8560: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
8570: 69 66 28 20 72 70 2d 3e 63 61 6e 52 65 64 75 63  if( rp->canReduc
8580: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
8590: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
85a0: 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
85b0: 6c 65 6c 69 6e 65 2c 22 54 68 69 73 20 72 75 6c  leline,"This rul
85c0: 65 20 63 61 6e 20 6e 6f 74 20 62 65 20 72 65 64  e can not be red
85d0: 75 63 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c  uced.\n");.    l
85e0: 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
85f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c  .  }.}../* Resol
8600: 76 65 20 61 20 63 6f 6e 66 6c 69 63 74 20 62 65  ve a conflict be
8610: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
8620: 76 65 6e 20 61 63 74 69 6f 6e 73 2e 20 20 49 66  ven actions.  If
8630: 20 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74   the.** conflict
8640: 20 63 61 6e 27 74 20 62 65 20 72 65 73 6f 6c 76   can't be resolv
8650: 65 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  e, return non-ze
8660: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e  ro..**.** NO LON
8670: 47 45 52 20 54 52 55 45 3a 0a 2a 2a 20 20 20 54  GER TRUE:.**   T
8680: 6f 20 72 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66  o resolve a conf
8690: 6c 69 63 74 2c 20 66 69 72 73 74 20 6c 6f 6f 6b  lict, first look
86a0: 20 74 6f 20 73 65 65 20 69 66 20 65 69 74 68 65   to see if eithe
86b0: 72 20 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 73  r action.**   is
86c0: 20 6f 6e 20 61 6e 20 65 72 72 6f 72 20 72 75 6c   on an error rul
86d0: 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  e.  In that case
86e0: 2c 20 74 61 6b 65 20 74 68 65 20 61 63 74 69 6f  , take the actio
86f0: 6e 20 77 68 69 63 68 0a 2a 2a 20 20 20 69 73 20  n which.**   is 
8700: 6e 6f 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  not associated w
8710: 69 74 68 20 74 68 65 20 65 72 72 6f 72 20 72 75  ith the error ru
8720: 6c 65 2e 20 20 49 66 20 6e 65 69 74 68 65 72 20  le.  If neither 
8730: 6f 72 20 62 6f 74 68 0a 2a 2a 20 20 20 61 63 74  or both.**   act
8740: 69 6f 6e 73 20 61 72 65 20 61 73 73 6f 63 69 61  ions are associa
8750: 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
8760: 72 20 72 75 6c 65 2c 20 74 68 65 6e 20 74 72 79  r rule, then try
8770: 20 74 6f 0a 2a 2a 20 20 20 75 73 65 20 70 72 65   to.**   use pre
8780: 63 65 64 65 6e 63 65 20 74 6f 20 72 65 73 6f 6c  cedence to resol
8790: 76 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2e  ve the conflict.
87a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
87b0: 20 61 63 74 69 6f 6e 20 69 73 20 61 20 53 48 49   action is a SHI
87c0: 46 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  FT, then it must
87d0: 20 62 65 20 61 70 78 2e 20 20 54 68 69 73 0a 2a   be apx.  This.*
87e0: 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 6e 27 74  * function won't
87f0: 20 77 6f 72 6b 20 69 66 20 61 70 78 2d 3e 74 79   work if apx->ty
8800: 70 65 3d 3d 52 45 44 55 43 45 20 61 6e 64 20 61  pe==REDUCE and a
8810: 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 2e  py->type==SHIFT.
8820: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
8830: 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28  esolve_conflict(
8840: 61 70 78 2c 61 70 79 2c 65 72 72 73 79 6d 29 0a  apx,apy,errsym).
8850: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
8860: 70 78 3b 0a 73 74 72 75 63 74 20 61 63 74 69 6f  px;.struct actio
8870: 6e 20 2a 61 70 79 3b 0a 73 74 72 75 63 74 20 73  n *apy;.struct s
8880: 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b 20 20  ymbol *errsym;  
8890: 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 73 79   /* The error sy
88a0: 6d 62 6f 6c 20 28 69 66 20 64 65 66 69 6e 65 64  mbol (if defined
88b0: 2e 20 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73  .  NULL otherwis
88c0: 65 29 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63 74  e) */.{.  struct
88d0: 20 73 79 6d 62 6f 6c 20 2a 73 70 78 2c 20 2a 73   symbol *spx, *s
88e0: 70 79 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74  py;.  int errcnt
88f0: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
8900: 61 70 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e 73 70  apx->sp==apy->sp
8910: 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72 77 69 73   );  /* Otherwis
8920: 65 20 74 68 65 72 65 20 77 6f 75 6c 64 20 62 65  e there would be
8930: 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a   no conflict */.
8940: 20 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d    if( apx->type=
8950: 3d 53 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74  =SHIFT && apy->t
8960: 79 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20  ype==SHIFT ){.  
8970: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 53 53    apy->type = SS
8980: 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 65 72  CONFLICT;.    er
8990: 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  rcnt++;.  }.  if
89a0: 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 49  ( apx->type==SHI
89b0: 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d  FT && apy->type=
89c0: 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73  =REDUCE ){.    s
89d0: 70 78 20 3d 20 61 70 78 2d 3e 73 70 3b 0a 20 20  px = apx->sp;.  
89e0: 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72    spy = apy->x.r
89f0: 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20  p->precsym;.    
8a00: 69 66 28 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70  if( spy==0 || sp
8a10: 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70 79  x->prec<0 || spy
8a20: 2d 3e 70 72 65 63 3c 30 20 29 7b 0a 20 20 20 20  ->prec<0 ){.    
8a30: 20 20 2f 2a 20 4e 6f 74 20 65 6e 6f 75 67 68 20    /* Not enough 
8a40: 70 72 65 63 65 64 65 6e 63 65 20 69 6e 66 6f 72  precedence infor
8a50: 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  mation. */.     
8a60: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 53 52 43   apy->type = SRC
8a70: 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65  ONFLICT;.      e
8a80: 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c  rrcnt++;.    }el
8a90: 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63  se if( spx->prec
8aa0: 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 20 20 20  >spy->prec ){   
8ab0: 20 2f 2a 20 4c 6f 77 65 72 20 70 72 65 63 65 64   /* Lower preced
8ac0: 65 6e 63 65 20 77 69 6e 73 20 2a 2f 0a 20 20 20  ence wins */.   
8ad0: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52     apy->type = R
8ae0: 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20  D_RESOLVED;.    
8af0: 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70  }else if( spx->p
8b00: 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b  rec<spy->prec ){
8b10: 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65  .      apx->type
8b20: 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a   = SH_RESOLVED;.
8b30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
8b40: 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72  x->prec==spy->pr
8b50: 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63  ec && spx->assoc
8b60: 3d 3d 52 49 47 48 54 20 29 7b 20 2f 2a 20 55 73  ==RIGHT ){ /* Us
8b70: 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  e operator */.  
8b80: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
8b90: 52 44 5f 52 45 53 4f 4c 56 45 44 3b 20 20 20 20  RD_RESOLVED;    
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73 6f           /* asso
8bc0: 63 69 61 74 69 76 69 74 79 20 2a 2f 0a 20 20 20  ciativity */.   
8bd0: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
8be0: 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20  prec==spy->prec 
8bf0: 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4c  && spx->assoc==L
8c00: 45 46 54 20 29 7b 20 20 2f 2a 20 74 6f 20 62 72  EFT ){  /* to br
8c10: 65 61 6b 20 74 69 65 20 2a 2f 0a 20 20 20 20 20  eak tie */.     
8c20: 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f   apx->type = SH_
8c30: 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65  RESOLVED;.    }e
8c40: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
8c50: 74 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70  t( spx->prec==sp
8c60: 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e  y->prec && spx->
8c70: 61 73 73 6f 63 3d 3d 4e 4f 4e 45 20 29 3b 0a 20  assoc==NONE );. 
8c80: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
8c90: 20 53 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20   SRCONFLICT;.   
8ca0: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
8cb0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61   }.  }else if( a
8cc0: 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  px->type==REDUCE
8cd0: 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52   && apy->type==R
8ce0: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78  EDUCE ){.    spx
8cf0: 20 3d 20 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72   = apx->x.rp->pr
8d00: 65 63 73 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d  ecsym;.    spy =
8d10: 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63   apy->x.rp->prec
8d20: 73 79 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 78  sym;.    if( spx
8d30: 3d 3d 30 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c  ==0 || spy==0 ||
8d40: 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a   spx->prec<0 ||.
8d50: 20 20 20 20 73 70 79 2d 3e 70 72 65 63 3c 30 20      spy->prec<0 
8d60: 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70  || spx->prec==sp
8d70: 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20  y->prec ){.     
8d80: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 52 43   apy->type = RRC
8d90: 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65  ONFLICT;.      e
8da0: 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c  rrcnt++;.    }el
8db0: 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63  se if( spx->prec
8dc0: 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20  >spy->prec ){.  
8dd0: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
8de0: 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20  RD_RESOLVED;.   
8df0: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
8e00: 70 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29  prec<spy->prec )
8e10: 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  {.      apx->typ
8e20: 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b  e = RD_RESOLVED;
8e30: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
8e40: 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20      assert( .   
8e50: 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48     apx->type==SH
8e60: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20  _RESOLVED ||.   
8e70: 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44     apx->type==RD
8e80: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20  _RESOLVED ||.   
8e90: 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 53     apx->type==SS
8ea0: 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20  CONFLICT ||.    
8eb0: 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 52 43    apx->type==SRC
8ec0: 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20  ONFLICT ||.     
8ed0: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 52 43 4f   apx->type==RRCO
8ee0: 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20  NFLICT ||.      
8ef0: 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45  apy->type==SH_RE
8f00: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
8f10: 61 70 79 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45  apy->type==RD_RE
8f20: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
8f30: 61 70 79 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e  apy->type==SSCON
8f40: 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61  FLICT ||.      a
8f50: 70 79 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46  py->type==SRCONF
8f60: 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70  LICT ||.      ap
8f70: 79 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c  y->type==RRCONFL
8f80: 49 43 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f  ICT.    );.    /
8f90: 2a 20 54 68 65 20 52 45 44 55 43 45 2f 53 48 49  * The REDUCE/SHI
8fa0: 46 54 20 63 61 73 65 20 63 61 6e 6e 6f 74 20 68  FT case cannot h
8fb0: 61 70 70 65 6e 20 62 65 63 61 75 73 65 20 53 48  appen because SH
8fc0: 49 46 54 73 20 63 6f 6d 65 20 62 65 66 6f 72 65  IFTs come before
8fd0: 0a 20 20 20 20 2a 2a 20 52 45 44 55 43 45 73 20  .    ** REDUCEs 
8fe0: 6f 6e 20 74 68 65 20 6c 69 73 74 2e 20 20 49 66  on the list.  If
8ff0: 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
9000: 6f 69 6e 74 20 69 74 20 6d 75 73 74 20 62 65 20  oint it must be 
9010: 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74  because.    ** t
9020: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 66 6c 69  he parser confli
9030: 63 74 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  ct had already b
9040: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f  een resolved. */
9050: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72  .  }.  return er
9060: 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  rcnt;.}./*******
9070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
9080: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 63 6f  rom the file "co
9090: 6e 66 69 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a  nfiglist.c" ****
90a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90b0: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75  *****/./*.** Rou
90c0: 74 69 6e 65 73 20 74 6f 20 70 72 6f 63 65 73 73  tines to process
90d0: 69 6e 67 20 61 20 63 6f 6e 66 69 67 75 72 61 74  ing a configurat
90e0: 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 62 75 69  ion list and bui
90f0: 6c 64 69 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a  lding a state.**
9100: 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
9110: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
9120: 2a 2f 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63  */..static struc
9130: 74 20 63 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69  t config *freeli
9140: 73 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  st = 0;      /* 
9150: 4c 69 73 74 20 6f 66 20 66 72 65 65 20 63 6f 6e  List of free con
9160: 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  figurations */.s
9170: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
9180: 66 69 67 20 2a 63 75 72 72 65 6e 74 20 3d 20 30  fig *current = 0
9190: 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f  ;       /* Top o
91a0: 66 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67  f list of config
91b0: 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  urations */.stat
91c0: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
91d0: 20 2a 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20   **currentend = 
91e0: 30 3b 20 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20  0;   /* Last on 
91f0: 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 73 20  list of configs 
9200: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
9210: 20 63 6f 6e 66 69 67 20 2a 62 61 73 69 73 20 3d   config *basis =
9220: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
9230: 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61  op of list of ba
9240: 73 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73  sis configs */.s
9250: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
9260: 66 69 67 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d  fig **basisend =
9270: 20 30 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f   0;     /* End o
9280: 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20  f list of basis 
9290: 63 6f 6e 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52  configs */../* R
92a0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
92b0: 74 6f 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75  to a new configu
92c0: 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54  ration */.PRIVAT
92d0: 45 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  E struct config 
92e0: 2a 6e 65 77 63 6f 6e 66 69 67 28 29 7b 0a 20 20  *newconfig(){.  
92f0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
9300: 65 77 3b 0a 20 20 69 66 28 20 66 72 65 65 6c 69  ew;.  if( freeli
9310: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  st==0 ){.    int
9320: 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20   i;.    int amt 
9330: 3d 20 33 3b 0a 20 20 20 20 66 72 65 65 6c 69 73  = 3;.    freelis
9340: 74 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66  t = (struct conf
9350: 69 67 20 2a 29 63 61 6c 6c 6f 63 28 20 61 6d 74  ig *)calloc( amt
9360: 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  , sizeof(struct 
9370: 63 6f 6e 66 69 67 29 20 29 3b 0a 20 20 20 20 69  config) );.    i
9380: 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29  f( freelist==0 )
9390: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
93a0: 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74  stderr,"Unable t
93b0: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
93c0: 79 20 66 6f 72 20 61 20 6e 65 77 20 63 6f 6e 66  y for a new conf
93d0: 69 67 75 72 61 74 69 6f 6e 2e 22 29 3b 0a 20 20  iguration.");.  
93e0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
93f0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
9400: 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72  i<amt-1; i++) fr
9410: 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d  eelist[i].next =
9420: 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b   &freelist[i+1];
9430: 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b 61 6d  .    freelist[am
9440: 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20  t-1].next = 0;. 
9450: 20 7d 0a 20 20 6e 65 77 20 3d 20 66 72 65 65 6c   }.  new = freel
9460: 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20  ist;.  freelist 
9470: 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74  = freelist->next
9480: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a  ;.  return new;.
9490: 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67  }../* The config
94a0: 75 72 61 74 69 6f 6e 20 22 6f 6c 64 22 20 69 73  uration "old" is
94b0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 64 20   no longer used 
94c0: 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
94d0: 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 6f 6c 64  deleteconfig(old
94e0: 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ).struct config 
94f0: 2a 6f 6c 64 3b 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e  *old;.{.  old->n
9500: 65 78 74 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a  ext = freelist;.
9510: 20 20 66 72 65 65 6c 69 73 74 20 3d 20 6f 6c 64    freelist = old
9520: 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69  ;.}../* Initiali
9530: 7a 65 64 20 74 68 65 20 63 6f 6e 66 69 67 75 72  zed the configur
9540: 61 74 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64  ation list build
9550: 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  er */.void Confi
9560: 67 6c 69 73 74 5f 69 6e 69 74 28 29 7b 0a 20 20  glist_init(){.  
9570: 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63  current = 0;.  c
9580: 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 75 72  urrentend = &cur
9590: 72 65 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d 20  rent;.  basis = 
95a0: 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20  0;.  basisend = 
95b0: 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67  &basis;.  Config
95c0: 74 61 62 6c 65 5f 69 6e 69 74 28 29 3b 0a 20 20  table_init();.  
95d0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e  return;.}../* In
95e0: 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63 6f  itialized the co
95f0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
9600: 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64   builder */.void
9610: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65   Configlist_rese
9620: 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d  t(){.  current =
9630: 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64   0;.  currentend
9640: 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20 62   = &current;.  b
9650: 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69  asis = 0;.  basi
9660: 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a 20  send = &basis;. 
9670: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65   Configtable_cle
9680: 61 72 28 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b  ar(0);.  return;
9690: 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 6e 6f 74 68  .}../* Add anoth
96a0: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  er configuration
96b0: 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72   to the configur
96c0: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74  ation list */.st
96d0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
96e0: 66 69 67 6c 69 73 74 5f 61 64 64 28 72 70 2c 64  figlist_add(rp,d
96f0: 6f 74 29 0a 73 74 72 75 63 74 20 72 75 6c 65 20  ot).struct rule 
9700: 2a 72 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 72  *rp;    /* The r
9710: 75 6c 65 20 2a 2f 0a 69 6e 74 20 64 6f 74 3b 20  ule */.int dot; 
9720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9730: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 52 48 53  dex into the RHS
9740: 20 6f 66 20 74 68 65 20 72 75 6c 65 20 77 68 65   of the rule whe
9750: 72 65 20 74 68 65 20 64 6f 74 20 67 6f 65 73 20  re the dot goes 
9760: 2a 2f 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  */.{.  struct co
9770: 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c  nfig *cfp, model
9780: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
9790: 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20  rentend!=0 );.  
97a0: 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20  model.rp = rp;. 
97b0: 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74   model.dot = dot
97c0: 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67  ;.  cfp = Config
97d0: 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65  table_find(&mode
97e0: 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30  l);.  if( cfp==0
97f0: 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65   ){.    cfp = ne
9800: 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63  wconfig();.    c
9810: 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20  fp->rp = rp;.   
9820: 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b   cfp->dot = dot;
9830: 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20  .    cfp->fws = 
9840: 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66  SetNew();.    cf
9850: 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20  p->stp = 0;.    
9860: 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d  cfp->fplp = cfp-
9870: 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63  >bplp = 0;.    c
9880: 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  fp->next = 0;.  
9890: 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20    cfp->bp = 0;. 
98a0: 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d     *currentend =
98b0: 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e   cfp;.    curren
98c0: 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78  tend = &cfp->nex
98d0: 74 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62  t;.    Configtab
98e0: 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a  le_insert(cfp);.
98f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70    }.  return cfp
9900: 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62 61  ;.}../* Add a ba
9910: 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  sis configuratio
9920: 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75  n to the configu
9930: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73  ration list */.s
9940: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
9950: 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69  nfiglist_addbasi
9960: 73 28 72 70 2c 64 6f 74 29 0a 73 74 72 75 63 74  s(rp,dot).struct
9970: 20 72 75 6c 65 20 2a 72 70 3b 0a 69 6e 74 20 64   rule *rp;.int d
9980: 6f 74 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63  ot;.{.  struct c
9990: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65  onfig *cfp, mode
99a0: 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 62 61  l;..  assert( ba
99b0: 73 69 73 65 6e 64 21 3d 30 20 29 3b 0a 20 20 61  sisend!=0 );.  a
99c0: 73 73 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e  ssert( currenten
99d0: 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e  d!=0 );.  model.
99e0: 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c  rp = rp;.  model
99f0: 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66  .dot = dot;.  cf
9a00: 70 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  p = Configtable_
9a10: 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20  find(&model);.  
9a20: 69 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20  if( cfp==0 ){.  
9a30: 20 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69    cfp = newconfi
9a40: 67 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70  g();.    cfp->rp
9a50: 20 3d 20 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e   = rp;.    cfp->
9a60: 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63  dot = dot;.    c
9a70: 66 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65 77  fp->fws = SetNew
9a80: 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74 70  ();.    cfp->stp
9a90: 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66   = 0;.    cfp->f
9aa0: 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20  plp = cfp->bplp 
9ab0: 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65  = 0;.    cfp->ne
9ac0: 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d  xt = 0;.    cfp-
9ad0: 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75  >bp = 0;.    *cu
9ae0: 72 72 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a  rrentend = cfp;.
9af0: 20 20 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d      currentend =
9b00: 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20   &cfp->next;.   
9b10: 20 2a 62 61 73 69 73 65 6e 64 20 3d 20 63 66 70   *basisend = cfp
9b20: 3b 0a 20 20 20 20 62 61 73 69 73 65 6e 64 20 3d  ;.    basisend =
9b30: 20 26 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20 43   &cfp->bp;.    C
9b40: 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72  onfigtable_inser
9b50: 74 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65  t(cfp);.  }.  re
9b60: 74 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20  turn cfp;.}../* 
9b70: 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6c 6f 73  Compute the clos
9b80: 75 72 65 20 6f 66 20 74 68 65 20 63 6f 6e 66 69  ure of the confi
9b90: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  guration list */
9ba0: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
9bb0: 5f 63 6c 6f 73 75 72 65 28 6c 65 6d 70 29 0a 73  _closure(lemp).s
9bc0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
9bd0: 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  p;.{.  struct co
9be0: 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6e 65 77 63  nfig *cfp, *newc
9bf0: 66 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  fp;.  struct rul
9c00: 65 20 2a 72 70 2c 20 2a 6e 65 77 72 70 3b 0a 20  e *rp, *newrp;. 
9c10: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
9c20: 73 70 2c 20 2a 78 73 70 3b 0a 20 20 69 6e 74 20  sp, *xsp;.  int 
9c30: 69 2c 20 64 6f 74 3b 0a 0a 20 20 61 73 73 65 72  i, dot;..  asser
9c40: 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30  t( currentend!=0
9c50: 20 29 3b 0a 20 20 66 6f 72 28 63 66 70 3d 63 75   );.  for(cfp=cu
9c60: 72 72 65 6e 74 3b 20 63 66 70 3b 20 63 66 70 3d  rrent; cfp; cfp=
9c70: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
9c80: 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20  rp = cfp->rp;.  
9c90: 20 20 64 6f 74 20 3d 20 63 66 70 2d 3e 64 6f 74    dot = cfp->dot
9ca0: 3b 0a 20 20 20 20 69 66 28 20 64 6f 74 3e 3d 72  ;.    if( dot>=r
9cb0: 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e  p->nrhs ) contin
9cc0: 75 65 3b 0a 20 20 20 20 73 70 20 3d 20 72 70 2d  ue;.    sp = rp-
9cd0: 3e 72 68 73 5b 64 6f 74 5d 3b 0a 20 20 20 20 69  >rhs[dot];.    i
9ce0: 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e  f( sp->type==NON
9cf0: 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
9d00: 20 20 69 66 28 20 73 70 2d 3e 72 75 6c 65 3d 3d    if( sp->rule==
9d10: 30 20 26 26 20 73 70 21 3d 6c 65 6d 70 2d 3e 65  0 && sp!=lemp->e
9d20: 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20 20  rrsym ){.       
9d30: 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
9d40: 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69 6e  filename,rp->lin
9d50: 65 2c 22 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20 5c  e,"Nonterminal \
9d60: 22 25 73 5c 22 20 68 61 73 20 6e 6f 20 72 75 6c  "%s\" has no rul
9d70: 65 73 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  es.",.          
9d80: 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
9d90: 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
9da0: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
9db0: 20 20 20 66 6f 72 28 6e 65 77 72 70 3d 73 70 2d     for(newrp=sp-
9dc0: 3e 72 75 6c 65 3b 20 6e 65 77 72 70 3b 20 6e 65  >rule; newrp; ne
9dd0: 77 72 70 3d 6e 65 77 72 70 2d 3e 6e 65 78 74 6c  wrp=newrp->nextl
9de0: 68 73 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77  hs){.        new
9df0: 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74  cfp = Configlist
9e00: 5f 61 64 64 28 6e 65 77 72 70 2c 30 29 3b 0a 20  _add(newrp,0);. 
9e10: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 64 6f 74         for(i=dot
9e20: 2b 31 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  +1; i<rp->nrhs; 
9e30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
9e40: 78 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d  xsp = rp->rhs[i]
9e50: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
9e60: 78 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49  xsp->type==TERMI
9e70: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
9e80: 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66 70     SetAdd(newcfp
9e90: 2d 3e 66 77 73 2c 78 73 70 2d 3e 69 6e 64 65 78  ->fws,xsp->index
9ea0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
9eb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
9ec0: 7d 65 6c 73 65 20 69 66 28 20 78 73 70 2d 3e 74  }else if( xsp->t
9ed0: 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype==MULTITERMIN
9ee0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
9ef0: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
9f00: 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
9f10: 78 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b  xsp->nsubsym; k+
9f20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
9f30: 20 20 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d    SetAdd(newcfp-
9f40: 3e 66 77 73 2c 20 78 73 70 2d 3e 73 75 62 73 79  >fws, xsp->subsy
9f50: 6d 5b 6b 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20  m[k]->index);.  
9f60: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9f70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09          break;..
9f80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9f90: 20 20 20 20 20 53 65 74 55 6e 69 6f 6e 28 6e 65       SetUnion(ne
9fa0: 77 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 66  wcfp->fws,xsp->f
9fb0: 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20 20  irstset);.      
9fc0: 20 20 20 20 20 20 69 66 28 20 78 73 70 2d 3e 6c        if( xsp->l
9fd0: 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c  ambda==LEMON_FAL
9fe0: 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 20 20 7d  SE ) break;..  }
9ff0: 0a 09 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ..}.        if( 
a000: 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 50 6c  i==rp->nrhs ) Pl
a010: 69 6e 6b 5f 61 64 64 28 26 63 66 70 2d 3e 66 70  ink_add(&cfp->fp
a020: 6c 70 2c 6e 65 77 63 66 70 29 3b 0a 20 20 20 20  lp,newcfp);.    
a030: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
a040: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f  return;.}../* So
a050: 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  rt the configura
a060: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69  tion list */.voi
a070: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72  d Configlist_sor
a080: 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d  t(){.  current =
a090: 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20   (struct config 
a0a0: 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20 2a 29  *)msort((char *)
a0b0: 63 75 72 72 65 6e 74 2c 28 63 68 61 72 20 2a 2a  current,(char **
a0c0: 29 26 28 63 75 72 72 65 6e 74 2d 3e 6e 65 78 74  )&(current->next
a0d0: 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20  ),Configcmp);.  
a0e0: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a  currentend = 0;.
a0f0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
a100: 53 6f 72 74 20 74 68 65 20 62 61 73 69 73 20 63  Sort the basis c
a110: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
a120: 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  t */.void Config
a130: 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28 29  list_sortbasis()
a140: 7b 0a 20 20 62 61 73 69 73 20 3d 20 28 73 74 72  {.  basis = (str
a150: 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d 73 6f  uct config *)mso
a160: 72 74 28 28 63 68 61 72 20 2a 29 63 75 72 72 65  rt((char *)curre
a170: 6e 74 2c 28 63 68 61 72 20 2a 2a 29 26 28 63 75  nt,(char **)&(cu
a180: 72 72 65 6e 74 2d 3e 62 70 29 2c 43 6f 6e 66 69  rrent->bp),Confi
a190: 67 63 6d 70 29 3b 0a 20 20 62 61 73 69 73 65 6e  gcmp);.  basisen
a1a0: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  d = 0;.  return;
a1b0: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
a1c0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
a1d0: 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69  ead of the confi
a1e0: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  guration list an
a1f0: 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c  d.** reset the l
a200: 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f  ist */.struct co
a210: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
a220: 5f 72 65 74 75 72 6e 28 29 7b 0a 20 20 73 74 72  _return(){.  str
a230: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b  uct config *old;
a240: 0a 20 20 6f 6c 64 20 3d 20 63 75 72 72 65 6e 74  .  old = current
a250: 3b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b  ;.  current = 0;
a260: 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20  .  currentend = 
a270: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b  0;.  return old;
a280: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
a290: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
a2a0: 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69  ead of the confi
a2b0: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  guration list an
a2c0: 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c  d.** reset the l
a2d0: 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f  ist */.struct co
a2e0: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
a2f0: 5f 62 61 73 69 73 28 29 7b 0a 20 20 73 74 72 75  _basis(){.  stru
a300: 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a  ct config *old;.
a310: 20 20 6f 6c 64 20 3d 20 62 61 73 69 73 3b 0a 20    old = basis;. 
a320: 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61   basis = 0;.  ba
a330: 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65  sisend = 0;.  re
a340: 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20  turn old;.}../* 
a350: 46 72 65 65 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  Free all element
a360: 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63  s of the given c
a370: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
a380: 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  t */.void Config
a390: 6c 69 73 74 5f 65 61 74 28 63 66 70 29 0a 73 74  list_eat(cfp).st
a3a0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
a3b0: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ;.{.  struct con
a3c0: 66 69 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20 20  fig *nextcfp;.  
a3d0: 66 6f 72 28 3b 20 63 66 70 3b 20 63 66 70 3d 6e  for(; cfp; cfp=n
a3e0: 65 78 74 63 66 70 29 7b 0a 20 20 20 20 6e 65 78  extcfp){.    nex
a3f0: 74 63 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78 74  tcfp = cfp->next
a400: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 66  ;.    assert( cf
a410: 70 2d 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20 20  p->fplp==0 );.  
a420: 20 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e 62    assert( cfp->b
a430: 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  plp==0 );.    if
a440: 28 20 63 66 70 2d 3e 66 77 73 20 29 20 53 65 74  ( cfp->fws ) Set
a450: 46 72 65 65 28 63 66 70 2d 3e 66 77 73 29 3b 0a  Free(cfp->fws);.
a460: 20 20 20 20 64 65 6c 65 74 65 63 6f 6e 66 69 67      deleteconfig
a470: 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (cfp);.  }.  ret
a480: 75 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  urn;.}./********
a490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
a4a0: 68 65 20 66 69 6c 65 20 22 65 72 72 6f 72 2e 63  he file "error.c
a4b0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
a4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a4d0: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ***/./*.** Code 
a4e0: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 65 72 72  for printing err
a4f0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a  or message..*/..
a500: 2f 2a 20 46 69 6e 64 20 61 20 67 6f 6f 64 20 70  /* Find a good p
a510: 6c 61 63 65 20 74 6f 20 62 72 65 61 6b 20 22 6d  lace to break "m
a520: 73 67 22 20 73 6f 20 74 68 61 74 20 69 74 73 20  sg" so that its 
a530: 6c 65 6e 67 74 68 20 69 73 20 61 74 20 6c 65 61  length is at lea
a540: 73 74 20 22 6d 69 6e 22 0a 2a 2a 20 62 75 74 20  st "min".** but 
a550: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 22 6d 61  no more than "ma
a560: 78 22 2e 20 20 4d 61 6b 65 20 74 68 65 20 70 6f  x".  Make the po
a570: 69 6e 74 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  int as close to 
a580: 6d 61 78 20 61 73 20 70 6f 73 73 69 62 6c 65 2e  max as possible.
a590: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
a5a0: 69 6e 64 62 72 65 61 6b 28 6d 73 67 2c 6d 69 6e  indbreak(msg,min
a5b0: 2c 6d 61 78 29 0a 63 68 61 72 20 2a 6d 73 67 3b  ,max).char *msg;
a5c0: 0a 69 6e 74 20 6d 69 6e 3b 0a 69 6e 74 20 6d 61  .int min;.int ma
a5d0: 78 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 73 70 6f  x;.{.  int i,spo
a5e0: 74 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 66  t;.  char c;.  f
a5f0: 6f 72 28 69 3d 73 70 6f 74 3d 6d 69 6e 3b 20 69  or(i=spot=min; i
a600: 3c 3d 6d 61 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  <=max; i++){.   
a610: 20 63 20 3d 20 6d 73 67 5b 69 5d 3b 0a 20 20 20   c = msg[i];.   
a620: 20 69 66 28 20 63 3d 3d 27 5c 74 27 20 29 20 6d   if( c=='\t' ) m
a630: 73 67 5b 69 5d 20 3d 20 27 20 27 3b 0a 20 20 20  sg[i] = ' ';.   
a640: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 20   if( c=='\n' ){ 
a650: 6d 73 67 5b 69 5d 20 3d 20 27 20 27 3b 20 73 70  msg[i] = ' '; sp
a660: 6f 74 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20 7d  ot = i; break; }
a670: 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b  .    if( c==0 ){
a680: 20 73 70 6f 74 20 3d 20 69 3b 20 62 72 65 61 6b   spot = i; break
a690: 3b 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  ; }.    if( c=='
a6a0: 2d 27 20 26 26 20 69 3c 6d 61 78 2d 31 20 29 20  -' && i<max-1 ) 
a6b0: 73 70 6f 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20  spot = i+1;.    
a6c0: 69 66 28 20 63 3d 3d 27 20 27 20 29 20 73 70 6f  if( c==' ' ) spo
a6d0: 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  t = i;.  }.  ret
a6e0: 75 72 6e 20 73 70 6f 74 3b 0a 7d 0a 0a 2f 2a 0a  urn spot;.}../*.
a6f0: 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 6d 65 73  ** The error mes
a700: 73 61 67 65 20 69 73 20 73 70 6c 69 74 20 61 63  sage is split ac
a710: 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 20 6c 69  ross multiple li
a720: 6e 65 73 20 69 66 20 6e 65 63 65 73 73 61 72 79  nes if necessary
a730: 2e 20 20 54 68 65 0a 2a 2a 20 73 70 6c 69 74 73  .  The.** splits
a740: 20 6f 63 63 75 72 20 61 74 20 61 20 73 70 61 63   occur at a spac
a750: 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 61  e, if there is a
a760: 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
a770: 20 6e 65 61 72 20 74 68 65 20 65 6e 64 0a 2a 2a   near the end.**
a780: 20 6f 66 20 74 68 65 20 6c 69 6e 65 2e 0a 2a 2f   of the line..*/
a790: 0a 23 64 65 66 69 6e 65 20 45 52 52 4d 53 47 53  .#define ERRMSGS
a7a0: 49 5a 45 20 20 31 30 30 30 30 20 2f 2a 20 48 6f  IZE  10000 /* Ho
a7b0: 70 65 20 74 68 69 73 20 69 73 20 62 69 67 20 65  pe this is big e
a7c0: 6e 6f 75 67 68 2e 20 20 4e 6f 20 77 61 79 20 74  nough.  No way t
a7d0: 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 20 2a 2f  o error check */
a7e0: 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 57 49 44  .#define LINEWID
a7f0: 54 48 20 20 20 20 20 20 37 39 20 2f 2a 20 4d 61  TH      79 /* Ma
a800: 78 20 77 69 64 74 68 20 6f 66 20 61 6e 79 20 6f  x width of any o
a810: 75 74 70 75 74 20 6c 69 6e 65 20 2a 2f 0a 23 64  utput line */.#d
a820: 65 66 69 6e 65 20 50 52 45 46 49 58 4c 49 4d 49  efine PREFIXLIMI
a830: 54 20 20 20 20 33 30 20 2f 2a 20 4d 61 78 20 77  T    30 /* Max w
a840: 69 64 74 68 20 6f 66 20 74 68 65 20 70 72 65 66  idth of the pref
a850: 69 78 20 6f 6e 20 65 61 63 68 20 6c 69 6e 65 20  ix on each line 
a860: 2a 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67  */.void ErrorMsg
a870: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c  (const char *fil
a880: 65 6e 61 6d 65 2c 20 69 6e 74 20 6c 69 6e 65 6e  ename, int linen
a890: 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  o, const char *f
a8a0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63  ormat, ...){.  c
a8b0: 68 61 72 20 65 72 72 6d 73 67 5b 45 52 52 4d 53  har errmsg[ERRMS
a8c0: 47 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70  GSIZE];.  char p
a8d0: 72 65 66 69 78 5b 50 52 45 46 49 58 4c 49 4d 49  refix[PREFIXLIMI
a8e0: 54 2b 31 30 5d 3b 0a 20 20 69 6e 74 20 65 72 72  T+10];.  int err
a8f0: 6d 73 67 73 69 7a 65 3b 0a 20 20 69 6e 74 20 70  msgsize;.  int p
a900: 72 65 66 69 78 73 69 7a 65 3b 0a 20 20 69 6e 74  refixsize;.  int
a910: 20 61 76 61 69 6c 61 62 6c 65 77 69 64 74 68 3b   availablewidth;
a920: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
a930: 20 69 6e 74 20 65 6e 64 2c 20 72 65 73 74 61 72   int end, restar
a940: 74 2c 20 62 61 73 65 3b 0a 0a 20 20 76 61 5f 73  t, base;..  va_s
a950: 74 61 72 74 28 61 70 2c 20 66 6f 72 6d 61 74 29  tart(ap, format)
a960: 3b 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 61  ;.  /* Prepare a
a970: 20 70 72 65 66 69 78 20 74 6f 20 62 65 20 70 72   prefix to be pr
a980: 65 70 65 6e 64 65 64 20 74 6f 20 65 76 65 72 79  epended to every
a990: 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 2a 2f 0a   output line */.
a9a0: 20 20 69 66 28 20 6c 69 6e 65 6e 6f 3e 30 20 29    if( lineno>0 )
a9b0: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 70 72  {.    sprintf(pr
a9c0: 65 66 69 78 2c 22 25 2e 2a 73 3a 25 64 3a 20 22  efix,"%.*s:%d: "
a9d0: 2c 50 52 45 46 49 58 4c 49 4d 49 54 2d 31 30 2c  ,PREFIXLIMIT-10,
a9e0: 66 69 6c 65 6e 61 6d 65 2c 6c 69 6e 65 6e 6f 29  filename,lineno)
a9f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
aa00: 70 72 69 6e 74 66 28 70 72 65 66 69 78 2c 22 25  printf(prefix,"%
aa10: 2e 2a 73 3a 20 22 2c 50 52 45 46 49 58 4c 49 4d  .*s: ",PREFIXLIM
aa20: 49 54 2d 31 30 2c 66 69 6c 65 6e 61 6d 65 29 3b  IT-10,filename);
aa30: 0a 20 20 7d 0a 20 20 70 72 65 66 69 78 73 69 7a  .  }.  prefixsiz
aa40: 65 20 3d 20 73 74 72 6c 65 6e 28 70 72 65 66 69  e = strlen(prefi
aa50: 78 29 3b 0a 20 20 61 76 61 69 6c 61 62 6c 65 77  x);.  availablew
aa60: 69 64 74 68 20 3d 20 4c 49 4e 45 57 49 44 54 48  idth = LINEWIDTH
aa70: 20 2d 20 70 72 65 66 69 78 73 69 7a 65 3b 0a 0a   - prefixsize;..
aa80: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
aa90: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
aaa0: 2a 2f 0a 20 20 76 73 70 72 69 6e 74 66 28 65 72  */.  vsprintf(er
aab0: 72 6d 73 67 2c 66 6f 72 6d 61 74 2c 61 70 29 3b  rmsg,format,ap);
aac0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
aad0: 20 65 72 72 6d 73 67 73 69 7a 65 20 3d 20 73 74   errmsgsize = st
aae0: 72 6c 65 6e 28 65 72 72 6d 73 67 29 3b 0a 20 20  rlen(errmsg);.  
aaf0: 2f 2a 20 52 65 6d 6f 76 65 20 74 72 61 69 6c 69  /* Remove traili
ab00: 6e 67 20 27 5c 6e 27 73 20 66 72 6f 6d 20 74 68  ng '\n's from th
ab10: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
ab20: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 65 72 72   */.  while( err
ab30: 6d 73 67 73 69 7a 65 3e 30 20 26 26 20 65 72 72  msgsize>0 && err
ab40: 6d 73 67 5b 65 72 72 6d 73 67 73 69 7a 65 2d 31  msg[errmsgsize-1
ab50: 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  ]=='\n' ){.     
ab60: 65 72 72 6d 73 67 5b 2d 2d 65 72 72 6d 73 67 73  errmsg[--errmsgs
ab70: 69 7a 65 5d 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ize] = 0;.  }.. 
ab80: 20 2f 2a 20 50 72 69 6e 74 20 74 68 65 20 65 72   /* Print the er
ab90: 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20  ror message */. 
aba0: 20 62 61 73 65 20 3d 20 30 3b 0a 20 20 77 68 69   base = 0;.  whi
abb0: 6c 65 28 20 65 72 72 6d 73 67 5b 62 61 73 65 5d  le( errmsg[base]
abc0: 21 3d 30 20 29 7b 0a 20 20 20 20 65 6e 64 20 3d  !=0 ){.    end =
abd0: 20 72 65 73 74 61 72 74 20 3d 20 66 69 6e 64 62   restart = findb
abe0: 72 65 61 6b 28 26 65 72 72 6d 73 67 5b 62 61 73  reak(&errmsg[bas
abf0: 65 5d 2c 30 2c 61 76 61 69 6c 61 62 6c 65 77 69  e],0,availablewi
ac00: 64 74 68 29 3b 0a 20 20 20 20 72 65 73 74 61 72  dth);.    restar
ac10: 74 20 2b 3d 20 62 61 73 65 3b 0a 20 20 20 20 77  t += base;.    w
ac20: 68 69 6c 65 28 20 65 72 72 6d 73 67 5b 72 65 73  hile( errmsg[res
ac30: 74 61 72 74 5d 3d 3d 27 20 27 20 29 20 72 65 73  tart]==' ' ) res
ac40: 74 61 72 74 2b 2b 3b 0a 20 20 20 20 66 70 72 69  tart++;.    fpri
ac50: 6e 74 66 28 73 74 64 6f 75 74 2c 22 25 73 25 2e  ntf(stdout,"%s%.
ac60: 2a 73 5c 6e 22 2c 70 72 65 66 69 78 2c 65 6e 64  *s\n",prefix,end
ac70: 2c 26 65 72 72 6d 73 67 5b 62 61 73 65 5d 29 3b  ,&errmsg[base]);
ac80: 0a 20 20 20 20 62 61 73 65 20 3d 20 72 65 73 74  .    base = rest
ac90: 61 72 74 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a  art;.  }.}./****
aca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
acb0: 6d 20 74 68 65 20 66 69 6c 65 20 22 6d 61 69 6e  m the file "main
acc0: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
acd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ace0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
acf0: 4d 61 69 6e 20 70 72 6f 67 72 61 6d 20 66 69 6c  Main program fil
ad00: 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20  e for the LEMON 
ad10: 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
ad20: 2e 0a 2a 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74 20  ..*/../* Report 
ad30: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
ad40: 20 63 6f 6e 64 69 74 69 6f 6e 20 61 6e 64 20 61   condition and a
ad50: 62 6f 72 74 2e 20 20 54 68 69 73 20 66 75 6e 63  bort.  This func
ad60: 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20  tion.** is used 
ad70: 6d 6f 73 74 6c 79 20 62 79 20 74 68 65 20 22 4d  mostly by the "M
ad80: 65 6d 6f 72 79 43 68 65 63 6b 22 20 6d 61 63 72  emoryCheck" macr
ad90: 6f 20 69 6e 20 73 74 72 75 63 74 2e 68 0a 2a 2f  o in struct.h.*/
ada0: 0a 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72  .void memory_err
adb0: 6f 72 28 29 7b 0a 20 20 66 70 72 69 6e 74 66 28  or(){.  fprintf(
adc0: 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d  stderr,"Out of m
add0: 65 6d 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e 67  emory.  Aborting
ade0: 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28  ...\n");.  exit(
adf0: 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  1);.}..static in
ae00: 74 20 6e 44 65 66 69 6e 65 20 3d 20 30 3b 20 20  t nDefine = 0;  
ae10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ae20: 20 2d 44 20 6f 70 74 69 6f 6e 73 20 6f 6e 20 74   -D options on t
ae30: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
ae40: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
ae50: 2a 61 7a 44 65 66 69 6e 65 20 3d 20 30 3b 20 20  *azDefine = 0;  
ae60: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 2d  /* Name of the -
ae70: 44 20 6d 61 63 72 6f 73 20 2a 2f 0a 0a 2f 2a 20  D macros */../* 
ae80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
ae90: 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
aea0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 65 61 63 68  argument to each
aeb0: 20 2d 44 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65   -D command-line
aec0: 20 6f 70 74 69 6f 6e 2e 0a 2a 2a 20 41 64 64 20   option..** Add 
aed0: 74 68 65 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  the macro define
aee0: 64 20 74 6f 20 74 68 65 20 61 7a 44 65 66 69 6e  d to the azDefin
aef0: 65 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  e array..*/.stat
af00: 69 63 20 76 6f 69 64 20 68 61 6e 64 6c 65 5f 44  ic void handle_D
af10: 5f 6f 70 74 69 6f 6e 28 63 68 61 72 20 2a 7a 29  _option(char *z)
af20: 7b 0a 20 20 63 68 61 72 20 2a 2a 70 61 7a 3b 0a  {.  char **paz;.
af30: 20 20 6e 44 65 66 69 6e 65 2b 2b 3b 0a 20 20 61    nDefine++;.  a
af40: 7a 44 65 66 69 6e 65 20 3d 20 72 65 61 6c 6c 6f  zDefine = reallo
af50: 63 28 61 7a 44 65 66 69 6e 65 2c 20 73 69 7a 65  c(azDefine, size
af60: 6f 66 28 61 7a 44 65 66 69 6e 65 5b 30 5d 29 2a  of(azDefine[0])*
af70: 6e 44 65 66 69 6e 65 29 3b 0a 20 20 69 66 28 20  nDefine);.  if( 
af80: 61 7a 44 65 66 69 6e 65 3d 3d 30 20 29 7b 0a 20  azDefine==0 ){. 
af90: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
afa0: 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"out of memory
afb0: 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
afc0: 29 3b 0a 20 20 7d 0a 20 20 70 61 7a 20 3d 20 26  );.  }.  paz = &
afd0: 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69 6e 65  azDefine[nDefine
afe0: 2d 31 5d 3b 0a 20 20 2a 70 61 7a 20 3d 20 6d 61  -1];.  *paz = ma
aff0: 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 7a 29 2b  lloc( strlen(z)+
b000: 31 20 29 3b 0a 20 20 69 66 28 20 2a 70 61 7a 3d  1 );.  if( *paz=
b010: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
b020: 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20 6f 66  f(stderr,"out of
b030: 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
b040: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
b050: 73 74 72 63 70 79 28 2a 70 61 7a 2c 20 7a 29 3b  strcpy(*paz, z);
b060: 0a 20 20 66 6f 72 28 7a 3d 2a 70 61 7a 3b 20 2a  .  for(z=*paz; *
b070: 7a 20 26 26 20 2a 7a 21 3d 27 3d 27 3b 20 7a 2b  z && *z!='='; z+
b080: 2b 29 7b 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d  +){}.  *z = 0;.}
b090: 0a 0a 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70  .../* The main p
b0a0: 72 6f 67 72 61 6d 2e 20 20 50 61 72 73 65 20 74  rogram.  Parse t
b0b0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
b0c0: 61 6e 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a  and do it... */.
b0d0: 69 6e 74 20 6d 61 69 6e 28 61 72 67 63 2c 61 72  int main(argc,ar
b0e0: 67 76 29 0a 69 6e 74 20 61 72 67 63 3b 0a 63 68  gv).int argc;.ch
b0f0: 61 72 20 2a 2a 61 72 67 76 3b 0a 7b 0a 20 20 73  ar **argv;.{.  s
b100: 74 61 74 69 63 20 69 6e 74 20 76 65 72 73 69 6f  tatic int versio
b110: 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  n = 0;.  static 
b120: 69 6e 74 20 72 70 66 6c 61 67 20 3d 20 30 3b 0a  int rpflag = 0;.
b130: 20 20 73 74 61 74 69 63 20 69 6e 74 20 62 61 73    static int bas
b140: 69 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74  isflag = 0;.  st
b150: 61 74 69 63 20 69 6e 74 20 63 6f 6d 70 72 65 73  atic int compres
b160: 73 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  s = 0;.  static 
b170: 69 6e 74 20 71 75 69 65 74 20 3d 20 30 3b 0a 20  int quiet = 0;. 
b180: 20 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 74   static int stat
b190: 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 73 74  istics = 0;.  st
b1a0: 61 74 69 63 20 69 6e 74 20 6d 68 66 6c 61 67 20  atic int mhflag 
b1b0: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74  = 0;.  static st
b1c0: 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f  ruct s_options o
b1d0: 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20  ptions[] = {.   
b1e0: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c   {OPT_FLAG, "b",
b1f0: 20 28 63 68 61 72 2a 29 26 62 61 73 69 73 66 6c   (char*)&basisfl
b200: 61 67 2c 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20  ag, "Print only 
b210: 74 68 65 20 62 61 73 69 73 20 69 6e 20 72 65 70  the basis in rep
b220: 6f 72 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ort."},.    {OPT
b230: 5f 46 4c 41 47 2c 20 22 63 22 2c 20 28 63 68 61  _FLAG, "c", (cha
b240: 72 2a 29 26 63 6f 6d 70 72 65 73 73 2c 20 22 44  r*)&compress, "D
b250: 6f 6e 27 74 20 63 6f 6d 70 72 65 73 73 20 74 68  on't compress th
b260: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22  e action table."
b270: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52  },.    {OPT_FSTR
b280: 2c 20 22 44 22 2c 20 28 63 68 61 72 2a 29 68 61  , "D", (char*)ha
b290: 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22  ndle_D_option, "
b2a0: 44 65 66 69 6e 65 20 61 6e 20 25 69 66 64 65 66  Define an %ifdef
b2b0: 20 6d 61 63 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b   macro."},.    {
b2c0: 4f 50 54 5f 46 4c 41 47 2c 20 22 67 22 2c 20 28  OPT_FLAG, "g", (
b2d0: 63 68 61 72 2a 29 26 72 70 66 6c 61 67 2c 20 22  char*)&rpflag, "
b2e0: 50 72 69 6e 74 20 67 72 61 6d 6d 61 72 20 77 69  Print grammar wi
b2f0: 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 2e 22 7d  thout actions."}
b300: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
b310: 20 22 6d 22 2c 20 28 63 68 61 72 2a 29 26 6d 68   "m", (char*)&mh
b320: 66 6c 61 67 2c 20 22 4f 75 74 70 75 74 20 61 20  flag, "Output a 
b330: 6d 61 6b 65 68 65 61 64 65 72 73 20 63 6f 6d 70  makeheaders comp
b340: 61 74 69 62 6c 65 20 66 69 6c 65 22 7d 2c 0a 20  atible file"},. 
b350: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71     {OPT_FLAG, "q
b360: 22 2c 20 28 63 68 61 72 2a 29 26 71 75 69 65 74  ", (char*)&quiet
b370: 2c 20 22 28 51 75 69 65 74 29 20 44 6f 6e 27 74  , "(Quiet) Don't
b380: 20 70 72 69 6e 74 20 74 68 65 20 72 65 70 6f 72   print the repor
b390: 74 20 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b  t file."},.    {
b3a0: 4f 50 54 5f 46 4c 41 47 2c 20 22 73 22 2c 20 28  OPT_FLAG, "s", (
b3b0: 63 68 61 72 2a 29 26 73 74 61 74 69 73 74 69 63  char*)&statistic
b3c0: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3e0: 20 20 20 20 20 20 22 50 72 69 6e 74 20 70 61 72        "Print par
b3f0: 73 65 72 20 73 74 61 74 73 20 74 6f 20 73 74 61  ser stats to sta
b400: 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 22 7d 2c  ndard output."},
b410: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
b420: 22 78 22 2c 20 28 63 68 61 72 2a 29 26 76 65 72  "x", (char*)&ver
b430: 73 69 6f 6e 2c 20 22 50 72 69 6e 74 20 74 68 65  sion, "Print the
b440: 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 2e   version number.
b450: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
b460: 47 2c 30 2c 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20  G,0,0,0}.  };.  
b470: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
b480: 6c 65 6d 6f 6e 20 6c 65 6d 3b 0a 0a 20 20 4f 70  lemon lem;..  Op
b490: 74 49 6e 69 74 28 61 72 67 76 2c 6f 70 74 69 6f  tInit(argv,optio
b4a0: 6e 73 2c 73 74 64 65 72 72 29 3b 0a 20 20 69 66  ns,stderr);.  if
b4b0: 28 20 76 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20  ( version ){.   
b4c0: 20 20 70 72 69 6e 74 66 28 22 4c 65 6d 6f 6e 20    printf("Lemon 
b4d0: 76 65 72 73 69 6f 6e 20 31 2e 30 5c 6e 22 29 3b  version 1.0\n");
b4e0: 0a 20 20 20 20 20 65 78 69 74 28 30 29 3b 20 0a  .     exit(0); .
b4f0: 20 20 7d 0a 20 20 69 66 28 20 4f 70 74 4e 41 72    }.  if( OptNAr
b500: 67 73 28 29 21 3d 31 20 29 7b 0a 20 20 20 20 66  gs()!=1 ){.    f
b510: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
b520: 78 61 63 74 6c 79 20 6f 6e 65 20 66 69 6c 65 6e  xactly one filen
b530: 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
b540: 72 65 71 75 69 72 65 64 2e 5c 6e 22 29 3b 0a 20  required.\n");. 
b550: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
b560: 20 20 6d 65 6d 73 65 74 28 26 6c 65 6d 2c 20 30    memset(&lem, 0
b570: 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 29 29 3b 0a  , sizeof(lem));.
b580: 20 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3d    lem.errorcnt =
b590: 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61   0;..  /* Initia
b5a0: 6c 69 7a 65 20 74 68 65 20 6d 61 63 68 69 6e 65  lize the machine
b5b0: 20 2a 2f 0a 20 20 53 74 72 73 61 66 65 5f 69 6e   */.  Strsafe_in
b5c0: 69 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69  it();.  Symbol_i
b5d0: 6e 69 74 28 29 3b 0a 20 20 53 74 61 74 65 5f 69  nit();.  State_i
b5e0: 6e 69 74 28 29 3b 0a 20 20 6c 65 6d 2e 61 72 67  nit();.  lem.arg
b5f0: 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20  v0 = argv[0];.  
b600: 6c 65 6d 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 4f  lem.filename = O
b610: 70 74 41 72 67 28 30 29 3b 0a 20 20 6c 65 6d 2e  ptArg(0);.  lem.
b620: 62 61 73 69 73 66 6c 61 67 20 3d 20 62 61 73 69  basisflag = basi
b630: 73 66 6c 61 67 3b 0a 20 20 53 79 6d 62 6f 6c 5f  sflag;.  Symbol_
b640: 6e 65 77 28 22 24 22 29 3b 0a 20 20 6c 65 6d 2e  new("$");.  lem.
b650: 65 72 72 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f  errsym = Symbol_
b660: 6e 65 77 28 22 65 72 72 6f 72 22 29 3b 0a 20 20  new("error");.  
b670: 6c 65 6d 2e 65 72 72 73 79 6d 2d 3e 75 73 65 43  lem.errsym->useC
b680: 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 61  nt = 0;..  /* Pa
b690: 72 73 65 20 74 68 65 20 69 6e 70 75 74 20 66 69  rse the input fi
b6a0: 6c 65 20 2a 2f 0a 20 20 50 61 72 73 65 28 26 6c  le */.  Parse(&l
b6b0: 65 6d 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 65  em);.  if( lem.e
b6c0: 72 72 6f 72 63 6e 74 20 29 20 65 78 69 74 28 6c  rrorcnt ) exit(l
b6d0: 65 6d 2e 65 72 72 6f 72 63 6e 74 29 3b 0a 20 20  em.errorcnt);.  
b6e0: 69 66 28 20 6c 65 6d 2e 6e 72 75 6c 65 3d 3d 30  if( lem.nrule==0
b6f0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
b700: 73 74 64 65 72 72 2c 22 45 6d 70 74 79 20 67 72  stderr,"Empty gr
b710: 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20 20 20  ammar.\n");.    
b720: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20  exit(1);.  }..  
b730: 2f 2a 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e 64  /* Count and ind
b740: 65 78 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 6f  ex the symbols o
b750: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f  f the grammar */
b760: 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d  .  lem.nsymbol =
b770: 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b   Symbol_count();
b780: 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b  .  Symbol_new("{
b790: 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c 65  default}");.  le
b7a0: 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d 62  m.symbols = Symb
b7b0: 6f 6c 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20 20  ol_arrayof();.  
b7c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6c 65 6d 2e  for(i=0; i<=lem.
b7d0: 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65  nsymbol; i++) le
b7e0: 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e  m.symbols[i]->in
b7f0: 64 65 78 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74  dex = i;.  qsort
b800: 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65 6d  (lem.symbols,lem
b810: 2e 6e 73 79 6d 62 6f 6c 2b 31 2c 73 69 7a 65 6f  .nsymbol+1,sizeo
b820: 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a  f(struct symbol*
b830: 29 2c 0a 20 20 20 20 20 20 20 20 28 69 6e 74 28  ),.        (int(
b840: 2a 29 28 29 29 53 79 6d 62 6f 6c 63 6d 70 70 29  *)())Symbolcmpp)
b850: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
b860: 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  lem.nsymbol; i++
b870: 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d  ) lem.symbols[i]
b880: 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 66  ->index = i;.  f
b890: 6f 72 28 69 3d 31 3b 20 69 73 75 70 70 65 72 28  or(i=1; isupper(
b8a0: 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  lem.symbols[i]->
b8b0: 6e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29 3b 0a  name[0]); i++);.
b8c0: 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 20    lem.nterminal 
b8d0: 3d 20 69 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  = i;..  /* Gener
b8e0: 61 74 65 20 61 20 72 65 70 72 69 6e 74 20 6f 66  ate a reprint of
b8f0: 20 74 68 65 20 67 72 61 6d 6d 61 72 2c 20 69 66   the grammar, if
b900: 20 72 65 71 75 65 73 74 65 64 20 6f 6e 20 74 68   requested on th
b910: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a  e command line *
b920: 2f 0a 20 20 69 66 28 20 72 70 66 6c 61 67 20 29  /.  if( rpflag )
b930: 7b 0a 20 20 20 20 52 65 70 72 69 6e 74 28 26 6c  {.    Reprint(&l
b940: 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  em);.  }else{.  
b950: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
b960: 74 68 65 20 73 69 7a 65 20 66 6f 72 20 61 6c 6c  the size for all
b970: 20 66 6f 6c 6c 6f 77 20 61 6e 64 20 66 69 72 73   follow and firs
b980: 74 20 73 65 74 73 20 2a 2f 0a 20 20 20 20 53 65  t sets */.    Se
b990: 74 53 69 7a 65 28 6c 65 6d 2e 6e 74 65 72 6d 69  tSize(lem.ntermi
b9a0: 6e 61 6c 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  nal+1);..    /* 
b9b0: 46 69 6e 64 20 74 68 65 20 70 72 65 63 65 64 65  Find the precede
b9c0: 6e 63 65 20 66 6f 72 20 65 76 65 72 79 20 70 72  nce for every pr
b9d0: 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 28 74  oduction rule (t
b9e0: 68 61 74 20 68 61 73 20 6f 6e 65 29 20 2a 2f 0a  hat has one) */.
b9f0: 20 20 20 20 46 69 6e 64 52 75 6c 65 50 72 65 63      FindRulePrec
ba00: 65 64 65 6e 63 65 73 28 26 6c 65 6d 29 3b 0a 0a  edences(&lem);..
ba10: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
ba20: 68 65 20 6c 61 6d 62 64 61 2d 6e 6f 6e 74 65 72  he lambda-nonter
ba30: 6d 69 6e 61 6c 73 20 61 6e 64 20 74 68 65 20 66  minals and the f
ba40: 69 72 73 74 2d 73 65 74 73 20 66 6f 72 20 65 76  irst-sets for ev
ba50: 65 72 79 0a 20 20 20 20 2a 2a 20 6e 6f 6e 74 65  ery.    ** nonte
ba60: 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20 20 20 46 69  rminal */.    Fi
ba70: 6e 64 46 69 72 73 74 53 65 74 73 28 26 6c 65 6d  ndFirstSets(&lem
ba80: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75  );..    /* Compu
ba90: 74 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74 61  te all LR(0) sta
baa0: 74 65 73 2e 20 20 41 6c 73 6f 20 72 65 63 6f 72  tes.  Also recor
bab0: 64 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f  d follow-set pro
bac0: 70 61 67 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  pagation.    ** 
bad0: 6c 69 6e 6b 73 20 73 6f 20 74 68 61 74 20 74 68  links so that th
bae0: 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 61 6e  e follow-set can
baf0: 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61 74   be computed lat
bb00: 65 72 20 2a 2f 0a 20 20 20 20 6c 65 6d 2e 6e 73  er */.    lem.ns
bb10: 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 46 69  tate = 0;.    Fi
bb20: 6e 64 53 74 61 74 65 73 28 26 6c 65 6d 29 3b 0a  ndStates(&lem);.
bb30: 20 20 20 20 6c 65 6d 2e 73 6f 72 74 65 64 20 3d      lem.sorted =
bb40: 20 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28 29   State_arrayof()
bb50: 3b 0a 0a 20 20 20 20 2f 2a 20 54 69 65 20 75 70  ;..    /* Tie up
bb60: 20 6c 6f 6f 73 65 20 65 6e 64 73 20 6f 6e 20 74   loose ends on t
bb70: 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  he propagation l
bb80: 69 6e 6b 73 20 2a 2f 0a 20 20 20 20 46 69 6e 64  inks */.    Find
bb90: 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  Links(&lem);..  
bba0: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
bbb0: 20 66 6f 6c 6c 6f 77 20 73 65 74 20 6f 66 20 65   follow set of e
bbc0: 76 65 72 79 20 72 65 64 75 63 69 62 6c 65 20 63  very reducible c
bbd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a  onfiguration */.
bbe0: 20 20 20 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65      FindFollowSe
bbf0: 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  ts(&lem);..    /
bc00: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63  * Compute the ac
bc10: 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20  tion tables */. 
bc20: 20 20 20 46 69 6e 64 41 63 74 69 6f 6e 73 28 26     FindActions(&
bc30: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  lem);..    /* Co
bc40: 6d 70 72 65 73 73 20 74 68 65 20 61 63 74 69 6f  mpress the actio
bc50: 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  n tables */.    
bc60: 69 66 28 20 63 6f 6d 70 72 65 73 73 3d 3d 30 20  if( compress==0 
bc70: 29 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73  ) CompressTables
bc80: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
bc90: 52 65 6f 72 64 65 72 20 61 6e 64 20 72 65 6e 75  Reorder and renu
bca0: 6d 62 65 72 20 74 68 65 20 73 74 61 74 65 73 20  mber the states 
bcb0: 73 6f 20 74 68 61 74 20 73 74 61 74 65 73 20 77  so that states w
bcc0: 69 74 68 20 66 65 77 65 72 20 63 68 6f 69 63 65  ith fewer choice
bcd0: 73 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 20 61  s.    ** occur a
bce0: 74 20 74 68 65 20 65 6e 64 2e 20 2a 2f 0a 20 20  t the end. */.  
bcf0: 20 20 52 65 73 6f 72 74 53 74 61 74 65 73 28 26    ResortStates(&
bd00: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  lem);..    /* Ge
bd10: 6e 65 72 61 74 65 20 61 20 72 65 70 6f 72 74 20  nerate a report 
bd20: 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 67 65  of the parser ge
bd30: 6e 65 72 61 74 65 64 2e 20 20 28 74 68 65 20 22  nerated.  (the "
bd40: 79 2e 6f 75 74 70 75 74 22 20 66 69 6c 65 29 20  y.output" file) 
bd50: 2a 2f 0a 20 20 20 20 69 66 28 20 21 71 75 69 65  */.    if( !quie
bd60: 74 20 29 20 52 65 70 6f 72 74 4f 75 74 70 75 74  t ) ReportOutput
bd70: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
bd80: 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 6f 75  Generate the sou
bd90: 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  rce code for the
bda0: 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 20 20 52   parser */.    R
bdb0: 65 70 6f 72 74 54 61 62 6c 65 28 26 6c 65 6d 2c  eportTable(&lem,
bdc0: 20 6d 68 66 6c 61 67 29 3b 0a 0a 20 20 20 20 2f   mhflag);..    /
bdd0: 2a 20 50 72 6f 64 75 63 65 20 61 20 68 65 61 64  * Produce a head
bde0: 65 72 20 66 69 6c 65 20 66 6f 72 20 75 73 65 20  er file for use 
bdf0: 62 79 20 74 68 65 20 73 63 61 6e 6e 65 72 2e 20  by the scanner. 
be00: 20 28 54 68 69 73 20 73 74 65 70 20 69 73 0a 20   (This step is. 
be10: 20 20 20 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66     ** omitted if
be20: 20 74 68 65 20 22 2d 6d 22 20 6f 70 74 69 6f 6e   the "-m" option
be30: 20 69 73 20 75 73 65 64 20 62 65 63 61 75 73 65   is used because
be40: 20 6d 61 6b 65 68 65 61 64 65 72 73 20 77 69 6c   makeheaders wil
be50: 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74  l.    ** generat
be60: 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 75  e the file for u
be70: 73 2e 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  s.) */.    if( !
be80: 6d 68 66 6c 61 67 20 29 20 52 65 70 6f 72 74 48  mhflag ) ReportH
be90: 65 61 64 65 72 28 26 6c 65 6d 29 3b 0a 20 20 7d  eader(&lem);.  }
bea0: 0a 20 20 69 66 28 20 73 74 61 74 69 73 74 69 63  .  if( statistic
beb0: 73 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  s ){.    printf(
bec0: 22 50 61 72 73 65 72 20 73 74 61 74 69 73 74 69  "Parser statisti
bed0: 63 73 3a 20 25 64 20 74 65 72 6d 69 6e 61 6c 73  cs: %d terminals
bee0: 2c 20 25 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  , %d nonterminal
bef0: 73 2c 20 25 64 20 72 75 6c 65 73 5c 6e 22 2c 0a  s, %d rules\n",.
bf00: 20 20 20 20 20 20 6c 65 6d 2e 6e 74 65 72 6d 69        lem.ntermi
bf10: 6e 61 6c 2c 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c  nal, lem.nsymbol
bf20: 20 2d 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c   - lem.nterminal
bf30: 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20  , lem.nrule);.  
bf40: 20 20 70 72 69 6e 74 66 28 22 20 20 20 20 20 20    printf("      
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20               %d 
bf60: 73 74 61 74 65 73 2c 20 25 64 20 70 61 72 73 65  states, %d parse
bf70: 72 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2c  r table entries,
bf80: 20 25 64 20 63 6f 6e 66 6c 69 63 74 73 5c 6e 22   %d conflicts\n"
bf90: 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 73 74 61  ,.      lem.nsta
bfa0: 74 65 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69 7a  te, lem.tablesiz
bfb0: 65 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74  e, lem.nconflict
bfc0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d  );.  }.  if( lem
bfd0: 2e 6e 63 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20  .nconflict ){.  
bfe0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
bff0: 2c 22 25 64 20 70 61 72 73 69 6e 67 20 63 6f 6e  ,"%d parsing con
c000: 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c 65 6d 2e 6e  flicts.\n",lem.n
c010: 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 7d 0a 20  conflict);.  }. 
c020: 20 65 78 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63   exit(lem.errorc
c030: 6e 74 20 2b 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69  nt + lem.nconfli
c040: 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 6c  ct);.  return (l
c050: 65 6d 2e 65 72 72 6f 72 63 6e 74 20 2b 20 6c 65  em.errorcnt + le
c060: 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 7d 0a  m.nconflict);.}.
c070: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
c080: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
c090: 69 6c 65 20 22 6d 73 6f 72 74 2e 63 22 20 2a 2a  ile "msort.c" **
c0a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c0b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
c0c0: 2a 0a 2a 2a 20 41 20 67 65 6e 65 72 69 63 20 6d  *.** A generic m
c0d0: 65 72 67 65 2d 73 6f 72 74 20 70 72 6f 67 72 61  erge-sort progra
c0e0: 6d 2e 0a 2a 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a  m..**.** USAGE:.
c0f0: 2a 2a 20 4c 65 74 20 22 70 74 72 22 20 62 65 20  ** Let "ptr" be 
c100: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 73 6f 6d  a pointer to som
c110: 65 20 73 74 72 75 63 74 75 72 65 20 77 68 69 63  e structure whic
c120: 68 20 69 73 20 61 74 20 74 68 65 20 68 65 61 64  h is at the head
c130: 20 6f 66 0a 2a 2a 20 61 20 6e 75 6c 6c 2d 74 65   of.** a null-te
c140: 72 6d 69 6e 61 74 65 64 20 6c 69 73 74 2e 20 20  rminated list.  
c150: 54 68 65 6e 20 74 6f 20 73 6f 72 74 20 74 68 65  Then to sort the
c160: 20 6c 69 73 74 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a   list call:.**.*
c170: 2a 20 20 20 20 20 70 74 72 20 3d 20 6d 73 6f 72  *     ptr = msor
c180: 74 28 70 74 72 2c 26 28 70 74 72 2d 3e 6e 65 78  t(ptr,&(ptr->nex
c190: 74 29 2c 63 6d 70 66 6e 63 29 3b 0a 2a 2a 0a 2a  t),cmpfnc);.**.*
c1a0: 2a 20 49 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  * In the above, 
c1b0: 22 63 6d 70 66 6e 63 22 20 69 73 20 61 20 70 6f  "cmpfnc" is a po
c1c0: 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
c1d0: 69 6f 6e 20 77 68 69 63 68 20 63 6f 6d 70 61 72  ion which compar
c1e0: 65 73 0a 2a 2a 20 74 77 6f 20 69 6e 73 74 61 6e  es.** two instan
c1f0: 63 65 73 20 6f 66 20 74 68 65 20 73 74 72 75 63  ces of the struc
c200: 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 73  ture and returns
c210: 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 73 20   an integer, as 
c220: 69 6e 0a 2a 2a 20 73 74 72 63 6d 70 2e 20 20 54  in.** strcmp.  T
c230: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
c240: 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
c250: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74  to the pointer t
c260: 6f 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  o the.** second 
c270: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c  element of the l
c280: 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 54 68 69  inked list.  Thi
c290: 73 20 61 64 64 72 65 73 73 20 69 73 20 75 73 65  s address is use
c2a0: 64 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20  d to compute.** 
c2b0: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
c2c0: 65 20 22 6e 65 78 74 22 20 66 69 65 6c 64 20 77  e "next" field w
c2d0: 69 74 68 69 6e 20 74 68 65 20 73 74 72 75 63 74  ithin the struct
c2e0: 75 72 65 2e 20 20 54 68 65 20 6f 66 66 73 65 74  ure.  The offset
c2f0: 20 74 6f 0a 2a 2a 20 74 68 65 20 22 6e 65 78 74   to.** the "next
c300: 22 20 66 69 65 6c 64 20 6d 75 73 74 20 62 65 20  " field must be 
c310: 63 6f 6e 73 74 61 6e 74 20 66 6f 72 20 61 6c 6c  constant for all
c320: 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74   structures in t
c330: 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  he list..**.** T
c340: 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
c350: 72 6e 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  rns a new pointe
c360: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 68  r which is the h
c370: 65 61 64 20 6f 66 20 74 68 65 20 6c 69 73 74 0a  ead of the list.
c380: 2a 2a 20 61 66 74 65 72 20 73 6f 72 74 69 6e 67  ** after sorting
c390: 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47 4f 52 49 54 48  ..**.** ALGORITH
c3a0: 4d 3a 0a 2a 2a 20 4d 65 72 67 65 2d 73 6f 72 74  M:.** Merge-sort
c3b0: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
c3c0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
c3d0: 74 68 65 20 6e 65 78 74 20 73 74 72 75 63 74 75  the next structu
c3e0: 72 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  re in the linked
c3f0: 20 6c 69 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e   list..*/.#defin
c400: 65 20 4e 45 58 54 28 41 29 20 28 2a 28 63 68 61  e NEXT(A) (*(cha
c410: 72 2a 2a 29 28 28 28 75 6e 73 69 67 6e 65 64 20  r**)(((unsigned 
c420: 6c 6f 6e 67 29 41 29 2b 6f 66 66 73 65 74 29 29  long)A)+offset))
c430: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a  ../*.** Inputs:.
c440: 2a 2a 20 20 20 61 3a 20 20 20 20 20 20 20 41 20  **   a:       A 
c450: 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72  sorted, null-ter
c460: 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c  minated linked l
c470: 69 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75  ist.  (May be nu
c480: 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a 20 20 20 20  ll)..**   b:    
c490: 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c     A sorted, nul
c4a0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e  l-terminated lin
c4b0: 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20  ked list.  (May 
c4c0: 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 63  be null)..**   c
c4d0: 6d 70 3a 20 20 20 20 20 41 20 70 6f 69 6e 74 65  mp:     A pointe
c4e0: 72 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  r to the compari
c4f0: 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  son function..**
c500: 20 20 20 6f 66 66 73 65 74 3a 20 20 4f 66 66 73     offset:  Offs
c510: 65 74 20 69 6e 20 74 68 65 20 73 74 72 75 63 74  et in the struct
c520: 75 72 65 20 74 6f 20 74 68 65 20 22 6e 65 78 74  ure to the "next
c530: 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52  " field..**.** R
c540: 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20  eturn Value:.** 
c550: 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74    A pointer to t
c560: 68 65 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72  he head of a sor
c570: 74 65 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ted list contain
c580: 69 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73  ing the elements
c590: 0a 2a 2a 20 20 20 6f 66 20 62 6f 74 68 20 61 20  .**   of both a 
c5a0: 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 69 64  and b..**.** Sid
c5b0: 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20  e effects:.**   
c5c0: 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74  The "next" point
c5d0: 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73  ers for elements
c5e0: 20 69 6e 20 74 68 65 20 6c 69 73 74 73 20 61 20   in the lists a 
c5f0: 61 6e 64 20 62 20 61 72 65 0a 2a 2a 20 20 20 63  and b are.**   c
c600: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  hanged..*/.stati
c610: 63 20 63 68 61 72 20 2a 6d 65 72 67 65 28 0a 20  c char *merge(. 
c620: 20 63 68 61 72 20 2a 61 2c 0a 20 20 63 68 61 72   char *a,.  char
c630: 20 2a 62 2c 0a 20 20 69 6e 74 20 28 2a 63 6d 70   *b,.  int (*cmp
c640: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
c650: 6e 73 74 20 63 68 61 72 2a 29 2c 0a 20 20 69 6e  nst char*),.  in
c660: 74 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 63 68  t offset.){.  ch
c670: 61 72 20 2a 70 74 72 2c 20 2a 68 65 61 64 3b 0a  ar *ptr, *head;.
c680: 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20  .  if( a==0 ){. 
c690: 20 20 20 68 65 61 64 20 3d 20 62 3b 0a 20 20 7d     head = b;.  }
c6a0: 65 6c 73 65 20 69 66 28 20 62 3d 3d 30 20 29 7b  else if( b==0 ){
c6b0: 0a 20 20 20 20 68 65 61 64 20 3d 20 61 3b 0a 20  .    head = a;. 
c6c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
c6d0: 28 2a 63 6d 70 29 28 61 2c 62 29 3c 30 20 29 7b  (*cmp)(a,b)<0 ){
c6e0: 0a 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a  .      ptr = a;.
c6f0: 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28 61        a = NEXT(a
c700: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
c710: 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20      ptr = b;.   
c720: 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a     b = NEXT(b);.
c730: 20 20 20 20 7d 0a 20 20 20 20 68 65 61 64 20 3d      }.    head =
c740: 20 70 74 72 3b 0a 20 20 20 20 77 68 69 6c 65 28   ptr;.    while(
c750: 20 61 20 26 26 20 62 20 29 7b 0a 20 20 20 20 20   a && b ){.     
c760: 20 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29   if( (*cmp)(a,b)
c770: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 45  <0 ){.        NE
c780: 58 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20  XT(ptr) = a;.   
c790: 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a 20 20       ptr = a;.  
c7a0: 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28 61        a = NEXT(a
c7b0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
c7c0: 20 20 20 20 20 20 20 20 4e 45 58 54 28 70 74 72          NEXT(ptr
c7d0: 29 20 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 70  ) = b;.        p
c7e0: 74 72 20 3d 20 62 3b 0a 20 20 20 20 20 20 20 20  tr = b;.        
c7f0: 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20 20 20  b = NEXT(b);.   
c800: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
c810: 66 28 20 61 20 29 20 4e 45 58 54 28 70 74 72 29  f( a ) NEXT(ptr)
c820: 20 3d 20 61 3b 0a 20 20 20 20 65 6c 73 65 20 20   = a;.    else  
c830: 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 62 3b    NEXT(ptr) = b;
c840: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 65  .  }.  return he
c850: 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70  ad;.}../*.** Inp
c860: 75 74 73 3a 0a 2a 2a 20 20 20 6c 69 73 74 3a 20  uts:.**   list: 
c870: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
c880: 61 20 73 69 6e 67 6c 79 2d 6c 69 6e 6b 65 64 20  a singly-linked 
c890: 6c 69 73 74 20 6f 66 20 73 74 72 75 63 74 75 72  list of structur
c8a0: 65 73 2e 0a 2a 2a 20 20 20 6e 65 78 74 3a 20 20  es..**   next:  
c8b0: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 70      Pointer to p
c8c0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 65  ointer to the se
c8d0: 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20  cond element of 
c8e0: 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 20 20 20 63  the list..**   c
c8f0: 6d 70 3a 20 20 20 20 20 20 20 41 20 63 6f 6d 70  mp:       A comp
c900: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  arison function.
c910: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61  .**.** Return Va
c920: 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e  lue:.**   A poin
c930: 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
c940: 6f 66 20 61 20 73 6f 72 74 65 64 20 6c 69 73 74  of a sorted list
c950: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
c960: 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 72  elements.**   or
c970: 67 69 6e 61 6c 6c 79 20 69 6e 20 6c 69 73 74 2e  ginally in list.
c980: 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66 66 65  .**.** Side effe
c990: 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20 22 6e  cts:.**   The "n
c9a0: 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20 66 6f  ext" pointers fo
c9b0: 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 6c 69  r elements in li
c9c0: 73 74 20 61 72 65 20 63 68 61 6e 67 65 64 2e 0a  st are changed..
c9d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 49 53 54 53  */.#define LISTS
c9e0: 49 5a 45 20 33 30 0a 73 74 61 74 69 63 20 63 68  IZE 30.static ch
c9f0: 61 72 20 2a 6d 73 6f 72 74 28 0a 20 20 63 68 61  ar *msort(.  cha
ca00: 72 20 2a 6c 69 73 74 2c 0a 20 20 63 68 61 72 20  r *list,.  char 
ca10: 2a 2a 6e 65 78 74 2c 0a 20 20 69 6e 74 20 28 2a  **next,.  int (*
ca20: 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  cmp)(const char*
ca30: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b  ,const char*).){
ca40: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
ca50: 20 6f 66 66 73 65 74 3b 0a 20 20 63 68 61 72 20   offset;.  char 
ca60: 2a 65 70 3b 0a 20 20 63 68 61 72 20 2a 73 65 74  *ep;.  char *set
ca70: 5b 4c 49 53 54 53 49 5a 45 5d 3b 0a 20 20 69 6e  [LISTSIZE];.  in
ca80: 74 20 69 3b 0a 20 20 6f 66 66 73 65 74 20 3d 20  t i;.  offset = 
ca90: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 6e  (unsigned long)n
caa0: 65 78 74 20 2d 20 28 75 6e 73 69 67 6e 65 64 20  ext - (unsigned 
cab0: 6c 6f 6e 67 29 6c 69 73 74 3b 0a 20 20 66 6f 72  long)list;.  for
cac0: 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45  (i=0; i<LISTSIZE
cad0: 3b 20 69 2b 2b 29 20 73 65 74 5b 69 5d 20 3d 20  ; i++) set[i] = 
cae0: 30 3b 0a 20 20 77 68 69 6c 65 28 20 6c 69 73 74  0;.  while( list
caf0: 20 29 7b 0a 20 20 20 20 65 70 20 3d 20 6c 69 73   ){.    ep = lis
cb00: 74 3b 0a 20 20 20 20 6c 69 73 74 20 3d 20 4e 45  t;.    list = NE
cb10: 58 54 28 6c 69 73 74 29 3b 0a 20 20 20 20 4e 45  XT(list);.    NE
cb20: 58 54 28 65 70 29 20 3d 20 30 3b 0a 20 20 20 20  XT(ep) = 0;.    
cb30: 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53  for(i=0; i<LISTS
cb40: 49 5a 45 2d 31 20 26 26 20 73 65 74 5b 69 5d 21  IZE-1 && set[i]!
cb50: 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
cb60: 65 70 20 3d 20 6d 65 72 67 65 28 65 70 2c 73 65  ep = merge(ep,se
cb70: 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74 29  t[i],cmp,offset)
cb80: 3b 0a 20 20 20 20 20 20 73 65 74 5b 69 5d 20 3d  ;.      set[i] =
cb90: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65   0;.    }.    se
cba0: 74 5b 69 5d 20 3d 20 65 70 3b 0a 20 20 7d 0a 20  t[i] = ep;.  }. 
cbb0: 20 65 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69   ep = 0;.  for(i
cbc0: 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b 20  =0; i<LISTSIZE; 
cbd0: 69 2b 2b 29 20 69 66 28 20 73 65 74 5b 69 5d 20  i++) if( set[i] 
cbe0: 29 20 65 70 20 3d 20 6d 65 72 67 65 28 65 70 2c  ) ep = merge(ep,
cbf0: 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65  set[i],cmp,offse
cc00: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 70 3b  t);.  return ep;
cc10: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
cc20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
cc30: 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69  m the file "opti
cc40: 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on.c" **********
cc50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cc60: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a  /.static char **
cc70: 61 72 67 76 3b 0a 73 74 61 74 69 63 20 73 74 72  argv;.static str
cc80: 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f  uct s_options *o
cc90: 70 3b 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  p;.static FILE *
cca0: 65 72 72 73 74 72 65 61 6d 3b 0a 0a 23 64 65 66  errstream;..#def
ccb0: 69 6e 65 20 49 53 4f 50 54 28 58 29 20 28 28 58  ine ISOPT(X) ((X
ccc0: 29 5b 30 5d 3d 3d 27 2d 27 7c 7c 28 58 29 5b 30  )[0]=='-'||(X)[0
ccd0: 5d 3d 3d 27 2b 27 7c 7c 73 74 72 63 68 72 28 28  ]=='+'||strchr((
cce0: 58 29 2c 27 3d 27 29 21 3d 30 29 0a 0a 2f 2a 0a  X),'=')!=0)../*.
ccf0: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6d  ** Print the com
cd00: 6d 61 6e 64 20 6c 69 6e 65 20 77 69 74 68 20 61  mand line with a
cd10: 20 63 61 72 72 6f 74 20 70 6f 69 6e 74 69 6e 67   carrot pointing
cd20: 20 74 6f 20 74 68 65 20 6b 2d 74 68 20 63 68 61   to the k-th cha
cd30: 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  racter.** of the
cd40: 20 6e 2d 74 68 20 66 69 65 6c 64 2e 0a 2a 2f 0a   n-th field..*/.
cd50: 73 74 61 74 69 63 20 76 6f 69 64 20 65 72 72 6c  static void errl
cd60: 69 6e 65 28 6e 2c 6b 2c 65 72 72 29 0a 69 6e 74  ine(n,k,err).int
cd70: 20 6e 3b 0a 69 6e 74 20 6b 3b 0a 46 49 4c 45 20   n;.int k;.FILE 
cd80: 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 73 70  *err;.{.  int sp
cd90: 63 6e 74 2c 20 69 3b 0a 20 20 69 66 28 20 61 72  cnt, i;.  if( ar
cda0: 67 76 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28  gv[0] ) fprintf(
cdb0: 65 72 72 2c 22 25 73 22 2c 61 72 67 76 5b 30 5d  err,"%s",argv[0]
cdc0: 29 3b 0a 20 20 73 70 63 6e 74 20 3d 20 73 74 72  );.  spcnt = str
cdd0: 6c 65 6e 28 61 72 67 76 5b 30 5d 29 20 2b 20 31  len(argv[0]) + 1
cde0: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e  ;.  for(i=1; i<n
cdf0: 20 26 26 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b   && argv[i]; i++
ce00: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65  ){.    fprintf(e
ce10: 72 72 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d  rr," %s",argv[i]
ce20: 29 3b 0a 20 20 20 20 73 70 63 6e 74 20 2b 3d 20  );.    spcnt += 
ce30: 73 74 72 6c 65 6e 28 61 72 67 76 5b 69 5d 29 2b  strlen(argv[i])+
ce40: 31 3b 0a 20 20 7d 0a 20 20 73 70 63 6e 74 20 2b  1;.  }.  spcnt +
ce50: 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b 20 61 72 67  = k;.  for(; arg
ce60: 76 5b 69 5d 3b 20 69 2b 2b 29 20 66 70 72 69 6e  v[i]; i++) fprin
ce70: 74 66 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67  tf(err," %s",arg
ce80: 76 5b 69 5d 29 3b 0a 20 20 69 66 28 20 73 70 63  v[i]);.  if( spc
ce90: 6e 74 3c 32 30 20 29 7b 0a 20 20 20 20 66 70 72  nt<20 ){.    fpr
cea0: 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73 5e  intf(err,"\n%*s^
ceb0: 2d 2d 20 68 65 72 65 5c 6e 22 2c 73 70 63 6e 74  -- here\n",spcnt
cec0: 2c 22 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ,"");.  }else{. 
ced0: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
cee0: 5c 6e 25 2a 73 68 65 72 65 20 2d 2d 5e 5c 6e 22  \n%*shere --^\n"
cef0: 2c 73 70 63 6e 74 2d 37 2c 22 22 29 3b 0a 20 20  ,spcnt-7,"");.  
cf00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
cf10: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  n the index of t
cf20: 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d 73 77 69 74  he N-th non-swit
cf30: 63 68 20 61 72 67 75 6d 65 6e 74 2e 20 20 52 65  ch argument.  Re
cf40: 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 4e 20  turn -1.** if N 
cf50: 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
cf60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
cf70: 72 67 69 6e 64 65 78 28 6e 29 0a 69 6e 74 20 6e  rgindex(n).int n
cf80: 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ;.{.  int i;.  i
cf90: 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b  nt dashdash = 0;
cfa0: 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20 26  .  if( argv!=0 &
cfb0: 26 20 2a 61 72 67 76 21 3d 30 20 29 7b 0a 20 20  & *argv!=0 ){.  
cfc0: 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b    for(i=1; argv[
cfd0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
cfe0: 69 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20  if( dashdash || 
cff0: 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20  !ISOPT(argv[i]) 
d000: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
d010: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
d020: 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20          n--;.   
d030: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
d040: 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d  trcmp(argv[i],"-
d050: 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73  -")==0 ) dashdas
d060: 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  h = 1;.    }.  }
d070: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
d080: 0a 73 74 61 74 69 63 20 63 68 61 72 20 65 6d 73  .static char ems
d090: 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c  g[] = "Command l
d0a0: 69 6e 65 20 73 79 6e 74 61 78 20 65 72 72 6f 72  ine syntax error
d0b0: 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  : ";../*.** Proc
d0c0: 65 73 73 20 61 20 66 6c 61 67 20 63 6f 6d 6d 61  ess a flag comma
d0d0: 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd line argument
d0e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d0f0: 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65 72  handleflags(i,er
d100: 72 29 0a 69 6e 74 20 69 3b 0a 46 49 4c 45 20 2a  r).int i;.FILE *
d110: 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a  err;.{.  int v;.
d120: 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30    int errcnt = 0
d130: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72  ;.  int j;.  for
d140: 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65  (j=0; op[j].labe
d150: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; j++){.    if(
d160: 20 73 74 72 6e 63 6d 70 28 26 61 72 67 76 5b 69   strncmp(&argv[i
d170: 5d 5b 31 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c  ][1],op[j].label
d180: 2c 73 74 72 6c 65 6e 28 6f 70 5b 6a 5d 2e 6c 61  ,strlen(op[j].la
d190: 62 65 6c 29 29 3d 3d 30 20 29 20 62 72 65 61 6b  bel))==0 ) break
d1a0: 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 61 72 67 76  ;.  }.  v = argv
d1b0: 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f 20 31 20  [i][0]=='-' ? 1 
d1c0: 3a 20 30 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d  : 0;.  if( op[j]
d1d0: 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20  .label==0 ){.   
d1e0: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
d1f0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25    fprintf(err,"%
d200: 73 75 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f  sundefined optio
d210: 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20  n.\n",emsg);.   
d220: 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65     errline(i,1,e
d230: 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  rr);.    }.    e
d240: 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rrcnt++;.  }else
d250: 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d   if( op[j].type=
d260: 3d 4f 50 54 5f 46 4c 41 47 20 29 7b 0a 20 20 20  =OPT_FLAG ){.   
d270: 20 2a 28 28 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61   *((int*)op[j].a
d280: 72 67 29 20 3d 20 76 3b 0a 20 20 7d 65 6c 73 65  rg) = v;.  }else
d290: 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d   if( op[j].type=
d2a0: 3d 4f 50 54 5f 46 46 4c 41 47 20 29 7b 0a 20 20  =OPT_FFLAG ){.  
d2b0: 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29 28    (*(void(*)())(
d2c0: 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 76 29 3b 0a  op[j].arg))(v);.
d2d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a    }else if( op[j
d2e0: 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 53 54 52  ].type==OPT_FSTR
d2f0: 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64 28   ){.    (*(void(
d300: 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  *)())(op[j].arg)
d310: 29 28 26 61 72 67 76 5b 69 5d 5b 32 5d 29 3b 0a  )(&argv[i][2]);.
d320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
d330: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70   err ){.      fp
d340: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 6d 69 73  rintf(err,"%smis
d350: 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e  sing argument on
d360: 20 73 77 69 74 63 68 2e 5c 6e 22 2c 65 6d 73 67   switch.\n",emsg
d370: 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65  );.      errline
d380: 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d  (i,1,err);.    }
d390: 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20  .    errcnt++;. 
d3a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63   }.  return errc
d3b0: 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  nt;.}../*.** Pro
d3c0: 63 65 73 73 20 61 20 63 6f 6d 6d 61 6e 64 20 6c  cess a command l
d3d0: 69 6e 65 20 73 77 69 74 63 68 20 77 68 69 63 68  ine switch which
d3e0: 20 68 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74   has an argument
d3f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d400: 68 61 6e 64 6c 65 73 77 69 74 63 68 28 69 2c 65  handleswitch(i,e
d410: 72 72 29 0a 69 6e 74 20 69 3b 0a 46 49 4c 45 20  rr).int i;.FILE 
d420: 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 6c 76  *err;.{.  int lv
d430: 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20 64   = 0;.  double d
d440: 76 20 3d 20 30 2e 30 3b 0a 20 20 63 68 61 72 20  v = 0.0;.  char 
d450: 2a 73 76 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20  *sv = 0, *end;. 
d460: 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 69 6e 74   char *cp;.  int
d470: 20 6a 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74   j;.  int errcnt
d480: 20 3d 20 30 3b 0a 20 20 63 70 20 3d 20 73 74 72   = 0;.  cp = str
d490: 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29  chr(argv[i],'=')
d4a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 70 21 3d  ;.  assert( cp!=
d4b0: 30 20 29 3b 0a 20 20 2a 63 70 20 3d 20 30 3b 0a  0 );.  *cp = 0;.
d4c0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d    for(j=0; op[j]
d4d0: 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  .label; j++){.  
d4e0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
d4f0: 76 5b 69 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c  v[i],op[j].label
d500: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
d510: 7d 0a 20 20 2a 63 70 20 3d 20 27 3d 27 3b 0a 20  }.  *cp = '=';. 
d520: 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c   if( op[j].label
d530: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65  ==0 ){.    if( e
d540: 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  rr ){.      fpri
d550: 6e 74 66 28 65 72 72 2c 22 25 73 75 6e 64 65 66  ntf(err,"%sundef
d560: 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c  ined option.\n",
d570: 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72  emsg);.      err
d580: 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20  line(i,0,err);. 
d590: 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b     }.    errcnt+
d5a0: 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
d5b0: 63 70 2b 2b 3b 0a 20 20 20 20 73 77 69 74 63 68  cp++;.    switch
d5c0: 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a  ( op[j].type ){.
d5d0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
d5e0: 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20  LAG:.      case 
d5f0: 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20  OPT_FFLAG:.     
d600: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
d610: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
d620: 65 72 72 2c 22 25 73 6f 70 74 69 6f 6e 20 72 65  err,"%soption re
d630: 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65  quires an argume
d640: 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20  nt.\n",emsg);.  
d650: 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28          errline(
d660: 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20 20 20 20  i,0,err);.      
d670: 20 20 7d 0a 20 20 20 20 20 20 20 20 65 72 72 63    }.        errc
d680: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72  nt++;.        br
d690: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
d6a0: 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63  OPT_DBL:.      c
d6b0: 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20  ase OPT_FDBL:.  
d6c0: 20 20 20 20 20 20 64 76 20 3d 20 73 74 72 74 6f        dv = strto
d6d0: 64 28 63 70 2c 26 65 6e 64 29 3b 0a 20 20 20 20  d(cp,&end);.    
d6e0: 20 20 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a      if( *end ){.
d6f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72            if( er
d700: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
d710: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
d720: 69 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65  illegal characte
d730: 72 20 69 6e 20 66 6c 6f 61 74 69 6e 67 2d 70 6f  r in floating-po
d740: 69 6e 74 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22  int argument.\n"
d750: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  ,emsg);.        
d760: 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 28 28      errline(i,((
d770: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 65 6e  unsigned long)en
d780: 64 29 2d 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  d)-(unsigned lon
d790: 67 29 61 72 67 76 5b 69 5d 2c 65 72 72 29 3b 0a  g)argv[i],err);.
d7a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d7b0: 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a        errcnt++;.
d7c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d7d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
d7e0: 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20  ase OPT_INT:.   
d7f0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54     case OPT_FINT
d800: 3a 0a 20 20 20 20 20 20 20 20 6c 76 20 3d 20 73  :.        lv = s
d810: 74 72 74 6f 6c 28 63 70 2c 26 65 6e 64 2c 30 29  trtol(cp,&end,0)
d820: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 65  ;.        if( *e
d830: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
d840: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
d850: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65         fprintf(e
d860: 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63 68  rr,"%sillegal ch
d870: 61 72 61 63 74 65 72 20 69 6e 20 69 6e 74 65 67  aracter in integ
d880: 65 72 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c  er argument.\n",
d890: 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  emsg);.         
d8a0: 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 28 28 75     errline(i,((u
d8b0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 65 6e 64  nsigned long)end
d8c0: 29 2d 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  )-(unsigned long
d8d0: 29 61 72 67 76 5b 69 5d 2c 65 72 72 29 3b 0a 20  )argv[i],err);. 
d8e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d8f0: 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20       errcnt++;. 
d900: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d910: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
d920: 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20  se OPT_STR:.    
d930: 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a    case OPT_FSTR:
d940: 0a 20 20 20 20 20 20 20 20 73 76 20 3d 20 63 70  .        sv = cp
d950: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
d960: 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
d970: 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b  h( op[j].type ){
d980: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
d990: 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65  FLAG:.      case
d9a0: 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20   OPT_FFLAG:.    
d9b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d9c0: 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20   case OPT_DBL:. 
d9d0: 20 20 20 20 20 20 20 2a 28 64 6f 75 62 6c 65 2a         *(double*
d9e0: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 64  )(op[j].arg) = d
d9f0: 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  v;.        break
da00: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
da10: 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 28  _FDBL:.        (
da20: 2a 28 76 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b  *(void(*)())(op[
da30: 6a 5d 2e 61 72 67 29 29 28 64 76 29 3b 0a 20 20  j].arg))(dv);.  
da40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
da50: 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a     case OPT_INT:
da60: 0a 20 20 20 20 20 20 20 20 2a 28 69 6e 74 2a 29  .        *(int*)
da70: 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 6c 76  (op[j].arg) = lv
da80: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
da90: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
daa0: 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 28 2a  FINT:.        (*
dab0: 28 76 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a  (void(*)())(op[j
dac0: 5d 2e 61 72 67 29 29 28 28 69 6e 74 29 6c 76 29  ].arg))((int)lv)
dad0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
dae0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
daf0: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 2a 28 63  STR:.        *(c
db00: 68 61 72 2a 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67  har**)(op[j].arg
db10: 29 20 3d 20 73 76 3b 0a 20 20 20 20 20 20 20 20  ) = sv;.        
db20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
db30: 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20  e OPT_FSTR:.    
db40: 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29      (*(void(*)()
db50: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 73 76  )(op[j].arg))(sv
db60: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
db70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
db80: 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a  turn errcnt;.}..
db90: 69 6e 74 20 4f 70 74 49 6e 69 74 28 61 2c 6f 2c  int OptInit(a,o,
dba0: 65 72 72 29 0a 63 68 61 72 20 2a 2a 61 3b 0a 73  err).char **a;.s
dbb0: 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20  truct s_options 
dbc0: 2a 6f 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b  *o;.FILE *err;.{
dbd0: 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20  .  int errcnt = 
dbe0: 30 3b 0a 20 20 61 72 67 76 20 3d 20 61 3b 0a 20  0;.  argv = a;. 
dbf0: 20 6f 70 20 3d 20 6f 3b 0a 20 20 65 72 72 73 74   op = o;.  errst
dc00: 72 65 61 6d 20 3d 20 65 72 72 3b 0a 20 20 69 66  ream = err;.  if
dc10: 28 20 61 72 67 76 20 26 26 20 2a 61 72 67 76 20  ( argv && *argv 
dc20: 26 26 20 6f 70 20 29 7b 0a 20 20 20 20 69 6e 74  && op ){.    int
dc30: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   i;.    for(i=1;
dc40: 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   argv[i]; i++){.
dc50: 20 20 20 20 20 20 69 66 28 20 61 72 67 76 5b 69        if( argv[i
dc60: 5d 5b 30 5d 3d 3d 27 2b 27 20 7c 7c 20 61 72 67  ][0]=='+' || arg
dc70: 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  v[i][0]=='-' ){.
dc80: 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 20 2b          errcnt +
dc90: 3d 20 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 2c  = handleflags(i,
dca0: 65 72 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  err);.      }els
dcb0: 65 20 69 66 28 20 73 74 72 63 68 72 28 61 72 67  e if( strchr(arg
dcc0: 76 5b 69 5d 2c 27 3d 27 29 20 29 7b 0a 20 20 20  v[i],'=') ){.   
dcd0: 20 20 20 20 20 65 72 72 63 6e 74 20 2b 3d 20 68       errcnt += h
dce0: 61 6e 64 6c 65 73 77 69 74 63 68 28 69 2c 65 72  andleswitch(i,er
dcf0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
dd00: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 72 72 63  }.  }.  if( errc
dd10: 6e 74 3e 30 20 29 7b 0a 20 20 20 20 66 70 72 69  nt>0 ){.    fpri
dd20: 6e 74 66 28 65 72 72 2c 22 56 61 6c 69 64 20 63  ntf(err,"Valid c
dd30: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69  ommand line opti
dd40: 6f 6e 73 20 66 6f 72 20 5c 22 25 73 5c 22 20 61  ons for \"%s\" a
dd50: 72 65 3a 5c 6e 22 2c 2a 61 29 3b 0a 20 20 20 20  re:\n",*a);.    
dd60: 4f 70 74 50 72 69 6e 74 28 29 3b 0a 20 20 20 20  OptPrint();.    
dd70: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72  exit(1);.  }.  r
dd80: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20  eturn 0;.}..int 
dd90: 4f 70 74 4e 41 72 67 73 28 29 7b 0a 20 20 69 6e  OptNArgs(){.  in
dda0: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  t cnt = 0;.  int
ddb0: 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b 0a 20   dashdash = 0;. 
ddc0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72   int i;.  if( ar
ddd0: 67 76 21 3d 30 20 26 26 20 61 72 67 76 5b 30 5d  gv!=0 && argv[0]
dde0: 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  !=0 ){.    for(i
ddf0: 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b  =1; argv[i]; i++
de00: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 61 73  ){.      if( das
de10: 68 64 61 73 68 20 7c 7c 20 21 49 53 4f 50 54 28  hdash || !ISOPT(
de20: 61 72 67 76 5b 69 5d 29 20 29 20 63 6e 74 2b 2b  argv[i]) ) cnt++
de30: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  ;.      if( strc
de40: 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29  mp(argv[i],"--")
de50: 3d 3d 30 20 29 20 64 61 73 68 64 61 73 68 20 3d  ==0 ) dashdash =
de60: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
de70: 72 65 74 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 63  return cnt;.}..c
de80: 68 61 72 20 2a 4f 70 74 41 72 67 28 6e 29 0a 69  har *OptArg(n).i
de90: 6e 74 20 6e 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b  nt n;.{.  int i;
dea0: 0a 20 20 69 20 3d 20 61 72 67 69 6e 64 65 78 28  .  i = argindex(
deb0: 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3e 3d  n);.  return i>=
dec0: 30 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 30 3b  0 ? argv[i] : 0;
ded0: 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 45 72 72 28  .}..void OptErr(
dee0: 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 69 6e  n).int n;.{.  in
def0: 74 20 69 3b 0a 20 20 69 20 3d 20 61 72 67 69 6e  t i;.  i = argin
df00: 64 65 78 28 6e 29 3b 0a 20 20 69 66 28 20 69 3e  dex(n);.  if( i>
df10: 3d 30 20 29 20 65 72 72 6c 69 6e 65 28 69 2c 30  =0 ) errline(i,0
df20: 2c 65 72 72 73 74 72 65 61 6d 29 3b 0a 7d 0a 0a  ,errstream);.}..
df30: 76 6f 69 64 20 4f 70 74 50 72 69 6e 74 28 29 7b  void OptPrint(){
df40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
df50: 6d 61 78 2c 20 6c 65 6e 3b 0a 20 20 6d 61 78 20  max, len;.  max 
df60: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
df70: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b  op[i].label; i++
df80: 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72  ){.    len = str
df90: 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29  len(op[i].label)
dfa0: 20 2b 20 31 3b 0a 20 20 20 20 73 77 69 74 63 68   + 1;.    switch
dfb0: 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a  ( op[i].type ){.
dfc0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
dfd0: 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20  LAG:.      case 
dfe0: 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20  OPT_FFLAG:.     
dff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e000: 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20  case OPT_INT:.  
e010: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e      case OPT_FIN
e020: 54 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b  T:.        len +
e030: 3d 20 39 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65  = 9;       /* le
e040: 6e 67 74 68 20 6f 66 20 22 3c 69 6e 74 65 67 65  ngth of "<intege
e050: 72 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  r>" */.        b
e060: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
e070: 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20   OPT_DBL:.      
e080: 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20  case OPT_FDBL:. 
e090: 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 36 3b         len += 6;
e0a0: 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68         /* length
e0b0: 20 6f 66 20 22 3c 72 65 61 6c 3e 22 20 2a 2f 0a   of "<real>" */.
e0c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e0d0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54       case OPT_ST
e0e0: 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  R:.      case OP
e0f0: 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20  T_FSTR:.        
e100: 6c 65 6e 20 2b 3d 20 38 3b 20 20 20 20 20 20 20  len += 8;       
e110: 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 73  /* length of "<s
e120: 74 72 69 6e 67 3e 22 20 2a 2f 0a 20 20 20 20 20  tring>" */.     
e130: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e140: 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 20      if( len>max 
e150: 29 20 6d 61 78 20 3d 20 6c 65 6e 3b 0a 20 20 7d  ) max = len;.  }
e160: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69  .  for(i=0; op[i
e170: 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20  ].label; i++){. 
e180: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d     switch( op[i]
e190: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
e1a0: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
e1b0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
e1c0: 41 47 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69  AG:.        fpri
e1d0: 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20  ntf(errstream," 
e1e0: 20 2d 25 2d 2a 73 20 20 25 73 5c 6e 22 2c 6d 61   -%-*s  %s\n",ma
e1f0: 78 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 6f 70  x,op[i].label,op
e200: 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20  [i].message);.  
e210: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e220: 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a     case OPT_INT:
e230: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
e240: 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 66 70  FINT:.        fp
e250: 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c  rintf(errstream,
e260: 22 20 20 25 73 3d 3c 69 6e 74 65 67 65 72 3e 25  "  %s=<integer>%
e270: 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e  *s  %s\n",op[i].
e280: 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  label,.         
e290: 20 28 69 6e 74 29 28 6d 61 78 2d 73 74 72 6c 65   (int)(max-strle
e2a0: 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 39  n(op[i].label)-9
e2b0: 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61  ),"",op[i].messa
e2c0: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ge);.        bre
e2d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
e2e0: 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61  PT_DBL:.      ca
e2f0: 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20  se OPT_FDBL:.   
e300: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
e310: 73 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 72 65  stream,"  %s=<re
e320: 61 6c 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70  al>%*s  %s\n",op
e330: 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20  [i].label,.     
e340: 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 73       (int)(max-s
e350: 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65  trlen(op[i].labe
e360: 6c 29 2d 36 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d  l)-6),"",op[i].m
e370: 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20  essage);.       
e380: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
e390: 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20  se OPT_STR:.    
e3a0: 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a    case OPT_FSTR:
e3b0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
e3c0: 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 25 73  (errstream,"  %s
e3d0: 3d 3c 73 74 72 69 6e 67 3e 25 2a 73 20 20 25 73  =<string>%*s  %s
e3e0: 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c  \n",op[i].label,
e3f0: 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29  .          (int)
e400: 28 6d 61 78 2d 73 74 72 6c 65 6e 28 6f 70 5b 69  (max-strlen(op[i
e410: 5d 2e 6c 61 62 65 6c 29 2d 38 29 2c 22 22 2c 6f  ].label)-8),"",o
e420: 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20  p[i].message);. 
e430: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e440: 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a    }.  }.}./*****
e450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e460: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
e470: 20 22 70 61 72 73 65 2e 63 22 20 2a 2a 2a 2a 2a   "parse.c" *****
e480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e490: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49  *******/./*.** I
e4a0: 6e 70 75 74 20 66 69 6c 65 20 70 61 72 73 65 72  nput file parser
e4b0: 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70   for the LEMON p
e4c0: 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
e4d0: 0a 2a 2f 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74  .*/../* The stat
e4e0: 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20  e of the parser 
e4f0: 2a 2f 0a 73 74 72 75 63 74 20 70 73 74 61 74 65  */.struct pstate
e500: 20 7b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 6e   {.  char *filen
e510: 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  ame;       /* Na
e520: 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  me of the input 
e530: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  file */.  int to
e540: 6b 65 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20  kenlineno;      
e550: 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 61 74  /* Linenumber at
e560: 20 77 68 69 63 68 20 63 75 72 72 65 6e 74 20 74   which current t
e570: 6f 6b 65 6e 20 73 74 61 72 74 73 20 2a 2f 0a 20  oken starts */. 
e580: 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20   int errorcnt;  
e590: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
e5a0: 20 6f 66 20 65 72 72 6f 72 73 20 73 6f 20 66 61   of errors so fa
e5b0: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  r */.  char *tok
e5c0: 65 6e 73 74 61 72 74 3b 20 20 20 20 20 2f 2a 20  enstart;     /* 
e5d0: 54 65 78 74 20 6f 66 20 63 75 72 72 65 6e 74 20  Text of current 
e5e0: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63  token */.  struc
e5f0: 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20 20 20  t lemon *gp;    
e600: 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 74 61 74 65   /* Global state
e610: 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 65 6e 75   vector */.  enu
e620: 6d 20 65 5f 73 74 61 74 65 20 7b 0a 20 20 20 20  m e_state {.    
e630: 49 4e 49 54 49 41 4c 49 5a 45 2c 0a 20 20 20 20  INITIALIZE,.    
e640: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
e650: 5f 4f 52 5f 52 55 4c 45 2c 0a 20 20 20 20 57 41  _OR_RULE,.    WA
e660: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b  ITING_FOR_DECL_K
e670: 45 59 57 4f 52 44 2c 0a 20 20 20 20 57 41 49 54  EYWORD,.    WAIT
e680: 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47  ING_FOR_DECL_ARG
e690: 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f  ,.    WAITING_FO
e6a0: 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
e6b0: 42 4f 4c 2c 0a 20 20 20 20 57 41 49 54 49 4e 47  BOL,.    WAITING
e6c0: 5f 46 4f 52 5f 41 52 52 4f 57 2c 0a 20 20 20 20  _FOR_ARROW,.    
e6d0: 49 4e 5f 52 48 53 2c 0a 20 20 20 20 4c 48 53 5f  IN_RHS,.    LHS_
e6e0: 41 4c 49 41 53 5f 31 2c 0a 20 20 20 20 4c 48 53  ALIAS_1,.    LHS
e6f0: 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 20 20 4c 48  _ALIAS_2,.    LH
e700: 53 5f 41 4c 49 41 53 5f 33 2c 0a 20 20 20 20 52  S_ALIAS_3,.    R
e710: 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 20 20  HS_ALIAS_1,.    
e720: 52 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 20  RHS_ALIAS_2,.   
e730: 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
e740: 5f 31 2c 0a 20 20 20 20 50 52 45 43 45 44 45 4e  _1,.    PRECEDEN
e750: 43 45 5f 4d 41 52 4b 5f 32 2c 0a 20 20 20 20 52  CE_MARK_2,.    R
e760: 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
e770: 5f 45 52 52 4f 52 2c 0a 20 20 20 20 52 45 53 59  _ERROR,.    RESY
e780: 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
e790: 52 4f 52 2c 0a 20 20 20 20 57 41 49 54 49 4e 47  ROR,.    WAITING
e7a0: 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f  _FOR_DESTRUCTOR_
e7b0: 53 59 4d 42 4f 4c 2c 0a 20 20 20 20 57 41 49 54  SYMBOL,.    WAIT
e7c0: 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45  ING_FOR_DATATYPE
e7d0: 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20 20 57 41 49  _SYMBOL,.    WAI
e7e0: 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43  TING_FOR_FALLBAC
e7f0: 4b 5f 49 44 2c 0a 20 20 20 20 57 41 49 54 49 4e  K_ID,.    WAITIN
e800: 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49  G_FOR_WILDCARD_I
e810: 44 0a 20 20 7d 20 73 74 61 74 65 3b 20 20 20 20  D.  } state;    
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e830: 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66 20 74  * The state of t
e840: 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 73  he parser */.  s
e850: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61  truct symbol *fa
e860: 6c 6c 62 61 63 6b 3b 20 20 20 2f 2a 20 54 68 65  llback;   /* The
e870: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20   fallback token 
e880: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
e890: 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 20 20  ol *lhs;        
e8a0: 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64  /* Left-hand sid
e8b0: 65 20 6f 66 20 63 75 72 72 65 6e 74 20 72 75 6c  e of current rul
e8c0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 68 73  e */.  char *lhs
e8d0: 61 6c 69 61 73 3b 20 20 20 20 20 20 20 20 20 20  alias;          
e8e0: 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74    /* Alias for t
e8f0: 68 65 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he LHS */.  int 
e900: 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  nrhs;           
e910: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
e920: 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 73   of right-hand s
e930: 69 64 65 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e  ide symbols seen
e940: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
e950: 62 6f 6c 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d  bol *rhs[MAXRHS]
e960: 3b 20 20 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c  ;  /* RHS symbol
e970: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 6c 69  s */.  char *ali
e980: 61 73 5b 4d 41 58 52 48 53 5d 3b 20 20 20 20 20  as[MAXRHS];     
e990: 20 20 2f 2a 20 41 6c 69 61 73 65 73 20 66 6f 72    /* Aliases for
e9a0: 20 65 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c   each RHS symbol
e9b0: 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
e9c0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 72 65  struct rule *pre
e9d0: 76 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72  vrule;     /* Pr
e9e0: 65 76 69 6f 75 73 20 72 75 6c 65 20 70 61 72 73  evious rule pars
e9f0: 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65  ed */.  char *de
ea00: 63 6c 6b 65 79 77 6f 72 64 3b 20 20 20 20 20 20  clkeyword;      
ea10: 20 20 20 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66     /* Keyword of
ea20: 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a   a declaration *
ea30: 2f 0a 20 20 63 68 61 72 20 2a 2a 64 65 63 6c 61  /.  char **decla
ea40: 72 67 73 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f  rgslot;        /
ea50: 2a 20 57 68 65 72 65 20 74 68 65 20 64 65 63 6c  * Where the decl
ea60: 61 72 61 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  aration argument
ea70: 20 73 68 6f 75 6c 64 20 62 65 20 70 75 74 20 2a   should be put *
ea80: 2f 0a 20 20 69 6e 74 20 2a 64 65 63 6c 6c 6e 73  /.  int *decllns
ea90: 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  lot;           /
eaa0: 2a 20 57 68 65 72 65 20 74 68 65 20 64 65 63 6c  * Where the decl
eab0: 61 72 61 74 69 6f 6e 20 6c 69 6e 65 6e 75 6d 62  aration linenumb
eac0: 65 72 20 69 73 20 70 75 74 20 2a 2f 0a 20 20 65  er is put */.  e
ead0: 6e 75 6d 20 65 5f 61 73 73 6f 63 20 64 65 63 6c  num e_assoc decl
eae0: 61 73 73 6f 63 3b 20 20 20 20 2f 2a 20 41 73 73  assoc;    /* Ass
eaf0: 69 67 6e 20 74 68 69 73 20 61 73 73 6f 63 69 61  ign this associa
eb00: 74 69 6f 6e 20 74 6f 20 64 65 63 6c 20 61 72 67  tion to decl arg
eb10: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  uments */.  int 
eb20: 70 72 65 63 63 6f 75 6e 74 65 72 3b 20 20 20 20  preccounter;    
eb30: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 69 67 6e         /* Assign
eb40: 20 74 68 69 73 20 70 72 65 63 65 64 65 6e 63 65   this precedence
eb50: 20 74 6f 20 64 65 63 6c 20 61 72 67 75 6d 65 6e   to decl argumen
eb60: 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72  ts */.  struct r
eb70: 75 6c 65 20 2a 66 69 72 73 74 72 75 6c 65 3b 20  ule *firstrule; 
eb80: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
eb90: 20 66 69 72 73 74 20 72 75 6c 65 20 69 6e 20 74   first rule in t
eba0: 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20  he grammar */.  
ebb0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6c 61 73  struct rule *las
ebc0: 74 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 6f  trule;     /* Po
ebd0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 6f 73  inter to the mos
ebe0: 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
ebf0: 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  d rule */.};../*
ec00: 20 50 61 72 73 65 20 61 20 73 69 6e 67 6c 65 20   Parse a single 
ec10: 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74 69 63 20  token */.static 
ec20: 76 6f 69 64 20 70 61 72 73 65 6f 6e 65 74 6f 6b  void parseonetok
ec30: 65 6e 28 70 73 70 29 0a 73 74 72 75 63 74 20 70  en(psp).struct p
ec40: 73 74 61 74 65 20 2a 70 73 70 3b 0a 7b 0a 20 20  state *psp;.{.  
ec50: 63 68 61 72 20 2a 78 3b 0a 20 20 78 20 3d 20 53  char *x;.  x = S
ec60: 74 72 73 61 66 65 28 70 73 70 2d 3e 74 6f 6b 65  trsafe(psp->toke
ec70: 6e 73 74 61 72 74 29 3b 20 20 20 20 20 2f 2a 20  nstart);     /* 
ec80: 53 61 76 65 20 74 68 65 20 74 6f 6b 65 6e 20 70  Save the token p
ec90: 65 72 6d 61 6e 65 6e 74 6c 79 20 2a 2f 0a 23 69  ermanently */.#i
eca0: 66 20 30 0a 20 20 70 72 69 6e 74 66 28 22 25 73  f 0.  printf("%s
ecb0: 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b 25 73 5d 20  :%d: Token=[%s] 
ecc0: 73 74 61 74 65 3d 25 64 5c 6e 22 2c 70 73 70 2d  state=%d\n",psp-
ecd0: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
ece0: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
ecf0: 78 2c 70 73 70 2d 3e 73 74 61 74 65 29 3b 0a 23  x,psp->state);.#
ed00: 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28 20  endif.  switch( 
ed10: 70 73 70 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20  psp->state ){.  
ed20: 20 20 63 61 73 65 20 49 4e 49 54 49 41 4c 49 5a    case INITIALIZ
ed30: 45 3a 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72  E:.      psp->pr
ed40: 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20  evrule = 0;.    
ed50: 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74    psp->preccount
ed60: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73  er = 0;.      ps
ed70: 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70  p->firstrule = p
ed80: 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 30  sp->lastrule = 0
ed90: 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d  ;.      psp->gp-
eda0: 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20  >nrule = 0;.    
edb0: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 74    /* Fall thru t
edc0: 6f 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20  o next case */. 
edd0: 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
ede0: 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
edf0: 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
ee00: 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20 20 20 20  =='%' ){.       
ee10: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
ee20: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b  ITING_FOR_DECL_K
ee30: 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20 7d 65  EYWORD;.      }e
ee40: 6c 73 65 20 69 66 28 20 69 73 6c 6f 77 65 72 28  lse if( islower(
ee50: 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
ee60: 20 70 73 70 2d 3e 6c 68 73 20 3d 20 53 79 6d 62   psp->lhs = Symb
ee70: 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
ee80: 20 20 20 70 73 70 2d 3e 6e 72 68 73 20 3d 20 30     psp->nrhs = 0
ee90: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c  ;.        psp->l
eea0: 68 73 61 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  hsalias = 0;.   
eeb0: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
eec0: 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52  = WAITING_FOR_AR
eed0: 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROW;.      }else
eee0: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27 20 29   if( x[0]=='{' )
eef0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  {.        if( ps
ef00: 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20 29  p->prevrule==0 )
ef10: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
ef20: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
ef30: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
ef40: 65 6e 6f 2c 0a 22 54 68 65 72 65 20 69 73 20 6e  eno,."There is n
ef50: 6f 74 20 70 72 69 6f 72 20 72 75 6c 65 20 6f 70  ot prior rule op
ef60: 6f 6e 20 77 68 69 63 68 20 74 6f 20 61 74 74 61  on which to atta
ef70: 63 68 20 74 68 65 20 63 6f 64 65 20 5c 0a 66 72  ch the code \.fr
ef80: 61 67 6d 65 6e 74 20 77 68 69 63 68 20 62 65 67  agment which beg
ef90: 69 6e 73 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65  ins on this line
efa0: 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  .");.          p
efb0: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
efc0: 09 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e  .}else if( psp->
efd0: 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65 21 3d  prevrule->code!=
efe0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
eff0: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
f000: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
f010: 6c 69 6e 65 6e 6f 2c 0a 22 43 6f 64 65 20 66 72  lineno,."Code fr
f020: 61 67 6d 65 6e 74 20 62 65 67 69 6e 6e 69 6e 67  agment beginning
f030: 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73   on this line is
f040: 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 20 5c   not the first \
f050: 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70  .to follow the p
f060: 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b  revious rule.");
f070: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
f080: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
f090: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f0a0: 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75       psp->prevru
f0b0: 6c 65 2d 3e 6c 69 6e 65 20 3d 20 70 73 70 2d 3e  le->line = psp->
f0c0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20  tokenlineno;.   
f0d0: 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76         psp->prev
f0e0: 72 75 6c 65 2d 3e 63 6f 64 65 20 3d 20 26 78 5b  rule->code = &x[
f0f0: 31 5d 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c  1];..}.      }el
f100: 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 5b 27  se if( x[0]=='['
f110: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
f120: 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45 44 45  >state = PRECEDE
f130: 4e 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20 20 20  NCE_MARK_1;.    
f140: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f150: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
f160: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
f170: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
f180: 20 20 20 20 22 54 6f 6b 65 6e 20 5c 22 25 73 5c      "Token \"%s\
f190: 22 20 73 68 6f 75 6c 64 20 62 65 20 65 69 74 68  " should be eith
f1a0: 65 72 20 5c 22 25 25 5c 22 20 6f 72 20 61 20 6e  er \"%%\" or a n
f1b0: 6f 6e 74 65 72 6d 69 6e 61 6c 20 6e 61 6d 65 2e  onterminal name.
f1c0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 29 3b  ",.          x);
f1d0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
f1e0: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
f1f0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f200: 20 20 20 63 61 73 65 20 50 52 45 43 45 44 45 4e     case PRECEDEN
f210: 43 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20 20 20  CE_MARK_1:.     
f220: 20 69 66 28 20 21 69 73 75 70 70 65 72 28 78 5b   if( !isupper(x[
f230: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
f240: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
f250: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
f260: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
f270: 20 20 22 54 68 65 20 70 72 65 63 65 64 65 6e 63    "The precedenc
f280: 65 20 73 79 6d 62 6f 6c 20 6d 75 73 74 20 62 65  e symbol must be
f290: 20 61 20 74 65 72 6d 69 6e 61 6c 2e 22 29 3b 0a   a terminal.");.
f2a0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
f2b0: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
f2c0: 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72  else if( psp->pr
f2d0: 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  evrule==0 ){.   
f2e0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
f2f0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
f300: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
f310: 20 20 20 20 20 20 20 20 22 54 68 65 72 65 20 69          "There i
f320: 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20  s no prior rule 
f330: 74 6f 20 61 73 73 69 67 6e 20 70 72 65 63 65 64  to assign preced
f340: 65 6e 63 65 20 5c 22 5b 25 73 5d 5c 22 2e 22 2c  ence \"[%s]\".",
f350: 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
f360: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
f370: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70     }else if( psp
f380: 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63  ->prevrule->prec
f390: 73 79 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sym!=0 ){.      
f3a0: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
f3b0: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
f3c0: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72 65 63  kenlineno,."Prec
f3d0: 65 64 65 6e 63 65 20 6d 61 72 6b 20 6f 6e 20 74  edence mark on t
f3e0: 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20  his line is not 
f3f0: 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66  the first \.to f
f400: 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f  ollow the previo
f410: 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20  us rule.");.    
f420: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
f430: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  t++;.      }else
f440: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70  {.        psp->p
f450: 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73 79 6d  revrule->precsym
f460: 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
f470: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f480: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45  psp->state = PRE
f490: 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3b 0a  CEDENCE_MARK_2;.
f4a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f4b0: 20 63 61 73 65 20 50 52 45 43 45 44 45 4e 43 45   case PRECEDENCE
f4c0: 5f 4d 41 52 4b 5f 32 3a 0a 20 20 20 20 20 20 69  _MARK_2:.      i
f4d0: 66 28 20 78 5b 30 5d 21 3d 27 5d 27 20 29 7b 0a  f( x[0]!=']' ){.
f4e0: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
f4f0: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
f500: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
f510: 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73  .          "Miss
f520: 69 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20 70 72 65  ing \"]\" on pre
f530: 63 65 64 65 6e 63 65 20 6d 61 72 6b 2e 22 29 3b  cedence mark.");
f540: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
f550: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
f560: 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61  }.      psp->sta
f570: 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
f580: 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20  _DECL_OR_RULE;. 
f590: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f5a0: 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
f5b0: 5f 41 52 52 4f 57 3a 0a 20 20 20 20 20 20 69 66  _ARROW:.      if
f5c0: 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78  ( x[0]==':' && x
f5d0: 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d  [1]==':' && x[2]
f5e0: 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='=' ){.       
f5f0: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e   psp->state = IN
f600: 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _RHS;.      }els
f610: 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20  e if( x[0]=='(' 
f620: 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
f630: 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41  state = LHS_ALIA
f640: 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  S_1;.      }else
f650: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
f660: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
f670: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
f680: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 45 78  o,.          "Ex
f690: 70 65 63 74 65 64 20 74 6f 20 73 65 65 20 61 20  pected to see a 
f6a0: 5c 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20  \":\" following 
f6b0: 74 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c 20 5c  the LHS symbol \
f6c0: 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20  "%s\".",.       
f6d0: 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d     psp->lhs->nam
f6e0: 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  e);.        psp-
f6f0: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
f700: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
f710: 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
f720: 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
f730: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f740: 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49      case LHS_ALI
f750: 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20  AS_1:.      if( 
f760: 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b  isalpha(x[0]) ){
f770: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68  .        psp->lh
f780: 73 61 6c 69 61 73 20 3d 20 78 3b 0a 20 20 20 20  salias = x;.    
f790: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
f7a0: 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20   LHS_ALIAS_2;.  
f7b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f7c0: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
f7d0: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
f7e0: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
f7f0: 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73        "\"%s\" is
f800: 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69   not a valid ali
f810: 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20 5c  as for the LHS \
f820: 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20  "%s\"\n",.      
f830: 20 20 20 20 78 2c 70 73 70 2d 3e 6c 68 73 2d 3e      x,psp->lhs->
f840: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  name);.        p
f850: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
f860: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
f870: 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
f880: 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20  R_RULE_ERROR;.  
f890: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
f8a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f  k;.    case LHS_
f8b0: 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69  ALIAS_2:.      i
f8c0: 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a  f( x[0]==')' ){.
f8d0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
f8e0: 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 33  te = LHS_ALIAS_3
f8f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f900: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f910: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f920: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f930: 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69            "Missi
f940: 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69  ng \")\" followi
f950: 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d  ng LHS alias nam
f960: 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e  e \"%s\".",psp->
f970: 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20  lhsalias);.     
f980: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
f990: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
f9a0: 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
f9b0: 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
f9c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f9d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
f9e0: 4c 48 53 5f 41 4c 49 41 53 5f 33 3a 0a 20 20 20  LHS_ALIAS_3:.   
f9f0: 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27     if( x[0]==':'
fa00: 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26   && x[1]==':' &&
fa10: 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20   x[2]=='=' ){.  
fa20: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
fa30: 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20   = IN_RHS;.     
fa40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fa50: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
fa60: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
fa70: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
fa80: 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 2d 3e     "Missing \"->
fa90: 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 5c 22  \" following: \"
faa0: 25 73 28 25 73 29 5c 22 2e 22 2c 0a 20 20 20 20  %s(%s)\".",.    
fab0: 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d         psp->lhs-
fac0: 3e 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68 73 61 6c  >name,psp->lhsal
fad0: 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ias);.        ps
fae0: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
faf0: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
fb00: 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
fb10: 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
fb20: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
fb30: 3b 0a 20 20 20 20 63 61 73 65 20 49 4e 5f 52 48  ;.    case IN_RH
fb40: 53 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  S:.      if( x[0
fb50: 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  ]=='.' ){.      
fb60: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
fb70: 70 3b 0a 20 20 20 20 20 20 20 20 72 70 20 3d 20  p;.        rp = 
fb80: 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 29 63  (struct rule *)c
fb90: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
fba0: 72 75 63 74 20 72 75 6c 65 29 20 2b 20 0a 20 20  ruct rule) + .  
fbb0: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
fbc0: 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a  f(struct symbol*
fbd0: 29 2a 70 73 70 2d 3e 6e 72 68 73 20 2b 20 73 69  )*psp->nrhs + si
fbe0: 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 73 70 2d  zeof(char*)*psp-
fbf0: 3e 6e 72 68 73 2c 20 31 29 3b 0a 20 20 20 20 20  >nrhs, 1);.     
fc00: 20 20 20 69 66 28 20 72 70 3d 3d 30 20 29 7b 0a     if( rp==0 ){.
fc10: 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
fc20: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
fc30: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
fc40: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  o,.            "
fc50: 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 65  Can't allocate e
fc60: 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66 6f 72  nough memory for
fc70: 20 74 68 69 73 20 72 75 6c 65 2e 22 29 3b 0a 20   this rule.");. 
fc80: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
fc90: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
fca0: 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c      psp->prevrul
fcb0: 65 20 3d 20 30 3b 0a 09 7d 65 6c 73 65 7b 0a 20  e = 0;..}else{. 
fcc0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
fcd0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 75            rp->ru
fce0: 6c 65 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f  leline = psp->to
fcf0: 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20  kenlineno;.     
fd00: 20 20 20 20 20 72 70 2d 3e 72 68 73 20 3d 20 28       rp->rhs = (
fd10: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 2a 29  struct symbol**)
fd20: 26 72 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20  &rp[1];.        
fd30: 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 20 3d    rp->rhsalias =
fd40: 20 28 63 68 61 72 2a 2a 29 26 28 72 70 2d 3e 72   (char**)&(rp->r
fd50: 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 29 3b 0a  hs[psp->nrhs]);.
fd60: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
fd70: 30 3b 20 69 3c 70 73 70 2d 3e 6e 72 68 73 3b 20  0; i<psp->nrhs; 
fd80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
fd90: 20 20 72 70 2d 3e 72 68 73 5b 69 5d 20 3d 20 70    rp->rhs[i] = p
fda0: 73 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20  sp->rhs[i];.    
fdb0: 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61          rp->rhsa
fdc0: 6c 69 61 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 61  lias[i] = psp->a
fdd0: 6c 69 61 73 5b 69 5d 3b 0a 09 20 20 7d 0a 20 20  lias[i];..  }.  
fde0: 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 20          rp->lhs 
fdf0: 3d 20 70 73 70 2d 3e 6c 68 73 3b 0a 20 20 20 20  = psp->lhs;.    
fe00: 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69        rp->lhsali
fe10: 61 73 20 3d 20 70 73 70 2d 3e 6c 68 73 61 6c 69  as = psp->lhsali
fe20: 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  as;.          rp
fe30: 2d 3e 6e 72 68 73 20 3d 20 70 73 70 2d 3e 6e 72  ->nrhs = psp->nr
fe40: 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  hs;.          rp
fe50: 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  ->code = 0;.    
fe60: 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79        rp->precsy
fe70: 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  m = 0;.         
fe80: 20 72 70 2d 3e 69 6e 64 65 78 20 3d 20 70 73 70   rp->index = psp
fe90: 2d 3e 67 70 2d 3e 6e 72 75 6c 65 2b 2b 3b 0a 20  ->gp->nrule++;. 
fea0: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 65 78           rp->nex
feb0: 74 6c 68 73 20 3d 20 72 70 2d 3e 6c 68 73 2d 3e  tlhs = rp->lhs->
fec0: 72 75 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  rule;.          
fed0: 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65 20 3d 20  rp->lhs->rule = 
fee0: 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  rp;.          rp
fef0: 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ->next = 0;.    
ff00: 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 66        if( psp->f
ff10: 69 72 73 74 72 75 6c 65 3d 3d 30 20 29 7b 0a 20  irstrule==0 ){. 
ff20: 20 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e             psp->
ff30: 66 69 72 73 74 72 75 6c 65 20 3d 20 70 73 70 2d  firstrule = psp-
ff40: 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a  >lastrule = rp;.
ff50: 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20  .  }else{.      
ff60: 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73 74 72        psp->lastr
ff70: 75 6c 65 2d 3e 6e 65 78 74 20 3d 20 72 70 3b 0a  ule->next = rp;.
ff80: 20 20 20 20 20 20 20 20 20 20 20 20 70 73 70 2d              psp-
ff90: 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a  >lastrule = rp;.
ffa0: 09 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70  .  }.          p
ffb0: 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 72  sp->prevrule = r
ffc0: 70 3b 0a 09 7d 0a 20 20 20 20 20 20 20 20 70 73  p;..}.        ps
ffd0: 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
ffe0: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
fff0: 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
10000 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30   if( isalpha(x[0
10010 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]) ){.        if
10020 28 20 70 73 70 2d 3e 6e 72 68 73 3e 3d 4d 41 58  ( psp->nrhs>=MAX
10030 52 48 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20  RHS ){.         
10040 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
10050 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
10060 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
10070 20 20 20 20 20 20 22 54 6f 6f 20 6d 61 6e 79 20        "Too many 
10080 73 79 6d 62 6f 6c 73 20 6f 6e 20 52 48 53 20 6f  symbols on RHS o
10090 66 20 72 75 6c 65 20 62 65 67 69 6e 6e 69 6e 67  f rule beginning
100a0 20 61 74 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20   at \"%s\".",.  
100b0 20 20 20 20 20 20 20 20 20 20 78 29 3b 0a 20 20            x);.  
100c0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
100d0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
100e0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
100f0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
10100 45 5f 45 52 52 4f 52 3b 0a 09 7d 65 6c 73 65 7b  E_ERROR;..}else{
10110 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10120 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d  rhs[psp->nrhs] =
10130 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
10140 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61            psp->a
10150 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20  lias[psp->nrhs] 
10160 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
10170 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 09 7d 0a 20  sp->nrhs++;..}. 
10180 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
10190 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78 5b 30  x[0]=='|' || x[0
101a0 5d 3d 3d 27 2f 27 29 20 26 26 20 70 73 70 2d 3e  ]=='/') && psp->
101b0 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20 20 20 20  nrhs>0 ){.      
101c0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
101d0 2a 6d 73 70 20 3d 20 70 73 70 2d 3e 72 68 73 5b  *msp = psp->rhs[
101e0 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 3b 0a 20 20  psp->nrhs-1];.  
101f0 20 20 20 20 20 20 69 66 28 20 6d 73 70 2d 3e 74        if( msp->t
10200 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype!=MULTITERMIN
10210 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
10220 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6f  struct symbol *o
10230 72 69 67 73 70 20 3d 20 6d 73 70 3b 0a 20 20 20  rigsp = msp;.   
10240 20 20 20 20 20 20 20 6d 73 70 20 3d 20 63 61 6c         msp = cal
10250 6c 6f 63 28 31 2c 73 69 7a 65 6f 66 28 2a 6d 73  loc(1,sizeof(*ms
10260 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  p));.          m
10270 65 6d 73 65 74 28 6d 73 70 2c 20 30 2c 20 73 69  emset(msp, 0, si
10280 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20 20 20  zeof(*msp));.   
10290 20 20 20 20 20 20 20 6d 73 70 2d 3e 74 79 70 65         msp->type
102a0 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c   = MULTITERMINAL
102b0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d  ;.          msp-
102c0 3e 6e 73 75 62 73 79 6d 20 3d 20 31 3b 0a 20 20  >nsubsym = 1;.  
102d0 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62          msp->sub
102e0 73 79 6d 20 3d 20 63 61 6c 6c 6f 63 28 31 2c 73  sym = calloc(1,s
102f0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
10300 62 6f 6c 2a 29 29 3b 0a 20 20 20 20 20 20 20 20  bol*));.        
10310 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d    msp->subsym[0]
10320 20 3d 20 6f 72 69 67 73 70 3b 0a 20 20 20 20 20   = origsp;.     
10330 20 20 20 20 20 6d 73 70 2d 3e 6e 61 6d 65 20 3d       msp->name =
10340 20 6f 72 69 67 73 70 2d 3e 6e 61 6d 65 3b 0a 20   origsp->name;. 
10350 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68           psp->rh
10360 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d  s[psp->nrhs-1] =
10370 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   msp;.        }.
10380 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75          msp->nsu
10390 62 73 79 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  bsym++;.        
103a0 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 72 65  msp->subsym = re
103b0 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79  alloc(msp->subsy
103c0 6d 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  m, sizeof(struct
103d0 20 73 79 6d 62 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e   symbol*)*msp->n
103e0 73 75 62 73 79 6d 29 3b 0a 20 20 20 20 20 20 20  subsym);.       
103f0 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 6d 73 70   msp->subsym[msp
10400 2d 3e 6e 73 75 62 73 79 6d 2d 31 5d 20 3d 20 53  ->nsubsym-1] = S
10410 79 6d 62 6f 6c 5f 6e 65 77 28 26 78 5b 31 5d 29  ymbol_new(&x[1])
10420 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
10430 6c 6f 77 65 72 28 78 5b 31 5d 29 20 7c 7c 20 69  lower(x[1]) || i
10440 73 6c 6f 77 65 72 28 6d 73 70 2d 3e 73 75 62 73  slower(msp->subs
10450 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 20  ym[0]->name[0]) 
10460 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
10470 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
10480 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
10490 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
104a0 20 20 22 43 61 6e 6e 6f 74 20 66 6f 72 6d 20 61    "Cannot form a
104b0 20 63 6f 6d 70 6f 75 6e 64 20 63 6f 6e 74 61 69   compound contai
104c0 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 65 72 6d 69  ning a non-termi
104d0 6e 61 6c 22 29 3b 0a 20 20 20 20 20 20 20 20 20  nal");.         
104e0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
104f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10500 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d    }else if( x[0]
10510 3d 3d 27 28 27 20 26 26 20 70 73 70 2d 3e 6e 72  =='(' && psp->nr
10520 68 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  hs>0 ){.        
10530 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 48 53  psp->state = RHS
10540 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20 20  _ALIAS_1;.      
10550 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
10560 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
10570 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
10580 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
10590 20 20 22 49 6c 6c 65 67 61 6c 20 63 68 61 72 61    "Illegal chara
105a0 63 74 65 72 20 6f 6e 20 52 48 53 20 6f 66 20 72  cter on RHS of r
105b0 75 6c 65 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29  ule: \"%s\".",x)
105c0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
105d0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
105e0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
105f0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
10600 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
10610 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10620 20 20 63 61 73 65 20 52 48 53 5f 41 4c 49 41 53    case RHS_ALIAS
10630 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73  _1:.      if( is
10640 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
10650 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c 69 61         psp->alia
10660 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d  s[psp->nrhs-1] =
10670 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   x;.        psp-
10680 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49  >state = RHS_ALI
10690 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  AS_2;.      }els
106a0 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
106b0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
106c0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
106d0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c  no,.          "\
106e0 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76  "%s\" is not a v
106f0 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74  alid alias for t
10700 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 20 5c 22  he RHS symbol \"
10710 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %s\"\n",.       
10720 20 20 20 78 2c 70 73 70 2d 3e 72 68 73 5b 70 73     x,psp->rhs[ps
10730 70 2d 3e 6e 72 68 73 2d 31 5d 2d 3e 6e 61 6d 65  p->nrhs-1]->name
10740 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
10750 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
10760 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
10770 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
10780 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  LE_ERROR;.      
10790 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
107a0 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c 49 41     case RHS_ALIA
107b0 53 5f 32 3a 0a 20 20 20 20 20 20 69 66 28 20 78  S_2:.      if( x
107c0 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20  [0]==')' ){.    
107d0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
107e0 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d   IN_RHS;.      }
107f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
10800 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
10810 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
10820 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
10830 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20   "Missing \")\" 
10840 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c  following LHS al
10850 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e  ias name \"%s\".
10860 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29  ",psp->lhsalias)
10870 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
10880 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
10890 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
108a0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
108b0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
108c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
108d0 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
108e0 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3a  OR_DECL_KEYWORD:
108f0 0a 20 20 20 20 20 20 69 66 28 20 69 73 61 6c 70  .      if( isalp
10900 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ha(x[0]) ){.    
10910 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6b 65 79      psp->declkey
10920 77 6f 72 64 20 3d 20 78 3b 0a 20 20 20 20 20 20  word = x;.      
10930 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
10940 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ot = 0;.        
10950 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
10960 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 0;.        psp
10970 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
10980 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a  G_FOR_DECL_ARG;.
10990 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
109a0 6d 70 28 78 2c 22 6e 61 6d 65 22 29 3d 3d 30 20  mp(x,"name")==0 
109b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
109c0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
109d0 26 28 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65 29  &(psp->gp->name)
109e0 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
109f0 63 6d 70 28 78 2c 22 69 6e 63 6c 75 64 65 22 29  cmp(x,"include")
10a00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10a10 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10a20 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 69  t = &(psp->gp->i
10a30 6e 63 6c 75 64 65 29 3b 0a 20 20 20 20 20 20 20  nclude);.       
10a40 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c     psp->decllnsl
10a50 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 69  ot = &psp->gp->i
10a60 6e 63 6c 75 64 65 6c 6e 3b 0a 09 7d 65 6c 73 65  ncludeln;..}else
10a70 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 63   if( strcmp(x,"c
10a80 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ode")==0 ){.    
10a90 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
10aa0 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
10ab0 67 70 2d 3e 65 78 74 72 61 63 6f 64 65 29 3b 0a  gp->extracode);.
10ac0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
10ad0 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70  ecllnslot = &psp
10ae0 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64 65 6c  ->gp->extracodel
10af0 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  n;..}else if( st
10b00 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 64 65  rcmp(x,"token_de
10b10 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b  structor")==0 ){
10b20 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10b30 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70  declargslot = &p
10b40 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 64 65 73  sp->gp->tokendes
10b50 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  t;.          psp
10b60 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26  ->decllnslot = &
10b70 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 64 65  psp->gp->tokende
10b80 73 74 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28  stln;..}else if(
10b90 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66 61 75   strcmp(x,"defau
10ba0 6c 74 5f 64 65 73 74 72 75 63 74 6f 72 22 29 3d  lt_destructor")=
10bb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10bc0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
10bd0 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 76 61 72   = &psp->gp->var
10be0 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dest;.          
10bf0 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
10c00 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 76 61 72 64  = &psp->gp->vard
10c10 65 73 74 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66  estln;..}else if
10c20 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65  ( strcmp(x,"toke
10c30 6e 5f 70 72 65 66 69 78 22 29 3d 3d 30 20 29 7b  n_prefix")==0 ){
10c40 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10c50 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70  declargslot = &p
10c60 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72 65  sp->gp->tokenpre
10c70 66 69 78 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  fix;..}else if( 
10c80 73 74 72 63 6d 70 28 78 2c 22 73 79 6e 74 61 78  strcmp(x,"syntax
10c90 5f 65 72 72 6f 72 22 29 3d 3d 30 20 29 7b 0a 20  _error")==0 ){. 
10ca0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
10cb0 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
10cc0 70 2d 3e 67 70 2d 3e 65 72 72 6f 72 29 3b 0a 20  p->gp->error);. 
10cd0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
10ce0 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d  cllnslot = &psp-
10cf0 3e 67 70 2d 3e 65 72 72 6f 72 6c 6e 3b 0a 09 7d  >gp->errorln;..}
10d00 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10d10 78 2c 22 70 61 72 73 65 5f 61 63 63 65 70 74 22  x,"parse_accept"
10d20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
10d30 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
10d40 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
10d50 61 63 63 65 70 74 29 3b 0a 20 20 20 20 20 20 20  accept);.       
10d60 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c     psp->decllnsl
10d70 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 61  ot = &psp->gp->a
10d80 63 63 65 70 74 6c 6e 3b 0a 09 7d 65 6c 73 65 20  cceptln;..}else 
10d90 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 70 61  if( strcmp(x,"pa
10da0 72 73 65 5f 66 61 69 6c 75 72 65 22 29 3d 3d 30  rse_failure")==0
10db0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
10dc0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
10dd0 20 26 28 70 73 70 2d 3e 67 70 2d 3e 66 61 69 6c   &(psp->gp->fail
10de0 75 72 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ure);.          
10df0 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
10e00 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 66 61 69 6c  = &psp->gp->fail
10e10 75 72 65 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66  ureln;..}else if
10e20 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63  ( strcmp(x,"stac
10e30 6b 5f 6f 76 65 72 66 6c 6f 77 22 29 3d 3d 30 20  k_overflow")==0 
10e40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
10e50 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
10e60 26 28 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66  &(psp->gp->overf
10e70 6c 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  low);.          
10e80 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
10e90 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72  = &psp->gp->over
10ea0 66 6c 6f 77 6c 6e 3b 0a 20 20 20 20 20 20 20 20  flowln;.        
10eb0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10ec0 28 78 2c 22 65 78 74 72 61 5f 61 72 67 75 6d 65  (x,"extra_argume
10ed0 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nt")==0 ){.     
10ee0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10ef0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10f00 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 20 20 20  p->arg);.       
10f10 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
10f20 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70 65 22  p(x,"token_type"
10f30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
10f40 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
10f50 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
10f60 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20 20 20  tokentype);.    
10f70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
10f80 72 63 6d 70 28 78 2c 22 64 65 66 61 75 6c 74 5f  rcmp(x,"default_
10f90 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  type")==0 ){.   
10fa0 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
10fb0 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
10fc0 3e 67 70 2d 3e 76 61 72 74 79 70 65 29 3b 0a 20  >gp->vartype);. 
10fd0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10fe0 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63 6b   strcmp(x,"stack
10ff0 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20  _size")==0 ){.  
11000 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
11010 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
11020 2d 3e 67 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29  ->gp->stacksize)
11030 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
11040 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74  if( strcmp(x,"st
11050 61 72 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30 20  art_symbol")==0 
11060 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
11070 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
11080 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61 72 74  &(psp->gp->start
11090 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
110a0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6c   if( strcmp(x,"l
110b0 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eft")==0 ){.    
110c0 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63        psp->precc
110d0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
110e0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73      psp->declass
110f0 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20 20 20 20  oc = LEFT;.     
11100 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11110 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52  = WAITING_FOR_PR
11120 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b  ECEDENCE_SYMBOL;
11130 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11140 66 28 20 73 74 72 63 6d 70 28 78 2c 22 72 69 67  f( strcmp(x,"rig
11150 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ht")==0 ){.     
11160 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f       psp->precco
11170 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20  unter++;.       
11180 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f     psp->declasso
11190 63 20 3d 20 52 49 47 48 54 3b 0a 20 20 20 20 20  c = RIGHT;.     
111a0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
111b0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52  = WAITING_FOR_PR
111c0 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b  ECEDENCE_SYMBOL;
111d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
111e0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 6f 6e  f( strcmp(x,"non
111f0 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b 0a 20 20  assoc")==0 ){.  
11200 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
11210 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  ccounter++;.    
11220 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
11230 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20 20 20  ssoc = NONE;.   
11240 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11250 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
11260 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
11270 4c 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  L;..}else if( st
11280 72 63 6d 70 28 78 2c 22 64 65 73 74 72 75 63 74  rcmp(x,"destruct
11290 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  or")==0 ){.     
112a0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
112b0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
112c0 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3b  STRUCTOR_SYMBOL;
112d0 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63  ..}else if( strc
112e0 6d 70 28 78 2c 22 74 79 70 65 22 29 3d 3d 30 20  mp(x,"type")==0 
112f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
11300 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
11310 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53  G_FOR_DATATYPE_S
11320 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d  YMBOL;.        }
11330 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11340 78 2c 22 66 61 6c 6c 62 61 63 6b 22 29 3d 3d 30  x,"fallback")==0
11350 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
11360 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  p->fallback = 0;
11370 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11380 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
11390 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3b  FOR_FALLBACK_ID;
113a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
113b0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 77 69 6c  f( strcmp(x,"wil
113c0 64 63 61 72 64 22 29 3d 3d 30 20 29 7b 0a 20 20  dcard")==0 ){.  
113d0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
113e0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
113f0 5f 57 49 4c 44 43 41 52 44 5f 49 44 3b 0a 20 20  _WILDCARD_ID;.  
11400 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11410 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
11420 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
11430 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
11440 20 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 6b              "Unk
11450 6e 6f 77 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  nown declaration
11460 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25 25 25 73   keyword: \"%%%s
11470 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  \".",x);.       
11480 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
11490 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
114a0 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
114b0 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
114c0 4f 52 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c  OR;..}.      }el
114d0 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
114e0 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
114f0 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
11500 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
11510 49 6c 6c 65 67 61 6c 20 64 65 63 6c 61 72 61 74  Illegal declarat
11520 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25  ion keyword: \"%
11530 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  s\".",x);.      
11540 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
11550 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
11560 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
11570 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
11580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
11590 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
115a0 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52  AITING_FOR_DESTR
115b0 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3a 0a 20 20  UCTOR_SYMBOL:.  
115c0 20 20 20 20 69 66 28 20 21 69 73 61 6c 70 68 61      if( !isalpha
115d0 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
115e0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
115f0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
11600 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11610 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d       "Symbol nam
11620 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20  e missing after 
11630 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79 77  %destructor keyw
11640 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ord");.        p
11650 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11660 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11670 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
11680 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
11690 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
116a0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
116b0 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65   *sp = Symbol_ne
116c0 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  w(x);.        ps
116d0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
116e0 20 26 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72   &sp->destructor
116f0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64  ;.        psp->d
11700 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 73 70 2d  ecllnslot = &sp-
11710 3e 64 65 73 74 72 75 63 74 6f 72 6c 6e 3b 0a 20  >destructorln;. 
11720 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11730 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
11740 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20  DECL_ARG;.      
11750 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
11760 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
11770 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d  FOR_DATATYPE_SYM
11780 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21  BOL:.      if( !
11790 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b  isalpha(x[0]) ){
117a0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
117b0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
117c0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
117d0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d  ,.          "Sym
117e0 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67  bol name missing
117f0 20 61 66 74 65 72 20 25 64 65 73 74 72 75 63 74   after %destruct
11800 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20  or keyword");.  
11810 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
11820 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
11830 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
11840 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
11850 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
11860 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
11870 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79   symbol *sp = Sy
11880 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
11890 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
118a0 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61 74  gslot = &sp->dat
118b0 61 74 79 70 65 3b 0a 20 20 20 20 20 20 20 20 70  atype;.        p
118c0 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d  sp->decllnslot =
118d0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
118e0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
118f0 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20  _FOR_DECL_ARG;. 
11900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
11910 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
11920 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45  TING_FOR_PRECEDE
11930 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20  NCE_SYMBOL:.    
11940 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
11950 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
11960 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
11970 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
11980 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11990 28 20 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20  ( isupper(x[0]) 
119a0 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
119b0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20  t symbol *sp;.  
119c0 20 20 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f        sp = Symbo
119d0 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
119e0 20 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d    if( sp->prec>=
119f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
11a00 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
11a10 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
11a20 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
11a30 20 20 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25 73      "Symbol \"%s
11a40 5c 22 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  \" has already b
11a50 65 20 67 69 76 65 6e 20 61 20 70 72 65 63 65 64  e given a preced
11a60 65 6e 63 65 2e 22 2c 78 29 3b 0a 20 20 20 20 20  ence.",x);.     
11a70 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11a80 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20  nt++;..}else{.  
11a90 20 20 20 20 20 20 20 20 73 70 2d 3e 70 72 65 63          sp->prec
11aa0 20 3d 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e   = psp->preccoun
11ab0 74 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ter;.          s
11ac0 70 2d 3e 61 73 73 6f 63 20 3d 20 70 73 70 2d 3e  p->assoc = psp->
11ad0 64 65 63 6c 61 73 73 6f 63 3b 0a 09 7d 0a 20 20  declassoc;..}.  
11ae0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11af0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
11b00 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
11b10 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
11b20 20 20 20 20 20 20 22 43 61 6e 27 74 20 61 73 73        "Can't ass
11b30 69 67 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65  ign a precedence
11b40 20 74 6f 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b   to \"%s\".",x);
11b50 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
11b60 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
11b70 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
11b80 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
11b90 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3a 0a 20 20  FOR_DECL_ARG:.  
11ba0 20 20 20 20 69 66 28 20 28 78 5b 30 5d 3d 3d 27      if( (x[0]=='
11bb0 7b 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27  {' || x[0]=='\"'
11bc0 20 7c 7c 20 69 73 61 6c 6e 75 6d 28 78 5b 30 5d   || isalnum(x[0]
11bd0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  )) ){.        if
11be0 28 20 2a 28 70 73 70 2d 3e 64 65 63 6c 61 72 67  ( *(psp->declarg
11bf0 73 6c 6f 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  slot)!=0 ){.    
11c00 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11c10 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11c20 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
11c30 20 20 20 20 20 20 20 20 20 20 20 22 54 68 65 20             "The 
11c40 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20  argument \"%s\" 
11c50 74 6f 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 5c  to declaration \
11c60 22 25 25 25 73 5c 22 20 69 73 20 6e 6f 74 20 74  "%%%s\" is not t
11c70 68 65 20 66 69 72 73 74 2e 22 2c 0a 20 20 20 20  he first.",.    
11c80 20 20 20 20 20 20 20 20 78 5b 30 5d 3d 3d 27 5c          x[0]=='\
11c90 22 27 20 3f 20 26 78 5b 31 5d 20 3a 20 78 2c 70  "' ? &x[1] : x,p
11ca0 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 29  sp->declkeyword)
11cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
11cc0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11cd0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11ce0 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
11cf0 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 65  _DECL_ERROR;..}e
11d00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  lse{.          *
11d10 28 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f  (psp->declargslo
11d20 74 29 20 3d 20 28 78 5b 30 5d 3d 3d 27 5c 22 27  t) = (x[0]=='\"'
11d30 20 7c 7c 20 78 5b 30 5d 3d 3d 27 7b 27 29 20 3f   || x[0]=='{') ?
11d40 20 26 78 5b 31 5d 20 3a 20 78 3b 0a 20 20 20 20   &x[1] : x;.    
11d50 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 64        if( psp->d
11d60 65 63 6c 6c 6e 73 6c 6f 74 20 29 20 2a 70 73 70  ecllnslot ) *psp
11d70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 70  ->decllnslot = p
11d80 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b  sp->tokenlineno;
11d90 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11da0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
11db0 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
11dc0 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65  ;..}.      }else
11dd0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
11de0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
11df0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
11e00 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c  o,.          "Il
11e10 6c 65 67 61 6c 20 61 72 67 75 6d 65 6e 74 20 74  legal argument t
11e20 6f 20 25 25 25 73 3a 20 25 73 22 2c 70 73 70 2d  o %%%s: %s",psp-
11e30 3e 64 65 63 6c 6b 65 79 77 6f 72 64 2c 78 29 3b  >declkeyword,x);
11e40 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
11e50 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
11e60 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
11e70 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
11e80 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
11e90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11ea0 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
11eb0 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3a 0a 20  R_FALLBACK_ID:. 
11ec0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
11ed0 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  .' ){.        ps
11ee0 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
11ef0 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
11f00 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
11f10 20 69 66 28 20 21 69 73 75 70 70 65 72 28 78 5b   if( !isupper(x[
11f20 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
11f30 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
11f40 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65  ename, psp->toke
11f50 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
11f60 20 20 20 22 25 25 66 61 6c 6c 62 61 63 6b 20 61     "%%fallback a
11f70 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73  rgument \"%s\" s
11f80 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e  hould be a token
11f90 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ", x);.        p
11fa0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11fb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11fc0 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
11fd0 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f  ol *sp = Symbol_
11fe0 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
11ff0 69 66 28 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63  if( psp->fallbac
12000 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
12010 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20    psp->fallback 
12020 3d 20 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 65  = sp;.        }e
12030 6c 73 65 20 69 66 28 20 73 70 2d 3e 66 61 6c 6c  lse if( sp->fall
12040 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
12050 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
12060 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74  filename, psp->t
12070 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
12080 20 20 20 20 20 20 20 20 22 4d 6f 72 65 20 74 68          "More th
12090 61 6e 20 6f 6e 65 20 66 61 6c 6c 62 61 63 6b 20  an one fallback 
120a0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 6f 6b 65  assigned to toke
120b0 6e 20 25 73 22 2c 20 78 29 3b 0a 20 20 20 20 20  n %s", x);.     
120c0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
120d0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  nt++;.        }e
120e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
120f0 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 70 73  p->fallback = ps
12100 70 2d 3e 66 61 6c 6c 62 61 63 6b 3b 0a 20 20 20  p->fallback;.   
12110 20 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e         psp->gp->
12120 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 3d 20 31  has_fallback = 1
12130 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12140 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
12150 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
12160 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49  G_FOR_WILDCARD_I
12170 44 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  D:.      if( x[0
12180 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  ]=='.' ){.      
12190 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
121a0 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
121b0 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d  OR_RULE;.      }
121c0 65 6c 73 65 20 69 66 28 20 21 69 73 75 70 70 65  else if( !isuppe
121d0 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  r(x[0]) ){.     
121e0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
121f0 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e  >filename, psp->
12200 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
12210 20 20 20 20 20 20 20 22 25 25 77 69 6c 64 63 61         "%%wildca
12220 72 64 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73  rd argument \"%s
12230 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74  \" should be a t
12240 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20  oken", x);.     
12250 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
12260 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ++;.      }else{
12270 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
12280 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d  symbol *sp = Sym
12290 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
122a0 20 20 20 20 69 66 28 20 70 73 70 2d 3e 67 70 2d      if( psp->gp-
122b0 3e 77 69 6c 64 63 61 72 64 3d 3d 30 20 29 7b 0a  >wildcard==0 ){.
122c0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 67            psp->g
122d0 70 2d 3e 77 69 6c 64 63 61 72 64 20 3d 20 73 70  p->wildcard = sp
122e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
122f0 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
12300 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
12310 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
12320 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
12330 20 22 45 78 74 72 61 20 77 69 6c 64 63 61 72 64   "Extra wildcard
12340 20 74 6f 20 74 6f 6b 65 6e 3a 20 25 73 22 2c 20   to token: %s", 
12350 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
12360 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
12370 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12380 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12390 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41 46    case RESYNC_AF
123a0 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3a 0a  TER_RULE_ERROR:.
123b0 2f 2a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  /*      if( x[0]
123c0 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73 74 61  =='.' ) psp->sta
123d0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
123e0 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 2a  _DECL_OR_RULE;.*
123f0 2a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 2a 2f  *      break; */
12400 0a 20 20 20 20 63 61 73 65 20 52 45 53 59 4e 43  .    case RESYNC
12410 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
12420 52 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  R:.      if( x[0
12430 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73 74  ]=='.' ) psp->st
12440 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
12450 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
12460 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
12470 27 25 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65  '%' ) psp->state
12480 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
12490 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20  ECL_KEYWORD;.   
124a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a     break;.  }.}.
124b0 0a 2f 2a 20 52 75 6e 20 74 68 65 20 70 72 6f 70  ./* Run the prop
124c0 72 6f 63 65 73 73 6f 72 20 6f 76 65 72 20 74 68  rocessor over th
124d0 65 20 69 6e 70 75 74 20 66 69 6c 65 20 74 65 78  e input file tex
124e0 74 2e 20 20 54 68 65 20 67 6c 6f 62 61 6c 20 76  t.  The global v
124f0 61 72 69 61 62 6c 65 73 0a 2a 2a 20 61 7a 44 65  ariables.** azDe
12500 66 69 6e 65 5b 30 5d 20 74 68 72 6f 75 67 68 20  fine[0] through 
12510 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69 6e 65  azDefine[nDefine
12520 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  -1] contains the
12530 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 64 65   names of all de
12540 66 69 6e 65 64 0a 2a 2a 20 6d 61 63 72 6f 73 2e  fined.** macros.
12550 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6c    This routine l
12560 6f 6f 6b 73 20 66 6f 72 20 22 25 69 66 64 65 66  ooks for "%ifdef
12570 22 20 61 6e 64 20 22 25 69 66 6e 64 65 66 22 20  " and "%ifndef" 
12580 61 6e 64 20 22 25 65 6e 64 69 66 22 20 61 6e 64  and "%endif" and
12590 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73 20 74 68 65  .** comments the
125a0 6d 20 6f 75 74 2e 20 20 54 65 78 74 20 69 6e 20  m out.  Text in 
125b0 62 65 74 77 65 65 6e 20 69 73 20 61 6c 73 6f 20  between is also 
125c0 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 20 61 73  commented out as
125d0 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
125e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 65  .static void pre
125f0 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 63 68  process_input(ch
12600 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c  ar *z){.  int i,
12610 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20   j, k, n;.  int 
12620 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20 69  exclude = 0;.  i
12630 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  nt start = 0;.  
12640 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a  int lineno = 1;.
12650 20 20 69 6e 74 20 73 74 61 72 74 5f 6c 69 6e 65    int start_line
12660 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  no = 1;.  for(i=
12670 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
12680 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e     if( z[i]=='\n
12690 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
126a0 20 20 69 66 28 20 7a 5b 69 5d 21 3d 27 25 27 20    if( z[i]!='%' 
126b0 7c 7c 20 28 69 3e 30 20 26 26 20 7a 5b 69 2d 31  || (i>0 && z[i-1
126c0 5d 21 3d 27 5c 6e 27 29 20 29 20 63 6f 6e 74 69  ]!='\n') ) conti
126d0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74 72  nue;.    if( str
126e0 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 65 6e 64  ncmp(&z[i],"%end
126f0 69 66 22 2c 36 29 3d 3d 30 20 26 26 20 69 73 73  if",6)==0 && iss
12700 70 61 63 65 28 7a 5b 69 2b 36 5d 29 20 29 7b 0a  pace(z[i+6]) ){.
12710 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64        if( exclud
12720 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78 63  e ){.        exc
12730 6c 75 64 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20  lude--;.        
12740 69 66 28 20 65 78 63 6c 75 64 65 3d 3d 30 20 29  if( exclude==0 )
12750 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
12760 6a 3d 73 74 61 72 74 3b 20 6a 3c 69 3b 20 6a 2b  j=start; j<i; j+
12770 2b 29 20 69 66 28 20 7a 5b 6a 5d 21 3d 27 5c 6e  +) if( z[j]!='\n
12780 27 20 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a  ' ) z[j] = ' ';.
12790 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
127a0 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b  }.      for(j=i;
127b0 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27   z[j] && z[j]!='
127c0 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d  \n'; j++) z[j] =
127d0 20 27 20 27 3b 0a 20 20 20 20 7d 65 6c 73 65 20   ' ';.    }else 
127e0 69 66 28 20 28 73 74 72 6e 63 6d 70 28 26 7a 5b  if( (strncmp(&z[
127f0 69 5d 2c 22 25 69 66 64 65 66 22 2c 36 29 3d 3d  i],"%ifdef",6)==
12800 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69  0 && isspace(z[i
12810 2b 36 5d 29 29 0a 20 20 20 20 20 20 20 20 20 20  +6])).          
12820 7c 7c 20 28 73 74 72 6e 63 6d 70 28 26 7a 5b 69  || (strncmp(&z[i
12830 5d 2c 22 25 69 66 6e 64 65 66 22 2c 37 29 3d 3d  ],"%ifndef",7)==
12840 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69  0 && isspace(z[i
12850 2b 37 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 69  +7])) ){.      i
12860 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20  f( exclude ){.  
12870 20 20 20 20 20 20 65 78 63 6c 75 64 65 2b 2b 3b        exclude++;
12880 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12890 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 37 3b        for(j=i+7;
128a0 20 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29 3b 20   isspace(z[j]); 
128b0 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 66  j++){}.        f
128c0 6f 72 28 6e 3d 30 3b 20 7a 5b 6a 2b 6e 5d 20 26  or(n=0; z[j+n] &
128d0 26 20 21 69 73 73 70 61 63 65 28 7a 5b 6a 2b 6e  & !isspace(z[j+n
128e0 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]); n++){}.     
128f0 20 20 20 65 78 63 6c 75 64 65 20 3d 20 31 3b 0a     exclude = 1;.
12900 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
12910 20 6b 3c 6e 44 65 66 69 6e 65 3b 20 6b 2b 2b 29   k<nDefine; k++)
12920 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
12930 73 74 72 6e 63 6d 70 28 61 7a 44 65 66 69 6e 65  strncmp(azDefine
12940 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e 29 3d 3d 30 20  [k],&z[j],n)==0 
12950 26 26 20 73 74 72 6c 65 6e 28 61 7a 44 65 66 69  && strlen(azDefi
12960 6e 65 5b 6b 5d 29 3d 3d 6e 20 29 7b 0a 20 20 20  ne[k])==n ){.   
12970 20 20 20 20 20 20 20 20 20 65 78 63 6c 75 64 65           exclude
12980 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
12990 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
129a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
129b0 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 33         if( z[i+3
129c0 5d 3d 3d 27 6e 27 20 29 20 65 78 63 6c 75 64 65  ]=='n' ) exclude
129d0 20 3d 20 21 65 78 63 6c 75 64 65 3b 0a 20 20 20   = !exclude;.   
129e0 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65       if( exclude
129f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
12a00 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  art = i;.       
12a10 20 20 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 20     start_lineno 
12a20 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  = lineno;.      
12a30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12a40 20 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20    for(j=i; z[j] 
12a50 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a  && z[j]!='\n'; j
12a60 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a  ++) z[j] = ' ';.
12a70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
12a80 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 66  exclude ){.    f
12a90 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 75  printf(stderr,"u
12aa0 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 25 69 66  nterminated %%if
12ab0 64 65 66 20 73 74 61 72 74 69 6e 67 20 6f 6e 20  def starting on 
12ac0 6c 69 6e 65 20 25 64 5c 6e 22 2c 20 73 74 61 72  line %d\n", star
12ad0 74 5f 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 65  t_lineno);.    e
12ae0 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  xit(1);.  }.}../
12af0 2a 20 49 6e 20 73 70 69 74 65 20 6f 66 20 69 74  * In spite of it
12b00 73 20 6e 61 6d 65 2c 20 74 68 69 73 20 66 75 6e  s name, this fun
12b10 63 74 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20  ction is really 
12b20 61 20 73 63 61 6e 6e 65 72 2e 20 20 49 74 20 72  a scanner.  It r
12b30 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 65 6e  ead.** in the en
12b40 74 69 72 65 20 69 6e 70 75 74 20 66 69 6c 65 20  tire input file 
12b50 28 61 6c 6c 20 61 74 20 6f 6e 63 65 29 20 74 68  (all at once) th
12b60 65 6e 20 74 6f 6b 65 6e 69 7a 65 73 20 69 74 2e  en tokenizes it.
12b70 20 20 45 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20    Each.** token 
12b80 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  is passed to the
12b90 20 66 75 6e 63 74 69 6f 6e 20 22 70 61 72 73 65   function "parse
12ba0 6f 6e 65 74 6f 6b 65 6e 22 20 77 68 69 63 68 20  onetoken" which 
12bb0 62 75 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20 74 68  builds all.** th
12bc0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 61  e appropriate da
12bd0 74 61 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ta structures in
12be0 20 74 68 65 20 67 6c 6f 62 61 6c 20 73 74 61 74   the global stat
12bf0 65 20 76 65 63 74 6f 72 20 22 67 70 22 2e 0a 2a  e vector "gp"..*
12c00 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 67 70 29  /.void Parse(gp)
12c10 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67  .struct lemon *g
12c20 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 73  p;.{.  struct ps
12c30 74 61 74 65 20 70 73 3b 0a 20 20 46 49 4c 45 20  tate ps;.  FILE 
12c40 2a 66 70 3b 0a 20 20 63 68 61 72 20 2a 66 69 6c  *fp;.  char *fil
12c50 65 62 75 66 3b 0a 20 20 69 6e 74 20 66 69 6c 65  ebuf;.  int file
12c60 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e 65  size;.  int line
12c70 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63  no;.  int c;.  c
12c80 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63 70  har *cp, *nextcp
12c90 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e  ;.  int startlin
12ca0 65 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65 74  e = 0;..  memset
12cb0 28 26 70 73 2c 20 27 5c 30 27 2c 20 73 69 7a 65  (&ps, '\0', size
12cc0 6f 66 28 70 73 29 29 3b 0a 20 20 70 73 2e 67 70  of(ps));.  ps.gp
12cd0 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65   = gp;.  ps.file
12ce0 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e  name = gp->filen
12cf0 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63  ame;.  ps.errorc
12d00 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61  nt = 0;.  ps.sta
12d10 74 65 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b  te = INITIALIZE;
12d20 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
12d30 72 65 61 64 69 6e 67 20 74 68 65 20 69 6e 70 75  reading the inpu
12d40 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d  t file */.  fp =
12d50 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61   fopen(ps.filena
12d60 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20  me,"rb");.  if( 
12d70 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72  fp==0 ){.    Err
12d80 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d  orMsg(ps.filenam
12d90 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20  e,0,"Can't open 
12da0 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 72 65  this file for re
12db0 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70  ading.");.    gp
12dc0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
12dd0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
12de0 66 73 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20  fseek(fp,0,2);. 
12df0 20 66 69 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c   filesize = ftel
12e00 6c 28 66 70 29 3b 0a 20 20 72 65 77 69 6e 64 28  l(fp);.  rewind(
12e10 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d  fp);.  filebuf =
12e20 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28   (char *)malloc(
12e30 20 66 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20   filesize+1 );. 
12e40 20 69 66 28 20 66 69 6c 65 62 75 66 3d 3d 30 20   if( filebuf==0 
12e50 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28  ){.    ErrorMsg(
12e60 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43  ps.filename,0,"C
12e70 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 25 64  an't allocate %d
12e80 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f   of memory to ho
12e90 6c 64 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a  ld this file.",.
12ea0 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65 2b 31        filesize+1
12eb0 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72  );.    gp->error
12ec0 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
12ed0 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65  n;.  }.  if( fre
12ee0 61 64 28 66 69 6c 65 62 75 66 2c 31 2c 66 69 6c  ad(filebuf,1,fil
12ef0 65 73 69 7a 65 2c 66 70 29 21 3d 66 69 6c 65 73  esize,fp)!=files
12f00 69 7a 65 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ize ){.    Error
12f10 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
12f20 30 2c 22 43 61 6e 27 74 20 72 65 61 64 20 69 6e  0,"Can't read in
12f30 20 61 6c 6c 20 25 64 20 62 79 74 65 73 20 6f 66   all %d bytes of
12f40 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20   this file.",.  
12f50 20 20 20 20 66 69 6c 65 73 69 7a 65 29 3b 0a 20      filesize);. 
12f60 20 20 20 66 72 65 65 28 66 69 6c 65 62 75 66 29     free(filebuf)
12f70 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63  ;.    gp->errorc
12f80 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
12f90 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  ;.  }.  fclose(f
12fa0 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 5b 66 69  p);.  filebuf[fi
12fb0 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20  lesize] = 0;..  
12fc0 2f 2a 20 4d 61 6b 65 20 61 6e 20 69 6e 69 74 69  /* Make an initi
12fd0 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67 68 20  al pass through 
12fe0 74 68 65 20 66 69 6c 65 20 74 6f 20 68 61 6e 64  the file to hand
12ff0 6c 65 20 25 69 66 64 65 66 20 61 6e 64 20 25 69  le %ifdef and %i
13000 66 6e 64 65 66 20 2a 2f 0a 20 20 70 72 65 70 72  fndef */.  prepr
13010 6f 63 65 73 73 5f 69 6e 70 75 74 28 66 69 6c 65  ocess_input(file
13020 62 75 66 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20  buf);..  /* Now 
13030 73 63 61 6e 20 74 68 65 20 74 65 78 74 20 6f 66  scan the text of
13040 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
13050 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b  */.  lineno = 1;
13060 0a 20 20 66 6f 72 28 63 70 3d 66 69 6c 65 62 75  .  for(cp=filebu
13070 66 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 3b 20  f; (c= *cp)!=0; 
13080 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  ){.    if( c=='\
13090 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 20  n' ) lineno++;  
130a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
130b0 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
130c0 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
130d0 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28      if( isspace(
130e0 63 29 20 29 7b 20 63 70 2b 2b 3b 20 63 6f 6e 74  c) ){ cp++; cont
130f0 69 6e 75 65 3b 20 7d 20 20 2f 2a 20 53 6b 69 70  inue; }  /* Skip
13100 20 61 6c 6c 20 77 68 69 74 65 20 73 70 61 63 65   all white space
13110 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   */.    if( c=='
13120 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27  /' && cp[1]=='/'
13130 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   ){          /* 
13140 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63  Skip C++ style c
13150 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  omments */.     
13160 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68   cp+=2;.      wh
13170 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
13180 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70   && c!='\n' ) cp
13190 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ++;.      contin
131a0 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
131b0 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31  ( c=='/' && cp[1
131c0 5d 3d 3d 27 2a 27 20 29 7b 20 20 20 20 20 20 20  ]=='*' ){       
131d0 20 20 20 2f 2a 20 53 6b 69 70 20 43 20 73 74 79     /* Skip C sty
131e0 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20  le comments */. 
131f0 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20       cp+=2;.    
13200 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70    while( (c= *cp
13210 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f 27 20  )!=0 && (c!='/' 
13220 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a 27 29 20  || cp[-1]!='*') 
13230 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
13240 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
13250 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b 2b 3b  +;.        cp++;
13260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13270 66 28 20 63 20 29 20 63 70 2b 2b 3b 0a 20 20 20  f( c ) cp++;.   
13280 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
13290 20 7d 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 73   }.    ps.tokens
132a0 74 61 72 74 20 3d 20 63 70 3b 20 20 20 20 20 20  tart = cp;      
132b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72            /* Mar
132c0 6b 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  k the beginning 
132d0 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a  of the token */.
132e0 20 20 20 20 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65      ps.tokenline
132f0 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20 20 20 20  no = lineno;    
13300 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75         /* Linenu
13310 6d 62 65 72 20 6f 6e 20 77 68 69 63 68 20 74 6f  mber on which to
13320 6b 65 6e 20 62 65 67 69 6e 73 20 2a 2f 0a 20 20  ken begins */.  
13330 20 20 69 66 28 20 63 3d 3d 27 5c 22 27 20 29 7b    if( c=='\"' ){
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13350 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c       /* String l
13360 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20  iterals */.     
13370 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69   cp++;.      whi
13380 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
13390 26 26 20 63 21 3d 27 5c 22 27 20 29 7b 0a 20 20  && c!='\"' ){.  
133a0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
133b0 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
133c0 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20        cp++;.    
133d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
133e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  =0 ){.        Er
133f0 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
13400 6d 65 2c 73 74 61 72 74 6c 69 6e 65 2c 0a 22 53  me,startline,."S
13410 74 72 69 6e 67 20 73 74 61 72 74 69 6e 67 20 6f  tring starting o
13420 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e  n this line is n
13430 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65  ot terminated be
13440 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20  fore the end of 
13450 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20  the file.");.   
13460 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74       ps.errorcnt
13470 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  ++;.        next
13480 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d  cp = cp;.      }
13490 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65  else{.        ne
134a0 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20  xtcp = cp+1;.   
134b0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
134c0 66 28 20 63 3d 3d 27 7b 27 20 29 7b 20 20 20 20  f( c=='{' ){    
134d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
134e0 62 6c 6f 63 6b 20 6f 66 20 43 20 63 6f 64 65 20  block of C code 
134f0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 76  */.      int lev
13500 65 6c 3b 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a  el;.      cp++;.
13510 20 20 20 20 20 20 66 6f 72 28 6c 65 76 65 6c 3d        for(level=
13520 31 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  1; (c= *cp)!=0 &
13530 26 20 28 6c 65 76 65 6c 3e 31 20 7c 7c 20 63 21  & (level>1 || c!
13540 3d 27 7d 27 29 3b 20 63 70 2b 2b 29 7b 0a 20 20  ='}'); cp++){.  
13550 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
13560 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
13570 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63        else if( c
13580 3d 3d 27 7b 27 20 29 20 6c 65 76 65 6c 2b 2b 3b  =='{' ) level++;
13590 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
135a0 28 20 63 3d 3d 27 7d 27 20 29 20 6c 65 76 65 6c  ( c=='}' ) level
135b0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65  --;.        else
135c0 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63   if( c=='/' && c
135d0 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 2f 2a  p[1]=='*' ){  /*
135e0 20 53 6b 69 70 20 63 6f 6d 6d 65 6e 74 73 20 2a   Skip comments *
135f0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
13600 70 72 65 76 63 3b 0a 20 20 20 20 20 20 20 20 20  prevc;.         
13610 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20   cp = &cp[2];.  
13620 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20          prevc = 
13630 30 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  0;.          whi
13640 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
13650 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 70 72  && (c!='/' || pr
13660 65 76 63 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20  evc!='*') ){.   
13670 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
13680 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
13690 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65  .            pre
136a0 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  vc = c;.        
136b0 20 20 20 20 63 70 2b 2b 3b 0a 09 20 20 7d 0a 09      cp++;..  }..
136c0 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f 27  }else if( c=='/'
136d0 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29   && cp[1]=='/' )
136e0 7b 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73  {  /* Skip C++ s
136f0 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 74 6f  tyle comments to
13700 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63  o */.          c
13710 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20  p = &cp[2];.    
13720 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
13730 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27   *cp)!=0 && c!='
13740 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20  \n' ) cp++;.    
13750 20 20 20 20 20 20 69 66 28 20 63 20 29 20 6c 69        if( c ) li
13760 6e 65 6e 6f 2b 2b 3b 0a 09 7d 65 6c 73 65 20 69  neno++;..}else i
13770 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d  f( c=='\'' || c=
13780 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20 53  ='\"' ){    /* S
13790 74 72 69 6e 67 20 61 20 63 68 61 72 61 63 74 65  tring a characte
137a0 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20  r literals */.  
137b0 20 20 20 20 20 20 20 20 69 6e 74 20 73 74 61 72          int star
137c0 74 63 68 61 72 2c 20 70 72 65 76 63 3b 0a 20 20  tchar, prevc;.  
137d0 20 20 20 20 20 20 20 20 73 74 61 72 74 63 68 61          startcha
137e0 72 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  r = c;.         
137f0 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20   prevc = 0;.    
13800 20 20 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b 20        for(cp++; 
13810 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28  (c= *cp)!=0 && (
13820 63 21 3d 73 74 61 72 74 63 68 61 72 20 7c 7c 20  c!=startchar || 
13830 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63 70  prevc=='\\'); cp
13840 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
13850 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
13860 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
13870 20 20 20 20 20 69 66 28 20 70 72 65 76 63 3d 3d       if( prevc==
13880 27 5c 5c 27 20 29 20 70 72 65 76 63 20 3d 20 30  '\\' ) prevc = 0
13890 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ;.            el
138a0 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
138b0 70 72 65 76 63 20 3d 20 63 3b 0a 09 20 20 7d 0a  prevc = c;..  }.
138c0 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .}.      }.     
138d0 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
138e0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
138f0 2e 66 69 6c 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b  .filename,ps.tok
13900 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64  enlineno,."C cod
13910 65 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68  e starting on th
13920 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74  is line is not t
13930 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65  erminated before
13940 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
13950 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  file.");.       
13960 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a   ps.errorcnt++;.
13970 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d          nextcp =
13980 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   cp;.      }else
13990 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70  {.        nextcp
139a0 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d   = cp+1;.      }
139b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
139c0 73 61 6c 6e 75 6d 28 63 29 20 29 7b 20 20 20 20  salnum(c) ){    
139d0 20 20 20 20 20 20 2f 2a 20 49 64 65 6e 74 69 66        /* Identif
139e0 69 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 77 68  iers */.      wh
139f0 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
13a00 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 63 29 20   && (isalnum(c) 
13a10 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b  || c=='_') ) cp+
13a20 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20  +;.      nextcp 
13a30 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = cp;.    }else 
13a40 69 66 28 20 63 3d 3d 27 3a 27 20 26 26 20 63 70  if( c==':' && cp
13a50 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 63 70 5b 32  [1]==':' && cp[2
13a60 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20 54 68 65  ]=='=' ){ /* The
13a70 20 6f 70 65 72 61 74 6f 72 20 22 3a 3a 3d 22 20   operator "::=" 
13a80 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 33  */.      cp += 3
13a90 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
13aa0 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   cp;.    }else i
13ab0 66 28 20 28 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d  f( (c=='/' || c=
13ac0 3d 27 7c 27 29 20 26 26 20 69 73 61 6c 70 68 61  ='|') && isalpha
13ad0 28 63 70 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20  (cp[1]) ){.     
13ae0 20 63 70 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20   cp += 2;.      
13af0 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 63 70 29  while( (c = *cp)
13b00 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28  !=0 && (isalnum(
13b10 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20  c) || c=='_') ) 
13b20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74  cp++;.      next
13b30 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c  cp = cp;.    }el
13b40 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
13b50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13b60 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20 63  All other (one c
13b70 68 61 72 61 63 74 65 72 29 20 6f 70 65 72 61 74  haracter) operat
13b80 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b  ors */.      cp+
13b90 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20  +;.      nextcp 
13ba0 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = cp;.    }.    
13bb0 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70  c = *cp;.    *cp
13bc0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13be0 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  Null terminate t
13bf0 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  he token */.    
13c00 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26 70  parseonetoken(&p
13c10 73 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  s);             
13c20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 74 6f 6b  /* Parse the tok
13c30 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d 20  en */.    *cp = 
13c40 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
13c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
13c60 74 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20  tore the buffer 
13c70 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65 78 74  */.    cp = next
13c80 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 66  cp;.  }.  free(f
13c90 69 6c 65 62 75 66 29 3b 20 20 20 20 20 20 20 20  ilebuf);        
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
13cb0 65 6c 65 61 73 65 20 74 68 65 20 62 75 66 66 65  elease the buffe
13cc0 72 20 61 66 74 65 72 20 70 61 72 73 69 6e 67 20  r after parsing 
13cd0 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d 20  */.  gp->rule = 
13ce0 70 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20 20  ps.firstrule;.  
13cf0 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20 70  gp->errorcnt = p
13d00 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a  s.errorcnt;.}./*
13d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
13d30 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e  the file "plink.
13d40 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
13d50 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
13d60 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73  Routines process
13d70 69 6e 67 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ing configuratio
13d80 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f  n follow-set pro
13d90 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a  pagation links.*
13da0 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  * in the LEMON p
13db0 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
13dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
13dd0 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66  t plink *plink_f
13de0 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  reelist = 0;../*
13df0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
13e00 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74 20  plink */.struct 
13e10 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77  plink *Plink_new
13e20 28 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  (){.  struct pli
13e30 6e 6b 20 2a 6e 65 77 3b 0a 0a 20 20 69 66 28 20  nk *new;..  if( 
13e40 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d  plink_freelist==
13e50 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
13e60 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30      int amt = 10
13e70 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65  0;.    plink_fre
13e80 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20  elist = (struct 
13e90 70 6c 69 6e 6b 20 2a 29 63 61 6c 6c 6f 63 28 20  plink *)calloc( 
13ea0 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  amt, sizeof(stru
13eb0 63 74 20 70 6c 69 6e 6b 29 20 29 3b 0a 20 20 20  ct plink) );.   
13ec0 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c   if( plink_freel
13ed0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
13ee0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a  fprintf(stderr,.
13ef0 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f        "Unable to
13f00 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
13f10 20 66 6f 72 20 61 20 6e 65 77 20 66 6f 6c 6c 6f   for a new follo
13f20 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f  w-set propagatio
13f30 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20 20 20  n link.\n");.   
13f40 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
13f50 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
13f60 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 70 6c 69  <amt-1; i++) pli
13f70 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e  nk_freelist[i].n
13f80 65 78 74 20 3d 20 26 70 6c 69 6e 6b 5f 66 72 65  ext = &plink_fre
13f90 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20  elist[i+1];.    
13fa0 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 61  plink_freelist[a
13fb0 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a  mt-1].next = 0;.
13fc0 20 20 7d 0a 20 20 6e 65 77 20 3d 20 70 6c 69 6e    }.  new = plin
13fd0 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 70 6c  k_freelist;.  pl
13fe0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70  ink_freelist = p
13ff0 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 2d 3e 6e  link_freelist->n
14000 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65  ext;.  return ne
14010 77 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70  w;.}../* Add a p
14020 6c 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20  link to a plink 
14030 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69  list */.void Pli
14040 6e 6b 5f 61 64 64 28 70 6c 70 70 2c 63 66 70 29  nk_add(plpp,cfp)
14050 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a  .struct plink **
14060 70 6c 70 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e  plpp;.struct con
14070 66 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74  fig *cfp;.{.  st
14080 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 3b  ruct plink *new;
14090 0a 20 20 6e 65 77 20 3d 20 50 6c 69 6e 6b 5f 6e  .  new = Plink_n
140a0 65 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65 78  ew();.  new->nex
140b0 74 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c  t = *plpp;.  *pl
140c0 70 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d  pp = new;.  new-
140d0 3e 63 66 70 20 3d 20 63 66 70 3b 0a 7d 0a 0a 2f  >cfp = cfp;.}../
140e0 2a 20 54 72 61 6e 73 66 65 72 20 65 76 65 72 79  * Transfer every
140f0 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69   plink on the li
14100 73 74 20 22 66 72 6f 6d 22 20 74 6f 20 74 68 65  st "from" to the
14110 20 6c 69 73 74 20 22 74 6f 22 20 2a 2f 0a 76 6f   list "to" */.vo
14120 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 74 6f  id Plink_copy(to
14130 2c 66 72 6f 6d 29 0a 73 74 72 75 63 74 20 70 6c  ,from).struct pl
14140 69 6e 6b 20 2a 2a 74 6f 3b 0a 73 74 72 75 63 74  ink **to;.struct
14150 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d 3b 0a 7b 0a   plink *from;.{.
14160 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
14170 6e 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28  nextpl;.  while(
14180 20 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78   from ){.    nex
14190 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74  tpl = from->next
141a0 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74  ;.    from->next
141b0 20 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20   = *to;.    *to 
141c0 3d 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d  = from;.    from
141d0 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d   = nextpl;.  }.}
141e0 0a 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72  ../* Delete ever
141f0 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c  y plink on the l
14200 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  ist */.void Plin
14210 6b 5f 64 65 6c 65 74 65 28 70 6c 70 29 0a 73 74  k_delete(plp).st
14220 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b  ruct plink *plp;
14230 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  .{.  struct plin
14240 6b 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20 77 68  k *nextpl;..  wh
14250 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20  ile( plp ){.    
14260 6e 65 78 74 70 6c 20 3d 20 70 6c 70 2d 3e 6e 65  nextpl = plp->ne
14270 78 74 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e 65 78  xt;.    plp->nex
14280 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  t = plink_freeli
14290 73 74 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72  st;.    plink_fr
142a0 65 65 6c 69 73 74 20 3d 20 70 6c 70 3b 0a 20 20  eelist = plp;.  
142b0 20 20 70 6c 70 20 3d 20 6e 65 78 74 70 6c 3b 0a    plp = nextpl;.
142c0 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a    }.}./*********
142d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
142e0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65  rom the file "re
142f0 70 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  port.c" ********
14300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14310 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 64  **/./*.** Proced
14320 75 72 65 73 20 66 6f 72 20 67 65 6e 65 72 61 74  ures for generat
14330 69 6e 67 20 72 65 70 6f 72 74 73 20 61 6e 64 20  ing reports and 
14340 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45  tables in the LE
14350 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
14360 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e  ator..*/../* Gen
14370 65 72 61 74 65 20 61 20 66 69 6c 65 6e 61 6d 65  erate a filename
14380 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
14390 73 75 66 66 69 78 2e 20 20 53 70 61 63 65 20 74  suffix.  Space t
143a0 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 6e 61  o hold the.** na
143b0 6d 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20 6d 61  me comes from ma
143c0 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
143d0 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
143e0 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
143f0 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ion..*/.PRIVATE 
14400 63 68 61 72 20 2a 66 69 6c 65 5f 6d 61 6b 65 6e  char *file_maken
14410 61 6d 65 28 6c 65 6d 70 2c 73 75 66 66 69 78 29  ame(lemp,suffix)
14420 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
14430 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66 66 69  emp;.char *suffi
14440 78 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d  x;.{.  char *nam
14450 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a  e;.  char *cp;..
14460 20 20 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28    name = malloc(
14470 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69   strlen(lemp->fi
14480 6c 65 6e 61 6d 65 29 20 2b 20 73 74 72 6c 65 6e  lename) + strlen
14490 28 73 75 66 66 69 78 29 20 2b 20 35 20 29 3b 0a  (suffix) + 5 );.
144a0 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29 7b    if( name==0 ){
144b0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
144c0 65 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63  err,"Can't alloc
144d0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20  ate space for a 
144e0 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20  filename.\n");. 
144f0 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
14500 20 20 73 74 72 63 70 79 28 6e 61 6d 65 2c 6c 65    strcpy(name,le
14510 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
14520 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 6e 61   cp = strrchr(na
14530 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63  me,'.');.  if( c
14540 70 20 29 20 2a 63 70 20 3d 20 30 3b 0a 20 20 73  p ) *cp = 0;.  s
14550 74 72 63 61 74 28 6e 61 6d 65 2c 73 75 66 66 69  trcat(name,suffi
14560 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d  x);.  return nam
14570 65 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20  e;.}../* Open a 
14580 66 69 6c 65 20 77 69 74 68 20 61 20 6e 61 6d 65  file with a name
14590 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6e 61   based on the na
145a0 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  me of the input 
145b0 66 69 6c 65 2c 0a 2a 2a 20 62 75 74 20 77 69 74  file,.** but wit
145c0 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 28 73  h a different (s
145d0 70 65 63 69 66 69 65 64 29 20 73 75 66 66 69 78  pecified) suffix
145e0 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  , and return a p
145f0 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
14600 20 73 74 72 65 61 6d 20 2a 2f 0a 50 52 49 56 41   stream */.PRIVA
14610 54 45 20 46 49 4c 45 20 2a 66 69 6c 65 5f 6f 70  TE FILE *file_op
14620 65 6e 28 6c 65 6d 70 2c 73 75 66 66 69 78 2c 6d  en(lemp,suffix,m
14630 6f 64 65 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  ode).struct lemo
14640 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73  n *lemp;.char *s
14650 75 66 66 69 78 3b 0a 63 68 61 72 20 2a 6d 6f 64  uffix;.char *mod
14660 65 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b  e;.{.  FILE *fp;
14670 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75  ..  if( lemp->ou
14680 74 6e 61 6d 65 20 29 20 66 72 65 65 28 6c 65 6d  tname ) free(lem
14690 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c  p->outname);.  l
146a0 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66  emp->outname = f
146b0 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d  ile_makename(lem
146c0 70 2c 20 73 75 66 66 69 78 29 3b 0a 20 20 66 70  p, suffix);.  fp
146d0 20 3d 20 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f   = fopen(lemp->o
146e0 75 74 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20  utname,mode);.  
146f0 69 66 28 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f  if( fp==0 && *mo
14700 64 65 3d 3d 27 77 27 20 29 7b 0a 20 20 20 20 66  de=='w' ){.    f
14710 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43  printf(stderr,"C
14720 61 6e 27 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c  an't open file \
14730 22 25 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e  "%s\".\n",lemp->
14740 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65  outname);.    le
14750 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
14760 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
14770 7d 0a 20 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d  }.  return fp;.}
14780 0a 0a 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74  ../* Duplicate t
14790 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 77 69  he input file wi
147a0 74 68 6f 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61  thout comments a
147b0 6e 64 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f  nd without actio
147c0 6e 73 20 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20  ns .** on rules 
147d0 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28  */.void Reprint(
147e0 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
147f0 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74  on *lemp;.{.  st
14800 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
14810 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
14820 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  sp;.  int i, j, 
14830 6d 61 78 6c 65 6e 2c 20 6c 65 6e 2c 20 6e 63 6f  maxlen, len, nco
14840 6c 75 6d 6e 73 2c 20 73 6b 69 70 3b 0a 20 20 70  lumns, skip;.  p
14850 72 69 6e 74 66 28 22 2f 2f 20 52 65 70 72 69 6e  rintf("// Reprin
14860 74 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20  t of input file 
14870 5c 22 25 73 5c 22 2e 5c 6e 2f 2f 20 53 79 6d 62  \"%s\".\n// Symb
14880 6f 6c 73 3a 5c 6e 22 2c 6c 65 6d 70 2d 3e 66 69  ols:\n",lemp->fi
14890 6c 65 6e 61 6d 65 29 3b 0a 20 20 6d 61 78 6c 65  lename);.  maxle
148a0 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28 69 3d  n = 10;.  for(i=
148b0 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
148c0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70  ol; i++){.    sp
148d0 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
148e0 5b 69 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  [i];.    len = s
148f0 74 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b  trlen(sp->name);
14900 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78  .    if( len>max
14910 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c  len ) maxlen = l
14920 65 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d  en;.  }.  ncolum
14930 6e 73 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b  ns = 76/(maxlen+
14940 35 29 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d  5);.  if( ncolum
14950 6e 73 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20  ns<1 ) ncolumns 
14960 3d 20 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c  = 1;.  skip = (l
14970 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e  emp->nsymbol + n
14980 63 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f  columns - 1)/nco
14990 6c 75 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30  lumns;.  for(i=0
149a0 3b 20 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a  ; i<skip; i++){.
149b0 20 20 20 20 70 72 69 6e 74 66 28 22 2f 2f 22 29      printf("//")
149c0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a  ;.    for(j=i; j
149d0 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
149e0 6a 2b 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20 20  j+=skip){.      
149f0 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
14a00 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73  ls[j];.      ass
14a10 65 72 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d  ert( sp->index==
14a20 6a 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74  j );.      print
14a30 66 28 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c  f(" %3d %-*.*s",
14a40 6a 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c  j,maxlen,maxlen,
14a50 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  sp->name);.    }
14a60 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22  .    printf("\n"
14a70 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d  );.  }.  for(rp=
14a80 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
14a90 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
14aa0 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c 72 70    printf("%s",rp
14ab0 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ->lhs->name);.  
14ac0 20 20 2f 2a 20 20 20 20 69 66 28 20 72 70 2d 3e    /*    if( rp->
14ad0 6c 68 73 61 6c 69 61 73 20 29 20 70 72 69 6e 74  lhsalias ) print
14ae0 66 28 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68 73  f("(%s)",rp->lhs
14af0 61 6c 69 61 73 29 3b 20 2a 2f 0a 20 20 20 20 70  alias); */.    p
14b00 72 69 6e 74 66 28 22 20 3a 3a 3d 22 29 3b 0a 20  rintf(" ::=");. 
14b10 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
14b20 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
14b30 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73      sp = rp->rhs
14b40 5b 69 5d 3b 0a 20 20 20 20 20 20 70 72 69 6e 74  [i];.      print
14b50 66 28 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d  f(" %s", sp->nam
14b60 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70  e);.      if( sp
14b70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
14b80 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
14b90 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e   for(j=1; j<sp->
14ba0 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20  nsubsym; j++){. 
14bb0 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28           printf(
14bc0 22 7c 25 73 22 2c 20 73 70 2d 3e 73 75 62 73 79  "|%s", sp->subsy
14bd0 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  m[j]->name);.   
14be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14bf0 20 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d 3e       /* if( rp->
14c00 72 68 73 61 6c 69 61 73 5b 69 5d 20 29 20 70 72  rhsalias[i] ) pr
14c10 69 6e 74 66 28 22 28 25 73 29 22 2c 72 70 2d 3e  intf("(%s)",rp->
14c20 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f  rhsalias[i]); */
14c30 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74  .    }.    print
14c40 66 28 22 2e 22 29 3b 0a 20 20 20 20 69 66 28 20  f(".");.    if( 
14c50 72 70 2d 3e 70 72 65 63 73 79 6d 20 29 20 70 72  rp->precsym ) pr
14c60 69 6e 74 66 28 22 20 5b 25 73 5d 22 2c 72 70 2d  intf(" [%s]",rp-
14c70 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b  >precsym->name);
14c80 0a 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d 3e  .    /* if( rp->
14c90 63 6f 64 65 20 29 20 70 72 69 6e 74 66 28 22 5c  code ) printf("\
14ca0 6e 20 20 20 20 25 73 22 2c 72 70 2d 3e 63 6f 64  n    %s",rp->cod
14cb0 65 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74  e); */.    print
14cc0 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  f("\n");.  }.}..
14cd0 76 6f 69 64 20 43 6f 6e 66 69 67 50 72 69 6e 74  void ConfigPrint
14ce0 28 66 70 2c 63 66 70 29 0a 46 49 4c 45 20 2a 66  (fp,cfp).FILE *f
14cf0 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  p;.struct config
14d00 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75 63   *cfp;.{.  struc
14d10 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74  t rule *rp;.  st
14d20 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
14d30 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 72  .  int i, j;.  r
14d40 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 66  p = cfp->rp;.  f
14d50 70 72 69 6e 74 66 28 66 70 2c 22 25 73 20 3a 3a  printf(fp,"%s ::
14d60 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65  =",rp->lhs->name
14d70 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
14d80 3d 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  =rp->nrhs; i++){
14d90 0a 20 20 20 20 69 66 28 20 69 3d 3d 63 66 70 2d  .    if( i==cfp-
14da0 3e 64 6f 74 20 29 20 66 70 72 69 6e 74 66 28 66  >dot ) fprintf(f
14db0 70 2c 22 20 2a 22 29 3b 0a 20 20 20 20 69 66 28  p," *");.    if(
14dc0 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 62   i==rp->nrhs ) b
14dd0 72 65 61 6b 3b 0a 20 20 20 20 73 70 20 3d 20 72  reak;.    sp = r
14de0 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 66  p->rhs[i];.    f
14df0 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73 22 2c  printf(fp," %s",
14e00 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
14e10 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55  if( sp->type==MU
14e20 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
14e30 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c       for(j=1; j<
14e40 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b  sp->nsubsym; j++
14e50 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
14e60 74 66 28 66 70 2c 22 7c 25 73 22 2c 73 70 2d 3e  tf(fp,"|%s",sp->
14e70 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29  subsym[j]->name)
14e80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14e90 20 20 7d 0a 7d 0a 0a 2f 2a 20 23 64 65 66 69 6e    }.}../* #defin
14ea0 65 20 54 45 53 54 20 2a 2f 0a 23 69 66 20 30 0a  e TEST */.#if 0.
14eb0 2f 2a 20 50 72 69 6e 74 20 61 20 73 65 74 20 2a  /* Print a set *
14ec0 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 53  /.PRIVATE void S
14ed0 65 74 50 72 69 6e 74 28 6f 75 74 2c 73 65 74 2c  etPrint(out,set,
14ee0 6c 65 6d 70 29 0a 46 49 4c 45 20 2a 6f 75 74 3b  lemp).FILE *out;
14ef0 0a 63 68 61 72 20 2a 73 65 74 3b 0a 73 74 72 75  .char *set;.stru
14f00 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
14f10 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  {.  int i;.  cha
14f20 72 20 2a 73 70 61 63 65 72 3b 0a 20 20 73 70 61  r *spacer;.  spa
14f30 63 65 72 20 3d 20 22 22 3b 0a 20 20 66 70 72 69  cer = "";.  fpri
14f40 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 5b 22 2c  ntf(out,"%12s[",
14f50 22 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  "");.  for(i=0; 
14f60 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  i<lemp->ntermina
14f70 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
14f80 20 53 65 74 46 69 6e 64 28 73 65 74 2c 69 29 20   SetFind(set,i) 
14f90 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
14fa0 28 6f 75 74 2c 22 25 73 25 73 22 2c 73 70 61 63  (out,"%s%s",spac
14fb0 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  er,lemp->symbols
14fc0 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [i]->name);.    
14fd0 20 20 73 70 61 63 65 72 20 3d 20 22 20 22 3b 0a    spacer = " ";.
14fe0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69      }.  }.  fpri
14ff0 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b 0a  ntf(out,"]\n");.
15000 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 70 6c  }../* Print a pl
15010 69 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a 50 52 49  ink chain */.PRI
15020 56 41 54 45 20 76 6f 69 64 20 50 6c 69 6e 6b 50  VATE void PlinkP
15030 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2c 74 61 67  rint(out,plp,tag
15040 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72  ).FILE *out;.str
15050 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a  uct plink *plp;.
15060 63 68 61 72 20 2a 74 61 67 3b 0a 7b 0a 20 20 77  char *tag;.{.  w
15070 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20  hile( plp ){.   
15080 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31   fprintf(out,"%1
15090 32 73 25 73 20 28 73 74 61 74 65 20 25 32 64 29  2s%s (state %2d)
150a0 20 22 2c 22 22 2c 74 61 67 2c 70 6c 70 2d 3e 63   ","",tag,plp->c
150b0 66 70 2d 3e 73 74 70 2d 3e 73 74 61 74 65 6e 75  fp->stp->statenu
150c0 6d 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 50 72  m);.    ConfigPr
150d0 69 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e 63 66 70  int(out,plp->cfp
150e0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
150f0 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 70 6c  ut,"\n");.    pl
15100 70 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20  p = plp->next;. 
15110 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20   }.}.#endif../* 
15120 50 72 69 6e 74 20 61 6e 20 61 63 74 69 6f 6e 20  Print an action 
15130 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
15140 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
15150 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 2a  eturn FALSE if.*
15160 2a 20 6e 6f 74 68 69 6e 67 20 77 61 73 20 61 63  * nothing was ac
15170 74 75 61 6c 6c 79 20 70 72 69 6e 74 65 64 2e 0a  tually printed..
15180 2a 2f 0a 69 6e 74 20 50 72 69 6e 74 41 63 74 69  */.int PrintActi
15190 6f 6e 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  on(struct action
151a0 20 2a 61 70 2c 20 46 49 4c 45 20 2a 66 70 2c 20   *ap, FILE *fp, 
151b0 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 69  int indent){.  i
151c0 6e 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20  nt result = 1;. 
151d0 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70   switch( ap->typ
151e0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48  e ){.    case SH
151f0 49 46 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e  IFT:.      fprin
15200 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74  tf(fp,"%*s shift
15210 20 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d    %d",indent,ap-
15220 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e  >sp->name,ap->x.
15230 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a  stp->statenum);.
15240 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15250 20 63 61 73 65 20 52 45 44 55 43 45 3a 0a 20 20   case REDUCE:.  
15260 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
15270 25 2a 73 20 72 65 64 75 63 65 20 25 64 22 2c 69  %*s reduce %d",i
15280 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61  ndent,ap->sp->na
15290 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64  me,ap->x.rp->ind
152a0 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
152b0 3b 0a 20 20 20 20 63 61 73 65 20 41 43 43 45 50  ;.    case ACCEP
152c0 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  T:.      fprintf
152d0 28 66 70 2c 22 25 2a 73 20 61 63 63 65 70 74 22  (fp,"%*s accept"
152e0 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e  ,indent,ap->sp->
152f0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  name);.      bre
15300 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52 52  ak;.    case ERR
15310 4f 52 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74  OR:.      fprint
15320 66 28 66 70 2c 22 25 2a 73 20 65 72 72 6f 72 22  f(fp,"%*s error"
15330 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e  ,indent,ap->sp->
15340 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  name);.      bre
15350 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 52 43  ak;.    case SRC
15360 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 63 61 73  ONFLICT:.    cas
15370 65 20 52 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20  e RRCONFLICT:.  
15380 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
15390 25 2a 73 20 72 65 64 75 63 65 20 25 2d 33 64 20  %*s reduce %-3d 
153a0 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c  ** Parsing confl
153b0 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20  ict **",.       
153c0 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e   indent,ap->sp->
153d0 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69  name,ap->x.rp->i
153e0 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  ndex);.      bre
153f0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 43  ak;.    case SSC
15400 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20 66  ONFLICT:.      f
15410 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73  printf(fp,"%*s s
15420 68 69 66 74 20 20 25 64 20 2a 2a 20 50 61 72 73  hift  %d ** Pars
15430 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a 22  ing conflict **"
15440 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 64 65 6e  , .        inden
15450 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61  t,ap->sp->name,a
15460 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e  p->x.stp->staten
15470 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  um);.      break
15480 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52 45  ;.    case SH_RE
15490 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61 73 65  SOLVED:.    case
154a0 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20   RD_RESOLVED:.  
154b0 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44 3a    case NOT_USED:
154c0 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20  .      result = 
154d0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
154e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
154f0 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72  ult;.}../* Gener
15500 61 74 65 20 74 68 65 20 22 79 2e 6f 75 74 70 75  ate the "y.outpu
15510 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76  t" log file */.v
15520 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74  oid ReportOutput
15530 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65  (lemp).struct le
15540 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69  mon *lemp;.{.  i
15550 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
15560 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72  tate *stp;.  str
15570 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
15580 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
15590 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a 66 70   *ap;.  FILE *fp
155a0 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f 6f  ;..  fp = file_o
155b0 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22 2c  pen(lemp,".out",
155c0 22 77 62 22 29 3b 0a 20 20 69 66 28 20 66 70 3d  "wb");.  if( fp=
155d0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
155e0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
155f0 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
15600 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
15610 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 70 72  rted[i];.    fpr
15620 69 6e 74 66 28 66 70 2c 22 53 74 61 74 65 20 25  intf(fp,"State %
15630 64 3a 5c 6e 22 2c 73 74 70 2d 3e 73 74 61 74 65  d:\n",stp->state
15640 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 6c 65  num);.    if( le
15650 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29 20  mp->basisflag ) 
15660 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20 20  cfp=stp->bp;.   
15670 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20   else           
15680 20 20 20 20 20 20 20 63 66 70 3d 73 74 70 2d 3e         cfp=stp->
15690 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  cfp;.    while( 
156a0 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63 68 61  cfp ){.      cha
156b0 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20 20  r buf[20];.     
156c0 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d 63   if( cfp->dot==c
156d0 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b 0a  fp->rp->nrhs ){.
156e0 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
156f0 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d 3e  buf,"(%d)",cfp->
15700 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  rp->index);.    
15710 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
15720 20 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b 0a      %5s ",buf);.
15730 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15740 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
15750 22 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a 20  "          ");. 
15760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f 6e       }.      Con
15770 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70 29  figPrint(fp,cfp)
15780 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
15790 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 20 30 0a  fp,"\n");.#if 0.
157a0 20 20 20 20 20 20 53 65 74 50 72 69 6e 74 28 66        SetPrint(f
157b0 70 2c 63 66 70 2d 3e 66 77 73 2c 6c 65 6d 70 29  p,cfp->fws,lemp)
157c0 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69  ;.      PlinkPri
157d0 6e 74 28 66 70 2c 63 66 70 2d 3e 66 70 6c 70 2c  nt(fp,cfp->fplp,
157e0 22 54 6f 20 20 22 29 3b 0a 20 20 20 20 20 20 50  "To  ");.      P
157f0 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70  linkPrint(fp,cfp
15800 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d 22 29 3b 0a  ->bplp,"From");.
15810 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
15820 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67   lemp->basisflag
15830 20 29 20 63 66 70 3d 63 66 70 2d 3e 62 70 3b 0a   ) cfp=cfp->bp;.
15840 20 20 20 20 20 20 65 6c 73 65 20 20 20 20 20 20        else      
15850 20 20 20 20 20 20 20 20 20 20 20 20 63 66 70 3d              cfp=
15860 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d  cfp->next;.    }
15870 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
15880 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 61  "\n");.    for(a
15890 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
158a0 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
158b0 20 20 20 69 66 28 20 50 72 69 6e 74 41 63 74 69     if( PrintActi
158c0 6f 6e 28 61 70 2c 66 70 2c 33 30 29 20 29 20 66  on(ap,fp,30) ) f
158d0 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b  printf(fp,"\n");
158e0 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
158f0 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d  tf(fp,"\n");.  }
15900 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22  .  fprintf(fp, "
15910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15940 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 66 70 72 69  ----\n");.  fpri
15950 6e 74 66 28 66 70 2c 20 22 53 79 6d 62 6f 6c 73  ntf(fp, "Symbols
15960 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  :\n");.  for(i=0
15970 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
15980 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  l; i++){.    int
15990 20 6a 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   j;.    struct s
159a0 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 20 20  ymbol *sp;..    
159b0 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
159c0 6c 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e  ls[i];.    fprin
159d0 74 66 28 66 70 2c 20 22 20 20 25 33 64 3a 20 25  tf(fp, "  %3d: %
159e0 73 22 2c 20 69 2c 20 73 70 2d 3e 6e 61 6d 65 29  s", i, sp->name)
159f0 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  ;.    if( sp->ty
15a00 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe==NONTERMINAL 
15a10 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
15a20 28 66 70 2c 20 22 3a 22 29 3b 0a 20 20 20 20 20  (fp, ":");.     
15a30 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61 20   if( sp->lambda 
15a40 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
15a50 74 66 28 66 70 2c 20 22 20 3c 6c 61 6d 62 64 61  tf(fp, " <lambda
15a60 3e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >");.      }.   
15a70 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65     for(j=0; j<le
15a80 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a  mp->nterminal; j
15a90 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
15aa0 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20 26 26   sp->firstset &&
15ab0 20 53 65 74 46 69 6e 64 28 73 70 2d 3e 66 69 72   SetFind(sp->fir
15ac0 73 74 73 65 74 2c 20 6a 29 20 29 7b 0a 20 20 20  stset, j) ){.   
15ad0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
15ae0 70 2c 20 22 20 25 73 22 2c 20 6c 65 6d 70 2d 3e  p, " %s", lemp->
15af0 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61 6d 65  symbols[j]->name
15b00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15b10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
15b20 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 6e 22 29  printf(fp, "\n")
15b30 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  ;.  }.  fclose(f
15b40 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  p);.  return;.}.
15b50 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74  ./* Search for t
15b60 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22 20 77  he file "name" w
15b70 68 69 63 68 20 69 73 20 69 6e 20 74 68 65 20 73  hich is in the s
15b80 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
15b90 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74 61 62  .** the exacutab
15ba0 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 63 68  le */.PRIVATE ch
15bb0 61 72 20 2a 70 61 74 68 73 65 61 72 63 68 28 61  ar *pathsearch(a
15bc0 72 67 76 30 2c 6e 61 6d 65 2c 6d 6f 64 65 6d 61  rgv0,name,modema
15bd0 73 6b 29 0a 63 68 61 72 20 2a 61 72 67 76 30 3b  sk).char *argv0;
15be0 0a 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 69 6e 74  .char *name;.int
15bf0 20 6d 6f 64 65 6d 61 73 6b 3b 0a 7b 0a 20 20 63   modemask;.{.  c
15c00 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b 0a 20  har *pathlist;. 
15c10 20 63 68 61 72 20 2a 70 61 74 68 2c 2a 63 70 3b   char *path,*cp;
15c20 0a 20 20 63 68 61 72 20 63 3b 0a 0a 23 69 66 64  .  char c;..#ifd
15c30 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20 63  ef __WIN32__.  c
15c40 70 20 3d 20 73 74 72 72 63 68 72 28 61 72 67 76  p = strrchr(argv
15c50 30 2c 27 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a 20  0,'\\');.#else. 
15c60 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 61 72   cp = strrchr(ar
15c70 67 76 30 2c 27 2f 27 29 3b 0a 23 65 6e 64 69 66  gv0,'/');.#endif
15c80 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20  .  if( cp ){.   
15c90 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63   c = *cp;.    *c
15ca0 70 20 3d 20 30 3b 0a 20 20 20 20 70 61 74 68 20  p = 0;.    path 
15cb0 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63  = (char *)malloc
15cc0 28 20 73 74 72 6c 65 6e 28 61 72 67 76 30 29 20  ( strlen(argv0) 
15cd0 2b 20 73 74 72 6c 65 6e 28 6e 61 6d 65 29 20 2b  + strlen(name) +
15ce0 20 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61   2 );.    if( pa
15cf0 74 68 20 29 20 73 70 72 69 6e 74 66 28 70 61 74  th ) sprintf(pat
15d00 68 2c 22 25 73 2f 25 73 22 2c 61 72 67 76 30 2c  h,"%s/%s",argv0,
15d10 6e 61 6d 65 29 3b 0a 20 20 20 20 2a 63 70 20 3d  name);.    *cp =
15d20 20 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   c;.  }else{.   
15d30 20 65 78 74 65 72 6e 20 63 68 61 72 20 2a 67 65   extern char *ge
15d40 74 65 6e 76 28 29 3b 0a 20 20 20 20 70 61 74 68  tenv();.    path
15d50 6c 69 73 74 20 3d 20 67 65 74 65 6e 76 28 22 50  list = getenv("P
15d60 41 54 48 22 29 3b 0a 20 20 20 20 69 66 28 20 70  ATH");.    if( p
15d70 61 74 68 6c 69 73 74 3d 3d 30 20 29 20 70 61 74  athlist==0 ) pat
15d80 68 6c 69 73 74 20 3d 20 22 2e 3a 2f 62 69 6e 3a  hlist = ".:/bin:
15d90 2f 75 73 72 2f 62 69 6e 22 3b 0a 20 20 20 20 70  /usr/bin";.    p
15da0 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61  ath = (char *)ma
15db0 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 70 61 74  lloc( strlen(pat
15dc0 68 6c 69 73 74 29 2b 73 74 72 6c 65 6e 28 6e 61  hlist)+strlen(na
15dd0 6d 65 29 2b 32 20 29 3b 0a 20 20 20 20 69 66 28  me)+2 );.    if(
15de0 20 70 61 74 68 21 3d 30 20 29 7b 0a 20 20 20 20   path!=0 ){.    
15df0 20 20 77 68 69 6c 65 28 20 2a 70 61 74 68 6c 69    while( *pathli
15e00 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 63 70  st ){.        cp
15e10 20 3d 20 73 74 72 63 68 72 28 70 61 74 68 6c 69   = strchr(pathli
15e20 73 74 2c 27 3a 27 29 3b 0a 20 20 20 20 20 20 20  st,':');.       
15e30 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20   if( cp==0 ) cp 
15e40 3d 20 26 70 61 74 68 6c 69 73 74 5b 73 74 72 6c  = &pathlist[strl
15e50 65 6e 28 70 61 74 68 6c 69 73 74 29 5d 3b 0a 20  en(pathlist)];. 
15e60 20 20 20 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a         c = *cp;.
15e70 20 20 20 20 20 20 20 20 2a 63 70 20 3d 20 30 3b          *cp = 0;
15e80 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
15e90 28 70 61 74 68 2c 22 25 73 2f 25 73 22 2c 70 61  (path,"%s/%s",pa
15ea0 74 68 6c 69 73 74 2c 6e 61 6d 65 29 3b 0a 20 20  thlist,name);.  
15eb0 20 20 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20        *cp = c;. 
15ec0 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20         if( c==0 
15ed0 29 20 70 61 74 68 6c 69 73 74 20 3d 20 22 22 3b  ) pathlist = "";
15ee0 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 70 61  .        else pa
15ef0 74 68 6c 69 73 74 20 3d 20 26 63 70 5b 31 5d 3b  thlist = &cp[1];
15f00 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63 63  .        if( acc
15f10 65 73 73 28 70 61 74 68 2c 6d 6f 64 65 6d 61 73  ess(path,modemas
15f20 6b 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  k)==0 ) break;. 
15f30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15f40 0a 20 20 72 65 74 75 72 6e 20 70 61 74 68 3b 0a  .  return path;.
15f50 7d 0a 0a 2f 2a 20 47 69 76 65 6e 20 61 6e 20 61  }../* Given an a
15f60 63 74 69 6f 6e 2c 20 63 6f 6d 70 75 74 65 20 74  ction, compute t
15f70 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
15f80 20 66 6f 72 20 74 68 61 74 20 61 63 74 69 6f 6e   for that action
15f90 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 74 6f 20  .** which is to 
15fa0 62 65 20 70 75 74 20 69 6e 20 74 68 65 20 61 63  be put in the ac
15fb0 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68  tion table of th
15fc0 65 20 67 65 6e 65 72 61 74 65 64 20 6d 61 63 68  e generated mach
15fd0 69 6e 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ine..** Return n
15fe0 65 67 61 74 69 76 65 20 69 66 20 6e 6f 20 61 63  egative if no ac
15ff0 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 67  tion should be g
16000 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 50 52 49  enerated..*/.PRI
16010 56 41 54 45 20 69 6e 74 20 63 6f 6d 70 75 74 65  VATE int compute
16020 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29  _action(lemp,ap)
16030 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
16040 65 6d 70 3b 0a 73 74 72 75 63 74 20 61 63 74 69  emp;.struct acti
16050 6f 6e 20 2a 61 70 3b 0a 7b 0a 20 20 69 6e 74 20  on *ap;.{.  int 
16060 61 63 74 3b 0a 20 20 73 77 69 74 63 68 28 20 61  act;.  switch( a
16070 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20 20 63  p->type ){.    c
16080 61 73 65 20 53 48 49 46 54 3a 20 20 61 63 74 20  ase SHIFT:  act 
16090 3d 20 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61  = ap->x.stp->sta
160a0 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  tenum;          
160b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
160c0 65 20 52 45 44 55 43 45 3a 20 61 63 74 20 3d 20  e REDUCE: act = 
160d0 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20  ap->x.rp->index 
160e0 2b 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  + lemp->nstate; 
160f0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
16100 45 52 52 4f 52 3a 20 20 61 63 74 20 3d 20 6c 65  ERROR:  act = le
16110 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d  mp->nstate + lem
16120 70 2d 3e 6e 72 75 6c 65 3b 20 20 20 20 20 62 72  p->nrule;     br
16130 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 43  eak;.    case AC
16140 43 45 50 54 3a 20 61 63 74 20 3d 20 6c 65 6d 70  CEPT: act = lemp
16150 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d  ->nstate + lemp-
16160 3e 6e 72 75 6c 65 20 2b 20 31 3b 20 62 72 65 61  >nrule + 1; brea
16170 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
16180 20 20 20 20 61 63 74 20 3d 20 2d 31 3b 20 62 72      act = -1; br
16190 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
161a0 6e 20 61 63 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e  n act;.}..#defin
161b0 65 20 4c 49 4e 45 53 49 5a 45 20 31 30 30 30 0a  e LINESIZE 1000.
161c0 2f 2a 20 54 68 65 20 6e 65 78 74 20 63 6c 75 73  /* The next clus
161d0 74 65 72 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  ter of routines 
161e0 61 72 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  are for reading 
161f0 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  the template fil
16200 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 69 6e 67  e.** and writing
16210 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
16220 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 70 61  the generated pa
16230 72 73 65 72 20 2a 2f 0a 2f 2a 20 54 68 65 20 66  rser */./* The f
16240 69 72 73 74 20 66 75 6e 63 74 69 6f 6e 20 74 72  irst function tr
16250 61 6e 73 66 65 72 73 20 64 61 74 61 20 66 72 6f  ansfers data fro
16260 6d 20 22 69 6e 22 20 74 6f 20 22 6f 75 74 22 20  m "in" to "out" 
16270 75 6e 74 69 6c 0a 2a 2a 20 61 20 6c 69 6e 65 20  until.** a line 
16280 69 73 20 73 65 65 6e 20 77 68 69 63 68 20 62 65  is seen which be
16290 67 69 6e 73 20 77 69 74 68 20 22 25 25 22 2e 20  gins with "%%". 
162a0 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72   The line number
162b0 20 69 73 0a 2a 2a 20 74 72 61 63 6b 65 64 2e 0a   is.** tracked..
162c0 2a 2a 0a 2a 2a 20 69 66 20 6e 61 6d 65 21 3d 30  **.** if name!=0
162d0 2c 20 74 68 65 6e 20 61 6e 79 20 77 6f 72 64 20  , then any word 
162e0 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
162f0 22 50 61 72 73 65 22 20 69 73 20 63 68 61 6e 67  "Parse" is chang
16300 65 64 20 74 6f 0a 2a 2a 20 62 65 67 69 6e 20 77  ed to.** begin w
16310 69 74 68 20 2a 6e 61 6d 65 20 69 6e 73 74 65 61  ith *name instea
16320 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  d..*/.PRIVATE vo
16330 69 64 20 74 70 6c 74 5f 78 66 65 72 28 6e 61 6d  id tplt_xfer(nam
16340 65 2c 69 6e 2c 6f 75 74 2c 6c 69 6e 65 6e 6f 29  e,in,out,lineno)
16350 0a 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 46 49 4c  .char *name;.FIL
16360 45 20 2a 69 6e 3b 0a 46 49 4c 45 20 2a 6f 75 74  E *in;.FILE *out
16370 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b  ;.int *lineno;.{
16380 0a 20 20 69 6e 74 20 69 2c 20 69 53 74 61 72 74  .  int i, iStart
16390 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49  ;.  char line[LI
163a0 4e 45 53 49 5a 45 5d 3b 0a 20 20 77 68 69 6c 65  NESIZE];.  while
163b0 28 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e  ( fgets(line,LIN
163c0 45 53 49 5a 45 2c 69 6e 29 20 26 26 20 28 6c 69  ESIZE,in) && (li
163d0 6e 65 5b 30 5d 21 3d 27 25 27 20 7c 7c 20 6c 69  ne[0]!='%' || li
163e0 6e 65 5b 31 5d 21 3d 27 25 27 29 20 29 7b 0a 20  ne[1]!='%') ){. 
163f0 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a     (*lineno)++;.
16400 20 20 20 20 69 53 74 61 72 74 20 3d 20 30 3b 0a      iStart = 0;.
16410 20 20 20 20 69 66 28 20 6e 61 6d 65 20 29 7b 0a      if( name ){.
16420 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6c        for(i=0; l
16430 69 6e 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ine[i]; i++){.  
16440 20 20 20 20 20 20 69 66 28 20 6c 69 6e 65 5b 69        if( line[i
16450 5d 3d 3d 27 50 27 20 26 26 20 73 74 72 6e 63 6d  ]=='P' && strncm
16460 70 28 26 6c 69 6e 65 5b 69 5d 2c 22 50 61 72 73  p(&line[i],"Pars
16470 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20 20 20 20  e",5)==0.       
16480 20 20 20 26 26 20 28 69 3d 3d 30 20 7c 7c 20 21     && (i==0 || !
16490 69 73 61 6c 70 68 61 28 6c 69 6e 65 5b 69 2d 31  isalpha(line[i-1
164a0 5d 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ])).        ){. 
164b0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 69           if( i>i
164c0 53 74 61 72 74 20 29 20 66 70 72 69 6e 74 66 28  Start ) fprintf(
164d0 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2d 69 53 74  out,"%.*s",i-iSt
164e0 61 72 74 2c 26 6c 69 6e 65 5b 69 53 74 61 72 74  art,&line[iStart
164f0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70  ]);.          fp
16500 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 6e  rintf(out,"%s",n
16510 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
16520 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
16530 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a    iStart = i+1;.
16540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16550 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  }.    }.    fpri
16560 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 26 6c 69  ntf(out,"%s",&li
16570 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 7d  ne[iStart]);.  }
16580 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20  .}../* The next 
16590 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74  function finds t
165a0 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
165b0 20 61 6e 64 20 6f 70 65 6e 73 20 69 74 2c 20 72   and opens it, r
165c0 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 20 70 6f  eturning.** a po
165d0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 70 65  inter to the ope
165e0 6e 65 64 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49  ned file. */.PRI
165f0 56 41 54 45 20 46 49 4c 45 20 2a 74 70 6c 74 5f  VATE FILE *tplt_
16600 6f 70 65 6e 28 6c 65 6d 70 29 0a 73 74 72 75 63  open(lemp).struc
16610 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
16620 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 74  .  static char t
16630 65 6d 70 6c 61 74 65 6e 61 6d 65 5b 5d 20 3d 20  emplatename[] = 
16640 22 6c 65 6d 70 61 72 2e 63 22 3b 0a 20 20 63 68  "lempar.c";.  ch
16650 61 72 20 62 75 66 5b 31 30 30 30 5d 3b 0a 20 20  ar buf[1000];.  
16660 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72  FILE *in;.  char
16670 20 2a 74 70 6c 74 6e 61 6d 65 3b 0a 20 20 63 68   *tpltname;.  ch
16680 61 72 20 2a 63 70 3b 0a 0a 20 20 63 70 20 3d 20  ar *cp;..  cp = 
16690 73 74 72 72 63 68 72 28 6c 65 6d 70 2d 3e 66 69  strrchr(lemp->fi
166a0 6c 65 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69  lename,'.');.  i
166b0 66 28 20 63 70 20 29 7b 0a 20 20 20 20 73 70 72  f( cp ){.    spr
166c0 69 6e 74 66 28 62 75 66 2c 22 25 2e 2a 73 2e 6c  intf(buf,"%.*s.l
166d0 74 22 2c 28 69 6e 74 29 28 63 70 2d 6c 65 6d 70  t",(int)(cp-lemp
166e0 2d 3e 66 69 6c 65 6e 61 6d 65 29 2c 6c 65 6d 70  ->filename),lemp
166f0 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  ->filename);.  }
16700 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74  else{.    sprint
16710 66 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c 6c 65  f(buf,"%s.lt",le
16720 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
16730 20 7d 0a 20 20 69 66 28 20 61 63 63 65 73 73 28   }.  if( access(
16740 62 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20  buf,004)==0 ){. 
16750 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 62 75     tpltname = bu
16760 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  f;.  }else if( a
16770 63 63 65 73 73 28 74 65 6d 70 6c 61 74 65 6e 61  ccess(templatena
16780 6d 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20  me,004)==0 ){.  
16790 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74 65 6d    tpltname = tem
167a0 70 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d 65 6c  platename;.  }el
167b0 73 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65  se{.    tpltname
167c0 20 3d 20 70 61 74 68 73 65 61 72 63 68 28 6c 65   = pathsearch(le
167d0 6d 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70 6c 61  mp->argv0,templa
167e0 74 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d 0a 20  tename,0);.  }. 
167f0 20 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d 3d 30   if( tpltname==0
16800 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
16810 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69  stderr,"Can't fi
16820 6e 64 20 74 68 65 20 70 61 72 73 65 72 20 64 72  nd the parser dr
16830 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69  iver template fi
16840 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20  le \"%s\".\n",. 
16850 20 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29     templatename)
16860 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  ;.    lemp->erro
16870 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
16880 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d  rn 0;.  }.  in =
16890 20 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d 65 2c   fopen(tpltname,
168a0 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d  "rb");.  if( in=
168b0 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
168c0 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
168d0 6f 70 65 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  open the templat
168e0 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e  e file \"%s\".\n
168f0 22 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b  ",templatename);
16900 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
16910 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
16920 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
16930 6e 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e  n in;.}../* Prin
16940 74 20 61 20 23 6c 69 6e 65 20 64 69 72 65 63 74  t a #line direct
16950 69 76 65 20 6c 69 6e 65 20 74 6f 20 74 68 65 20  ive line to the 
16960 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 2a 2f 0a  output file. */.
16970 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c  PRIVATE void tpl
16980 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 6c 69  t_linedir(out,li
16990 6e 65 6e 6f 2c 66 69 6c 65 6e 61 6d 65 29 0a 46  neno,filename).F
169a0 49 4c 45 20 2a 6f 75 74 3b 0a 69 6e 74 20 6c 69  ILE *out;.int li
169b0 6e 65 6e 6f 3b 0a 63 68 61 72 20 2a 66 69 6c 65  neno;.char *file
169c0 6e 61 6d 65 3b 0a 7b 0a 20 20 66 70 72 69 6e 74  name;.{.  fprint
169d0 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64 20  f(out,"#line %d 
169e0 5c 22 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 77  \"",lineno);.  w
169f0 68 69 6c 65 28 20 2a 66 69 6c 65 6e 61 6d 65 20  hile( *filename 
16a00 29 7b 0a 20 20 20 20 69 66 28 20 2a 66 69 6c 65  ){.    if( *file
16a10 6e 61 6d 65 20 3d 3d 20 27 5c 5c 27 20 29 20 70  name == '\\' ) p
16a20 75 74 63 28 27 5c 5c 27 2c 6f 75 74 29 3b 0a 20  utc('\\',out);. 
16a30 20 20 20 70 75 74 63 28 2a 66 69 6c 65 6e 61 6d     putc(*filenam
16a40 65 2c 6f 75 74 29 3b 0a 20 20 20 20 66 69 6c 65  e,out);.    file
16a50 6e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70  name++;.  }.  fp
16a60 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 5c 6e 22  rintf(out,"\"\n"
16a70 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61  );.}../* Print a
16a80 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20 66   string to the f
16a90 69 6c 65 20 61 6e 64 20 6b 65 65 70 20 74 68 65  ile and keep the
16aa0 20 6c 69 6e 65 6e 75 6d 62 65 72 20 75 70 20 74   linenumber up t
16ab0 6f 20 64 61 74 65 20 2a 2f 0a 50 52 49 56 41 54  o date */.PRIVAT
16ac0 45 20 76 6f 69 64 20 74 70 6c 74 5f 70 72 69 6e  E void tplt_prin
16ad0 74 28 6f 75 74 2c 6c 65 6d 70 2c 73 74 72 2c 73  t(out,lemp,str,s
16ae0 74 72 6c 6e 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c  trln,lineno).FIL
16af0 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 6c  E *out;.struct l
16b00 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61 72  emon *lemp;.char
16b10 20 2a 73 74 72 3b 0a 69 6e 74 20 73 74 72 6c 6e   *str;.int strln
16b20 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b  ;.int *lineno;.{
16b30 0a 20 20 69 66 28 20 73 74 72 3d 3d 30 20 29 20  .  if( str==0 ) 
16b40 72 65 74 75 72 6e 3b 0a 20 20 74 70 6c 74 5f 6c  return;.  tplt_l
16b50 69 6e 65 64 69 72 28 6f 75 74 2c 73 74 72 6c 6e  inedir(out,strln
16b60 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
16b70 3b 0a 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ;.  (*lineno)++;
16b80 0a 20 20 77 68 69 6c 65 28 20 2a 73 74 72 20 29  .  while( *str )
16b90 7b 0a 20 20 20 20 69 66 28 20 2a 73 74 72 3d 3d  {.    if( *str==
16ba0 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29  '\n' ) (*lineno)
16bb0 2b 2b 3b 0a 20 20 20 20 70 75 74 63 28 2a 73 74  ++;.    putc(*st
16bc0 72 2c 6f 75 74 29 3b 0a 20 20 20 20 73 74 72 2b  r,out);.    str+
16bd0 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72  +;.  }.  if( str
16be0 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20  [-1]!='\n' ){.  
16bf0 20 20 70 75 74 63 28 27 5c 6e 27 2c 6f 75 74 29    putc('\n',out)
16c00 3b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b  ;.    (*lineno)+
16c10 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 6c 69  +;.  }.  tplt_li
16c20 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e  nedir(out,*linen
16c30 6f 2b 32 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  o+2,lemp->outnam
16c40 65 29 3b 20 0a 20 20 28 2a 6c 69 6e 65 6e 6f 29  e); .  (*lineno)
16c50 2b 3d 32 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  +=2;.  return;.}
16c60 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
16c70 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 65 6d  owing routine em
16c80 69 74 73 20 63 6f 64 65 20 66 6f 72 20 74 68 65  its code for the
16c90 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
16ca0 74 68 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 73 70  the.** symbol sp
16cb0 0a 2a 2f 0a 76 6f 69 64 20 65 6d 69 74 5f 64 65  .*/.void emit_de
16cc0 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75  structor_code(ou
16cd0 74 2c 73 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f  t,sp,lemp,lineno
16ce0 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72  ).FILE *out;.str
16cf0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
16d00 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
16d10 6d 70 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b  mp;.int *lineno;
16d20 0a 7b 0a 20 63 68 61 72 20 2a 63 70 20 3d 20 30  .{. char *cp = 0
16d30 3b 0a 0a 20 69 6e 74 20 6c 69 6e 65 63 6e 74 20  ;.. int linecnt 
16d40 3d 20 30 3b 0a 20 69 66 28 20 73 70 2d 3e 74 79  = 0;. if( sp->ty
16d50 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  pe==TERMINAL ){.
16d60 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f     cp = lemp->to
16d70 6b 65 6e 64 65 73 74 3b 0a 20 20 20 69 66 28 20  kendest;.   if( 
16d80 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  cp==0 ) return;.
16d90 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28     tplt_linedir(
16da0 6f 75 74 2c 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64  out,lemp->tokend
16db0 65 73 74 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65  estln,lemp->file
16dc0 6e 61 6d 65 29 3b 0a 20 20 20 66 70 72 69 6e 74  name);.   fprint
16dd0 66 28 6f 75 74 2c 22 7b 22 29 3b 0a 20 7d 65 6c  f(out,"{");. }el
16de0 73 65 20 69 66 28 20 73 70 2d 3e 64 65 73 74 72  se if( sp->destr
16df0 75 63 74 6f 72 20 29 7b 0a 20 20 20 63 70 20 3d  uctor ){.   cp =
16e00 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b   sp->destructor;
16e10 0a 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  .   tplt_linedir
16e20 28 6f 75 74 2c 73 70 2d 3e 64 65 73 74 72 75 63  (out,sp->destruc
16e30 74 6f 72 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65  torln,lemp->file
16e40 6e 61 6d 65 29 3b 0a 20 20 20 66 70 72 69 6e 74  name);.   fprint
16e50 66 28 6f 75 74 2c 22 7b 22 29 3b 0a 20 7d 65 6c  f(out,"{");. }el
16e60 73 65 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72  se if( lemp->var
16e70 64 65 73 74 20 29 7b 0a 20 20 20 63 70 20 3d 20  dest ){.   cp = 
16e80 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20  lemp->vardest;. 
16e90 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65    if( cp==0 ) re
16ea0 74 75 72 6e 3b 0a 20 20 20 74 70 6c 74 5f 6c 69  turn;.   tplt_li
16eb0 6e 65 64 69 72 28 6f 75 74 2c 6c 65 6d 70 2d 3e  nedir(out,lemp->
16ec0 76 61 72 64 65 73 74 6c 6e 2c 6c 65 6d 70 2d 3e  vardestln,lemp->
16ed0 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 66 70  filename);.   fp
16ee0 72 69 6e 74 66 28 6f 75 74 2c 22 7b 22 29 3b 0a  rintf(out,"{");.
16ef0 20 7d 65 6c 73 65 7b 0a 20 20 20 61 73 73 65 72   }else{.   asser
16f00 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e  t( 0 );  /* Cann
16f10 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20 7d 0a  ot happen */. }.
16f20 20 66 6f 72 28 3b 20 2a 63 70 3b 20 63 70 2b 2b   for(; *cp; cp++
16f30 29 7b 0a 20 20 20 69 66 28 20 2a 63 70 3d 3d 27  ){.   if( *cp=='
16f40 24 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 24 27  $' && cp[1]=='$'
16f50 20 29 7b 0a 20 20 20 20 20 66 70 72 69 6e 74 66   ){.     fprintf
16f60 28 6f 75 74 2c 22 28 79 79 70 6d 69 6e 6f 72 2d  (out,"(yypminor-
16f70 3e 79 79 25 64 29 22 2c 73 70 2d 3e 64 74 6e 75  >yy%d)",sp->dtnu
16f80 6d 29 3b 0a 20 20 20 20 20 63 70 2b 2b 3b 0a 20  m);.     cp++;. 
16f90 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
16fa0 20 7d 0a 20 20 20 69 66 28 20 2a 63 70 3d 3d 27   }.   if( *cp=='
16fb0 5c 6e 27 20 29 20 6c 69 6e 65 63 6e 74 2b 2b 3b  \n' ) linecnt++;
16fc0 0a 20 20 20 66 70 75 74 63 28 2a 63 70 2c 6f 75  .   fputc(*cp,ou
16fd0 74 29 3b 0a 20 7d 0a 20 28 2a 6c 69 6e 65 6e 6f  t);. }. (*lineno
16fe0 29 20 2b 3d 20 33 20 2b 20 6c 69 6e 65 63 6e 74  ) += 3 + linecnt
16ff0 3b 0a 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ;. fprintf(out,"
17000 7d 5c 6e 22 29 3b 0a 20 74 70 6c 74 5f 6c 69 6e  }\n");. tplt_lin
17010 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f  edir(out,*lineno
17020 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b  ,lemp->outname);
17030 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  . return;.}../*.
17040 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 28  ** Return TRUE (
17050 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68 65  non-zero) if the
17060 20 67 69 76 65 6e 20 73 79 6d 62 6f 6c 20 68 61   given symbol ha
17070 73 20 61 20 64 65 73 74 72 75 63 74 6f 72 2e 0a  s a destructor..
17080 2a 2f 0a 69 6e 74 20 68 61 73 5f 64 65 73 74 72  */.int has_destr
17090 75 63 74 6f 72 28 73 70 2c 20 6c 65 6d 70 29 0a  uctor(sp, lemp).
170a0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
170b0 70 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p;.struct lemon 
170c0 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 72  *lemp;.{.  int r
170d0 65 74 3b 0a 20 20 69 66 28 20 73 70 2d 3e 74 79  et;.  if( sp->ty
170e0 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  pe==TERMINAL ){.
170f0 20 20 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e      ret = lemp->
17100 74 6f 6b 65 6e 64 65 73 74 21 3d 30 3b 0a 20 20  tokendest!=0;.  
17110 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 20 3d  }else{.    ret =
17120 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 21 3d   lemp->vardest!=
17130 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63  0 || sp->destruc
17140 74 6f 72 21 3d 30 3b 0a 20 20 7d 0a 20 20 72 65  tor!=0;.  }.  re
17150 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
17160 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74 20 74  ** Append text t
17170 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  o a dynamically 
17180 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69 6e 67  allocated string
17190 2e 20 20 49 66 20 7a 54 65 78 74 20 69 73 20 30  .  If zText is 0
171a0 20 74 68 65 6e 0a 2a 2a 20 72 65 73 65 74 20 74   then.** reset t
171b0 68 65 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20  he string to be 
171c0 65 6d 70 74 79 20 61 67 61 69 6e 2e 20 20 41 6c  empty again.  Al
171d0 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20  ways return the 
171e0 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 0a 2a 2a  complete text.**
171f0 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 28   of the string (
17200 77 68 69 63 68 20 69 73 20 6f 76 65 72 77 72 69  which is overwri
17210 74 74 65 6e 20 77 69 74 68 20 65 61 63 68 20 63  tten with each c
17220 61 6c 6c 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62 79  all)..**.** n by
17230 74 65 73 20 6f 66 20 7a 54 65 78 74 20 61 72 65  tes of zText are
17240 20 73 74 6f 72 65 64 2e 20 20 49 66 20 6e 3d 3d   stored.  If n==
17250 30 20 74 68 65 6e 20 61 6c 6c 20 6f 66 20 7a 54  0 then all of zT
17260 65 78 74 20 75 70 20 74 6f 20 74 68 65 20 66 69  ext up to the fi
17270 72 73 74 0a 2a 2a 20 5c 30 30 30 20 74 65 72 6d  rst.** \000 term
17280 69 6e 61 74 6f 72 20 69 73 20 73 74 6f 72 65 64  inator is stored
17290 2e 20 20 7a 54 65 78 74 20 63 61 6e 20 63 6f 6e  .  zText can con
172a0 74 61 69 6e 20 75 70 20 74 6f 20 74 77 6f 20 69  tain up to two i
172b0 6e 73 74 61 6e 63 65 73 20 6f 66 0a 2a 2a 20 25  nstances of.** %
172c0 64 2e 20 20 54 68 65 20 76 61 6c 75 65 73 20 6f  d.  The values o
172d0 66 20 70 31 20 61 6e 64 20 70 32 20 61 72 65 20  f p1 and p2 are 
172e0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
172f0 20 66 69 72 73 74 20 61 6e 64 20 73 65 63 6f 6e   first and secon
17300 64 0a 2a 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a 20 49  d.** %d..**.** I
17310 66 20 6e 3d 3d 2d 31 2c 20 74 68 65 6e 20 74 68  f n==-1, then th
17320 65 20 70 72 65 76 69 6f 75 73 20 63 68 61 72 61  e previous chara
17330 63 74 65 72 20 69 73 20 6f 76 65 72 77 72 69 74  cter is overwrit
17340 74 65 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ten..*/.PRIVATE 
17350 63 68 61 72 20 2a 61 70 70 65 6e 64 5f 73 74 72  char *append_str
17360 28 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e  (char *zText, in
17370 74 20 6e 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74  t n, int p1, int
17380 20 70 32 29 7b 0a 20 20 73 74 61 74 69 63 20 63   p2){.  static c
17390 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 73 74  har *z = 0;.  st
173a0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 65 64  atic int alloced
173b0 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
173c0 6e 74 20 75 73 65 64 20 3d 20 30 3b 0a 20 20 69  nt used = 0;.  i
173d0 6e 74 20 63 3b 0a 20 20 63 68 61 72 20 7a 49 6e  nt c;.  char zIn
173e0 74 5b 34 30 5d 3b 0a 0a 20 20 69 66 28 20 7a 54  t[40];..  if( zT
173f0 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 75 73  ext==0 ){.    us
17400 65 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ed = 0;.    retu
17410 72 6e 20 7a 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn z;.  }.  if( 
17420 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  n<=0 ){.    if( 
17430 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 73 65  n<0 ){.      use
17440 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 61 73  d += n;.      as
17450 73 65 72 74 28 20 75 73 65 64 3e 3d 30 20 29 3b  sert( used>=0 );
17460 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 73  .    }.    n = s
17470 74 72 6c 65 6e 28 7a 54 65 78 74 29 3b 0a 20 20  trlen(zText);.  
17480 7d 0a 20 20 69 66 28 20 6e 2b 73 69 7a 65 6f 66  }.  if( n+sizeof
17490 28 7a 49 6e 74 29 2a 32 2b 75 73 65 64 20 3e 3d  (zInt)*2+used >=
174a0 20 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20   alloced ){.    
174b0 61 6c 6c 6f 63 65 64 20 3d 20 6e 20 2b 20 73 69  alloced = n + si
174c0 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 20 2b 20 75  zeof(zInt)*2 + u
174d0 73 65 64 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a  sed + 200;.    z
174e0 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 2c 20 20 61   = realloc(z,  a
174f0 6c 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20 20 69  lloced);.  }.  i
17500 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
17510 20 22 22 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d   "";.  while( n-
17520 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 63 20 3d  - > 0 ){.    c =
17530 20 2a 28 7a 54 65 78 74 2b 2b 29 3b 0a 20 20 20   *(zText++);.   
17540 20 69 66 28 20 63 3d 3d 27 25 27 20 26 26 20 6e   if( c=='%' && n
17550 3e 30 20 26 26 20 7a 54 65 78 74 5b 30 5d 3d 3d  >0 && zText[0]==
17560 27 64 27 20 29 7b 0a 20 20 20 20 20 20 73 70 72  'd' ){.      spr
17570 69 6e 74 66 28 7a 49 6e 74 2c 20 22 25 64 22 2c  intf(zInt, "%d",
17580 20 70 31 29 3b 0a 20 20 20 20 20 20 70 31 20 3d   p1);.      p1 =
17590 20 70 32 3b 0a 20 20 20 20 20 20 73 74 72 63 70   p2;.      strcp
175a0 79 28 26 7a 5b 75 73 65 64 5d 2c 20 7a 49 6e 74  y(&z[used], zInt
175b0 29 3b 0a 20 20 20 20 20 20 75 73 65 64 20 2b 3d  );.      used +=
175c0 20 73 74 72 6c 65 6e 28 26 7a 5b 75 73 65 64 5d   strlen(&z[used]
175d0 29 3b 0a 20 20 20 20 20 20 7a 54 65 78 74 2b 2b  );.      zText++
175e0 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20  ;.      n--;.   
175f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 5b   }else{.      z[
17600 75 73 65 64 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  used++] = c;.   
17610 20 7d 0a 20 20 7d 0a 20 20 7a 5b 75 73 65 64 5d   }.  }.  z[used]
17620 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
17630 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 7a 43 6f 64 65  ;.}../*.** zCode
17640 20 69 73 20 61 20 73 74 72 69 6e 67 20 74 68 61   is a string tha
17650 74 20 69 73 20 74 68 65 20 61 63 74 69 6f 6e 20  t is the action 
17660 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
17670 61 20 72 75 6c 65 2e 20 20 45 78 70 61 6e 64 0a  a rule.  Expand.
17680 2a 2a 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 69  ** the symbols i
17690 6e 20 74 68 69 73 20 73 74 72 69 6e 67 20 73 6f  n this string so
176a0 20 74 68 61 74 20 74 68 65 20 72 65 66 65 72 20   that the refer 
176b0 74 6f 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  to elements of t
176c0 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 73 74 61  he parser.** sta
176d0 63 6b 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76  ck..*/.PRIVATE v
176e0 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f  oid translate_co
176f0 64 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  de(struct lemon 
17700 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 72 75  *lemp, struct ru
17710 6c 65 20 2a 72 70 29 7b 0a 20 20 63 68 61 72 20  le *rp){.  char 
17720 2a 63 70 2c 20 2a 78 70 3b 0a 20 20 69 6e 74 20  *cp, *xp;.  int 
17730 69 3b 0a 20 20 63 68 61 72 20 6c 68 73 75 73 65  i;.  char lhsuse
17740 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 72 75  d = 0;    /* Tru
17750 65 20 69 66 20 74 68 65 20 4c 48 53 20 65 6c 65  e if the LHS ele
17760 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 20 75 73  ment has been us
17770 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 75 73 65  ed */.  char use
17780 64 5b 4d 41 58 52 48 53 5d 3b 20 20 20 2f 2a 20  d[MAXRHS];   /* 
17790 54 72 75 65 20 66 6f 72 20 65 61 63 68 20 52 48  True for each RH
177a0 53 20 65 6c 65 6d 65 6e 74 20 77 68 69 63 68 20  S element which 
177b0 69 73 20 75 73 65 64 20 2a 2f 0a 0a 20 20 66 6f  is used */..  fo
177c0 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
177d0 73 3b 20 69 2b 2b 29 20 75 73 65 64 5b 69 5d 20  s; i++) used[i] 
177e0 3d 20 30 3b 0a 20 20 6c 68 73 75 73 65 64 20 3d  = 0;.  lhsused =
177f0 20 30 3b 0a 0a 20 20 69 66 28 20 72 70 2d 3e 63   0;..  if( rp->c
17800 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 70  ode==0 ){.    rp
17810 2d 3e 63 6f 64 65 20 3d 20 22 5c 6e 22 3b 0a 20  ->code = "\n";. 
17820 20 20 20 72 70 2d 3e 6c 69 6e 65 20 3d 20 72 70     rp->line = rp
17830 2d 3e 72 75 6c 65 6c 69 6e 65 3b 0a 20 20 7d 0a  ->ruleline;.  }.
17840 0a 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c  .  append_str(0,
17850 30 2c 30 2c 30 29 3b 0a 20 20 66 6f 72 28 63 70  0,0,0);.  for(cp
17860 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20  =rp->code; *cp; 
17870 63 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69  cp++){.    if( i
17880 73 61 6c 70 68 61 28 2a 63 70 29 20 26 26 20 28  salpha(*cp) && (
17890 63 70 3d 3d 72 70 2d 3e 63 6f 64 65 20 7c 7c 20  cp==rp->code || 
178a0 28 21 69 73 61 6c 6e 75 6d 28 63 70 5b 2d 31 5d  (!isalnum(cp[-1]
178b0 29 20 26 26 20 63 70 5b 2d 31 5d 21 3d 27 5f 27  ) && cp[-1]!='_'
178c0 29 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  )) ){.      char
178d0 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 66 6f   saved;.      fo
178e0 72 28 78 70 3d 20 26 63 70 5b 31 5d 3b 20 69 73  r(xp= &cp[1]; is
178f0 61 6c 6e 75 6d 28 2a 78 70 29 20 7c 7c 20 2a 78  alnum(*xp) || *x
17900 70 3d 3d 27 5f 27 3b 20 78 70 2b 2b 29 3b 0a 20  p=='_'; xp++);. 
17910 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 78 70       saved = *xp
17920 3b 0a 20 20 20 20 20 20 2a 78 70 20 3d 20 30 3b  ;.      *xp = 0;
17930 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c  .      if( rp->l
17940 68 73 61 6c 69 61 73 20 26 26 20 73 74 72 63 6d  hsalias && strcm
17950 70 28 63 70 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  p(cp,rp->lhsalia
17960 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  s)==0 ){.       
17970 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79 67   append_str("yyg
17980 6f 74 6f 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30  otominor.yy%d",0
17990 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 2c  ,rp->lhs->dtnum,
179a0 30 29 3b 0a 20 20 20 20 20 20 20 20 63 70 20 3d  0);.        cp =
179b0 20 78 70 3b 0a 20 20 20 20 20 20 20 20 6c 68 73   xp;.        lhs
179c0 75 73 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  used = 1;.      
179d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
179e0 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
179f0 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
17a00 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61      if( rp->rhsa
17a10 6c 69 61 73 5b 69 5d 20 26 26 20 73 74 72 63 6d  lias[i] && strcm
17a20 70 28 63 70 2c 72 70 2d 3e 72 68 73 61 6c 69 61  p(cp,rp->rhsalia
17a30 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  s[i])==0 ){.    
17a40 20 20 20 20 20 20 20 20 69 66 28 20 63 70 21 3d          if( cp!=
17a50 72 70 2d 3e 63 6f 64 65 20 26 26 20 63 70 5b 2d  rp->code && cp[-
17a60 31 5d 3d 3d 27 40 27 20 29 7b 0a 20 20 20 20 20  1]=='@' ){.     
17a70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
17a80 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f  he argument is o
17a90 66 20 74 68 65 20 66 6f 72 6d 20 40 58 20 74 68  f the form @X th
17aa0 65 6e 20 73 75 62 73 74 69 74 75 74 65 64 0a 20  en substituted. 
17ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
17ac0 74 68 65 20 74 6f 6b 65 6e 20 6e 75 6d 62 65 72  the token number
17ad0 20 6f 66 20 58 2c 20 6e 6f 74 20 74 68 65 20 76   of X, not the v
17ae0 61 6c 75 65 20 6f 66 20 58 20 2a 2f 0a 20 20 20  alue of X */.   
17af0 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
17b00 64 5f 73 74 72 28 22 79 79 6d 73 70 5b 25 64 5d  d_str("yymsp[%d]
17b10 2e 6d 61 6a 6f 72 22 2c 2d 31 2c 69 2d 72 70 2d  .major",-1,i-rp-
17b20 3e 6e 72 68 73 2b 31 2c 30 29 3b 0a 20 20 20 20  >nrhs+1,0);.    
17b30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
17b40 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
17b50 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
17b60 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
17b70 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
17b80 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  tnum;.          
17b90 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
17ba0 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
17bb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
17bc0 20 20 20 64 74 6e 75 6d 20 3d 20 73 70 2d 3e 73     dtnum = sp->s
17bd0 75 62 73 79 6d 5b 30 5d 2d 3e 64 74 6e 75 6d 3b  ubsym[0]->dtnum;
17be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
17bf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
17c00 20 20 20 20 20 20 64 74 6e 75 6d 20 3d 20 73 70        dtnum = sp
17c10 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  ->dtnum;.       
17c20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17c30 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74         append_st
17c40 72 28 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e  r("yymsp[%d].min
17c50 6f 72 2e 79 79 25 64 22 2c 30 2c 69 2d 72 70 2d  or.yy%d",0,i-rp-
17c60 3e 6e 72 68 73 2b 31 2c 20 64 74 6e 75 6d 29 3b  >nrhs+1, dtnum);
17c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
17c80 20 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20             cp = 
17c90 78 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  xp;.            
17ca0 75 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 20  used[i] = 1;.   
17cb0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
17cc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
17ce0 20 20 20 20 2a 78 70 20 3d 20 73 61 76 65 64 3b      *xp = saved;
17cf0 0a 20 20 20 20 7d 0a 20 20 20 20 61 70 70 65 6e  .    }.    appen
17d00 64 5f 73 74 72 28 63 70 2c 20 31 2c 20 30 2c 20  d_str(cp, 1, 0, 
17d10 30 29 3b 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6c  0);.  } /* End l
17d20 6f 6f 70 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  oop */..  /* Che
17d30 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
17d40 74 68 65 20 4c 48 53 20 68 61 73 20 62 65 65 6e  the LHS has been
17d50 20 75 73 65 64 20 2a 2f 0a 20 20 69 66 28 20 72   used */.  if( r
17d60 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 21  p->lhsalias && !
17d70 6c 68 73 75 73 65 64 20 29 7b 0a 20 20 20 20 45  lhsused ){.    E
17d80 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
17d90 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c  lename,rp->rulel
17da0 69 6e 65 2c 0a 20 20 20 20 20 20 22 4c 61 62 65  ine,.      "Labe
17db0 6c 20 5c 22 25 73 5c 22 20 66 6f 72 20 5c 22 25  l \"%s\" for \"%
17dc0 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72  s(%s)\" is never
17dd0 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20   used.",.       
17de0 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70   rp->lhsalias,rp
17df0 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 72 70 2d 3e  ->lhs->name,rp->
17e00 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 6c  lhsalias);.    l
17e10 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
17e20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
17e30 61 74 65 20 64 65 73 74 72 75 63 74 6f 72 20 63  ate destructor c
17e40 6f 64 65 20 66 6f 72 20 52 48 53 20 73 79 6d 62  ode for RHS symb
17e50 6f 6c 73 20 77 68 69 63 68 20 61 72 65 20 6e 6f  ols which are no
17e60 74 20 75 73 65 64 20 69 6e 20 74 68 65 0a 20 20  t used in the.  
17e70 2a 2a 20 72 65 64 75 63 65 20 63 6f 64 65 20 2a  ** reduce code *
17e80 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72  /.  for(i=0; i<r
17e90 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
17ea0 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c     if( rp->rhsal
17eb0 69 61 73 5b 69 5d 20 26 26 20 21 75 73 65 64 5b  ias[i] && !used[
17ec0 69 5d 20 29 7b 0a 20 20 20 20 20 20 45 72 72 6f  i] ){.      Erro
17ed0 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
17ee0 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65  ame,rp->ruleline
17ef0 2c 0a 20 20 20 20 20 20 20 20 22 4c 61 62 65 6c  ,.        "Label
17f00 20 25 73 20 66 6f 72 20 5c 22 25 73 28 25 73 29   %s for \"%s(%s)
17f10 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  \" is never used
17f20 2e 22 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e  .",.        rp->
17f30 72 68 73 61 6c 69 61 73 5b 69 5d 2c 72 70 2d 3e  rhsalias[i],rp->
17f40 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 72 70 2d  rhs[i]->name,rp-
17f50 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 0a 20  >rhsalias[i]);. 
17f60 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
17f70 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  cnt++;.    }else
17f80 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61   if( rp->rhsalia
17f90 73 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  s[i]==0 ){.     
17fa0 20 69 66 28 20 68 61 73 5f 64 65 73 74 72 75 63   if( has_destruc
17fb0 74 6f 72 28 72 70 2d 3e 72 68 73 5b 69 5d 2c 6c  tor(rp->rhs[i],l
17fc0 65 6d 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  emp) ){.        
17fd0 61 70 70 65 6e 64 5f 73 74 72 28 22 20 20 79 79  append_str("  yy
17fe0 5f 64 65 73 74 72 75 63 74 6f 72 28 25 64 2c 26  _destructor(%d,&
17ff0 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29  yymsp[%d].minor)
18000 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20 20  ;\n", 0,.       
18010 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e      rp->rhs[i]->
18020 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e 72 68 73  index,i-rp->nrhs
18030 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
18040 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20  {.        /* No 
18050 64 65 73 74 72 75 63 74 6f 72 20 64 65 66 69 6e  destructor defin
18060 65 64 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d  ed for this term
18070 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
18080 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 70 2d 3e  }.  }.  if( rp->
18090 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 70 20 3d  code ){.    cp =
180a0 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c   append_str(0,0,
180b0 30 2c 30 29 3b 0a 20 20 20 20 72 70 2d 3e 63 6f  0,0);.    rp->co
180c0 64 65 20 3d 20 53 74 72 73 61 66 65 28 63 70 3f  de = Strsafe(cp?
180d0 63 70 3a 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  cp:"");.  }.}../
180e0 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  * .** Generate c
180f0 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
18100 65 73 20 77 68 65 6e 20 74 68 65 20 72 75 6c 65  es when the rule
18110 20 22 72 70 22 20 69 73 20 72 65 64 75 63 65 64   "rp" is reduced
18120 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20  .  Write.** the 
18130 63 6f 64 65 20 74 6f 20 22 6f 75 74 22 2e 20 20  code to "out".  
18140 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e 65 6e 6f  Make sure lineno
18150 20 73 74 61 79 73 20 75 70 2d 74 6f 2d 64 61 74   stays up-to-dat
18160 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  e..*/.PRIVATE vo
18170 69 64 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74  id emit_code(out
18180 2c 72 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f 29  ,rp,lemp,lineno)
18190 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75  .FILE *out;.stru
181a0 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 73 74 72  ct rule *rp;.str
181b0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
181c0 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a  .int *lineno;.{.
181d0 20 63 68 61 72 20 2a 63 70 3b 0a 20 69 6e 74 20   char *cp;. int 
181e0 6c 69 6e 65 63 6e 74 20 3d 20 30 3b 0a 0a 20 2f  linecnt = 0;.. /
181f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
18200 74 6f 20 64 6f 20 74 68 65 20 72 65 64 75 63 65  to do the reduce
18210 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 69 66 28 20   action */. if( 
18220 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 74  rp->code ){.   t
18230 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c  plt_linedir(out,
18240 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d 70 2d 3e 66  rp->line,lemp->f
18250 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 66 70 72  ilename);.   fpr
18260 69 6e 74 66 28 6f 75 74 2c 22 7b 25 73 22 2c 72  intf(out,"{%s",r
18270 70 2d 3e 63 6f 64 65 29 3b 0a 20 20 20 66 6f 72  p->code);.   for
18280 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a 63  (cp=rp->code; *c
18290 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 69  p; cp++){.     i
182a0 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 6c  f( *cp=='\n' ) l
182b0 69 6e 65 63 6e 74 2b 2b 3b 0a 20 20 20 7d 20 2f  inecnt++;.   } /
182c0 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 20 20  * End loop */.  
182d0 20 28 2a 6c 69 6e 65 6e 6f 29 20 2b 3d 20 33 20   (*lineno) += 3 
182e0 2b 20 6c 69 6e 65 63 6e 74 3b 0a 20 20 20 66 70  + linecnt;.   fp
182f0 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29  rintf(out,"}\n")
18300 3b 0a 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69  ;.   tplt_linedi
18310 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65  r(out,*lineno,le
18320 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 7d  mp->outname);. }
18330 20 2f 2a 20 45 6e 64 20 69 66 28 20 72 70 2d 3e   /* End if( rp->
18340 63 6f 64 65 20 29 20 2a 2f 0a 0a 20 72 65 74 75  code ) */.. retu
18350 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  rn;.}../*.** Pri
18360 6e 74 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  nt the definitio
18370 6e 20 6f 66 20 74 68 65 20 75 6e 69 6f 6e 20 75  n of the union u
18380 73 65 64 20 66 6f 72 20 74 68 65 20 70 61 72 73  sed for the pars
18390 65 72 27 73 20 64 61 74 61 20 73 74 61 63 6b 2e  er's data stack.
183a0 0a 2a 2a 20 54 68 69 73 20 75 6e 69 6f 6e 20 63  .** This union c
183b0 6f 6e 74 61 69 6e 73 20 66 69 65 6c 64 73 20 66  ontains fields f
183c0 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c  or every possibl
183d0 65 20 64 61 74 61 20 74 79 70 65 20 66 6f 72 20  e data type for 
183e0 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f  tokens.** and no
183f0 6e 74 65 72 6d 69 6e 61 6c 73 2e 20 20 49 6e 20  nterminals.  In 
18400 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 63  the process of c
18410 6f 6d 70 75 74 69 6e 67 20 61 6e 64 20 70 72 69  omputing and pri
18420 6e 74 69 6e 67 20 74 68 69 73 0a 2a 2a 20 75 6e  nting this.** un
18430 69 6f 6e 2c 20 61 6c 73 6f 20 73 65 74 20 74 68  ion, also set th
18440 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64  e ".dtnum" field
18450 20 6f 66 20 65 76 65 72 79 20 74 65 72 6d 69 6e   of every termin
18460 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e  al and nontermin
18470 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f  al.** symbol..*/
18480 0a 76 6f 69 64 20 70 72 69 6e 74 5f 73 74 61 63  .void print_stac
18490 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70  k_union(out,lemp
184a0 2c 70 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29  ,plineno,mhflag)
184b0 0a 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20  .FILE *out;     
184c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
184d0 54 68 65 20 6f 75 74 70 75 74 20 73 74 72 65 61  The output strea
184e0 6d 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d 6f  m */.struct lemo
184f0 6e 20 2a 6c 65 6d 70 3b 20 20 20 20 20 20 20 20  n *lemp;        
18500 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66   /* The main inf
18510 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  o structure for 
18520 74 68 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 69  this parser */.i
18530 6e 74 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20 20  nt *plineno;    
18540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
18550 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 69 6e  inter to the lin
18560 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 69 6e 74 20  e number */.int 
18570 6d 68 66 6c 61 67 3b 20 20 20 20 20 20 20 20 20  mhflag;         
18580 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
18590 69 66 20 67 65 6e 65 72 61 74 69 6e 67 20 6d 61  if generating ma
185a0 6b 65 68 65 61 64 65 72 73 20 6f 75 74 70 75 74  keheaders output
185b0 20 2a 2f 0a 7b 0a 20 20 69 6e 74 20 6c 69 6e 65   */.{.  int line
185c0 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20  no = *plineno;  
185d0 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65 20 6e 75    /* The line nu
185e0 6d 62 65 72 20 6f 66 20 74 68 65 20 6f 75 74 70  mber of the outp
185f0 75 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 74  ut */.  char **t
18600 79 70 65 73 3b 20 20 20 20 20 20 20 20 20 20 20  ypes;           
18610 20 20 2f 2a 20 41 20 68 61 73 68 20 74 61 62 6c    /* A hash tabl
18620 65 20 6f 66 20 64 61 74 61 74 79 70 65 73 20 2a  e of datatypes *
18630 2f 0a 20 20 69 6e 74 20 61 72 72 61 79 73 69 7a  /.  int arraysiz
18640 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
18650 20 53 69 7a 65 20 6f 66 20 74 68 65 20 22 74 79   Size of the "ty
18660 70 65 73 22 20 61 72 72 61 79 20 2a 2f 0a 20 20  pes" array */.  
18670 69 6e 74 20 6d 61 78 64 74 6c 65 6e 67 74 68 3b  int maxdtlength;
18680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
18690 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61  imum length of a
186a0 6e 79 20 22 2e 64 61 74 61 74 79 70 65 22 20 66  ny ".datatype" f
186b0 69 65 6c 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20  ield. */.  char 
186c0 2a 73 74 64 64 74 3b 20 20 20 20 20 20 20 20 20  *stddt;         
186d0 20 20 20 20 20 2f 2a 20 53 74 61 6e 64 61 72 64       /* Standard
186e0 69 7a 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20  ized name for a 
186f0 64 61 74 61 74 79 70 65 20 2a 2f 0a 20 20 69 6e  datatype */.  in
18700 74 20 69 2c 6a 3b 20 20 20 20 20 20 20 20 20 20  t i,j;          
18710 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
18720 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
18730 74 20 68 61 73 68 3b 20 20 20 20 20 20 20 20 20  t hash;         
18740 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 68          /* For h
18750 61 73 68 69 6e 67 20 74 68 65 20 6e 61 6d 65 20  ashing the name 
18760 6f 66 20 61 20 74 79 70 65 20 2a 2f 0a 20 20 63  of a type */.  c
18770 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20  har *name;      
18780 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
18790 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a   of the parser *
187a0 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
187b0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
187c0 74 79 70 65 73 5b 5d 20 61 6e 64 20 61 6c 6c 6f  types[] and allo
187d0 63 61 74 65 20 73 74 64 64 74 5b 5d 20 2a 2f 0a  cate stddt[] */.
187e0 20 20 61 72 72 61 79 73 69 7a 65 20 3d 20 6c 65    arraysize = le
187f0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a 20 32 3b  mp->nsymbol * 2;
18800 0a 20 20 74 79 70 65 73 20 3d 20 28 63 68 61 72  .  types = (char
18810 2a 2a 29 63 61 6c 6c 6f 63 28 20 61 72 72 61 79  **)calloc( array
18820 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28 63 68 61  size, sizeof(cha
18830 72 2a 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  r*) );.  for(i=0
18840 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69  ; i<arraysize; i
18850 2b 2b 29 20 74 79 70 65 73 5b 69 5d 20 3d 20 30  ++) types[i] = 0
18860 3b 0a 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20  ;.  maxdtlength 
18870 3d 20 30 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  = 0;.  if( lemp-
18880 3e 76 61 72 74 79 70 65 20 29 7b 0a 20 20 20 20  >vartype ){.    
18890 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 73 74  maxdtlength = st
188a0 72 6c 65 6e 28 6c 65 6d 70 2d 3e 76 61 72 74 79  rlen(lemp->varty
188b0 70 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  pe);.  }.  for(i
188c0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
188d0 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  bol; i++){.    i
188e0 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 73 74 72 75  nt len;.    stru
188f0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
18900 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
18910 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 64 61  ;.    if( sp->da
18920 74 61 74 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74  tatype==0 ) cont
18930 69 6e 75 65 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  inue;.    len = 
18940 73 74 72 6c 65 6e 28 73 70 2d 3e 64 61 74 61 74  strlen(sp->datat
18950 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20 6c 65  ype);.    if( le
18960 6e 3e 6d 61 78 64 74 6c 65 6e 67 74 68 20 29 20  n>maxdtlength ) 
18970 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65  maxdtlength = le
18980 6e 3b 0a 20 20 7d 0a 20 20 73 74 64 64 74 20 3d  n;.  }.  stddt =
18990 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20   (char*)malloc( 
189a0 6d 61 78 64 74 6c 65 6e 67 74 68 2a 32 20 2b 20  maxdtlength*2 + 
189b0 31 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65 73  1 );.  if( types
189c0 3d 3d 30 20 7c 7c 20 73 74 64 64 74 3d 3d 30 20  ==0 || stddt==0 
189d0 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
189e0 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65  tderr,"Out of me
189f0 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65  mory.\n");.    e
18a00 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  xit(1);.  }..  /
18a10 2a 20 42 75 69 6c 64 20 61 20 68 61 73 68 20 74  * Build a hash t
18a20 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65  able of datatype
18a30 73 2e 20 54 68 65 20 22 2e 64 74 6e 75 6d 22 20  s. The ".dtnum" 
18a40 66 69 65 6c 64 20 6f 66 20 65 61 63 68 20 73 79  field of each sy
18a50 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69 6c  mbol.  ** is fil
18a60 6c 65 64 20 69 6e 20 77 69 74 68 20 74 68 65 20  led in with the 
18a70 68 61 73 68 20 69 6e 64 65 78 20 70 6c 75 73 20  hash index plus 
18a80 31 2e 20 20 41 20 22 2e 64 74 6e 75 6d 22 20 76  1.  A ".dtnum" v
18a90 61 6c 75 65 20 6f 66 20 30 20 69 73 0a 20 20 2a  alue of 0 is.  *
18aa0 2a 20 75 73 65 64 20 66 6f 72 20 74 65 72 6d 69  * used for termi
18ab0 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49 66  nal symbols.  If
18ac0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 25 64 65   there is no %de
18ad0 66 61 75 6c 74 5f 74 79 70 65 20 64 65 66 69 6e  fault_type defin
18ae0 65 64 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20 69  ed then.  ** 0 i
18af0 73 20 61 6c 73 6f 20 75 73 65 64 20 61 73 20 74  s also used as t
18b00 68 65 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65 20  he .dtnum value 
18b10 66 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73  for nonterminals
18b20 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 73 70   which do not sp
18b30 65 63 69 66 79 0a 20 20 2a 2a 20 61 20 64 61 74  ecify.  ** a dat
18b40 61 74 79 70 65 20 75 73 69 6e 67 20 74 68 65 20  atype using the 
18b50 25 74 79 70 65 20 64 69 72 65 63 74 69 76 65 2e  %type directive.
18b60 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
18b70 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
18b80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
18b90 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
18ba0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
18bb0 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 3b 0a  ;.    char *cp;.
18bc0 20 20 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d 70      if( sp==lemp
18bd0 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20  ->errsym ){.    
18be0 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61 72    sp->dtnum = ar
18bf0 72 61 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20 20  raysize+1;.     
18c00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
18c10 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70  .    if( sp->typ
18c20 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c  e!=NONTERMINAL |
18c30 7c 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65 3d  | (sp->datatype=
18c40 3d 30 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72 74  =0 && lemp->vart
18c50 79 70 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  ype==0) ){.     
18c60 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a   sp->dtnum = 0;.
18c70 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
18c80 20 20 20 20 7d 0a 20 20 20 20 63 70 20 3d 20 73      }.    cp = s
18c90 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20  p->datatype;.   
18ca0 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20   if( cp==0 ) cp 
18cb0 3d 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3b  = lemp->vartype;
18cc0 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20  .    j = 0;.    
18cd0 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a  while( isspace(*
18ce0 63 70 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20  cp) ) cp++;.    
18cf0 77 68 69 6c 65 28 20 2a 63 70 20 29 20 73 74 64  while( *cp ) std
18d00 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b  dt[j++] = *cp++;
18d10 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20  .    while( j>0 
18d20 26 26 20 69 73 73 70 61 63 65 28 73 74 64 64 74  && isspace(stddt
18d30 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20  [j-1]) ) j--;.  
18d40 20 20 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a    stddt[j] = 0;.
18d50 20 20 20 20 68 61 73 68 20 3d 20 30 3b 0a 20 20      hash = 0;.  
18d60 20 20 66 6f 72 28 6a 3d 30 3b 20 73 74 64 64 74    for(j=0; stddt
18d70 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  [j]; j++){.     
18d80 20 68 61 73 68 20 3d 20 68 61 73 68 2a 35 33 20   hash = hash*53 
18d90 2b 20 73 74 64 64 74 5b 6a 5d 3b 0a 20 20 20 20  + stddt[j];.    
18da0 7d 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  }.    hash = (ha
18db0 73 68 20 26 20 30 78 37 66 66 66 66 66 66 66 29  sh & 0x7fffffff)
18dc0 25 61 72 72 61 79 73 69 7a 65 3b 0a 20 20 20 20  %arraysize;.    
18dd0 77 68 69 6c 65 28 20 74 79 70 65 73 5b 68 61 73  while( types[has
18de0 68 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  h] ){.      if( 
18df0 73 74 72 63 6d 70 28 74 79 70 65 73 5b 68 61 73  strcmp(types[has
18e00 68 5d 2c 73 74 64 64 74 29 3d 3d 30 20 29 7b 0a  h],stddt)==0 ){.
18e10 20 20 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75          sp->dtnu
18e20 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20  m = hash + 1;.  
18e30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18e40 20 20 20 7d 0a 20 20 20 20 20 20 68 61 73 68 2b     }.      hash+
18e50 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  +;.      if( has
18e60 68 3e 3d 61 72 72 61 79 73 69 7a 65 20 29 20 68  h>=arraysize ) h
18e70 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ash = 0;.    }. 
18e80 20 20 20 69 66 28 20 74 79 70 65 73 5b 68 61 73     if( types[has
18e90 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  h]==0 ){.      s
18ea0 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20  p->dtnum = hash 
18eb0 2b 20 31 3b 0a 20 20 20 20 20 20 74 79 70 65 73  + 1;.      types
18ec0 5b 68 61 73 68 5d 20 3d 20 28 63 68 61 72 2a 29  [hash] = (char*)
18ed0 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 73  malloc( strlen(s
18ee0 74 64 64 74 29 2b 31 20 29 3b 0a 20 20 20 20 20  tddt)+1 );.     
18ef0 20 69 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d   if( types[hash]
18f00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
18f10 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f  printf(stderr,"O
18f20 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22  ut of memory.\n"
18f30 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28  );.        exit(
18f40 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
18f50 20 20 73 74 72 63 70 79 28 74 79 70 65 73 5b 68    strcpy(types[h
18f60 61 73 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20  ash],stddt);.   
18f70 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69   }.  }..  /* Pri
18f80 6e 74 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e  nt out the defin
18f90 69 74 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e  ition of YYTOKEN
18fa0 54 59 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52  TYPE and YYMINOR
18fb0 54 59 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d  TYPE */.  name =
18fc0 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65   lemp->name ? le
18fd0 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73  mp->name : "Pars
18fe0 65 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a  e";.  lineno = *
18ff0 70 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d  plineno;.  if( m
19000 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66  hflag ){ fprintf
19010 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46  (out,"#if INTERF
19020 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ACE\n"); lineno+
19030 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  +; }.  fprintf(o
19040 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 54 4f  ut,"#define %sTO
19050 4b 45 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61  KENTYPE %s\n",na
19060 6d 65 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f  me,.    lemp->to
19070 6b 65 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f  kentype?lemp->to
19080 6b 65 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22 29  kentype:"void*")
19090 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69  ;  lineno++;.  i
190a0 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72  f( mhflag ){ fpr
190b0 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66  intf(out,"#endif
190c0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n"); lineno++; 
190d0 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
190e0 22 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b  "typedef union {
190f0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
19100 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
19110 20 25 73 54 4f 4b 45 4e 54 59 50 45 20 79 79 30   %sTOKENTYPE yy0
19120 3b 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65  ;\n",name); line
19130 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  no++;.  for(i=0;
19140 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b   i<arraysize; i+
19150 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 79 70 65  +){.    if( type
19160 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  s[i]==0 ) contin
19170 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ue;.    fprintf(
19180 6f 75 74 2c 22 20 20 25 73 20 79 79 25 64 3b 5c  out,"  %s yy%d;\
19190 6e 22 2c 74 79 70 65 73 5b 69 5d 2c 69 2b 31 29  n",types[i],i+1)
191a0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
191b0 66 72 65 65 28 74 79 70 65 73 5b 69 5d 29 3b 0a  free(types[i]);.
191c0 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e    }.  if( lemp->
191d0 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74 20 29  errsym->useCnt )
191e0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
191f0 74 2c 22 20 20 69 6e 74 20 79 79 25 64 3b 5c 6e  t,"  int yy%d;\n
19200 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e  ",lemp->errsym->
19210 64 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  dtnum); lineno++
19220 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 73 74 64  ;.  }.  free(std
19230 64 74 29 3b 0a 20 20 66 72 65 65 28 74 79 70 65  dt);.  free(type
19240 73 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  s);.  fprintf(ou
19250 74 2c 22 7d 20 59 59 4d 49 4e 4f 52 54 59 50 45  t,"} YYMINORTYPE
19260 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
19270 0a 20 20 2a 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69  .  *plineno = li
19280 6e 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  neno;.}../*.** R
19290 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
192a0 66 20 61 20 43 20 64 61 74 61 74 79 70 65 20 61  f a C datatype a
192b0 62 6c 65 20 74 6f 20 72 65 70 72 65 73 65 6e 74  ble to represent
192c0 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 0a   values between.
192d0 2a 2a 20 6c 77 72 20 61 6e 64 20 75 70 72 2c 20  ** lwr and upr, 
192e0 69 6e 63 6c 75 73 69 76 65 2e 0a 2a 2f 0a 73 74  inclusive..*/.st
192f0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
19300 2a 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79  *minimum_size_ty
19310 70 65 28 69 6e 74 20 6c 77 72 2c 20 69 6e 74 20  pe(int lwr, int 
19320 75 70 72 29 7b 0a 20 20 69 66 28 20 6c 77 72 3e  upr){.  if( lwr>
19330 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 75 70  =0 ){.    if( up
19340 72 3c 3d 32 35 35 20 29 7b 0a 20 20 20 20 20 20  r<=255 ){.      
19350 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e 65 64  return "unsigned
19360 20 63 68 61 72 22 3b 0a 20 20 20 20 7d 65 6c 73   char";.    }els
19370 65 20 69 66 28 20 75 70 72 3c 36 35 35 33 35 20  e if( upr<65535 
19380 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
19390 22 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  "unsigned short 
193a0 69 6e 74 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  int";.    }else{
193b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 75  .      return "u
193c0 6e 73 69 67 6e 65 64 20 69 6e 74 22 3b 0a 20 20  nsigned int";.  
193d0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
193e0 6c 77 72 3e 3d 2d 31 32 37 20 26 26 20 75 70 72  lwr>=-127 && upr
193f0 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 72 65 74  <=127 ){.    ret
19400 75 72 6e 20 22 73 69 67 6e 65 64 20 63 68 61 72  urn "signed char
19410 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  ";.  }else if( l
19420 77 72 3e 3d 2d 33 32 37 36 37 20 26 26 20 75 70  wr>=-32767 && up
19430 72 3c 33 32 37 36 37 20 29 7b 0a 20 20 20 20 72  r<32767 ){.    r
19440 65 74 75 72 6e 20 22 73 68 6f 72 74 22 3b 0a 20  eturn "short";. 
19450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
19460 72 6e 20 22 69 6e 74 22 3b 0a 20 20 7d 0a 7d 0a  rn "int";.  }.}.
19470 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 73 74 61 74  ./*.** Each stat
19480 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 65 74  e contains a set
19490 20 6f 66 20 74 6f 6b 65 6e 20 74 72 61 6e 73 61   of token transa
194a0 63 74 69 6f 6e 20 61 6e 64 20 61 20 73 65 74 20  ction and a set 
194b0 6f 66 0a 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61  of.** nontermina
194c0 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  l transactions. 
194d0 20 45 61 63 68 20 6f 66 20 74 68 65 73 65 20 73   Each of these s
194e0 65 74 73 20 6d 61 6b 65 73 20 61 6e 20 69 6e 73  ets makes an ins
194f0 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20  tance.** of the 
19500 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
19510 75 72 65 2e 20 20 41 6e 20 61 72 72 61 79 20 6f  ure.  An array o
19520 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72  f these structur
19530 65 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f  es is used.** to
19540 20 6f 72 64 65 72 20 74 68 65 20 63 72 65 61 74   order the creat
19550 69 6f 6e 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ion of entries i
19560 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b  n the yy_action[
19570 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  ] table..*/.stru
19580 63 74 20 61 78 73 65 74 20 7b 0a 20 20 73 74 72  ct axset {.  str
19590 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20  uct state *stp; 
195a0 20 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74    /* A pointer t
195b0 6f 20 61 20 73 74 61 74 65 20 2a 2f 0a 20 20 69  o a state */.  i
195c0 6e 74 20 69 73 54 6b 6e 3b 20 20 20 20 20 20 20  nt isTkn;       
195d0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75      /* True to u
195e0 73 65 20 74 6f 6b 65 6e 73 2e 20 20 46 61 6c 73  se tokens.  Fals
195f0 65 20 66 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e  e for non-termin
19600 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63  als */.  int nAc
19610 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  tion;         /*
19620 20 4e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 6f   Number of actio
19630 6e 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ns */.};../*.** 
19640 43 6f 6d 70 61 72 65 20 74 6f 20 61 78 73 65 74  Compare to axset
19650 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20   structures for 
19660 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
19670 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
19680 78 73 65 74 5f 63 6f 6d 70 61 72 65 28 63 6f 6e  xset_compare(con
19690 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73  st void *a, cons
196a0 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 73 74  t void *b){.  st
196b0 72 75 63 74 20 61 78 73 65 74 20 2a 70 31 20 3d  ruct axset *p1 =
196c0 20 28 73 74 72 75 63 74 20 61 78 73 65 74 2a 29   (struct axset*)
196d0 61 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65  a;.  struct axse
196e0 74 20 2a 70 32 20 3d 20 28 73 74 72 75 63 74 20  t *p2 = (struct 
196f0 61 78 73 65 74 2a 29 62 3b 0a 20 20 72 65 74 75  axset*)b;.  retu
19700 72 6e 20 70 32 2d 3e 6e 41 63 74 69 6f 6e 20 2d  rn p2->nAction -
19710 20 70 31 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 7d 0a   p1->nAction;.}.
19720 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 65 78  ./*.** Write tex
19730 74 20 6f 6e 20 22 6f 75 74 22 20 74 68 61 74 20  t on "out" that 
19740 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72 75  describes the ru
19750 6c 65 20 22 72 70 22 2e 0a 2a 2f 0a 73 74 61 74  le "rp"..*/.stat
19760 69 63 20 76 6f 69 64 20 77 72 69 74 65 52 75 6c  ic void writeRul
19770 65 54 65 78 74 28 46 49 4c 45 20 2a 6f 75 74 2c  eText(FILE *out,
19780 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
19790 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 70  ){.  int j;.  fp
197a0 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 20 3a 3a  rintf(out,"%s ::
197b0 3d 22 2c 20 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d  =", rp->lhs->nam
197c0 65 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  e);.  for(j=0; j
197d0 3c 72 70 2d 3e 6e 72 68 73 3b 20 6a 2b 2b 29 7b  <rp->nrhs; j++){
197e0 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62  .    struct symb
197f0 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73  ol *sp = rp->rhs
19800 5b 6a 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  [j];.    fprintf
19810 28 6f 75 74 2c 22 20 25 73 22 2c 20 73 70 2d 3e  (out," %s", sp->
19820 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73  name);.    if( s
19830 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
19840 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
19850 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 66 6f 72  int k;.      for
19860 28 6b 3d 31 3b 20 6b 3c 73 70 2d 3e 6e 73 75 62  (k=1; k<sp->nsub
19870 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  sym; k++){.     
19880 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19890 7c 25 73 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b  |%s",sp->subsym[
198a0 6b 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  k]->name);.     
198b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
198c0 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 43 20 73  ./* Generate C s
198d0 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74  ource code for t
198e0 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69  he parser */.voi
198f0 64 20 52 65 70 6f 72 74 54 61 62 6c 65 28 6c 65  d ReportTable(le
19900 6d 70 2c 20 6d 68 66 6c 61 67 29 0a 73 74 72 75  mp, mhflag).stru
19910 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
19920 69 6e 74 20 6d 68 66 6c 61 67 3b 20 20 20 20 20  int mhflag;     
19930 2f 2a 20 4f 75 74 70 75 74 20 69 6e 20 6d 61 6b  /* Output in mak
19940 65 68 65 61 64 65 72 73 20 66 6f 72 6d 61 74 20  eheaders format 
19950 69 66 20 74 72 75 65 20 2a 2f 0a 7b 0a 20 20 46  if true */.{.  F
19960 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20  ILE *out, *in;. 
19970 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53   char line[LINES
19980 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 20 6c 69 6e  IZE];.  int  lin
19990 65 6e 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 74  eno;.  struct st
199a0 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
199b0 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20  ct action *ap;. 
199c0 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
199d0 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 74 61  ;.  struct actta
199e0 62 20 2a 70 41 63 74 74 61 62 3b 0a 20 20 69 6e  b *pActtab;.  in
199f0 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 63 68 61  t i, j, n;.  cha
19a00 72 20 2a 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6d  r *name;.  int m
19a10 6e 54 6b 6e 4f 66 73 74 2c 20 6d 78 54 6b 6e 4f  nTknOfst, mxTknO
19a20 66 73 74 3b 0a 20 20 69 6e 74 20 6d 6e 4e 74 4f  fst;.  int mnNtO
19a30 66 73 74 2c 20 6d 78 4e 74 4f 66 73 74 3b 0a 20  fst, mxNtOfst;. 
19a40 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 61   struct axset *a
19a50 78 3b 0a 0a 20 20 69 6e 20 3d 20 74 70 6c 74 5f  x;..  in = tplt_
19a60 6f 70 65 6e 28 6c 65 6d 70 29 3b 0a 20 20 69 66  open(lemp);.  if
19a70 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( in==0 ) return
19a80 3b 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f  ;.  out = file_o
19a90 70 65 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c 22 77  pen(lemp,".c","w
19aa0 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d  b");.  if( out==
19ab0 30 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28  0 ){.    fclose(
19ac0 69 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  in);.    return;
19ad0 0a 20 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20  .  }.  lineno = 
19ae0 31 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  1;.  tplt_xfer(l
19af0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
19b00 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
19b10 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 69 6e   Generate the in
19b20 63 6c 75 64 65 20 63 6f 64 65 2c 20 69 66 20 61  clude code, if a
19b30 6e 79 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ny */.  tplt_pri
19b40 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
19b50 2d 3e 69 6e 63 6c 75 64 65 2c 6c 65 6d 70 2d 3e  ->include,lemp->
19b60 69 6e 63 6c 75 64 65 6c 6e 2c 26 6c 69 6e 65 6e  includeln,&linen
19b70 6f 29 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67  o);.  if( mhflag
19b80 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 6e 61   ){.    char *na
19b90 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61  me = file_makena
19ba0 6d 65 28 6c 65 6d 70 2c 20 22 2e 68 22 29 3b 0a  me(lemp, ".h");.
19bb0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
19bc0 22 23 69 6e 63 6c 75 64 65 20 5c 22 25 73 5c 22  "#include \"%s\"
19bd0 5c 6e 22 2c 20 6e 61 6d 65 29 3b 20 6c 69 6e 65  \n", name); line
19be0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 6e  no++;.    free(n
19bf0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  ame);.  }.  tplt
19c00 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
19c10 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
19c20 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
19c30 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20 61 6c   #defines for al
19c40 6c 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 66  l tokens */.  if
19c50 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( mhflag ){.    
19c60 63 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20  char *prefix;.  
19c70 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
19c80 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29  if INTERFACE\n")
19c90 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
19ca0 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70  if( lemp->tokenp
19cb0 72 65 66 69 78 20 29 20 70 72 65 66 69 78 20 3d  refix ) prefix =
19cc0 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66   lemp->tokenpref
19cd0 69 78 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20  ix;.    else    
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cf0 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20  prefix = "";.   
19d00 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70   for(i=1; i<lemp
19d10 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b  ->nterminal; i++
19d20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
19d30 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
19d40 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65  %-30s %2d\n",pre
19d50 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  fix,lemp->symbol
19d60 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20  s[i]->name,i);. 
19d70 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20       lineno++;. 
19d80 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
19d90 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29  (out,"#endif\n")
19da0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
19db0 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
19dc0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
19dd0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
19de0 6e 65 72 61 74 65 20 74 68 65 20 64 65 66 69 6e  nerate the defin
19df0 65 73 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  es */.  fprintf(
19e00 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 43  out,"#define YYC
19e10 4f 44 45 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20  ODETYPE %s\n",. 
19e20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f     minimum_size_
19e30 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73  type(0, lemp->ns
19e40 79 6d 62 6f 6c 2b 35 29 29 3b 20 6c 69 6e 65 6e  ymbol+5)); linen
19e50 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
19e60 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 4f  ut,"#define YYNO
19e70 43 4f 44 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d  CODE %d\n",lemp-
19e80 3e 6e 73 79 6d 62 6f 6c 2b 31 29 3b 20 20 6c 69  >nsymbol+1);  li
19e90 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
19ea0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
19eb0 59 41 43 54 49 4f 4e 54 59 50 45 20 25 73 5c 6e  YACTIONTYPE %s\n
19ec0 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73  ",.    minimum_s
19ed0 69 7a 65 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70  ize_type(0, lemp
19ee0 2d 3e 6e 73 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e  ->nstate+lemp->n
19ef0 72 75 6c 65 2b 35 29 29 3b 20 20 6c 69 6e 65 6e  rule+5));  linen
19f00 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  o++;.  if( lemp-
19f10 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20  >wildcard ){.   
19f20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
19f30 65 66 69 6e 65 20 59 59 57 49 4c 44 43 41 52 44  efine YYWILDCARD
19f40 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6c   %d\n",.       l
19f50 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 2d 3e 69  emp->wildcard->i
19f60 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ndex); lineno++;
19f70 0a 20 20 7d 0a 20 20 70 72 69 6e 74 5f 73 74 61  .  }.  print_sta
19f80 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d  ck_union(out,lem
19f90 70 2c 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67  p,&lineno,mhflag
19fa0 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  );.  fprintf(out
19fb0 2c 20 22 23 69 66 6e 64 65 66 20 59 59 53 54 41  , "#ifndef YYSTA
19fc0 43 4b 44 45 50 54 48 5c 6e 22 29 3b 20 6c 69 6e  CKDEPTH\n"); lin
19fd0 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d  eno++;.  if( lem
19fe0 70 2d 3e 73 74 61 63 6b 73 69 7a 65 20 29 7b 0a  p->stacksize ){.
19ff0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1a000 22 23 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b  "#define YYSTACK
1a010 44 45 50 54 48 20 25 73 5c 6e 22 2c 6c 65 6d 70  DEPTH %s\n",lemp
1a020 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 20 20 6c  ->stacksize);  l
1a030 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65  ineno++;.  }else
1a040 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
1a050 74 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54 41  t,"#define YYSTA
1a060 43 4b 44 45 50 54 48 20 31 30 30 5c 6e 22 29 3b  CKDEPTH 100\n");
1a070 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a    lineno++;.  }.
1a080 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1a090 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65  #endif\n"); line
1a0a0 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c  no++;.  if( mhfl
1a0b0 61 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  ag ){.    fprint
1a0c0 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52  f(out,"#if INTER
1a0d0 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  FACE\n"); lineno
1a0e0 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d  ++;.  }.  name =
1a0f0 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65   lemp->name ? le
1a100 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73  mp->name : "Pars
1a110 65 22 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  e";.  if( lemp->
1a120 61 72 67 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67  arg && lemp->arg
1a130 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  [0] ){.    int i
1a140 3b 0a 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e  ;.    i = strlen
1a150 28 6c 65 6d 70 2d 3e 61 72 67 29 3b 0a 20 20 20  (lemp->arg);.   
1a160 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20   while( i>=1 && 
1a170 69 73 73 70 61 63 65 28 6c 65 6d 70 2d 3e 61 72  isspace(lemp->ar
1a180 67 5b 69 2d 31 5d 29 20 29 20 69 2d 2d 3b 0a 20  g[i-1]) ) i--;. 
1a190 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26     while( i>=1 &
1a1a0 26 20 28 69 73 61 6c 6e 75 6d 28 6c 65 6d 70 2d  & (isalnum(lemp-
1a1b0 3e 61 72 67 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65  >arg[i-1]) || le
1a1c0 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 3d 3d 27 5f  mp->arg[i-1]=='_
1a1d0 27 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20 66 70  ') ) i--;.    fp
1a1e0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1a1f0 6e 65 20 25 73 41 52 47 5f 53 44 45 43 4c 20 25  ne %sARG_SDECL %
1a200 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d  s;\n",name,lemp-
1a210 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  >arg);  lineno++
1a220 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1a230 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
1a240 5f 50 44 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61  _PDECL ,%s\n",na
1a250 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20  me,lemp->arg);  
1a260 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70  lineno++;.    fp
1a270 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1a280 6e 65 20 25 73 41 52 47 5f 46 45 54 43 48 20 25  ne %sARG_FETCH %
1a290 73 20 3d 20 79 79 70 50 61 72 73 65 72 2d 3e 25  s = yypParser->%
1a2a0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1a2b0 20 20 20 20 20 20 20 6e 61 6d 65 2c 6c 65 6d 70         name,lemp
1a2c0 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d 3e 61 72 67  ->arg,&lemp->arg
1a2d0 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  [i]);  lineno++;
1a2e0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1a2f0 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1a300 53 54 4f 52 45 20 79 79 70 50 61 72 73 65 72 2d  STORE yypParser-
1a310 3e 25 73 20 3d 20 25 73 5c 6e 22 2c 0a 20 20 20  >%s = %s\n",.   
1a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61                na
1a330 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d  me,&lemp->arg[i]
1a340 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b  ,&lemp->arg[i]);
1a350 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65    lineno++;.  }e
1a360 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  lse{.    fprintf
1a370 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1a380 41 52 47 5f 53 44 45 43 4c 5c 6e 22 2c 6e 61 6d  ARG_SDECL\n",nam
1a390 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  e);  lineno++;. 
1a3a0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1a3b0 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44  #define %sARG_PD
1a3c0 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c  ECL\n",name);  l
1a3d0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
1a3e0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1a3f0 65 20 25 73 41 52 47 5f 46 45 54 43 48 5c 6e 22  e %sARG_FETCH\n"
1a400 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ,name); lineno++
1a410 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1a420 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
1a430 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b  _STORE\n",name);
1a440 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1a450 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
1a460 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1a470 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65  #endif\n"); line
1a480 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69  no++;.  }.  fpri
1a490 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1a4a0 20 59 59 4e 53 54 41 54 45 20 25 64 5c 6e 22 2c   YYNSTATE %d\n",
1a4b0 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 29 3b 20 20  lemp->nstate);  
1a4c0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1a4d0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1a4e0 20 59 59 4e 52 55 4c 45 20 25 64 5c 6e 22 2c 6c   YYNRULE %d\n",l
1a4f0 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69  emp->nrule);  li
1a500 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65  neno++;.  if( le
1a510 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43  mp->errsym->useC
1a520 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  nt ){.    fprint
1a530 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1a540 59 45 52 52 4f 52 53 59 4d 42 4f 4c 20 25 64 5c  YERRORSYMBOL %d\
1a550 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d  n",lemp->errsym-
1a560 3e 69 6e 64 65 78 29 3b 20 20 6c 69 6e 65 6e 6f  >index);  lineno
1a570 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1a580 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45  out,"#define YYE
1a590 52 52 53 59 4d 44 54 20 79 79 25 64 5c 6e 22 2c  RRSYMDT yy%d\n",
1a5a0 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74  lemp->errsym->dt
1a5b0 6e 75 6d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  num);  lineno++;
1a5c0 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d  .  }.  if( lemp-
1a5d0 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b  >has_fallback ){
1a5e0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1a5f0 2c 22 23 64 65 66 69 6e 65 20 59 59 46 41 4c 4c  ,"#define YYFALL
1a600 42 41 43 4b 20 31 5c 6e 22 29 3b 20 20 6c 69 6e  BACK 1\n");  lin
1a610 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
1a620 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1a630 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1a640 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1a650 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  e the action tab
1a660 6c 65 20 61 6e 64 20 69 74 73 20 61 73 73 6f 63  le and its assoc
1a670 69 61 74 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  iates:.  **.  **
1a680 20 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 20 20    yy_action[]   
1a690 20 20 20 20 20 41 20 73 69 6e 67 6c 65 20 74 61       A single ta
1a6a0 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  ble containing a
1a6b0 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a  ll actions..  **
1a6c0 20 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d    yy_lookahead[]
1a6d0 20 20 20 20 20 41 20 74 61 62 6c 65 20 63 6f 6e       A table con
1a6e0 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 6b  taining the look
1a6f0 61 68 65 61 64 20 66 6f 72 20 65 61 63 68 20 65  ahead for each e
1a700 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 20 20 20  ntry in.  **    
1a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a720 20 79 79 5f 61 63 74 69 6f 6e 2e 20 20 55 73 65   yy_action.  Use
1a730 64 20 74 6f 20 64 65 74 65 63 74 20 68 61 73 68  d to detect hash
1a740 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a   collisions..  *
1a750 2a 20 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74  *  yy_shift_ofst
1a760 5b 5d 20 20 20 20 46 6f 72 20 65 61 63 68 20 73  []    For each s
1a770 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74  tate, the offset
1a780 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20   into yy_action 
1a790 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  for.  **        
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 69               shi
1a7b0 66 74 69 6e 67 20 74 65 72 6d 69 6e 61 6c 73 2e  fting terminals.
1a7c0 0a 20 20 2a 2a 20 20 79 79 5f 72 65 64 75 63 65  .  **  yy_reduce
1a7d0 5f 6f 66 73 74 5b 5d 20 20 20 46 6f 72 20 65 61  _ofst[]   For ea
1a7e0 63 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66  ch state, the of
1a7f0 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74  fset into yy_act
1a800 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20  ion for.  **    
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a820 20 73 68 69 66 74 69 6e 67 20 6e 6f 6e 2d 74 65   shifting non-te
1a830 72 6d 69 6e 61 6c 73 20 61 66 74 65 72 20 61 20  rminals after a 
1a840 72 65 64 75 63 65 2e 0a 20 20 2a 2a 20 20 79 79  reduce..  **  yy
1a850 5f 64 65 66 61 75 6c 74 5b 5d 20 20 20 20 20 20  _default[]      
1a860 20 44 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20   Default action 
1a870 66 6f 72 20 65 61 63 68 20 73 74 61 74 65 2e 0a  for each state..
1a880 20 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75    */..  /* Compu
1a890 74 65 20 74 68 65 20 61 63 74 69 6f 6e 73 20 6f  te the actions o
1a8a0 6e 20 61 6c 6c 20 73 74 61 74 65 73 20 61 6e 64  n all states and
1a8b0 20 63 6f 75 6e 74 20 74 68 65 6d 20 75 70 20 2a   count them up *
1a8c0 2f 0a 20 20 61 78 20 3d 20 63 61 6c 6c 6f 63 28  /.  ax = calloc(
1a8d0 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 2c 20  lemp->nstate*2, 
1a8e0 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 29 3b 0a  sizeof(ax[0]));.
1a8f0 20 20 69 66 28 20 61 78 3d 3d 30 20 29 7b 0a 20    if( ax==0 ){. 
1a900 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1a910 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  r,"malloc failed
1a920 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
1a930 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
1a940 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
1a950 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
1a960 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
1a970 5d 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 73  ];.    ax[i*2].s
1a980 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78  tp = stp;.    ax
1a990 5b 69 2a 32 5d 2e 69 73 54 6b 6e 20 3d 20 31 3b  [i*2].isTkn = 1;
1a9a0 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 6e 41 63  .    ax[i*2].nAc
1a9b0 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 54 6b 6e  tion = stp->nTkn
1a9c0 41 63 74 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b  Act;.    ax[i*2+
1a9d0 31 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20  1].stp = stp;.  
1a9e0 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 69 73 54 6b    ax[i*2+1].isTk
1a9f0 6e 20 3d 20 30 3b 0a 20 20 20 20 61 78 5b 69 2a  n = 0;.    ax[i*
1aa00 32 2b 31 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73  2+1].nAction = s
1aa10 74 70 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20 7d 0a  tp->nNtAct;.  }.
1aa20 20 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20 6d 6e    mxTknOfst = mn
1aa30 54 6b 6e 4f 66 73 74 20 3d 20 30 3b 0a 20 20 6d  TknOfst = 0;.  m
1aa40 78 4e 74 4f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66  xNtOfst = mnNtOf
1aa50 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  st = 0;..  /* Co
1aa60 6d 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e  mpute the action
1aa70 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 72 64 65   table.  In orde
1aa80 72 20 74 6f 20 74 72 79 20 74 6f 20 6b 65 65 70  r to try to keep
1aa90 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1aaa0 0a 20 20 2a 2a 20 61 63 74 69 6f 6e 20 74 61 62  .  ** action tab
1aab0 6c 65 20 74 6f 20 61 20 6d 69 6e 69 6d 75 6d 2c  le to a minimum,
1aac0 20 74 68 65 20 68 65 75 72 69 73 74 69 63 20 6f   the heuristic o
1aad0 66 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6c 61  f placing the la
1aae0 72 67 65 73 74 20 61 63 74 69 6f 6e 0a 20 20 2a  rgest action.  *
1aaf0 2a 20 73 65 74 73 20 66 69 72 73 74 20 69 73 20  * sets first is 
1ab00 75 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 71 73 6f  used..  */.  qso
1ab10 72 74 28 61 78 2c 20 6c 65 6d 70 2d 3e 6e 73 74  rt(ax, lemp->nst
1ab20 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66 28 61 78  ate*2, sizeof(ax
1ab30 5b 30 5d 29 2c 20 61 78 73 65 74 5f 63 6f 6d 70  [0]), axset_comp
1ab40 61 72 65 29 3b 0a 20 20 70 41 63 74 74 61 62 20  are);.  pActtab 
1ab50 3d 20 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28 29  = acttab_alloc()
1ab60 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
1ab70 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 20 26 26  emp->nstate*2 &&
1ab80 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e 3e 30   ax[i].nAction>0
1ab90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
1aba0 3d 20 61 78 5b 69 5d 2e 73 74 70 3b 0a 20 20 20  = ax[i].stp;.   
1abb0 20 69 66 28 20 61 78 5b 69 5d 2e 69 73 54 6b 6e   if( ax[i].isTkn
1abc0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 61 70   ){.      for(ap
1abd0 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
1abe0 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
1abf0 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a      int action;.
1ac00 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e          if( ap->
1ac10 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65 6d 70 2d  sp->index>=lemp-
1ac20 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e  >nterminal ) con
1ac30 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
1ac40 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f  ction = compute_
1ac50 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29  action(lemp, ap)
1ac60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63  ;.        if( ac
1ac70 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75  tion<0 ) continu
1ac80 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74 61  e;.        actta
1ac90 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62  b_action(pActtab
1aca0 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c  , ap->sp->index,
1acb0 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20   action);.      
1acc0 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 54 6b  }.      stp->iTk
1acd0 6e 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69  nOfst = acttab_i
1ace0 6e 73 65 72 74 28 70 41 63 74 74 61 62 29 3b 0a  nsert(pActtab);.
1acf0 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69        if( stp->i
1ad00 54 6b 6e 4f 66 73 74 3c 6d 6e 54 6b 6e 4f 66 73  TknOfst<mnTknOfs
1ad10 74 20 29 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20  t ) mnTknOfst = 
1ad20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20  stp->iTknOfst;. 
1ad30 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 54       if( stp->iT
1ad40 6b 6e 4f 66 73 74 3e 6d 78 54 6b 6e 4f 66 73 74  knOfst>mxTknOfst
1ad50 20 29 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20 73   ) mxTknOfst = s
1ad60 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20  tp->iTknOfst;.  
1ad70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
1ad80 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61  or(ap=stp->ap; a
1ad90 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
1ada0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 63 74  .        int act
1adb0 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ion;.        if(
1adc0 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c   ap->sp->index<l
1add0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29  emp->nterminal )
1ade0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1adf0 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69     if( ap->sp->i
1ae00 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e 6e 73 79 6d  ndex==lemp->nsym
1ae10 62 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  bol ) continue;.
1ae20 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 20 3d          action =
1ae30 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28   compute_action(
1ae40 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20  lemp, ap);.     
1ae50 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20     if( action<0 
1ae60 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1ae70 20 20 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f      acttab_actio
1ae80 6e 28 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73  n(pActtab, ap->s
1ae90 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e  p->index, action
1aea0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1aeb0 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20   stp->iNtOfst = 
1aec0 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70 41  acttab_insert(pA
1aed0 63 74 74 61 62 29 3b 0a 20 20 20 20 20 20 69 66  cttab);.      if
1aee0 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3c 6d  ( stp->iNtOfst<m
1aef0 6e 4e 74 4f 66 73 74 20 29 20 6d 6e 4e 74 4f 66  nNtOfst ) mnNtOf
1af00 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73  st = stp->iNtOfs
1af10 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70  t;.      if( stp
1af20 2d 3e 69 4e 74 4f 66 73 74 3e 6d 78 4e 74 4f 66  ->iNtOfst>mxNtOf
1af30 73 74 20 29 20 6d 78 4e 74 4f 66 73 74 20 3d 20  st ) mxNtOfst = 
1af40 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20  stp->iNtOfst;.  
1af50 20 20 7d 0a 20 20 7d 0a 20 20 66 72 65 65 28 61    }.  }.  free(a
1af60 78 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  x);..  /* Output
1af70 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74   the yy_action t
1af80 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74  able */.  fprint
1af90 66 28 6f 75 74 2c 22 73 74 61 74 69 63 20 63 6f  f(out,"static co
1afa0 6e 73 74 20 59 59 41 43 54 49 4f 4e 54 59 50 45  nst YYACTIONTYPE
1afb0 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 3d 20 7b   yy_action[] = {
1afc0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1afd0 20 20 6e 20 3d 20 61 63 74 74 61 62 5f 73 69 7a    n = acttab_siz
1afe0 65 28 70 41 63 74 74 61 62 29 3b 0a 20 20 66 6f  e(pActtab);.  fo
1aff0 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
1b000 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 63 74 69  +){.    int acti
1b010 6f 6e 20 3d 20 61 63 74 74 61 62 5f 79 79 61 63  on = acttab_yyac
1b020 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 69 29  tion(pActtab, i)
1b030 3b 0a 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e  ;.    if( action
1b040 3c 30 20 29 20 61 63 74 69 6f 6e 20 3d 20 6c 65  <0 ) action = le
1b050 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d  mp->nstate + lem
1b060 70 2d 3e 6e 72 75 6c 65 20 2b 20 32 3b 0a 20 20  p->nrule + 2;.  
1b070 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72    if( j==0 ) fpr
1b080 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35  intf(out," /* %5
1b090 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20  d */ ", i);.    
1b0a0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
1b0b0 34 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b 0a 20  4d,", action);. 
1b0c0 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69     if( j==9 || i
1b0d0 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66  ==n-1 ){.      f
1b0e0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
1b0f0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1b100 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65     j = 0;.    }e
1b110 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a  lse{.      j++;.
1b120 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69      }.  }.  fpri
1b130 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29  ntf(out, "};\n")
1b140 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f  ; lineno++;..  /
1b150 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f  * Output the yy_
1b160 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c 65 20  lookahead table 
1b170 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
1b180 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59  ,"static const Y
1b190 59 43 4f 44 45 54 59 50 45 20 79 79 5f 6c 6f 6f  YCODETYPE yy_loo
1b1a0 6b 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e 22 29  kahead[] = {\n")
1b1b0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f  ; lineno++;.  fo
1b1c0 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
1b1d0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61 20 3d  +){.    int la =
1b1e0 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61 68   acttab_yylookah
1b1f0 65 61 64 28 70 41 63 74 74 61 62 2c 20 69 29 3b  ead(pActtab, i);
1b200 0a 20 20 20 20 69 66 28 20 6c 61 3c 30 20 29 20  .    if( la<0 ) 
1b210 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  la = lemp->nsymb
1b220 6f 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30  ol;.    if( j==0
1b230 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
1b240 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29   /* %5d */ ", i)
1b250 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1b260 74 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61 29 3b  t, " %4d,", la);
1b270 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
1b280 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
1b290 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
1b2a0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1b2b0 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
1b2c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
1b2d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
1b2e0 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
1b2f0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
1b300 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79   /* Output the y
1b310 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 74  y_shift_ofst[] t
1b320 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74  able */.  fprint
1b330 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
1b340 59 59 5f 53 48 49 46 54 5f 55 53 45 5f 44 46 4c  YY_SHIFT_USE_DFL
1b350 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b 6e  T (%d)\n", mnTkn
1b360 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b  Ofst-1); lineno+
1b370 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e  +;.  n = lemp->n
1b380 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20  state;.  while( 
1b390 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72  n>0 && lemp->sor
1b3a0 74 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b 6e 4f 66  ted[n-1]->iTknOf
1b3b0 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20  st==NO_OFFSET ) 
1b3c0 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  n--;.  fprintf(o
1b3d0 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f  ut, "#define YY_
1b3e0 53 48 49 46 54 5f 4d 41 58 20 25 64 5c 6e 22 2c  SHIFT_MAX %d\n",
1b3f0 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b   n-1); lineno++;
1b400 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1b410 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25 73  "static const %s
1b420 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d   yy_shift_ofst[]
1b430 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20 20 20   = {\n", .      
1b440 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65      minimum_size
1b450 5f 74 79 70 65 28 6d 6e 54 6b 6e 4f 66 73 74 2d  _type(mnTknOfst-
1b460 31 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 29 3b 20  1, mxTknOfst)); 
1b470 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28  lineno++;.  for(
1b480 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
1b490 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a  {.    int ofst;.
1b4a0 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
1b4b0 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f  sorted[i];.    o
1b4c0 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f  fst = stp->iTknO
1b4d0 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f 66 73  fst;.    if( ofs
1b4e0 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6f  t==NO_OFFSET ) o
1b4f0 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20  fst = mnTknOfst 
1b500 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  - 1;.    if( j==
1b510 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
1b520 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
1b530 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1b540 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66 73  ut, " %4d,", ofs
1b550 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39  t);.    if( j==9
1b560 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20   || i==n-1 ){.  
1b570 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b580 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   "\n"); lineno++
1b590 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20  ;.      j = 0;. 
1b5a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b5b0 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  j++;.    }.  }. 
1b5c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d   fprintf(out, "}
1b5d0 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1b5e0 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
1b5f0 65 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74  e yy_reduce_ofst
1b600 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70  [] table */.  fp
1b610 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
1b620 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 55 53  ine YY_REDUCE_US
1b630 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20  E_DFLT (%d)\n", 
1b640 6d 6e 4e 74 4f 66 73 74 2d 31 29 3b 20 6c 69 6e  mnNtOfst-1); lin
1b650 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d  eno++;.  n = lem
1b660 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68 69  p->nstate;.  whi
1b670 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d  le( n>0 && lemp-
1b680 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 4e  >sorted[n-1]->iN
1b690 74 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54  tOfst==NO_OFFSET
1b6a0 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74   ) n--;.  fprint
1b6b0 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
1b6c0 59 59 5f 52 45 44 55 43 45 5f 4d 41 58 20 25 64  YY_REDUCE_MAX %d
1b6d0 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e  \n", n-1); linen
1b6e0 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1b6f0 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73  ut, "static cons
1b700 74 20 25 73 20 79 79 5f 72 65 64 75 63 65 5f 6f  t %s yy_reduce_o
1b710 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20  fst[] = {\n", . 
1b720 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d           minimum
1b730 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 4e 74 4f  _size_type(mnNtO
1b740 66 73 74 2d 31 2c 20 6d 78 4e 74 4f 66 73 74 29  fst-1, mxNtOfst)
1b750 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1b760 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
1b770 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73  ++){.    int ofs
1b780 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  t;.    stp = lem
1b790 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
1b7a0 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e    ofst = stp->iN
1b7b0 74 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f  tOfst;.    if( o
1b7c0 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29  fst==NO_OFFSET )
1b7d0 20 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74   ofst = mnNtOfst
1b7e0 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d   - 1;.    if( j=
1b7f0 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
1b800 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
1b810 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
1b820 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66  out, " %4d,", of
1b830 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  st);.    if( j==
1b840 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20  9 || i==n-1 ){. 
1b850 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1b860 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  , "\n"); lineno+
1b870 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  +;.      j = 0;.
1b880 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b890 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
1b8a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1b8b0 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  };\n"); lineno++
1b8c0 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
1b8d0 68 65 20 64 65 66 61 75 6c 74 20 61 63 74 69 6f  he default actio
1b8e0 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72  n table */.  fpr
1b8f0 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69  intf(out, "stati
1b900 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e  c const YYACTION
1b910 54 59 50 45 20 79 79 5f 64 65 66 61 75 6c 74 5b  TYPE yy_default[
1b920 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ] = {\n"); linen
1b930 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d  o++;.  n = lemp-
1b940 3e 6e 73 74 61 74 65 3b 0a 20 20 66 6f 72 28 69  >nstate;.  for(i
1b950 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
1b960 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
1b970 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
1b980 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e  if( j==0 ) fprin
1b990 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20  tf(out," /* %5d 
1b9a0 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70  */ ", i);.    fp
1b9b0 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64  rintf(out, " %4d
1b9c0 2c 22 2c 20 73 74 70 2d 3e 69 44 66 6c 74 29 3b  ,", stp->iDflt);
1b9d0 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
1b9e0 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
1b9f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
1ba00 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1ba10 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
1ba20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
1ba30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
1ba40 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
1ba50 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1ba60 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1ba70 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1ba80 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1ba90 72 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f  rate the table o
1baa0 66 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e  f fallback token
1bab0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65  s..  */.  if( le
1bac0 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b  mp->has_fallback
1bad0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
1bae0 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e   i<lemp->ntermin
1baf0 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  al; i++){.      
1bb00 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 70  struct symbol *p
1bb10 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
1bb20 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
1bb30 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b  ->fallback==0 ){
1bb40 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1bb50 28 6f 75 74 2c 20 22 20 20 20 20 30 2c 20 20 2f  (out, "    0,  /
1bb60 2a 20 25 31 30 73 20 3d 3e 20 6e 6f 74 68 69 6e  * %10s => nothin
1bb70 67 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 6e 61 6d 65  g */\n", p->name
1bb80 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1bb90 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1bba0 6f 75 74 2c 20 22 20 20 25 33 64 2c 20 20 2f 2a  out, "  %3d,  /*
1bbb0 20 25 31 30 73 20 3d 3e 20 25 73 20 2a 2f 5c 6e   %10s => %s */\n
1bbc0 22 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e  ", p->fallback->
1bbd0 69 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 20 20  index,.         
1bbe0 20 70 2d 3e 6e 61 6d 65 2c 20 70 2d 3e 66 61 6c   p->name, p->fal
1bbf0 6c 62 61 63 6b 2d 3e 6e 61 6d 65 29 3b 0a 20 20  lback->name);.  
1bc00 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 69 6e 65      }.      line
1bc10 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  no++;.    }.  }.
1bc20 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1bc30 2d 3e 6e 61 6d 65 2c 20 69 6e 2c 20 6f 75 74 2c  ->name, in, out,
1bc40 20 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a   &lineno);..  /*
1bc50 20 47 65 6e 65 72 61 74 65 20 61 20 74 61 62 6c   Generate a tabl
1bc60 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
1bc70 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 6f   symbolic name o
1bc80 66 20 65 76 65 72 79 20 73 79 6d 62 6f 6c 0a 20  f every symbol. 
1bc90 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
1bca0 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
1bcb0 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72 69 6e 74  i++){.    sprint
1bcc0 66 28 6c 69 6e 65 2c 22 5c 22 25 73 5c 22 2c 22  f(line,"\"%s\","
1bcd0 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
1bce0 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66 70  ]->name);.    fp
1bcf0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 2d 31  rintf(out,"  %-1
1bd00 35 73 22 2c 6c 69 6e 65 29 3b 0a 20 20 20 20 69  5s",line);.    i
1bd10 66 28 20 28 69 26 33 29 3d 3d 33 20 29 7b 20 66  f( (i&3)==3 ){ f
1bd20 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29  printf(out,"\n")
1bd30 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20  ; lineno++; }.  
1bd40 7d 0a 20 20 69 66 28 20 28 69 26 33 29 21 3d 30  }.  if( (i&3)!=0
1bd50 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c   ){ fprintf(out,
1bd60 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1bd70 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
1bd80 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1bd90 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1bda0 20 47 65 6e 65 72 61 74 65 20 61 20 74 61 62 6c   Generate a tabl
1bdb0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74  e containing a t
1bdc0 65 78 74 20 73 74 72 69 6e 67 20 74 68 61 74 20  ext string that 
1bdd0 64 65 73 63 72 69 62 65 73 20 65 76 65 72 79 0a  describes every.
1bde0 20 20 2a 2a 20 72 75 6c 65 20 69 6e 20 74 68 65    ** rule in the
1bdf0 20 72 75 6c 65 20 73 65 74 20 6f 66 20 74 68 65   rule set of the
1be00 20 67 72 61 6d 6d 65 72 2e 20 20 54 68 69 73 20   grammer.  This 
1be10 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
1be20 73 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 72  sed.  ** when tr
1be30 61 63 69 6e 67 20 52 45 44 55 43 45 20 61 63 74  acing REDUCE act
1be40 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
1be50 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 70 2d 3e 72  (i=0, rp=lemp->r
1be60 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
1be70 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  next, i++){.    
1be80 61 73 73 65 72 74 28 20 72 70 2d 3e 69 6e 64 65  assert( rp->inde
1be90 78 3d 3d 69 20 29 3b 0a 20 20 20 20 66 70 72 69  x==i );.    fpri
1bea0 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 33 64  ntf(out," /* %3d
1beb0 20 2a 2f 20 5c 22 22 2c 20 69 29 3b 0a 20 20 20   */ \"", i);.   
1bec0 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f   writeRuleText(o
1bed0 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72  ut, rp);.    fpr
1bee0 69 6e 74 66 28 6f 75 74 2c 22 5c 22 2c 5c 6e 22  intf(out,"\",\n"
1bef0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1bf00 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1bf10 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1bf20 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1bf30 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
1bf40 63 68 20 65 78 65 63 75 74 65 73 20 65 76 65 72  ch executes ever
1bf50 79 20 74 69 6d 65 20 61 20 73 79 6d 62 6f 6c 20  y time a symbol 
1bf60 69 73 20 70 6f 70 70 65 64 20 66 72 6f 6d 0a 20  is popped from. 
1bf70 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 20 77 68   ** the stack wh
1bf80 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 65  ile processing e
1bf90 72 72 6f 72 73 20 6f 72 20 77 68 69 6c 65 20 64  rrors or while d
1bfa0 65 73 74 72 6f 79 69 6e 67 20 74 68 65 20 70 61  estroying the pa
1bfb0 72 73 65 72 2e 20 0a 20 20 2a 2a 20 28 49 6e 20  rser. .  ** (In 
1bfc0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 67 65 6e  other words, gen
1bfd0 65 72 61 74 65 20 74 68 65 20 25 64 65 73 74 72  erate the %destr
1bfe0 75 63 74 6f 72 20 61 63 74 69 6f 6e 73 29 0a 20  uctor actions). 
1bff0 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
1c000 74 6f 6b 65 6e 64 65 73 74 20 29 7b 0a 20 20 20  tokendest ){.   
1c010 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1c020 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
1c030 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79  .      struct sy
1c040 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d  mbol *sp = lemp-
1c050 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
1c060 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20     if( sp==0 || 
1c070 73 70 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e  sp->type!=TERMIN
1c080 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  AL ) continue;. 
1c090 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1c0a0 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f  ,"    case %d: /
1c0b0 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20  * %s */\n",.    
1c0c0 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 69 6e            sp->in
1c0d0 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20  dex, sp->name); 
1c0e0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
1c0f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c      for(i=0; i<l
1c100 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 26 26 20  emp->nsymbol && 
1c110 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
1c120 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c  ->type!=TERMINAL
1c130 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20  ; i++);.    if( 
1c140 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  i<lemp->nsymbol 
1c150 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65  ){.      emit_de
1c160 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75  structor_code(ou
1c170 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  t,lemp->symbols[
1c180 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  i],lemp,&lineno)
1c190 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
1c1a0 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b  out,"      break
1c1b0 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1c1c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1c1d0 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29   lemp->vardest )
1c1e0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  {.    struct sym
1c1f0 62 6f 6c 20 2a 64 66 6c 74 5f 73 70 20 3d 20 30  bol *dflt_sp = 0
1c200 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1c210 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
1c220 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
1c230 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
1c240 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
1c250 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d  ;.      if( sp==
1c260 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54  0 || sp->type==T
1c270 45 52 4d 49 4e 41 4c 20 7c 7c 0a 20 20 20 20 20  ERMINAL ||.     
1c280 20 20 20 20 20 73 70 2d 3e 69 6e 64 65 78 3c 3d       sp->index<=
1c290 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63  0 || sp->destruc
1c2a0 74 6f 72 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  tor!=0 ) continu
1c2b0 65 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  e;.      fprintf
1c2c0 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25  (out,"    case %
1c2d0 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a  d: /* %s */\n",.
1c2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 70                sp
1c2f0 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d  ->index, sp->nam
1c300 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
1c310 20 20 20 20 64 66 6c 74 5f 73 70 20 3d 20 73 70      dflt_sp = sp
1c320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1c330 64 66 6c 74 5f 73 70 21 3d 30 20 29 7b 0a 20 20  dflt_sp!=0 ){.  
1c340 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63      emit_destruc
1c350 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 64 66 6c  tor_code(out,dfl
1c360 74 5f 73 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e  t_sp,lemp,&linen
1c370 6f 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  o);.      fprint
1c380 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65  f(out,"      bre
1c390 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ak;\n"); lineno+
1c3a0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  +;.    }.  }.  f
1c3b0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1c3c0 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
1c3d0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
1c3e0 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d   *sp = lemp->sym
1c3f0 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28  bols[i];.    if(
1c400 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79   sp==0 || sp->ty
1c410 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 20  pe==TERMINAL || 
1c420 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3d 3d  sp->destructor==
1c430 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1c440 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1c450 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25     case %d: /* %
1c460 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s */\n",.       
1c470 20 20 20 20 20 73 70 2d 3e 69 6e 64 65 78 2c 20       sp->index, 
1c480 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  sp->name); linen
1c490 6f 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  o++;..    /* Com
1c4a0 62 69 6e 65 20 64 75 70 6c 69 63 61 74 65 20 64  bine duplicate d
1c4b0 65 73 74 72 75 63 74 6f 72 73 20 69 6e 74 6f 20  estructors into 
1c4c0 61 20 73 69 6e 67 6c 65 20 63 61 73 65 20 2a 2f  a single case */
1c4d0 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20  .    for(j=i+1; 
1c4e0 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  j<lemp->nsymbol;
1c4f0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   j++){.      str
1c500 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 32 20  uct symbol *sp2 
1c510 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
1c520 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70  j];.      if( sp
1c530 32 20 26 26 20 73 70 32 2d 3e 74 79 70 65 21 3d  2 && sp2->type!=
1c540 54 45 52 4d 49 4e 41 4c 20 26 26 20 73 70 32 2d  TERMINAL && sp2-
1c550 3e 64 65 73 74 72 75 63 74 6f 72 0a 20 20 20 20  >destructor.    
1c560 20 20 20 20 20 20 26 26 20 73 70 32 2d 3e 64 74        && sp2->dt
1c570 6e 75 6d 3d 3d 73 70 2d 3e 64 74 6e 75 6d 0a 20  num==sp->dtnum. 
1c580 20 20 20 20 20 20 20 20 20 26 26 20 73 74 72 63           && strc
1c590 6d 70 28 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  mp(sp->destructo
1c5a0 72 2c 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f  r,sp2->destructo
1c5b0 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  r)==0 ){.       
1c5c0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1c5d0 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25     case %d: /* %
1c5e0 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s */\n",.       
1c5f0 20 20 20 20 20 20 20 20 20 20 73 70 32 2d 3e 69            sp2->i
1c600 6e 64 65 78 2c 20 73 70 32 2d 3e 6e 61 6d 65 29  ndex, sp2->name)
1c610 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1c620 20 20 20 20 20 73 70 32 2d 3e 64 65 73 74 72 75       sp2->destru
1c630 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ctor = 0;.      
1c640 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6d 69  }.    }..    emi
1c650 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64  t_destructor_cod
1c660 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62  e(out,lemp->symb
1c670 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e  ols[i],lemp,&lin
1c680 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  eno);.    fprint
1c690 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65  f(out,"      bre
1c6a0 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ak;\n"); lineno+
1c6b0 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
1c6c0 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1c6d0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1c6e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1c6f0 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
1c700 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 70  s whenever the p
1c710 61 72 73 65 72 20 73 74 61 63 6b 20 6f 76 65 72  arser stack over
1c720 66 6c 6f 77 73 20 2a 2f 0a 20 20 74 70 6c 74 5f  flows */.  tplt_
1c730 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
1c740 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77 2c 6c 65  emp->overflow,le
1c750 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77 6c 6e 2c 26  mp->overflowln,&
1c760 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f  lineno);.  tplt_
1c770 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1c780 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1c790 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1c7a0 74 68 65 20 74 61 62 6c 65 20 6f 66 20 72 75 6c  the table of rul
1c7b0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 20  e information . 
1c7c0 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20 54   **.  ** Note: T
1c7d0 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
1c7e0 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
1c7f0 74 20 72 75 6c 65 73 20 61 72 65 20 6e 75 6d 62  t rules are numb
1c800 65 72 0a 20 20 2a 2a 20 73 65 71 75 65 6e 74 75  er.  ** sequentu
1c810 61 6c 6c 79 20 62 65 67 69 6e 6e 69 6e 67 20 77  ally beginning w
1c820 69 74 68 20 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ith 0..  */.  fo
1c830 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
1c840 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
1c850 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1c860 75 74 2c 22 20 20 7b 20 25 64 2c 20 25 64 20 7d  ut,"  { %d, %d }
1c870 2c 5c 6e 22 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e  ,\n",rp->lhs->in
1c880 64 65 78 2c 72 70 2d 3e 6e 72 68 73 29 3b 20 6c  dex,rp->nrhs); l
1c890 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
1c8a0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1c8b0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1c8c0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1c8d0 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
1c8e0 78 65 63 75 74 69 6f 6e 20 64 75 72 69 6e 67 20  xecution during 
1c8f0 65 61 63 68 20 52 45 44 55 43 45 20 61 63 74 69  each REDUCE acti
1c900 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c  on */.  for(rp=l
1c910 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
1c920 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
1c930 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28   translate_code(
1c940 6c 65 6d 70 2c 20 72 70 29 3b 0a 20 20 7d 0a 20  lemp, rp);.  }. 
1c950 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
1c960 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
1c970 65 78 74 29 7b 0a 20 20 20 20 73 74 72 75 63 74  ext){.    struct
1c980 20 72 75 6c 65 20 2a 72 70 32 3b 0a 20 20 20 20   rule *rp2;.    
1c990 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20  if( rp->code==0 
1c9a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1c9b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1c9c0 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 22     case %d: /* "
1c9d0 2c 20 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20  , rp->index);.  
1c9e0 20 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28    writeRuleText(
1c9f0 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66 70  out, rp);.    fp
1ca00 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f 5c  rintf(out, " */\
1ca10 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1ca20 20 20 20 66 6f 72 28 72 70 32 3d 72 70 2d 3e 6e     for(rp2=rp->n
1ca30 65 78 74 3b 20 72 70 32 3b 20 72 70 32 3d 72 70  ext; rp2; rp2=rp
1ca40 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  2->next){.      
1ca50 69 66 28 20 72 70 32 2d 3e 63 6f 64 65 3d 3d 72  if( rp2->code==r
1ca60 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 20 20  p->code ){.     
1ca70 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1ca80 20 20 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f        case %d: /
1ca90 2a 20 22 2c 20 72 70 32 2d 3e 69 6e 64 65 78 29  * ", rp2->index)
1caa0 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 52  ;.        writeR
1cab0 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 32  uleText(out, rp2
1cac0 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
1cad0 74 66 28 6f 75 74 2c 22 20 2a 2f 5c 6e 22 29 3b  tf(out," */\n");
1cae0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
1caf0 20 20 20 72 70 32 2d 3e 63 6f 64 65 20 3d 20 30     rp2->code = 0
1cb00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cb10 20 20 20 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75      emit_code(ou
1cb20 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e  t,rp,lemp,&linen
1cb30 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  o);.    fprintf(
1cb40 6f 75 74 2c 22 20 20 20 20 20 20 20 20 62 72 65  out,"        bre
1cb50 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ak;\n"); lineno+
1cb60 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
1cb70 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1cb80 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1cb90 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1cba0 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
1cbb0 73 20 69 66 20 61 20 70 61 72 73 65 20 66 61 69  s if a parse fai
1cbc0 6c 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ls */.  tplt_pri
1cbd0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1cbe0 2d 3e 66 61 69 6c 75 72 65 2c 6c 65 6d 70 2d 3e  ->failure,lemp->
1cbf0 66 61 69 6c 75 72 65 6c 6e 2c 26 6c 69 6e 65 6e  failureln,&linen
1cc00 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  o);.  tplt_xfer(
1cc10 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1cc20 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1cc30 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1cc40 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
1cc50 68 65 6e 20 61 20 73 79 6e 74 61 78 20 65 72 72  hen a syntax err
1cc60 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 74  or occurs */.  t
1cc70 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
1cc80 6d 70 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 2c 6c  mp,lemp->error,l
1cc90 65 6d 70 2d 3e 65 72 72 6f 72 6c 6e 2c 26 6c 69  emp->errorln,&li
1cca0 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66  neno);.  tplt_xf
1ccb0 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1ccc0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1ccd0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1cce0 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
1ccf0 73 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65  s when the parse
1cd00 72 20 61 63 63 65 70 74 73 20 69 74 73 20 69 6e  r accepts its in
1cd10 70 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72  put */.  tplt_pr
1cd20 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d  int(out,lemp,lem
1cd30 70 2d 3e 61 63 63 65 70 74 2c 6c 65 6d 70 2d 3e  p->accept,lemp->
1cd40 61 63 63 65 70 74 6c 6e 2c 26 6c 69 6e 65 6e 6f  acceptln,&lineno
1cd50 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
1cd60 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1cd70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1cd80 20 41 70 70 65 6e 64 20 61 6e 79 20 61 64 64 69   Append any addi
1cd90 74 69 6f 6e 20 63 6f 64 65 20 74 68 65 20 75 73  tion code the us
1cda0 65 72 20 64 65 73 69 72 65 73 20 2a 2f 0a 20 20  er desires */.  
1cdb0 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
1cdc0 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63  emp,lemp->extrac
1cdd0 6f 64 65 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63  ode,lemp->extrac
1cde0 6f 64 65 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  odeln,&lineno);.
1cdf0 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20  .  fclose(in);. 
1ce00 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
1ce10 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65  return;.}../* Ge
1ce20 6e 65 72 61 74 65 20 61 20 68 65 61 64 65 72 20  nerate a header 
1ce30 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 72  file for the par
1ce40 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f  ser */.void Repo
1ce50 72 74 48 65 61 64 65 72 28 6c 65 6d 70 29 0a 73  rtHeader(lemp).s
1ce60 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
1ce70 70 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74  p;.{.  FILE *out
1ce80 2c 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 70  , *in;.  char *p
1ce90 72 65 66 69 78 3b 0a 20 20 63 68 61 72 20 6c 69  refix;.  char li
1cea0 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20  ne[LINESIZE];.  
1ceb0 63 68 61 72 20 70 61 74 74 65 72 6e 5b 4c 49 4e  char pattern[LIN
1cec0 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b  ESIZE];.  int i;
1ced0 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f  ..  if( lemp->to
1cee0 6b 65 6e 70 72 65 66 69 78 20 29 20 70 72 65 66  kenprefix ) pref
1cef0 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  ix = lemp->token
1cf00 70 72 65 66 69 78 3b 0a 20 20 65 6c 73 65 20 20  prefix;.  else  
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf20 20 20 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20    prefix = "";. 
1cf30 20 69 6e 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28   in = file_open(
1cf40 6c 65 6d 70 2c 22 2e 68 22 2c 22 72 62 22 29 3b  lemp,".h","rb");
1cf50 0a 20 20 69 66 28 20 69 6e 20 29 7b 0a 20 20 20  .  if( in ){.   
1cf60 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70   for(i=1; i<lemp
1cf70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20 66  ->nterminal && f
1cf80 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49  gets(line,LINESI
1cf90 5a 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20  ZE,in); i++){.  
1cfa0 20 20 20 20 73 70 72 69 6e 74 66 28 70 61 74 74      sprintf(patt
1cfb0 65 72 6e 2c 22 23 64 65 66 69 6e 65 20 25 73 25  ern,"#define %s%
1cfc0 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66  -30s %2d\n",pref
1cfd0 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ix,lemp->symbols
1cfe0 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20  [i]->name,i);.  
1cff0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6c      if( strcmp(l
1d000 69 6e 65 2c 70 61 74 74 65 72 6e 29 20 29 20 62  ine,pattern) ) b
1d010 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1d020 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
1d030 69 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65  if( i==lemp->nte
1d040 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  rminal ){.      
1d050 2f 2a 20 4e 6f 20 63 68 61 6e 67 65 20 69 6e 20  /* No change in 
1d060 74 68 65 20 66 69 6c 65 2e 20 20 44 6f 6e 27 74  the file.  Don't
1d070 20 72 65 77 72 69 74 65 20 69 74 2e 20 2a 2f 0a   rewrite it. */.
1d080 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
1d090 20 20 7d 0a 20 20 7d 0a 20 20 6f 75 74 20 3d 20    }.  }.  out = 
1d0a0 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22  file_open(lemp,"
1d0b0 2e 68 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28  .h","wb");.  if(
1d0c0 20 6f 75 74 20 29 7b 0a 20 20 20 20 66 6f 72 28   out ){.    for(
1d0d0 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65  i=1; i<lemp->nte
1d0e0 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  rminal; i++){.  
1d0f0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1d100 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73  "#define %s%-30s
1d110 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c   %2d\n",prefix,l
1d120 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
1d130 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 7d 0a  >name,i);.    }.
1d140 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
1d150 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b    .  }.  return;
1d160 0a 7d 0a 0a 2f 2a 20 52 65 64 75 63 65 20 74 68  .}../* Reduce th
1d170 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 63  e size of the ac
1d180 74 69 6f 6e 20 74 61 62 6c 65 73 2c 20 69 66 20  tion tables, if 
1d190 70 6f 73 73 69 62 6c 65 2c 20 62 79 20 6d 61 6b  possible, by mak
1d1a0 69 6e 67 20 75 73 65 0a 2a 2a 20 6f 66 20 64 65  ing use.** of de
1d1b0 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  faults..**.** In
1d1c0 20 74 68 69 73 20 76 65 72 73 69 6f 6e 2c 20 77   this version, w
1d1d0 65 20 74 61 6b 65 20 74 68 65 20 6d 6f 73 74 20  e take the most 
1d1e0 66 72 65 71 75 65 6e 74 20 52 45 44 55 43 45 20  frequent REDUCE 
1d1f0 61 63 74 69 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a  action and make.
1d200 2a 2a 20 69 74 20 74 68 65 20 64 65 66 61 75 6c  ** it the defaul
1d210 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65 72  t.  Except, ther
1d220 65 20 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20  e is no default 
1d230 69 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 20  if the wildcard 
1d240 74 6f 6b 65 6e 0a 2a 2a 20 69 73 20 61 20 70 6f  token.** is a po
1d250 73 73 69 62 6c 65 20 6c 6f 6f 6b 2d 61 68 65 61  ssible look-ahea
1d260 64 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d 70 72  d..*/.void Compr
1d270 65 73 73 54 61 62 6c 65 73 28 6c 65 6d 70 29 0a  essTables(lemp).
1d280 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
1d290 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73  mp;.{.  struct s
1d2a0 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72  tate *stp;.  str
1d2b0 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20  uct action *ap, 
1d2c0 2a 61 70 32 3b 0a 20 20 73 74 72 75 63 74 20 72  *ap2;.  struct r
1d2d0 75 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c 20 2a  ule *rp, *rp2, *
1d2e0 72 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e 62 65  rbest;.  int nbe
1d2f0 73 74 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  st, n;.  int i;.
1d300 20 20 69 6e 74 20 75 73 65 73 57 69 6c 64 63 61    int usesWildca
1d310 72 64 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  rd;..  for(i=0; 
1d320 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
1d330 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
1d340 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
1d350 0a 20 20 20 20 6e 62 65 73 74 20 3d 20 30 3b 0a  .    nbest = 0;.
1d360 20 20 20 20 72 62 65 73 74 20 3d 20 30 3b 0a 20      rbest = 0;. 
1d370 20 20 20 75 73 65 73 57 69 6c 64 63 61 72 64 20     usesWildcard 
1d380 3d 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28 61 70  = 0;..    for(ap
1d390 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
1d3a0 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
1d3b0 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d    if( ap->type==
1d3c0 53 48 49 46 54 20 26 26 20 61 70 2d 3e 73 70 3d  SHIFT && ap->sp=
1d3d0 3d 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 20  =lemp->wildcard 
1d3e0 29 7b 0a 20 20 20 20 20 20 20 20 75 73 65 73 57  ){.        usesW
1d3f0 69 6c 64 63 61 72 64 20 3d 20 31 3b 0a 20 20 20  ildcard = 1;.   
1d400 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
1d410 70 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45 20  p->type!=REDUCE 
1d420 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1d430 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b    rp = ap->x.rp;
1d440 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c  .      if( rp->l
1d450 68 73 53 74 61 72 74 20 29 20 63 6f 6e 74 69 6e  hsStart ) contin
1d460 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70  ue;.      if( rp
1d470 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e  ==rbest ) contin
1d480 75 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b  ue;.      n = 1;
1d490 0a 20 20 20 20 20 20 66 6f 72 28 61 70 32 3d 61  .      for(ap2=a
1d4a0 70 2d 3e 6e 65 78 74 3b 20 61 70 32 3b 20 61 70  p->next; ap2; ap
1d4b0 32 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20  2=ap2->next){.  
1d4c0 20 20 20 20 20 20 69 66 28 20 61 70 32 2d 3e 74        if( ap2->t
1d4d0 79 70 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f  ype!=REDUCE ) co
1d4e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1d4f0 72 70 32 20 3d 20 61 70 32 2d 3e 78 2e 72 70 3b  rp2 = ap2->x.rp;
1d500 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70 32  .        if( rp2
1d510 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e  ==rbest ) contin
1d520 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
1d530 72 70 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b 0a 20  rp2==rp ) n++;. 
1d540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1d550 20 6e 3e 6e 62 65 73 74 20 29 7b 0a 20 20 20 20   n>nbest ){.    
1d560 20 20 20 20 6e 62 65 73 74 20 3d 20 6e 3b 0a 20      nbest = n;. 
1d570 20 20 20 20 20 20 20 72 62 65 73 74 20 3d 20 72         rbest = r
1d580 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
1d590 0a 20 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  . .    /* Do not
1d5a0 20 6d 61 6b 65 20 61 20 64 65 66 61 75 6c 74 20   make a default 
1d5b0 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  if the number of
1d5c0 20 72 75 6c 65 73 20 74 6f 20 64 65 66 61 75 6c   rules to defaul
1d5d0 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  t.    ** is not 
1d5e0 61 74 20 6c 65 61 73 74 20 31 20 6f 72 20 69 66  at least 1 or if
1d5f0 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 74 6f   the wildcard to
1d600 6b 65 6e 20 69 73 20 61 20 70 6f 73 73 69 62 6c  ken is a possibl
1d610 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 6b 61 68 65  e.    ** lookahe
1d620 61 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ad..    */.    i
1d630 66 28 20 6e 62 65 73 74 3c 31 20 7c 7c 20 75 73  f( nbest<1 || us
1d640 65 73 57 69 6c 64 63 61 72 64 20 29 20 63 6f 6e  esWildcard ) con
1d650 74 69 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a 20  tinue;...    /* 
1d660 43 6f 6d 62 69 6e 65 20 6d 61 74 63 68 69 6e 67  Combine matching
1d670 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73 20   REDUCE actions 
1d680 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 64 65  into a single de
1d690 66 61 75 6c 74 20 2a 2f 0a 20 20 20 20 66 6f 72  fault */.    for
1d6a0 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
1d6b0 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
1d6c0 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
1d6d0 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d  e==REDUCE && ap-
1d6e0 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20 62  >x.rp==rbest ) b
1d6f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1d700 61 73 73 65 72 74 28 20 61 70 20 29 3b 0a 20 20  assert( ap );.  
1d710 20 20 61 70 2d 3e 73 70 20 3d 20 53 79 6d 62 6f    ap->sp = Symbo
1d720 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74 7d  l_new("{default}
1d730 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 61  ");.    for(ap=a
1d740 70 2d 3e 6e 65 78 74 3b 20 61 70 3b 20 61 70 3d  p->next; ap; ap=
1d750 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
1d760 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52   if( ap->type==R
1d770 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72  EDUCE && ap->x.r
1d780 70 3d 3d 72 62 65 73 74 20 29 20 61 70 2d 3e 74  p==rbest ) ap->t
1d790 79 70 65 20 3d 20 4e 4f 54 5f 55 53 45 44 3b 0a  ype = NOT_USED;.
1d7a0 20 20 20 20 7d 0a 20 20 20 20 73 74 70 2d 3e 61      }.    stp->a
1d7b0 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28  p = Action_sort(
1d7c0 73 74 70 2d 3e 61 70 29 3b 0a 20 20 7d 0a 7d 0a  stp->ap);.  }.}.
1d7d0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1d7e0 74 77 6f 20 73 74 61 74 65 73 20 66 6f 72 20 73  two states for s
1d7f0 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  orting purposes.
1d800 20 20 54 68 65 20 73 6d 61 6c 6c 65 72 20 73 74    The smaller st
1d810 61 74 65 20 69 73 20 74 68 65 0a 2a 2a 20 6f 6e  ate is the.** on
1d820 65 20 77 69 74 68 20 74 68 65 20 6d 6f 73 74 20  e with the most 
1d830 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74  non-terminal act
1d840 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 79 20 68  ions.  If they h
1d850 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
1d860 62 65 72 0a 2a 2a 20 6f 66 20 6e 6f 6e 2d 74 65  ber.** of non-te
1d870 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2c 20  rminal actions, 
1d880 74 68 65 6e 20 74 68 65 20 73 6d 61 6c 6c 65 72  then the smaller
1d890 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
1d8a0 20 74 68 65 20 6d 6f 73 74 0a 2a 2a 20 74 6f 6b   the most.** tok
1d8b0 65 6e 20 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73  en actions..*/.s
1d8c0 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 65 52  tatic int stateR
1d8d0 65 73 6f 72 74 43 6f 6d 70 61 72 65 28 63 6f 6e  esortCompare(con
1d8e0 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73  st void *a, cons
1d8f0 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 63 6f  t void *b){.  co
1d900 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65  nst struct state
1d910 20 2a 70 41 20 3d 20 2a 28 63 6f 6e 73 74 20 73   *pA = *(const s
1d920 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29 61 3b  truct state**)a;
1d930 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
1d940 73 74 61 74 65 20 2a 70 42 20 3d 20 2a 28 63 6f  state *pB = *(co
1d950 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65  nst struct state
1d960 2a 2a 29 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  **)b;.  int n;..
1d970 20 20 6e 20 3d 20 70 42 2d 3e 6e 4e 74 41 63 74    n = pB->nNtAct
1d980 20 2d 20 70 41 2d 3e 6e 4e 74 41 63 74 3b 0a 20   - pA->nNtAct;. 
1d990 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
1d9a0 20 6e 20 3d 20 70 42 2d 3e 6e 54 6b 6e 41 63 74   n = pB->nTknAct
1d9b0 20 2d 20 70 41 2d 3e 6e 54 6b 6e 41 63 74 3b 0a   - pA->nTknAct;.
1d9c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
1d9d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 75 6d 62  }.../*.** Renumb
1d9e0 65 72 20 61 6e 64 20 72 65 73 6f 72 74 20 73 74  er and resort st
1d9f0 61 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61  ates so that sta
1da00 74 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63  tes with fewer c
1da10 68 6f 69 63 65 73 0a 2a 2a 20 6f 63 63 75 72 20  hoices.** occur 
1da20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 45 78 63  at the end.  Exc
1da30 65 70 74 2c 20 6b 65 65 70 20 73 74 61 74 65 20  ept, keep state 
1da40 30 20 61 73 20 74 68 65 20 66 69 72 73 74 20 73  0 as the first s
1da50 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 52 65  tate..*/.void Re
1da60 73 6f 72 74 53 74 61 74 65 73 28 6c 65 6d 70 29  sortStates(lemp)
1da70 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
1da80 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  emp;.{.  int i;.
1da90 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
1daa0 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63  stp;.  struct ac
1dab0 74 69 6f 6e 20 2a 61 70 3b 0a 0a 20 20 66 6f 72  tion *ap;..  for
1dac0 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1dad0 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
1dae0 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
1daf0 65 64 5b 69 5d 3b 0a 20 20 20 20 73 74 70 2d 3e  ed[i];.    stp->
1db00 6e 54 6b 6e 41 63 74 20 3d 20 73 74 70 2d 3e 6e  nTknAct = stp->n
1db10 4e 74 41 63 74 20 3d 20 30 3b 0a 20 20 20 20 73  NtAct = 0;.    s
1db20 74 70 2d 3e 69 44 66 6c 74 20 3d 20 6c 65 6d 70  tp->iDflt = lemp
1db30 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d  ->nstate + lemp-
1db40 3e 6e 72 75 6c 65 3b 0a 20 20 20 20 73 74 70 2d  >nrule;.    stp-
1db50 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 4e 4f 5f 4f  >iTknOfst = NO_O
1db60 46 46 53 45 54 3b 0a 20 20 20 20 73 74 70 2d 3e  FFSET;.    stp->
1db70 69 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46  iNtOfst = NO_OFF
1db80 53 45 54 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  SET;.    for(ap=
1db90 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
1dba0 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
1dbb0 20 69 66 28 20 63 6f 6d 70 75 74 65 5f 61 63 74   if( compute_act
1dbc0 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 3e 3d 30 20  ion(lemp,ap)>=0 
1dbd0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
1dbe0 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d  p->sp->index<lem
1dbf0 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a  p->nterminal ){.
1dc00 20 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e            stp->n
1dc10 54 6b 6e 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20  TknAct++;.      
1dc20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70 2d 3e    }else if( ap->
1dc30 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e  sp->index<lemp->
1dc40 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20  nsymbol ){.     
1dc50 20 20 20 20 20 73 74 70 2d 3e 6e 4e 74 41 63 74       stp->nNtAct
1dc60 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
1dc70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 70  e{.          stp
1dc80 2d 3e 69 44 66 6c 74 20 3d 20 63 6f 6d 70 75 74  ->iDflt = comput
1dc90 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61  e_action(lemp, a
1dca0 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
1dcb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1dcc0 20 20 71 73 6f 72 74 28 26 6c 65 6d 70 2d 3e 73    qsort(&lemp->s
1dcd0 6f 72 74 65 64 5b 31 5d 2c 20 6c 65 6d 70 2d 3e  orted[1], lemp->
1dce0 6e 73 74 61 74 65 2d 31 2c 20 73 69 7a 65 6f 66  nstate-1, sizeof
1dcf0 28 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d  (lemp->sorted[0]
1dd00 29 2c 0a 20 20 20 20 20 20 20 20 73 74 61 74 65  ),.        state
1dd10 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 29 3b 0a  ResortCompare);.
1dd20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1dd30 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
1dd40 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  .    lemp->sorte
1dd50 64 5b 69 5d 2d 3e 73 74 61 74 65 6e 75 6d 20 3d  d[i]->statenum =
1dd60 20 69 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a   i;.  }.}.../***
1dd70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
1dd80 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73 65  rom the file "se
1dd90 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t.c" ***********
1dda0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ddb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
1ddc0 20 53 65 74 20 6d 61 6e 69 70 75 6c 61 74 69 6f   Set manipulatio
1ddd0 6e 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 74  n routines for t
1dde0 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20  he LEMON parser 
1ddf0 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73  generator..*/..s
1de00 74 61 74 69 63 20 69 6e 74 20 73 69 7a 65 20 3d  tatic int size =
1de10 20 30 3b 0a 0a 2f 2a 20 53 65 74 20 74 68 65 20   0;../* Set the 
1de20 73 65 74 20 73 69 7a 65 20 2a 2f 0a 76 6f 69 64  set size */.void
1de30 20 53 65 74 53 69 7a 65 28 6e 29 0a 69 6e 74 20   SetSize(n).int 
1de40 6e 3b 0a 7b 0a 20 20 73 69 7a 65 20 3d 20 6e 2b  n;.{.  size = n+
1de50 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  1;.}../* Allocat
1de60 65 20 61 20 6e 65 77 20 73 65 74 20 2a 2f 0a 63  e a new set */.c
1de70 68 61 72 20 2a 53 65 74 4e 65 77 28 29 7b 0a 20  har *SetNew(){. 
1de80 20 63 68 61 72 20 2a 73 3b 0a 20 20 73 20 3d 20   char *s;.  s = 
1de90 28 63 68 61 72 2a 29 63 61 6c 6c 6f 63 28 20 73  (char*)calloc( s
1dea0 69 7a 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73  ize, 1);.  if( s
1deb0 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65 72  ==0 ){.    exter
1dec0 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72  n void memory_er
1ded0 72 6f 72 28 29 3b 0a 20 20 20 20 6d 65 6d 6f 72  ror();.    memor
1dee0 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20  y_error();.  }. 
1def0 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a   return s;.}../*
1df00 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65   Deallocate a se
1df10 74 20 2a 2f 0a 76 6f 69 64 20 53 65 74 46 72 65  t */.void SetFre
1df20 65 28 73 29 0a 63 68 61 72 20 2a 73 3b 0a 7b 0a  e(s).char *s;.{.
1df30 20 20 66 72 65 65 28 73 29 3b 0a 7d 0a 0a 2f 2a    free(s);.}../*
1df40 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
1df50 6e 74 20 74 6f 20 74 68 65 20 73 65 74 2e 20 20  nt to the set.  
1df60 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
1df70 68 65 20 65 6c 65 6d 65 6e 74 20 77 61 73 20 61  he element was a
1df80 64 64 65 64 0a 2a 2a 20 61 6e 64 20 46 41 4c 53  dded.** and FALS
1df90 45 20 69 66 20 69 74 20 77 61 73 20 61 6c 72 65  E if it was alre
1dfa0 61 64 79 20 74 68 65 72 65 2e 20 2a 2f 0a 69 6e  ady there. */.in
1dfb0 74 20 53 65 74 41 64 64 28 73 2c 65 29 0a 63 68  t SetAdd(s,e).ch
1dfc0 61 72 20 2a 73 3b 0a 69 6e 74 20 65 3b 0a 7b 0a  ar *s;.int e;.{.
1dfd0 20 20 69 6e 74 20 72 76 3b 0a 20 20 61 73 73 65    int rv;.  asse
1dfe0 72 74 28 20 65 3e 3d 30 20 26 26 20 65 3c 73 69  rt( e>=0 && e<si
1dff0 7a 65 20 29 3b 0a 20 20 72 76 20 3d 20 73 5b 65  ze );.  rv = s[e
1e000 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20 31 3b 0a 20  ];.  s[e] = 1;. 
1e010 20 72 65 74 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a   return !rv;.}..
1e020 2f 2a 20 41 64 64 20 65 76 65 72 79 20 65 6c 65  /* Add every ele
1e030 6d 65 6e 74 20 6f 66 20 73 32 20 74 6f 20 73 31  ment of s2 to s1
1e040 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
1e050 66 20 73 31 20 63 68 61 6e 67 65 73 2e 20 2a 2f  f s1 changes. */
1e060 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28 73 31  .int SetUnion(s1
1e070 2c 73 32 29 0a 63 68 61 72 20 2a 73 31 3b 0a 63  ,s2).char *s1;.c
1e080 68 61 72 20 2a 73 32 3b 0a 7b 0a 20 20 69 6e 74  har *s2;.{.  int
1e090 20 69 2c 20 70 72 6f 67 72 65 73 73 3b 0a 20 20   i, progress;.  
1e0a0 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  progress = 0;.  
1e0b0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
1e0c0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
1e0d0 32 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  2[i]==0 ) contin
1e0e0 75 65 3b 0a 20 20 20 20 69 66 28 20 73 31 5b 69  ue;.    if( s1[i
1e0f0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72  ]==0 ){.      pr
1e100 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20  ogress = 1;.    
1e110 20 20 73 31 5b 69 5d 20 3d 20 31 3b 0a 20 20 20    s1[i] = 1;.   
1e120 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1e130 70 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a  progress;.}./***
1e140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e150 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
1e160 65 20 22 74 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a  e "table.c" ****
1e170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e180 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
1e190 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73  All code in this
1e1a0 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61   file has been a
1e1b0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
1e1c0 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61  erated.** from a
1e1d0 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69   specification i
1e1e0 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  n the file.**   
1e1f0 20 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c             "tabl
1e200 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61  e.q".** by the a
1e210 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
1e220 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70   code building p
1e230 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a  rogram "aagen"..
1e240 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74  ** Do not edit t
1e250 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65  his file!  Inste
1e260 61 64 2c 20 65 64 69 74 20 74 68 65 20 73 70 65  ad, edit the spe
1e270 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69  cification.** fi
1e280 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61  le, then rerun a
1e290 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43  agen..*/./*.** C
1e2a0 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ode for processi
1e2b0 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ng tables in the
1e2c0 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
1e2d0 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49  nerator..*/..PRI
1e2e0 56 41 54 45 20 69 6e 74 20 73 74 72 68 61 73 68  VATE int strhash
1e2f0 28 78 29 0a 63 68 61 72 20 2a 78 3b 0a 7b 0a 20  (x).char *x;.{. 
1e300 20 69 6e 74 20 68 20 3d 20 30 3b 0a 20 20 77 68   int h = 0;.  wh
1e310 69 6c 65 28 20 2a 78 29 20 68 20 3d 20 68 2a 31  ile( *x) h = h*1
1e320 33 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20 20 72 65  3 + *(x++);.  re
1e330 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f  turn h;.}../* Wo
1e340 72 6b 73 20 6c 69 6b 65 20 73 74 72 64 75 70 2c  rks like strdup,
1e350 20 73 6f 72 74 20 6f 66 2e 20 20 53 61 76 65 20   sort of.  Save 
1e360 61 20 73 74 72 69 6e 67 20 69 6e 20 6d 61 6c 6c  a string in mall
1e370 6f 63 65 64 20 6d 65 6d 6f 72 79 2c 20 62 75 74  oced memory, but
1e380 0a 2a 2a 20 6b 65 65 70 20 73 74 72 69 6e 67 73  .** keep strings
1e390 20 69 6e 20 61 20 74 61 62 6c 65 20 73 6f 20 74   in a table so t
1e3a0 68 61 74 20 74 68 65 20 73 61 6d 65 20 73 74 72  hat the same str
1e3b0 69 6e 67 20 69 73 20 6e 6f 74 20 69 6e 20 6d 6f  ing is not in mo
1e3c0 72 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 70  re.** than one p
1e3d0 6c 61 63 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 53  lace..*/.char *S
1e3e0 74 72 73 61 66 65 28 79 29 0a 63 68 61 72 20 2a  trsafe(y).char *
1e3f0 79 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  y;.{.  char *z;.
1e400 0a 20 20 69 66 28 20 79 3d 3d 30 20 29 20 72 65  .  if( y==0 ) re
1e410 74 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20 53 74  turn 0;.  z = St
1e420 72 73 61 66 65 5f 66 69 6e 64 28 79 29 3b 0a 20  rsafe_find(y);. 
1e430 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 28 7a 3d   if( z==0 && (z=
1e440 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 79  malloc( strlen(y
1e450 29 2b 31 20 29 29 21 3d 30 20 29 7b 0a 20 20 20  )+1 ))!=0 ){.   
1e460 20 73 74 72 63 70 79 28 7a 2c 79 29 3b 0a 20 20   strcpy(z,y);.  
1e470 20 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74    Strsafe_insert
1e480 28 7a 29 3b 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72  (z);.  }.  Memor
1e490 79 43 68 65 63 6b 28 7a 29 3b 0a 20 20 72 65 74  yCheck(z);.  ret
1e4a0 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  urn z;.}../* The
1e4b0 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
1e4c0 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1e4d0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f  ing structure fo
1e4e0 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69  r each.** associ
1e4f0 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
1e500 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 73 74 72  ype "x1"..*/.str
1e510 75 63 74 20 73 5f 78 31 20 7b 0a 20 20 69 6e 74  uct s_x1 {.  int
1e520 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
1e530 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
1e540 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
1e550 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  slots. */.      
1e560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e570 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65      /*   Must be
1e580 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72   a power of 2 gr
1e590 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f  eater than or */
1e5a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e5b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
1e5c0 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20  equal to 1 */.  
1e5d0 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20  int count;      
1e5e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e5f0 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73  r of currently s
1e600 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20  lots filled */. 
1e610 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
1e620 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64   *tbl;  /* The d
1e630 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20  ata stored here 
1e640 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31  */.  struct s_x1
1e650 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48  node **ht;  /* H
1e660 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f  ash table for lo
1e670 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  okups */.};../* 
1e680 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
1e690 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
1e6a0 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72  ructure for ever
1e6b0 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a  y data element.*
1e6c0 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74  * in an associat
1e6d0 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
1e6e0 65 20 22 78 31 22 2e 0a 2a 2f 0a 74 79 70 65 64  e "x1"..*/.typed
1e6f0 65 66 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f  ef struct s_x1no
1e700 64 65 20 7b 0a 20 20 63 68 61 72 20 2a 64 61 74  de {.  char *dat
1e710 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
1e720 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20      /* The data 
1e730 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31  */.  struct s_x1
1e740 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a  node *next;   /*
1e750 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68   Next entry with
1e760 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
1e770 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e  /.  struct s_x1n
1e780 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20  ode **from;  /* 
1e790 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f  Previous link */
1e7a0 0a 7d 20 78 31 6e 6f 64 65 3b 0a 0a 2f 2a 20 54  .} x1node;../* T
1e7b0 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65  here is only one
1e7c0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1e7d0 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73   array, which is
1e7e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a   the following *
1e7f0 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
1e800 73 5f 78 31 20 2a 78 31 61 3b 0a 0a 2f 2a 20 41  s_x1 *x1a;../* A
1e810 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73  llocate a new as
1e820 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
1e830 2a 2f 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f  */.void Strsafe_
1e840 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 31  init(){.  if( x1
1e850 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 31  a ) return;.  x1
1e860 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 31  a = (struct s_x1
1e870 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
1e880 28 73 74 72 75 63 74 20 73 5f 78 31 29 20 29 3b  (struct s_x1) );
1e890 0a 20 20 69 66 28 20 78 31 61 20 29 7b 0a 20 20  .  if( x1a ){.  
1e8a0 20 20 78 31 61 2d 3e 73 69 7a 65 20 3d 20 31 30    x1a->size = 10
1e8b0 32 34 3b 0a 20 20 20 20 78 31 61 2d 3e 63 6f 75  24;.    x1a->cou
1e8c0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 31 61 2d  nt = 0;.    x1a-
1e8d0 3e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29  >tbl = (x1node*)
1e8e0 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28  malloc( .      (
1e8f0 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b  sizeof(x1node) +
1e900 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29   sizeof(x1node*)
1e910 29 2a 31 30 32 34 20 29 3b 0a 20 20 20 20 69 66  )*1024 );.    if
1e920 28 20 78 31 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b  ( x1a->tbl==0 ){
1e930 0a 20 20 20 20 20 20 66 72 65 65 28 78 31 61 29  .      free(x1a)
1e940 3b 0a 20 20 20 20 20 20 78 31 61 20 3d 20 30 3b  ;.      x1a = 0;
1e950 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e960 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78    int i;.      x
1e970 31 61 2d 3e 68 74 20 3d 20 28 78 31 6e 6f 64 65  1a->ht = (x1node
1e980 2a 2a 29 26 28 78 31 61 2d 3e 74 62 6c 5b 31 30  **)&(x1a->tbl[10
1e990 32 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  24]);.      for(
1e9a0 69 3d 30 3b 20 69 3c 31 30 32 34 3b 20 69 2b 2b  i=0; i<1024; i++
1e9b0 29 20 78 31 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x1a->ht[i] = 0
1e9c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
1e9d0 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
1e9e0 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72  cord into the ar
1e9f0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ray.  Return TRU
1ea00 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  E if successful.
1ea10 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77  .** Prior data w
1ea20 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
1ea30 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74   is NOT overwrit
1ea40 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 72 73 61  ten */.int Strsa
1ea50 66 65 5f 69 6e 73 65 72 74 28 64 61 74 61 29 0a  fe_insert(data).
1ea60 63 68 61 72 20 2a 64 61 74 61 3b 0a 7b 0a 20 20  char *data;.{.  
1ea70 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e  x1node *np;.  in
1ea80 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a  t h;.  int ph;..
1ea90 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29 20 72    if( x1a==0 ) r
1eaa0 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20  eturn 0;.  ph = 
1eab0 73 74 72 68 61 73 68 28 64 61 74 61 29 3b 0a 20  strhash(data);. 
1eac0 20 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e   h = ph & (x1a->
1ead0 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
1eae0 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x1a->ht[h];.  wh
1eaf0 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
1eb00 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61  f( strcmp(np->da
1eb10 74 61 2c 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20  ta,data)==0 ){. 
1eb20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
1eb30 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74  ing entry with t
1eb40 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66  he same key is f
1eb50 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  ound. */.      /
1eb60 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f  * Fail because o
1eb70 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20  verwrite is not 
1eb80 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  allows. */.     
1eb90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1eba0 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
1ebb0 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 31  xt;.  }.  if( x1
1ebc0 61 2d 3e 63 6f 75 6e 74 3e 3d 78 31 61 2d 3e 73  a->count>=x1a->s
1ebd0 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ize ){.    /* Ne
1ebe0 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68  ed to make the h
1ebf0 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72  ash table bigger
1ec00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69   */.    int i,si
1ec10 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  ze;.    struct s
1ec20 5f 78 31 20 61 72 72 61 79 3b 0a 20 20 20 20 61  _x1 array;.    a
1ec30 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65  rray.size = size
1ec40 20 3d 20 78 31 61 2d 3e 73 69 7a 65 2a 32 3b 0a   = x1a->size*2;.
1ec50 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20      array.count 
1ec60 3d 20 78 31 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x1a->count;.  
1ec70 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78    array.tbl = (x
1ec80 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20  1node*)malloc(. 
1ec90 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 31 6e       (sizeof(x1n
1eca0 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 31  ode) + sizeof(x1
1ecb0 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a  node*))*size );.
1ecc0 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62      if( array.tb
1ecd0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
1ece0 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f    /* Fail due to
1ecf0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
1ed00 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20  */.    array.ht 
1ed10 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 61 72  = (x1node**)&(ar
1ed20 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a  ray.tbl[size]);.
1ed30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
1ed40 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e  ize; i++) array.
1ed50 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66  ht[i] = 0;.    f
1ed60 6f 72 28 69 3d 30 3b 20 69 3c 78 31 61 2d 3e 63  or(i=0; i<x1a->c
1ed70 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ount; i++){.    
1ed80 20 20 78 31 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c    x1node *oldnp,
1ed90 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f   *newnp;.      o
1eda0 6c 64 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62  ldnp = &(x1a->tb
1edb0 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d  l[i]);.      h =
1edc0 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e   strhash(oldnp->
1edd0 64 61 74 61 29 20 26 20 28 73 69 7a 65 2d 31 29  data) & (size-1)
1ede0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20  ;.      newnp = 
1edf0 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b  &(array.tbl[i]);
1ee00 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79  .      if( array
1ee10 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68  .ht[h] ) array.h
1ee20 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
1ee30 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20  ewnp->next);.   
1ee40 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d     newnp->next =
1ee50 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20   array.ht[h];.  
1ee60 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
1ee70 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
1ee80 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
1ee90 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
1eea0 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
1eeb0 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
1eec0 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 31 61    }.    free(x1a
1eed0 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 31 61  ->tbl);.    *x1a
1eee0 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
1eef0 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
1ef00 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
1ef10 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d  ph & (x1a->size-
1ef20 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 31 61  1);.  np = &(x1a
1ef30 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74  ->tbl[x1a->count
1ef40 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61  ++]);.  np->data
1ef50 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78   = data;.  if( x
1ef60 31 61 2d 3e 68 74 5b 68 5d 20 29 20 78 31 61 2d  1a->ht[h] ) x1a-
1ef70 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  >ht[h]->from = &
1ef80 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70  (np->next);.  np
1ef90 2d 3e 6e 65 78 74 20 3d 20 78 31 61 2d 3e 68 74  ->next = x1a->ht
1efa0 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e 68 74 5b 68  [h];.  x1a->ht[h
1efb0 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72  ] = np;.  np->fr
1efc0 6f 6d 20 3d 20 26 28 78 31 61 2d 3e 68 74 5b 68  om = &(x1a->ht[h
1efd0 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ]);.  return 1;.
1efe0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
1eff0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61  ointer to data a
1f000 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67  ssigned to the g
1f010 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72  iven key.  Retur
1f020 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20  n NULL.** if no 
1f030 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 63 68 61  such key. */.cha
1f040 72 20 2a 53 74 72 73 61 66 65 5f 66 69 6e 64 28  r *Strsafe_find(
1f050 6b 65 79 29 0a 63 68 61 72 20 2a 6b 65 79 3b 0a  key).char *key;.
1f060 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 31 6e  {.  int h;.  x1n
1f070 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20  ode *np;..  if( 
1f080 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x1a==0 ) return 
1f090 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68  0;.  h = strhash
1f0a0 28 6b 65 79 29 20 26 20 28 78 31 61 2d 3e 73 69  (key) & (x1a->si
1f0b0 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31  ze-1);.  np = x1
1f0c0 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
1f0d0 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
1f0e0 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61   strcmp(np->data
1f0f0 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,key)==0 ) break
1f100 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  ;.    np = np->n
1f110 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
1f120 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20  n np ? np->data 
1f130 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  : 0;.}../* Retur
1f140 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1f150 68 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f 72 20  he (terminal or 
1f160 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73 79 6d  nonterminal) sym
1f170 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72 65 61  bol "x"..** Crea
1f180 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 20  te a new symbol 
1f190 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1f1a0 69 72 73 74 20 74 69 6d 65 20 22 78 22 20 68 61  irst time "x" ha
1f1b0 73 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a  s been seen..*/.
1f1c0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
1f1d0 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 0a 63 68 61  ymbol_new(x).cha
1f1e0 72 20 2a 78 3b 0a 7b 0a 20 20 73 74 72 75 63 74  r *x;.{.  struct
1f1f0 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20   symbol *sp;..  
1f200 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64  sp = Symbol_find
1f210 28 78 29 3b 0a 20 20 69 66 28 20 73 70 3d 3d 30  (x);.  if( sp==0
1f220 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 28 73 74   ){.    sp = (st
1f230 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 63 61  ruct symbol *)ca
1f240 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28 73  lloc(1, sizeof(s
1f250 74 72 75 63 74 20 73 79 6d 62 6f 6c 29 20 29 3b  truct symbol) );
1f260 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b  .    MemoryCheck
1f270 28 73 70 29 3b 0a 20 20 20 20 73 70 2d 3e 6e 61  (sp);.    sp->na
1f280 6d 65 20 3d 20 53 74 72 73 61 66 65 28 78 29 3b  me = Strsafe(x);
1f290 0a 20 20 20 20 73 70 2d 3e 74 79 70 65 20 3d 20  .    sp->type = 
1f2a0 69 73 75 70 70 65 72 28 2a 78 29 20 3f 20 54 45  isupper(*x) ? TE
1f2b0 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d  RMINAL : NONTERM
1f2c0 49 4e 41 4c 3b 0a 20 20 20 20 73 70 2d 3e 72 75  INAL;.    sp->ru
1f2d0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  le = 0;.    sp->
1f2e0 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  fallback = 0;.  
1f2f0 20 20 73 70 2d 3e 70 72 65 63 20 3d 20 2d 31 3b    sp->prec = -1;
1f300 0a 20 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d  .    sp->assoc =
1f310 20 55 4e 4b 3b 0a 20 20 20 20 73 70 2d 3e 66 69   UNK;.    sp->fi
1f320 72 73 74 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  rstset = 0;.    
1f330 73 70 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d  sp->lambda = LEM
1f340 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 20 20 73 70  ON_FALSE;.    sp
1f350 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 3d 20 30  ->destructor = 0
1f360 3b 0a 20 20 20 20 73 70 2d 3e 64 61 74 61 74 79  ;.    sp->dataty
1f370 70 65 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  pe = 0;.    sp->
1f380 75 73 65 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20  useCnt = 0;.    
1f390 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 70  Symbol_insert(sp
1f3a0 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a  ,sp->name);.  }.
1f3b0 20 20 73 70 2d 3e 75 73 65 43 6e 74 2b 2b 3b 0a    sp->useCnt++;.
1f3c0 20 20 72 65 74 75 72 6e 20 73 70 3b 0a 7d 0a 0a    return sp;.}..
1f3d0 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73  /* Compare two s
1f3e0 79 6d 62 6f 6c 73 20 66 6f 72 20 77 6f 72 6b 69  ymbols for worki
1f3f0 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2a 0a 2a  ng purposes.**.*
1f400 2a 20 53 79 6d 62 6f 6c 73 20 74 68 61 74 20 62  * Symbols that b
1f410 65 67 69 6e 20 77 69 74 68 20 75 70 70 65 72 20  egin with upper 
1f420 63 61 73 65 20 6c 65 74 74 65 72 73 20 28 74 65  case letters (te
1f430 72 6d 69 6e 61 6c 73 20 6f 72 20 74 6f 6b 65 6e  rminals or token
1f440 73 29 0a 2a 2a 20 6d 75 73 74 20 73 6f 72 74 20  s).** must sort 
1f450 62 65 66 6f 72 65 20 73 79 6d 62 6f 6c 73 20 74  before symbols t
1f460 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 6c  hat begin with l
1f470 6f 77 65 72 20 63 61 73 65 20 6c 65 74 74 65 72  ower case letter
1f480 73 0a 2a 2a 20 28 6e 6f 6e 2d 74 65 72 6d 69 6e  s.** (non-termin
1f490 61 6c 73 29 2e 20 20 4f 74 68 65 72 20 74 68 61  als).  Other tha
1f4a0 6e 20 74 68 61 74 2c 20 74 68 65 20 6f 72 64 65  n that, the orde
1f4b0 72 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  r does not matte
1f4c0 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 66 69 6e 64  r..**.** We find
1f4d0 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 6c 79 20   experimentally 
1f4e0 74 68 61 74 20 6c 65 61 76 69 6e 67 20 74 68 65  that leaving the
1f4f0 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 69   symbols in thei
1f500 72 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 6f 72  r original.** or
1f510 64 65 72 20 28 74 68 65 20 6f 72 64 65 72 20 74  der (the order t
1f520 68 65 79 20 61 70 70 65 61 72 65 64 20 69 6e 20  hey appeared in 
1f530 74 68 65 20 67 72 61 6d 6d 61 72 20 66 69 6c 65  the grammar file
1f540 29 20 67 69 76 65 73 20 74 68 65 0a 2a 2a 20 73  ) gives the.** s
1f550 6d 61 6c 6c 65 73 74 20 70 61 72 73 65 72 20 74  mallest parser t
1f560 61 62 6c 65 73 20 69 6e 20 53 51 4c 69 74 65 2e  ables in SQLite.
1f570 0a 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d  .*/.int Symbolcm
1f580 70 70 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  pp(struct symbol
1f590 20 2a 2a 61 2c 20 73 74 72 75 63 74 20 73 79 6d   **a, struct sym
1f5a0 62 6f 6c 20 2a 2a 62 29 7b 0a 20 20 69 6e 74 20  bol **b){.  int 
1f5b0 69 31 20 3d 20 28 2a 2a 61 29 2e 69 6e 64 65 78  i1 = (**a).index
1f5c0 20 2b 20 31 30 30 30 30 30 30 30 2a 28 28 2a 2a   + 10000000*((**
1f5d0 61 29 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 29 3b  a).name[0]>'Z');
1f5e0 0a 20 20 69 6e 74 20 69 32 20 3d 20 28 2a 2a 62  .  int i2 = (**b
1f5f0 29 2e 69 6e 64 65 78 20 2b 20 31 30 30 30 30 30  ).index + 100000
1f600 30 30 2a 28 28 2a 2a 62 29 2e 6e 61 6d 65 5b 30  00*((**b).name[0
1f610 5d 3e 27 5a 27 29 3b 0a 20 20 72 65 74 75 72 6e  ]>'Z');.  return
1f620 20 69 31 2d 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68   i1-i2;.}../* Th
1f630 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
1f640 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1f650 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66  wing structure f
1f660 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63  or each.** assoc
1f670 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
1f680 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 73 74  type "x2"..*/.st
1f690 72 75 63 74 20 73 5f 78 32 20 7b 0a 20 20 69 6e  ruct s_x2 {.  in
1f6a0 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
1f6b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
1f6c0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
1f6d0 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20   slots. */.     
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6f0 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62       /*   Must b
1f700 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  e a power of 2 g
1f710 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a  reater than or *
1f720 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1f730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
1f740 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20   equal to 1 */. 
1f750 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20   int count;     
1f760 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f770 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20  er of currently 
1f780 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a  slots filled */.
1f790 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64    struct s_x2nod
1f7a0 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20  e *tbl;  /* The 
1f7b0 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65  data stored here
1f7c0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1f7d0 32 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20  2node **ht;  /* 
1f7e0 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c  Hash table for l
1f7f0 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ookups */.};../*
1f800 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
1f810 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
1f820 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65  tructure for eve
1f830 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a  ry data element.
1f840 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61  ** in an associa
1f850 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
1f860 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 74 79 70 65  pe "x2"..*/.type
1f870 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 32 6e  def struct s_x2n
1f880 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ode {.  struct s
1f890 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 20 20 20 20  ymbol *data;    
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f8b0 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 63   The data */.  c
1f8c0 68 61 72 20 2a 6b 65 79 3b 20 20 20 20 20 20 20  har *key;       
1f8d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f8e0 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75  he key */.  stru
1f8f0 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 6e 65 78  ct s_x2node *nex
1f900 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  t;   /* Next ent
1f910 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
1f920 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63   hash */.  struc
1f930 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 66 72 6f  t s_x2node **fro
1f940 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  m;  /* Previous 
1f950 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 32 6e 6f 64 65  link */.} x2node
1f960 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
1f970 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  nly one instance
1f980 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77   of the array, w
1f990 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c  hich is the foll
1f9a0 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  owing */.static 
1f9b0 73 74 72 75 63 74 20 73 5f 78 32 20 2a 78 32 61  struct s_x2 *x2a
1f9c0 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  ;../* Allocate a
1f9d0 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65   new associative
1f9e0 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53   array */.void S
1f9f0 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 7b 0a 20 20  ymbol_init(){.  
1fa00 69 66 28 20 78 32 61 20 29 20 72 65 74 75 72 6e  if( x2a ) return
1fa10 3b 0a 20 20 78 32 61 20 3d 20 28 73 74 72 75 63  ;.  x2a = (struc
1fa20 74 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28 20  t s_x2*)malloc( 
1fa30 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f  sizeof(struct s_
1fa40 78 32 29 20 29 3b 0a 20 20 69 66 28 20 78 32 61  x2) );.  if( x2a
1fa50 20 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73 69 7a   ){.    x2a->siz
1fa60 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 32 61  e = 128;.    x2a
1fa70 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ->count = 0;.   
1fa80 20 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78 32 6e   x2a->tbl = (x2n
1fa90 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20  ode*)malloc( .  
1faa0 20 20 20 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f      (sizeof(x2no
1fab0 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e  de) + sizeof(x2n
1fac0 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a 20 20  ode*))*128 );.  
1fad0 20 20 69 66 28 20 78 32 61 2d 3e 74 62 6c 3d 3d    if( x2a->tbl==
1fae0 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
1faf0 78 32 61 29 3b 0a 20 20 20 20 20 20 78 32 61 20  x2a);.      x2a 
1fb00 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1fb10 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1fb20 20 20 20 78 32 61 2d 3e 68 74 20 3d 20 28 78 32     x2a->ht = (x2
1fb30 6e 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e 74 62  node**)&(x2a->tb
1fb40 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66  l[128]);.      f
1fb50 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69  or(i=0; i<128; i
1fb60 2b 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x2a->ht[i] =
1fb70 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
1fb80 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  /* Insert a new 
1fb90 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
1fba0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54  array.  Return T
1fbb0 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75  RUE if successfu
1fbc0 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61  l..** Prior data
1fbd0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
1fbe0 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72  ey is NOT overwr
1fbf0 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d  itten */.int Sym
1fc00 62 6f 6c 5f 69 6e 73 65 72 74 28 64 61 74 61 2c  bol_insert(data,
1fc10 6b 65 79 29 0a 73 74 72 75 63 74 20 73 79 6d 62  key).struct symb
1fc20 6f 6c 20 2a 64 61 74 61 3b 0a 63 68 61 72 20 2a  ol *data;.char *
1fc30 6b 65 79 3b 0a 7b 0a 20 20 78 32 6e 6f 64 65 20  key;.{.  x2node 
1fc40 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  *np;.  int h;.  
1fc50 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78  int ph;..  if( x
1fc60 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  2a==0 ) return 0
1fc70 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73 68  ;.  ph = strhash
1fc80 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20  (key);.  h = ph 
1fc90 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x2a->size-1);
1fca0 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b  .  np = x2a->ht[
1fcb0 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
1fcc0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
1fcd0 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d  p(np->key,key)==
1fce0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  0 ){.      /* An
1fcf0 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
1fd00 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
1fd10 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20  y is found. */. 
1fd20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63       /* Fail bec
1fd30 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69  ause overwrite i
1fd40 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f  s not allows. */
1fd50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1fd60 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20  .    }.    np = 
1fd70 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
1fd80 69 66 28 20 78 32 61 2d 3e 63 6f 75 6e 74 3e 3d  if( x2a->count>=
1fd90 78 32 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20  x2a->size ){.   
1fda0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
1fdb0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
1fdc0 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e  bigger */.    in
1fdd0 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74  t i,size;.    st
1fde0 72 75 63 74 20 73 5f 78 32 20 61 72 72 61 79 3b  ruct s_x2 array;
1fdf0 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20  .    array.size 
1fe00 3d 20 73 69 7a 65 20 3d 20 78 32 61 2d 3e 73 69  = size = x2a->si
1fe10 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e  ze*2;.    array.
1fe20 63 6f 75 6e 74 20 3d 20 78 32 61 2d 3e 63 6f 75  count = x2a->cou
1fe30 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62  nt;.    array.tb
1fe40 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 6d 61 6c  l = (x2node*)mal
1fe50 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65  loc(.      (size
1fe60 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x2node) + siz
1fe70 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 2a 73 69  eof(x2node*))*si
1fe80 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72  ze );.    if( ar
1fe90 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74  ray.tbl==0 ) ret
1fea0 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20  urn 0;  /* Fail 
1feb0 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61  due to malloc fa
1fec0 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72  ilure */.    arr
1fed0 61 79 2e 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a  ay.ht = (x2node*
1fee0 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69  *)&(array.tbl[si
1fef0 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ze]);.    for(i=
1ff00 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20  0; i<size; i++) 
1ff10 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b  array.ht[i] = 0;
1ff20 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1ff30 78 32 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x2a->count; i++)
1ff40 7b 0a 20 20 20 20 20 20 78 32 6e 6f 64 65 20 2a  {.      x2node *
1ff50 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20  oldnp, *newnp;. 
1ff60 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78       oldnp = &(x
1ff70 32 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  2a->tbl[i]);.   
1ff80 20 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f     h = strhash(o
1ff90 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 73 69  ldnp->key) & (si
1ffa0 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77  ze-1);.      new
1ffb0 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c  np = &(array.tbl
1ffc0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
1ffd0 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72  array.ht[h] ) ar
1ffe0 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  ray.ht[h]->from 
1fff0 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29  = &(newnp->next)
20000 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e  ;.      newnp->n
20010 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68  ext = array.ht[h
20020 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  ];.      newnp->
20030 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79  key = oldnp->key
20040 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64  ;.      newnp->d
20050 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74  ata = oldnp->dat
20060 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  a;.      newnp->
20070 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68  from = &(array.h
20080 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72  t[h]);.      arr
20090 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70  ay.ht[h] = newnp
200a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
200b0 28 78 32 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20  (x2a->tbl);.    
200c0 2a 78 32 61 20 3d 20 61 72 72 61 79 3b 0a 20 20  *x2a = array;.  
200d0 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  }.  /* Insert th
200e0 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20  e new data */.  
200f0 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73  h = ph & (x2a->s
20100 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26  ize-1);.  np = &
20110 28 78 32 61 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63  (x2a->tbl[x2a->c
20120 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e  ount++]);.  np->
20130 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d  key = key;.  np-
20140 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20  >data = data;.  
20150 69 66 28 20 78 32 61 2d 3e 68 74 5b 68 5d 20 29  if( x2a->ht[h] )
20160 20 78 32 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f   x2a->ht[h]->fro
20170 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b  m = &(np->next);
20180 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 32  .  np->next = x2
20190 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 32 61 2d  a->ht[h];.  x2a-
201a0 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e  >ht[h] = np;.  n
201b0 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 32 61 2d  p->from = &(x2a-
201c0 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72  >ht[h]);.  retur
201d0 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  n 1;.}../* Retur
201e0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  n a pointer to d
201f0 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ata assigned to 
20200 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20  the given key.  
20210 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69  Return NULL.** i
20220 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a  f no such key. *
20230 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
20240 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6b 65 79  *Symbol_find(key
20250 29 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20  ).char *key;.{. 
20260 20 69 6e 74 20 68 3b 0a 20 20 78 32 6e 6f 64 65   int h;.  x2node
20270 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 32 61   *np;..  if( x2a
20280 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
20290 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65    h = strhash(ke
202a0 79 29 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d  y) & (x2a->size-
202b0 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e  1);.  np = x2a->
202c0 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
202d0 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
202e0 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79  rcmp(np->key,key
202f0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
20300 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
20310 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70  .  }.  return np
20320 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
20330 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68  .}../* Return th
20340 65 20 6e 2d 74 68 20 64 61 74 61 2e 20 20 52 65  e n-th data.  Re
20350 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 20 69  turn NULL if n i
20360 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
20370 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  */.struct symbol
20380 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 6e 29 0a   *Symbol_Nth(n).
20390 69 6e 74 20 6e 3b 0a 7b 0a 20 20 73 74 72 75 63  int n;.{.  struc
203a0 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a  t symbol *data;.
203b0 20 20 69 66 28 20 78 32 61 20 26 26 20 6e 3e 30    if( x2a && n>0
203c0 20 26 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f 75 6e   && n<=x2a->coun
203d0 74 20 29 7b 0a 20 20 20 20 64 61 74 61 20 3d 20  t ){.    data = 
203e0 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e 64 61  x2a->tbl[n-1].da
203f0 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ta;.  }else{.   
20400 20 64 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20   data = 0;.  }. 
20410 20 72 65 74 75 72 6e 20 64 61 74 61 3b 0a 7d 0a   return data;.}.
20420 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  ./* Return the s
20430 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
20440 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63   */.int Symbol_c
20450 6f 75 6e 74 28 29 0a 7b 0a 20 20 72 65 74 75 72  ount().{.  retur
20460 6e 20 78 32 61 20 3f 20 78 32 61 2d 3e 63 6f 75  n x2a ? x2a->cou
20470 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  nt : 0;.}../* Re
20480 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  turn an array of
20490 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
204a0 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 61 62   data in the tab
204b0 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79  le..** The array
204c0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
204d0 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72  m malloc.  Retur
204e0 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79  n NULL if memory
204f0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70   allocation.** p
20500 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74  roblems, or if t
20510 68 65 20 61 72 72 61 79 20 69 73 20 65 6d 70 74  he array is empt
20520 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d  y. */.struct sym
20530 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72  bol **Symbol_arr
20540 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75 63  ayof().{.  struc
20550 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 72 72 61 79  t symbol **array
20560 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a  ;.  int i,size;.
20570 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72    if( x2a==0 ) r
20580 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65 20  eturn 0;.  size 
20590 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x2a->count;.  
205a0 61 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20  array = (struct 
205b0 73 79 6d 62 6f 6c 20 2a 2a 29 63 61 6c 6c 6f 63  symbol **)calloc
205c0 28 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28 73 74  (size, sizeof(st
205d0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 29 3b  ruct symbol *));
205e0 0a 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a  .  if( array ){.
205f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
20600 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b  ize; i++) array[
20610 69 5d 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 69 5d  i] = x2a->tbl[i]
20620 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74  .data;.  }.  ret
20630 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  urn array;.}../*
20640 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 63 6f 6e   Compare two con
20650 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 69  figurations */.i
20660 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 61 2c 62  nt Configcmp(a,b
20670 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ).struct config 
20680 2a 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  *a;.struct confi
20690 67 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20 78 3b  g *b;.{.  int x;
206a0 0a 20 20 78 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e  .  x = a->rp->in
206b0 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64  dex - b->rp->ind
206c0 65 78 3b 0a 20 20 69 66 28 20 78 3d 3d 30 20 29  ex;.  if( x==0 )
206d0 20 78 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d   x = a->dot - b-
206e0 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 78  >dot;.  return x
206f0 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20  ;.}../* Compare 
20700 74 77 6f 20 73 74 61 74 65 73 20 2a 2f 0a 50 52  two states */.PR
20710 49 56 41 54 45 20 69 6e 74 20 73 74 61 74 65 63  IVATE int statec
20720 6d 70 28 61 2c 62 29 0a 73 74 72 75 63 74 20 63  mp(a,b).struct c
20730 6f 6e 66 69 67 20 2a 61 3b 0a 73 74 72 75 63 74  onfig *a;.struct
20740 20 63 6f 6e 66 69 67 20 2a 62 3b 0a 7b 0a 20 20   config *b;.{.  
20750 69 6e 74 20 72 63 3b 0a 20 20 66 6f 72 28 72 63  int rc;.  for(rc
20760 3d 30 3b 20 72 63 3d 3d 30 20 26 26 20 61 20 26  =0; rc==0 && a &
20770 26 20 62 3b 20 20 61 3d 61 2d 3e 62 70 2c 20 62  & b;  a=a->bp, b
20780 3d 62 2d 3e 62 70 29 7b 0a 20 20 20 20 72 63 20  =b->bp){.    rc 
20790 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d  = a->rp->index -
207a0 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20   b->rp->index;. 
207b0 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
207c0 63 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e  c = a->dot - b->
207d0 64 6f 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  dot;.  }.  if( r
207e0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
207f0 61 20 29 20 72 63 20 3d 20 31 3b 0a 20 20 20 20  a ) rc = 1;.    
20800 69 66 28 20 62 20 29 20 72 63 20 3d 20 2d 31 3b  if( b ) rc = -1;
20810 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
20820 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 73  ;.}../* Hash a s
20830 74 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20  tate */.PRIVATE 
20840 69 6e 74 20 73 74 61 74 65 68 61 73 68 28 61 29  int statehash(a)
20850 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
20860 61 3b 0a 7b 0a 20 20 69 6e 74 20 68 3d 30 3b 0a  a;.{.  int h=0;.
20870 20 20 77 68 69 6c 65 28 20 61 20 29 7b 0a 20 20    while( a ){.  
20880 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d    h = h*571 + a-
20890 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20  >rp->index*37 + 
208a0 61 2d 3e 64 6f 74 3b 0a 20 20 20 20 61 20 3d 20  a->dot;.    a = 
208b0 61 2d 3e 62 70 3b 0a 20 20 7d 0a 20 20 72 65 74  a->bp;.  }.  ret
208c0 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c  urn h;.}../* All
208d0 6f 63 61 74 65 20 61 20 6e 65 77 20 73 74 61 74  ocate a new stat
208e0 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 73  e structure */.s
208f0 74 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61  truct state *Sta
20900 74 65 5f 6e 65 77 28 29 0a 7b 0a 20 20 73 74 72  te_new().{.  str
20910 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77 3b 0a  uct state *new;.
20920 20 20 6e 65 77 20 3d 20 28 73 74 72 75 63 74 20    new = (struct 
20930 73 74 61 74 65 20 2a 29 63 61 6c 6c 6f 63 28 31  state *)calloc(1
20940 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  , sizeof(struct 
20950 73 74 61 74 65 29 20 29 3b 0a 20 20 4d 65 6d 6f  state) );.  Memo
20960 72 79 43 68 65 63 6b 28 6e 65 77 29 3b 0a 20 20  ryCheck(new);.  
20970 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f  return new;.}../
20980 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
20990 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
209a0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
209b0 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61  re for each.** a
209c0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
209d0 20 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a   of type "x3"..*
209e0 2f 0a 73 74 72 75 63 74 20 73 5f 78 33 20 7b 0a  /.struct s_x3 {.
209f0 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
20a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20a10 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
20a20 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20  able slots. */. 
20a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a40 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75           /*   Mu
20a50 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
20a60 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
20a70 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
20a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a90 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20  /*   equal to 1 
20aa0 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20  */.  int count; 
20ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20ac0 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  Number of curren
20ad0 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64  tly slots filled
20ae0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
20af0 33 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20  3node *tbl;  /* 
20b00 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  The data stored 
20b10 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  here */.  struct
20b20 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 68 74 3b 20   s_x3node **ht; 
20b30 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66   /* Hash table f
20b40 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b  or lookups */.};
20b50 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
20b60 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
20b70 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
20b80 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d   every data elem
20b90 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73  ent.** in an ass
20ba0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
20bb0 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a  f type "x3"..*/.
20bc0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
20bd0 5f 78 33 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75  _x3node {.  stru
20be0 63 74 20 73 74 61 74 65 20 2a 64 61 74 61 3b 20  ct state *data; 
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c00 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
20c10 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
20c20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  *key;           
20c30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b          /* The k
20c40 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ey */.  struct s
20c50 5f 78 33 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20  _x3node *next;  
20c60 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77   /* Next entry w
20c70 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73  ith the same has
20c80 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  h */.  struct s_
20c90 78 33 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20  x3node **from;  
20ca0 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b  /* Previous link
20cb0 20 2a 2f 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f   */.} x3node;../
20cc0 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  * There is only 
20cd0 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
20ce0 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68  the array, which
20cf0 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   is the followin
20d00 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  g */.static stru
20d10 63 74 20 73 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f  ct s_x3 *x3a;../
20d20 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
20d30 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
20d40 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74 61 74 65  ay */.void State
20d50 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78  _init(){.  if( x
20d60 33 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  3a ) return;.  x
20d70 33 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78  3a = (struct s_x
20d80 33 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  3*)malloc( sizeo
20d90 66 28 73 74 72 75 63 74 20 73 5f 78 33 29 20 29  f(struct s_x3) )
20da0 3b 0a 20 20 69 66 28 20 78 33 61 20 29 7b 0a 20  ;.  if( x3a ){. 
20db0 20 20 20 78 33 61 2d 3e 73 69 7a 65 20 3d 20 31     x3a->size = 1
20dc0 32 38 3b 0a 20 20 20 20 78 33 61 2d 3e 63 6f 75  28;.    x3a->cou
20dd0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 33 61 2d  nt = 0;.    x3a-
20de0 3e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29  >tbl = (x3node*)
20df0 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28  malloc( .      (
20e00 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b  sizeof(x3node) +
20e10 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29   sizeof(x3node*)
20e20 29 2a 31 32 38 20 29 3b 0a 20 20 20 20 69 66 28  )*128 );.    if(
20e30 20 78 33 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a   x3a->tbl==0 ){.
20e40 20 20 20 20 20 20 66 72 65 65 28 78 33 61 29 3b        free(x3a);
20e50 0a 20 20 20 20 20 20 78 33 61 20 3d 20 30 3b 0a  .      x3a = 0;.
20e60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20e70 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 33   int i;.      x3
20e80 61 2d 3e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a  a->ht = (x3node*
20e90 2a 29 26 28 78 33 61 2d 3e 74 62 6c 5b 31 32 38  *)&(x3a->tbl[128
20ea0 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ]);.      for(i=
20eb0 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78  0; i<128; i++) x
20ec0 33 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  3a->ht[i] = 0;. 
20ed0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e     }.  }.}./* In
20ee0 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
20ef0 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79  d into the array
20f00 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
20f10 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a  f successful..**
20f20 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68   Prior data with
20f30 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
20f40 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e   NOT overwritten
20f50 20 2a 2f 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e   */.int State_in
20f60 73 65 72 74 28 64 61 74 61 2c 6b 65 79 29 0a 73  sert(data,key).s
20f70 74 72 75 63 74 20 73 74 61 74 65 20 2a 64 61 74  truct state *dat
20f80 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  a;.struct config
20f90 20 2a 6b 65 79 3b 0a 7b 0a 20 20 78 33 6e 6f 64   *key;.{.  x3nod
20fa0 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a  e *np;.  int h;.
20fb0 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28    int ph;..  if(
20fc0 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x3a==0 ) return
20fd0 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 61 74 65   0;.  ph = state
20fe0 68 61 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d  hash(key);.  h =
20ff0 20 70 68 20 26 20 28 78 33 61 2d 3e 73 69 7a 65   ph & (x3a->size
21000 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d  -1);.  np = x3a-
21010 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
21020 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73   np ){.    if( s
21030 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c  tatecmp(np->key,
21040 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  key)==0 ){.     
21050 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
21060 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
21070 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64  ame key is found
21080 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61  . */.      /* Fa
21090 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77  il because overw
210a0 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  rite is not allo
210b0 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ws. */.      ret
210c0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
210d0 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
210e0 20 20 7d 0a 20 20 69 66 28 20 78 33 61 2d 3e 63    }.  if( x3a->c
210f0 6f 75 6e 74 3e 3d 78 33 61 2d 3e 73 69 7a 65 20  ount>=x3a->size 
21100 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74  ){.    /* Need t
21110 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20  o make the hash 
21120 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a  table bigger */.
21130 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a      int i,size;.
21140 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 33 20      struct s_x3 
21150 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79  array;.    array
21160 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78  .size = size = x
21170 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20  3a->size*2;.    
21180 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 33  array.count = x3
21190 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72  a->count;.    ar
211a0 72 61 79 2e 74 62 6c 20 3d 20 28 78 33 6e 6f 64  ray.tbl = (x3nod
211b0 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e*)malloc(.     
211c0 20 28 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29   (sizeof(x3node)
211d0 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65   + sizeof(x3node
211e0 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20  *))*size );.    
211f0 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30  if( array.tbl==0
21200 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
21210 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c   Fail due to mal
21220 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  loc failure */. 
21230 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78     array.ht = (x
21240 33 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e  3node**)&(array.
21250 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20  tbl[size]);.    
21260 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
21270 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69   i++) array.ht[i
21280 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  ] = 0;.    for(i
21290 3d 30 3b 20 69 3c 78 33 61 2d 3e 63 6f 75 6e 74  =0; i<x3a->count
212a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 33  ; i++){.      x3
212b0 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65  node *oldnp, *ne
212c0 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70  wnp;.      oldnp
212d0 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 69 5d   = &(x3a->tbl[i]
212e0 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 61  );.      h = sta
212f0 74 65 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65  tehash(oldnp->ke
21300 79 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20  y) & (size-1);. 
21310 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61       newnp = &(a
21320 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20  rray.tbl[i]);.  
21330 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74      if( array.ht
21340 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68  [h] ) array.ht[h
21350 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e  ]->from = &(newn
21360 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20  p->next);.      
21370 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72  newnp->next = ar
21380 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20  ray.ht[h];.     
21390 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c   newnp->key = ol
213a0 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20  dnp->key;.      
213b0 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
213c0 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
213d0 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
213e0 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
213f0 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
21400 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
21410 20 20 20 20 66 72 65 65 28 78 33 61 2d 3e 74 62      free(x3a->tb
21420 6c 29 3b 0a 20 20 20 20 2a 78 33 61 20 3d 20 61  l);.    *x3a = a
21430 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
21440 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
21450 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
21460 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x3a->size-1);.
21470 20 20 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62    np = &(x3a->tb
21480 6c 5b 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x3a->count++])
21490 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65  ;.  np->key = ke
214a0 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20  y;.  np->data = 
214b0 64 61 74 61 3b 0a 20 20 69 66 28 20 78 33 61 2d  data;.  if( x3a-
214c0 3e 68 74 5b 68 5d 20 29 20 78 33 61 2d 3e 68 74  >ht[h] ) x3a->ht
214d0 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70  [h]->from = &(np
214e0 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e  ->next);.  np->n
214f0 65 78 74 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d  ext = x3a->ht[h]
21500 3b 0a 20 20 78 33 61 2d 3e 68 74 5b 68 5d 20 3d  ;.  x3a->ht[h] =
21510 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20   np;.  np->from 
21520 3d 20 26 28 78 33 61 2d 3e 68 74 5b 68 5d 29 3b  = &(x3a->ht[h]);
21530 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
21540 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
21550 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69  ter to data assi
21560 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65  gned to the give
21570 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e  n key.  Return N
21580 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63  ULL.** if no suc
21590 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74  h key. */.struct
215a0 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69   state *State_fi
215b0 6e 64 28 6b 65 79 29 0a 73 74 72 75 63 74 20 63  nd(key).struct c
215c0 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20  onfig *key;.{.  
215d0 69 6e 74 20 68 3b 0a 20 20 78 33 6e 6f 64 65 20  int h;.  x3node 
215e0 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d  *np;..  if( x3a=
215f0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
21600 20 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b   h = statehash(k
21610 65 79 29 20 26 20 28 78 33 61 2d 3e 73 69 7a 65  ey) & (x3a->size
21620 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d  -1);.  np = x3a-
21630 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
21640 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73   np ){.    if( s
21650 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c  tatecmp(np->key,
21660 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  key)==0 ) break;
21670 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
21680 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
21690 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a   np ? np->data :
216a0 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   0;.}../* Return
216b0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
216c0 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74  nters to all dat
216d0 61 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  a in the table..
216e0 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69 73 20  ** The array is 
216f0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
21700 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55  lloc.  Return NU
21710 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c  LL if memory all
21720 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c  ocation.** probl
21730 65 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61  ems, or if the a
21740 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a  rray is empty. *
21750 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  /.struct state *
21760 2a 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28 29  *State_arrayof()
21770 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  .{.  struct stat
21780 65 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74  e **array;.  int
21790 20 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20 78   i,size;.  if( x
217a0 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  3a==0 ) return 0
217b0 3b 0a 20 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e  ;.  size = x3a->
217c0 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d  count;.  array =
217d0 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a   (struct state *
217e0 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
217f0 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29  (struct state *)
21800 2a 73 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 61  *size );.  if( a
21810 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28  rray ){.    for(
21820 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
21830 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78 33 61  ) array[i] = x3a
21840 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20  ->tbl[i].data;. 
21850 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 72 61   }.  return arra
21860 79 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20  y;.}../* Hash a 
21870 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f  configuration */
21880 0a 50 52 49 56 41 54 45 20 69 6e 74 20 63 6f 6e  .PRIVATE int con
21890 66 69 67 68 61 73 68 28 61 29 0a 73 74 72 75 63  fighash(a).struc
218a0 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b 0a 20  t config *a;.{. 
218b0 20 69 6e 74 20 68 3d 30 3b 0a 20 20 68 20 3d 20   int h=0;.  h = 
218c0 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69  h*571 + a->rp->i
218d0 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74  ndex*37 + a->dot
218e0 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a  ;.  return h;.}.
218f0 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  ./* There is one
21900 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
21910 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
21920 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a  ture for each.**
21930 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
21940 61 79 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e  ay of type "x4".
21950 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 34 20  .*/.struct s_x4 
21960 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  {.  int size;   
21970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21980 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
21990 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f  ilable slots. */
219a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
219b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
219c0 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  Must be a power 
219d0 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61  of 2 greater tha
219e0 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  n or */.        
219f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a00 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20    /*   equal to 
21a10 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74  1 */.  int count
21a20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
21a30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72  * Number of curr
21a40 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c  ently slots fill
21a50 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ed */.  struct s
21a60 5f 78 34 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f  _x4node *tbl;  /
21a70 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65  * The data store
21a80 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75  d here */.  stru
21a90 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 68 74  ct s_x4node **ht
21aa0 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65  ;  /* Hash table
21ab0 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a   for lookups */.
21ac0 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  };../* There is 
21ad0 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
21ae0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66  this structure f
21af0 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c  or every data el
21b00 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61  ement.** in an a
21b10 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
21b20 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a   of type "x4"..*
21b30 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
21b40 20 73 5f 78 34 6e 6f 64 65 20 7b 0a 20 20 73 74   s_x4node {.  st
21b50 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74  ruct config *dat
21b60 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
21b70 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20      /* The data 
21b80 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34  */.  struct s_x4
21b90 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a  node *next;   /*
21ba0 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68   Next entry with
21bb0 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
21bc0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e  /.  struct s_x4n
21bd0 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20  ode **from;  /* 
21be0 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f  Previous link */
21bf0 0a 7d 20 78 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54  .} x4node;../* T
21c00 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65  here is only one
21c10 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
21c20 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73   array, which is
21c30 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a   the following *
21c40 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
21c50 73 5f 78 34 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41  s_x4 *x4a;../* A
21c60 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73  llocate a new as
21c70 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
21c80 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  */.void Configta
21c90 62 6c 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66  ble_init(){.  if
21ca0 28 20 78 34 61 20 29 20 72 65 74 75 72 6e 3b 0a  ( x4a ) return;.
21cb0 20 20 78 34 61 20 3d 20 28 73 74 72 75 63 74 20    x4a = (struct 
21cc0 73 5f 78 34 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  s_x4*)malloc( si
21cd0 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 34  zeof(struct s_x4
21ce0 29 20 29 3b 0a 20 20 69 66 28 20 78 34 61 20 29  ) );.  if( x4a )
21cf0 7b 0a 20 20 20 20 78 34 61 2d 3e 73 69 7a 65 20  {.    x4a->size 
21d00 3d 20 36 34 3b 0a 20 20 20 20 78 34 61 2d 3e 63  = 64;.    x4a->c
21d10 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 34  ount = 0;.    x4
21d20 61 2d 3e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65  a->tbl = (x4node
21d30 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20  *)malloc( .     
21d40 20 28 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29   (sizeof(x4node)
21d50 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65   + sizeof(x4node
21d60 2a 29 29 2a 36 34 20 29 3b 0a 20 20 20 20 69 66  *))*64 );.    if
21d70 28 20 78 34 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b  ( x4a->tbl==0 ){
21d80 0a 20 20 20 20 20 20 66 72 65 65 28 78 34 61 29  .      free(x4a)
21d90 3b 0a 20 20 20 20 20 20 78 34 61 20 3d 20 30 3b  ;.      x4a = 0;
21da0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21db0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78    int i;.      x
21dc0 34 61 2d 3e 68 74 20 3d 20 28 78 34 6e 6f 64 65  4a->ht = (x4node
21dd0 2a 2a 29 26 28 78 34 61 2d 3e 74 62 6c 5b 36 34  **)&(x4a->tbl[64
21de0 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ]);.      for(i=
21df0 30 3b 20 69 3c 36 34 3b 20 69 2b 2b 29 20 78 34  0; i<64; i++) x4
21e00 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
21e10 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73    }.  }.}./* Ins
21e20 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
21e30 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e   into the array.
21e40 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
21e50 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20   successful..** 
21e60 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20  Prior data with 
21e70 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
21e80 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20  NOT overwritten 
21e90 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62  */.int Configtab
21ea0 6c 65 5f 69 6e 73 65 72 74 28 64 61 74 61 29 0a  le_insert(data).
21eb0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64  struct config *d
21ec0 61 74 61 3b 0a 7b 0a 20 20 78 34 6e 6f 64 65 20  ata;.{.  x4node 
21ed0 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  *np;.  int h;.  
21ee0 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78  int ph;..  if( x
21ef0 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  4a==0 ) return 0
21f00 3b 0a 20 20 70 68 20 3d 20 63 6f 6e 66 69 67 68  ;.  ph = configh
21f10 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d  ash(data);.  h =
21f20 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65   ph & (x4a->size
21f30 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d  -1);.  np = x4a-
21f40 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
21f50 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 43   np ){.    if( C
21f60 6f 6e 66 69 67 63 6d 70 28 6e 70 2d 3e 64 61 74  onfigcmp(np->dat
21f70 61 2c 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20  a,data)==0 ){.  
21f80 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
21f90 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  ng entry with th
21fa0 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f  e same key is fo
21fb0 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  und. */.      /*
21fc0 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76   Fail because ov
21fd0 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61  erwrite is not a
21fe0 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  llows. */.      
21ff0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
22000 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
22010 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 34 61  t;.  }.  if( x4a
22020 2d 3e 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e 73 69  ->count>=x4a->si
22030 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  ze ){.    /* Nee
22040 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61  d to make the ha
22050 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20  sh table bigger 
22060 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a  */.    int i,siz
22070 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f  e;.    struct s_
22080 78 34 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72  x4 array;.    ar
22090 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20  ray.size = size 
220a0 3d 20 78 34 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20  = x4a->size*2;. 
220b0 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d     array.count =
220c0 20 78 34 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20   x4a->count;.   
220d0 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 34   array.tbl = (x4
220e0 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20  node*)malloc(.  
220f0 20 20 20 20 28 73 69 7a 65 6f 66 28 78 34 6e 6f      (sizeof(x4no
22100 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e  de) + sizeof(x4n
22110 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20  ode*))*size );. 
22120 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c     if( array.tbl
22130 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
22140 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20   /* Fail due to 
22150 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a  malloc failure *
22160 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d  /.    array.ht =
22170 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 61 72 72   (x4node**)&(arr
22180 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20  ay.tbl[size]);. 
22190 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
221a0 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68  ze; i++) array.h
221b0 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f  t[i] = 0;.    fo
221c0 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f  r(i=0; i<x4a->co
221d0 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unt; i++){.     
221e0 20 78 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20   x4node *oldnp, 
221f0 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c  *newnp;.      ol
22200 64 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c  dnp = &(x4a->tbl
22210 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20  [i]);.      h = 
22220 63 6f 6e 66 69 67 68 61 73 68 28 6f 6c 64 6e 70  confighash(oldnp
22230 2d 3e 64 61 74 61 29 20 26 20 28 73 69 7a 65 2d  ->data) & (size-
22240 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20  1);.      newnp 
22250 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d  = &(array.tbl[i]
22260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72  );.      if( arr
22270 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79  ay.ht[h] ) array
22280 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  .ht[h]->from = &
22290 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  (newnp->next);. 
222a0 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74       newnp->next
222b0 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a   = array.ht[h];.
222c0 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74        newnp->dat
222d0 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b  a = oldnp->data;
222e0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72  .      newnp->fr
222f0 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b  om = &(array.ht[
22300 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79  h]);.      array
22310 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a  .ht[h] = newnp;.
22320 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78      }.    free(x
22330 34 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78  4a->tbl);.    *x
22340 34 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a  4a = array;.  }.
22350 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
22360 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20  new data */.  h 
22370 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a  = ph & (x4a->siz
22380 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78  e-1);.  np = &(x
22390 34 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f 75  4a->tbl[x4a->cou
223a0 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61  nt++]);.  np->da
223b0 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28  ta = data;.  if(
223c0 20 78 34 61 2d 3e 68 74 5b 68 5d 20 29 20 78 34   x4a->ht[h] ) x4
223d0 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  a->ht[h]->from =
223e0 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20   &(np->next);.  
223f0 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 34 61 2d 3e  np->next = x4a->
22400 68 74 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e 68 74  ht[h];.  x4a->ht
22410 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e  [h] = np;.  np->
22420 66 72 6f 6d 20 3d 20 26 28 78 34 61 2d 3e 68 74  from = &(x4a->ht
22430 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  [h]);.  return 1
22440 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
22450 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
22460 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65   assigned to the
22470 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74   given key.  Ret
22480 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e  urn NULL.** if n
22490 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73  o such key. */.s
224a0 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
224b0 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 6b  nfigtable_find(k
224c0 65 79 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  ey).struct confi
224d0 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20  g *key;.{.  int 
224e0 68 3b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b  h;.  x4node *np;
224f0 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29  ..  if( x4a==0 )
22500 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d   return 0;.  h =
22510 20 63 6f 6e 66 69 67 68 61 73 68 28 6b 65 79 29   confighash(key)
22520 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29   & (x4a->size-1)
22530 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74  ;.  np = x4a->ht
22540 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
22550 20 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66   ){.    if( Conf
22560 69 67 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b  igcmp(np->data,k
22570 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ey)==0 ) break;.
22580 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
22590 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
225a0 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20  np ? np->data : 
225b0 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20  0;.}../* Remove 
225c0 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  all data from th
225d0 65 20 74 61 62 6c 65 2e 20 20 50 61 73 73 20 65  e table.  Pass e
225e0 61 63 68 20 64 61 74 61 20 74 6f 20 74 68 65 20  ach data to the 
225f0 66 75 6e 63 74 69 6f 6e 20 22 66 22 0a 2a 2a 20  function "f".** 
22600 61 73 20 69 74 20 69 73 20 72 65 6d 6f 76 65 64  as it is removed
22610 2e 20 20 28 22 66 22 20 6d 61 79 20 62 65 20 6e  .  ("f" may be n
22620 75 6c 6c 20 74 6f 20 61 76 6f 69 64 20 74 68 69  ull to avoid thi
22630 73 20 73 74 65 70 2e 29 20 2a 2f 0a 76 6f 69 64  s step.) */.void
22640 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65   Configtable_cle
22650 61 72 28 66 29 0a 69 6e 74 28 2a 66 29 28 2f 2a  ar(f).int(*f)(/*
22660 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
22670 20 2a 2f 29 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b   */);.{.  int i;
22680 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 7c 7c  .  if( x4a==0 ||
22690 20 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29   x4a->count==0 )
226a0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 66   return;.  if( f
226b0 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34   ) for(i=0; i<x4
226c0 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 28  a->count; i++) (
226d0 2a 66 29 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e  *f)(x4a->tbl[i].
226e0 64 61 74 61 29 3b 0a 20 20 66 6f 72 28 69 3d 30  data);.  for(i=0
226f0 3b 20 69 3c 78 34 61 2d 3e 73 69 7a 65 3b 20 69  ; i<x4a->size; i
22700 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x4a->ht[i] =
22710 20 30 3b 0a 20 20 78 34 61 2d 3e 63 6f 75 6e 74   0;.  x4a->count
22720 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a   = 0;.  return;.
22730 7d 0a                                            }.