/ Hex Artifact Content
Login

Artifact b7ea2ab73efcae17de678e27311e3a6fb45b9916:


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: 63 68 61 72 20 2a 64 61 74 61 74 79 70 65 3b 20  char *datatype; 
1210: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1220: 64 61 74 61 20 74 79 70 65 20 6f 66 20 69 6e 66  data type of inf
1230: 6f 72 6d 61 74 69 6f 6e 20 68 65 6c 64 20 62 79  ormation held by
1240: 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1260: 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e 6c 79   ** object. Only
1270: 20 75 73 65 64 20 69 66 20 74 79 70 65 3d 3d 4e   used if type==N
1280: 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a 20 20  ONTERMINAL */.  
1290: 69 6e 74 20 64 74 6e 75 6d 3b 20 20 20 20 20 20  int dtnum;      
12a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12b0: 64 61 74 61 20 74 79 70 65 20 6e 75 6d 62 65 72  data type number
12c0: 2e 20 20 49 6e 20 74 68 65 20 70 61 72 73 65 72  .  In the parser
12d0: 2c 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  , the value.    
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f0: 20 20 20 20 20 20 20 2a 2a 20 73 74 61 63 6b 20         ** stack 
1300: 69 73 20 61 20 75 6e 69 6f 6e 2e 20 20 54 68 65  is a union.  The
1310: 20 2e 79 79 25 64 20 65 6c 65 6d 65 6e 74 20 6f   .yy%d element o
1320: 66 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  f this.         
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 20 20 2a 2a 20 75 6e 69 6f 6e 20 69 73 20 74 68    ** union is th
1350: 65 20 63 6f 72 72 65 63 74 20 64 61 74 61 20 74  e correct data t
1360: 79 70 65 20 66 6f 72 20 74 68 69 73 20 6f 62 6a  ype for this obj
1370: 65 63 74 20 2a 2f 0a 20 20 2f 2a 20 54 68 65 20  ect */.  /* The 
1380: 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
1390: 20 61 72 65 20 75 73 65 64 20 62 79 20 4d 55 4c   are used by MUL
13a0: 54 49 54 45 52 4d 49 4e 41 4c 73 20 6f 6e 6c 79  TITERMINALs only
13b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 75 62 73 79   */.  int nsubsy
13c0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
13d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73  * Number of cons
13e0: 74 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20  tituent symbols 
13f0: 69 6e 20 74 68 65 20 4d 55 4c 54 49 20 2a 2f 0a  in the MULTI */.
1400: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1410: 2a 2a 73 75 62 73 79 6d 3b 20 20 2f 2a 20 41 72  **subsym;  /* Ar
1420: 72 61 79 20 6f 66 20 63 6f 6e 73 74 69 74 75 65  ray of constitue
1430: 6e 74 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 7d 3b  nt symbols */.};
1440: 0a 0a 2f 2a 20 45 61 63 68 20 70 72 6f 64 75 63  ../* Each produc
1450: 74 69 6f 6e 20 72 75 6c 65 20 69 6e 20 74 68 65  tion rule in the
1460: 20 67 72 61 6d 6d 61 72 20 69 73 20 73 74 6f 72   grammar is stor
1470: 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ed in the follow
1480: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
1490: 2e 20 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c  .  */.struct rul
14a0: 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  e {.  struct sym
14b0: 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 2f  bol *lhs;      /
14c0: 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  * Left-hand side
14d0: 20 6f 66 20 74 68 65 20 72 75 6c 65 20 2a 2f 0a   of the rule */.
14e0: 20 20 63 68 61 72 20 2a 6c 68 73 61 6c 69 61 73    char *lhsalias
14f0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  ;          /* Al
1500: 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20  ias for the LHS 
1510: 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a  (NULL if none) *
1520: 2f 0a 20 20 69 6e 74 20 6c 68 73 53 74 61 72 74  /.  int lhsStart
1530: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1540: 54 72 75 65 20 69 66 20 6c 65 66 74 2d 68 61 6e  True if left-han
1550: 64 20 73 69 64 65 20 69 73 20 74 68 65 20 73 74  d side is the st
1560: 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20  art symbol */.  
1570: 69 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20 20 20  int ruleline;   
1580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
1590: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
15a0: 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 72  rule */.  int nr
15b0: 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hs;             
15c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
15d0: 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  RHS symbols */. 
15e0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
15f0: 2a 72 68 73 3b 20 20 20 20 20 2f 2a 20 54 68 65  *rhs;     /* The
1600: 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a   RHS symbols */.
1610: 20 20 63 68 61 72 20 2a 2a 72 68 73 61 6c 69 61    char **rhsalia
1620: 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  s;         /* An
1630: 20 61 6c 69 61 73 20 66 6f 72 20 65 61 63 68 20   alias for each 
1640: 52 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55 4c 4c  RHS symbol (NULL
1650: 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69   if none) */.  i
1660: 6e 74 20 6c 69 6e 65 3b 20 20 20 20 20 20 20 20  nt line;        
1670: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
1680: 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63 68 20  number at which 
1690: 63 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f 0a 20  code begins */. 
16a0: 20 63 68 61 72 20 2a 63 6f 64 65 3b 20 20 20 20   char *code;    
16b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16c0: 20 63 6f 64 65 20 65 78 65 63 75 74 65 64 20 77   code executed w
16d0: 68 65 6e 20 74 68 69 73 20 72 75 6c 65 20 69 73  hen this rule is
16e0: 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20 73 74   reduced */.  st
16f0: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 70 72 65  ruct symbol *pre
1700: 63 73 79 6d 3b 20 20 2f 2a 20 50 72 65 63 65 64  csym;  /* Preced
1710: 65 6e 63 65 20 73 79 6d 62 6f 6c 20 66 6f 72 20  ence symbol for 
1720: 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 69  this rule */.  i
1730: 6e 74 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20  nt index;       
1740: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
1750: 64 65 78 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  dex number for t
1760: 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 42 6f  his rule */.  Bo
1770: 6f 6c 65 61 6e 20 63 61 6e 52 65 64 75 63 65 3b  olean canReduce;
1780: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1790: 66 20 74 68 69 73 20 72 75 6c 65 20 69 73 20 65  f this rule is e
17a0: 76 65 72 20 72 65 64 75 63 65 64 20 2a 2f 0a 20  ver reduced */. 
17b0: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65   struct rule *ne
17c0: 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e 65 78  xtlhs;    /* Nex
17d0: 74 20 72 75 6c 65 20 77 69 74 68 20 74 68 65 20  t rule with the 
17e0: 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20 73 74  same LHS */.  st
17f0: 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78 74 3b  ruct rule *next;
1800: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 72         /* Next r
1810: 75 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f 62 61  ule in the globa
1820: 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  l list */.};../*
1830: 20 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   A configuration
1840: 20 69 73 20 61 20 70 72 6f 64 75 63 74 69 6f 6e   is a production
1850: 20 72 75 6c 65 20 6f 66 20 74 68 65 20 67 72 61   rule of the gra
1860: 6d 6d 61 72 20 74 6f 67 65 74 68 65 72 20 77 69  mmar together wi
1870: 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28 64 6f  th.** a mark (do
1880: 74 29 20 73 68 6f 77 69 6e 67 20 68 6f 77 20 6d  t) showing how m
1890: 75 63 68 20 6f 66 20 74 68 61 74 20 72 75 6c 65  uch of that rule
18a0: 20 68 61 73 20 62 65 65 6e 20 70 72 6f 63 65 73   has been proces
18b0: 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a 20 43  sed so far..** C
18c0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61 6c  onfigurations al
18d0: 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66 6f 6c  so contain a fol
18e0: 6c 6f 77 2d 73 65 74 20 77 68 69 63 68 20 69 73  low-set which is
18f0: 20 61 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 69   a list of termi
1900: 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73 20 77  nal.** symbols w
1910: 68 69 63 68 20 61 72 65 20 61 6c 6c 6f 77 65 64  hich are allowed
1920: 20 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   to immediately 
1930: 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64 20 6f  follow the end o
1940: 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a 20 45  f the rule..** E
1950: 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69  very configurati
1960: 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61  on is recorded a
1970: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
1980: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20   the following: 
1990: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
19a0: 20 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65   {.  struct rule
19b0: 20 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a   *rp;         /*
19c0: 20 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77   The rule upon w
19d0: 68 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75  hich the configu
19e0: 72 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20  ration is based 
19f0: 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20  */.  int dot;   
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a10: 20 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74   The parse point
1a20: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b   */.  char *fws;
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a40: 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72  * Follow-set for
1a50: 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74   this configurat
1a60: 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ion only */.  st
1a70: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70  ruct plink *fplp
1a80: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ;      /* Follow
1a90: 2d 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f  -set forward pro
1aa0: 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a  pagation links *
1ab0: 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  /.  struct plink
1ac0: 20 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20   *bplp;      /* 
1ad0: 46 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77  Follow-set backw
1ae0: 61 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e  ards propagation
1af0: 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75   links */.  stru
1b00: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
1b10: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1b20: 74 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63  to state which c
1b30: 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a  ontains this */.
1b40: 20 20 65 6e 75 6d 20 7b 0a 20 20 20 20 43 4f 4d    enum {.    COM
1b50: 50 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20 20  PLETE,          
1b60: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 75      /* The statu
1b70: 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  s is used during
1b80: 20 66 6f 6c 6c 6f 77 73 65 74 20 61 6e 64 20 2a   followset and *
1b90: 2f 0a 20 20 20 20 49 4e 43 4f 4d 50 4c 45 54 45  /.    INCOMPLETE
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bb0: 20 20 20 73 68 69 66 74 20 63 6f 6d 70 75 74 61     shift computa
1bc0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 20 73 74 61  tions */.  } sta
1bd0: 74 75 73 3b 0a 20 20 73 74 72 75 63 74 20 63 6f  tus;.  struct co
1be0: 6e 66 69 67 20 2a 6e 65 78 74 3b 20 20 20 20 20  nfig *next;     
1bf0: 2f 2a 20 4e 65 78 74 20 63 6f 6e 66 69 67 75 72  /* Next configur
1c00: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74 61  ation in the sta
1c10: 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63  te */.  struct c
1c20: 6f 6e 66 69 67 20 2a 62 70 3b 20 20 20 20 20 20  onfig *bp;      
1c30: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 61 73   /* The next bas
1c40: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
1c50: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79   */.};../* Every
1c60: 20 73 68 69 66 74 20 6f 72 20 72 65 64 75 63 65   shift or reduce
1c70: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73 74   operation is st
1c80: 6f 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20 74  ored as one of t
1c90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
1ca0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b 0a  struct action {.
1cb0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1cc0: 2a 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *sp;       /* Th
1cd0: 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79 6d  e look-ahead sym
1ce0: 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f  bol */.  enum e_
1cf0: 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20 53 48 49  action {.    SHI
1d00: 46 54 2c 0a 20 20 20 20 41 43 43 45 50 54 2c 0a  FT,.    ACCEPT,.
1d10: 20 20 20 20 52 45 44 55 43 45 2c 0a 20 20 20 20      REDUCE,.    
1d20: 45 52 52 4f 52 2c 0a 20 20 20 20 53 53 43 4f 4e  ERROR,.    SSCON
1d30: 46 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20 20  FLICT,          
1d40: 20 20 20 20 2f 2a 20 41 20 73 68 69 66 74 2f 73      /* A shift/s
1d50: 68 69 66 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  hift conflict */
1d60: 0a 20 20 20 20 53 52 43 4f 4e 46 4c 49 43 54 2c  .    SRCONFLICT,
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d80: 20 57 61 73 20 61 20 72 65 64 75 63 65 2c 20 62   Was a reduce, b
1d90: 75 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6e  ut part of a con
1da0: 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 52 52 43  flict */.    RRC
1db0: 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20 20 20 20  ONFLICT,        
1dc0: 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 72        /* Was a r
1dd0: 65 64 75 63 65 2c 20 62 75 74 20 70 61 72 74 20  educe, but part 
1de0: 6f 66 20 61 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  of a conflict */
1df0: 0a 20 20 20 20 53 48 5f 52 45 53 4f 4c 56 45 44  .    SH_RESOLVED
1e00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1e10: 20 57 61 73 20 61 20 73 68 69 66 74 2e 20 20 50   Was a shift.  P
1e20: 72 65 63 65 64 65 6e 63 65 20 72 65 73 6f 6c 76  recedence resolv
1e30: 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ed conflict */. 
1e40: 20 20 20 52 44 5f 52 45 53 4f 4c 56 45 44 2c 20     RD_RESOLVED, 
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1e60: 61 73 20 72 65 64 75 63 65 2e 20 20 50 72 65 63  as reduce.  Prec
1e70: 65 64 65 6e 63 65 20 72 65 73 6f 6c 76 65 64 20  edence resolved 
1e80: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20  conflict */.    
1e90: 4e 4f 54 5f 55 53 45 44 20 20 20 20 20 20 20 20  NOT_USED        
1ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
1eb0: 74 65 64 20 62 79 20 63 6f 6d 70 72 65 73 73 69  ted by compressi
1ec0: 6f 6e 20 2a 2f 0a 20 20 7d 20 74 79 70 65 3b 0a  on */.  } type;.
1ed0: 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74    union {.    st
1ee0: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
1ef0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
1f00: 73 74 61 74 65 2c 20 69 66 20 61 20 73 68 69 66  state, if a shif
1f10: 74 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  t */.    struct 
1f20: 72 75 6c 65 20 2a 72 70 3b 20 20 20 20 20 20 20  rule *rp;       
1f30: 2f 2a 20 54 68 65 20 72 75 6c 65 2c 20 69 66 20  /* The rule, if 
1f40: 61 20 72 65 64 75 63 65 20 2a 2f 0a 20 20 7d 20  a reduce */.  } 
1f50: 78 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  x;.  struct acti
1f60: 6f 6e 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a  on *next;     /*
1f70: 20 4e 65 78 74 20 61 63 74 69 6f 6e 20 66 6f 72   Next action for
1f80: 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20   this state */. 
1f90: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
1fa0: 63 6f 6c 6c 69 64 65 3b 20 20 2f 2a 20 4e 65 78  collide;  /* Nex
1fb0: 74 20 61 63 74 69 6f 6e 20 77 69 74 68 20 74 68  t action with th
1fc0: 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 7d  e same hash */.}
1fd0: 3b 0a 0a 2f 2a 20 45 61 63 68 20 73 74 61 74 65  ;../* Each state
1fe0: 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
1ff0: 64 20 70 61 72 73 65 72 27 73 20 66 69 6e 69 74  d parser's finit
2000: 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 0a  e state machine.
2010: 2a 2a 20 69 73 20 65 6e 63 6f 64 65 64 20 61 73  ** is encoded as
2020: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
2030: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2040: 72 75 63 74 75 72 65 2e 20 2a 2f 0a 73 74 72 75  ructure. */.stru
2050: 63 74 20 73 74 61 74 65 20 7b 0a 20 20 73 74 72  ct state {.  str
2060: 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 70 3b 20  uct config *bp; 
2070: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 61 73        /* The bas
2080: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
2090: 73 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  s for this state
20a0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   */.  struct con
20b0: 66 69 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f  fig *cfp;      /
20c0: 2a 20 41 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74  * All configurat
20d0: 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 73 65 74  ions in this set
20e0: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 61 74 65 6e   */.  int staten
20f0: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  um;            /
2100: 2a 20 53 65 71 75 65 6e 63 69 61 6c 20 6e 75 6d  * Sequencial num
2110: 62 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61  ber for this sta
2120: 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61  te */.  struct a
2130: 63 74 69 6f 6e 20 2a 61 70 3b 20 20 20 20 20 20  ction *ap;      
2140: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74   /* Array of act
2150: 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74  ions for this st
2160: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6b  ate */.  int nTk
2170: 6e 41 63 74 2c 20 6e 4e 74 41 63 74 3b 20 20 20  nAct, nNtAct;   
2180: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2190: 63 74 69 6f 6e 73 20 6f 6e 20 74 65 72 6d 69 6e  ctions on termin
21a0: 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69  als and nontermi
21b0: 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  nals */.  int iT
21c0: 6b 6e 4f 66 73 74 2c 20 69 4e 74 4f 66 73 74 3b  knOfst, iNtOfst;
21d0: 20 20 20 2f 2a 20 79 79 5f 61 63 74 69 6f 6e 5b     /* yy_action[
21e0: 5d 20 6f 66 66 73 65 74 20 66 6f 72 20 74 65 72  ] offset for ter
21f0: 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65  minals and nonte
2200: 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 69 44 66  rms */.  int iDf
2210: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
2220: 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 61 63 74    /* Default act
2230: 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e  ion */.};.#defin
2240: 65 20 4e 4f 5f 4f 46 46 53 45 54 20 28 2d 32 31  e NO_OFFSET (-21
2250: 34 37 34 38 33 36 34 37 29 0a 0a 2f 2a 20 41 20  47483647)../* A 
2260: 66 6f 6c 6c 6f 77 73 65 74 20 70 72 6f 70 61 67  followset propag
2270: 61 74 69 6f 6e 20 6c 69 6e 6b 20 69 6e 64 69 63  ation link indic
2280: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  ates that the co
2290: 6e 74 65 6e 74 73 20 6f 66 20 6f 6e 65 0a 2a 2a  ntents of one.**
22a0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
22b0: 6f 6c 6c 6f 77 73 65 74 20 73 68 6f 75 6c 64 20  ollowset should 
22c0: 62 65 20 70 72 6f 70 61 67 61 74 65 64 20 74 6f  be propagated to
22d0: 20 61 6e 6f 74 68 65 72 20 77 68 65 6e 65 76 65   another wheneve
22e0: 72 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  r.** the first c
22f0: 68 61 6e 67 65 73 2e 20 2a 2f 0a 73 74 72 75 63  hanges. */.struc
2300: 74 20 70 6c 69 6e 6b 20 7b 0a 20 20 73 74 72 75  t plink {.  stru
2310: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20  ct config *cfp; 
2320: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66       /* The conf
2330: 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 77 68 69  iguration to whi
2340: 63 68 20 6c 69 6e 6b 65 64 20 2a 2f 0a 20 20 73  ch linked */.  s
2350: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78  truct plink *nex
2360: 74 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  t;      /* The n
2370: 65 78 74 20 70 72 6f 70 61 67 61 74 65 20 6c 69  ext propagate li
2380: 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  nk */.};../* The
2390: 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 66 6f   state vector fo
23a0: 72 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 72  r the entire par
23b0: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 73  ser generator is
23c0: 20 72 65 63 6f 72 64 65 64 20 61 73 0a 2a 2a 20   recorded as.** 
23d0: 66 6f 6c 6c 6f 77 73 2e 20 20 28 4c 45 4d 4f 4e  follows.  (LEMON
23e0: 20 75 73 65 73 20 6e 6f 20 67 6c 6f 62 61 6c 20   uses no global 
23f0: 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6d 61  variables and ma
2400: 6b 65 73 20 6c 69 74 74 6c 65 20 75 73 65 20 6f  kes little use o
2410: 66 0a 2a 2a 20 73 74 61 74 69 63 20 76 61 72 69  f.** static vari
2420: 61 62 6c 65 73 2e 20 20 46 69 65 6c 64 73 20 69  ables.  Fields i
2430: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2440: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
2450: 20 74 68 6f 75 67 68 74 0a 2a 2a 20 6f 66 20 61   thought.** of a
2460: 73 20 62 65 67 69 6e 20 67 6c 6f 62 61 6c 20 76  s begin global v
2470: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
2480: 70 72 6f 67 72 61 6d 2e 29 20 2a 2f 0a 73 74 72  program.) */.str
2490: 75 63 74 20 6c 65 6d 6f 6e 20 7b 0a 20 20 73 74  uct lemon {.  st
24a0: 72 75 63 74 20 73 74 61 74 65 20 2a 2a 73 6f 72  ruct state **sor
24b0: 74 65 64 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20  ted;   /* Table 
24c0: 6f 66 20 73 74 61 74 65 73 20 73 6f 72 74 65 64  of states sorted
24d0: 20 62 79 20 73 74 61 74 65 20 6e 75 6d 62 65 72   by state number
24e0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
24f0: 65 20 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f  e *rule;       /
2500: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 72 75  * List of all ru
2510: 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 74  les */.  int nst
2520: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
2530: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
2540: 74 61 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  tates */.  int n
2550: 72 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  rule;           
2560: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2570: 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20   rules */.  int 
2580: 6e 73 79 6d 62 6f 6c 3b 20 20 20 20 20 20 20 20  nsymbol;        
2590: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25a0: 66 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e  f terminal and n
25b0: 6f 6e 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f  onterminal symbo
25c0: 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 74 65 72  ls */.  int nter
25d0: 6d 69 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  minal;          
25e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
25f0: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a  rminal symbols *
2600: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
2610: 6c 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20 2f 2a 20  l **symbols; /* 
2620: 53 6f 72 74 65 64 20 61 72 72 61 79 20 6f 66 20  Sorted array of 
2630: 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 79 6d 62  pointers to symb
2640: 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ols */.  int err
2650: 6f 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  orcnt;          
2660: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
2670: 72 72 6f 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  rrors */.  struc
2680: 74 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d  t symbol *errsym
2690: 3b 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72  ;   /* The error
26a0: 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72   symbol */.  str
26b0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 77 69 6c 64  uct symbol *wild
26c0: 63 61 72 64 3b 20 2f 2a 20 54 6f 6b 65 6e 20 74  card; /* Token t
26d0: 68 61 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74  hat matches anyt
26e0: 68 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  hing */.  char *
26f0: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
2700: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2710: 65 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73  e generated pars
2720: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72  er */.  char *ar
2730: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
2740: 20 2f 2a 20 44 65 63 6c 61 72 61 74 69 6f 6e 20   /* Declaration 
2750: 6f 66 20 74 68 65 20 33 74 68 20 61 72 67 75 6d  of the 3th argum
2760: 65 6e 74 20 74 6f 20 70 61 72 73 65 72 20 2a 2f  ent to parser */
2770: 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 74 79  .  char *tokenty
2780: 70 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  pe;         /* T
2790: 79 70 65 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20  ype of terminal 
27a0: 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 70  symbols in the p
27b0: 61 72 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20  arser stack */. 
27c0: 20 63 68 61 72 20 2a 76 61 72 74 79 70 65 3b 20   char *vartype; 
27d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
27e0: 20 64 65 66 61 75 6c 74 20 74 79 70 65 20 6f 66   default type of
27f0: 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 73 79   non-terminal sy
2800: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20  mbols */.  char 
2810: 2a 73 74 61 72 74 3b 20 20 20 20 20 20 20 20 20  *start;         
2820: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2830: 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  he start symbol 
2840: 66 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72 20  for the grammar 
2850: 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 63 6b  */.  char *stack
2860: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  size;         /*
2870: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 72   Size of the par
2880: 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63  ser stack */.  c
2890: 68 61 72 20 2a 69 6e 63 6c 75 64 65 3b 20 20 20  har *include;   
28a0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
28b0: 74 6f 20 70 75 74 20 61 74 20 74 68 65 20 73 74  to put at the st
28c0: 61 72 74 20 6f 66 20 74 68 65 20 43 20 66 69 6c  art of the C fil
28d0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 72 72  e */.  char *err
28e0: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
28f0: 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75  /* Code to execu
2900: 74 65 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72  te when an error
2910: 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 63 68   is seen */.  ch
2920: 61 72 20 2a 6f 76 65 72 66 6c 6f 77 3b 20 20 20  ar *overflow;   
2930: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
2940: 6f 20 65 78 65 63 75 74 65 20 6f 6e 20 61 20 73  o execute on a s
2950: 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77 20 2a 2f  tack overflow */
2960: 0a 20 20 63 68 61 72 20 2a 66 61 69 6c 75 72 65  .  char *failure
2970: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
2980: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f  ode to execute o
2990: 6e 20 70 61 72 73 65 72 20 66 61 69 6c 75 72 65  n parser failure
29a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 63 63 65   */.  char *acce
29b0: 70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pt;            /
29c0: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
29d0: 65 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65  e when the parse
29e0: 72 20 65 78 63 65 70 74 73 20 2a 2f 0a 20 20 63  r excepts */.  c
29f0: 68 61 72 20 2a 65 78 74 72 61 63 6f 64 65 3b 20  har *extracode; 
2a00: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2a10: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
2a20: 67 65 6e 65 72 61 74 65 64 20 66 69 6c 65 20 2a  generated file *
2a30: 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 64  /.  char *tokend
2a40: 65 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  est;         /* 
2a50: 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20  Code to execute 
2a60: 74 6f 20 64 65 73 74 72 6f 79 20 74 6f 6b 65 6e  to destroy token
2a70: 20 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72 20   data */.  char 
2a80: 2a 76 61 72 64 65 73 74 3b 20 20 20 20 20 20 20  *vardest;       
2a90: 20 20 20 20 2f 2a 20 43 6f 64 65 20 66 6f 72 20      /* Code for 
2aa0: 74 68 65 20 64 65 66 61 75 6c 74 20 6e 6f 6e 2d  the default non-
2ab0: 74 65 72 6d 69 6e 61 6c 20 64 65 73 74 72 75 63  terminal destruc
2ac0: 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66  tor */.  char *f
2ad0: 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
2ae0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2af0: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
2b00: 20 63 68 61 72 20 2a 6f 75 74 6e 61 6d 65 3b 20   char *outname; 
2b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
2b20: 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  e of the current
2b30: 20 6f 75 74 70 75 74 20 66 69 6c 65 20 2a 2f 0a   output file */.
2b40: 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 70 72 65    char *tokenpre
2b50: 66 69 78 3b 20 20 20 20 20 20 20 2f 2a 20 41 20  fix;       /* A 
2b60: 70 72 65 66 69 78 20 61 64 64 65 64 20 74 6f 20  prefix added to 
2b70: 74 6f 6b 65 6e 20 6e 61 6d 65 73 20 69 6e 20 74  token names in t
2b80: 68 65 20 2e 68 20 66 69 6c 65 20 2a 2f 0a 20 20  he .h file */.  
2b90: 69 6e 74 20 6e 63 6f 6e 66 6c 69 63 74 3b 20 20  int nconflict;  
2ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2bb0: 65 72 20 6f 66 20 70 61 72 73 69 6e 67 20 63 6f  er of parsing co
2bc0: 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20 69 6e 74  nflicts */.  int
2bd0: 20 74 61 62 6c 65 73 69 7a 65 3b 20 20 20 20 20   tablesize;     
2be0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2bf0: 20 74 68 65 20 70 61 72 73 65 20 74 61 62 6c 65   the parse table
2c00: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 69 73  s */.  int basis
2c10: 66 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 20  flag;           
2c20: 2f 2a 20 50 72 69 6e 74 20 6f 6e 6c 79 20 62 61  /* Print only ba
2c30: 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  sis configuratio
2c40: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 68 61 73 5f  ns */.  int has_
2c50: 66 61 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  fallback;       
2c60: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2c70: 25 66 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 65  %fallback is see
2c80: 6e 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 65 72  n in the grammer
2c90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 76   */.  char *argv
2ca0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2cb0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72  * Name of the pr
2cc0: 6f 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23 64 65  ogram */.};..#de
2cd0: 66 69 6e 65 20 4d 65 6d 6f 72 79 43 68 65 63 6b  fine MemoryCheck
2ce0: 28 58 29 20 69 66 28 28 58 29 3d 3d 30 29 7b 20  (X) if((X)==0){ 
2cf0: 5c 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20  \.  extern void 
2d00: 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20  memory_error(); 
2d10: 5c 0a 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72  \.  memory_error
2d20: 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  (); \.}../******
2d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
2d40: 74 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e  the file "table.
2d50: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
2d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d70: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20  ****/./*.** All 
2d80: 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c  code in this fil
2d90: 65 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d  e has been autom
2da0: 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74  atically generat
2db0: 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65  ed.** from a spe
2dc0: 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68  cification in th
2dd0: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  e file.**       
2de0: 20 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22         "table.q"
2df0: 0a 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63  .** by the assoc
2e00: 69 61 74 69 76 65 20 61 72 72 61 79 20 63 6f 64  iative array cod
2e10: 65 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72  e building progr
2e20: 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44  am "aagen"..** D
2e30: 6f 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20  o not edit this 
2e40: 66 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20  file!  Instead, 
2e50: 65 64 69 74 20 74 68 65 20 73 70 65 63 69 66 69  edit the specifi
2e60: 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20  cation.** file, 
2e70: 74 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e  then rerun aagen
2e80: 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ..*/./*.** Code 
2e90: 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74  for processing t
2ea0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d  ables in the LEM
2eb0: 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
2ec0: 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52 6f 75 74  tor..*/../* Rout
2ed0: 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e  ines for handlin
2ee0: 67 20 61 20 73 74 72 69 6e 67 73 20 2a 2f 0a 0a  g a strings */..
2ef0: 63 68 61 72 20 2a 53 74 72 73 61 66 65 28 29 3b  char *Strsafe();
2f00: 0a 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69  ..void Strsafe_i
2f10: 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b  nit(/* void */);
2f20: 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73  .int Strsafe_ins
2f30: 65 72 74 28 2f 2a 20 63 68 61 72 20 2a 20 2a 2f  ert(/* char * */
2f40: 29 3b 0a 63 68 61 72 20 2a 53 74 72 73 61 66 65  );.char *Strsafe
2f50: 5f 66 69 6e 64 28 2f 2a 20 63 68 61 72 20 2a 20  _find(/* char * 
2f60: 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65  */);../* Routine
2f70: 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 73  s for handling s
2f80: 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72  ymbols of the gr
2f90: 61 6d 6d 61 72 20 2a 2f 0a 0a 73 74 72 75 63 74  ammar */..struct
2fa0: 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
2fb0: 6e 65 77 28 29 3b 0a 69 6e 74 20 53 79 6d 62 6f  new();.int Symbo
2fc0: 6c 63 6d 70 70 28 2f 2a 20 73 74 72 75 63 74 20  lcmpp(/* struct 
2fd0: 73 79 6d 62 6f 6c 20 2a 2a 2c 20 73 74 72 75 63  symbol **, struc
2fe0: 74 20 73 79 6d 62 6f 6c 20 2a 2a 20 2a 2f 29 3b  t symbol ** */);
2ff0: 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69  .void Symbol_ini
3000: 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69  t(/* void */);.i
3010: 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74  nt Symbol_insert
3020: 28 2f 2a 20 73 74 72 75 63 74 20 73 79 6d 62 6f  (/* struct symbo
3030: 6c 20 2a 2c 20 63 68 61 72 20 2a 20 2a 2f 29 3b  l *, char * */);
3040: 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
3050: 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 2f 2a 20 63  Symbol_find(/* c
3060: 68 61 72 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63  har * */);.struc
3070: 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c  t symbol *Symbol
3080: 5f 4e 74 68 28 2f 2a 20 69 6e 74 20 2a 2f 29 3b  _Nth(/* int */);
3090: 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e  .int Symbol_coun
30a0: 74 28 2f 2a 20 20 2a 2f 29 3b 0a 73 74 72 75 63  t(/*  */);.struc
30b0: 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f  t symbol **Symbo
30c0: 6c 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20 2a 2f  l_arrayof(/*  */
30d0: 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20  );../* Routines 
30e0: 74 6f 20 6d 61 6e 61 67 65 20 74 68 65 20 73 74  to manage the st
30f0: 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 69 6e  ate table */..in
3100: 74 20 43 6f 6e 66 69 67 63 6d 70 28 2f 2a 20 73  t Configcmp(/* s
3110: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2c 20  truct config *, 
3120: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
3130: 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74  */);.struct stat
3140: 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 29 3b 0a  e *State_new();.
3150: 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28  void State_init(
3160: 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74  /* void */);.int
3170: 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28 2f 2a   State_insert(/*
3180: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2c   struct state *,
3190: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
31a0: 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61   */);.struct sta
31b0: 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 2f  te *State_find(/
31c0: 2a 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  * struct config 
31d0: 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 74  * */);.struct st
31e0: 61 74 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61  ate **State_arra
31f0: 79 6f 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a  yof(/*  */);../*
3200: 20 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 66   Routines used f
3210: 6f 72 20 65 66 66 69 63 69 65 6e 63 79 20 69 6e  or efficiency in
3220: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 20   Configlist_add 
3230: 2a 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74  */..void Configt
3240: 61 62 6c 65 5f 69 6e 69 74 28 2f 2a 20 76 6f 69  able_init(/* voi
3250: 64 20 2a 2f 29 3b 0a 69 6e 74 20 43 6f 6e 66 69  d */);.int Confi
3260: 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 2f 2a  gtable_insert(/*
3270: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
3280: 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e   */);.struct con
3290: 66 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65  fig *Configtable
32a0: 5f 66 69 6e 64 28 2f 2a 20 73 74 72 75 63 74 20  _find(/* struct 
32b0: 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 76 6f  config * */);.vo
32c0: 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63  id Configtable_c
32d0: 6c 65 61 72 28 2f 2a 20 69 6e 74 28 2a 29 28 73  lear(/* int(*)(s
32e0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20  truct config *) 
32f0: 2a 2f 29 3b 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */);./**********
3300: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
3310: 65 20 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e 63  e file "action.c
3320: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
3330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3340: 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  */./*.** Routine
3350: 73 20 70 72 6f 63 65 73 73 69 6e 67 20 70 61 72  s processing par
3360: 73 65 72 20 61 63 74 69 6f 6e 73 20 69 6e 20 74  ser actions in t
3370: 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20  he LEMON parser 
3380: 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f  generator..*/../
3390: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
33a0: 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 20 2a   parser action *
33b0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
33c0: 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e  action *Action_n
33d0: 65 77 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  ew(void){.  stat
33e0: 69 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  ic struct action
33f0: 20 2a 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a   *freelist = 0;.
3400: 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
3410: 2a 6e 65 77 3b 0a 0a 20 20 69 66 28 20 66 72 65  *new;..  if( fre
3420: 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
3430: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61  int i;.    int a
3440: 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 66 72  mt = 100;.    fr
3450: 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74  eelist = (struct
3460: 20 61 63 74 69 6f 6e 20 2a 29 63 61 6c 6c 6f 63   action *)calloc
3470: 28 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72  (amt, sizeof(str
3480: 75 63 74 20 61 63 74 69 6f 6e 29 29 3b 0a 20 20  uct action));.  
3490: 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d    if( freelist==
34a0: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
34b0: 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c  tf(stderr,"Unabl
34c0: 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
34d0: 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 70  mory for a new p
34e0: 61 72 73 65 72 20 61 63 74 69 6f 6e 2e 22 29 3b  arser action.");
34f0: 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
3500: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
3510: 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29  0; i<amt-1; i++)
3520: 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78   freelist[i].nex
3530: 74 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69 2b  t = &freelist[i+
3540: 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74  1];.    freelist
3550: 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30  [amt-1].next = 0
3560: 3b 0a 20 20 7d 0a 20 20 6e 65 77 20 3d 20 66 72  ;.  }.  new = fr
3570: 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69  eelist;.  freeli
3580: 73 74 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e  st = freelist->n
3590: 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65  ext;.  return ne
35a0: 77 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65  w;.}../* Compare
35b0: 20 74 77 6f 20 61 63 74 69 6f 6e 73 20 66 6f 72   two actions for
35c0: 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65   sorting purpose
35d0: 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74  s.  Return negat
35e0: 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 0a 2a 2a  ive, zero, or.**
35f0: 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65   positive if the
3600: 20 66 69 72 73 74 20 61 63 74 69 6f 6e 20 69 73   first action is
3610: 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
3620: 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
3630: 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 66 69 72   than.** the fir
3640: 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  st.*/.static int
3650: 20 61 63 74 69 6f 6e 63 6d 70 28 0a 20 20 73 74   actioncmp(.  st
3660: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 31  ruct action *ap1
3670: 2c 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ,.  struct actio
3680: 6e 20 2a 61 70 32 0a 29 7b 0a 20 20 69 6e 74 20  n *ap2.){.  int 
3690: 72 63 3b 0a 20 20 72 63 20 3d 20 61 70 31 2d 3e  rc;.  rc = ap1->
36a0: 73 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d  sp->index - ap2-
36b0: 3e 73 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66  >sp->index;.  if
36c0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc==0 ){.    r
36d0: 63 20 3d 20 28 69 6e 74 29 61 70 31 2d 3e 74 79  c = (int)ap1->ty
36e0: 70 65 20 2d 20 28 69 6e 74 29 61 70 32 2d 3e 74  pe - (int)ap2->t
36f0: 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ype;.  }.  if( r
3700: 63 3d 3d 30 20 26 26 20 61 70 31 2d 3e 74 79 70  c==0 && ap1->typ
3710: 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20  e==REDUCE ){.   
3720: 20 72 63 20 3d 20 61 70 31 2d 3e 78 2e 72 70 2d   rc = ap1->x.rp-
3730: 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e 78 2e  >index - ap2->x.
3740: 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rp->index;.  }. 
3750: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3760: 2a 20 53 6f 72 74 20 70 61 72 73 65 72 20 61 63  * Sort parser ac
3770: 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
3780: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41  struct action *A
3790: 63 74 69 6f 6e 5f 73 6f 72 74 28 0a 20 20 73 74  ction_sort(.  st
37a0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 0a  ruct action *ap.
37b0: 29 7b 0a 20 20 61 70 20 3d 20 28 73 74 72 75 63  ){.  ap = (struc
37c0: 74 20 61 63 74 69 6f 6e 20 2a 29 6d 73 6f 72 74  t action *)msort
37d0: 28 28 63 68 61 72 20 2a 29 61 70 2c 28 63 68 61  ((char *)ap,(cha
37e0: 72 20 2a 2a 29 26 61 70 2d 3e 6e 65 78 74 2c 0a  r **)&ap->next,.
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
3810: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3820: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61  *,const char*))a
3830: 63 74 69 6f 6e 63 6d 70 29 3b 0a 20 20 72 65 74  ctioncmp);.  ret
3840: 75 72 6e 20 61 70 3b 0a 7d 0a 0a 76 6f 69 64 20  urn ap;.}..void 
3850: 41 63 74 69 6f 6e 5f 61 64 64 28 61 70 70 2c 74  Action_add(app,t
3860: 79 70 65 2c 73 70 2c 61 72 67 29 0a 73 74 72 75  ype,sp,arg).stru
3870: 63 74 20 61 63 74 69 6f 6e 20 2a 2a 61 70 70 3b  ct action **app;
3880: 0a 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74  .enum e_action t
3890: 79 70 65 3b 0a 73 74 72 75 63 74 20 73 79 6d 62  ype;.struct symb
38a0: 6f 6c 20 2a 73 70 3b 0a 63 68 61 72 20 2a 61 72  ol *sp;.char *ar
38b0: 67 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 61 63  g;.{.  struct ac
38c0: 74 69 6f 6e 20 2a 6e 65 77 3b 0a 20 20 6e 65 77  tion *new;.  new
38d0: 20 3d 20 41 63 74 69 6f 6e 5f 6e 65 77 28 29 3b   = Action_new();
38e0: 0a 20 20 6e 65 77 2d 3e 6e 65 78 74 20 3d 20 2a  .  new->next = *
38f0: 61 70 70 3b 0a 20 20 2a 61 70 70 20 3d 20 6e 65  app;.  *app = ne
3900: 77 3b 0a 20 20 6e 65 77 2d 3e 74 79 70 65 20 3d  w;.  new->type =
3910: 20 74 79 70 65 3b 0a 20 20 6e 65 77 2d 3e 73 70   type;.  new->sp
3920: 20 3d 20 73 70 3b 0a 20 20 69 66 28 20 74 79 70   = sp;.  if( typ
3930: 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20  e==SHIFT ){.    
3940: 6e 65 77 2d 3e 78 2e 73 74 70 20 3d 20 28 73 74  new->x.stp = (st
3950: 72 75 63 74 20 73 74 61 74 65 20 2a 29 61 72 67  ruct state *)arg
3960: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
3970: 65 77 2d 3e 78 2e 72 70 20 3d 20 28 73 74 72 75  ew->x.rp = (stru
3980: 63 74 20 72 75 6c 65 20 2a 29 61 72 67 3b 0a 20  ct rule *)arg;. 
3990: 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   }.}./**********
39a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 65 77  ************ New
39b0: 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65   code to impleme
39c0: 6e 74 20 74 68 65 20 22 61 63 74 74 61 62 22 20  nt the "acttab" 
39d0: 6d 6f 64 75 6c 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  module *********
39e0: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  **/./*.** This m
39f0: 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73  odule implements
3a00: 20 72 6f 75 74 69 6e 65 73 20 75 73 65 20 74 6f   routines use to
3a10: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 79   construct the y
3a20: 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65  y_action[] table
3a30: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ..*/../*.** The 
3a40: 73 74 61 74 65 20 6f 66 20 74 68 65 20 79 79 5f  state of the yy_
3a50: 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 75 6e 64  action table und
3a60: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
3a70: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
3a80: 66 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69  f.** the followi
3a90: 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a  ng structure.*/.
3aa0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61  typedef struct a
3ab0: 63 74 74 61 62 20 61 63 74 74 61 62 3b 0a 73 74  cttab acttab;.st
3ac0: 72 75 63 74 20 61 63 74 74 61 62 20 7b 0a 20 20  ruct acttab {.  
3ad0: 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20 20 20  int nAction;    
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3af0: 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 64 20 73  Number of used s
3b00: 6c 6f 74 73 20 69 6e 20 61 41 63 74 69 6f 6e 5b  lots in aAction[
3b10: 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69  ] */.  int nActi
3b20: 6f 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  onAlloc;        
3b30: 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c      /* Slots all
3b40: 6f 63 61 74 65 64 20 66 6f 72 20 61 41 63 74 69  ocated for aActi
3b50: 6f 6e 5b 5d 20 2a 2f 0a 20 20 73 74 72 75 63 74  on[] */.  struct
3b60: 20 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 6f 6b 61   {.    int looka
3b70: 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  head;           
3b80: 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68    /* Value of th
3b90: 65 20 6c 6f 6f 6b 61 68 65 61 64 20 74 6f 6b 65  e lookahead toke
3ba0: 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 63 74  n */.    int act
3bb0: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
3bc0: 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f      /* Action to
3bd0: 20 74 61 6b 65 20 6f 6e 20 74 68 65 20 67 69 76   take on the giv
3be0: 65 6e 20 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a  en lookahead */.
3bf0: 20 20 7d 20 2a 61 41 63 74 69 6f 6e 2c 20 20 20    } *aAction,   
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3c10: 2a 20 54 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b  * The yy_action[
3c20: 5d 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  ] table under co
3c30: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
3c40: 20 20 2a 61 4c 6f 6f 6b 61 68 65 61 64 3b 20 20    *aLookahead;  
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3c60: 41 20 73 69 6e 67 6c 65 20 6e 65 77 20 74 72 61  A single new tra
3c70: 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 2a 2f 0a  nsaction set */.
3c80: 20 20 69 6e 74 20 6d 6e 4c 6f 6f 6b 61 68 65 61    int mnLookahea
3c90: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
3ca0: 2a 20 4d 69 6e 69 6d 75 6d 20 61 4c 6f 6f 6b 61  * Minimum aLooka
3cb0: 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64  head[].lookahead
3cc0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 41 63 74 69   */.  int mnActi
3cd0: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
3ce0: 20 20 20 2f 2a 20 41 63 74 69 6f 6e 20 61 73 73     /* Action ass
3cf0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 6d 6e 4c  ociated with mnL
3d00: 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e  ookahead */.  in
3d10: 74 20 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b 20 20  t mxLookahead;  
3d20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
3d30: 78 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65 61 64  ximum aLookahead
3d40: 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a  [].lookahead */.
3d50: 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64    int nLookahead
3d60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3d70: 2a 20 55 73 65 64 20 73 6c 6f 74 73 20 69 6e 20  * Used slots in 
3d80: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a  aLookahead[] */.
3d90: 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64    int nLookahead
3da0: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f  Alloc;         /
3db0: 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65  * Slots allocate
3dc0: 64 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b  d in aLookahead[
3dd0: 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65 74 75  ] */.};../* Retu
3de0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
3df0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
3e00: 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  yy_action table 
3e10: 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61  */.#define actta
3e20: 62 5f 73 69 7a 65 28 58 29 20 28 28 58 29 2d 3e  b_size(X) ((X)->
3e30: 6e 41 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65  nAction)../* The
3e40: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e   value for the N
3e50: 2d 74 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f  -th entry in yy_
3e60: 61 63 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e  action */.#defin
3e70: 65 20 61 63 74 74 61 62 5f 79 79 61 63 74 69 6f  e acttab_yyactio
3e80: 6e 28 58 2c 4e 29 20 20 28 28 58 29 2d 3e 61 41  n(X,N)  ((X)->aA
3e90: 63 74 69 6f 6e 5b 4e 5d 2e 61 63 74 69 6f 6e 29  ction[N].action)
3ea0: 0a 0a 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66  ../* The value f
3eb0: 6f 72 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72  or the N-th entr
3ec0: 79 20 69 6e 20 79 79 5f 6c 6f 6f 6b 61 68 65 61  y in yy_lookahea
3ed0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74  d */.#define act
3ee0: 74 61 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28  tab_yylookahead(
3ef0: 58 2c 4e 29 20 20 28 28 58 29 2d 3e 61 41 63 74  X,N)  ((X)->aAct
3f00: 69 6f 6e 5b 4e 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[N].lookahead
3f10: 29 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20 6d  )../* Free all m
3f20: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
3f30: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
3f40: 61 63 74 74 61 62 20 2a 2f 0a 76 6f 69 64 20 61  acttab */.void a
3f50: 63 74 74 61 62 5f 66 72 65 65 28 61 63 74 74 61  cttab_free(actta
3f60: 62 20 2a 70 29 7b 0a 20 20 66 72 65 65 28 20 70  b *p){.  free( p
3f70: 2d 3e 61 41 63 74 69 6f 6e 20 29 3b 0a 20 20 66  ->aAction );.  f
3f80: 72 65 65 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65  ree( p->aLookahe
3f90: 61 64 20 29 3b 0a 20 20 66 72 65 65 28 20 70 20  ad );.  free( p 
3fa0: 29 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  );.}../* Allocat
3fb0: 65 20 61 20 6e 65 77 20 61 63 74 74 61 62 20 73  e a new acttab s
3fc0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 61 63 74 74  tructure */.actt
3fd0: 61 62 20 2a 61 63 74 74 61 62 5f 61 6c 6c 6f 63  ab *acttab_alloc
3fe0: 28 76 6f 69 64 29 7b 0a 20 20 61 63 74 74 61 62  (void){.  acttab
3ff0: 20 2a 70 20 3d 20 63 61 6c 6c 6f 63 28 20 31 2c   *p = calloc( 1,
4000: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
4010: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
4020: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
4030: 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63  "Unable to alloc
4040: 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61  ate memory for a
4050: 20 6e 65 77 20 61 63 74 74 61 62 2e 22 29 3b 0a   new acttab.");.
4060: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
4070: 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
4080: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 72  sizeof(*p));.  r
4090: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 20 41  eturn p;.}../* A
40a0: 64 64 20 61 20 6e 65 77 20 61 63 74 69 6f 6e 20  dd a new action 
40b0: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  to the current t
40c0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 0a 2a  ransaction set.*
40d0: 2f 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 61 63  /.void acttab_ac
40e0: 74 69 6f 6e 28 61 63 74 74 61 62 20 2a 70 2c 20  tion(acttab *p, 
40f0: 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 2c 20 69  int lookahead, i
4100: 6e 74 20 61 63 74 69 6f 6e 29 7b 0a 20 20 69 66  nt action){.  if
4110: 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e  ( p->nLookahead>
4120: 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c  =p->nLookaheadAl
4130: 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c  loc ){.    p->nL
4140: 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 2b 3d  ookaheadAlloc +=
4150: 20 32 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 6f 6f   25;.    p->aLoo
4160: 6b 61 68 65 61 64 20 3d 20 72 65 61 6c 6c 6f 63  kahead = realloc
4170: 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 2c  ( p->aLookahead,
4180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
41a0: 7a 65 6f 66 28 70 2d 3e 61 4c 6f 6f 6b 61 68 65  zeof(p->aLookahe
41b0: 61 64 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f 6b 61  ad[0])*p->nLooka
41c0: 68 65 61 64 41 6c 6c 6f 63 20 29 3b 0a 20 20 20  headAlloc );.   
41d0: 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65   if( p->aLookahe
41e0: 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ad==0 ){.      f
41f0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d  printf(stderr,"m
4200: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29  alloc failed\n")
4210: 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
4220: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4230: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3d 3d   p->nLookahead==
4240: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6d 78 4c 6f  0 ){.    p->mxLo
4250: 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68  okahead = lookah
4260: 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 4c 6f  ead;.    p->mnLo
4270: 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68  okahead = lookah
4280: 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 41 63  ead;.    p->mnAc
4290: 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20  tion = action;. 
42a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
42b0: 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 3c 6c  p->mxLookahead<l
42c0: 6f 6f 6b 61 68 65 61 64 20 29 20 70 2d 3e 6d 78  ookahead ) p->mx
42d0: 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b  Lookahead = look
42e0: 61 68 65 61 64 3b 0a 20 20 20 20 69 66 28 20 70  ahead;.    if( p
42f0: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3e 6c 6f  ->mnLookahead>lo
4300: 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20  okahead ){.     
4310: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20   p->mnLookahead 
4320: 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20  = lookahead;.   
4330: 20 20 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d     p->mnAction =
4340: 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20   action;.    }. 
4350: 20 7d 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65   }.  p->aLookahe
4360: 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  ad[p->nLookahead
4370: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f  ].lookahead = lo
4380: 6f 6b 61 68 65 61 64 3b 0a 20 20 70 2d 3e 61 4c  okahead;.  p->aL
4390: 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f  ookahead[p->nLoo
43a0: 6b 61 68 65 61 64 5d 2e 61 63 74 69 6f 6e 20 3d  kahead].action =
43b0: 20 61 63 74 69 6f 6e 3b 0a 20 20 70 2d 3e 6e 4c   action;.  p->nL
43c0: 6f 6f 6b 61 68 65 61 64 2b 2b 3b 0a 7d 0a 0a 2f  ookahead++;.}../
43d0: 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 74 72 61  *.** Add the tra
43e0: 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62 75 69  nsaction set bui
43f0: 6c 74 20 75 70 20 77 69 74 68 20 70 72 69 6f 72  lt up with prior
4400: 20 63 61 6c 6c 73 20 74 6f 20 61 63 74 74 61 62   calls to acttab
4410: 5f 61 63 74 69 6f 6e 28 29 0a 2a 2a 20 69 6e 74  _action().** int
4420: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 63  o the current ac
4430: 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20 54 68 65  tion table.  The
4440: 6e 20 72 65 73 65 74 20 74 68 65 20 74 72 61 6e  n reset the tran
4450: 73 61 63 74 69 6f 6e 20 73 65 74 20 62 61 63 6b  saction set back
4460: 0a 2a 2a 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  .** to an empty 
4470: 73 65 74 20 69 6e 20 70 72 65 70 61 72 61 74 69  set in preparati
4480: 6f 6e 20 66 6f 72 20 61 20 6e 65 77 20 72 6f 75  on for a new rou
4490: 6e 64 20 6f 66 20 61 63 74 74 61 62 5f 61 63 74  nd of acttab_act
44a0: 69 6f 6e 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ion() calls..**.
44b0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66  ** Return the of
44c0: 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 61 63  fset into the ac
44d0: 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68  tion table of th
44e0: 65 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  e new transactio
44f0: 6e 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74 74 61 62  n..*/.int acttab
4500: 5f 69 6e 73 65 72 74 28 61 63 74 74 61 62 20 2a  _insert(acttab *
4510: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  p){.  int i, j, 
4520: 6b 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  k, n;.  assert( 
4530: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 30 20  p->nLookahead>0 
4540: 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  );..  /* Make su
4550: 72 65 20 77 65 20 68 61 76 65 20 65 6e 6f 75 67  re we have enoug
4560: 68 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  h space to hold 
4570: 74 68 65 20 65 78 70 61 6e 64 65 64 20 61 63 74  the expanded act
4580: 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69  ion table.  ** i
4590: 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65  n the worst case
45a0: 2e 20 20 54 68 65 20 77 6f 72 73 74 20 63 61 73  .  The worst cas
45b0: 65 20 6f 63 63 75 72 73 20 69 66 20 74 68 65 20  e occurs if the 
45c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 0a  transaction set.
45d0: 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 70 70    ** must be app
45e0: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75 72  ended to the cur
45f0: 72 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c  rent action tabl
4600: 65 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 70 2d 3e  e.  */.  n = p->
4610: 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 31 3b  mxLookahead + 1;
4620: 0a 20 20 69 66 28 20 70 2d 3e 6e 41 63 74 69 6f  .  if( p->nActio
4630: 6e 20 2b 20 6e 20 3e 3d 20 70 2d 3e 6e 41 63 74  n + n >= p->nAct
4640: 69 6f 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ionAlloc ){.    
4650: 69 6e 74 20 6f 6c 64 41 6c 6c 6f 63 20 3d 20 70  int oldAlloc = p
4660: 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 0a  ->nActionAlloc;.
4670: 20 20 20 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c      p->nActionAl
4680: 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e  loc = p->nAction
4690: 20 2b 20 6e 20 2b 20 70 2d 3e 6e 41 63 74 69 6f   + n + p->nActio
46a0: 6e 41 6c 6c 6f 63 20 2b 20 32 30 3b 0a 20 20 20  nAlloc + 20;.   
46b0: 20 70 2d 3e 61 41 63 74 69 6f 6e 20 3d 20 72 65   p->aAction = re
46c0: 61 6c 6c 6f 63 28 20 70 2d 3e 61 41 63 74 69 6f  alloc( p->aActio
46d0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
46f0: 65 6f 66 28 70 2d 3e 61 41 63 74 69 6f 6e 5b 30  eof(p->aAction[0
4700: 5d 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c  ])*p->nActionAll
4710: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  oc);.    if( p->
4720: 61 41 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20  aAction==0 ){.  
4730: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
4740: 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  rr,"malloc faile
4750: 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69  d\n");.      exi
4760: 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(1);.    }.    
4770: 66 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63 3b 20  for(i=oldAlloc; 
4780: 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  i<p->nActionAllo
4790: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  c; i++){.      p
47a0: 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f  ->aAction[i].loo
47b0: 6b 61 68 65 61 64 20 3d 20 2d 31 3b 0a 20 20 20  kahead = -1;.   
47c0: 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d     p->aAction[i]
47d0: 2e 61 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a 20 20  .action = -1;.  
47e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63    }.  }..  /* Sc
47f0: 61 6e 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  an the existing 
4800: 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6c 6f 6f  action table loo
4810: 6b 69 6e 67 20 66 6f 72 20 61 6e 20 6f 66 66 73  king for an offs
4820: 65 74 20 77 68 65 72 65 20 77 65 20 63 61 6e 0a  et where we can.
4830: 20 20 2a 2a 20 69 6e 73 65 72 74 20 74 68 65 20    ** insert the 
4840: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
4850: 69 6f 6e 20 73 65 74 2e 20 20 46 61 6c 6c 20 6f  ion set.  Fall o
4860: 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77  ut of the loop w
4870: 68 65 6e 20 74 68 61 74 0a 20 20 2a 2a 20 6f 66  hen that.  ** of
4880: 66 73 65 74 20 69 73 20 66 6f 75 6e 64 2e 20 20  fset is found.  
4890: 49 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61 73  In the worst cas
48a0: 65 2c 20 77 65 20 66 61 6c 6c 20 6f 75 74 20 6f  e, we fall out o
48b0: 66 20 74 68 65 20 6c 6f 6f 70 20 77 68 65 6e 0a  f the loop when.
48c0: 20 20 2a 2a 20 69 20 72 65 61 63 68 65 73 20 70    ** i reaches p
48d0: 2d 3e 6e 41 63 74 69 6f 6e 2c 20 77 68 69 63 68  ->nAction, which
48e0: 20 6d 65 61 6e 73 20 77 65 20 61 70 70 65 6e 64   means we append
48f0: 20 74 68 65 20 6e 65 77 20 74 72 61 6e 73 61 63   the new transac
4900: 74 69 6f 6e 20 73 65 74 2e 0a 20 20 2a 2a 0a 20  tion set..  **. 
4910: 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64   ** i is the ind
4920: 65 78 20 69 6e 20 70 2d 3e 61 41 63 74 69 6f 6e  ex in p->aAction
4930: 5b 5d 20 77 68 65 72 65 20 70 2d 3e 6d 6e 4c 6f  [] where p->mnLo
4940: 6f 6b 61 68 65 61 64 20 69 73 20 69 6e 73 65 72  okahead is inser
4950: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ted..  */.  for(
4960: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f  i=0; i<p->nActio
4970: 6e 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  n+p->mnLookahead
4980: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
4990: 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f  p->aAction[i].lo
49a0: 6f 6b 61 68 65 61 64 3c 30 20 29 7b 0a 20 20 20  okahead<0 ){.   
49b0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
49c0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b  >nLookahead; j++
49d0: 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 70  ){.        k = p
49e0: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e  ->aLookahead[j].
49f0: 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d  lookahead - p->m
4a00: 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a  nLookahead + i;.
4a10: 20 20 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20          if( k<0 
4a20: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
4a30: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
4a40: 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e 3d 30 20  k].lookahead>=0 
4a50: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
4a60: 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e  .      if( j<p->
4a70: 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e  nLookahead ) con
4a80: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
4a90: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69  (j=0; j<p->nActi
4aa0: 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  on; j++){.      
4ab0: 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e    if( p->aAction
4ac0: 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a  [j].lookahead==j
4ad0: 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d  +p->mnLookahead-
4ae0: 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
4af0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
4b00: 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 7b 0a 20 20  p->nAction ){.  
4b10: 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a        break;  /*
4b20: 20 46 69 74 73 20 69 6e 20 65 6d 70 74 79 20 73   Fits in empty s
4b30: 6c 6f 74 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  lots */.      }.
4b40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
4b50: 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b  >aAction[i].look
4b60: 61 68 65 61 64 3d 3d 70 2d 3e 6d 6e 4c 6f 6f 6b  ahead==p->mnLook
4b70: 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 69  ahead ){.      i
4b80: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d  f( p->aAction[i]
4b90: 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63  .action!=p->mnAc
4ba0: 74 69 6f 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  tion ) continue;
4bb0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
4bc0: 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b  j<p->nLookahead;
4bd0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b   j++){.        k
4be0: 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64   = p->aLookahead
4bf0: 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20  [j].lookahead - 
4c00: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b  p->mnLookahead +
4c10: 20 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   i;.        if( 
4c20: 6b 3c 30 20 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63  k<0 || k>=p->nAc
4c30: 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20  tion ) break;.  
4c40: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f        if( p->aLo
4c50: 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61  okahead[j].looka
4c60: 68 65 61 64 21 3d 70 2d 3e 61 41 63 74 69 6f 6e  head!=p->aAction
4c70: 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 29 20  [k].lookahead ) 
4c80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
4c90: 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  f( p->aLookahead
4ca0: 5b 6a 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 61  [j].action!=p->a
4cb0: 41 63 74 69 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e  Action[k].action
4cc0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
4cd0: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d  }.      if( j<p-
4ce0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f  >nLookahead ) co
4cf0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20  ntinue;.      n 
4d00: 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  = 0;.      for(j
4d10: 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f 6e  =0; j<p->nAction
4d20: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4d30: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a  if( p->aAction[j
4d40: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 20  ].lookahead<0 ) 
4d50: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
4d60: 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e    if( p->aAction
4d70: 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a  [j].lookahead==j
4d80: 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d  +p->mnLookahead-
4d90: 69 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d  i ) n++;.      }
4da0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 70 2d  .      if( n==p-
4db0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20  >nLookahead ){. 
4dc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 2f         break;  /
4dd0: 2a 20 53 61 6d 65 20 61 73 20 61 20 70 72 69 6f  * Same as a prio
4de0: 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  r transaction se
4df0: 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  t */.      }.   
4e00: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65   }.  }.  /* Inse
4e10: 72 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  rt transaction s
4e20: 65 74 20 61 74 20 69 6e 64 65 78 20 69 2e 20 2a  et at index i. *
4e30: 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70  /.  for(j=0; j<p
4e40: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b  ->nLookahead; j+
4e50: 2b 29 7b 0a 20 20 20 20 6b 20 3d 20 70 2d 3e 61  +){.    k = p->a
4e60: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f  Lookahead[j].loo
4e70: 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f  kahead - p->mnLo
4e80: 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20  okahead + i;.   
4e90: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 20 3d   p->aAction[k] =
4ea0: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a   p->aLookahead[j
4eb0: 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 2d  ];.    if( k>=p-
4ec0: 3e 6e 41 63 74 69 6f 6e 20 29 20 70 2d 3e 6e 41  >nAction ) p->nA
4ed0: 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b 0a 20 20 7d  ction = k+1;.  }
4ee0: 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  .  p->nLookahead
4ef0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 74 75   = 0;..  /* Retu
4f00: 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 74 68  rn the offset th
4f10: 61 74 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  at is added to t
4f20: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e 20  he lookahead in 
4f30: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
4f40: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 6e 74 6f  .  ** index into
4f50: 20 79 79 5f 61 63 74 69 6f 6e 20 6f 66 20 74 68   yy_action of th
4f60: 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 65  e action */.  re
4f70: 74 75 72 6e 20 69 20 2d 20 70 2d 3e 6d 6e 4c 6f  turn i - p->mnLo
4f80: 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 2a 2a  okahead;.}../***
4f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4fa0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
4fb0: 65 20 22 62 75 69 6c 64 2e 63 22 20 2a 2a 2a 2a  e "build.c" ****
4fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
4fe0: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 63 6f 6e   Routines to con
4ff0: 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20 66 69  struction the fi
5000: 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69  nite state machi
5010: 6e 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e  ne for the LEMON
5020: 0a 2a 2a 20 70 61 72 73 65 72 20 67 65 6e 65 72  .** parser gener
5030: 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e  ator..*/../* Fin
5040: 64 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73  d a precedence s
5050: 79 6d 62 6f 6c 20 6f 66 20 65 76 65 72 79 20 72  ymbol of every r
5060: 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  ule in the gramm
5070: 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 6f 73 65  ar..** .** Those
5080: 20 72 75 6c 65 73 20 77 68 69 63 68 20 68 61 76   rules which hav
5090: 65 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73  e a precedence s
50a0: 79 6d 62 6f 6c 20 63 6f 64 65 64 20 69 6e 20 74  ymbol coded in t
50b0: 68 65 20 69 6e 70 75 74 0a 2a 2a 20 67 72 61 6d  he input.** gram
50c0: 6d 61 72 20 75 73 69 6e 67 20 74 68 65 20 22 5b  mar using the "[
50d0: 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74 72 75  symbol]" constru
50e0: 63 74 20 77 69 6c 6c 20 61 6c 72 65 61 64 79 20  ct will already 
50f0: 68 61 76 65 20 74 68 65 0a 2a 2a 20 72 70 2d 3e  have the.** rp->
5100: 70 72 65 63 73 79 6d 20 66 69 65 6c 64 20 66 69  precsym field fi
5110: 6c 6c 65 64 2e 20 20 4f 74 68 65 72 20 72 75 6c  lled.  Other rul
5120: 65 73 20 74 61 6b 65 20 61 73 20 74 68 65 69 72  es take as their
5130: 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73   precedence.** s
5140: 79 6d 62 6f 6c 20 74 68 65 20 66 69 72 73 74 20  ymbol the first 
5150: 52 48 53 20 73 79 6d 62 6f 6c 20 77 69 74 68 20  RHS symbol with 
5160: 61 20 64 65 66 69 6e 65 64 20 70 72 65 63 65 64  a defined preced
5170: 65 6e 63 65 2e 20 20 49 66 20 74 68 65 72 65 0a  ence.  If there.
5180: 2a 2a 20 61 72 65 20 6e 6f 74 20 52 48 53 20 73  ** are not RHS s
5190: 79 6d 62 6f 6c 73 20 77 69 74 68 20 61 20 64 65  ymbols with a de
51a0: 66 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65  fined precedence
51b0: 2c 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65  , the precedence
51c0: 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66 69 65 6c 64  .** symbol field
51d0: 20 69 73 20 6c 65 66 74 20 62 6c 61 6e 6b 2e 0a   is left blank..
51e0: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c 65  */.void FindRule
51f0: 50 72 65 63 65 64 65 6e 63 65 73 28 78 70 29 0a  Precedences(xp).
5200: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 78 70  struct lemon *xp
5210: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ;.{.  struct rul
5220: 65 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72 70 3d  e *rp;.  for(rp=
5230: 78 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  xp->rule; rp; rp
5240: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
5250: 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d  if( rp->precsym=
5260: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
5270: 69 2c 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  i, j;.      for(
5280: 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 20  i=0; i<rp->nrhs 
5290: 26 26 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d  && rp->precsym==
52a0: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  0; i++){.       
52b0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
52c0: 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
52d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d  .        if( sp-
52e0: 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
52f0: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
5300: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 70 2d    for(j=0; j<sp-
5310: 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a  >nsubsym; j++){.
5320: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
5330: 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 70  sp->subsym[j]->p
5340: 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  rec>=0 ){.      
5350: 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63          rp->prec
5360: 73 79 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d  sym = sp->subsym
5370: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [j];.           
5380: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5390: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
53a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
53b0: 65 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d  e if( sp->prec>=
53c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
53d0: 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 72 70 2d  p->precsym = rp-
53e0: 3e 72 68 73 5b 69 5d 3b 0a 09 7d 0a 20 20 20 20  >rhs[i];..}.    
53f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5400: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69  return;.}../* Fi
5410: 6e 64 20 61 6c 6c 20 6e 6f 6e 74 65 72 6d 69 6e  nd all nontermin
5420: 61 6c 73 20 77 68 69 63 68 20 77 69 6c 6c 20 67  als which will g
5430: 65 6e 65 72 61 74 65 20 74 68 65 20 65 6d 70 74  enerate the empt
5440: 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 54 68 65  y string..** The
5450: 6e 20 67 6f 20 62 61 63 6b 20 61 6e 64 20 63 6f  n go back and co
5460: 6d 70 75 74 65 20 74 68 65 20 66 69 72 73 74 20  mpute the first 
5470: 73 65 74 73 20 6f 66 20 65 76 65 72 79 20 6e 6f  sets of every no
5480: 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2a 20 54 68  nterminal..** Th
5490: 65 20 66 69 72 73 74 20 73 65 74 20 69 73 20 74  e first set is t
54a0: 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 74 65  he set of all te
54b0: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 77  rminal symbols w
54c0: 68 69 63 68 20 63 61 6e 20 62 65 67 69 6e 0a 2a  hich can begin.*
54d0: 2a 20 61 20 73 74 72 69 6e 67 20 67 65 6e 65 72  * a string gener
54e0: 61 74 65 64 20 62 79 20 74 68 61 74 20 6e 6f 6e  ated by that non
54f0: 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69  terminal..*/.voi
5500: 64 20 46 69 6e 64 46 69 72 73 74 53 65 74 73 28  d FindFirstSets(
5510: 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
5520: 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e  on *lemp;.{.  in
5530: 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74  t i, j;.  struct
5540: 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74   rule *rp;.  int
5550: 20 70 72 6f 67 72 65 73 73 3b 0a 0a 20 20 66 6f   progress;..  fo
5560: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
5570: 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
5580: 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b    lemp->symbols[
5590: 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d  i]->lambda = LEM
55a0: 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 7d 0a 20 20  ON_FALSE;.  }.  
55b0: 66 6f 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74 65 72  for(i=lemp->nter
55c0: 6d 69 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  minal; i<lemp->n
55d0: 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
55e0: 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b    lemp->symbols[
55f0: 69 5d 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 53  i]->firstset = S
5600: 65 74 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a 20 20  etNew();.  }..  
5610: 2f 2a 20 46 69 72 73 74 20 63 6f 6d 70 75 74 65  /* First compute
5620: 20 61 6c 6c 20 6c 61 6d 62 64 61 73 20 2a 2f 0a   all lambdas */.
5630: 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65    do{.    progre
5640: 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ss = 0;.    for(
5650: 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
5660: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
5670: 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c  .      if( rp->l
5680: 68 73 2d 3e 6c 61 6d 62 64 61 20 29 20 63 6f 6e  hs->lambda ) con
5690: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
56a0: 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
56b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
56c0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
56d0: 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
56e0: 0a 20 20 20 20 20 20 20 20 20 69 66 28 20 73 70  .         if( sp
56f0: 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c  ->type!=TERMINAL
5700: 20 7c 7c 20 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d   || sp->lambda==
5710: 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72  LEMON_FALSE ) br
5720: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5730: 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72     if( i==rp->nr
5740: 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 70  hs ){.        rp
5750: 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 3d 20  ->lhs->lambda = 
5760: 4c 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20  LEMON_TRUE;.    
5770: 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31      progress = 1
5780: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5790: 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65    }while( progre
57a0: 73 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ss );..  /* Now 
57b0: 63 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69 72 73  compute all firs
57c0: 74 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a  t sets */.  do{.
57d0: 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
57e0: 6c 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20  l *s1, *s2;.    
57f0: 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  progress = 0;.  
5800: 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
5810: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
5820: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 73 31 20  next){.      s1 
5830: 3d 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20  = rp->lhs;.     
5840: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
5850: 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
5860: 20 20 20 20 73 32 20 3d 20 72 70 2d 3e 72 68 73      s2 = rp->rhs
5870: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
5880: 20 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49   s2->type==TERMI
5890: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
58a0: 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74   progress += Set
58b0: 41 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74  Add(s1->firstset
58c0: 2c 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  ,s2->index);.   
58d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
58e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
58f0: 73 32 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54  s2->type==MULTIT
5900: 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
5910: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
5920: 73 32 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b  s2->nsubsym; j++
5930: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
5940: 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41 64  rogress += SetAd
5950: 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73  d(s1->firstset,s
5960: 32 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 69 6e  2->subsym[j]->in
5970: 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dex);.          
5980: 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
5990: 6b 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 31  k;..}else if( s1
59a0: 3d 3d 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20  ==s2 ){.        
59b0: 20 20 69 66 28 20 73 31 2d 3e 6c 61 6d 62 64 61    if( s1->lambda
59c0: 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20  ==LEMON_FALSE ) 
59d0: 62 72 65 61 6b 3b 0a 09 7d 65 6c 73 65 7b 0a 20  break;..}else{. 
59e0: 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73           progres
59f0: 73 20 2b 3d 20 53 65 74 55 6e 69 6f 6e 28 73 31  s += SetUnion(s1
5a00: 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 66  ->firstset,s2->f
5a10: 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20 20  irstset);.      
5a20: 20 20 20 20 69 66 28 20 73 32 2d 3e 6c 61 6d 62      if( s2->lamb
5a30: 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20  da==LEMON_FALSE 
5a40: 29 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20  ) break;..}.    
5a50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69    }.    }.  }whi
5a60: 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a  le( progress );.
5a70: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
5a80: 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30  Compute all LR(0
5a90: 29 20 73 74 61 74 65 73 20 66 6f 72 20 74 68 65  ) states for the
5aa0: 20 67 72 61 6d 6d 61 72 2e 20 20 4c 69 6e 6b 73   grammar.  Links
5ab0: 0a 2a 2a 20 61 72 65 20 61 64 64 65 64 20 74 6f  .** are added to
5ac0: 20 62 65 74 77 65 65 6e 20 73 6f 6d 65 20 73 74   between some st
5ad0: 61 74 65 73 20 73 6f 20 74 68 61 74 20 74 68 65  ates so that the
5ae0: 20 4c 52 28 31 29 20 66 6f 6c 6c 6f 77 20 73 65   LR(1) follow se
5af0: 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 6f 6d  ts.** can be com
5b00: 70 75 74 65 64 20 6c 61 74 65 72 2e 0a 2a 2f 0a  puted later..*/.
5b10: 50 52 49 56 41 54 45 20 73 74 72 75 63 74 20 73  PRIVATE struct s
5b20: 74 61 74 65 20 2a 67 65 74 73 74 61 74 65 28 2f  tate *getstate(/
5b30: 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  * struct lemon *
5b40: 20 2a 2f 29 3b 20 20 2f 2a 20 66 6f 72 77 61 72   */);  /* forwar
5b50: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 76  d reference */.v
5b60: 6f 69 64 20 46 69 6e 64 53 74 61 74 65 73 28 6c  oid FindStates(l
5b70: 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
5b80: 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72  n *lemp;.{.  str
5b90: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
5ba0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
5bb0: 70 3b 0a 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74  p;..  Configlist
5bc0: 5f 69 6e 69 74 28 29 3b 0a 0a 20 20 2f 2a 20 46  _init();..  /* F
5bd0: 69 6e 64 20 74 68 65 20 73 74 61 72 74 20 73 79  ind the start sy
5be0: 6d 62 6f 6c 20 2a 2f 0a 20 20 69 66 28 20 6c 65  mbol */.  if( le
5bf0: 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20  mp->start ){.   
5c00: 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e   sp = Symbol_fin
5c10: 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a  d(lemp->start);.
5c20: 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b      if( sp==0 ){
5c30: 0a 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28  .      ErrorMsg(
5c40: 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30  lemp->filename,0
5c50: 2c 0a 22 54 68 65 20 73 70 65 63 69 66 69 65 64  ,."The specified
5c60: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22   start symbol \"
5c70: 25 73 5c 22 20 69 73 20 6e 6f 74 20 5c 0a 69 6e  %s\" is not \.in
5c80: 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f   a nonterminal o
5c90: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20  f the grammar.  
5ca0: 5c 22 25 73 5c 22 20 77 69 6c 6c 20 62 65 20 75  \"%s\" will be u
5cb0: 73 65 64 20 61 73 20 74 68 65 20 73 74 61 72 74  sed as the start
5cc0: 20 5c 0a 73 79 6d 62 6f 6c 20 69 6e 73 74 65 61   \.symbol instea
5cd0: 64 2e 22 2c 6c 65 6d 70 2d 3e 73 74 61 72 74 2c  d.",lemp->start,
5ce0: 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 2d  lemp->rule->lhs-
5cf0: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65  >name);.      le
5d00: 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
5d10: 20 20 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d        sp = lemp-
5d20: 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 20 20  >rule->lhs;.    
5d30: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
5d40: 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e  p = lemp->rule->
5d50: 6c 68 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  lhs;.  }..  /* M
5d60: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 74 61  ake sure the sta
5d70: 72 74 20 73 79 6d 62 6f 6c 20 64 6f 65 73 6e 27  rt symbol doesn'
5d80: 74 20 6f 63 63 75 72 20 6f 6e 20 74 68 65 20 72  t occur on the r
5d90: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
5da0: 66 0a 20 20 2a 2a 20 61 6e 79 20 72 75 6c 65 2e  f.  ** any rule.
5db0: 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
5dc0: 72 20 69 66 20 69 74 20 64 6f 65 73 2e 20 20 28  r if it does.  (
5dd0: 59 41 43 43 20 77 6f 75 6c 64 20 67 65 6e 65 72  YACC would gener
5de0: 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 73  ate a new.  ** s
5df0: 74 61 72 74 20 73 79 6d 62 6f 6c 20 69 6e 20 74  tart symbol in t
5e00: 68 69 73 20 63 61 73 65 2e 29 20 2a 2f 0a 20 20  his case.) */.  
5e10: 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
5e20: 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
5e30: 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  xt){.    int i;.
5e40: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
5e50: 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
5e60: 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73       if( rp->rhs
5e70: 5b 69 5d 3d 3d 73 70 20 29 7b 20 20 20 2f 2a 20  [i]==sp ){   /* 
5e80: 46 49 58 20 4d 45 3a 20 20 44 65 61 6c 20 77 69  FIX ME:  Deal wi
5e90: 74 68 20 6d 75 6c 74 69 74 65 72 6d 69 6e 61 6c  th multiterminal
5ea0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 72 72  s */.        Err
5eb0: 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
5ec0: 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 74 61  name,0,."The sta
5ed0: 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22  rt symbol \"%s\"
5ee0: 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 5c   occurs on the \
5ef0: 0a 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65  .right-hand side
5f00: 20 6f 66 20 61 20 72 75 6c 65 2e 20 54 68 69 73   of a rule. This
5f10: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
5f20: 61 20 70 61 72 73 65 72 20 77 68 69 63 68 20 5c  a parser which \
5f30: 0a 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 70  .does not work p
5f40: 72 6f 70 65 72 6c 79 2e 22 2c 73 70 2d 3e 6e 61  roperly.",sp->na
5f50: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d  me);.        lem
5f60: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
5f70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5f80: 0a 0a 20 20 2f 2a 20 54 68 65 20 62 61 73 69 73  ..  /* The basis
5f90: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73   configuration s
5fa0: 65 74 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  et for the first
5fb0: 20 73 74 61 74 65 0a 20 20 2a 2a 20 69 73 20 61   state.  ** is a
5fc0: 6c 6c 20 72 75 6c 65 73 20 77 68 69 63 68 20 68  ll rules which h
5fd0: 61 76 65 20 74 68 65 20 73 74 61 72 74 20 73 79  ave the start sy
5fe0: 6d 62 6f 6c 20 61 73 20 74 68 65 69 72 0a 20 20  mbol as their.  
5ff0: 2a 2a 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  ** left-hand sid
6000: 65 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 73 70  e */.  for(rp=sp
6010: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
6020: 70 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20  p->nextlhs){.   
6030: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
6040: 6e 65 77 63 66 70 3b 0a 20 20 20 20 72 70 2d 3e  newcfp;.    rp->
6050: 6c 68 73 53 74 61 72 74 20 3d 20 31 3b 0a 20 20  lhsStart = 1;.  
6060: 20 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69    newcfp = Confi
6070: 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 72  glist_addbasis(r
6080: 70 2c 30 29 3b 0a 20 20 20 20 53 65 74 41 64 64  p,0);.    SetAdd
6090: 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 30 29 3b  (newcfp->fws,0);
60a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
60b0: 74 65 20 74 68 65 20 66 69 72 73 74 20 73 74 61  te the first sta
60c0: 74 65 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 73  te.  All other s
60d0: 74 61 74 65 73 20 77 69 6c 6c 20 62 65 0a 20 20  tates will be.  
60e0: 2a 2a 20 63 6f 6d 70 75 74 65 64 20 61 75 74 6f  ** computed auto
60f0: 6d 61 74 69 63 61 6c 6c 79 20 64 75 72 69 6e 67  matically during
6100: 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
6110: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 6e   of the first on
6120: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 74 75  e..  ** The retu
6130: 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20  rned pointer to 
6140: 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65 20  the first state 
6150: 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a  is not used. */.
6160: 20 20 28 76 6f 69 64 29 67 65 74 73 74 61 74 65    (void)getstate
6170: 28 6c 65 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e  (lemp);.  return
6180: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
6190: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
61a0: 61 74 65 20 77 68 69 63 68 20 69 73 20 64 65 73  ate which is des
61b0: 63 72 69 62 65 64 20 62 79 20 74 68 65 20 63 6f  cribed by the co
61c0: 6e 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 6c  nfiguration.** l
61d0: 69 73 74 20 77 68 69 63 68 20 68 61 73 20 62 65  ist which has be
61e0: 65 6e 20 62 75 69 6c 74 20 66 72 6f 6d 20 63 61  en built from ca
61f0: 6c 6c 73 20 74 6f 20 43 6f 6e 66 69 67 6c 69 73  lls to Configlis
6200: 74 5f 61 64 64 2e 0a 2a 2f 0a 50 52 49 56 41 54  t_add..*/.PRIVAT
6210: 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66  E void buildshif
6220: 74 73 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d  ts(/* struct lem
6230: 6f 6e 20 2a 2c 20 73 74 72 75 63 74 20 73 74 61  on *, struct sta
6240: 74 65 20 2a 20 2a 2f 29 3b 20 2f 2a 20 46 6f 72  te * */); /* For
6250: 77 64 20 72 65 66 20 2a 2f 0a 50 52 49 56 41 54  wd ref */.PRIVAT
6260: 45 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  E struct state *
6270: 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29 0a 73  getstate(lemp).s
6280: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
6290: 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  p;.{.  struct co
62a0: 6e 66 69 67 20 2a 63 66 70 2c 20 2a 62 70 3b 0a  nfig *cfp, *bp;.
62b0: 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
62c0: 73 74 70 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61  stp;..  /* Extra
62d0: 63 74 20 74 68 65 20 73 6f 72 74 65 64 20 62 61  ct the sorted ba
62e0: 73 69 73 20 6f 66 20 74 68 65 20 6e 65 77 20 73  sis of the new s
62f0: 74 61 74 65 2e 20 20 54 68 65 20 62 61 73 69 73  tate.  The basis
6300: 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64   was constructed
6310: 0a 20 20 2a 2a 20 62 79 20 70 72 69 6f 72 20 63  .  ** by prior c
6320: 61 6c 6c 73 20 74 6f 20 22 43 6f 6e 66 69 67 6c  alls to "Configl
6330: 69 73 74 5f 61 64 64 62 61 73 69 73 28 29 22 2e  ist_addbasis()".
6340: 20 2a 2f 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74   */.  Configlist
6350: 5f 73 6f 72 74 62 61 73 69 73 28 29 3b 0a 20 20  _sortbasis();.  
6360: 62 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f  bp = Configlist_
6370: 62 61 73 69 73 28 29 3b 0a 0a 20 20 2f 2a 20 47  basis();..  /* G
6380: 65 74 20 61 20 73 74 61 74 65 20 77 69 74 68 20  et a state with 
6390: 74 68 65 20 73 61 6d 65 20 62 61 73 69 73 20 2a  the same basis *
63a0: 2f 0a 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f  /.  stp = State_
63b0: 66 69 6e 64 28 62 70 29 3b 0a 20 20 69 66 28 20  find(bp);.  if( 
63c0: 73 74 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20  stp ){.    /* A 
63d0: 73 74 61 74 65 20 77 69 74 68 20 74 68 65 20 73  state with the s
63e0: 61 6d 65 20 62 61 73 69 73 20 61 6c 72 65 61 64  ame basis alread
63f0: 79 20 65 78 69 73 74 73 21 20 20 43 6f 70 79 20  y exists!  Copy 
6400: 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73  all the follow-s
6410: 65 74 0a 20 20 20 20 2a 2a 20 70 72 6f 70 61 67  et.    ** propag
6420: 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 66 72 6f 6d  ation links from
6430: 20 74 68 65 20 73 74 61 74 65 20 75 6e 64 65 72   the state under
6440: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e   construction in
6450: 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72  to the.    ** pr
6460: 65 65 78 69 73 74 69 6e 67 20 73 74 61 74 65 2c  eexisting state,
6470: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70   then return a p
6480: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72  ointer to the pr
6490: 65 65 78 69 73 74 69 6e 67 20 73 74 61 74 65 20  eexisting state 
64a0: 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f  */.    struct co
64b0: 6e 66 69 67 20 2a 78 2c 20 2a 79 3b 0a 20 20 20  nfig *x, *y;.   
64c0: 20 66 6f 72 28 78 3d 62 70 2c 20 79 3d 73 74 70   for(x=bp, y=stp
64d0: 2d 3e 62 70 3b 20 78 20 26 26 20 79 3b 20 78 3d  ->bp; x && y; x=
64e0: 78 2d 3e 62 70 2c 20 79 3d 79 2d 3e 62 70 29 7b  x->bp, y=y->bp){
64f0: 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 63 6f 70  .      Plink_cop
6500: 79 28 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e 62 70  y(&y->bplp,x->bp
6510: 6c 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b  lp);.      Plink
6520: 5f 64 65 6c 65 74 65 28 78 2d 3e 66 70 6c 70 29  _delete(x->fplp)
6530: 3b 0a 20 20 20 20 20 20 78 2d 3e 66 70 6c 70 20  ;.      x->fplp 
6540: 3d 20 78 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20  = x->bplp = 0;. 
6550: 20 20 20 7d 0a 20 20 20 20 63 66 70 20 3d 20 43     }.    cfp = C
6560: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e  onfiglist_return
6570: 28 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69  ();.    Configli
6580: 73 74 5f 65 61 74 28 63 66 70 29 3b 0a 20 20 7d  st_eat(cfp);.  }
6590: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
65a0: 73 20 72 65 61 6c 6c 79 20 69 73 20 61 20 6e 65  s really is a ne
65b0: 77 20 73 74 61 74 65 2e 20 20 43 6f 6e 73 74 72  w state.  Constr
65c0: 75 63 74 20 61 6c 6c 20 74 68 65 20 64 65 74 61  uct all the deta
65d0: 69 6c 73 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69  ils */.    Confi
65e0: 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c 65  glist_closure(le
65f0: 6d 70 29 3b 20 20 20 20 2f 2a 20 43 6f 6d 70 75  mp);    /* Compu
6600: 74 65 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  te the configura
6610: 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a  tion closure */.
6620: 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73      Configlist_s
6630: 6f 72 74 28 29 3b 20 20 20 20 20 20 20 20 20 20  ort();          
6640: 20 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f 6e   /* Sort the con
6650: 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75  figuration closu
6660: 72 65 20 2a 2f 0a 20 20 20 20 63 66 70 20 3d 20  re */.    cfp = 
6670: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72  Configlist_retur
6680: 6e 28 29 3b 20 20 20 2f 2a 20 47 65 74 20 61 20  n();   /* Get a 
6690: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
66a0: 6f 6e 66 69 67 20 6c 69 73 74 20 2a 2f 0a 20 20  onfig list */.  
66b0: 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f 6e 65    stp = State_ne
66c0: 77 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f  w();           /
66d0: 2a 20 41 20 6e 65 77 20 73 74 61 74 65 20 73 74  * A new state st
66e0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 4d  ructure */.    M
66f0: 65 6d 6f 72 79 43 68 65 63 6b 28 73 74 70 29 3b  emoryCheck(stp);
6700: 0a 20 20 20 20 73 74 70 2d 3e 62 70 20 3d 20 62  .    stp->bp = b
6710: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
6720: 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68    /* Remember th
6730: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
6740: 62 61 73 69 73 20 2a 2f 0a 20 20 20 20 73 74 70  basis */.    stp
6750: 2d 3e 63 66 70 20 3d 20 63 66 70 3b 20 20 20 20  ->cfp = cfp;    
6760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d            /* Rem
6770: 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67  ember the config
6780: 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20  uration closure 
6790: 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 73 74 61 74  */.    stp->stat
67a0: 65 6e 75 6d 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74  enum = lemp->nst
67b0: 61 74 65 2b 2b 3b 20 2f 2a 20 45 76 65 72 79 20  ate++; /* Every 
67c0: 73 74 61 74 65 20 67 65 74 73 20 61 20 73 65 71  state gets a seq
67d0: 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  uence number */.
67e0: 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 30 3b      stp->ap = 0;
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6800: 20 2f 2a 20 4e 6f 20 61 63 74 69 6f 6e 73 2c 20   /* No actions, 
6810: 79 65 74 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74  yet. */.    Stat
6820: 65 5f 69 6e 73 65 72 74 28 73 74 70 2c 73 74 70  e_insert(stp,stp
6830: 2d 3e 62 70 29 3b 20 20 20 2f 2a 20 41 64 64 20  ->bp);   /* Add 
6840: 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 61 62  to the state tab
6850: 6c 65 20 2a 2f 0a 20 20 20 20 62 75 69 6c 64 73  le */.    builds
6860: 68 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29 3b  hifts(lemp,stp);
6870: 20 20 20 20 20 20 20 2f 2a 20 52 65 63 75 72 73         /* Recurs
6880: 69 76 65 6c 79 20 63 6f 6d 70 75 74 65 20 73 75  ively compute su
6890: 63 63 65 73 73 6f 72 20 73 74 61 74 65 73 20 2a  ccessor states *
68a0: 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  /.  }.  return s
68b0: 74 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  tp;.}../*.** Ret
68c0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 77 6f 20  urn true if two 
68d0: 73 79 6d 62 6f 6c 73 20 61 72 65 20 74 68 65 20  symbols are the 
68e0: 73 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 61 6d  same..*/.int sam
68f0: 65 5f 73 79 6d 62 6f 6c 28 61 2c 62 29 0a 73 74  e_symbol(a,b).st
6900: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 61 3b 0a  ruct symbol *a;.
6910: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62  struct symbol *b
6920: 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ;.{.  int i;.  i
6930: 66 28 20 61 3d 3d 62 20 29 20 72 65 74 75 72 6e  f( a==b ) return
6940: 20 31 3b 0a 20 20 69 66 28 20 61 2d 3e 74 79 70   1;.  if( a->typ
6950: 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e!=MULTITERMINAL
6960: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
6970: 66 28 20 62 2d 3e 74 79 70 65 21 3d 4d 55 4c 54  f( b->type!=MULT
6980: 49 54 45 52 4d 49 4e 41 4c 20 29 20 72 65 74 75  ITERMINAL ) retu
6990: 72 6e 20 30 3b 0a 20 20 69 66 28 20 61 2d 3e 6e  rn 0;.  if( a->n
69a0: 73 75 62 73 79 6d 21 3d 62 2d 3e 6e 73 75 62 73  subsym!=b->nsubs
69b0: 79 6d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ym ) return 0;. 
69c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 2d 3e 6e   for(i=0; i<a->n
69d0: 73 75 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20  subsym; i++){.  
69e0: 20 20 69 66 28 20 61 2d 3e 73 75 62 73 79 6d 5b    if( a->subsym[
69f0: 69 5d 21 3d 62 2d 3e 73 75 62 73 79 6d 5b 69 5d  i]!=b->subsym[i]
6a00: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
6a10: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
6a20: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c  /* Construct all
6a30: 20 73 75 63 63 65 73 73 6f 72 20 73 74 61 74 65   successor state
6a40: 73 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 73  s to the given s
6a50: 74 61 74 65 2e 20 20 41 20 22 73 75 63 63 65 73  tate.  A "succes
6a60: 73 6f 72 22 0a 2a 2a 20 73 74 61 74 65 20 69 73  sor".** state is
6a70: 20 61 6e 79 20 73 74 61 74 65 20 77 68 69 63 68   any state which
6a80: 20 63 61 6e 20 62 65 20 72 65 61 63 68 65 64 20   can be reached 
6a90: 62 79 20 61 20 73 68 69 66 74 20 61 63 74 69 6f  by a shift actio
6aa0: 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  n..*/.PRIVATE vo
6ab0: 69 64 20 62 75 69 6c 64 73 68 69 66 74 73 28 6c  id buildshifts(l
6ac0: 65 6d 70 2c 73 74 70 29 0a 73 74 72 75 63 74 20  emp,stp).struct 
6ad0: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73 74 72  lemon *lemp;.str
6ae0: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20  uct state *stp; 
6af0: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65      /* The state
6b00: 20 66 72 6f 6d 20 77 68 69 63 68 20 73 75 63 63   from which succ
6b10: 65 73 73 6f 72 73 20 61 72 65 20 63 6f 6d 70 75  essors are compu
6b20: 74 65 64 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63  ted */.{.  struc
6b30: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20  t config *cfp;  
6b40: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
6b50: 68 72 75 20 74 68 65 20 63 6f 6e 66 69 67 20 63  hru the config c
6b60: 6c 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22 20  losure of "stp" 
6b70: 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  */.  struct conf
6b80: 69 67 20 2a 62 63 66 70 3b 20 2f 2a 20 46 6f 72  ig *bcfp; /* For
6b90: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
6ba0: 6f 6e 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72  on config closur
6bb0: 65 20 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20 20  e of "stp" */.  
6bc0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
6bd0: 65 77 3b 20 20 2f 2a 20 2a 2f 0a 20 20 73 74 72  ew;  /* */.  str
6be0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20  uct symbol *sp; 
6bf0: 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c    /* Symbol foll
6c00: 6f 77 69 6e 67 20 74 68 65 20 64 6f 74 20 69 6e  owing the dot in
6c10: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22   configuration "
6c20: 63 66 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74  cfp" */.  struct
6c30: 20 73 79 6d 62 6f 6c 20 2a 62 73 70 3b 20 20 2f   symbol *bsp;  /
6c40: 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69  * Symbol followi
6c50: 6e 67 20 74 68 65 20 64 6f 74 20 69 6e 20 63 6f  ng the dot in co
6c60: 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 62 63 66  nfiguration "bcf
6c70: 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  p" */.  struct s
6c80: 74 61 74 65 20 2a 6e 65 77 73 74 70 3b 20 2f 2a  tate *newstp; /*
6c90: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   A pointer to a 
6ca0: 73 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 20  successor state 
6cb0: 2a 2f 0a 0a 20 20 2f 2a 20 45 61 63 68 20 63 6f  */..  /* Each co
6cc0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 65 63 6f  nfiguration beco
6cd0: 6d 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 66 74  mes complete aft
6ce0: 65 72 20 69 74 20 63 6f 6e 74 69 62 75 74 65 73  er it contibutes
6cf0: 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72 0a   to a successor.
6d00: 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 49 6e 69    ** state.  Ini
6d10: 74 69 61 6c 6c 79 2c 20 61 6c 6c 20 63 6f 6e 66  tially, all conf
6d20: 69 67 75 72 61 74 69 6f 6e 73 20 61 72 65 20 69  igurations are i
6d30: 6e 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 66  ncomplete */.  f
6d40: 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b  or(cfp=stp->cfp;
6d50: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
6d60: 65 78 74 29 20 63 66 70 2d 3e 73 74 61 74 75 73  ext) cfp->status
6d70: 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 0a   = INCOMPLETE;..
6d80: 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
6d90: 68 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74  h all configurat
6da0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 74 61 74  ions of the stat
6db0: 65 20 22 73 74 70 22 20 2a 2f 0a 20 20 66 6f 72  e "stp" */.  for
6dc0: 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63  (cfp=stp->cfp; c
6dd0: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
6de0: 74 29 7b 0a 20 20 20 20 69 66 28 20 63 66 70 2d  t){.    if( cfp-
6df0: 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54  >status==COMPLET
6e00: 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20  E ) continue;   
6e10: 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64   /* Already used
6e20: 20 62 79 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a   by inner loop *
6e30: 2f 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 64  /.    if( cfp->d
6e40: 6f 74 3e 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68  ot>=cfp->rp->nrh
6e50: 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f  s ) continue;  /
6e60: 2a 20 43 61 6e 27 74 20 73 68 69 66 74 20 74 68  * Can't shift th
6e70: 69 73 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20  is config */.   
6e80: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65   Configlist_rese
6e90: 74 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  t();            
6ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
6eb0: 65 74 20 74 68 65 20 6e 65 77 20 63 6f 6e 66 69  et the new confi
6ec0: 67 20 73 65 74 20 2a 2f 0a 20 20 20 20 73 70 20  g set */.    sp 
6ed0: 3d 20 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 63  = cfp->rp->rhs[c
6ee0: 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20  fp->dot];       
6ef0: 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20        /* Symbol 
6f00: 61 66 74 65 72 20 74 68 65 20 64 6f 74 20 2a 2f  after the dot */
6f10: 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 65 76 65  ..    /* For eve
6f20: 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ry configuration
6f30: 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 22 73   in the state "s
6f40: 74 70 22 20 77 68 69 63 68 20 68 61 73 20 74 68  tp" which has th
6f50: 65 20 73 79 6d 62 6f 6c 20 22 73 70 22 0a 20 20  e symbol "sp".  
6f60: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69    ** following i
6f70: 74 73 20 64 6f 74 2c 20 61 64 64 20 74 68 65 20  ts dot, add the 
6f80: 73 61 6d 65 20 63 6f 6e 66 69 67 75 72 61 74 69  same configurati
6f90: 6f 6e 20 74 6f 20 74 68 65 20 62 61 73 69 73 20  on to the basis 
6fa0: 73 65 74 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a  set under.    **
6fb0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 62 75   construction bu
6fc0: 74 20 77 69 74 68 20 74 68 65 20 64 6f 74 20 73  t with the dot s
6fd0: 68 69 66 74 65 64 20 6f 6e 65 20 73 79 6d 62 6f  hifted one symbo
6fe0: 6c 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20  l to the right. 
6ff0: 2a 2f 0a 20 20 20 20 66 6f 72 28 62 63 66 70 3d  */.    for(bcfp=
7000: 63 66 70 3b 20 62 63 66 70 3b 20 62 63 66 70 3d  cfp; bcfp; bcfp=
7010: 62 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  bcfp->next){.   
7020: 20 20 20 69 66 28 20 62 63 66 70 2d 3e 73 74 61     if( bcfp->sta
7030: 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20  tus==COMPLETE ) 
7040: 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20  continue;    /* 
7050: 41 6c 72 65 61 64 79 20 75 73 65 64 20 2a 2f 0a  Already used */.
7060: 20 20 20 20 20 20 69 66 28 20 62 63 66 70 2d 3e        if( bcfp->
7070: 64 6f 74 3e 3d 62 63 66 70 2d 3e 72 70 2d 3e 6e  dot>=bcfp->rp->n
7080: 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  rhs ) continue; 
7090: 2f 2a 20 43 61 6e 27 74 20 73 68 69 66 74 20 74  /* Can't shift t
70a0: 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20  his one */.     
70b0: 20 62 73 70 20 3d 20 62 63 66 70 2d 3e 72 70 2d   bsp = bcfp->rp-
70c0: 3e 72 68 73 5b 62 63 66 70 2d 3e 64 6f 74 5d 3b  >rhs[bcfp->dot];
70d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
70e0: 74 20 73 79 6d 62 6f 6c 20 61 66 74 65 72 20 64  t symbol after d
70f0: 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ot */.      if( 
7100: 21 73 61 6d 65 5f 73 79 6d 62 6f 6c 28 62 73 70  !same_symbol(bsp
7110: 2c 73 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ,sp) ) continue;
7120: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
7130: 20 73 61 6d 65 20 61 73 20 66 6f 72 20 22 63 66   same as for "cf
7140: 70 22 20 2a 2f 0a 20 20 20 20 20 20 62 63 66 70  p" */.      bcfp
7150: 2d 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c  ->status = COMPL
7160: 45 54 45 3b 20 20 20 20 20 20 20 20 20 20 20 20  ETE;            
7170: 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68        /* Mark th
7180: 69 73 20 63 6f 6e 66 69 67 20 61 73 20 75 73 65  is config as use
7190: 64 20 2a 2f 0a 20 20 20 20 20 20 6e 65 77 20 3d  d */.      new =
71a0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62   Configlist_addb
71b0: 61 73 69 73 28 62 63 66 70 2d 3e 72 70 2c 62 63  asis(bcfp->rp,bc
71c0: 66 70 2d 3e 64 6f 74 2b 31 29 3b 0a 20 20 20 20  fp->dot+1);.    
71d0: 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6e 65 77    Plink_add(&new
71e0: 2d 3e 62 70 6c 70 2c 62 63 66 70 29 3b 0a 20 20  ->bplp,bcfp);.  
71f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
7200: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
7210: 20 73 74 61 74 65 20 64 65 73 63 72 69 62 65 64   state described
7220: 20 62 79 20 74 68 65 20 62 61 73 69 73 20 63 6f   by the basis co
7230: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 0a  nfiguration set.
7240: 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
7250: 65 64 20 69 6e 20 74 68 65 20 70 72 65 63 65 64  ed in the preced
7260: 69 6e 67 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  ing loop */.    
7270: 6e 65 77 73 74 70 20 3d 20 67 65 74 73 74 61 74  newstp = getstat
7280: 65 28 6c 65 6d 70 29 3b 0a 0a 20 20 20 20 2f 2a  e(lemp);..    /*
7290: 20 54 68 65 20 73 74 61 74 65 20 22 6e 65 77 73   The state "news
72a0: 74 70 22 20 69 73 20 72 65 61 63 68 65 64 20 66  tp" is reached f
72b0: 72 6f 6d 20 74 68 65 20 73 74 61 74 65 20 22 73  rom the state "s
72c0: 74 70 22 20 62 79 20 61 20 73 68 69 66 74 20 61  tp" by a shift a
72d0: 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 20  ction.    ** on 
72e0: 74 68 65 20 73 79 6d 62 6f 6c 20 22 73 70 22 20  the symbol "sp" 
72f0: 2a 2f 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74  */.    if( sp->t
7300: 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype==MULTITERMIN
7310: 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  AL ){.      int 
7320: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
7330: 3b 20 69 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b  ; i<sp->nsubsym;
7340: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 41   i++){.        A
7350: 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e  ction_add(&stp->
7360: 61 70 2c 53 48 49 46 54 2c 73 70 2d 3e 73 75 62  ap,SHIFT,sp->sub
7370: 73 79 6d 5b 69 5d 2c 28 63 68 61 72 2a 29 6e 65  sym[i],(char*)ne
7380: 77 73 74 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  wstp);.      }. 
7390: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
73a0: 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d  Action_add(&stp-
73b0: 3e 61 70 2c 53 48 49 46 54 2c 73 70 2c 28 63 68  >ap,SHIFT,sp,(ch
73c0: 61 72 20 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20  ar *)newstp);.  
73d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
73e0: 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 70   Construct the p
73f0: 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
7400: 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e  .*/.void FindLin
7410: 6b 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20  ks(lemp).struct 
7420: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
7430: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
7440: 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6f   config *cfp, *o
7450: 74 68 65 72 3b 0a 20 20 73 74 72 75 63 74 20 73  ther;.  struct s
7460: 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72  tate *stp;.  str
7470: 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a  uct plink *plp;.
7480: 0a 20 20 2f 2a 20 48 6f 75 73 65 6b 65 65 70 69  .  /* Housekeepi
7490: 6e 67 20 64 65 74 61 69 6c 3a 0a 20 20 2a 2a 20  ng detail:.  ** 
74a0: 41 64 64 20 74 6f 20 65 76 65 72 79 20 70 72 6f  Add to every pro
74b0: 70 61 67 61 74 65 20 6c 69 6e 6b 20 61 20 70 6f  pagate link a po
74c0: 69 6e 74 65 72 20 62 61 63 6b 20 74 6f 20 74 68  inter back to th
74d0: 65 20 73 74 61 74 65 20 74 6f 0a 20 20 2a 2a 20  e state to.  ** 
74e0: 77 68 69 63 68 20 74 68 65 20 6c 69 6e 6b 20 69  which the link i
74f0: 73 20 61 74 74 61 63 68 65 64 2e 20 2a 2f 0a 20  s attached. */. 
7500: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
7510: 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
7520: 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
7530: 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66  sorted[i];.    f
7540: 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b  or(cfp=stp->cfp;
7550: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
7560: 65 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d  ext){.      cfp-
7570: 3e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20  >stp = stp;.    
7580: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76  }.  }..  /* Conv
7590: 65 72 74 20 61 6c 6c 20 62 61 63 6b 6c 69 6e 6b  ert all backlink
75a0: 73 20 69 6e 74 6f 20 66 6f 72 77 61 72 64 20 6c  s into forward l
75b0: 69 6e 6b 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20  inks.  Only the 
75c0: 66 6f 72 77 61 72 64 0a 20 20 2a 2a 20 6c 69 6e  forward.  ** lin
75d0: 6b 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74  ks are used in t
75e0: 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 6f  he follow-set co
75f0: 6d 70 75 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  mputation. */.  
7600: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
7610: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
7620: 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
7630: 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f  orted[i];.    fo
7640: 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20  r(cfp=stp->cfp; 
7650: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
7660: 78 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  xt){.      for(p
7670: 6c 70 3d 63 66 70 2d 3e 62 70 6c 70 3b 20 70 6c  lp=cfp->bplp; pl
7680: 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74  p; plp=plp->next
7690: 29 7b 0a 20 20 20 20 20 20 20 20 6f 74 68 65 72  ){.        other
76a0: 20 3d 20 70 6c 70 2d 3e 63 66 70 3b 0a 20 20 20   = plp->cfp;.   
76b0: 20 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26       Plink_add(&
76c0: 6f 74 68 65 72 2d 3e 66 70 6c 70 2c 63 66 70 29  other->fplp,cfp)
76d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
76e0: 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74    }.}../* Comput
76f0: 65 20 61 6c 6c 20 66 6f 6c 6c 6f 77 73 65 74 73  e all followsets
7700: 2e 0a 2a 2a 0a 2a 2a 20 41 20 66 6f 6c 6c 6f 77  ..**.** A follow
7710: 73 65 74 20 69 73 20 74 68 65 20 73 65 74 20 6f  set is the set o
7720: 66 20 61 6c 6c 20 73 79 6d 62 6f 6c 73 20 77 68  f all symbols wh
7730: 69 63 68 20 63 61 6e 20 63 6f 6d 65 20 69 6d 6d  ich can come imm
7740: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65  ediately.** afte
7750: 72 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  r a configuratio
7760: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46  n..*/.void FindF
7770: 6f 6c 6c 6f 77 53 65 74 73 28 6c 65 6d 70 29 0a  ollowSets(lemp).
7780: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
7790: 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp;.{.  int i;. 
77a0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
77b0: 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c  cfp;.  struct pl
77c0: 69 6e 6b 20 2a 70 6c 70 3b 0a 20 20 69 6e 74 20  ink *plp;.  int 
77d0: 70 72 6f 67 72 65 73 73 3b 0a 20 20 69 6e 74 20  progress;.  int 
77e0: 63 68 61 6e 67 65 3b 0a 0a 20 20 66 6f 72 28 69  change;..  for(i
77f0: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
7800: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  te; i++){.    fo
7810: 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74  r(cfp=lemp->sort
7820: 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b  ed[i]->cfp; cfp;
7830: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
7840: 0a 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74  .      cfp->stat
7850: 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b  us = INCOMPLETE;
7860: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
7870: 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73  do{.    progress
7880: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
7890: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
78a0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  e; i++){.      f
78b0: 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72  or(cfp=lemp->sor
78c0: 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70  ted[i]->cfp; cfp
78d0: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
78e0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 66  {.        if( cf
78f0: 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c  p->status==COMPL
7900: 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ETE ) continue;.
7910: 20 20 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d          for(plp=
7920: 63 66 70 2d 3e 66 70 6c 70 3b 20 70 6c 70 3b 20  cfp->fplp; plp; 
7930: 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a  plp=plp->next){.
7940: 20 20 20 20 20 20 20 20 20 20 63 68 61 6e 67 65            change
7950: 20 3d 20 53 65 74 55 6e 69 6f 6e 28 70 6c 70 2d   = SetUnion(plp-
7960: 3e 63 66 70 2d 3e 66 77 73 2c 63 66 70 2d 3e 66  >cfp->fws,cfp->f
7970: 77 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ws);.          i
7980: 66 28 20 63 68 61 6e 67 65 20 29 7b 0a 20 20 20  f( change ){.   
7990: 20 20 20 20 20 20 20 20 20 70 6c 70 2d 3e 63 66           plp->cf
79a0: 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f  p->status = INCO
79b0: 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20  MPLETE;.        
79c0: 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31      progress = 1
79d0: 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20  ;..  }..}.      
79e0: 20 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20    cfp->status = 
79f0: 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20  COMPLETE;.      
7a00: 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  }.    }.  }while
7a10: 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d 0a  ( progress );.}.
7a20: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f  .static int reso
7a30: 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 29 3b 0a  lve_conflict();.
7a40: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  ./* Compute the 
7a50: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 2c 20  reduce actions, 
7a60: 61 6e 64 20 72 65 73 6f 6c 76 65 20 63 6f 6e 66  and resolve conf
7a70: 6c 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46  licts..*/.void F
7a80: 69 6e 64 41 63 74 69 6f 6e 73 28 6c 65 6d 70 29  indActions(lemp)
7a90: 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
7aa0: 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 6a  emp;.{.  int i,j
7ab0: 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  ;.  struct confi
7ac0: 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74  g *cfp;.  struct
7ad0: 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73   state *stp;.  s
7ae0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
7af0: 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
7b00: 2a 72 70 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61  *rp;..  /* Add a
7b10: 6c 6c 20 6f 66 20 74 68 65 20 72 65 64 75 63 65  ll of the reduce
7b20: 20 61 63 74 69 6f 6e 73 20 0a 20 20 2a 2a 20 41   actions .  ** A
7b30: 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 69   reduce action i
7b40: 73 20 61 64 64 65 64 20 66 6f 72 20 65 61 63 68  s added for each
7b50: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
7b60: 66 6f 6c 6c 6f 77 73 65 74 20 6f 66 0a 20 20 2a  followset of.  *
7b70: 2a 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  * a configuratio
7b80: 6e 20 77 68 69 63 68 20 68 61 73 20 69 74 73 20  n which has its 
7b90: 64 6f 74 20 61 74 20 74 68 65 20 65 78 74 72 65  dot at the extre
7ba0: 6d 65 20 72 69 67 68 74 2e 0a 20 20 2a 2f 0a 20  me right..  */. 
7bb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
7bc0: 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 20  ->nstate; i++){ 
7bd0: 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61    /* Loop over a
7be0: 6c 6c 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 20  ll states */.   
7bf0: 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
7c00: 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28  ted[i];.    for(
7c10: 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66  cfp=stp->cfp; cf
7c20: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
7c30: 29 7b 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ){  /* Loop over
7c40: 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69   all configurati
7c50: 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ons */.      if(
7c60: 20 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 3d 3d   cfp->rp->nrhs==
7c70: 63 66 70 2d 3e 64 6f 74 20 29 7b 20 20 20 20 20  cfp->dot ){     
7c80: 20 20 20 2f 2a 20 49 73 20 64 6f 74 20 61 74 20     /* Is dot at 
7c90: 65 78 74 72 65 6d 65 20 72 69 67 68 74 3f 20 2a  extreme right? *
7ca0: 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  /.        for(j=
7cb0: 30 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  0; j<lemp->nterm
7cc0: 69 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  inal; j++){.    
7cd0: 20 20 20 20 20 20 69 66 28 20 53 65 74 46 69 6e        if( SetFin
7ce0: 64 28 63 66 70 2d 3e 66 77 73 2c 6a 29 20 29 7b  d(cfp->fws,j) ){
7cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
7d00: 41 64 64 20 61 20 72 65 64 75 63 65 20 61 63 74  Add a reduce act
7d10: 69 6f 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65  ion to the state
7d20: 20 22 73 74 70 22 20 77 68 69 63 68 20 77 69 6c   "stp" which wil
7d30: 6c 20 72 65 64 75 63 65 20 62 79 20 74 68 65 0a  l reduce by the.
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
7d50: 75 6c 65 20 22 63 66 70 2d 3e 72 70 22 20 69 66  ule "cfp->rp" if
7d60: 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 73   the lookahead s
7d70: 79 6d 62 6f 6c 20 69 73 20 22 6c 65 6d 70 2d 3e  ymbol is "lemp->
7d80: 73 79 6d 62 6f 6c 73 5b 6a 5d 22 20 2a 2f 0a 20  symbols[j]" */. 
7d90: 20 20 20 20 20 20 20 20 20 20 20 41 63 74 69 6f             Actio
7da0: 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 52  n_add(&stp->ap,R
7db0: 45 44 55 43 45 2c 6c 65 6d 70 2d 3e 73 79 6d 62  EDUCE,lemp->symb
7dc0: 6f 6c 73 5b 6a 5d 2c 28 63 68 61 72 20 2a 29 63  ols[j],(char *)c
7dd0: 66 70 2d 3e 72 70 29 3b 0a 20 20 20 20 20 20 20  fp->rp);.       
7de0: 20 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a     }..}.      }.
7df0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
7e00: 41 64 64 20 74 68 65 20 61 63 63 65 70 74 69 6e  Add the acceptin
7e10: 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 66 28  g token */.  if(
7e20: 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a   lemp->start ){.
7e30: 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f      sp = Symbol_
7e40: 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74  find(lemp->start
7e50: 29 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30  );.    if( sp==0
7e60: 20 29 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75   ) sp = lemp->ru
7e70: 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65 6c 73 65  le->lhs;.  }else
7e80: 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d  {.    sp = lemp-
7e90: 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a  >rule->lhs;.  }.
7ea0: 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20    /* Add to the 
7eb0: 66 69 72 73 74 20 73 74 61 74 65 20 28 77 68 69  first state (whi
7ec0: 63 68 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  ch is always the
7ed0: 20 73 74 61 72 74 69 6e 67 20 73 74 61 74 65 20   starting state 
7ee0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 69  of the.  ** fini
7ef0: 74 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65  te state machine
7f00: 29 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20 41  ) an action to A
7f10: 43 43 45 50 54 20 69 66 20 74 68 65 20 6c 6f 6f  CCEPT if the loo
7f20: 6b 61 68 65 61 64 20 69 73 20 74 68 65 0a 20 20  kahead is the.  
7f30: 2a 2a 20 73 74 61 72 74 20 6e 6f 6e 74 65 72 6d  ** start nonterm
7f40: 69 6e 61 6c 2e 20 20 2a 2f 0a 20 20 41 63 74 69  inal.  */.  Acti
7f50: 6f 6e 5f 61 64 64 28 26 6c 65 6d 70 2d 3e 73 6f  on_add(&lemp->so
7f60: 72 74 65 64 5b 30 5d 2d 3e 61 70 2c 41 43 43 45  rted[0]->ap,ACCE
7f70: 50 54 2c 73 70 2c 30 29 3b 0a 0a 20 20 2f 2a 20  PT,sp,0);..  /* 
7f80: 52 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74  Resolve conflict
7f90: 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  s */.  for(i=0; 
7fa0: 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
7fb0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
7fc0: 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 6e 61   action *ap, *na
7fd0: 70 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  p;.    struct st
7fe0: 61 74 65 20 2a 73 74 70 3b 0a 20 20 20 20 73 74  ate *stp;.    st
7ff0: 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
8000: 5b 69 5d 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65  [i];.    /* asse
8010: 72 74 28 20 73 74 70 2d 3e 61 70 20 29 3b 20 2a  rt( stp->ap ); *
8020: 2f 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20  /.    stp->ap = 
8030: 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d  Action_sort(stp-
8040: 3e 61 70 29 3b 0a 20 20 20 20 66 6f 72 28 61 70  >ap);.    for(ap
8050: 3d 73 74 70 2d 3e 61 70 3b 20 61 70 20 26 26 20  =stp->ap; ap && 
8060: 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3d 61 70 2d  ap->next; ap=ap-
8070: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66 6f  >next){.      fo
8080: 72 28 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20  r(nap=ap->next; 
8090: 6e 61 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d 3d  nap && nap->sp==
80a0: 61 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70 2d  ap->sp; nap=nap-
80b0: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
80c0: 20 2f 2a 20 54 68 65 20 74 77 6f 20 61 63 74 69   /* The two acti
80d0: 6f 6e 73 20 22 61 70 22 20 61 6e 64 20 22 6e 61  ons "ap" and "na
80e0: 70 22 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  p" have the same
80f0: 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20   lookahead..    
8100: 20 20 20 20 20 2a 2a 20 46 69 67 75 72 65 20 6f       ** Figure o
8110: 75 74 20 77 68 69 63 68 20 6f 6e 65 20 73 68 6f  ut which one sho
8120: 75 6c 64 20 62 65 20 75 73 65 64 20 2a 2f 0a 20  uld be used */. 
8130: 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e 63          lemp->nc
8140: 6f 6e 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f 6c  onflict += resol
8150: 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c 6e  ve_conflict(ap,n
8160: 61 70 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 29  ap,lemp->errsym)
8170: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8180: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74    }..  /* Report
8190: 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 65 61   an error for ea
81a0: 63 68 20 72 75 6c 65 20 74 68 61 74 20 63 61 6e  ch rule that can
81b0: 20 6e 65 76 65 72 20 62 65 20 72 65 64 75 63 65   never be reduce
81c0: 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c  d. */.  for(rp=l
81d0: 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
81e0: 70 3d 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e  p=rp->next) rp->
81f0: 63 61 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f  canReduce = LEMO
8200: 4e 5f 46 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69  N_FALSE;.  for(i
8210: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
8220: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
8230: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b  ruct action *ap;
8240: 0a 20 20 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70  .    for(ap=lemp
8250: 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b  ->sorted[i]->ap;
8260: 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
8270: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d  ){.      if( ap-
8280: 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 20  >type==REDUCE ) 
8290: 61 70 2d 3e 78 2e 72 70 2d 3e 63 61 6e 52 65 64  ap->x.rp->canRed
82a0: 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45  uce = LEMON_TRUE
82b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
82c0: 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
82d0: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
82e0: 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63  ){.    if( rp->c
82f0: 61 6e 52 65 64 75 63 65 20 29 20 63 6f 6e 74 69  anReduce ) conti
8300: 6e 75 65 3b 0a 20 20 20 20 45 72 72 6f 72 4d 73  nue;.    ErrorMs
8310: 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  g(lemp->filename
8320: 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 22 54  ,rp->ruleline,"T
8330: 68 69 73 20 72 75 6c 65 20 63 61 6e 20 6e 6f 74  his rule can not
8340: 20 62 65 20 72 65 64 75 63 65 64 2e 5c 6e 22 29   be reduced.\n")
8350: 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  ;.    lemp->erro
8360: 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  rcnt++;.  }.}../
8370: 2a 20 52 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66  * Resolve a conf
8380: 6c 69 63 74 20 62 65 74 77 65 65 6e 20 74 68 65  lict between the
8390: 20 74 77 6f 20 67 69 76 65 6e 20 61 63 74 69 6f   two given actio
83a0: 6e 73 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63  ns.  If the.** c
83b0: 6f 6e 66 6c 69 63 74 20 63 61 6e 27 74 20 62 65  onflict can't be
83c0: 20 72 65 73 6f 6c 76 65 2c 20 72 65 74 75 72 6e   resolve, return
83d0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
83e0: 20 4e 4f 20 4c 4f 4e 47 45 52 20 54 52 55 45 3a   NO LONGER TRUE:
83f0: 0a 2a 2a 20 20 20 54 6f 20 72 65 73 6f 6c 76 65  .**   To resolve
8400: 20 61 20 63 6f 6e 66 6c 69 63 74 2c 20 66 69 72   a conflict, fir
8410: 73 74 20 6c 6f 6f 6b 20 74 6f 20 73 65 65 20 69  st look to see i
8420: 66 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 0a  f either action.
8430: 2a 2a 20 20 20 69 73 20 6f 6e 20 61 6e 20 65 72  **   is on an er
8440: 72 6f 72 20 72 75 6c 65 2e 20 20 49 6e 20 74 68  ror rule.  In th
8450: 61 74 20 63 61 73 65 2c 20 74 61 6b 65 20 74 68  at case, take th
8460: 65 20 61 63 74 69 6f 6e 20 77 68 69 63 68 0a 2a  e action which.*
8470: 2a 20 20 20 69 73 20 6e 6f 74 20 61 73 73 6f 63  *   is not assoc
8480: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 65  iated with the e
8490: 72 72 6f 72 20 72 75 6c 65 2e 20 20 49 66 20 6e  rror rule.  If n
84a0: 65 69 74 68 65 72 20 6f 72 20 62 6f 74 68 0a 2a  either or both.*
84b0: 2a 20 20 20 61 63 74 69 6f 6e 73 20 61 72 65 20  *   actions are 
84c0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
84d0: 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2c 20 74  an error rule, t
84e0: 68 65 6e 20 74 72 79 20 74 6f 0a 2a 2a 20 20 20  hen try to.**   
84f0: 75 73 65 20 70 72 65 63 65 64 65 6e 63 65 20 74  use precedence t
8500: 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 63 6f  o resolve the co
8510: 6e 66 6c 69 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  nflict..**.** If
8520: 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 20 69   either action i
8530: 73 20 61 20 53 48 49 46 54 2c 20 74 68 65 6e 20  s a SHIFT, then 
8540: 69 74 20 6d 75 73 74 20 62 65 20 61 70 78 2e 20  it must be apx. 
8550: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
8560: 6e 20 77 6f 6e 27 74 20 77 6f 72 6b 20 69 66 20  n won't work if 
8570: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43  apx->type==REDUC
8580: 45 20 61 6e 64 20 61 70 79 2d 3e 74 79 70 65 3d  E and apy->type=
8590: 3d 53 48 49 46 54 2e 0a 2a 2f 0a 73 74 61 74 69  =SHIFT..*/.stati
85a0: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f  c int resolve_co
85b0: 6e 66 6c 69 63 74 28 61 70 78 2c 61 70 79 2c 65  nflict(apx,apy,e
85c0: 72 72 73 79 6d 29 0a 73 74 72 75 63 74 20 61 63  rrsym).struct ac
85d0: 74 69 6f 6e 20 2a 61 70 78 3b 0a 73 74 72 75 63  tion *apx;.struc
85e0: 74 20 61 63 74 69 6f 6e 20 2a 61 70 79 3b 0a 73  t action *apy;.s
85f0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65 72  truct symbol *er
8600: 72 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65 20 65  rsym;   /* The e
8610: 72 72 6f 72 20 73 79 6d 62 6f 6c 20 28 69 66 20  rror symbol (if 
8620: 64 65 66 69 6e 65 64 2e 20 20 4e 55 4c 4c 20 6f  defined.  NULL o
8630: 74 68 65 72 77 69 73 65 29 20 2a 2f 0a 7b 0a 20  therwise) */.{. 
8640: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
8650: 73 70 78 2c 20 2a 73 70 79 3b 0a 20 20 69 6e 74  spx, *spy;.  int
8660: 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61   errcnt = 0;.  a
8670: 73 73 65 72 74 28 20 61 70 78 2d 3e 73 70 3d 3d  ssert( apx->sp==
8680: 61 70 79 2d 3e 73 70 20 29 3b 20 20 2f 2a 20 4f  apy->sp );  /* O
8690: 74 68 65 72 77 69 73 65 20 74 68 65 72 65 20 77  therwise there w
86a0: 6f 75 6c 64 20 62 65 20 6e 6f 20 63 6f 6e 66 6c  ould be no confl
86b0: 69 63 74 20 2a 2f 0a 20 20 69 66 28 20 61 70 78  ict */.  if( apx
86c0: 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26 26  ->type==SHIFT &&
86d0: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46   apy->type==SHIF
86e0: 54 20 29 7b 0a 20 20 20 20 61 70 79 2d 3e 74 79  T ){.    apy->ty
86f0: 70 65 20 3d 20 53 53 43 4f 4e 46 4c 49 43 54 3b  pe = SSCONFLICT;
8700: 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20  .    errcnt++;. 
8710: 20 7d 0a 20 20 69 66 28 20 61 70 78 2d 3e 74 79   }.  if( apx->ty
8720: 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70 79  pe==SHIFT && apy
8730: 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29  ->type==REDUCE )
8740: 7b 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d  {.    spx = apx-
8750: 3e 73 70 3b 0a 20 20 20 20 73 70 79 20 3d 20 61  >sp;.    spy = a
8760: 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79  py->x.rp->precsy
8770: 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 79 3d 3d  m;.    if( spy==
8780: 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30  0 || spx->prec<0
8790: 20 7c 7c 20 73 70 79 2d 3e 70 72 65 63 3c 30 20   || spy->prec<0 
87a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ){.      /* Not 
87b0: 65 6e 6f 75 67 68 20 70 72 65 63 65 64 65 6e 63  enough precedenc
87c0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a  e information. *
87d0: 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  /.      apy->typ
87e0: 65 20 3d 20 53 52 43 4f 4e 46 4c 49 43 54 3b 0a  e = SRCONFLICT;.
87f0: 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a        errcnt++;.
8800: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
8810: 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72 65  x->prec>spy->pre
8820: 63 20 29 7b 20 20 20 20 2f 2a 20 4c 6f 77 65 72  c ){    /* Lower
8830: 20 70 72 65 63 65 64 65 6e 63 65 20 77 69 6e 73   precedence wins
8840: 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   */.      apy->t
8850: 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45  ype = RD_RESOLVE
8860: 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  D;.    }else if(
8870: 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e   spx->prec<spy->
8880: 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70  prec ){.      ap
8890: 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52 45 53  x->type = SH_RES
88a0: 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65  OLVED;.    }else
88b0: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d   if( spx->prec==
88c0: 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78  spy->prec && spx
88d0: 2d 3e 61 73 73 6f 63 3d 3d 52 49 47 48 54 20 29  ->assoc==RIGHT )
88e0: 7b 20 2f 2a 20 55 73 65 20 6f 70 65 72 61 74 6f  { /* Use operato
88f0: 72 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e  r */.      apy->
8900: 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56  type = RD_RESOLV
8910: 45 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ED;             
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8930: 2f 2a 20 61 73 73 6f 63 69 61 74 69 76 69 74 79  /* associativity
8940: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   */.    }else if
8950: 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  ( spx->prec==spy
8960: 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61  ->prec && spx->a
8970: 73 73 6f 63 3d 3d 4c 45 46 54 20 29 7b 20 20 2f  ssoc==LEFT ){  /
8980: 2a 20 74 6f 20 62 72 65 61 6b 20 74 69 65 20 2a  * to break tie *
8990: 2f 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  /.      apx->typ
89a0: 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b  e = SH_RESOLVED;
89b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
89c0: 20 20 61 73 73 65 72 74 28 20 73 70 78 2d 3e 70    assert( spx->p
89d0: 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26  rec==spy->prec &
89e0: 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4e 4f  & spx->assoc==NO
89f0: 4e 45 20 29 3b 0a 20 20 20 20 20 20 61 70 79 2d  NE );.      apy-
8a00: 3e 74 79 70 65 20 3d 20 53 52 43 4f 4e 46 4c 49  >type = SRCONFLI
8a10: 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e 74  CT;.      errcnt
8a20: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
8a30: 65 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d  e if( apx->type=
8a40: 3d 52 45 44 55 43 45 20 26 26 20 61 70 79 2d 3e  =REDUCE && apy->
8a50: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a  type==REDUCE ){.
8a60: 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e 78      spx = apx->x
8a70: 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20  .rp->precsym;.  
8a80: 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72    spy = apy->x.r
8a90: 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20  p->precsym;.    
8aa0: 69 66 28 20 73 70 78 3d 3d 30 20 7c 7c 20 73 70  if( spx==0 || sp
8ab0: 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65  y==0 || spx->pre
8ac0: 63 3c 30 20 7c 7c 0a 20 20 20 20 73 70 79 2d 3e  c<0 ||.    spy->
8ad0: 70 72 65 63 3c 30 20 7c 7c 20 73 70 78 2d 3e 70  prec<0 || spx->p
8ae0: 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 29  rec==spy->prec )
8af0: 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  {.      apy->typ
8b00: 65 20 3d 20 52 52 43 4f 4e 46 4c 49 43 54 3b 0a  e = RRCONFLICT;.
8b10: 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a        errcnt++;.
8b20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
8b30: 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72 65  x->prec>spy->pre
8b40: 63 20 29 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e  c ){.      apy->
8b50: 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56  type = RD_RESOLV
8b60: 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ED;.    }else if
8b70: 28 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d  ( spx->prec<spy-
8b80: 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61  >prec ){.      a
8b90: 70 78 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45  px->type = RD_RE
8ba0: 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SOLVED;.    }.  
8bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
8bc0: 74 28 20 0a 20 20 20 20 20 20 61 70 78 2d 3e 74  t( .      apx->t
8bd0: 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44  ype==SH_RESOLVED
8be0: 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   ||.      apx->t
8bf0: 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44  ype==RD_RESOLVED
8c00: 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   ||.      apx->t
8c10: 79 70 65 3d 3d 53 53 43 4f 4e 46 4c 49 43 54 20  ype==SSCONFLICT 
8c20: 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79  ||.      apx->ty
8c30: 70 65 3d 3d 53 52 43 4f 4e 46 4c 49 43 54 20 7c  pe==SRCONFLICT |
8c40: 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  |.      apx->typ
8c50: 65 3d 3d 52 52 43 4f 4e 46 4c 49 43 54 20 7c 7c  e==RRCONFLICT ||
8c60: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
8c70: 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c  ==SH_RESOLVED ||
8c80: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
8c90: 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c  ==RD_RESOLVED ||
8ca0: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
8cb0: 3d 3d 53 53 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a  ==SSCONFLICT ||.
8cc0: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d        apy->type=
8cd0: 3d 53 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20  =SRCONFLICT ||. 
8ce0: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d       apy->type==
8cf0: 52 52 43 4f 4e 46 4c 49 43 54 0a 20 20 20 20 29  RRCONFLICT.    )
8d00: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 52 45 44  ;.    /* The RED
8d10: 55 43 45 2f 53 48 49 46 54 20 63 61 73 65 20 63  UCE/SHIFT case c
8d20: 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20 62 65 63  annot happen bec
8d30: 61 75 73 65 20 53 48 49 46 54 73 20 63 6f 6d 65  ause SHIFTs come
8d40: 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 52   before.    ** R
8d50: 45 44 55 43 45 73 20 6f 6e 20 74 68 65 20 6c 69  EDUCEs on the li
8d60: 73 74 2e 20 20 49 66 20 77 65 20 72 65 61 63 68  st.  If we reach
8d70: 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d   this point it m
8d80: 75 73 74 20 62 65 20 62 65 63 61 75 73 65 0a 20  ust be because. 
8d90: 20 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65 72     ** the parser
8da0: 20 63 6f 6e 66 6c 69 63 74 20 68 61 64 20 61 6c   conflict had al
8db0: 72 65 61 64 79 20 62 65 65 6e 20 72 65 73 6f 6c  ready been resol
8dc0: 76 65 64 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  ved. */.  }.  re
8dd0: 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 2f  turn errcnt;.}./
8de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8df0: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
8e00: 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e  ile "configlist.
8e10: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
8e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
8e30: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
8e40: 70 72 6f 63 65 73 73 69 6e 67 20 61 20 63 6f 6e  processing a con
8e50: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
8e60: 61 6e 64 20 62 75 69 6c 64 69 6e 67 20 61 20 73  and building a s
8e70: 74 61 74 65 0a 2a 2a 20 69 6e 20 74 68 65 20 4c  tate.** in the L
8e80: 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
8e90: 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69  rator..*/..stati
8ea0: 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  c struct config 
8eb0: 2a 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 20 20  *freelist = 0;  
8ec0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
8ed0: 72 65 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ree configuratio
8ee0: 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ns */.static str
8ef0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 75 72 72  uct config *curr
8f00: 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ent = 0;       /
8f10: 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66  * Top of list of
8f20: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
8f30: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
8f40: 20 63 6f 6e 66 69 67 20 2a 2a 63 75 72 72 65 6e   config **curren
8f50: 74 65 6e 64 20 3d 20 30 3b 20 20 20 2f 2a 20 4c  tend = 0;   /* L
8f60: 61 73 74 20 6f 6e 20 6c 69 73 74 20 6f 66 20 63  ast on list of c
8f70: 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74 69 63  onfigs */.static
8f80: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
8f90: 62 61 73 69 73 20 3d 20 30 3b 20 20 20 20 20 20  basis = 0;      
8fa0: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69 73     /* Top of lis
8fb0: 74 20 6f 66 20 62 61 73 69 73 20 63 6f 6e 66 69  t of basis confi
8fc0: 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  gs */.static str
8fd0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a 62 61 73  uct config **bas
8fe0: 69 73 65 6e 64 20 3d 20 30 3b 20 20 20 20 20 2f  isend = 0;     /
8ff0: 2a 20 45 6e 64 20 6f 66 20 6c 69 73 74 20 6f 66  * End of list of
9000: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 73 20 2a   basis configs *
9010: 2f 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  /../* Return a p
9020: 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
9030: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f  configuration */
9040: 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74 20  .PRIVATE struct 
9050: 63 6f 6e 66 69 67 20 2a 6e 65 77 63 6f 6e 66 69  config *newconfi
9060: 67 28 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  g(){.  struct co
9070: 6e 66 69 67 20 2a 6e 65 77 3b 0a 20 20 69 66 28  nfig *new;.  if(
9080: 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a   freelist==0 ){.
9090: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
90a0: 6e 74 20 61 6d 74 20 3d 20 33 3b 0a 20 20 20 20  nt amt = 3;.    
90b0: 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75  freelist = (stru
90c0: 63 74 20 63 6f 6e 66 69 67 20 2a 29 63 61 6c 6c  ct config *)call
90d0: 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28  oc( amt, sizeof(
90e0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 29 20 29  struct config) )
90f0: 3b 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c 69  ;.    if( freeli
9100: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  st==0 ){.      f
9110: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55  printf(stderr,"U
9120: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
9130: 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e  e memory for a n
9140: 65 77 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ew configuration
9150: 2e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  .");.      exit(
9160: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  1);.    }.    fo
9170: 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20  r(i=0; i<amt-1; 
9180: 69 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69 5d  i++) freelist[i]
9190: 2e 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69 73  .next = &freelis
91a0: 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65  t[i+1];.    free
91b0: 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74  list[amt-1].next
91c0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 20   = 0;.  }.  new 
91d0: 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72  = freelist;.  fr
91e0: 65 65 6c 69 73 74 20 3d 20 66 72 65 65 6c 69 73  eelist = freelis
91f0: 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72  t->next;.  retur
9200: 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  n new;.}../* The
9210: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22   configuration "
9220: 6f 6c 64 22 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  old" is no longe
9230: 72 20 75 73 65 64 20 2a 2f 0a 50 52 49 56 41 54  r used */.PRIVAT
9240: 45 20 76 6f 69 64 20 64 65 6c 65 74 65 63 6f 6e  E void deletecon
9250: 66 69 67 28 6f 6c 64 29 0a 73 74 72 75 63 74 20  fig(old).struct 
9260: 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 7b 0a 20  config *old;.{. 
9270: 20 6f 6c 64 2d 3e 6e 65 78 74 20 3d 20 66 72 65   old->next = fre
9280: 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73  elist;.  freelis
9290: 74 20 3d 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 49  t = old;.}../* I
92a0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63  nitialized the c
92b0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
92c0: 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69  t builder */.voi
92d0: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69  d Configlist_ini
92e0: 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d  t(){.  current =
92f0: 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64   0;.  currentend
9300: 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20 62   = &current;.  b
9310: 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69  asis = 0;.  basi
9320: 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a 20  send = &basis;. 
9330: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69   Configtable_ini
9340: 74 28 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  t();.  return;.}
9350: 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64  ../* Initialized
9360: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
9370: 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20  on list builder 
9380: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
9390: 73 74 5f 72 65 73 65 74 28 29 7b 0a 20 20 63 75  st_reset(){.  cu
93a0: 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72  rrent = 0;.  cur
93b0: 72 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65  rentend = &curre
93c0: 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b  nt;.  basis = 0;
93d0: 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62  .  basisend = &b
93e0: 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61  asis;.  Configta
93f0: 62 6c 65 5f 63 6c 65 61 72 28 30 29 3b 0a 20 20  ble_clear(0);.  
9400: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64  return;.}../* Ad
9410: 64 20 61 6e 6f 74 68 65 72 20 63 6f 6e 66 69 67  d another config
9420: 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63  uration to the c
9430: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
9440: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
9450: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61  ig *Configlist_a
9460: 64 64 28 72 70 2c 64 6f 74 29 0a 73 74 72 75 63  dd(rp,dot).struc
9470: 74 20 72 75 6c 65 20 2a 72 70 3b 20 20 20 20 2f  t rule *rp;    /
9480: 2a 20 54 68 65 20 72 75 6c 65 20 2a 2f 0a 69 6e  * The rule */.in
9490: 74 20 64 6f 74 3b 20 20 20 20 20 20 20 20 20 20  t dot;          
94a0: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20    /* Index into 
94b0: 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 72  the RHS of the r
94c0: 75 6c 65 20 77 68 65 72 65 20 74 68 65 20 64 6f  ule where the do
94d0: 74 20 67 6f 65 73 20 2a 2f 0a 7b 0a 20 20 73 74  t goes */.{.  st
94e0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
94f0: 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65  , model;..  asse
9500: 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d  rt( currentend!=
9510: 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20  0 );.  model.rp 
9520: 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f  = rp;.  model.do
9530: 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d  t = dot;.  cfp =
9540: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e   Configtable_fin
9550: 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28  d(&model);.  if(
9560: 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63   cfp==0 ){.    c
9570: 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29  fp = newconfig()
9580: 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70 20 3d 20  ;.    cfp->rp = 
9590: 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74  rp;.    cfp->dot
95a0: 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d   = dot;.    cfp-
95b0: 3e 66 77 73 20 3d 20 53 65 74 4e 65 77 28 29 3b  >fws = SetNew();
95c0: 0a 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20  .    cfp->stp = 
95d0: 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c 70  0;.    cfp->fplp
95e0: 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30   = cfp->bplp = 0
95f0: 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78 74 20  ;.    cfp->next 
9600: 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70  = 0;.    cfp->bp
9610: 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72 72 65   = 0;.    *curre
9620: 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20  ntend = cfp;.   
9630: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63   currentend = &c
9640: 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 43 6f  fp->next;.    Co
9650: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74  nfigtable_insert
9660: 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (cfp);.  }.  ret
9670: 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 41  urn cfp;.}../* A
9680: 64 64 20 61 20 62 61 73 69 73 20 63 6f 6e 66 69  dd a basis confi
9690: 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  guration to the 
96a0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
96b0: 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e  st */.struct con
96c0: 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f  fig *Configlist_
96d0: 61 64 64 62 61 73 69 73 28 72 70 2c 64 6f 74 29  addbasis(rp,dot)
96e0: 0a 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70  .struct rule *rp
96f0: 3b 0a 69 6e 74 20 64 6f 74 3b 0a 7b 0a 20 20 73  ;.int dot;.{.  s
9700: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
9710: 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73  p, model;..  ass
9720: 65 72 74 28 20 62 61 73 69 73 65 6e 64 21 3d 30  ert( basisend!=0
9730: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
9740: 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20  rrentend!=0 );. 
9750: 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a   model.rp = rp;.
9760: 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f    model.dot = do
9770: 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  t;.  cfp = Confi
9780: 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64  gtable_find(&mod
9790: 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d  el);.  if( cfp==
97a0: 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e  0 ){.    cfp = n
97b0: 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20  ewconfig();.    
97c0: 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20  cfp->rp = rp;.  
97d0: 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74    cfp->dot = dot
97e0: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d  ;.    cfp->fws =
97f0: 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63   SetNew();.    c
9800: 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20  fp->stp = 0;.   
9810: 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70   cfp->fplp = cfp
9820: 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20  ->bplp = 0;.    
9830: 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20  cfp->next = 0;. 
9840: 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a     cfp->bp = 0;.
9850: 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20      *currentend 
9860: 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65  = cfp;.    curre
9870: 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65  ntend = &cfp->ne
9880: 78 74 3b 0a 20 20 20 20 2a 62 61 73 69 73 65 6e  xt;.    *basisen
9890: 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 62 61 73  d = cfp;.    bas
98a0: 69 73 65 6e 64 20 3d 20 26 63 66 70 2d 3e 62 70  isend = &cfp->bp
98b0: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c  ;.    Configtabl
98c0: 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20  e_insert(cfp);. 
98d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b   }.  return cfp;
98e0: 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74  .}../* Compute t
98f0: 68 65 20 63 6c 6f 73 75 72 65 20 6f 66 20 74 68  he closure of th
9900: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
9910: 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  list */.void Con
9920: 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28  figlist_closure(
9930: 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
9940: 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74  on *lemp;.{.  st
9950: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
9960: 2c 20 2a 6e 65 77 63 66 70 3b 0a 20 20 73 74 72  , *newcfp;.  str
9970: 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 6e  uct rule *rp, *n
9980: 65 77 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73  ewrp;.  struct s
9990: 79 6d 62 6f 6c 20 2a 73 70 2c 20 2a 78 73 70 3b  ymbol *sp, *xsp;
99a0: 0a 20 20 69 6e 74 20 69 2c 20 64 6f 74 3b 0a 0a  .  int i, dot;..
99b0: 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65 6e    assert( curren
99c0: 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 66 6f 72  tend!=0 );.  for
99d0: 28 63 66 70 3d 63 75 72 72 65 6e 74 3b 20 63 66  (cfp=current; cf
99e0: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
99f0: 29 7b 0a 20 20 20 20 72 70 20 3d 20 63 66 70 2d  ){.    rp = cfp-
9a00: 3e 72 70 3b 0a 20 20 20 20 64 6f 74 20 3d 20 63  >rp;.    dot = c
9a10: 66 70 2d 3e 64 6f 74 3b 0a 20 20 20 20 69 66 28  fp->dot;.    if(
9a20: 20 64 6f 74 3e 3d 72 70 2d 3e 6e 72 68 73 20 29   dot>=rp->nrhs )
9a30: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73   continue;.    s
9a40: 70 20 3d 20 72 70 2d 3e 72 68 73 5b 64 6f 74 5d  p = rp->rhs[dot]
9a50: 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  ;.    if( sp->ty
9a60: 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe==NONTERMINAL 
9a70: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d  ){.      if( sp-
9a80: 3e 72 75 6c 65 3d 3d 30 20 26 26 20 73 70 21 3d  >rule==0 && sp!=
9a90: 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a  lemp->errsym ){.
9aa0: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
9ab0: 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
9ac0: 72 70 2d 3e 6c 69 6e 65 2c 22 4e 6f 6e 74 65 72  rp->line,"Nonter
9ad0: 6d 69 6e 61 6c 20 5c 22 25 73 5c 22 20 68 61 73  minal \"%s\" has
9ae0: 20 6e 6f 20 72 75 6c 65 73 2e 22 2c 0a 20 20 20   no rules.",.   
9af0: 20 20 20 20 20 20 20 73 70 2d 3e 6e 61 6d 65 29         sp->name)
9b00: 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e  ;.        lemp->
9b10: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
9b20: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e 65    }.      for(ne
9b30: 77 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 6e 65  wrp=sp->rule; ne
9b40: 77 72 70 3b 20 6e 65 77 72 70 3d 6e 65 77 72 70  wrp; newrp=newrp
9b50: 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20 20  ->nextlhs){.    
9b60: 20 20 20 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e      newcfp = Con
9b70: 66 69 67 6c 69 73 74 5f 61 64 64 28 6e 65 77 72  figlist_add(newr
9b80: 70 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  p,0);.        fo
9b90: 72 28 69 3d 64 6f 74 2b 31 3b 20 69 3c 72 70 2d  r(i=dot+1; i<rp-
9ba0: 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
9bb0: 20 20 20 20 20 20 20 78 73 70 20 3d 20 72 70 2d         xsp = rp-
9bc0: 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20  >rhs[i];.       
9bd0: 20 20 20 69 66 28 20 78 73 70 2d 3e 74 79 70 65     if( xsp->type
9be0: 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  ==TERMINAL ){.  
9bf0: 20 20 20 20 20 20 20 20 20 20 53 65 74 41 64 64            SetAdd
9c00: 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73 70  (newcfp->fws,xsp
9c10: 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
9c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9c30: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
9c40: 20 78 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54   xsp->type==MULT
9c50: 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
9c60: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
9c80: 6b 3d 30 3b 20 6b 3c 78 73 70 2d 3e 6e 73 75 62  k=0; k<xsp->nsub
9c90: 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  sym; k++){.     
9ca0: 20 20 20 20 20 20 20 20 20 53 65 74 41 64 64 28           SetAdd(
9cb0: 6e 65 77 63 66 70 2d 3e 66 77 73 2c 20 78 73 70  newcfp->fws, xsp
9cc0: 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e 69 6e 64  ->subsym[k]->ind
9cd0: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ex);.           
9ce0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62   }.            b
9cf0: 72 65 61 6b 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a  reak;..  }else{.
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74 55              SetU
9d10: 6e 69 6f 6e 28 6e 65 77 63 66 70 2d 3e 66 77 73  nion(newcfp->fws
9d20: 2c 78 73 70 2d 3e 66 69 72 73 74 73 65 74 29 3b  ,xsp->firstset);
9d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
9d40: 20 78 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45   xsp->lambda==LE
9d50: 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61  MON_FALSE ) brea
9d60: 6b 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20  k;..  }..}.     
9d70: 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72     if( i==rp->nr
9d80: 68 73 20 29 20 50 6c 69 6e 6b 5f 61 64 64 28 26  hs ) Plink_add(&
9d90: 63 66 70 2d 3e 66 70 6c 70 2c 6e 65 77 63 66 70  cfp->fplp,newcfp
9da0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9db0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
9dc0: 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f  ../* Sort the co
9dd0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
9de0: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
9df0: 69 73 74 5f 73 6f 72 74 28 29 7b 0a 20 20 63 75  ist_sort(){.  cu
9e00: 72 72 65 6e 74 20 3d 20 28 73 74 72 75 63 74 20  rrent = (struct 
9e10: 63 6f 6e 66 69 67 20 2a 29 6d 73 6f 72 74 28 28  config *)msort((
9e20: 63 68 61 72 20 2a 29 63 75 72 72 65 6e 74 2c 28  char *)current,(
9e30: 63 68 61 72 20 2a 2a 29 26 28 63 75 72 72 65 6e  char **)&(curren
9e40: 74 2d 3e 6e 65 78 74 29 2c 43 6f 6e 66 69 67 63  t->next),Configc
9e50: 6d 70 29 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e  mp);.  currenten
9e60: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  d = 0;.  return;
9e70: 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20  .}../* Sort the 
9e80: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
9e90: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  ion list */.void
9ea0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74   Configlist_sort
9eb0: 62 61 73 69 73 28 29 7b 0a 20 20 62 61 73 69 73  basis(){.  basis
9ec0: 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69   = (struct confi
9ed0: 67 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20  g *)msort((char 
9ee0: 2a 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72 20  *)current,(char 
9ef0: 2a 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 62 70  **)&(current->bp
9f00: 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20  ),Configcmp);.  
9f10: 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20  basisend = 0;.  
9f20: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65  return;.}../* Re
9f30: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
9f40: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
9f50: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
9f60: 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65  list and.** rese
9f70: 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74  t the list */.st
9f80: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
9f90: 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29  figlist_return()
9fa0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
9fb0: 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20  g *old;.  old = 
9fc0: 63 75 72 72 65 6e 74 3b 0a 20 20 63 75 72 72 65  current;.  curre
9fd0: 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e  nt = 0;.  curren
9fe0: 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  tend = 0;.  retu
9ff0: 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 52 65  rn old;.}../* Re
a000: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
a010: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
a020: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
a030: 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65  list and.** rese
a040: 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74  t the list */.st
a050: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
a060: 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29 7b  figlist_basis(){
a070: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
a080: 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 62   *old;.  old = b
a090: 61 73 69 73 3b 0a 20 20 62 61 73 69 73 20 3d 20  asis;.  basis = 
a0a0: 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20  0;.  basisend = 
a0b0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b  0;.  return old;
a0c0: 0a 7d 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20  .}../* Free all 
a0d0: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
a0e0: 67 69 76 65 6e 20 63 6f 6e 66 69 67 75 72 61 74  given configurat
a0f0: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  ion list */.void
a100: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28   Configlist_eat(
a110: 63 66 70 29 0a 73 74 72 75 63 74 20 63 6f 6e 66  cfp).struct conf
a120: 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72  ig *cfp;.{.  str
a130: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 78 74  uct config *next
a140: 63 66 70 3b 0a 20 20 66 6f 72 28 3b 20 63 66 70  cfp;.  for(; cfp
a150: 3b 20 63 66 70 3d 6e 65 78 74 63 66 70 29 7b 0a  ; cfp=nextcfp){.
a160: 20 20 20 20 6e 65 78 74 63 66 70 20 3d 20 63 66      nextcfp = cf
a170: 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 61 73 73  p->next;.    ass
a180: 65 72 74 28 20 63 66 70 2d 3e 66 70 6c 70 3d 3d  ert( cfp->fplp==
a190: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
a1a0: 20 63 66 70 2d 3e 62 70 6c 70 3d 3d 30 20 29 3b   cfp->bplp==0 );
a1b0: 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 66 77  .    if( cfp->fw
a1c0: 73 20 29 20 53 65 74 46 72 65 65 28 63 66 70 2d  s ) SetFree(cfp-
a1d0: 3e 66 77 73 29 3b 0a 20 20 20 20 64 65 6c 65 74  >fws);.    delet
a1e0: 65 63 6f 6e 66 69 67 28 63 66 70 29 3b 0a 20 20  econfig(cfp);.  
a1f0: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 2f 2a  }.  return;.}./*
a200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a210: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
a220: 65 72 72 6f 72 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  error.c" *******
a230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
a250: 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 69 6e 74  * Code for print
a260: 69 6e 67 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ing error messag
a270: 65 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e 64 20 61  e..*/../* Find a
a280: 20 67 6f 6f 64 20 70 6c 61 63 65 20 74 6f 20 62   good place to b
a290: 72 65 61 6b 20 22 6d 73 67 22 20 73 6f 20 74 68  reak "msg" so th
a2a0: 61 74 20 69 74 73 20 6c 65 6e 67 74 68 20 69 73  at its length is
a2b0: 20 61 74 20 6c 65 61 73 74 20 22 6d 69 6e 22 0a   at least "min".
a2c0: 2a 2a 20 62 75 74 20 6e 6f 20 6d 6f 72 65 20 74  ** but no more t
a2d0: 68 61 6e 20 22 6d 61 78 22 2e 20 20 4d 61 6b 65  han "max".  Make
a2e0: 20 74 68 65 20 70 6f 69 6e 74 20 61 73 20 63 6c   the point as cl
a2f0: 6f 73 65 20 74 6f 20 6d 61 78 20 61 73 20 70 6f  ose to max as po
a300: 73 73 69 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  ssible..*/.stati
a310: 63 20 69 6e 74 20 66 69 6e 64 62 72 65 61 6b 28  c int findbreak(
a320: 6d 73 67 2c 6d 69 6e 2c 6d 61 78 29 0a 63 68 61  msg,min,max).cha
a330: 72 20 2a 6d 73 67 3b 0a 69 6e 74 20 6d 69 6e 3b  r *msg;.int min;
a340: 0a 69 6e 74 20 6d 61 78 3b 0a 7b 0a 20 20 69 6e  .int max;.{.  in
a350: 74 20 69 2c 73 70 6f 74 3b 0a 20 20 63 68 61 72  t i,spot;.  char
a360: 20 63 3b 0a 20 20 66 6f 72 28 69 3d 73 70 6f 74   c;.  for(i=spot
a370: 3d 6d 69 6e 3b 20 69 3c 3d 6d 61 78 3b 20 69 2b  =min; i<=max; i+
a380: 2b 29 7b 0a 20 20 20 20 63 20 3d 20 6d 73 67 5b  +){.    c = msg[
a390: 69 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  i];.    if( c=='
a3a0: 5c 74 27 20 29 20 6d 73 67 5b 69 5d 20 3d 20 27  \t' ) msg[i] = '
a3b0: 20 27 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   ';.    if( c=='
a3c0: 5c 6e 27 20 29 7b 20 6d 73 67 5b 69 5d 20 3d 20  \n' ){ msg[i] = 
a3d0: 27 20 27 3b 20 73 70 6f 74 20 3d 20 69 3b 20 62  ' '; spot = i; b
a3e0: 72 65 61 6b 3b 20 7d 0a 20 20 20 20 69 66 28 20  reak; }.    if( 
a3f0: 63 3d 3d 30 20 29 7b 20 73 70 6f 74 20 3d 20 69  c==0 ){ spot = i
a400: 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 69  ; break; }.    i
a410: 66 28 20 63 3d 3d 27 2d 27 20 26 26 20 69 3c 6d  f( c=='-' && i<m
a420: 61 78 2d 31 20 29 20 73 70 6f 74 20 3d 20 69 2b  ax-1 ) spot = i+
a430: 31 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 20  1;.    if( c==' 
a440: 27 20 29 20 73 70 6f 74 20 3d 20 69 3b 0a 20 20  ' ) spot = i;.  
a450: 7d 0a 20 20 72 65 74 75 72 6e 20 73 70 6f 74 3b  }.  return spot;
a460: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 72  .}../*.** The er
a470: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
a480: 70 6c 69 74 20 61 63 72 6f 73 73 20 6d 75 6c 74  plit across mult
a490: 69 70 6c 65 20 6c 69 6e 65 73 20 69 66 20 6e 65  iple lines if ne
a4a0: 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a  cessary.  The.**
a4b0: 20 73 70 6c 69 74 73 20 6f 63 63 75 72 20 61 74   splits occur at
a4c0: 20 61 20 73 70 61 63 65 2c 20 69 66 20 74 68 65   a space, if the
a4d0: 72 65 20 69 73 20 61 20 73 70 61 63 65 20 61 76  re is a space av
a4e0: 61 69 6c 61 62 6c 65 20 6e 65 61 72 20 74 68 65  ailable near the
a4f0: 20 65 6e 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6c   end.** of the l
a500: 69 6e 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ine..*/.#define 
a510: 45 52 52 4d 53 47 53 49 5a 45 20 20 31 30 30 30  ERRMSGSIZE  1000
a520: 30 20 2f 2a 20 48 6f 70 65 20 74 68 69 73 20 69  0 /* Hope this i
a530: 73 20 62 69 67 20 65 6e 6f 75 67 68 2e 20 20 4e  s big enough.  N
a540: 6f 20 77 61 79 20 74 6f 20 65 72 72 6f 72 20 63  o way to error c
a550: 68 65 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  heck */.#define 
a560: 4c 49 4e 45 57 49 44 54 48 20 20 20 20 20 20 37  LINEWIDTH      7
a570: 39 20 2f 2a 20 4d 61 78 20 77 69 64 74 68 20 6f  9 /* Max width o
a580: 66 20 61 6e 79 20 6f 75 74 70 75 74 20 6c 69 6e  f any output lin
a590: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 45  e */.#define PRE
a5a0: 46 49 58 4c 49 4d 49 54 20 20 20 20 33 30 20 2f  FIXLIMIT    30 /
a5b0: 2a 20 4d 61 78 20 77 69 64 74 68 20 6f 66 20 74  * Max width of t
a5c0: 68 65 20 70 72 65 66 69 78 20 6f 6e 20 65 61 63  he prefix on eac
a5d0: 68 20 6c 69 6e 65 20 2a 2f 0a 76 6f 69 64 20 45  h line */.void E
a5e0: 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63 68  rrorMsg(const ch
a5f0: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 69 6e  ar *filename, in
a600: 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20  t lineno, const 
a610: 63 68 61 72 20 2a 66 6f 72 6d 61 74 2c 20 2e 2e  char *format, ..
a620: 2e 29 7b 0a 20 20 63 68 61 72 20 65 72 72 6d 73  .){.  char errms
a630: 67 5b 45 52 52 4d 53 47 53 49 5a 45 5d 3b 0a 20  g[ERRMSGSIZE];. 
a640: 20 63 68 61 72 20 70 72 65 66 69 78 5b 50 52 45   char prefix[PRE
a650: 46 49 58 4c 49 4d 49 54 2b 31 30 5d 3b 0a 20 20  FIXLIMIT+10];.  
a660: 69 6e 74 20 65 72 72 6d 73 67 73 69 7a 65 3b 0a  int errmsgsize;.
a670: 20 20 69 6e 74 20 70 72 65 66 69 78 73 69 7a 65    int prefixsize
a680: 3b 0a 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c  ;.  int availabl
a690: 65 77 69 64 74 68 3b 0a 20 20 76 61 5f 6c 69 73  ewidth;.  va_lis
a6a0: 74 20 61 70 3b 0a 20 20 69 6e 74 20 65 6e 64 2c  t ap;.  int end,
a6b0: 20 72 65 73 74 61 72 74 2c 20 62 61 73 65 3b 0a   restart, base;.
a6c0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
a6d0: 66 6f 72 6d 61 74 29 3b 0a 20 20 2f 2a 20 50 72  format);.  /* Pr
a6e0: 65 70 61 72 65 20 61 20 70 72 65 66 69 78 20 74  epare a prefix t
a6f0: 6f 20 62 65 20 70 72 65 70 65 6e 64 65 64 20 74  o be prepended t
a700: 6f 20 65 76 65 72 79 20 6f 75 74 70 75 74 20 6c  o every output l
a710: 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 6c 69 6e  ine */.  if( lin
a720: 65 6e 6f 3e 30 20 29 7b 0a 20 20 20 20 73 70 72  eno>0 ){.    spr
a730: 69 6e 74 66 28 70 72 65 66 69 78 2c 22 25 2e 2a  intf(prefix,"%.*
a740: 73 3a 25 64 3a 20 22 2c 50 52 45 46 49 58 4c 49  s:%d: ",PREFIXLI
a750: 4d 49 54 2d 31 30 2c 66 69 6c 65 6e 61 6d 65 2c  MIT-10,filename,
a760: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65  lineno);.  }else
a770: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 70 72  {.    sprintf(pr
a780: 65 66 69 78 2c 22 25 2e 2a 73 3a 20 22 2c 50 52  efix,"%.*s: ",PR
a790: 45 46 49 58 4c 49 4d 49 54 2d 31 30 2c 66 69 6c  EFIXLIMIT-10,fil
a7a0: 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 72  ename);.  }.  pr
a7b0: 65 66 69 78 73 69 7a 65 20 3d 20 73 74 72 6c 65  efixsize = strle
a7c0: 6e 28 70 72 65 66 69 78 29 3b 0a 20 20 61 76 61  n(prefix);.  ava
a7d0: 69 6c 61 62 6c 65 77 69 64 74 68 20 3d 20 4c 49  ilablewidth = LI
a7e0: 4e 45 57 49 44 54 48 20 2d 20 70 72 65 66 69 78  NEWIDTH - prefix
a7f0: 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  size;..  /* Gene
a800: 72 61 74 65 20 74 68 65 20 65 72 72 6f 72 20 6d  rate the error m
a810: 65 73 73 61 67 65 20 2a 2f 0a 20 20 76 73 70 72  essage */.  vspr
a820: 69 6e 74 66 28 65 72 72 6d 73 67 2c 66 6f 72 6d  intf(errmsg,form
a830: 61 74 2c 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  at,ap);.  va_end
a840: 28 61 70 29 3b 0a 20 20 65 72 72 6d 73 67 73 69  (ap);.  errmsgsi
a850: 7a 65 20 3d 20 73 74 72 6c 65 6e 28 65 72 72 6d  ze = strlen(errm
a860: 73 67 29 3b 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  sg);.  /* Remove
a870: 20 74 72 61 69 6c 69 6e 67 20 27 5c 6e 27 73 20   trailing '\n's 
a880: 66 72 6f 6d 20 74 68 65 20 65 72 72 6f 72 20 6d  from the error m
a890: 65 73 73 61 67 65 2e 20 2a 2f 0a 20 20 77 68 69  essage. */.  whi
a8a0: 6c 65 28 20 65 72 72 6d 73 67 73 69 7a 65 3e 30  le( errmsgsize>0
a8b0: 20 26 26 20 65 72 72 6d 73 67 5b 65 72 72 6d 73   && errmsg[errms
a8c0: 67 73 69 7a 65 2d 31 5d 3d 3d 27 5c 6e 27 20 29  gsize-1]=='\n' )
a8d0: 7b 0a 20 20 20 20 20 65 72 72 6d 73 67 5b 2d 2d  {.     errmsg[--
a8e0: 65 72 72 6d 73 67 73 69 7a 65 5d 20 3d 20 30 3b  errmsgsize] = 0;
a8f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e 74  .  }..  /* Print
a900: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
a910: 67 65 20 2a 2f 0a 20 20 62 61 73 65 20 3d 20 30  ge */.  base = 0
a920: 3b 0a 20 20 77 68 69 6c 65 28 20 65 72 72 6d 73  ;.  while( errms
a930: 67 5b 62 61 73 65 5d 21 3d 30 20 29 7b 0a 20 20  g[base]!=0 ){.  
a940: 20 20 65 6e 64 20 3d 20 72 65 73 74 61 72 74 20    end = restart 
a950: 3d 20 66 69 6e 64 62 72 65 61 6b 28 26 65 72 72  = findbreak(&err
a960: 6d 73 67 5b 62 61 73 65 5d 2c 30 2c 61 76 61 69  msg[base],0,avai
a970: 6c 61 62 6c 65 77 69 64 74 68 29 3b 0a 20 20 20  lablewidth);.   
a980: 20 72 65 73 74 61 72 74 20 2b 3d 20 62 61 73 65   restart += base
a990: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 65 72 72  ;.    while( err
a9a0: 6d 73 67 5b 72 65 73 74 61 72 74 5d 3d 3d 27 20  msg[restart]==' 
a9b0: 27 20 29 20 72 65 73 74 61 72 74 2b 2b 3b 0a 20  ' ) restart++;. 
a9c0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75     fprintf(stdou
a9d0: 74 2c 22 25 73 25 2e 2a 73 5c 6e 22 2c 70 72 65  t,"%s%.*s\n",pre
a9e0: 66 69 78 2c 65 6e 64 2c 26 65 72 72 6d 73 67 5b  fix,end,&errmsg[
a9f0: 62 61 73 65 5d 29 3b 0a 20 20 20 20 62 61 73 65  base]);.    base
aa00: 20 3d 20 72 65 73 74 61 72 74 3b 0a 20 20 7d 0a   = restart;.  }.
aa10: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
aa20: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
aa30: 65 20 22 6d 61 69 6e 2e 63 22 20 2a 2a 2a 2a 2a  e "main.c" *****
aa40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aa50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
aa60: 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20 70 72 6f 67  ./*.** Main prog
aa70: 72 61 6d 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ram file for the
aa80: 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
aa90: 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20  nerator..*/../* 
aaa0: 52 65 70 6f 72 74 20 61 6e 20 6f 75 74 2d 6f 66  Report an out-of
aab0: 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64 69 74 69 6f  -memory conditio
aac0: 6e 20 61 6e 64 20 61 62 6f 72 74 2e 20 20 54 68  n and abort.  Th
aad0: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
aae0: 73 20 75 73 65 64 20 6d 6f 73 74 6c 79 20 62 79  s used mostly by
aaf0: 20 74 68 65 20 22 4d 65 6d 6f 72 79 43 68 65 63   the "MemoryChec
ab00: 6b 22 20 6d 61 63 72 6f 20 69 6e 20 73 74 72 75  k" macro in stru
ab10: 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64 20 6d 65 6d  ct.h.*/.void mem
ab20: 6f 72 79 5f 65 72 72 6f 72 28 29 7b 0a 20 20 66  ory_error(){.  f
ab30: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f  printf(stderr,"O
ab40: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 20 41  ut of memory.  A
ab50: 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e 22 29 3b 0a  borting...\n");.
ab60: 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 73 74    exit(1);.}..st
ab70: 61 74 69 63 20 69 6e 74 20 6e 44 65 66 69 6e 65  atic int nDefine
ab80: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75   = 0;      /* Nu
ab90: 6d 62 65 72 20 6f 66 20 2d 44 20 6f 70 74 69 6f  mber of -D optio
aba0: 6e 73 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  ns on the comman
abb0: 64 20 6c 69 6e 65 20 2a 2f 0a 73 74 61 74 69 63  d line */.static
abc0: 20 63 68 61 72 20 2a 2a 61 7a 44 65 66 69 6e 65   char **azDefine
abd0: 20 3d 20 30 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f   = 0;  /* Name o
abe0: 66 20 74 68 65 20 2d 44 20 6d 61 63 72 6f 73 20  f the -D macros 
abf0: 2a 2f 0a 0a 2f 2a 20 54 68 69 73 20 72 6f 75 74  */../* This rout
ac00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ine is called wi
ac10: 74 68 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  th the argument 
ac20: 74 6f 20 65 61 63 68 20 2d 44 20 63 6f 6d 6d 61  to each -D comma
ac30: 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a  nd-line option..
ac40: 2a 2a 20 41 64 64 20 74 68 65 20 6d 61 63 72 6f  ** Add the macro
ac50: 20 64 65 66 69 6e 65 64 20 74 6f 20 74 68 65 20   defined to the 
ac60: 61 7a 44 65 66 69 6e 65 20 61 72 72 61 79 2e 0a  azDefine array..
ac70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
ac80: 61 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e 28 63  andle_D_option(c
ac90: 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61 72 20  har *z){.  char 
aca0: 2a 2a 70 61 7a 3b 0a 20 20 6e 44 65 66 69 6e 65  **paz;.  nDefine
acb0: 2b 2b 3b 0a 20 20 61 7a 44 65 66 69 6e 65 20 3d  ++;.  azDefine =
acc0: 20 72 65 61 6c 6c 6f 63 28 61 7a 44 65 66 69 6e   realloc(azDefin
acd0: 65 2c 20 73 69 7a 65 6f 66 28 61 7a 44 65 66 69  e, sizeof(azDefi
ace0: 6e 65 5b 30 5d 29 2a 6e 44 65 66 69 6e 65 29 3b  ne[0])*nDefine);
acf0: 0a 20 20 69 66 28 20 61 7a 44 65 66 69 6e 65 3d  .  if( azDefine=
ad00: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
ad10: 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20 6f 66  f(stderr,"out of
ad20: 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
ad30: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
ad40: 70 61 7a 20 3d 20 26 61 7a 44 65 66 69 6e 65 5b  paz = &azDefine[
ad50: 6e 44 65 66 69 6e 65 2d 31 5d 3b 0a 20 20 2a 70  nDefine-1];.  *p
ad60: 61 7a 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 74 72  az = malloc( str
ad70: 6c 65 6e 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66  len(z)+1 );.  if
ad80: 28 20 2a 70 61 7a 3d 3d 30 20 29 7b 0a 20 20 20  ( *paz==0 ){.   
ad90: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
ada0: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e  "out of memory\n
adb0: 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
adc0: 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 2a 70  .  }.  strcpy(*p
add0: 61 7a 2c 20 7a 29 3b 0a 20 20 66 6f 72 28 7a 3d  az, z);.  for(z=
ade0: 2a 70 61 7a 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d  *paz; *z && *z!=
adf0: 27 3d 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20 2a 7a  '='; z++){}.  *z
ae00: 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 20 54 68 65   = 0;.}.../* The
ae10: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 20   main program.  
ae20: 50 61 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e  Parse the comman
ae30: 64 20 6c 69 6e 65 20 61 6e 64 20 64 6f 20 69 74  d line and do it
ae40: 2e 2e 2e 20 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28  ... */.int main(
ae50: 61 72 67 63 2c 61 72 67 76 29 0a 69 6e 74 20 61  argc,argv).int a
ae60: 72 67 63 3b 0a 63 68 61 72 20 2a 2a 61 72 67 76  rgc;.char **argv
ae70: 3b 0a 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  ;.{.  static int
ae80: 20 76 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 20 20   version = 0;.  
ae90: 73 74 61 74 69 63 20 69 6e 74 20 72 70 66 6c 61  static int rpfla
aea0: 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  g = 0;.  static 
aeb0: 69 6e 74 20 62 61 73 69 73 66 6c 61 67 20 3d 20  int basisflag = 
aec0: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
aed0: 63 6f 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20 20  compress = 0;.  
aee0: 73 74 61 74 69 63 20 69 6e 74 20 71 75 69 65 74  static int quiet
aef0: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
af00: 6e 74 20 73 74 61 74 69 73 74 69 63 73 20 3d 20  nt statistics = 
af10: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
af20: 6d 68 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74  mhflag = 0;.  st
af30: 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70  atic struct s_op
af40: 74 69 6f 6e 73 20 6f 70 74 69 6f 6e 73 5b 5d 20  tions options[] 
af50: 3d 20 7b 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  = {.    {OPT_FLA
af60: 47 2c 20 22 62 22 2c 20 28 63 68 61 72 2a 29 26  G, "b", (char*)&
af70: 62 61 73 69 73 66 6c 61 67 2c 20 22 50 72 69 6e  basisflag, "Prin
af80: 74 20 6f 6e 6c 79 20 74 68 65 20 62 61 73 69 73  t only the basis
af90: 20 69 6e 20 72 65 70 6f 72 74 2e 22 7d 2c 0a 20   in report."},. 
afa0: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 63     {OPT_FLAG, "c
afb0: 22 2c 20 28 63 68 61 72 2a 29 26 63 6f 6d 70 72  ", (char*)&compr
afc0: 65 73 73 2c 20 22 44 6f 6e 27 74 20 63 6f 6d 70  ess, "Don't comp
afd0: 72 65 73 73 20 74 68 65 20 61 63 74 69 6f 6e 20  ress the action 
afe0: 74 61 62 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f  table."},.    {O
aff0: 50 54 5f 46 53 54 52 2c 20 22 44 22 2c 20 28 63  PT_FSTR, "D", (c
b000: 68 61 72 2a 29 68 61 6e 64 6c 65 5f 44 5f 6f 70  har*)handle_D_op
b010: 74 69 6f 6e 2c 20 22 44 65 66 69 6e 65 20 61 6e  tion, "Define an
b020: 20 25 69 66 64 65 66 20 6d 61 63 72 6f 2e 22 7d   %ifdef macro."}
b030: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
b040: 20 22 67 22 2c 20 28 63 68 61 72 2a 29 26 72 70   "g", (char*)&rp
b050: 66 6c 61 67 2c 20 22 50 72 69 6e 74 20 67 72 61  flag, "Print gra
b060: 6d 6d 61 72 20 77 69 74 68 6f 75 74 20 61 63 74  mmar without act
b070: 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  ions."},.    {OP
b080: 54 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28 63 68  T_FLAG, "m", (ch
b090: 61 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22 4f 75  ar*)&mhflag, "Ou
b0a0: 74 70 75 74 20 61 20 6d 61 6b 65 68 65 61 64 65  tput a makeheade
b0b0: 72 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 69  rs compatible fi
b0c0: 6c 65 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  le"},.    {OPT_F
b0d0: 4c 41 47 2c 20 22 71 22 2c 20 28 63 68 61 72 2a  LAG, "q", (char*
b0e0: 29 26 71 75 69 65 74 2c 20 22 28 51 75 69 65 74  )&quiet, "(Quiet
b0f0: 29 20 44 6f 6e 27 74 20 70 72 69 6e 74 20 74 68  ) Don't print th
b100: 65 20 72 65 70 6f 72 74 20 66 69 6c 65 2e 22 7d  e report file."}
b110: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
b120: 20 22 73 22 2c 20 28 63 68 61 72 2a 29 26 73 74   "s", (char*)&st
b130: 61 74 69 73 74 69 63 73 2c 0a 20 20 20 20 20 20  atistics,.      
b140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 50 72               "Pr
b160: 69 6e 74 20 70 61 72 73 65 72 20 73 74 61 74 73  int parser stats
b170: 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74   to standard out
b180: 70 75 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  put."},.    {OPT
b190: 5f 46 4c 41 47 2c 20 22 78 22 2c 20 28 63 68 61  _FLAG, "x", (cha
b1a0: 72 2a 29 26 76 65 72 73 69 6f 6e 2c 20 22 50 72  r*)&version, "Pr
b1b0: 69 6e 74 20 74 68 65 20 76 65 72 73 69 6f 6e 20  int the version 
b1c0: 6e 75 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20 7b  number."},.    {
b1d0: 4f 50 54 5f 46 4c 41 47 2c 30 2c 30 2c 30 7d 0a  OPT_FLAG,0,0,0}.
b1e0: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
b1f0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 6c 65 6d  struct lemon lem
b200: 3b 0a 0a 20 20 4f 70 74 49 6e 69 74 28 61 72 67  ;..  OptInit(arg
b210: 76 2c 6f 70 74 69 6f 6e 73 2c 73 74 64 65 72 72  v,options,stderr
b220: 29 3b 0a 20 20 69 66 28 20 76 65 72 73 69 6f 6e  );.  if( version
b230: 20 29 7b 0a 20 20 20 20 20 70 72 69 6e 74 66 28   ){.     printf(
b240: 22 4c 65 6d 6f 6e 20 76 65 72 73 69 6f 6e 20 31  "Lemon version 1
b250: 2e 30 5c 6e 22 29 3b 0a 20 20 20 20 20 65 78 69  .0\n");.     exi
b260: 74 28 30 29 3b 20 0a 20 20 7d 0a 20 20 69 66 28  t(0); .  }.  if(
b270: 20 4f 70 74 4e 41 72 67 73 28 29 21 3d 31 20 29   OptNArgs()!=1 )
b280: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
b290: 64 65 72 72 2c 22 45 78 61 63 74 6c 79 20 6f 6e  derr,"Exactly on
b2a0: 65 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d  e filename argum
b2b0: 65 6e 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  ent is required.
b2c0: 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
b2d0: 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  );.  }.  memset(
b2e0: 26 6c 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &lem, 0, sizeof(
b2f0: 6c 65 6d 29 29 3b 0a 20 20 6c 65 6d 2e 65 72 72  lem));.  lem.err
b300: 6f 72 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  orcnt = 0;..  /*
b310: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
b320: 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 53 74 72  machine */.  Str
b330: 73 61 66 65 5f 69 6e 69 74 28 29 3b 0a 20 20 53  safe_init();.  S
b340: 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 3b 0a 20 20  ymbol_init();.  
b350: 53 74 61 74 65 5f 69 6e 69 74 28 29 3b 0a 20 20  State_init();.  
b360: 6c 65 6d 2e 61 72 67 76 30 20 3d 20 61 72 67 76  lem.argv0 = argv
b370: 5b 30 5d 3b 0a 20 20 6c 65 6d 2e 66 69 6c 65 6e  [0];.  lem.filen
b380: 61 6d 65 20 3d 20 4f 70 74 41 72 67 28 30 29 3b  ame = OptArg(0);
b390: 0a 20 20 6c 65 6d 2e 62 61 73 69 73 66 6c 61 67  .  lem.basisflag
b3a0: 20 3d 20 62 61 73 69 73 66 6c 61 67 3b 0a 20 20   = basisflag;.  
b3b0: 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 24 22 29 3b  Symbol_new("$");
b3c0: 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 20 3d 20  .  lem.errsym = 
b3d0: 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 65 72 72 6f  Symbol_new("erro
b3e0: 72 22 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79  r");.  lem.errsy
b3f0: 6d 2d 3e 75 73 65 43 6e 74 20 3d 20 30 3b 0a 0a  m->useCnt = 0;..
b400: 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 69    /* Parse the i
b410: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 50  nput file */.  P
b420: 61 72 73 65 28 26 6c 65 6d 29 3b 0a 20 20 69 66  arse(&lem);.  if
b430: 28 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 29  ( lem.errorcnt )
b440: 20 65 78 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63   exit(lem.errorc
b450: 6e 74 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 6e  nt);.  if( lem.n
b460: 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66  rule==0 ){.    f
b470: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
b480: 6d 70 74 79 20 67 72 61 6d 6d 61 72 2e 5c 6e 22  mpty grammar.\n"
b490: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
b4a0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20    }..  /* Count 
b4b0: 61 6e 64 20 69 6e 64 65 78 20 74 68 65 20 73 79  and index the sy
b4c0: 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72 61  mbols of the gra
b4d0: 6d 6d 61 72 20 2a 2f 0a 20 20 6c 65 6d 2e 6e 73  mmar */.  lem.ns
b4e0: 79 6d 62 6f 6c 20 3d 20 53 79 6d 62 6f 6c 5f 63  ymbol = Symbol_c
b4f0: 6f 75 6e 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c  ount();.  Symbol
b500: 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74 7d 22  _new("{default}"
b510: 29 3b 0a 20 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73  );.  lem.symbols
b520: 20 3d 20 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f   = Symbol_arrayo
b530: 66 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  f();.  for(i=0; 
b540: 69 3c 3d 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20  i<=lem.nsymbol; 
b550: 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73  i++) lem.symbols
b560: 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a  [i]->index = i;.
b570: 20 20 71 73 6f 72 74 28 6c 65 6d 2e 73 79 6d 62    qsort(lem.symb
b580: 6f 6c 73 2c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2b  ols,lem.nsymbol+
b590: 31 2c 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  1,sizeof(struct 
b5a0: 73 79 6d 62 6f 6c 2a 29 2c 0a 20 20 20 20 20 20  symbol*),.      
b5b0: 20 20 28 69 6e 74 28 2a 29 28 29 29 53 79 6d 62    (int(*)())Symb
b5c0: 6f 6c 63 6d 70 70 29 3b 0a 20 20 66 6f 72 28 69  olcmpp);.  for(i
b5d0: 3d 30 3b 20 69 3c 3d 6c 65 6d 2e 6e 73 79 6d 62  =0; i<=lem.nsymb
b5e0: 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d  ol; i++) lem.sym
b5f0: 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d  bols[i]->index =
b600: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   i;.  for(i=1; i
b610: 73 75 70 70 65 72 28 6c 65 6d 2e 73 79 6d 62 6f  supper(lem.symbo
b620: 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 3b  ls[i]->name[0]);
b630: 20 69 2b 2b 29 3b 0a 20 20 6c 65 6d 2e 6e 74 65   i++);.  lem.nte
b640: 72 6d 69 6e 61 6c 20 3d 20 69 3b 0a 0a 20 20 2f  rminal = i;..  /
b650: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 72 65 70  * Generate a rep
b660: 72 69 6e 74 20 6f 66 20 74 68 65 20 67 72 61 6d  rint of the gram
b670: 6d 61 72 2c 20 69 66 20 72 65 71 75 65 73 74 65  mar, if requeste
b680: 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  d on the command
b690: 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 72   line */.  if( r
b6a0: 70 66 6c 61 67 20 29 7b 0a 20 20 20 20 52 65 70  pflag ){.    Rep
b6b0: 72 69 6e 74 28 26 6c 65 6d 29 3b 0a 20 20 7d 65  rint(&lem);.  }e
b6c0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  lse{.    /* Init
b6d0: 69 61 6c 69 7a 65 20 74 68 65 20 73 69 7a 65 20  ialize the size 
b6e0: 66 6f 72 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61  for all follow a
b6f0: 6e 64 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f  nd first sets */
b700: 0a 20 20 20 20 53 65 74 53 69 7a 65 28 6c 65 6d  .    SetSize(lem
b710: 2e 6e 74 65 72 6d 69 6e 61 6c 2b 31 29 3b 0a 0a  .nterminal+1);..
b720: 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
b730: 70 72 65 63 65 64 65 6e 63 65 20 66 6f 72 20 65  precedence for e
b740: 76 65 72 79 20 70 72 6f 64 75 63 74 69 6f 6e 20  very production 
b750: 72 75 6c 65 20 28 74 68 61 74 20 68 61 73 20 6f  rule (that has o
b760: 6e 65 29 20 2a 2f 0a 20 20 20 20 46 69 6e 64 52  ne) */.    FindR
b770: 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28 26  ulePrecedences(&
b780: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  lem);..    /* Co
b790: 6d 70 75 74 65 20 74 68 65 20 6c 61 6d 62 64 61  mpute the lambda
b7a0: 2d 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 61 6e  -nonterminals an
b7b0: 64 20 74 68 65 20 66 69 72 73 74 2d 73 65 74 73  d the first-sets
b7c0: 20 66 6f 72 20 65 76 65 72 79 0a 20 20 20 20 2a   for every.    *
b7d0: 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 2a 2f  * nonterminal */
b7e0: 0a 20 20 20 20 46 69 6e 64 46 69 72 73 74 53 65  .    FindFirstSe
b7f0: 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  ts(&lem);..    /
b800: 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52  * Compute all LR
b810: 28 30 29 20 73 74 61 74 65 73 2e 20 20 41 6c 73  (0) states.  Als
b820: 6f 20 72 65 63 6f 72 64 20 66 6f 6c 6c 6f 77 2d  o record follow-
b830: 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 0a  set propagation.
b840: 20 20 20 20 2a 2a 20 6c 69 6e 6b 73 20 73 6f 20      ** links so 
b850: 74 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 2d  that the follow-
b860: 73 65 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 75  set can be compu
b870: 74 65 64 20 6c 61 74 65 72 20 2a 2f 0a 20 20 20  ted later */.   
b880: 20 6c 65 6d 2e 6e 73 74 61 74 65 20 3d 20 30 3b   lem.nstate = 0;
b890: 0a 20 20 20 20 46 69 6e 64 53 74 61 74 65 73 28  .    FindStates(
b8a0: 26 6c 65 6d 29 3b 0a 20 20 20 20 6c 65 6d 2e 73  &lem);.    lem.s
b8b0: 6f 72 74 65 64 20 3d 20 53 74 61 74 65 5f 61 72  orted = State_ar
b8c0: 72 61 79 6f 66 28 29 3b 0a 0a 20 20 20 20 2f 2a  rayof();..    /*
b8d0: 20 54 69 65 20 75 70 20 6c 6f 6f 73 65 20 65 6e   Tie up loose en
b8e0: 64 73 20 6f 6e 20 74 68 65 20 70 72 6f 70 61 67  ds on the propag
b8f0: 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20  ation links */. 
b900: 20 20 20 46 69 6e 64 4c 69 6e 6b 73 28 26 6c 65     FindLinks(&le
b910: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
b920: 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 20 73  ute the follow s
b930: 65 74 20 6f 66 20 65 76 65 72 79 20 72 65 64 75  et of every redu
b940: 63 69 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74  cible configurat
b950: 69 6f 6e 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46  ion */.    FindF
b960: 6f 6c 6c 6f 77 53 65 74 73 28 26 6c 65 6d 29 3b  ollowSets(&lem);
b970: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
b980: 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
b990: 65 73 20 2a 2f 0a 20 20 20 20 46 69 6e 64 41 63  es */.    FindAc
b9a0: 74 69 6f 6e 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  tions(&lem);..  
b9b0: 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 20 74 68    /* Compress th
b9c0: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20  e action tables 
b9d0: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 6d 70 72  */.    if( compr
b9e0: 65 73 73 3d 3d 30 20 29 20 43 6f 6d 70 72 65 73  ess==0 ) Compres
b9f0: 73 54 61 62 6c 65 73 28 26 6c 65 6d 29 3b 0a 0a  sTables(&lem);..
ba00: 20 20 20 20 2f 2a 20 52 65 6f 72 64 65 72 20 61      /* Reorder a
ba10: 6e 64 20 72 65 6e 75 6d 62 65 72 20 74 68 65 20  nd renumber the 
ba20: 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20 73  states so that s
ba30: 74 61 74 65 73 20 77 69 74 68 20 66 65 77 65 72  tates with fewer
ba40: 20 63 68 6f 69 63 65 73 0a 20 20 20 20 2a 2a 20   choices.    ** 
ba50: 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e 64  occur at the end
ba60: 2e 20 2a 2f 0a 20 20 20 20 52 65 73 6f 72 74 53  . */.    ResortS
ba70: 74 61 74 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  tates(&lem);..  
ba80: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
ba90: 72 65 70 6f 72 74 20 6f 66 20 74 68 65 20 70 61  report of the pa
baa0: 72 73 65 72 20 67 65 6e 65 72 61 74 65 64 2e 20  rser generated. 
bab0: 20 28 74 68 65 20 22 79 2e 6f 75 74 70 75 74 22   (the "y.output"
bac0: 20 66 69 6c 65 29 20 2a 2f 0a 20 20 20 20 69 66   file) */.    if
bad0: 28 20 21 71 75 69 65 74 20 29 20 52 65 70 6f 72  ( !quiet ) Repor
bae0: 74 4f 75 74 70 75 74 28 26 6c 65 6d 29 3b 0a 0a  tOutput(&lem);..
baf0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
bb00: 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20  the source code 
bb10: 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 2a  for the parser *
bb20: 2f 0a 20 20 20 20 52 65 70 6f 72 74 54 61 62 6c  /.    ReportTabl
bb30: 65 28 26 6c 65 6d 2c 20 6d 68 66 6c 61 67 29 3b  e(&lem, mhflag);
bb40: 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 64 75 63 65  ..    /* Produce
bb50: 20 61 20 68 65 61 64 65 72 20 66 69 6c 65 20 66   a header file f
bb60: 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 73 63  or use by the sc
bb70: 61 6e 6e 65 72 2e 20 20 28 54 68 69 73 20 73 74  anner.  (This st
bb80: 65 70 20 69 73 0a 20 20 20 20 2a 2a 20 6f 6d 69  ep is.    ** omi
bb90: 74 74 65 64 20 69 66 20 74 68 65 20 22 2d 6d 22  tted if the "-m"
bba0: 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20   option is used 
bbb0: 62 65 63 61 75 73 65 20 6d 61 6b 65 68 65 61 64  because makehead
bbc0: 65 72 73 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ers will.    ** 
bbd0: 67 65 6e 65 72 61 74 65 20 74 68 65 20 66 69 6c  generate the fil
bbe0: 65 20 66 6f 72 20 75 73 2e 29 20 2a 2f 0a 20 20  e for us.) */.  
bbf0: 20 20 69 66 28 20 21 6d 68 66 6c 61 67 20 29 20    if( !mhflag ) 
bc00: 52 65 70 6f 72 74 48 65 61 64 65 72 28 26 6c 65  ReportHeader(&le
bc10: 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  m);.  }.  if( st
bc20: 61 74 69 73 74 69 63 73 20 29 7b 0a 20 20 20 20  atistics ){.    
bc30: 70 72 69 6e 74 66 28 22 50 61 72 73 65 72 20 73  printf("Parser s
bc40: 74 61 74 69 73 74 69 63 73 3a 20 25 64 20 74 65  tatistics: %d te
bc50: 72 6d 69 6e 61 6c 73 2c 20 25 64 20 6e 6f 6e 74  rminals, %d nont
bc60: 65 72 6d 69 6e 61 6c 73 2c 20 25 64 20 72 75 6c  erminals, %d rul
bc70: 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 6c 65 6d  es\n",.      lem
bc80: 2e 6e 74 65 72 6d 69 6e 61 6c 2c 20 6c 65 6d 2e  .nterminal, lem.
bc90: 6e 73 79 6d 62 6f 6c 20 2d 20 6c 65 6d 2e 6e 74  nsymbol - lem.nt
bca0: 65 72 6d 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 72 75  erminal, lem.nru
bcb0: 6c 65 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  le);.    printf(
bcc0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
bcd0: 20 20 20 20 25 64 20 73 74 61 74 65 73 2c 20 25      %d states, %
bce0: 64 20 70 61 72 73 65 72 20 74 61 62 6c 65 20 65  d parser table e
bcf0: 6e 74 72 69 65 73 2c 20 25 64 20 63 6f 6e 66 6c  ntries, %d confl
bd00: 69 63 74 73 5c 6e 22 2c 0a 20 20 20 20 20 20 6c  icts\n",.      l
bd10: 65 6d 2e 6e 73 74 61 74 65 2c 20 6c 65 6d 2e 74  em.nstate, lem.t
bd20: 61 62 6c 65 73 69 7a 65 2c 20 6c 65 6d 2e 6e 63  ablesize, lem.nc
bd30: 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 7d 0a 20 20  onflict);.  }.  
bd40: 69 66 28 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63  if( lem.nconflic
bd50: 74 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  t ){.    fprintf
bd60: 28 73 74 64 65 72 72 2c 22 25 64 20 70 61 72 73  (stderr,"%d pars
bd70: 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e  ing conflicts.\n
bd80: 22 2c 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29  ",lem.nconflict)
bd90: 3b 0a 20 20 7d 0a 20 20 65 78 69 74 28 6c 65 6d  ;.  }.  exit(lem
bda0: 2e 65 72 72 6f 72 63 6e 74 20 2b 20 6c 65 6d 2e  .errorcnt + lem.
bdb0: 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 72 65  nconflict);.  re
bdc0: 74 75 72 6e 20 28 6c 65 6d 2e 65 72 72 6f 72 63  turn (lem.errorc
bdd0: 6e 74 20 2b 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69  nt + lem.nconfli
bde0: 63 74 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ct);.}./********
bdf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
be00: 6d 20 74 68 65 20 66 69 6c 65 20 22 6d 73 6f 72  m the file "msor
be10: 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t.c" ***********
be20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be30: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20 67 65  ****/./*.** A ge
be40: 6e 65 72 69 63 20 6d 65 72 67 65 2d 73 6f 72 74  neric merge-sort
be50: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
be60: 55 53 41 47 45 3a 0a 2a 2a 20 4c 65 74 20 22 70  USAGE:.** Let "p
be70: 74 72 22 20 62 65 20 61 20 70 6f 69 6e 74 65 72  tr" be a pointer
be80: 20 74 6f 20 73 6f 6d 65 20 73 74 72 75 63 74 75   to some structu
be90: 72 65 20 77 68 69 63 68 20 69 73 20 61 74 20 74  re which is at t
bea0: 68 65 20 68 65 61 64 20 6f 66 0a 2a 2a 20 61 20  he head of.** a 
beb0: 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20  null-terminated 
bec0: 6c 69 73 74 2e 20 20 54 68 65 6e 20 74 6f 20 73  list.  Then to s
bed0: 6f 72 74 20 74 68 65 20 6c 69 73 74 20 63 61 6c  ort the list cal
bee0: 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 74 72  l:.**.**     ptr
bef0: 20 3d 20 6d 73 6f 72 74 28 70 74 72 2c 26 28 70   = msort(ptr,&(p
bf00: 74 72 2d 3e 6e 65 78 74 29 2c 63 6d 70 66 6e 63  tr->next),cmpfnc
bf10: 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  );.**.** In the 
bf20: 61 62 6f 76 65 2c 20 22 63 6d 70 66 6e 63 22 20  above, "cmpfnc" 
bf30: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
bf40: 61 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 63 68  a function which
bf50: 20 63 6f 6d 70 61 72 65 73 0a 2a 2a 20 74 77 6f   compares.** two
bf60: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
bf70: 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
bf80: 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67  returns an integ
bf90: 65 72 2c 20 61 73 20 69 6e 0a 2a 2a 20 73 74 72  er, as in.** str
bfa0: 63 6d 70 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  cmp.  The second
bfb0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
bfc0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 6f  ointer to the po
bfd0: 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20  inter to the.** 
bfe0: 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f  second element o
bff0: 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  f the linked lis
c000: 74 2e 20 20 54 68 69 73 20 61 64 64 72 65 73 73  t.  This address
c010: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   is used to comp
c020: 75 74 65 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65  ute.** the offse
c030: 74 20 74 6f 20 74 68 65 20 22 6e 65 78 74 22 20  t to the "next" 
c040: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
c050: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
c060: 20 6f 66 66 73 65 74 20 74 6f 0a 2a 2a 20 74 68   offset to.** th
c070: 65 20 22 6e 65 78 74 22 20 66 69 65 6c 64 20 6d  e "next" field m
c080: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 20  ust be constant 
c090: 66 6f 72 20 61 6c 6c 20 73 74 72 75 63 74 75 72  for all structur
c0a0: 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  es in the list..
c0b0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  **.** The functi
c0c0: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77  on returns a new
c0d0: 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20 69   pointer which i
c0e0: 73 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  s the head of th
c0f0: 65 20 6c 69 73 74 0a 2a 2a 20 61 66 74 65 72 20  e list.** after 
c100: 73 6f 72 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  sorting..**.** A
c110: 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a 20 4d 65 72  LGORITHM:.** Mer
c120: 67 65 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a 2f 2a 0a  ge-sort..*/../*.
c130: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
c140: 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ter to the next 
c150: 73 74 72 75 63 74 75 72 65 20 69 6e 20 74 68 65  structure in the
c160: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f   linked list..*/
c170: 0a 23 64 65 66 69 6e 65 20 4e 45 58 54 28 41 29  .#define NEXT(A)
c180: 20 28 2a 28 63 68 61 72 2a 2a 29 28 28 28 75 6e   (*(char**)(((un
c190: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 41 29 2b 6f  signed long)A)+o
c1a0: 66 66 73 65 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49  ffset))../*.** I
c1b0: 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 61 3a 20 20  nputs:.**   a:  
c1c0: 20 20 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e       A sorted, n
c1d0: 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c  ull-terminated l
c1e0: 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61  inked list.  (Ma
c1f0: 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20  y be null)..**  
c200: 20 62 3a 20 20 20 20 20 20 20 41 20 73 6f 72 74   b:       A sort
c210: 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61  ed, null-termina
c220: 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  ted linked list.
c230: 20 20 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e    (May be null).
c240: 0a 2a 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 41  .**   cmp:     A
c250: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
c260: 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
c270: 69 6f 6e 2e 0a 2a 2a 20 20 20 6f 66 66 73 65 74  ion..**   offset
c280: 3a 20 20 4f 66 66 73 65 74 20 69 6e 20 74 68 65  :  Offset in the
c290: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68   structure to th
c2a0: 65 20 22 6e 65 78 74 22 20 66 69 65 6c 64 2e 0a  e "next" field..
c2b0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c  **.** Return Val
c2c0: 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74  ue:.**   A point
c2d0: 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
c2e0: 66 20 61 20 73 6f 72 74 65 64 20 6c 69 73 74 20  f a sorted list 
c2f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
c300: 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20  lements.**   of 
c310: 62 6f 74 68 20 61 20 61 6e 64 20 62 2e 0a 2a 2a  both a and b..**
c320: 0a 2a 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  .** Side effects
c330: 3a 0a 2a 2a 20 20 20 54 68 65 20 22 6e 65 78 74  :.**   The "next
c340: 22 20 70 6f 69 6e 74 65 72 73 20 66 6f 72 20 65  " pointers for e
c350: 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6c  lements in the l
c360: 69 73 74 73 20 61 20 61 6e 64 20 62 20 61 72 65  ists a and b are
c370: 0a 2a 2a 20 20 20 63 68 61 6e 67 65 64 2e 0a 2a  .**   changed..*
c380: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6d  /.static char *m
c390: 65 72 67 65 28 0a 20 20 63 68 61 72 20 2a 61 2c  erge(.  char *a,
c3a0: 0a 20 20 63 68 61 72 20 2a 62 2c 0a 20 20 69 6e  .  char *b,.  in
c3b0: 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63  t (*cmp)(const c
c3c0: 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  har*,const char*
c3d0: 29 2c 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 0a  ),.  int offset.
c3e0: 29 7b 0a 20 20 63 68 61 72 20 2a 70 74 72 2c 20  ){.  char *ptr, 
c3f0: 2a 68 65 61 64 3b 0a 0a 20 20 69 66 28 20 61 3d  *head;..  if( a=
c400: 3d 30 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d  =0 ){.    head =
c410: 20 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   b;.  }else if( 
c420: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 68 65 61 64  b==0 ){.    head
c430: 20 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = a;.  }else{. 
c440: 20 20 20 69 66 28 20 28 2a 63 6d 70 29 28 61 2c     if( (*cmp)(a,
c450: 62 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 74  b)<0 ){.      pt
c460: 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 61 20 3d  r = a;.      a =
c470: 20 4e 45 58 54 28 61 29 3b 0a 20 20 20 20 7d 65   NEXT(a);.    }e
c480: 6c 73 65 7b 0a 20 20 20 20 20 20 70 74 72 20 3d  lse{.      ptr =
c490: 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 4e 45   b;.      b = NE
c4a0: 58 54 28 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  XT(b);.    }.   
c4b0: 20 68 65 61 64 20 3d 20 70 74 72 3b 0a 20 20 20   head = ptr;.   
c4c0: 20 77 68 69 6c 65 28 20 61 20 26 26 20 62 20 29   while( a && b )
c4d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 63 6d  {.      if( (*cm
c4e0: 70 29 28 61 2c 62 29 3c 30 20 29 7b 0a 20 20 20  p)(a,b)<0 ){.   
c4f0: 20 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d       NEXT(ptr) =
c500: 20 61 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20   a;.        ptr 
c510: 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d  = a;.        a =
c520: 20 4e 45 58 54 28 61 29 3b 0a 20 20 20 20 20 20   NEXT(a);.      
c530: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e  }else{.        N
c540: 45 58 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20  EXT(ptr) = b;.  
c550: 20 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20        ptr = b;. 
c560: 20 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28         b = NEXT(
c570: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
c580: 7d 0a 20 20 20 20 69 66 28 20 61 20 29 20 4e 45  }.    if( a ) NE
c590: 58 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20  XT(ptr) = a;.   
c5a0: 20 65 6c 73 65 20 20 20 20 4e 45 58 54 28 70 74   else    NEXT(pt
c5b0: 72 29 20 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65  r) = b;.  }.  re
c5c0: 74 75 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a  turn head;.}../*
c5d0: 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20  .** Inputs:.**  
c5e0: 20 6c 69 73 74 3a 20 20 20 20 20 20 50 6f 69 6e   list:      Poin
c5f0: 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d  ter to a singly-
c600: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73  linked list of s
c610: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20  tructures..**   
c620: 6e 65 78 74 3a 20 20 20 20 20 20 50 6f 69 6e 74  next:      Point
c630: 65 72 20 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f  er to pointer to
c640: 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d   the second elem
c650: 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 2e  ent of the list.
c660: 0a 2a 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 20  .**   cmp:      
c670: 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75   A comparison fu
c680: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65  nction..**.** Re
c690: 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20  turn Value:.**  
c6a0: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
c6b0: 65 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74  e head of a sort
c6c0: 65 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  ed list containi
c6d0: 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a  ng the elements.
c6e0: 2a 2a 20 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69  **   orginally i
c6f0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69  n list..**.** Si
c700: 64 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20  de effects:.**  
c710: 20 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e   The "next" poin
c720: 74 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74  ters for element
c730: 73 20 69 6e 20 6c 69 73 74 20 61 72 65 20 63 68  s in list are ch
c740: 61 6e 67 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e  anged..*/.#defin
c750: 65 20 4c 49 53 54 53 49 5a 45 20 33 30 0a 73 74  e LISTSIZE 30.st
c760: 61 74 69 63 20 63 68 61 72 20 2a 6d 73 6f 72 74  atic char *msort
c770: 28 0a 20 20 63 68 61 72 20 2a 6c 69 73 74 2c 0a  (.  char *list,.
c780: 20 20 63 68 61 72 20 2a 2a 6e 65 78 74 2c 0a 20    char **next,. 
c790: 20 69 6e 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73   int (*cmp)(cons
c7a0: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
c7b0: 61 72 2a 29 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  ar*).){.  unsign
c7c0: 65 64 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a  ed long offset;.
c7d0: 20 20 63 68 61 72 20 2a 65 70 3b 0a 20 20 63 68    char *ep;.  ch
c7e0: 61 72 20 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45  ar *set[LISTSIZE
c7f0: 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66  ];.  int i;.  of
c800: 66 73 65 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  fset = (unsigned
c810: 20 6c 6f 6e 67 29 6e 65 78 74 20 2d 20 28 75 6e   long)next - (un
c820: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 6c 69 73 74  signed long)list
c830: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c  ;.  for(i=0; i<L
c840: 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65  ISTSIZE; i++) se
c850: 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c  t[i] = 0;.  whil
c860: 65 28 20 6c 69 73 74 20 29 7b 0a 20 20 20 20 65  e( list ){.    e
c870: 70 20 3d 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69  p = list;.    li
c880: 73 74 20 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b  st = NEXT(list);
c890: 0a 20 20 20 20 4e 45 58 54 28 65 70 29 20 3d 20  .    NEXT(ep) = 
c8a0: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
c8b0: 69 3c 4c 49 53 54 53 49 5a 45 2d 31 20 26 26 20  i<LISTSIZE-1 && 
c8c0: 73 65 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b  set[i]!=0; i++){
c8d0: 0a 20 20 20 20 20 20 65 70 20 3d 20 6d 65 72 67  .      ep = merg
c8e0: 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c  e(ep,set[i],cmp,
c8f0: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  offset);.      s
c900: 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  et[i] = 0;.    }
c910: 0a 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 65 70  .    set[i] = ep
c920: 3b 0a 20 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a  ;.  }.  ep = 0;.
c930: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53    for(i=0; i<LIS
c940: 54 53 49 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20  TSIZE; i++) if( 
c950: 73 65 74 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65  set[i] ) ep = me
c960: 72 67 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d  rge(ep,set[i],cm
c970: 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 72 65 74  p,offset);.  ret
c980: 75 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  urn ep;.}./*****
c990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c9a0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
c9b0: 65 20 22 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a  e "option.c" ***
c9c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c9d0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20  *******/.static 
c9e0: 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61  char **argv;.sta
c9f0: 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74  tic struct s_opt
ca00: 69 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63  ions *op;.static
ca10: 20 46 49 4c 45 20 2a 65 72 72 73 74 72 65 61 6d   FILE *errstream
ca20: 3b 0a 0a 23 64 65 66 69 6e 65 20 49 53 4f 50 54  ;..#define ISOPT
ca30: 28 58 29 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27  (X) ((X)[0]=='-'
ca40: 7c 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73  ||(X)[0]=='+'||s
ca50: 74 72 63 68 72 28 28 58 29 2c 27 3d 27 29 21 3d  trchr((X),'=')!=
ca60: 30 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  0)../*.** Print 
ca70: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
ca80: 20 77 69 74 68 20 61 20 63 61 72 72 6f 74 20 70   with a carrot p
ca90: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6b  ointing to the k
caa0: 2d 74 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  -th character.**
cab0: 20 6f 66 20 74 68 65 20 6e 2d 74 68 20 66 69 65   of the n-th fie
cac0: 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ld..*/.static vo
cad0: 69 64 20 65 72 72 6c 69 6e 65 28 6e 2c 6b 2c 65  id errline(n,k,e
cae0: 72 72 29 0a 69 6e 74 20 6e 3b 0a 69 6e 74 20 6b  rr).int n;.int k
caf0: 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20  ;.FILE *err;.{. 
cb00: 20 69 6e 74 20 73 70 63 6e 74 2c 20 69 3b 0a 20   int spcnt, i;. 
cb10: 20 69 66 28 20 61 72 67 76 5b 30 5d 20 29 20 66   if( argv[0] ) f
cb20: 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 22 2c  printf(err,"%s",
cb30: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 70 63 6e  argv[0]);.  spcn
cb40: 74 20 3d 20 73 74 72 6c 65 6e 28 61 72 67 76 5b  t = strlen(argv[
cb50: 30 5d 29 20 2b 20 31 3b 0a 20 20 66 6f 72 28 69  0]) + 1;.  for(i
cb60: 3d 31 3b 20 69 3c 6e 20 26 26 20 61 72 67 76 5b  =1; i<n && argv[
cb70: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 70  i]; i++){.    fp
cb80: 72 69 6e 74 66 28 65 72 72 2c 22 20 25 73 22 2c  rintf(err," %s",
cb90: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 73 70  argv[i]);.    sp
cba0: 63 6e 74 20 2b 3d 20 73 74 72 6c 65 6e 28 61 72  cnt += strlen(ar
cbb0: 67 76 5b 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20 20  gv[i])+1;.  }.  
cbc0: 73 70 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f  spcnt += k;.  fo
cbd0: 72 28 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b  r(; argv[i]; i++
cbe0: 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 20  ) fprintf(err," 
cbf0: 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20  %s",argv[i]);.  
cc00: 69 66 28 20 73 70 63 6e 74 3c 32 30 20 29 7b 0a  if( spcnt<20 ){.
cc10: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
cc20: 22 5c 6e 25 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e  "\n%*s^-- here\n
cc30: 22 2c 73 70 63 6e 74 2c 22 22 29 3b 0a 20 20 7d  ",spcnt,"");.  }
cc40: 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74  else{.    fprint
cc50: 66 28 65 72 72 2c 22 5c 6e 25 2a 73 68 65 72 65  f(err,"\n%*shere
cc60: 20 2d 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c   --^\n",spcnt-7,
cc70: 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  "");.  }.}../*.*
cc80: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
cc90: 65 78 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 6e  ex of the N-th n
cca0: 6f 6e 2d 73 77 69 74 63 68 20 61 72 67 75 6d 65  on-switch argume
ccb0: 6e 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a  nt.  Return -1.*
ccc0: 2a 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66  * if N is out of
ccd0: 20 72 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   range..*/.stati
cce0: 63 20 69 6e 74 20 61 72 67 69 6e 64 65 78 28 6e  c int argindex(n
ccf0: 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 69 6e 74  ).int n;.{.  int
cd00: 20 69 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61   i;.  int dashda
cd10: 73 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72  sh = 0;.  if( ar
cd20: 67 76 21 3d 30 20 26 26 20 2a 61 72 67 76 21 3d  gv!=0 && *argv!=
cd30: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  0 ){.    for(i=1
cd40: 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b  ; argv[i]; i++){
cd50: 0a 20 20 20 20 20 20 69 66 28 20 64 61 73 68 64  .      if( dashd
cd60: 61 73 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72  ash || !ISOPT(ar
cd70: 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  gv[i]) ){.      
cd80: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 72 65 74    if( n==0 ) ret
cd90: 75 72 6e 20 69 3b 0a 20 20 20 20 20 20 20 20 6e  urn i;.        n
cda0: 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
cdb0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
cdc0: 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20  v[i],"--")==0 ) 
cdd0: 64 61 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20  dashdash = 1;.  
cde0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
cdf0: 20 2d 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63   -1;.}..static c
ce00: 68 61 72 20 65 6d 73 67 5b 5d 20 3d 20 22 43 6f  har emsg[] = "Co
ce10: 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 79 6e 74 61  mmand line synta
ce20: 78 20 65 72 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a  x error: ";../*.
ce30: 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 66 6c 61  ** Process a fla
ce40: 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61  g command line a
ce50: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
ce60: 69 63 20 69 6e 74 20 68 61 6e 64 6c 65 66 6c 61  ic int handlefla
ce70: 67 73 28 69 2c 65 72 72 29 0a 69 6e 74 20 69 3b  gs(i,err).int i;
ce80: 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20  .FILE *err;.{.  
ce90: 69 6e 74 20 76 3b 0a 20 20 69 6e 74 20 65 72 72  int v;.  int err
cea0: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  cnt = 0;.  int j
ceb0: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b  ;.  for(j=0; op[
cec0: 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a  j].label; j++){.
ced0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
cee0: 26 61 72 67 76 5b 69 5d 5b 31 5d 2c 6f 70 5b 6a  &argv[i][1],op[j
cef0: 5d 2e 6c 61 62 65 6c 2c 73 74 72 6c 65 6e 28 6f  ].label,strlen(o
cf00: 70 5b 6a 5d 2e 6c 61 62 65 6c 29 29 3d 3d 30 20  p[j].label))==0 
cf10: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 76  ) break;.  }.  v
cf20: 20 3d 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27   = argv[i][0]=='
cf30: 2d 27 20 3f 20 31 20 3a 20 30 3b 0a 20 20 69 66  -' ? 1 : 0;.  if
cf40: 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30  ( op[j].label==0
cf50: 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20   ){.    if( err 
cf60: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
cf70: 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e 65  (err,"%sundefine
cf80: 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73  d option.\n",ems
cf90: 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e  g);.      errlin
cfa0: 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20  e(i,1,err);.    
cfb0: 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a  }.    errcnt++;.
cfc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a    }else if( op[j
cfd0: 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 4c 41 47  ].type==OPT_FLAG
cfe0: 20 29 7b 0a 20 20 20 20 2a 28 28 69 6e 74 2a 29   ){.    *((int*)
cff0: 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 76 3b 0a  op[j].arg) = v;.
d000: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a    }else if( op[j
d010: 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 46 4c 41  ].type==OPT_FFLA
d020: 47 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64  G ){.    (*(void
d030: 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67  (*)())(op[j].arg
d040: 29 29 28 76 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ))(v);.  }else i
d050: 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f  f( op[j].type==O
d060: 50 54 5f 46 53 54 52 20 29 7b 0a 20 20 20 20 28  PT_FSTR ){.    (
d070: 2a 28 76 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b  *(void(*)())(op[
d080: 6a 5d 2e 61 72 67 29 29 28 26 61 72 67 76 5b 69  j].arg))(&argv[i
d090: 5d 5b 32 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ][2]);.  }else{.
d0a0: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
d0b0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
d0c0: 2c 22 25 73 6d 69 73 73 69 6e 67 20 61 72 67 75  ,"%smissing argu
d0d0: 6d 65 6e 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c  ment on switch.\
d0e0: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
d0f0: 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29  errline(i,1,err)
d100: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63  ;.    }.    errc
d110: 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nt++;.  }.  retu
d120: 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a  rn errcnt;.}../*
d130: 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 63 6f  .** Process a co
d140: 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 77 69 74 63  mmand line switc
d150: 68 20 77 68 69 63 68 20 68 61 73 20 61 6e 20 61  h which has an a
d160: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
d170: 69 63 20 69 6e 74 20 68 61 6e 64 6c 65 73 77 69  ic int handleswi
d180: 74 63 68 28 69 2c 65 72 72 29 0a 69 6e 74 20 69  tch(i,err).int i
d190: 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20  ;.FILE *err;.{. 
d1a0: 20 69 6e 74 20 6c 76 20 3d 20 30 3b 0a 20 20 64   int lv = 0;.  d
d1b0: 6f 75 62 6c 65 20 64 76 20 3d 20 30 2e 30 3b 0a  ouble dv = 0.0;.
d1c0: 20 20 63 68 61 72 20 2a 73 76 20 3d 20 30 2c 20    char *sv = 0, 
d1d0: 2a 65 6e 64 3b 0a 20 20 63 68 61 72 20 2a 63 70  *end;.  char *cp
d1e0: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74  ;.  int j;.  int
d1f0: 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 63   errcnt = 0;.  c
d200: 70 20 3d 20 73 74 72 63 68 72 28 61 72 67 76 5b  p = strchr(argv[
d210: 69 5d 2c 27 3d 27 29 3b 0a 20 20 61 73 73 65 72  i],'=');.  asser
d220: 74 28 20 63 70 21 3d 30 20 29 3b 0a 20 20 2a 63  t( cp!=0 );.  *c
d230: 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a 3d 30  p = 0;.  for(j=0
d240: 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a  ; op[j].label; j
d250: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
d260: 63 6d 70 28 61 72 67 76 5b 69 5d 2c 6f 70 5b 6a  cmp(argv[i],op[j
d270: 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20 29 20 62 72  ].label)==0 ) br
d280: 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70 20 3d  eak;.  }.  *cp =
d290: 20 27 3d 27 3b 0a 20 20 69 66 28 20 6f 70 5b 6a   '=';.  if( op[j
d2a0: 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20  ].label==0 ){.  
d2b0: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
d2c0: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
d2d0: 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70 74 69  %sundefined opti
d2e0: 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20  on.\n",emsg);.  
d2f0: 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c      errline(i,0,
d300: 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  err);.    }.    
d310: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73  errcnt++;.  }els
d320: 65 7b 0a 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20  e{.    cp++;.   
d330: 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74   switch( op[j].t
d340: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
d350: 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20  e OPT_FLAG:.    
d360: 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47    case OPT_FFLAG
d370: 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 72  :.        if( er
d380: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  r ){.          f
d390: 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 6f 70  printf(err,"%sop
d3a0: 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
d3b0: 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d   argument.\n",em
d3c0: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65  sg);.          e
d3d0: 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29 3b  rrline(i,0,err);
d3e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d3f0: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
d400: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d410: 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a    case OPT_DBL:.
d420: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
d430: 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 64 76 20  DBL:.        dv 
d440: 3d 20 73 74 72 74 6f 64 28 63 70 2c 26 65 6e 64  = strtod(cp,&end
d450: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  );.        if( *
d460: 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  end ){.         
d470: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
d480: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
d490: 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63  err,"%sillegal c
d4a0: 68 61 72 61 63 74 65 72 20 69 6e 20 66 6c 6f 61  haracter in floa
d4b0: 74 69 6e 67 2d 70 6f 69 6e 74 20 61 72 67 75 6d  ting-point argum
d4c0: 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20  ent.\n",emsg);. 
d4d0: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6c 69             errli
d4e0: 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e 65 64 20  ne(i,((unsigned 
d4f0: 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69 67  long)end)-(unsig
d500: 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69 5d  ned long)argv[i]
d510: 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ,err);.         
d520: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72 72   }.          err
d530: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
d540: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
d550: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49        case OPT_I
d560: 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  NT:.      case O
d570: 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20  PT_FINT:.       
d580: 20 6c 76 20 3d 20 73 74 72 74 6f 6c 28 63 70 2c   lv = strtol(cp,
d590: 26 65 6e 64 2c 30 29 3b 0a 20 20 20 20 20 20 20  &end,0);.       
d5a0: 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20   if( *end ){.   
d5b0: 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29         if( err )
d5c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  {.            fp
d5d0: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 69 6c 6c  rintf(err,"%sill
d5e0: 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20 69  egal character i
d5f0: 6e 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65  n integer argume
d600: 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20  nt.\n",emsg);.  
d610: 20 20 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e            errlin
d620: 65 28 69 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c  e(i,((unsigned l
d630: 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e  ong)end)-(unsign
d640: 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c  ed long)argv[i],
d650: 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  err);.          
d660: 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 63  }.          errc
d670: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nt++;.        }.
d680: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d690: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54       case OPT_ST
d6a0: 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  R:.      case OP
d6b0: 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20  T_FSTR:.        
d6c0: 73 76 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 20  sv = cp;.       
d6d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
d6e0: 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e    switch( op[j].
d6f0: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
d700: 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20  se OPT_FLAG:.   
d710: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41     case OPT_FFLA
d720: 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  G:.        break
d730: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
d740: 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a 28  _DBL:.        *(
d750: 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61  double*)(op[j].a
d760: 72 67 29 20 3d 20 64 76 3b 0a 20 20 20 20 20 20  rg) = dv;.      
d770: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
d780: 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20  ase OPT_FDBL:.  
d790: 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29        (*(void(*)
d7a0: 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28  ())(op[j].arg))(
d7b0: 64 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  dv);.        bre
d7c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
d7d0: 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 20 20  PT_INT:.        
d7e0: 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e 61 72  *(int*)(op[j].ar
d7f0: 67 29 20 3d 20 6c 76 3b 0a 20 20 20 20 20 20 20  g) = lv;.       
d800: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
d810: 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20  se OPT_FINT:.   
d820: 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28       (*(void(*)(
d830: 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 28  ))(op[j].arg))((
d840: 69 6e 74 29 6c 76 29 3b 0a 20 20 20 20 20 20 20  int)lv);.       
d850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
d860: 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20  se OPT_STR:.    
d870: 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 28 6f 70      *(char**)(op
d880: 5b 6a 5d 2e 61 72 67 29 20 3d 20 73 76 3b 0a 20  [j].arg) = sv;. 
d890: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d8a0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54      case OPT_FST
d8b0: 52 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f  R:.        (*(vo
d8c0: 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61  id(*)())(op[j].a
d8d0: 72 67 29 29 28 73 76 29 3b 0a 20 20 20 20 20 20  rg))(sv);.      
d8e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d8f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63   }.  return errc
d900: 6e 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e  nt;.}..int OptIn
d910: 69 74 28 61 2c 6f 2c 65 72 72 29 0a 63 68 61 72  it(a,o,err).char
d920: 20 2a 2a 61 3b 0a 73 74 72 75 63 74 20 73 5f 6f   **a;.struct s_o
d930: 70 74 69 6f 6e 73 20 2a 6f 3b 0a 46 49 4c 45 20  ptions *o;.FILE 
d940: 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 65 72  *err;.{.  int er
d950: 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61 72 67 76  rcnt = 0;.  argv
d960: 20 3d 20 61 3b 0a 20 20 6f 70 20 3d 20 6f 3b 0a   = a;.  op = o;.
d970: 20 20 65 72 72 73 74 72 65 61 6d 20 3d 20 65 72    errstream = er
d980: 72 3b 0a 20 20 69 66 28 20 61 72 67 76 20 26 26  r;.  if( argv &&
d990: 20 2a 61 72 67 76 20 26 26 20 6f 70 20 29 7b 0a   *argv && op ){.
d9a0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
d9b0: 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b  or(i=1; argv[i];
d9c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
d9d0: 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b 27   argv[i][0]=='+'
d9e0: 20 7c 7c 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d   || argv[i][0]==
d9f0: 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 65  '-' ){.        e
da00: 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 66  rrcnt += handlef
da10: 6c 61 67 73 28 69 2c 65 72 72 29 3b 0a 20 20 20  lags(i,err);.   
da20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
da30: 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29  chr(argv[i],'=')
da40: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 63   ){.        errc
da50: 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77 69 74  nt += handleswit
da60: 63 68 28 69 2c 65 72 72 29 3b 0a 20 20 20 20 20  ch(i,err);.     
da70: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
da80: 66 28 20 65 72 72 63 6e 74 3e 30 20 29 7b 0a 20  f( errcnt>0 ){. 
da90: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
daa0: 56 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20 6c 69  Valid command li
dab0: 6e 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 5c  ne options for \
dac0: 22 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a 61  "%s\" are:\n",*a
dad0: 29 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e 74 28  );.    OptPrint(
dae0: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
daf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
db00: 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67 73 28  }..int OptNArgs(
db10: 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  ){.  int cnt = 0
db20: 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68  ;.  int dashdash
db30: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
db40: 20 69 66 28 20 61 72 67 76 21 3d 30 20 26 26 20   if( argv!=0 && 
db50: 61 72 67 76 5b 30 5d 21 3d 30 20 29 7b 0a 20 20  argv[0]!=0 ){.  
db60: 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b    for(i=1; argv[
db70: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
db80: 69 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20  if( dashdash || 
db90: 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20  !ISOPT(argv[i]) 
dba0: 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69  ) cnt++;.      i
dbb0: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69  f( strcmp(argv[i
dbc0: 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73  ],"--")==0 ) das
dbd0: 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d  hdash = 1;.    }
dbe0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6e  .  }.  return cn
dbf0: 74 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f 70 74 41  t;.}..char *OptA
dc00: 72 67 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20  rg(n).int n;.{. 
dc10: 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61 72   int i;.  i = ar
dc20: 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72 65 74  gindex(n);.  ret
dc30: 75 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67 76 5b  urn i>=0 ? argv[
dc40: 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20  i] : 0;.}..void 
dc50: 4f 70 74 45 72 72 28 6e 29 0a 69 6e 74 20 6e 3b  OptErr(n).int n;
dc60: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20  .{.  int i;.  i 
dc70: 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20  = argindex(n);. 
dc80: 20 69 66 28 20 69 3e 3d 30 20 29 20 65 72 72 6c   if( i>=0 ) errl
dc90: 69 6e 65 28 69 2c 30 2c 65 72 72 73 74 72 65 61  ine(i,0,errstrea
dca0: 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 50  m);.}..void OptP
dcb0: 72 69 6e 74 28 29 7b 0a 20 20 69 6e 74 20 69 3b  rint(){.  int i;
dcc0: 0a 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b  .  int max, len;
dcd0: 0a 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20 66 6f  .  max = 0;.  fo
dce0: 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62  r(i=0; op[i].lab
dcf0: 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65  el; i++){.    le
dd00: 6e 20 3d 20 73 74 72 6c 65 6e 28 6f 70 5b 69 5d  n = strlen(op[i]
dd10: 2e 6c 61 62 65 6c 29 20 2b 20 31 3b 0a 20 20 20  .label) + 1;.   
dd20: 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74   switch( op[i].t
dd30: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
dd40: 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20  e OPT_FLAG:.    
dd50: 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47    case OPT_FFLAG
dd60: 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  :.        break;
dd70: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
dd80: 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20  INT:.      case 
dd90: 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20  OPT_FINT:.      
dda0: 20 20 6c 65 6e 20 2b 3d 20 39 3b 20 20 20 20 20    len += 9;     
ddb0: 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22    /* length of "
ddc0: 3c 69 6e 74 65 67 65 72 3e 22 20 2a 2f 0a 20 20  <integer>" */.  
ddd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dde0: 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a     case OPT_DBL:
ddf0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
de00: 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 6c 65  FDBL:.        le
de10: 6e 20 2b 3d 20 36 3b 20 20 20 20 20 20 20 2f 2a  n += 6;       /*
de20: 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 72 65 61   length of "<rea
de30: 6c 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  l>" */.        b
de40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
de50: 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20   OPT_STR:.      
de60: 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20  case OPT_FSTR:. 
de70: 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 38 3b         len += 8;
de80: 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68         /* length
de90: 20 6f 66 20 22 3c 73 74 72 69 6e 67 3e 22 20 2a   of "<string>" *
dea0: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
deb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c  .    }.    if( l
dec0: 65 6e 3e 6d 61 78 20 29 20 6d 61 78 20 3d 20 6c  en>max ) max = l
ded0: 65 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  en;.  }.  for(i=
dee0: 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20  0; op[i].label; 
def0: 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74 63 68  i++){.    switch
df00: 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a  ( op[i].type ){.
df10: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
df20: 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20  LAG:.      case 
df30: 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20  OPT_FFLAG:.     
df40: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74     fprintf(errst
df50: 72 65 61 6d 2c 22 20 20 2d 25 2d 2a 73 20 20 25  ream,"  -%-*s  %
df60: 73 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e 6c  s\n",max,op[i].l
df70: 61 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61  abel,op[i].messa
df80: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ge);.        bre
df90: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
dfa0: 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61  PT_INT:.      ca
dfb0: 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20  se OPT_FINT:.   
dfc0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
dfd0: 73 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 69 6e  stream,"  %s=<in
dfe0: 74 65 67 65 72 3e 25 2a 73 20 20 25 73 5c 6e 22  teger>%*s  %s\n"
dff0: 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20  ,op[i].label,.  
e000: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61          (int)(ma
e010: 78 2d 73 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c  x-strlen(op[i].l
e020: 61 62 65 6c 29 2d 39 29 2c 22 22 2c 6f 70 5b 69  abel)-9),"",op[i
e030: 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20  ].message);.    
e040: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e050: 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20   case OPT_DBL:. 
e060: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44       case OPT_FD
e070: 42 4c 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69  BL:.        fpri
e080: 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20  ntf(errstream," 
e090: 20 25 73 3d 3c 72 65 61 6c 3e 25 2a 73 20 20 25   %s=<real>%*s  %
e0a0: 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c  s\n",op[i].label
e0b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e 74  ,.          (int
e0c0: 29 28 6d 61 78 2d 73 74 72 6c 65 6e 28 6f 70 5b  )(max-strlen(op[
e0d0: 69 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c 22 22 2c  i].label)-6),"",
e0e0: 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a  op[i].message);.
e0f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e100: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54       case OPT_ST
e110: 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  R:.      case OP
e120: 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20  T_FSTR:.        
e130: 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61  fprintf(errstrea
e140: 6d 2c 22 20 20 25 73 3d 3c 73 74 72 69 6e 67 3e  m,"  %s=<string>
e150: 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d  %*s  %s\n",op[i]
e160: 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20  .label,.        
e170: 20 20 28 69 6e 74 29 28 6d 61 78 2d 73 74 72 6c    (int)(max-strl
e180: 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d  en(op[i].label)-
e190: 38 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73  8),"",op[i].mess
e1a0: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  age);.        br
e1b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
e1c0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
e1d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
e1e0: 68 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e 63  he file "parse.c
e1f0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
e200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
e210: 2f 2a 0a 2a 2a 20 49 6e 70 75 74 20 66 69 6c 65  /*.** Input file
e220: 20 70 61 72 73 65 72 20 66 6f 72 20 74 68 65 20   parser for the 
e230: 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
e240: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54  erator..*/../* T
e250: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
e260: 70 61 72 73 65 72 20 2a 2f 0a 73 74 72 75 63 74  parser */.struct
e270: 20 70 73 74 61 74 65 20 7b 0a 20 20 63 68 61 72   pstate {.  char
e280: 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20   *filename;     
e290: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
e2a0: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
e2b0: 20 69 6e 74 20 74 6f 6b 65 6e 6c 69 6e 65 6e 6f   int tokenlineno
e2c0: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75  ;      /* Linenu
e2d0: 6d 62 65 72 20 61 74 20 77 68 69 63 68 20 63 75  mber at which cu
e2e0: 72 72 65 6e 74 20 74 6f 6b 65 6e 20 73 74 61 72  rrent token star
e2f0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f  ts */.  int erro
e300: 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  rcnt;         /*
e310: 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
e320: 73 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68  s so far */.  ch
e330: 61 72 20 2a 74 6f 6b 65 6e 73 74 61 72 74 3b 20  ar *tokenstart; 
e340: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 63      /* Text of c
e350: 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a  urrent token */.
e360: 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a    struct lemon *
e370: 67 70 3b 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61  gp;     /* Globa
e380: 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 2a  l state vector *
e390: 2f 0a 20 20 65 6e 75 6d 20 65 5f 73 74 61 74 65  /.  enum e_state
e3a0: 20 7b 0a 20 20 20 20 49 4e 49 54 49 41 4c 49 5a   {.    INITIALIZ
e3b0: 45 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46  E,.    WAITING_F
e3c0: 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c  OR_DECL_OR_RULE,
e3d0: 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  .    WAITING_FOR
e3e0: 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a 20  _DECL_KEYWORD,. 
e3f0: 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44     WAITING_FOR_D
e400: 45 43 4c 5f 41 52 47 2c 0a 20 20 20 20 57 41 49  ECL_ARG,.    WAI
e410: 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45  TING_FOR_PRECEDE
e420: 4e 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20 20  NCE_SYMBOL,.    
e430: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f  WAITING_FOR_ARRO
e440: 57 2c 0a 20 20 20 20 49 4e 5f 52 48 53 2c 0a 20  W,.    IN_RHS,. 
e450: 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 31 2c 0a     LHS_ALIAS_1,.
e460: 20 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 32 2c      LHS_ALIAS_2,
e470: 0a 20 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 33  .    LHS_ALIAS_3
e480: 2c 0a 20 20 20 20 52 48 53 5f 41 4c 49 41 53 5f  ,.    RHS_ALIAS_
e490: 31 2c 0a 20 20 20 20 52 48 53 5f 41 4c 49 41 53  1,.    RHS_ALIAS
e4a0: 5f 32 2c 0a 20 20 20 20 50 52 45 43 45 44 45 4e  _2,.    PRECEDEN
e4b0: 43 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20 20 20 50  CE_MARK_1,.    P
e4c0: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32  RECEDENCE_MARK_2
e4d0: 2c 0a 20 20 20 20 52 45 53 59 4e 43 5f 41 46 54  ,.    RESYNC_AFT
e4e0: 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 2c 0a 20  ER_RULE_ERROR,. 
e4f0: 20 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f     RESYNC_AFTER_
e500: 44 45 43 4c 5f 45 52 52 4f 52 2c 0a 20 20 20 20  DECL_ERROR,.    
e510: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54  WAITING_FOR_DEST
e520: 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a 20  RUCTOR_SYMBOL,. 
e530: 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44     WAITING_FOR_D
e540: 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 2c 0a  ATATYPE_SYMBOL,.
e550: 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f      WAITING_FOR_
e560: 46 41 4c 4c 42 41 43 4b 5f 49 44 2c 0a 20 20 20  FALLBACK_ID,.   
e570: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c   WAITING_FOR_WIL
e580: 44 43 41 52 44 5f 49 44 0a 20 20 7d 20 73 74 61  DCARD_ID.  } sta
e590: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
e5a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61        /* The sta
e5b0: 74 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  te of the parser
e5c0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
e5d0: 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 20  bol *fallback;  
e5e0: 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62 61 63 6b   /* The fallback
e5f0: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75   token */.  stru
e600: 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20  ct symbol *lhs; 
e610: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68         /* Left-h
e620: 61 6e 64 20 73 69 64 65 20 6f 66 20 63 75 72 72  and side of curr
e630: 65 6e 74 20 72 75 6c 65 20 2a 2f 0a 20 20 63 68  ent rule */.  ch
e640: 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20  ar *lhsalias;   
e650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61           /* Alia
e660: 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20 2a 2f  s for the LHS */
e670: 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20 20 20 20  .  int nrhs;    
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e690: 20 4e 75 6d 62 65 72 20 6f 66 20 72 69 67 68 74   Number of right
e6a0: 2d 68 61 6e 64 20 73 69 64 65 20 73 79 6d 62 6f  -hand side symbo
e6b0: 6c 73 20 73 65 65 6e 20 2a 2f 0a 20 20 73 74 72  ls seen */.  str
e6c0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 72 68 73 5b  uct symbol *rhs[
e6d0: 4d 41 58 52 48 53 5d 3b 20 20 2f 2a 20 52 48 53  MAXRHS];  /* RHS
e6e0: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68   symbols */.  ch
e6f0: 61 72 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53  ar *alias[MAXRHS
e700: 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61  ];       /* Alia
e710: 73 65 73 20 66 6f 72 20 65 61 63 68 20 52 48 53  ses for each RHS
e720: 20 73 79 6d 62 6f 6c 20 28 6f 72 20 4e 55 4c 4c   symbol (or NULL
e730: 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  ) */.  struct ru
e740: 6c 65 20 2a 70 72 65 76 72 75 6c 65 3b 20 20 20  le *prevrule;   
e750: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 75    /* Previous ru
e760: 6c 65 20 70 61 72 73 65 64 20 2a 2f 0a 20 20 63  le parsed */.  c
e770: 68 61 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64  har *declkeyword
e780: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79  ;         /* Key
e790: 77 6f 72 64 20 6f 66 20 61 20 64 65 63 6c 61 72  word of a declar
e7a0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20  ation */.  char 
e7b0: 2a 2a 64 65 63 6c 61 72 67 73 6c 6f 74 3b 20 20  **declargslot;  
e7c0: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
e7d0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 61  he declaration a
e7e0: 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62  rgument should b
e7f0: 65 20 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69  e put */.  int i
e800: 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 3b 20  nsertLineMacro; 
e810: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 23 6c 69        /* Add #li
e820: 6e 65 20 62 65 66 6f 72 65 20 64 65 63 6c 61 72  ne before declar
e830: 61 74 69 6f 6e 20 69 6e 73 65 72 74 20 2a 2f 0a  ation insert */.
e840: 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 64    enum e_assoc d
e850: 65 63 6c 61 73 73 6f 63 3b 20 20 20 20 2f 2a 20  eclassoc;    /* 
e860: 41 73 73 69 67 6e 20 74 68 69 73 20 61 73 73 6f  Assign this asso
e870: 63 69 61 74 69 6f 6e 20 74 6f 20 64 65 63 6c 20  ciation to decl 
e880: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69  arguments */.  i
e890: 6e 74 20 70 72 65 63 63 6f 75 6e 74 65 72 3b 20  nt preccounter; 
e8a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
e8b0: 69 67 6e 20 74 68 69 73 20 70 72 65 63 65 64 65  ign this precede
e8c0: 6e 63 65 20 74 6f 20 64 65 63 6c 20 61 72 67 75  nce to decl argu
e8d0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75 63  ments */.  struc
e8e0: 74 20 72 75 6c 65 20 2a 66 69 72 73 74 72 75 6c  t rule *firstrul
e8f0: 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  e;    /* Pointer
e900: 20 74 6f 20 66 69 72 73 74 20 72 75 6c 65 20 69   to first rule i
e910: 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f  n the grammar */
e920: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
e930: 6c 61 73 74 72 75 6c 65 3b 20 20 20 20 20 2f 2a  lastrule;     /*
e940: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
e950: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
e960: 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a  rsed rule */.};.
e970: 0a 2f 2a 20 50 61 72 73 65 20 61 20 73 69 6e 67  ./* Parse a sing
e980: 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74  le token */.stat
e990: 69 63 20 76 6f 69 64 20 70 61 72 73 65 6f 6e 65  ic void parseone
e9a0: 74 6f 6b 65 6e 28 70 73 70 29 0a 73 74 72 75 63  token(psp).struc
e9b0: 74 20 70 73 74 61 74 65 20 2a 70 73 70 3b 0a 7b  t pstate *psp;.{
e9c0: 0a 20 20 63 68 61 72 20 2a 78 3b 0a 20 20 78 20  .  char *x;.  x 
e9d0: 3d 20 53 74 72 73 61 66 65 28 70 73 70 2d 3e 74  = Strsafe(psp->t
e9e0: 6f 6b 65 6e 73 74 61 72 74 29 3b 20 20 20 20 20  okenstart);     
e9f0: 2f 2a 20 53 61 76 65 20 74 68 65 20 74 6f 6b 65  /* Save the toke
ea00: 6e 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20 2a 2f  n permanently */
ea10: 0a 23 69 66 20 30 0a 20 20 70 72 69 6e 74 66 28  .#if 0.  printf(
ea20: 22 25 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b 25  "%s:%d: Token=[%
ea30: 73 5d 20 73 74 61 74 65 3d 25 64 5c 6e 22 2c 70  s] state=%d\n",p
ea40: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
ea50: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
ea60: 20 20 20 78 2c 70 73 70 2d 3e 73 74 61 74 65 29     x,psp->state)
ea70: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63  ;.#endif.  switc
ea80: 68 28 20 70 73 70 2d 3e 73 74 61 74 65 20 29 7b  h( psp->state ){
ea90: 0a 20 20 20 20 63 61 73 65 20 49 4e 49 54 49 41  .    case INITIA
eaa0: 4c 49 5a 45 3a 0a 20 20 20 20 20 20 70 73 70 2d  LIZE:.      psp-
eab0: 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20  >prevrule = 0;. 
eac0: 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f       psp->precco
ead0: 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  unter = 0;.     
eae0: 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20   psp->firstrule 
eaf0: 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20  = psp->lastrule 
eb00: 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e  = 0;.      psp->
eb10: 67 70 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a 20  gp->nrule = 0;. 
eb20: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
eb30: 75 20 74 6f 20 6e 65 78 74 20 63 61 73 65 20 2a  u to next case *
eb40: 2f 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  /.    case WAITI
eb50: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
eb60: 55 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 78  ULE:.      if( x
eb70: 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20  [0]=='%' ){.    
eb80: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
eb90: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
eba0: 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20  L_KEYWORD;.     
ebb0: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 6c 6f 77   }else if( islow
ebc0: 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  er(x[0]) ){.    
ebd0: 20 20 20 20 70 73 70 2d 3e 6c 68 73 20 3d 20 53      psp->lhs = S
ebe0: 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
ebf0: 20 20 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 20        psp->nrhs 
ec00: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 0;.        psp
ec10: 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 30 3b 0a  ->lhsalias = 0;.
ec20: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
ec30: 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
ec40: 5f 41 52 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65  _ARROW;.      }e
ec50: 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b  lse if( x[0]=='{
ec60: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
ec70: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d   psp->prevrule==
ec80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
ec90: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
eca0: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
ecb0: 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65 72 65 20 69  lineno,."There i
ecc0: 73 20 6e 6f 74 20 70 72 69 6f 72 20 72 75 6c 65  s not prior rule
ecd0: 20 6f 70 6f 6e 20 77 68 69 63 68 20 74 6f 20 61   opon which to a
ece0: 74 74 61 63 68 20 74 68 65 20 63 6f 64 65 20 5c  ttach the code \
ecf0: 0a 66 72 61 67 6d 65 6e 74 20 77 68 69 63 68 20  .fragment which 
ed00: 62 65 67 69 6e 73 20 6f 6e 20 74 68 69 73 20 6c  begins on this l
ed10: 69 6e 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ine.");.        
ed20: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
ed30: 2b 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 70 73  +;..}else if( ps
ed40: 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64  p->prevrule->cod
ed50: 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
ed60: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
ed70: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
ed80: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 6f 64 65  kenlineno,."Code
ed90: 20 66 72 61 67 6d 65 6e 74 20 62 65 67 69 6e 6e   fragment beginn
eda0: 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65  ing on this line
edb0: 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73   is not the firs
edc0: 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68  t \.to follow th
edd0: 65 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e  e previous rule.
ede0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ");.          ps
edf0: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
ee00: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ee10: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
ee20: 76 72 75 6c 65 2d 3e 6c 69 6e 65 20 3d 20 70 73  vrule->line = ps
ee30: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a  p->tokenlineno;.
ee40: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
ee50: 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65 20 3d 20  revrule->code = 
ee60: 26 78 5b 31 5d 3b 0a 09 7d 0a 20 20 20 20 20 20  &x[1];..}.      
ee70: 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d  }else if( x[0]==
ee80: 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '[' ){.        p
ee90: 73 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43  sp->state = PREC
eea0: 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20  EDENCE_MARK_1;. 
eeb0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
eec0: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
eed0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
eee0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
eef0: 20 20 20 20 20 20 20 22 54 6f 6b 65 6e 20 5c 22         "Token \"
ef00: 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 65  %s\" should be e
ef10: 69 74 68 65 72 20 5c 22 25 25 5c 22 20 6f 72 20  ither \"%%\" or 
ef20: 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6e 61  a nonterminal na
ef30: 6d 65 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  me.",.          
ef40: 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
ef50: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
ef60: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
ef70: 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45 43 45  ;.    case PRECE
ef80: 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20  DENCE_MARK_1:.  
ef90: 20 20 20 20 69 66 28 20 21 69 73 75 70 70 65 72      if( !isupper
efa0: 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
efb0: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
efc0: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
efd0: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
efe0: 20 20 20 20 20 22 54 68 65 20 70 72 65 63 65 64       "The preced
eff0: 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6d 75 73 74  ence symbol must
f000: 20 62 65 20 61 20 74 65 72 6d 69 6e 61 6c 2e 22   be a terminal."
f010: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
f020: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
f030: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d    }else if( psp-
f040: 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a  >prevrule==0 ){.
f050: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
f060: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
f070: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
f080: 0a 20 20 20 20 20 20 20 20 20 20 22 54 68 65 72  .          "Ther
f090: 65 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75  e is no prior ru
f0a0: 6c 65 20 74 6f 20 61 73 73 69 67 6e 20 70 72 65  le to assign pre
f0b0: 63 65 64 65 6e 63 65 20 5c 22 5b 25 73 5d 5c 22  cedence \"[%s]\"
f0c0: 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  .",x);.        p
f0d0: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
f0e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f0f0: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70  psp->prevrule->p
f100: 72 65 63 73 79 6d 21 3d 30 20 29 7b 0a 20 20 20  recsym!=0 ){.   
f110: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
f120: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
f130: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50  >tokenlineno,."P
f140: 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 20 6f  recedence mark o
f150: 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e  n this line is n
f160: 6f 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74  ot the first \.t
f170: 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65  o follow the pre
f180: 76 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20  vious rule.");. 
f190: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
f1a0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  rcnt++;.      }e
f1b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70  lse{.        psp
f1c0: 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63  ->prevrule->prec
f1d0: 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  sym = Symbol_new
f1e0: 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (x);.      }.   
f1f0: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f200: 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f  PRECEDENCE_MARK_
f210: 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  2;.      break;.
f220: 20 20 20 20 63 61 73 65 20 50 52 45 43 45 44 45      case PRECEDE
f230: 4e 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20 20 20 20  NCE_MARK_2:.    
f240: 20 20 69 66 28 20 78 5b 30 5d 21 3d 27 5d 27 20    if( x[0]!=']' 
f250: 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
f260: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
f270: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
f280: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d  no,.          "M
f290: 69 73 73 69 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20  issing \"]\" on 
f2a0: 70 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 2e  precedence mark.
f2b0: 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ");.        psp-
f2c0: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
f2d0: 20 20 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e     }.      psp->
f2e0: 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
f2f0: 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
f300: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f310: 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
f320: 46 4f 52 5f 41 52 52 4f 57 3a 0a 20 20 20 20 20  FOR_ARROW:.     
f330: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26   if( x[0]==':' &
f340: 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78  & x[1]==':' && x
f350: 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20  [2]=='=' ){.    
f360: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
f370: 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d   IN_RHS;.      }
f380: 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27  else if( x[0]=='
f390: 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  (' ){.        ps
f3a0: 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41  p->state = LHS_A
f3b0: 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65  LIAS_1;.      }e
f3c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
f3d0: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
f3e0: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
f3f0: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
f400: 22 45 78 70 65 63 74 65 64 20 74 6f 20 73 65 65  "Expected to see
f410: 20 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69   a \":\" followi
f420: 6e 67 20 74 68 65 20 4c 48 53 20 73 79 6d 62 6f  ng the LHS symbo
f430: 6c 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20  l \"%s\".",.    
f440: 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e        psp->lhs->
f450: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  name);.        p
f460: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
f470: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
f480: 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
f490: 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20  R_RULE_ERROR;.  
f4a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
f4b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f  k;.    case LHS_
f4c0: 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69  ALIAS_1:.      i
f4d0: 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  f( isalpha(x[0])
f4e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
f4f0: 3e 6c 68 73 61 6c 69 61 73 20 3d 20 78 3b 0a 20  >lhsalias = x;. 
f500: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
f510: 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3b  e = LHS_ALIAS_2;
f520: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f530: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
f540: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
f550: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
f560: 20 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22           "\"%s\"
f570: 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
f580: 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48  alias for the LH
f590: 53 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20  S \"%s\"\n",.   
f5a0: 20 20 20 20 20 20 20 78 2c 70 73 70 2d 3e 6c 68         x,psp->lh
f5b0: 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  s->name);.      
f5c0: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
f5d0: 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
f5e0: 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
f5f0: 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
f600: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
f610: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c  reak;.    case L
f620: 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20  HS_ALIAS_2:.    
f630: 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20    if( x[0]==')' 
f640: 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
f650: 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41  state = LHS_ALIA
f660: 53 5f 33 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  S_3;.      }else
f670: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
f680: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
f690: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
f6a0: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69  o,.          "Mi
f6b0: 73 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c  ssing \")\" foll
f6c0: 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20  owing LHS alias 
f6d0: 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73  name \"%s\".",ps
f6e0: 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20  p->lhsalias);.  
f6f0: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
f700: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
f710: 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
f720: 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
f730: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
f740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
f750: 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3a 0a  se LHS_ALIAS_3:.
f760: 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
f770: 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27  ':' && x[1]==':'
f780: 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b   && x[2]=='=' ){
f790: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
f7a0: 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20  ate = IN_RHS;.  
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 4d 69 73 73 69 6e 67 20 5c        "Missing \
f800: 22 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a  "->\" following:
f810: 20 5c 22 25 73 28 25 73 29 5c 22 2e 22 2c 0a 20   \"%s(%s)\".",. 
f820: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c            psp->l
f830: 68 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68  hs->name,psp->lh
f840: 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20  salias);.       
f850: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
f860: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
f870: 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
f880: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
f890: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
f8a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 49 4e  eak;.    case IN
f8b0: 5f 52 48 53 3a 0a 20 20 20 20 20 20 69 66 28 20  _RHS:.      if( 
f8c0: 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  x[0]=='.' ){.   
f8d0: 20 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65       struct rule
f8e0: 20 2a 72 70 3b 0a 20 20 20 20 20 20 20 20 72 70   *rp;.        rp
f8f0: 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65 20   = (struct rule 
f900: 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)calloc( sizeof
f910: 28 73 74 72 75 63 74 20 72 75 6c 65 29 20 2b 20  (struct rule) + 
f920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69  .             si
f930: 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
f940: 6f 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 2b  ol*)*psp->nrhs +
f950: 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70   sizeof(char*)*p
f960: 73 70 2d 3e 6e 72 68 73 2c 20 31 29 3b 0a 20 20  sp->nrhs, 1);.  
f970: 20 20 20 20 20 20 69 66 28 20 72 70 3d 3d 30 20        if( rp==0 
f980: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
f990: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
f9a0: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
f9b0: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
f9c0: 20 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74    "Can't allocat
f9d0: 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20  e enough memory 
f9e0: 66 6f 72 20 74 68 69 73 20 72 75 6c 65 2e 22 29  for this rule.")
f9f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
fa00: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
fa10: 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76         psp->prev
fa20: 72 75 6c 65 20 3d 20 30 3b 0a 09 7d 65 6c 73 65  rule = 0;..}else
fa30: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
fa40: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  i;.          rp-
fa50: 3e 72 75 6c 65 6c 69 6e 65 20 3d 20 70 73 70 2d  >ruleline = psp-
fa60: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20  >tokenlineno;.  
fa70: 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 20          rp->rhs 
fa80: 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  = (struct symbol
fa90: 2a 2a 29 26 72 70 5b 31 5d 3b 0a 20 20 20 20 20  **)&rp[1];.     
faa0: 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61       rp->rhsalia
fab0: 73 20 3d 20 28 63 68 61 72 2a 2a 29 26 28 72 70  s = (char**)&(rp
fac0: 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d  ->rhs[psp->nrhs]
fad0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
fae0: 28 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e 72 68  (i=0; i<psp->nrh
faf0: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  s; i++){.       
fb00: 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 20       rp->rhs[i] 
fb10: 3d 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20  = psp->rhs[i];. 
fb20: 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72             rp->r
fb30: 68 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70 73 70  hsalias[i] = psp
fb40: 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a 09 20 20 7d  ->alias[i];..  }
fb50: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c  .          rp->l
fb60: 68 73 20 3d 20 70 73 70 2d 3e 6c 68 73 3b 0a 20  hs = psp->lhs;. 
fb70: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73           rp->lhs
fb80: 61 6c 69 61 73 20 3d 20 70 73 70 2d 3e 6c 68 73  alias = psp->lhs
fb90: 61 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  alias;.         
fba0: 20 72 70 2d 3e 6e 72 68 73 20 3d 20 70 73 70 2d   rp->nrhs = psp-
fbb0: 3e 6e 72 68 73 3b 0a 20 20 20 20 20 20 20 20 20  >nrhs;.         
fbc0: 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20   rp->code = 0;. 
fbd0: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65           rp->pre
fbe0: 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  csym = 0;.      
fbf0: 20 20 20 20 72 70 2d 3e 69 6e 64 65 78 20 3d 20      rp->index = 
fc00: 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 2b 2b  psp->gp->nrule++
fc10: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
fc20: 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e 6c 68  nextlhs = rp->lh
fc30: 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20 20 20  s->rule;.       
fc40: 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65     rp->lhs->rule
fc50: 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20   = rp;.         
fc60: 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20   rp->next = 0;. 
fc70: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70           if( psp
fc80: 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30 20 29  ->firstrule==0 )
fc90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73  {.            ps
fca0: 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70  p->firstrule = p
fcb0: 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72  sp->lastrule = r
fcc0: 70 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p;..  }else{.   
fcd0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61           psp->la
fce0: 73 74 72 75 6c 65 2d 3e 6e 65 78 74 20 3d 20 72  strule->next = r
fcf0: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  p;.            p
fd00: 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72  sp->lastrule = r
fd10: 70 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20 20 20  p;..  }.        
fd20: 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20    psp->prevrule 
fd30: 3d 20 72 70 3b 0a 09 7d 0a 20 20 20 20 20 20 20  = rp;..}.       
fd40: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
fd50: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
fd60: 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65  R_RULE;.      }e
fd70: 6c 73 65 20 69 66 28 20 69 73 61 6c 70 68 61 28  lse if( isalpha(
fd80: 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
fd90: 20 69 66 28 20 70 73 70 2d 3e 6e 72 68 73 3e 3d   if( psp->nrhs>=
fda0: 4d 41 58 52 48 53 20 29 7b 0a 20 20 20 20 20 20  MAXRHS ){.      
fdb0: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
fdc0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
fdd0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
fde0: 20 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d 61           "Too ma
fdf0: 6e 79 20 73 79 6d 62 6f 6c 73 20 6f 6e 20 52 48  ny symbols on RH
fe00: 53 20 6f 66 20 72 75 6c 65 20 62 65 67 69 6e 6e  S of rule beginn
fe10: 69 6e 67 20 61 74 20 5c 22 25 73 5c 22 2e 22 2c  ing at \"%s\".",
fe20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 29 3b  .            x);
fe30: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
fe40: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
fe50: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
fe60: 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
fe70: 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 09 7d 65 6c  RULE_ERROR;..}el
fe80: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73  se{.          ps
fe90: 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73  p->rhs[psp->nrhs
fea0: 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  ] = Symbol_new(x
feb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
fec0: 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68  ->alias[psp->nrh
fed0: 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  s] = 0;.        
fee0: 20 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 09    psp->nrhs++;..
fef0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
ff00: 28 20 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20  ( (x[0]=='|' || 
ff10: 78 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20 70 73  x[0]=='/') && ps
ff20: 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20  p->nrhs>0 ){.   
ff30: 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
ff40: 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d 3e 72  ol *msp = psp->r
ff50: 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 3b  hs[psp->nrhs-1];
ff60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 73 70  .        if( msp
ff70: 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52  ->type!=MULTITER
ff80: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
ff90: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
ffa0: 20 2a 6f 72 69 67 73 70 20 3d 20 6d 73 70 3b 0a   *origsp = msp;.
ffb0: 20 20 20 20 20 20 20 20 20 20 6d 73 70 20 3d 20            msp = 
ffc0: 63 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f 66 28  calloc(1,sizeof(
ffd0: 2a 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20  *msp));.        
ffe0: 20 20 6d 65 6d 73 65 74 28 6d 73 70 2c 20 30 2c    memset(msp, 0,
fff0: 20 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a   sizeof(*msp));.
10000 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 74            msp->t
10010 79 70 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49  ype = MULTITERMI
10020 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  NAL;.          m
10030 73 70 2d 3e 6e 73 75 62 73 79 6d 20 3d 20 31 3b  sp->nsubsym = 1;
10040 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e  .          msp->
10050 73 75 62 73 79 6d 20 3d 20 63 61 6c 6c 6f 63 28  subsym = calloc(
10060 31 2c 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  1,sizeof(struct 
10070 73 79 6d 62 6f 6c 2a 29 29 3b 0a 20 20 20 20 20  symbol*));.     
10080 20 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d       msp->subsym
10090 5b 30 5d 20 3d 20 6f 72 69 67 73 70 3b 0a 20 20  [0] = origsp;.  
100a0 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 61 6d          msp->nam
100b0 65 20 3d 20 6f 72 69 67 73 70 2d 3e 6e 61 6d 65  e = origsp->name
100c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
100d0 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31  >rhs[psp->nrhs-1
100e0 5d 20 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20 20  ] = msp;.       
100f0 20 7d 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e   }.        msp->
10100 6e 73 75 62 73 79 6d 2b 2b 3b 0a 20 20 20 20 20  nsubsym++;.     
10110 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d     msp->subsym =
10120 20 72 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75   realloc(msp->su
10130 62 73 79 6d 2c 20 73 69 7a 65 6f 66 28 73 74 72  bsym, sizeof(str
10140 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a 6d 73 70  uct symbol*)*msp
10150 2d 3e 6e 73 75 62 73 79 6d 29 3b 0a 20 20 20 20  ->nsubsym);.    
10160 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b      msp->subsym[
10170 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2d 31 5d 20  msp->nsubsym-1] 
10180 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 26 78 5b  = Symbol_new(&x[
10190 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
101a0 20 69 73 6c 6f 77 65 72 28 78 5b 31 5d 29 20 7c   islower(x[1]) |
101b0 7c 20 69 73 6c 6f 77 65 72 28 6d 73 70 2d 3e 73  | islower(msp->s
101c0 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 5b 30  ubsym[0]->name[0
101d0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
101e0 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
101f0 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
10200 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
10210 20 20 20 20 20 22 43 61 6e 6e 6f 74 20 66 6f 72       "Cannot for
10220 6d 20 61 20 63 6f 6d 70 6f 75 6e 64 20 63 6f 6e  m a compound con
10230 74 61 69 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 65  taining a non-te
10240 72 6d 69 6e 61 6c 22 29 3b 0a 20 20 20 20 20 20  rminal");.      
10250 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
10260 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
10270 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78       }else if( x
10280 5b 30 5d 3d 3d 27 28 27 20 26 26 20 70 73 70 2d  [0]=='(' && psp-
10290 3e 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20 20 20  >nrhs>0 ){.     
102a0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
102b0 52 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20  RHS_ALIAS_1;.   
102c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
102d0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
102e0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
102f0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
10300 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 63 68       "Illegal ch
10310 61 72 61 63 74 65 72 20 6f 6e 20 52 48 53 20 6f  aracter on RHS o
10320 66 20 72 75 6c 65 3a 20 5c 22 25 73 5c 22 2e 22  f rule: \"%s\"."
10330 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  ,x);.        psp
10340 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
10350 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10360 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
10370 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
10380 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
10390 0a 20 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c  .    case RHS_AL
103a0 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28  IAS_1:.      if(
103b0 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29   isalpha(x[0]) )
103c0 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61  {.        psp->a
103d0 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31  lias[psp->nrhs-1
103e0 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70  ] = x;.        p
103f0 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 48 53 5f  sp->state = RHS_
10400 41 4c 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d  ALIAS_2;.      }
10410 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
10420 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
10430 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
10440 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
10450 20 22 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20   "\"%s\" is not 
10460 61 20 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f  a valid alias fo
10470 72 20 74 68 65 20 52 48 53 20 73 79 6d 62 6f 6c  r the RHS symbol
10480 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20   \"%s\"\n",.    
10490 20 20 20 20 20 20 78 2c 70 73 70 2d 3e 72 68 73        x,psp->rhs
104a0 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 2d 3e 6e  [psp->nrhs-1]->n
104b0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ame);.        ps
104c0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
104d0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
104e0 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
104f0 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
10500 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
10510 3b 0a 20 20 20 20 63 61 73 65 20 52 48 53 5f 41  ;.    case RHS_A
10520 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66  LIAS_2:.      if
10530 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20  ( x[0]==')' ){. 
10540 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
10550 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20  e = IN_RHS;.    
10560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10570 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
10580 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
10590 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
105a0 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29      "Missing \")
105b0 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53  \" following LHS
105c0 20 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73   alias name \"%s
105d0 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69  \".",psp->lhsali
105e0 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  as);.        psp
105f0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
10600 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10610 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
10620 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
10630 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
10640 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
10650 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f  G_FOR_DECL_KEYWO
10660 52 44 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73  RD:.      if( is
10670 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
10680 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
10690 6b 65 79 77 6f 72 64 20 3d 20 78 3b 0a 20 20 20  keyword = x;.   
106a0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
106b0 67 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20  gslot = 0;.     
106c0 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
106d0 6e 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20  neMacro = 1;.   
106e0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
106f0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
10700 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20  CL_ARG;.        
10710 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 61  if( strcmp(x,"na
10720 6d 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  me")==0 ){.     
10730 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10740 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10750 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
10760 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
10770 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 09 7d  ineMacro = 0;..}
10780 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10790 78 2c 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20  x,"include")==0 
107a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
107b0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
107c0 26 28 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75  &(psp->gp->inclu
107d0 64 65 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  de);..}else if( 
107e0 73 74 72 63 6d 70 28 78 2c 22 63 6f 64 65 22 29  strcmp(x,"code")
107f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10800 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10810 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65  t = &(psp->gp->e
10820 78 74 72 61 63 6f 64 65 29 3b 0a 09 7d 65 6c 73  xtracode);..}els
10830 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10840 74 6f 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72  token_destructor
10850 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10860 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
10870 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
10880 74 6f 6b 65 6e 64 65 73 74 3b 0a 09 7d 65 6c 73  tokendest;..}els
10890 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
108a0 64 65 66 61 75 6c 74 5f 64 65 73 74 72 75 63 74  default_destruct
108b0 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  or")==0 ){.     
108c0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
108d0 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70  gslot = &psp->gp
108e0 2d 3e 76 61 72 64 65 73 74 3b 0a 09 7d 65 6c 73  ->vardest;..}els
108f0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10900 74 6f 6b 65 6e 5f 70 72 65 66 69 78 22 29 3d 3d  token_prefix")==
10910 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10920 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
10930 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65  = &psp->gp->toke
10940 6e 70 72 65 66 69 78 3b 0a 20 20 20 20 20 20 20  nprefix;.       
10950 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
10960 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 09 7d 65  neMacro = 0;..}e
10970 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
10980 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f 72 22 29  ,"syntax_error")
10990 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
109a0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
109b0 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65  t = &(psp->gp->e
109c0 72 72 6f 72 29 3b 0a 09 7d 65 6c 73 65 20 69 66  rror);..}else if
109d0 28 20 73 74 72 63 6d 70 28 78 2c 22 70 61 72 73  ( strcmp(x,"pars
109e0 65 5f 61 63 63 65 70 74 22 29 3d 3d 30 20 29 7b  e_accept")==0 ){
109f0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10a00 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
10a10 70 73 70 2d 3e 67 70 2d 3e 61 63 63 65 70 74 29  psp->gp->accept)
10a20 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
10a30 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 66 61 69  cmp(x,"parse_fai
10a40 6c 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lure")==0 ){.   
10a50 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
10a60 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
10a70 3e 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 09  >gp->failure);..
10a80 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10a90 28 78 2c 22 73 74 61 63 6b 5f 6f 76 65 72 66 6c  (x,"stack_overfl
10aa0 6f 77 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ow")==0 ){.     
10ab0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10ac0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10ad0 70 2d 3e 6f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  p->overflow);.  
10ae0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10af0 73 74 72 63 6d 70 28 78 2c 22 65 78 74 72 61 5f  strcmp(x,"extra_
10b00 61 72 67 75 6d 65 6e 74 22 29 3d 3d 30 20 29 7b  argument")==0 ){
10b10 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10b20 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
10b30 70 73 70 2d 3e 67 70 2d 3e 61 72 67 29 3b 0a 20  psp->gp->arg);. 
10b40 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
10b50 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
10b60 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
10b70 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74   if( strcmp(x,"t
10b80 6f 6b 65 6e 5f 74 79 70 65 22 29 3d 3d 30 20 29  oken_type")==0 )
10b90 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
10ba0 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
10bb0 28 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 74  (psp->gp->tokent
10bc0 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ype);.          
10bd0 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
10be0 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  acro = 0;.      
10bf0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
10c00 6d 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 74 79  mp(x,"default_ty
10c10 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pe")==0 ){.     
10c20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10c30 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10c40 70 2d 3e 76 61 72 74 79 70 65 29 3b 0a 20 20 20  p->vartype);.   
10c50 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
10c60 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
10c70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
10c80 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61  f( strcmp(x,"sta
10c90 63 6b 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a  ck_size")==0 ){.
10ca0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
10cb0 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
10cc0 73 70 2d 3e 67 70 2d 3e 73 74 61 63 6b 73 69 7a  sp->gp->stacksiz
10cd0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  e);.          ps
10ce0 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
10cf0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
10d00 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10d10 28 78 2c 22 73 74 61 72 74 5f 73 79 6d 62 6f 6c  (x,"start_symbol
10d20 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10d30 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
10d40 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
10d50 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  >start);.       
10d60 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
10d70 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20  neMacro = 0;.   
10d80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
10d90 74 72 63 6d 70 28 78 2c 22 6c 65 66 74 22 29 3d  trcmp(x,"left")=
10da0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10db0 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72  psp->preccounter
10dc0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
10dd0 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4c  p->declassoc = L
10de0 45 46 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70  EFT;.          p
10df0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
10e00 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
10e10 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20  CE_SYMBOL;.     
10e20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
10e30 63 6d 70 28 78 2c 22 72 69 67 68 74 22 29 3d 3d  cmp(x,"right")==
10e40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10e50 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b  sp->preccounter+
10e60 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  +;.          psp
10e70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 52 49  ->declassoc = RI
10e80 47 48 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70  GHT;.          p
10e90 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
10ea0 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
10eb0 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20  CE_SYMBOL;.     
10ec0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
10ed0 63 6d 70 28 78 2c 22 6e 6f 6e 61 73 73 6f 63 22  cmp(x,"nonassoc"
10ee0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
10ef0 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74    psp->preccount
10f00 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  er++;.          
10f10 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d  psp->declassoc =
10f20 20 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20   NONE;.         
10f30 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
10f40 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44  ITING_FOR_PRECED
10f50 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65  ENCE_SYMBOL;..}e
10f60 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
10f70 2c 22 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d  ,"destructor")==
10f80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10f90 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
10fa0 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54  ING_FOR_DESTRUCT
10fb0 4f 52 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73  OR_SYMBOL;..}els
10fc0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10fd0 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  type")==0 ){.   
10fe0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
10ff0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
11000 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3b  DATATYPE_SYMBOL;
11010 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11020 66 28 20 73 74 72 63 6d 70 28 78 2c 22 66 61 6c  f( strcmp(x,"fal
11030 6c 62 61 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20  lback")==0 ){.  
11040 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 61 6c          psp->fal
11050 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20  lback = 0;.     
11060 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11070 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41  = WAITING_FOR_FA
11080 4c 4c 42 41 43 4b 5f 49 44 3b 0a 20 20 20 20 20  LLBACK_ID;.     
11090 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
110a0 63 6d 70 28 78 2c 22 77 69 6c 64 63 61 72 64 22  cmp(x,"wildcard"
110b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
110c0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
110d0 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43  AITING_FOR_WILDC
110e0 41 52 44 5f 49 44 3b 0a 20 20 20 20 20 20 20 20  ARD_ID;.        
110f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
11100 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
11110 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
11120 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
11130 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 64        "Unknown d
11140 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f  eclaration keywo
11150 72 64 3a 20 5c 22 25 25 25 73 5c 22 2e 22 2c 78  rd: \"%%%s\".",x
11160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
11170 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
11180 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11190 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
111a0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  R_DECL_ERROR;..}
111b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
111c0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
111d0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
111e0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
111f0 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
11200 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65  l declaration ke
11210 79 77 6f 72 64 3a 20 5c 22 25 73 5c 22 2e 22 2c  yword: \"%s\".",
11220 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
11230 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11240 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11250 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
11260 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
11270 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
11280 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
11290 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f  _FOR_DESTRUCTOR_
112a0 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66  SYMBOL:.      if
112b0 28 20 21 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  ( !isalpha(x[0])
112c0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
112d0 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
112e0 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
112f0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
11300 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73  Symbol name miss
11310 69 6e 67 20 61 66 74 65 72 20 25 64 65 73 74 72  ing after %destr
11320 75 63 74 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b  uctor keyword");
11330 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
11340 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
11350 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
11360 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
11370 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
11380 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72  lse{.        str
11390 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
113a0 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
113b0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
113c0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e  largslot = &sp->
113d0 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 20 20  destructor;.    
113e0 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
113f0 69 6e 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20  ineMacro = 1;.  
11400 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11410 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
11420 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d  ECL_ARG;.      }
11430 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11440 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
11450 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42  OR_DATATYPE_SYMB
11460 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69  OL:.      if( !i
11470 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a  salpha(x[0]) ){.
11480 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11490 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
114a0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
114b0 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62  .          "Symb
114c0 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20  ol name missing 
114d0 61 66 74 65 72 20 25 64 65 73 74 72 75 63 74 6f  after %destructo
114e0 72 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20  r keyword");.   
114f0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11500 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
11510 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
11520 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
11530 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
11540 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
11550 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d  symbol *sp = Sym
11560 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
11570 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
11580 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61 74 61  slot = &sp->data
11590 74 79 70 65 3b 0a 20 20 20 20 20 20 20 20 70 73  type;.        ps
115a0 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
115b0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
115c0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
115d0 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52  TING_FOR_DECL_AR
115e0 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  G;.      }.     
115f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
11600 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45   WAITING_FOR_PRE
11610 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a  CEDENCE_SYMBOL:.
11620 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
11630 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '.' ){.        p
11640 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
11650 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
11660 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RULE;.      }els
11670 65 20 69 66 28 20 69 73 75 70 70 65 72 28 78 5b  e if( isupper(x[
11680 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  0]) ){.        s
11690 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
116a0 3b 0a 20 20 20 20 20 20 20 20 73 70 20 3d 20 53  ;.        sp = S
116b0 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
116c0 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 70 72        if( sp->pr
116d0 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ec>=0 ){.       
116e0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
116f0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
11700 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
11710 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20          "Symbol 
11720 5c 22 25 73 5c 22 20 68 61 73 20 61 6c 72 65 61  \"%s\" has alrea
11730 64 79 20 62 65 20 67 69 76 65 6e 20 61 20 70 72  dy be given a pr
11740 65 63 65 64 65 6e 63 65 2e 22 2c 78 29 3b 0a 20  ecedence.",x);. 
11750 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
11760 72 6f 72 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65  rorcnt++;..}else
11770 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e  {.          sp->
11780 70 72 65 63 20 3d 20 70 73 70 2d 3e 70 72 65 63  prec = psp->prec
11790 63 6f 75 6e 74 65 72 3b 0a 20 20 20 20 20 20 20  counter;.       
117a0 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 70     sp->assoc = p
117b0 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 3b 0a 09  sp->declassoc;..
117c0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
117d0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
117e0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
117f0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
11800 20 20 20 20 20 20 20 20 20 20 22 43 61 6e 27 74            "Can't
11810 20 61 73 73 69 67 6e 20 61 20 70 72 65 63 65 64   assign a preced
11820 65 6e 63 65 20 74 6f 20 5c 22 25 73 5c 22 2e 22  ence to \"%s\"."
11830 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  ,x);.        psp
11840 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
11850 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
11860 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
11870 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47  ING_FOR_DECL_ARG
11880 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
11890 3d 3d 27 7b 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27  =='{' || x[0]=='
118a0 5c 22 27 20 7c 7c 20 69 73 61 6c 6e 75 6d 28 78  \"' || isalnum(x
118b0 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
118c0 63 68 61 72 20 2a 7a 4f 6c 64 2c 20 2a 7a 4e 65  char *zOld, *zNe
118d0 77 2c 20 2a 7a 42 75 66 2c 20 2a 7a 3b 0a 20 20  w, *zBuf, *z;.  
118e0 20 20 20 20 20 20 69 6e 74 20 6e 4f 6c 64 2c 20        int nOld, 
118f0 6e 2c 20 6e 4c 69 6e 65 2c 20 6e 4e 65 77 2c 20  n, nLine, nNew, 
11900 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 63  nBack;.        c
11910 68 61 72 20 7a 4c 69 6e 65 5b 35 30 5d 3b 0a 20  har zLine[50];. 
11920 20 20 20 20 20 20 20 7a 4e 65 77 20 3d 20 78 3b         zNew = x;
11930 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 65  .        if( zNe
11940 77 5b 30 5d 3d 3d 27 22 27 20 7c 7c 20 7a 4e 65  w[0]=='"' || zNe
11950 77 5b 30 5d 3d 3d 27 7b 27 20 29 20 7a 4e 65 77  w[0]=='{' ) zNew
11960 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 4e 65 77  ++;.        nNew
11970 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 65 77 29 3b   = strlen(zNew);
11980 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 73  .        if( *ps
11990 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 29  p->declargslot )
119a0 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64  {.          zOld
119b0 20 3d 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67   = *psp->declarg
119c0 73 6c 6f 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  slot;.        }e
119d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
119e0 4f 6c 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  Old = "";.      
119f0 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 4f 6c 64    }.        nOld
11a00 20 3d 20 73 74 72 6c 65 6e 28 7a 4f 6c 64 29 3b   = strlen(zOld);
11a10 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 4f 6c  .        n = nOl
11a20 64 20 2b 20 6e 4e 65 77 20 2b 20 32 30 3b 0a 20  d + nNew + 20;. 
11a30 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e         if( psp->
11a40 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
11a50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
11a60 28 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  (z=psp->filename
11a70 2c 20 6e 42 61 63 6b 3d 30 3b 20 2a 7a 3b 20 7a  , nBack=0; *z; z
11a80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
11a90 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29 20   if( *z=='\\' ) 
11aa0 6e 42 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 20  nBack++;.       
11ab0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
11ac0 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 23  printf(zLine, "#
11ad0 6c 69 6e 65 20 25 64 20 22 2c 20 70 73 70 2d 3e  line %d ", psp->
11ae0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 29 3b 0a 20 20  tokenlineno);.  
11af0 20 20 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20          nLine = 
11b00 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20  strlen(zLine);. 
11b10 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 6e 4c           n += nL
11b20 69 6e 65 20 2b 20 73 74 72 6c 65 6e 28 70 73 70  ine + strlen(psp
11b30 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b 20 6e 42  ->filename) + nB
11b40 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
11b50 20 20 20 20 20 20 20 2a 70 73 70 2d 3e 64 65 63         *psp->dec
11b60 6c 61 72 67 73 6c 6f 74 20 3d 20 7a 42 75 66 20  largslot = zBuf 
11b70 3d 20 72 65 61 6c 6c 6f 63 28 2a 70 73 70 2d 3e  = realloc(*psp->
11b80 64 65 63 6c 61 72 67 73 6c 6f 74 2c 20 6e 29 3b  declargslot, n);
11b90 0a 20 20 20 20 20 20 20 20 7a 42 75 66 20 2b 3d  .        zBuf +=
11ba0 20 6e 4f 6c 64 3b 0a 20 20 20 20 20 20 20 20 69   nOld;.        i
11bb0 66 28 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69  f( psp->insertLi
11bc0 6e 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20 20 20  neMacro ){.     
11bd0 20 20 20 20 20 69 66 28 20 6e 4f 6c 64 20 26 26       if( nOld &&
11be0 20 7a 42 75 66 5b 2d 31 5d 21 3d 27 5c 6e 27 20   zBuf[-1]!='\n' 
11bf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
11c00 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b  (zBuf++) = '\n';
11c10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
11c20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42         memcpy(zB
11c30 75 66 2c 20 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65  uf, zLine, nLine
11c40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 42 75  );.          zBu
11c50 66 20 2b 3d 20 6e 4c 69 6e 65 3b 0a 20 20 20 20  f += nLine;.    
11c60 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20        *(zBuf++) 
11c70 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 20 20 20  = '"';.         
11c80 20 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65   for(z=psp->file
11c90 6e 61 6d 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a  name; *z; z++){.
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
11cb0 2a 7a 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20  *z=='\\' ){.    
11cc0 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66            *(zBuf
11cd0 2b 2b 29 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20  ++) = '\\';.    
11ce0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11cf0 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20        *(zBuf++) 
11d00 3d 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  = *z;.          
11d10 7d 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42  }.          *(zB
11d20 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20  uf++) = '"';.   
11d30 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29         *(zBuf++)
11d40 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20   = '\n';.       
11d50 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70   }.        memcp
11d60 79 28 7a 42 75 66 2c 20 7a 4e 65 77 2c 20 6e 4e  y(zBuf, zNew, nN
11d70 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75  ew);.        zBu
11d80 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  f += nNew;.     
11d90 20 20 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20 20     *zBuf = 0;.  
11da0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11db0 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
11dc0 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20  ECL_OR_RULE;.   
11dd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11de0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
11df0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
11e00 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11e10 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 61 72       "Illegal ar
11e20 67 75 6d 65 6e 74 20 74 6f 20 25 25 25 73 3a 20  gument to %%%s: 
11e30 25 73 22 2c 70 73 70 2d 3e 64 65 63 6c 6b 65 79  %s",psp->declkey
11e40 77 6f 72 64 2c 78 29 3b 0a 20 20 20 20 20 20 20  word,x);.       
11e50 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
11e60 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
11e70 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
11e80 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a  TER_DECL_ERROR;.
11e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
11ea0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
11eb0 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41  ITING_FOR_FALLBA
11ec0 43 4b 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28  CK_ID:.      if(
11ed0 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20   x[0]=='.' ){.  
11ee0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11ef0 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
11f00 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20  ECL_OR_RULE;.   
11f10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73     }else if( !is
11f20 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20  upper(x[0]) ){. 
11f30 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
11f40 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70  psp->filename, p
11f50 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
11f60 0a 20 20 20 20 20 20 20 20 20 20 22 25 25 66 61  .          "%%fa
11f70 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20  llback argument 
11f80 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65  \"%s\" should be
11f90 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20   a token", x);. 
11fa0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
11fb0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  rcnt++;.      }e
11fc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72  lse{.        str
11fd0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
11fe0 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
11ff0 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d          if( psp-
12000 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a  >fallback==0 ){.
12010 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66            psp->f
12020 61 6c 6c 62 61 63 6b 20 3d 20 73 70 3b 0a 20 20  allback = sp;.  
12030 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12040 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 29 7b 0a  sp->fallback ){.
12050 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
12060 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
12070 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  , psp->tokenline
12080 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
12090 22 4d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 66  "More than one f
120a0 61 6c 6c 62 61 63 6b 20 61 73 73 69 67 6e 65 64  allback assigned
120b0 20 74 6f 20 74 6f 6b 65 6e 20 25 73 22 2c 20 78   to token %s", x
120c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
120d0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
120e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
120f0 20 20 20 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62         sp->fallb
12100 61 63 6b 20 3d 20 70 73 70 2d 3e 66 61 6c 6c 62  ack = psp->fallb
12110 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ack;.          p
12120 73 70 2d 3e 67 70 2d 3e 68 61 73 5f 66 61 6c 6c  sp->gp->has_fall
12130 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  back = 1;.      
12140 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12150 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
12160 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49  e WAITING_FOR_WI
12170 4c 44 43 41 52 44 5f 49 44 3a 0a 20 20 20 20 20  LDCARD_ID:.     
12180 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
12190 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
121a0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
121b0 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
121c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
121d0 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20   !isupper(x[0]) 
121e0 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
121f0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
12200 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
12210 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
12220 25 25 77 69 6c 64 63 61 72 64 20 61 72 67 75 6d  %%wildcard argum
12230 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c  ent \"%s\" shoul
12240 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78  d be a token", x
12250 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
12260 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
12270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12280 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
12290 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
122a0 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
122b0 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61 72  psp->gp->wildcar
122c0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
122d0 20 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63    psp->gp->wildc
122e0 61 72 64 20 3d 20 73 70 3b 0a 20 20 20 20 20 20  ard = sp;.      
122f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12300 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
12310 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e  >filename, psp->
12320 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
12330 20 20 20 20 20 20 20 20 20 22 45 78 74 72 61 20           "Extra 
12340 77 69 6c 64 63 61 72 64 20 74 6f 20 74 6f 6b 65  wildcard to toke
12350 6e 3a 20 25 73 22 2c 20 78 29 3b 0a 20 20 20 20  n: %s", x);.    
12360 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
12370 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
12380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
12390 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52  reak;.    case R
123a0 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
123b0 5f 45 52 52 4f 52 3a 0a 2f 2a 20 20 20 20 20 20  _ERROR:./*      
123c0 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20  if( x[0]=='.' ) 
123d0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
123e0 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
123f0 5f 52 55 4c 45 3b 0a 2a 2a 20 20 20 20 20 20 62  _RULE;.**      b
12400 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 63 61 73  reak; */.    cas
12410 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  e RESYNC_AFTER_D
12420 45 43 4c 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20  ECL_ERROR:.     
12430 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
12440 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
12450 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
12460 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 69 66  R_RULE;.      if
12470 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 20 70 73  ( x[0]=='%' ) ps
12480 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
12490 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57  NG_FOR_DECL_KEYW
124a0 4f 52 44 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ORD;.      break
124b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e 20  ;.  }.}../* Run 
124c0 74 68 65 20 70 72 6f 70 72 6f 63 65 73 73 6f 72  the proprocessor
124d0 20 6f 76 65 72 20 74 68 65 20 69 6e 70 75 74 20   over the input 
124e0 66 69 6c 65 20 74 65 78 74 2e 20 20 54 68 65 20  file text.  The 
124f0 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
12500 0a 2a 2a 20 61 7a 44 65 66 69 6e 65 5b 30 5d 20  .** azDefine[0] 
12510 74 68 72 6f 75 67 68 20 61 7a 44 65 66 69 6e 65  through azDefine
12520 5b 6e 44 65 66 69 6e 65 2d 31 5d 20 63 6f 6e 74  [nDefine-1] cont
12530 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f  ains the names o
12540 66 20 61 6c 6c 20 64 65 66 69 6e 65 64 0a 2a 2a  f all defined.**
12550 20 6d 61 63 72 6f 73 2e 20 20 54 68 69 73 20 72   macros.  This r
12560 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72  outine looks for
12570 20 22 25 69 66 64 65 66 22 20 61 6e 64 20 22 25   "%ifdef" and "%
12580 69 66 6e 64 65 66 22 20 61 6e 64 20 22 25 65 6e  ifndef" and "%en
12590 64 69 66 22 20 61 6e 64 0a 2a 2a 20 63 6f 6d 6d  dif" and.** comm
125a0 65 6e 74 73 20 74 68 65 6d 20 6f 75 74 2e 20 20  ents them out.  
125b0 54 65 78 74 20 69 6e 20 62 65 74 77 65 65 6e 20  Text in between 
125c0 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65  is also commente
125d0 64 20 6f 75 74 20 61 73 20 61 70 70 72 6f 70 72  d out as appropr
125e0 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
125f0 76 6f 69 64 20 70 72 65 70 72 6f 63 65 73 73 5f  void preprocess_
12600 69 6e 70 75 74 28 63 68 61 72 20 2a 7a 29 7b 0a  input(char *z){.
12610 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e    int i, j, k, n
12620 3b 0a 20 20 69 6e 74 20 65 78 63 6c 75 64 65 20  ;.  int exclude 
12630 3d 20 30 3b 0a 20 20 69 6e 74 20 73 74 61 72 74  = 0;.  int start
12640 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 69 6e 65   = 0;.  int line
12650 6e 6f 20 3d 20 31 3b 0a 20 20 69 6e 74 20 73 74  no = 1;.  int st
12660 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a  art_lineno = 1;.
12670 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b    for(i=0; z[i];
12680 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
12690 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  [i]=='\n' ) line
126a0 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b  no++;.    if( z[
126b0 69 5d 21 3d 27 25 27 20 7c 7c 20 28 69 3e 30 20  i]!='%' || (i>0 
126c0 26 26 20 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27 29  && z[i-1]!='\n')
126d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
126e0 20 69 66 28 20 73 74 72 6e 63 6d 70 28 26 7a 5b   if( strncmp(&z[
126f0 69 5d 2c 22 25 65 6e 64 69 66 22 2c 36 29 3d 3d  i],"%endif",6)==
12700 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69  0 && isspace(z[i
12710 2b 36 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 66  +6]) ){.      if
12720 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20  ( exclude ){.   
12730 20 20 20 20 20 65 78 63 6c 75 64 65 2d 2d 3b 0a       exclude--;.
12740 20 20 20 20 20 20 20 20 69 66 28 20 65 78 63 6c          if( excl
12750 75 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ude==0 ){.      
12760 20 20 20 20 66 6f 72 28 6a 3d 73 74 61 72 74 3b      for(j=start;
12770 20 6a 3c 69 3b 20 6a 2b 2b 29 20 69 66 28 20 7a   j<i; j++) if( z
12780 5b 6a 5d 21 3d 27 5c 6e 27 20 29 20 7a 5b 6a 5d  [j]!='\n' ) z[j]
12790 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
127a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
127b0 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26  for(j=i; z[j] &&
127c0 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b   z[j]!='\n'; j++
127d0 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20  ) z[j] = ' ';.  
127e0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 73 74 72    }else if( (str
127f0 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 64  ncmp(&z[i],"%ifd
12800 65 66 22 2c 36 29 3d 3d 30 20 26 26 20 69 73 73  ef",6)==0 && iss
12810 70 61 63 65 28 7a 5b 69 2b 36 5d 29 29 0a 20 20  pace(z[i+6])).  
12820 20 20 20 20 20 20 20 20 7c 7c 20 28 73 74 72 6e          || (strn
12830 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 6e 64  cmp(&z[i],"%ifnd
12840 65 66 22 2c 37 29 3d 3d 30 20 26 26 20 69 73 73  ef",7)==0 && iss
12850 70 61 63 65 28 7a 5b 69 2b 37 5d 29 29 20 29 7b  pace(z[i+7])) ){
12860 0a 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75  .      if( exclu
12870 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78  de ){.        ex
12880 63 6c 75 64 65 2b 2b 3b 0a 20 20 20 20 20 20 7d  clude++;.      }
12890 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
128a0 72 28 6a 3d 69 2b 37 3b 20 69 73 73 70 61 63 65  r(j=i+7; isspace
128b0 28 7a 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20  (z[j]); j++){}. 
128c0 20 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20         for(n=0; 
128d0 7a 5b 6a 2b 6e 5d 20 26 26 20 21 69 73 73 70 61  z[j+n] && !isspa
128e0 63 65 28 7a 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b 29  ce(z[j+n]); n++)
128f0 7b 7d 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75  {}.        exclu
12900 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
12910 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 44 65 66 69  for(k=0; k<nDefi
12920 6e 65 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  ne; k++){.      
12930 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
12940 61 7a 44 65 66 69 6e 65 5b 6b 5d 2c 26 7a 5b 6a  azDefine[k],&z[j
12950 5d 2c 6e 29 3d 3d 30 20 26 26 20 73 74 72 6c 65  ],n)==0 && strle
12960 6e 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 29 3d 3d  n(azDefine[k])==
12970 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
12980 20 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20   exclude = 0;.  
12990 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
129a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
129b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
129c0 66 28 20 7a 5b 69 2b 33 5d 3d 3d 27 6e 27 20 29  f( z[i+3]=='n' )
129d0 20 65 78 63 6c 75 64 65 20 3d 20 21 65 78 63 6c   exclude = !excl
129e0 75 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ude;.        if(
129f0 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20   exclude ){.    
12a00 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 69 3b        start = i;
12a10 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74  .          start
12a20 5f 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f  _lineno = lineno
12a30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12a40 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
12a50 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21  i; z[j] && z[j]!
12a60 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d  ='\n'; j++) z[j]
12a70 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20   = ' ';.    }.  
12a80 7d 0a 20 20 69 66 28 20 65 78 63 6c 75 64 65 20  }.  if( exclude 
12a90 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
12aa0 74 64 65 72 72 2c 22 75 6e 74 65 72 6d 69 6e 61  tderr,"untermina
12ab0 74 65 64 20 25 25 69 66 64 65 66 20 73 74 61 72  ted %%ifdef star
12ac0 74 69 6e 67 20 6f 6e 20 6c 69 6e 65 20 25 64 5c  ting on line %d\
12ad0 6e 22 2c 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f  n", start_lineno
12ae0 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
12af0 20 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20 73 70 69    }.}../* In spi
12b00 74 65 20 6f 66 20 69 74 73 20 6e 61 6d 65 2c 20  te of its name, 
12b10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
12b20 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6e 6e 65   really a scanne
12b30 72 2e 20 20 49 74 20 72 65 61 64 0a 2a 2a 20 69  r.  It read.** i
12b40 6e 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e 70  n the entire inp
12b50 75 74 20 66 69 6c 65 20 28 61 6c 6c 20 61 74 20  ut file (all at 
12b60 6f 6e 63 65 29 20 74 68 65 6e 20 74 6f 6b 65 6e  once) then token
12b70 69 7a 65 73 20 69 74 2e 20 20 45 61 63 68 0a 2a  izes it.  Each.*
12b80 2a 20 74 6f 6b 65 6e 20 69 73 20 70 61 73 73 65  * token is passe
12b90 64 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  d to the functio
12ba0 6e 20 22 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e  n "parseonetoken
12bb0 22 20 77 68 69 63 68 20 62 75 69 6c 64 73 20 61  " which builds a
12bc0 6c 6c 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70  ll.** the approp
12bd0 72 69 61 74 65 20 64 61 74 61 20 73 74 72 75 63  riate data struc
12be0 74 75 72 65 73 20 69 6e 20 74 68 65 20 67 6c 6f  tures in the glo
12bf0 62 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72  bal state vector
12c00 20 22 67 70 22 2e 0a 2a 2f 0a 76 6f 69 64 20 50   "gp"..*/.void P
12c10 61 72 73 65 28 67 70 29 0a 73 74 72 75 63 74 20  arse(gp).struct 
12c20 6c 65 6d 6f 6e 20 2a 67 70 3b 0a 7b 0a 20 20 73  lemon *gp;.{.  s
12c30 74 72 75 63 74 20 70 73 74 61 74 65 20 70 73 3b  truct pstate ps;
12c40 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 20 20 63  .  FILE *fp;.  c
12c50 68 61 72 20 2a 66 69 6c 65 62 75 66 3b 0a 20 20  har *filebuf;.  
12c60 69 6e 74 20 66 69 6c 65 73 69 7a 65 3b 0a 20 20  int filesize;.  
12c70 69 6e 74 20 6c 69 6e 65 6e 6f 3b 0a 20 20 69 6e  int lineno;.  in
12c80 74 20 63 3b 0a 20 20 63 68 61 72 20 2a 63 70 2c  t c;.  char *cp,
12c90 20 2a 6e 65 78 74 63 70 3b 0a 20 20 69 6e 74 20   *nextcp;.  int 
12ca0 73 74 61 72 74 6c 69 6e 65 20 3d 20 30 3b 0a 0a  startline = 0;..
12cb0 20 20 6d 65 6d 73 65 74 28 26 70 73 2c 20 27 5c    memset(&ps, '\
12cc0 30 27 2c 20 73 69 7a 65 6f 66 28 70 73 29 29 3b  0', sizeof(ps));
12cd0 0a 20 20 70 73 2e 67 70 20 3d 20 67 70 3b 0a 20  .  ps.gp = gp;. 
12ce0 20 70 73 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 67   ps.filename = g
12cf0 70 2d 3e 66 69 6c 65 6e 61 6d 65 3b 0a 20 20 70  p->filename;.  p
12d00 73 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a  s.errorcnt = 0;.
12d10 20 20 70 73 2e 73 74 61 74 65 20 3d 20 49 4e 49    ps.state = INI
12d20 54 49 41 4c 49 5a 45 3b 0a 0a 20 20 2f 2a 20 42  TIALIZE;..  /* B
12d30 65 67 69 6e 20 62 79 20 72 65 61 64 69 6e 67 20  egin by reading 
12d40 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a  the input file *
12d50 2f 0a 20 20 66 70 20 3d 20 66 6f 70 65 6e 28 70  /.  fp = fopen(p
12d60 73 2e 66 69 6c 65 6e 61 6d 65 2c 22 72 62 22 29  s.filename,"rb")
12d70 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 29 7b  ;.  if( fp==0 ){
12d80 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73  .    ErrorMsg(ps
12d90 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e  .filename,0,"Can
12da0 27 74 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c  't open this fil
12db0 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 22 29  e for reading.")
12dc0 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63  ;.    gp->errorc
12dd0 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
12de0 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28 66 70  ;.  }.  fseek(fp
12df0 2c 30 2c 32 29 3b 0a 20 20 66 69 6c 65 73 69 7a  ,0,2);.  filesiz
12e00 65 20 3d 20 66 74 65 6c 6c 28 66 70 29 3b 0a 20  e = ftell(fp);. 
12e10 20 72 65 77 69 6e 64 28 66 70 29 3b 0a 20 20 66   rewind(fp);.  f
12e20 69 6c 65 62 75 66 20 3d 20 28 63 68 61 72 20 2a  ilebuf = (char *
12e30 29 6d 61 6c 6c 6f 63 28 20 66 69 6c 65 73 69 7a  )malloc( filesiz
12e40 65 2b 31 20 29 3b 0a 20 20 69 66 28 20 66 69 6c  e+1 );.  if( fil
12e50 65 62 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 45  ebuf==0 ){.    E
12e60 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e  rrorMsg(ps.filen
12e70 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 61 6c 6c  ame,0,"Can't all
12e80 6f 63 61 74 65 20 25 64 20 6f 66 20 6d 65 6d 6f  ocate %d of memo
12e90 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 69 73 20  ry to hold this 
12ea0 66 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66 69  file.",.      fi
12eb0 6c 65 73 69 7a 65 2b 31 29 3b 0a 20 20 20 20 67  lesize+1);.    g
12ec0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
12ed0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
12ee0 20 69 66 28 20 66 72 65 61 64 28 66 69 6c 65 62   if( fread(fileb
12ef0 75 66 2c 31 2c 66 69 6c 65 73 69 7a 65 2c 66 70  uf,1,filesize,fp
12f00 29 21 3d 66 69 6c 65 73 69 7a 65 20 29 7b 0a 20  )!=filesize ){. 
12f10 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66     ErrorMsg(ps.f
12f20 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74  ilename,0,"Can't
12f30 20 72 65 61 64 20 69 6e 20 61 6c 6c 20 25 64 20   read in all %d 
12f40 62 79 74 65 73 20 6f 66 20 74 68 69 73 20 66 69  bytes of this fi
12f50 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66 69 6c 65  le.",.      file
12f60 73 69 7a 65 29 3b 0a 20 20 20 20 66 72 65 65 28  size);.    free(
12f70 66 69 6c 65 62 75 66 29 3b 0a 20 20 20 20 67 70  filebuf);.    gp
12f80 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
12f90 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
12fa0 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 66 69  fclose(fp);.  fi
12fb0 6c 65 62 75 66 5b 66 69 6c 65 73 69 7a 65 5d 20  lebuf[filesize] 
12fc0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  = 0;..  /* Make 
12fd0 61 6e 20 69 6e 69 74 69 61 6c 20 70 61 73 73 20  an initial pass 
12fe0 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65  through the file
12ff0 20 74 6f 20 68 61 6e 64 6c 65 20 25 69 66 64 65   to handle %ifde
13000 66 20 61 6e 64 20 25 69 66 6e 64 65 66 20 2a 2f  f and %ifndef */
13010 0a 20 20 70 72 65 70 72 6f 63 65 73 73 5f 69 6e  .  preprocess_in
13020 70 75 74 28 66 69 6c 65 62 75 66 29 3b 0a 0a 20  put(filebuf);.. 
13030 20 2f 2a 20 4e 6f 77 20 73 63 61 6e 20 74 68 65   /* Now scan the
13040 20 74 65 78 74 20 6f 66 20 74 68 65 20 69 6e 70   text of the inp
13050 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 6c 69 6e  ut file */.  lin
13060 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28 63  eno = 1;.  for(c
13070 70 3d 66 69 6c 65 62 75 66 3b 20 28 63 3d 20 2a  p=filebuf; (c= *
13080 63 70 29 21 3d 30 3b 20 29 7b 0a 20 20 20 20 69  cp)!=0; ){.    i
13090 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
130a0 65 6e 6f 2b 2b 3b 20 20 20 20 20 20 20 20 20 20  eno++;          
130b0 20 20 20 20 2f 2a 20 4b 65 65 70 20 74 72 61 63      /* Keep trac
130c0 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e 75  k of the line nu
130d0 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  mber */.    if( 
130e0 69 73 73 70 61 63 65 28 63 29 20 29 7b 20 63 70  isspace(c) ){ cp
130f0 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 20  ++; continue; } 
13100 20 2f 2a 20 53 6b 69 70 20 61 6c 6c 20 77 68 69   /* Skip all whi
13110 74 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  te space */.    
13120 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70  if( c=='/' && cp
13130 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 20 20 20  [1]=='/' ){     
13140 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b       /* Skip C++
13150 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20   style comments 
13160 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a  */.      cp+=2;.
13170 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
13180 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27   *cp)!=0 && c!='
13190 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20  \n' ) cp++;.    
131a0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
131b0 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2f 27  }.    if( c=='/'
131c0 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29   && cp[1]=='*' )
131d0 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b  {          /* Sk
131e0 69 70 20 43 20 73 74 79 6c 65 20 63 6f 6d 6d 65  ip C style comme
131f0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b  nts */.      cp+
13200 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  =2;.      while(
13210 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
13220 28 63 21 3d 27 2f 27 20 7c 7c 20 63 70 5b 2d 31  (c!='/' || cp[-1
13230 5d 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20 20  ]!='*') ){.     
13240 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
13250 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
13260 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d     cp++;.      }
13270 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 20 63  .      if( c ) c
13280 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  p++;.      conti
13290 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nue;.    }.    p
132a0 73 2e 74 6f 6b 65 6e 73 74 61 72 74 20 3d 20 63  s.tokenstart = c
132b0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
132c0 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 62 65    /* Mark the be
132d0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74  ginning of the t
132e0 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 73 2e 74  oken */.    ps.t
132f0 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e  okenlineno = lin
13300 65 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  eno;           /
13310 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 6f 6e 20  * Linenumber on 
13320 77 68 69 63 68 20 74 6f 6b 65 6e 20 62 65 67 69  which token begi
13330 6e 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d  ns */.    if( c=
13340 3d 27 5c 22 27 20 29 7b 20 20 20 20 20 20 20 20  ='\"' ){        
13350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13360 53 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 20  String literals 
13370 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20  */.      cp++;. 
13380 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20       while( (c= 
13390 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  *cp)!=0 && c!='\
133a0 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  "' ){.        if
133b0 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  ( c=='\n' ) line
133c0 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 70  no++;.        cp
133d0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
133e0 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
133f0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
13400 73 2e 66 69 6c 65 6e 61 6d 65 2c 73 74 61 72 74  s.filename,start
13410 6c 69 6e 65 2c 0a 22 53 74 72 69 6e 67 20 73 74  line,."String st
13420 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c  arting on this l
13430 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d 69  ine is not termi
13440 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74 68 65  nated before the
13450 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
13460 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 2e  .");.        ps.
13470 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
13480 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
13490 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
134a0 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
134b0 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p+1;.      }.   
134c0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b   }else if( c=='{
134d0 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ' ){            
134e0 20 20 20 2f 2a 20 41 20 62 6c 6f 63 6b 20 6f 66     /* A block of
134f0 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   C code */.     
13500 20 69 6e 74 20 6c 65 76 65 6c 3b 0a 20 20 20 20   int level;.    
13510 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 66 6f    cp++;.      fo
13520 72 28 6c 65 76 65 6c 3d 31 3b 20 28 63 3d 20 2a  r(level=1; (c= *
13530 63 70 29 21 3d 30 20 26 26 20 28 6c 65 76 65 6c  cp)!=0 && (level
13540 3e 31 20 7c 7c 20 63 21 3d 27 7d 27 29 3b 20 63  >1 || c!='}'); c
13550 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  p++){.        if
13560 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  ( c=='\n' ) line
13570 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c  no++;.        el
13580 73 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 20  se if( c=='{' ) 
13590 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  level++;.       
135a0 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7d 27   else if( c=='}'
135b0 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20   ) level--;.    
135c0 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d      else if( c==
135d0 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a  '/' && cp[1]=='*
135e0 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 63 6f  ' ){  /* Skip co
135f0 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  mments */.      
13600 20 20 20 20 69 6e 74 20 70 72 65 76 63 3b 0a 20      int prevc;. 
13610 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 26 63           cp = &c
13620 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  p[2];.          
13630 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20  prevc = 0;.     
13640 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20       while( (c= 
13650 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d 27  *cp)!=0 && (c!='
13660 2f 27 20 7c 7c 20 70 72 65 76 63 21 3d 27 2a 27  /' || prevc!='*'
13670 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
13680 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
13690 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
136a0 20 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b 0a       prevc = c;.
136b0 20 20 20 20 20 20 20 20 20 20 20 20 63 70 2b 2b              cp++
136c0 3b 0a 09 20 20 7d 0a 09 7d 65 6c 73 65 20 69 66  ;..  }..}else if
136d0 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31  ( c=='/' && cp[1
136e0 5d 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20 53 6b  ]=='/' ){  /* Sk
136f0 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d  ip C++ style com
13700 6d 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20 20 20  ments too */.   
13710 20 20 20 20 20 20 20 63 70 20 3d 20 26 63 70 5b         cp = &cp[
13720 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68  2];.          wh
13730 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
13740 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70   && c!='\n' ) cp
13750 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ++;.          if
13760 28 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ( c ) lineno++;.
13770 09 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c  .}else if( c=='\
13780 27 27 20 7c 7c 20 63 3d 3d 27 5c 22 27 20 29 7b  '' || c=='\"' ){
13790 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 61 20      /* String a 
137a0 63 68 61 72 61 63 74 65 72 20 6c 69 74 65 72 61  character litera
137b0 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ls */.          
137c0 69 6e 74 20 73 74 61 72 74 63 68 61 72 2c 20 70  int startchar, p
137d0 72 65 76 63 3b 0a 20 20 20 20 20 20 20 20 20 20  revc;.          
137e0 73 74 61 72 74 63 68 61 72 20 3d 20 63 3b 0a 20  startchar = c;. 
137f0 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d           prevc =
13800 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
13810 72 28 63 70 2b 2b 3b 20 28 63 3d 20 2a 63 70 29  r(cp++; (c= *cp)
13820 21 3d 30 20 26 26 20 28 63 21 3d 73 74 61 72 74  !=0 && (c!=start
13830 63 68 61 72 20 7c 7c 20 70 72 65 76 63 3d 3d 27  char || prevc=='
13840 5c 5c 27 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20  \\'); cp++){.   
13850 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
13860 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
13870 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
13880 20 70 72 65 76 63 3d 3d 27 5c 5c 27 20 29 20 70   prevc=='\\' ) p
13890 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  revc = 0;.      
138a0 20 20 20 20 20 20 65 6c 73 65 20 20 20 20 20 20        else      
138b0 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20          prevc = 
138c0 63 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20  c;..  }..}.     
138d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
138e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  0 ){.        Err
138f0 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d  orMsg(ps.filenam
13900 65 2c 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  e,ps.tokenlineno
13910 2c 0a 22 43 20 63 6f 64 65 20 73 74 61 72 74 69  ,."C code starti
13920 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20  ng on this line 
13930 69 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  is not terminate
13940 64 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64  d before the end
13950 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 22 29 3b   of the file.");
13960 0a 20 20 20 20 20 20 20 20 70 73 2e 65 72 72 6f  .        ps.erro
13970 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
13980 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20  nextcp = cp;.   
13990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
139a0 20 20 6e 65 78 74 63 70 20 3d 20 63 70 2b 31 3b    nextcp = cp+1;
139b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
139c0 73 65 20 69 66 28 20 69 73 61 6c 6e 75 6d 28 63  se if( isalnum(c
139d0 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a  ) ){          /*
139e0 20 49 64 65 6e 74 69 66 69 65 72 73 20 2a 2f 0a   Identifiers */.
139f0 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
13a00 20 2a 63 70 29 21 3d 30 20 26 26 20 28 69 73 61   *cp)!=0 && (isa
13a10 6c 6e 75 6d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f  lnum(c) || c=='_
13a20 27 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20  ') ) cp++;.     
13a30 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20   nextcp = cp;.  
13a40 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
13a50 3a 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 3a 27  :' && cp[1]==':'
13a60 20 26 26 20 63 70 5b 32 5d 3d 3d 27 3d 27 20 29   && cp[2]=='=' )
13a70 7b 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 6f  { /* The operato
13a80 72 20 22 3a 3a 3d 22 20 2a 2f 0a 20 20 20 20 20  r "::=" */.     
13a90 20 63 70 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20   cp += 3;.      
13aa0 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20  nextcp = cp;.   
13ab0 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27   }else if( (c=='
13ac0 2f 27 20 7c 7c 20 63 3d 3d 27 7c 27 29 20 26 26  /' || c=='|') &&
13ad0 20 69 73 61 6c 70 68 61 28 63 70 5b 31 5d 29 20   isalpha(cp[1]) 
13ae0 29 7b 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 32  ){.      cp += 2
13af0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  ;.      while( (
13b00 63 20 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28  c = *cp)!=0 && (
13b10 69 73 61 6c 6e 75 6d 28 63 29 20 7c 7c 20 63 3d  isalnum(c) || c=
13b20 3d 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a 20 20  ='_') ) cp++;.  
13b30 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
13b40 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 20  .    }else{     
13b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b60 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65       /* All othe
13b70 72 20 28 6f 6e 65 20 63 68 61 72 61 63 74 65 72  r (one character
13b80 29 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  ) operators */. 
13b90 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20       cp++;.     
13ba0 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20   nextcp = cp;.  
13bb0 20 20 7d 0a 20 20 20 20 63 20 3d 20 2a 63 70 3b    }.    c = *cp;
13bc0 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 20 20 20  .    *cp = 0;   
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13be0 20 20 20 20 20 2f 2a 20 4e 75 6c 6c 20 74 65 72       /* Null ter
13bf0 6d 69 6e 61 74 65 20 74 68 65 20 74 6f 6b 65 6e  minate the token
13c00 20 2a 2f 0a 20 20 20 20 70 61 72 73 65 6f 6e 65   */.    parseone
13c10 74 6f 6b 65 6e 28 26 70 73 29 3b 20 20 20 20 20  token(&ps);     
13c20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
13c30 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20   the token */.  
13c40 20 20 2a 63 70 20 3d 20 63 3b 20 20 20 20 20 20    *cp = c;      
13c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c60 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
13c70 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 63   buffer */.    c
13c80 70 20 3d 20 6e 65 78 74 63 70 3b 0a 20 20 7d 0a  p = nextcp;.  }.
13c90 20 20 66 72 65 65 28 66 69 6c 65 62 75 66 29 3b    free(filebuf);
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cb0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
13cc0 68 65 20 62 75 66 66 65 72 20 61 66 74 65 72 20  he buffer after 
13cd0 70 61 72 73 69 6e 67 20 2a 2f 0a 20 20 67 70 2d  parsing */.  gp-
13ce0 3e 72 75 6c 65 20 3d 20 70 73 2e 66 69 72 73 74  >rule = ps.first
13cf0 72 75 6c 65 3b 0a 20 20 67 70 2d 3e 65 72 72 6f  rule;.  gp->erro
13d00 72 63 6e 74 20 3d 20 70 73 2e 65 72 72 6f 72 63  rcnt = ps.errorc
13d10 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  nt;.}./*********
13d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d30 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
13d40 20 22 70 6c 69 6e 6b 2e 63 22 20 2a 2a 2a 2a 2a   "plink.c" *****
13d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d60 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  /./*.** Routines
13d70 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 66   processing conf
13d80 69 67 75 72 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77  iguration follow
13d90 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e  -set propagation
13da0 20 6c 69 6e 6b 73 0a 2a 2a 20 69 6e 20 74 68 65   links.** in the
13db0 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
13dc0 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  nerator..*/.stat
13dd0 69 63 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  ic struct plink 
13de0 2a 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20  *plink_freelist 
13df0 3d 20 30 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  = 0;../* Allocat
13e00 65 20 61 20 6e 65 77 20 70 6c 69 6e 6b 20 2a 2f  e a new plink */
13e10 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 50  .struct plink *P
13e20 6c 69 6e 6b 5f 6e 65 77 28 29 7b 0a 20 20 73 74  link_new(){.  st
13e30 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 3b  ruct plink *new;
13e40 0a 0a 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72  ..  if( plink_fr
13e50 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
13e60 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
13e70 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 70  amt = 100;.    p
13e80 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20  link_freelist = 
13e90 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29  (struct plink *)
13ea0 63 61 6c 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a  calloc( amt, siz
13eb0 65 6f 66 28 73 74 72 75 63 74 20 70 6c 69 6e 6b  eof(struct plink
13ec0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 6c 69  ) );.    if( pli
13ed0 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d 30 20 29  nk_freelist==0 )
13ee0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
13ef0 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 22 55  stderr,.      "U
13f00 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
13f10 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e  e memory for a n
13f20 65 77 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72  ew follow-set pr
13f30 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c  opagation link.\
13f40 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  n");.      exit(
13f50 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  1);.    }.    fo
13f60 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20  r(i=0; i<amt-1; 
13f70 69 2b 2b 29 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  i++) plink_freel
13f80 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 70  ist[i].next = &p
13f90 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 2b  link_freelist[i+
13fa0 31 5d 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72  1];.    plink_fr
13fb0 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65  eelist[amt-1].ne
13fc0 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65  xt = 0;.  }.  ne
13fd0 77 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  w = plink_freeli
13fe0 73 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66 72 65 65  st;.  plink_free
13ff0 6c 69 73 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65  list = plink_fre
14000 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72  elist->next;.  r
14010 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a  eturn new;.}../*
14020 20 41 64 64 20 61 20 70 6c 69 6e 6b 20 74 6f 20   Add a plink to 
14030 61 20 70 6c 69 6e 6b 20 6c 69 73 74 20 2a 2f 0a  a plink list */.
14040 76 6f 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 70  void Plink_add(p
14050 6c 70 70 2c 63 66 70 29 0a 73 74 72 75 63 74 20  lpp,cfp).struct 
14060 70 6c 69 6e 6b 20 2a 2a 70 6c 70 70 3b 0a 73 74  plink **plpp;.st
14070 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
14080 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  ;.{.  struct pli
14090 6e 6b 20 2a 6e 65 77 3b 0a 20 20 6e 65 77 20 3d  nk *new;.  new =
140a0 20 50 6c 69 6e 6b 5f 6e 65 77 28 29 3b 0a 20 20   Plink_new();.  
140b0 6e 65 77 2d 3e 6e 65 78 74 20 3d 20 2a 70 6c 70  new->next = *plp
140c0 70 3b 0a 20 20 2a 70 6c 70 70 20 3d 20 6e 65 77  p;.  *plpp = new
140d0 3b 0a 20 20 6e 65 77 2d 3e 63 66 70 20 3d 20 63  ;.  new->cfp = c
140e0 66 70 3b 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73 66  fp;.}../* Transf
140f0 65 72 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f  er every plink o
14100 6e 20 74 68 65 20 6c 69 73 74 20 22 66 72 6f 6d  n the list "from
14110 22 20 74 6f 20 74 68 65 20 6c 69 73 74 20 22 74  " to the list "t
14120 6f 22 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b  o" */.void Plink
14130 5f 63 6f 70 79 28 74 6f 2c 66 72 6f 6d 29 0a 73  _copy(to,from).s
14140 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 74 6f  truct plink **to
14150 3b 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  ;.struct plink *
14160 66 72 6f 6d 3b 0a 7b 0a 20 20 73 74 72 75 63 74  from;.{.  struct
14170 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a   plink *nextpl;.
14180 20 20 77 68 69 6c 65 28 20 66 72 6f 6d 20 29 7b    while( from ){
14190 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d 20 66 72  .    nextpl = fr
141a0 6f 6d 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 66 72  om->next;.    fr
141b0 6f 6d 2d 3e 6e 65 78 74 20 3d 20 2a 74 6f 3b 0a  om->next = *to;.
141c0 20 20 20 20 2a 74 6f 20 3d 20 66 72 6f 6d 3b 0a      *to = from;.
141d0 20 20 20 20 66 72 6f 6d 20 3d 20 6e 65 78 74 70      from = nextp
141e0 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 44 65 6c  l;.  }.}../* Del
141f0 65 74 65 20 65 76 65 72 79 20 70 6c 69 6e 6b 20  ete every plink 
14200 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 76  on the list */.v
14210 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65  oid Plink_delete
14220 28 70 6c 70 29 0a 73 74 72 75 63 74 20 70 6c 69  (plp).struct pli
14230 6e 6b 20 2a 70 6c 70 3b 0a 7b 0a 20 20 73 74 72  nk *plp;.{.  str
14240 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70  uct plink *nextp
14250 6c 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 6c 70  l;..  while( plp
14260 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d   ){.    nextpl =
14270 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20   plp->next;.    
14280 70 6c 70 2d 3e 6e 65 78 74 20 3d 20 70 6c 69 6e  plp->next = plin
14290 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 20 20  k_freelist;.    
142a0 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d  plink_freelist =
142b0 20 70 6c 70 3b 0a 20 20 20 20 70 6c 70 20 3d 20   plp;.    plp = 
142c0 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f 2a  nextpl;.  }.}./*
142d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142e0 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
142f0 66 69 6c 65 20 22 72 65 70 6f 72 74 2e 63 22 20  file "report.c" 
14300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
14320 2a 20 50 72 6f 63 65 64 75 72 65 73 20 66 6f 72  * Procedures for
14330 20 67 65 6e 65 72 61 74 69 6e 67 20 72 65 70 6f   generating repo
14340 72 74 73 20 61 6e 64 20 74 61 62 6c 65 73 20 69  rts and tables i
14350 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
14360 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
14370 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20  ../* Generate a 
14380 66 69 6c 65 6e 61 6d 65 20 77 69 74 68 20 74 68  filename with th
14390 65 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e 20  e given suffix. 
143a0 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
143b0 68 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6d 65 73  he.** name comes
143c0 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61   from malloc() a
143d0 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
143e0 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
143f0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ** function..*/.
14400 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 66 69  PRIVATE char *fi
14410 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70  le_makename(lemp
14420 2c 73 75 66 66 69 78 29 0a 73 74 72 75 63 74 20  ,suffix).struct 
14430 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61  lemon *lemp;.cha
14440 72 20 2a 73 75 66 66 69 78 3b 0a 7b 0a 20 20 63  r *suffix;.{.  c
14450 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 63 68 61  har *name;.  cha
14460 72 20 2a 63 70 3b 0a 0a 20 20 6e 61 6d 65 20 3d  r *cp;..  name =
14470 20 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28   malloc( strlen(
14480 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20  lemp->filename) 
14490 2b 20 73 74 72 6c 65 6e 28 73 75 66 66 69 78 29  + strlen(suffix)
144a0 20 2b 20 35 20 29 3b 0a 20 20 69 66 28 20 6e 61   + 5 );.  if( na
144b0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  me==0 ){.    fpr
144c0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
144d0 27 74 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  't allocate spac
144e0 65 20 66 6f 72 20 61 20 66 69 6c 65 6e 61 6d 65  e for a filename
144f0 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  .\n");.    exit(
14500 31 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70 79  1);.  }.  strcpy
14510 28 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65  (name,lemp->file
14520 6e 61 6d 65 29 3b 0a 20 20 63 70 20 3d 20 73 74  name);.  cp = st
14530 72 72 63 68 72 28 6e 61 6d 65 2c 27 2e 27 29 3b  rrchr(name,'.');
14540 0a 20 20 69 66 28 20 63 70 20 29 20 2a 63 70 20  .  if( cp ) *cp 
14550 3d 20 30 3b 0a 20 20 73 74 72 63 61 74 28 6e 61  = 0;.  strcat(na
14560 6d 65 2c 73 75 66 66 69 78 29 3b 0a 20 20 72 65  me,suffix);.  re
14570 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  turn name;.}../*
14580 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 77 69 74   Open a file wit
14590 68 20 61 20 6e 61 6d 65 20 62 61 73 65 64 20 6f  h a name based o
145a0 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
145b0 65 20 69 6e 70 75 74 20 66 69 6c 65 2c 0a 2a 2a  e input file,.**
145c0 20 62 75 74 20 77 69 74 68 20 61 20 64 69 66 66   but with a diff
145d0 65 72 65 6e 74 20 28 73 70 65 63 69 66 69 65 64  erent (specified
145e0 29 20 73 75 66 66 69 78 2c 20 61 6e 64 20 72 65  ) suffix, and re
145f0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
14600 2a 20 74 6f 20 74 68 65 20 73 74 72 65 61 6d 20  * to the stream 
14610 2a 2f 0a 50 52 49 56 41 54 45 20 46 49 4c 45 20  */.PRIVATE FILE 
14620 2a 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c  *file_open(lemp,
14630 73 75 66 66 69 78 2c 6d 6f 64 65 29 0a 73 74 72  suffix,mode).str
14640 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
14650 0a 63 68 61 72 20 2a 73 75 66 66 69 78 3b 0a 63  .char *suffix;.c
14660 68 61 72 20 2a 6d 6f 64 65 3b 0a 7b 0a 20 20 46  har *mode;.{.  F
14670 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 69 66 28 20  ILE *fp;..  if( 
14680 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 29 20  lemp->outname ) 
14690 66 72 65 65 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61  free(lemp->outna
146a0 6d 65 29 3b 0a 20 20 6c 65 6d 70 2d 3e 6f 75 74  me);.  lemp->out
146b0 6e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65  name = file_make
146c0 6e 61 6d 65 28 6c 65 6d 70 2c 20 73 75 66 66 69  name(lemp, suffi
146d0 78 29 3b 0a 20 20 66 70 20 3d 20 66 6f 70 65 6e  x);.  fp = fopen
146e0 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 2c 6d  (lemp->outname,m
146f0 6f 64 65 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d  ode);.  if( fp==
14700 30 20 26 26 20 2a 6d 6f 64 65 3d 3d 27 77 27 20  0 && *mode=='w' 
14710 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
14720 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f 70 65  tderr,"Can't ope
14730 6e 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e  n file \"%s\".\n
14740 22 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29  ",lemp->outname)
14750 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  ;.    lemp->erro
14760 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
14770 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
14780 72 6e 20 66 70 3b 0a 7d 0a 0a 2f 2a 20 44 75 70  rn fp;.}../* Dup
14790 6c 69 63 61 74 65 20 74 68 65 20 69 6e 70 75 74  licate the input
147a0 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 63 6f   file without co
147b0 6d 6d 65 6e 74 73 20 61 6e 64 20 77 69 74 68 6f  mments and witho
147c0 75 74 20 61 63 74 69 6f 6e 73 20 0a 2a 2a 20 6f  ut actions .** o
147d0 6e 20 72 75 6c 65 73 20 2a 2f 0a 76 6f 69 64 20  n rules */.void 
147e0 52 65 70 72 69 6e 74 28 6c 65 6d 70 29 0a 73 74  Reprint(lemp).st
147f0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
14800 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ;.{.  struct rul
14810 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20  e *rp;.  struct 
14820 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e  symbol *sp;.  in
14830 74 20 69 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20  t i, j, maxlen, 
14840 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73  len, ncolumns, s
14850 6b 69 70 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f  kip;.  printf("/
14860 2f 20 52 65 70 72 69 6e 74 20 6f 66 20 69 6e 70  / Reprint of inp
14870 75 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c  ut file \"%s\".\
14880 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c  n// Symbols:\n",
14890 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
148a0 0a 20 20 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a  .  maxlen = 10;.
148b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
148c0 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
148d0 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d  {.    sp = lemp-
148e0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
148f0 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 73 70   len = strlen(sp
14900 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  ->name);.    if(
14910 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29 20 6d 61   len>maxlen ) ma
14920 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a  xlen = len;.  }.
14930 20 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 37 36 2f    ncolumns = 76/
14940 28 6d 61 78 6c 65 6e 2b 35 29 3b 0a 20 20 69 66  (maxlen+5);.  if
14950 28 20 6e 63 6f 6c 75 6d 6e 73 3c 31 20 29 20 6e  ( ncolumns<1 ) n
14960 63 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 73  columns = 1;.  s
14970 6b 69 70 20 3d 20 28 6c 65 6d 70 2d 3e 6e 73 79  kip = (lemp->nsy
14980 6d 62 6f 6c 20 2b 20 6e 63 6f 6c 75 6d 6e 73 20  mbol + ncolumns 
14990 2d 20 31 29 2f 6e 63 6f 6c 75 6d 6e 73 3b 0a 20  - 1)/ncolumns;. 
149a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 6b 69 70   for(i=0; i<skip
149b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 72 69 6e  ; i++){.    prin
149c0 74 66 28 22 2f 2f 22 29 3b 0a 20 20 20 20 66 6f  tf("//");.    fo
149d0 72 28 6a 3d 69 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e  r(j=i; j<lemp->n
149e0 73 79 6d 62 6f 6c 3b 20 6a 2b 3d 73 6b 69 70 29  symbol; j+=skip)
149f0 7b 0a 20 20 20 20 20 20 73 70 20 3d 20 6c 65 6d  {.      sp = lem
14a00 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20  p->symbols[j];. 
14a10 20 20 20 20 20 61 73 73 65 72 74 28 20 73 70 2d       assert( sp-
14a20 3e 69 6e 64 65 78 3d 3d 6a 20 29 3b 0a 20 20 20  >index==j );.   
14a30 20 20 20 70 72 69 6e 74 66 28 22 20 25 33 64 20     printf(" %3d 
14a40 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d 61 78 6c 65 6e  %-*.*s",j,maxlen
14a50 2c 6d 61 78 6c 65 6e 2c 73 70 2d 3e 6e 61 6d 65  ,maxlen,sp->name
14a60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  );.    }.    pri
14a70 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
14a80 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
14a90 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
14aa0 65 78 74 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ext){.    printf
14ab0 28 22 25 73 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e  ("%s",rp->lhs->n
14ac0 61 6d 65 29 3b 0a 20 20 20 20 2f 2a 20 20 20 20  ame);.    /*    
14ad0 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  if( rp->lhsalias
14ae0 20 29 20 70 72 69 6e 74 66 28 22 28 25 73 29 22   ) printf("(%s)"
14af0 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 20  ,rp->lhsalias); 
14b00 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20  */.    printf(" 
14b10 3a 3a 3d 22 29 3b 0a 20 20 20 20 66 6f 72 28 69  ::=");.    for(i
14b20 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
14b30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 70 20 3d  i++){.      sp =
14b40 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
14b50 20 20 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c     printf(" %s",
14b60 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
14b70 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
14b80 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
14b90 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 31  .        for(j=1
14ba0 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b  ; j<sp->nsubsym;
14bb0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
14bc0 20 70 72 69 6e 74 66 28 22 7c 25 73 22 2c 20 73   printf("|%s", s
14bd0 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61  p->subsym[j]->na
14be0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
14bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
14c00 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
14c10 5b 69 5d 20 29 20 70 72 69 6e 74 66 28 22 28 25  [i] ) printf("(%
14c20 73 29 22 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  s)",rp->rhsalias
14c30 5b 69 5d 29 3b 20 2a 2f 0a 20 20 20 20 7d 0a 20  [i]); */.    }. 
14c40 20 20 20 70 72 69 6e 74 66 28 22 2e 22 29 3b 0a     printf(".");.
14c50 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63      if( rp->prec
14c60 73 79 6d 20 29 20 70 72 69 6e 74 66 28 22 20 5b  sym ) printf(" [
14c70 25 73 5d 22 2c 72 70 2d 3e 70 72 65 63 73 79 6d  %s]",rp->precsym
14c80 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a 20  ->name);.    /* 
14c90 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 20 70  if( rp->code ) p
14ca0 72 69 6e 74 66 28 22 5c 6e 20 20 20 20 25 73 22  rintf("\n    %s"
14cb0 2c 72 70 2d 3e 63 6f 64 65 29 3b 20 2a 2f 0a 20  ,rp->code); */. 
14cc0 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b     printf("\n");
14cd0 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 43 6f 6e  .  }.}..void Con
14ce0 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70 29  figPrint(fp,cfp)
14cf0 0a 46 49 4c 45 20 2a 66 70 3b 0a 73 74 72 75 63  .FILE *fp;.struc
14d00 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 7b  t config *cfp;.{
14d10 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
14d20 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  rp;.  struct sym
14d30 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69  bol *sp;.  int i
14d40 2c 20 6a 3b 0a 20 20 72 70 20 3d 20 63 66 70 2d  , j;.  rp = cfp-
14d50 3e 72 70 3b 0a 20 20 66 70 72 69 6e 74 66 28 66  >rp;.  fprintf(f
14d60 70 2c 22 25 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c  p,"%s ::=",rp->l
14d70 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  hs->name);.  for
14d80 28 69 3d 30 3b 20 69 3c 3d 72 70 2d 3e 6e 72 68  (i=0; i<=rp->nrh
14d90 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  s; i++){.    if(
14da0 20 69 3d 3d 63 66 70 2d 3e 64 6f 74 20 29 20 66   i==cfp->dot ) f
14db0 70 72 69 6e 74 66 28 66 70 2c 22 20 2a 22 29 3b  printf(fp," *");
14dc0 0a 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e  .    if( i==rp->
14dd0 6e 72 68 73 20 29 20 62 72 65 61 6b 3b 0a 20 20  nrhs ) break;.  
14de0 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69    sp = rp->rhs[i
14df0 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66  ];.    fprintf(f
14e00 70 2c 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d  p," %s", sp->nam
14e10 65 29 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e  e);.    if( sp->
14e20 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
14e30 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  NAL ){.      for
14e40 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62  (j=1; j<sp->nsub
14e50 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  sym; j++){.     
14e60 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 7c     fprintf(fp,"|
14e70 25 73 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6a  %s",sp->subsym[j
14e80 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
14e90 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
14ea0 2a 20 23 64 65 66 69 6e 65 20 54 45 53 54 20 2a  * #define TEST *
14eb0 2f 0a 23 69 66 20 30 0a 2f 2a 20 50 72 69 6e 74  /.#if 0./* Print
14ec0 20 61 20 73 65 74 20 2a 2f 0a 50 52 49 56 41 54   a set */.PRIVAT
14ed0 45 20 76 6f 69 64 20 53 65 74 50 72 69 6e 74 28  E void SetPrint(
14ee0 6f 75 74 2c 73 65 74 2c 6c 65 6d 70 29 0a 46 49  out,set,lemp).FI
14ef0 4c 45 20 2a 6f 75 74 3b 0a 63 68 61 72 20 2a 73  LE *out;.char *s
14f00 65 74 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  et;.struct lemon
14f10 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20   *lemp;.{.  int 
14f20 69 3b 0a 20 20 63 68 61 72 20 2a 73 70 61 63 65  i;.  char *space
14f30 72 3b 0a 20 20 73 70 61 63 65 72 20 3d 20 22 22  r;.  spacer = ""
14f40 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
14f50 22 25 31 32 73 5b 22 2c 22 22 29 3b 0a 20 20 66  "%12s[","");.  f
14f60 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
14f70 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b  nterminal; i++){
14f80 0a 20 20 20 20 69 66 28 20 53 65 74 46 69 6e 64  .    if( SetFind
14f90 28 73 65 74 2c 69 29 20 29 7b 0a 20 20 20 20 20  (set,i) ){.     
14fa0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73   fprintf(out,"%s
14fb0 25 73 22 2c 73 70 61 63 65 72 2c 6c 65 6d 70 2d  %s",spacer,lemp-
14fc0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d  >symbols[i]->nam
14fd0 65 29 3b 0a 20 20 20 20 20 20 73 70 61 63 65 72  e);.      spacer
14fe0 20 3d 20 22 20 22 3b 0a 20 20 20 20 7d 0a 20 20   = " ";.    }.  
14ff0 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
15000 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72  "]\n");.}../* Pr
15010 69 6e 74 20 61 20 70 6c 69 6e 6b 20 63 68 61 69  int a plink chai
15020 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  n */.PRIVATE voi
15030 64 20 50 6c 69 6e 6b 50 72 69 6e 74 28 6f 75 74  d PlinkPrint(out
15040 2c 70 6c 70 2c 74 61 67 29 0a 46 49 4c 45 20 2a  ,plp,tag).FILE *
15050 6f 75 74 3b 0a 73 74 72 75 63 74 20 70 6c 69 6e  out;.struct plin
15060 6b 20 2a 70 6c 70 3b 0a 63 68 61 72 20 2a 74 61  k *plp;.char *ta
15070 67 3b 0a 7b 0a 20 20 77 68 69 6c 65 28 20 70 6c  g;.{.  while( pl
15080 70 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  p ){.    fprintf
15090 28 6f 75 74 2c 22 25 31 32 73 25 73 20 28 73 74  (out,"%12s%s (st
150a0 61 74 65 20 25 32 64 29 20 22 2c 22 22 2c 74 61  ate %2d) ","",ta
150b0 67 2c 70 6c 70 2d 3e 63 66 70 2d 3e 73 74 70 2d  g,plp->cfp->stp-
150c0 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20  >statenum);.    
150d0 43 6f 6e 66 69 67 50 72 69 6e 74 28 6f 75 74 2c  ConfigPrint(out,
150e0 70 6c 70 2d 3e 63 66 70 29 3b 0a 20 20 20 20 66  plp->cfp);.    f
150f0 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29  printf(out,"\n")
15100 3b 0a 20 20 20 20 70 6c 70 20 3d 20 70 6c 70 2d  ;.    plp = plp-
15110 3e 6e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  >next;.  }.}.#en
15120 64 69 66 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 6e  dif../* Print an
15130 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 67   action to the g
15140 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
15150 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 46 41  ptor.  Return FA
15160 4c 53 45 20 69 66 0a 2a 2a 20 6e 6f 74 68 69 6e  LSE if.** nothin
15170 67 20 77 61 73 20 61 63 74 75 61 6c 6c 79 20 70  g was actually p
15180 72 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 50  rinted..*/.int P
15190 72 69 6e 74 41 63 74 69 6f 6e 28 73 74 72 75 63  rintAction(struc
151a0 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 46 49  t action *ap, FI
151b0 4c 45 20 2a 66 70 2c 20 69 6e 74 20 69 6e 64 65  LE *fp, int inde
151c0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 65 73 75 6c  nt){.  int resul
151d0 74 20 3d 20 31 3b 0a 20 20 73 77 69 74 63 68 28  t = 1;.  switch(
151e0 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20   ap->type ){.   
151f0 20 63 61 73 65 20 53 48 49 46 54 3a 0a 20 20 20   case SHIFT:.   
15200 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
15210 2a 73 20 73 68 69 66 74 20 20 25 64 22 2c 69 6e  *s shift  %d",in
15220 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
15230 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61  e,ap->x.stp->sta
15240 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72  tenum);.      br
15250 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45  eak;.    case RE
15260 44 55 43 45 3a 0a 20 20 20 20 20 20 66 70 72 69  DUCE:.      fpri
15270 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75  ntf(fp,"%*s redu
15280 63 65 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70  ce %d",indent,ap
15290 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78  ->sp->name,ap->x
152a0 2e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  .rp->index);.   
152b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
152c0 73 65 20 41 43 43 45 50 54 3a 0a 20 20 20 20 20  se ACCEPT:.     
152d0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
152e0 20 61 63 63 65 70 74 22 2c 69 6e 64 65 6e 74 2c   accept",indent,
152f0 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  ap->sp->name);. 
15300 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15310 63 61 73 65 20 45 52 52 4f 52 3a 0a 20 20 20 20  case ERROR:.    
15320 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
15330 73 20 65 72 72 6f 72 22 2c 69 6e 64 65 6e 74 2c  s error",indent,
15340 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  ap->sp->name);. 
15350 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15360 63 61 73 65 20 53 52 43 4f 4e 46 4c 49 43 54 3a  case SRCONFLICT:
15370 0a 20 20 20 20 63 61 73 65 20 52 52 43 4f 4e 46  .    case RRCONF
15380 4c 49 43 54 3a 0a 20 20 20 20 20 20 66 70 72 69  LICT:.      fpri
15390 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75  ntf(fp,"%*s redu
153a0 63 65 20 25 2d 33 64 20 2a 2a 20 50 61 72 73 69  ce %-3d ** Parsi
153b0 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a 22 2c  ng conflict **",
153c0 0a 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74 2c  .        indent,
153d0 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d  ap->sp->name,ap-
153e0 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20  >x.rp->index);. 
153f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15400 63 61 73 65 20 53 53 43 4f 4e 46 4c 49 43 54 3a  case SSCONFLICT:
15410 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
15420 70 2c 22 25 2a 73 20 73 68 69 66 74 20 20 25 64  p,"%*s shift  %d
15430 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66   ** Parsing conf
15440 6c 69 63 74 20 2a 2a 22 2c 20 0a 20 20 20 20 20  lict **", .     
15450 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70     indent,ap->sp
15460 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70  ->name,ap->x.stp
15470 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20  ->statenum);.   
15480 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
15490 73 65 20 53 48 5f 52 45 53 4f 4c 56 45 44 3a 0a  se SH_RESOLVED:.
154a0 20 20 20 20 63 61 73 65 20 52 44 5f 52 45 53 4f      case RD_RESO
154b0 4c 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20 4e  LVED:.    case N
154c0 4f 54 5f 55 53 45 44 3a 0a 20 20 20 20 20 20 72  OT_USED:.      r
154d0 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20  esult = 0;.     
154e0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
154f0 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a  turn result;.}..
15500 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
15510 22 79 2e 6f 75 74 70 75 74 22 20 6c 6f 67 20 66  "y.output" log f
15520 69 6c 65 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f  ile */.void Repo
15530 72 74 4f 75 74 70 75 74 28 6c 65 6d 70 29 0a 73  rtOutput(lemp).s
15540 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
15550 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p;.{.  int i;.  
15560 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
15570 70 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  p;.  struct conf
15580 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63  ig *cfp;.  struc
15590 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20  t action *ap;.  
155a0 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 66 70 20  FILE *fp;..  fp 
155b0 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70  = file_open(lemp
155c0 2c 22 2e 6f 75 74 22 2c 22 77 62 22 29 3b 0a 20  ,".out","wb");. 
155d0 20 69 66 28 20 66 70 3d 3d 30 20 29 20 72 65 74   if( fp==0 ) ret
155e0 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
155f0 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
15600 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
15610 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
15620 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
15630 22 53 74 61 74 65 20 25 64 3a 5c 6e 22 2c 73 74  "State %d:\n",st
15640 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20  p->statenum);.  
15650 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61 73 69    if( lemp->basi
15660 73 66 6c 61 67 20 29 20 63 66 70 3d 73 74 70 2d  sflag ) cfp=stp-
15670 3e 62 70 3b 0a 20 20 20 20 65 6c 73 65 20 20 20  >bp;.    else   
15680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
15690 66 70 3d 73 74 70 2d 3e 63 66 70 3b 0a 20 20 20  fp=stp->cfp;.   
156a0 20 77 68 69 6c 65 28 20 63 66 70 20 29 7b 0a 20   while( cfp ){. 
156b0 20 20 20 20 20 63 68 61 72 20 62 75 66 5b 32 30       char buf[20
156c0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 66 70  ];.      if( cfp
156d0 2d 3e 64 6f 74 3d 3d 63 66 70 2d 3e 72 70 2d 3e  ->dot==cfp->rp->
156e0 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  nrhs ){.        
156f0 73 70 72 69 6e 74 66 28 62 75 66 2c 22 28 25 64  sprintf(buf,"(%d
15700 29 22 2c 63 66 70 2d 3e 72 70 2d 3e 69 6e 64 65  )",cfp->rp->inde
15710 78 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69  x);.        fpri
15720 6e 74 66 28 66 70 2c 22 20 20 20 20 25 35 73 20  ntf(fp,"    %5s 
15730 22 2c 62 75 66 29 3b 0a 20 20 20 20 20 20 7d 65  ",buf);.      }e
15740 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72  lse{.        fpr
15750 69 6e 74 66 28 66 70 2c 22 20 20 20 20 20 20 20  intf(fp,"       
15760 20 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20     ");.      }. 
15770 20 20 20 20 20 43 6f 6e 66 69 67 50 72 69 6e 74       ConfigPrint
15780 28 66 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20  (fp,cfp);.      
15790 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29  fprintf(fp,"\n")
157a0 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 53 65  ;.#if 0.      Se
157b0 74 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66  tPrint(fp,cfp->f
157c0 77 73 2c 6c 65 6d 70 29 3b 0a 20 20 20 20 20 20  ws,lemp);.      
157d0 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66  PlinkPrint(fp,cf
157e0 70 2d 3e 66 70 6c 70 2c 22 54 6f 20 20 22 29 3b  p->fplp,"To  ");
157f0 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e  .      PlinkPrin
15800 74 28 66 70 2c 63 66 70 2d 3e 62 70 6c 70 2c 22  t(fp,cfp->bplp,"
15810 46 72 6f 6d 22 29 3b 0a 23 65 6e 64 69 66 0a 20  From");.#endif. 
15820 20 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62       if( lemp->b
15830 61 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d 63  asisflag ) cfp=c
15840 66 70 2d 3e 62 70 3b 0a 20 20 20 20 20 20 65 6c  fp->bp;.      el
15850 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
15860 20 20 20 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78      cfp=cfp->nex
15870 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  t;.    }.    fpr
15880 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20  intf(fp,"\n");. 
15890 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
158a0 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
158b0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50  xt){.      if( P
158c0 72 69 6e 74 41 63 74 69 6f 6e 28 61 70 2c 66 70  rintAction(ap,fp
158d0 2c 33 30 29 20 29 20 66 70 72 69 6e 74 66 28 66  ,30) ) fprintf(f
158e0 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20  p,"\n");.    }. 
158f0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c     fprintf(fp,"\
15900 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  n");.  }.  fprin
15910 74 66 28 66 70 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d  tf(fp, "--------
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 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29  ------------\n")
15950 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20  ;.  fprintf(fp, 
15960 22 53 79 6d 62 6f 6c 73 3a 5c 6e 22 29 3b 0a 20  "Symbols:\n");. 
15970 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
15980 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
15990 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
159a0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
159b0 70 3b 0a 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d  p;..    sp = lem
159c0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
159d0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22     fprintf(fp, "
159e0 20 20 25 33 64 3a 20 25 73 22 2c 20 69 2c 20 73    %3d: %s", i, s
159f0 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  p->name);.    if
15a00 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54  ( sp->type==NONT
15a10 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
15a20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 3a 22   fprintf(fp, ":"
15a30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d  );.      if( sp-
15a40 3e 6c 61 6d 62 64 61 20 29 7b 0a 20 20 20 20 20  >lambda ){.     
15a50 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22     fprintf(fp, "
15a60 20 3c 6c 61 6d 62 64 61 3e 22 29 3b 0a 20 20 20   <lambda>");.   
15a70 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
15a80 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =0; j<lemp->nter
15a90 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  minal; j++){.   
15aa0 20 20 20 20 20 69 66 28 20 73 70 2d 3e 66 69 72       if( sp->fir
15ab0 73 74 73 65 74 20 26 26 20 53 65 74 46 69 6e 64  stset && SetFind
15ac0 28 73 70 2d 3e 66 69 72 73 74 73 65 74 2c 20 6a  (sp->firstset, j
15ad0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ) ){.          f
15ae0 70 72 69 6e 74 66 28 66 70 2c 20 22 20 25 73 22  printf(fp, " %s"
15af0 2c 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  , lemp->symbols[
15b00 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  j]->name);.     
15b10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
15b20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66   }.    fprintf(f
15b30 70 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  p, "\n");.  }.  
15b40 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 72 65  fclose(fp);.  re
15b50 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 61 72  turn;.}../* Sear
15b60 63 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  ch for the file 
15b70 22 6e 61 6d 65 22 20 77 68 69 63 68 20 69 73 20  "name" which is 
15b80 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
15b90 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65 20  ctory as.** the 
15ba0 65 78 61 63 75 74 61 62 6c 65 20 2a 2f 0a 50 52  exacutable */.PR
15bb0 49 56 41 54 45 20 63 68 61 72 20 2a 70 61 74 68  IVATE char *path
15bc0 73 65 61 72 63 68 28 61 72 67 76 30 2c 6e 61 6d  search(argv0,nam
15bd0 65 2c 6d 6f 64 65 6d 61 73 6b 29 0a 63 68 61 72  e,modemask).char
15be0 20 2a 61 72 67 76 30 3b 0a 63 68 61 72 20 2a 6e   *argv0;.char *n
15bf0 61 6d 65 3b 0a 69 6e 74 20 6d 6f 64 65 6d 61 73  ame;.int modemas
15c00 6b 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 70 61 74  k;.{.  char *pat
15c10 68 6c 69 73 74 3b 0a 20 20 63 68 61 72 20 2a 70  hlist;.  char *p
15c20 61 74 68 2c 2a 63 70 3b 0a 20 20 63 68 61 72 20  ath,*cp;.  char 
15c30 63 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e  c;..#ifdef __WIN
15c40 33 32 5f 5f 0a 20 20 63 70 20 3d 20 73 74 72 72  32__.  cp = strr
15c50 63 68 72 28 61 72 67 76 30 2c 27 5c 5c 27 29 3b  chr(argv0,'\\');
15c60 0a 23 65 6c 73 65 0a 20 20 63 70 20 3d 20 73 74  .#else.  cp = st
15c70 72 72 63 68 72 28 61 72 67 76 30 2c 27 2f 27 29  rrchr(argv0,'/')
15c80 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 63  ;.#endif.  if( c
15c90 70 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 63 70  p ){.    c = *cp
15ca0 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20  ;.    *cp = 0;. 
15cb0 20 20 20 70 61 74 68 20 3d 20 28 63 68 61 72 20     path = (char 
15cc0 2a 29 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e  *)malloc( strlen
15cd0 28 61 72 67 76 30 29 20 2b 20 73 74 72 6c 65 6e  (argv0) + strlen
15ce0 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b 0a 20 20  (name) + 2 );.  
15cf0 20 20 69 66 28 20 70 61 74 68 20 29 20 73 70 72    if( path ) spr
15d00 69 6e 74 66 28 70 61 74 68 2c 22 25 73 2f 25 73  intf(path,"%s/%s
15d10 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29 3b 0a 20  ",argv0,name);. 
15d20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 7d 65     *cp = c;.  }e
15d30 6c 73 65 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  lse{.    extern 
15d40 63 68 61 72 20 2a 67 65 74 65 6e 76 28 29 3b 0a  char *getenv();.
15d50 20 20 20 20 70 61 74 68 6c 69 73 74 20 3d 20 67      pathlist = g
15d60 65 74 65 6e 76 28 22 50 41 54 48 22 29 3b 0a 20  etenv("PATH");. 
15d70 20 20 20 69 66 28 20 70 61 74 68 6c 69 73 74 3d     if( pathlist=
15d80 3d 30 20 29 20 70 61 74 68 6c 69 73 74 20 3d 20  =0 ) pathlist = 
15d90 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f 62 69 6e  ".:/bin:/usr/bin
15da0 22 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63  ";.    path = (c
15db0 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 74  har *)malloc( st
15dc0 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 2b 73  rlen(pathlist)+s
15dd0 74 72 6c 65 6e 28 6e 61 6d 65 29 2b 32 20 29 3b  trlen(name)+2 );
15de0 0a 20 20 20 20 69 66 28 20 70 61 74 68 21 3d 30  .    if( path!=0
15df0 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
15e00 20 2a 70 61 74 68 6c 69 73 74 20 29 7b 0a 20 20   *pathlist ){.  
15e10 20 20 20 20 20 20 63 70 20 3d 20 73 74 72 63 68        cp = strch
15e20 72 28 70 61 74 68 6c 69 73 74 2c 27 3a 27 29 3b  r(pathlist,':');
15e30 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 70 3d  .        if( cp=
15e40 3d 30 20 29 20 63 70 20 3d 20 26 70 61 74 68 6c  =0 ) cp = &pathl
15e50 69 73 74 5b 73 74 72 6c 65 6e 28 70 61 74 68 6c  ist[strlen(pathl
15e60 69 73 74 29 5d 3b 0a 20 20 20 20 20 20 20 20 63  ist)];.        c
15e70 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20 20 20   = *cp;.        
15e80 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  *cp = 0;.       
15e90 20 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25   sprintf(path,"%
15ea0 73 2f 25 73 22 2c 70 61 74 68 6c 69 73 74 2c 6e  s/%s",pathlist,n
15eb0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 63  ame);.        *c
15ec0 70 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 69  p = c;.        i
15ed0 66 28 20 63 3d 3d 30 20 29 20 70 61 74 68 6c 69  f( c==0 ) pathli
15ee0 73 74 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20  st = "";.       
15ef0 20 65 6c 73 65 20 70 61 74 68 6c 69 73 74 20 3d   else pathlist =
15f00 20 26 63 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20   &cp[1];.       
15f10 20 69 66 28 20 61 63 63 65 73 73 28 70 61 74 68   if( access(path
15f20 2c 6d 6f 64 65 6d 61 73 6b 29 3d 3d 30 20 29 20  ,modemask)==0 ) 
15f30 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
15f40 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
15f50 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47 69  n path;.}../* Gi
15f60 76 65 6e 20 61 6e 20 61 63 74 69 6f 6e 2c 20 63  ven an action, c
15f70 6f 6d 70 75 74 65 20 74 68 65 20 69 6e 74 65 67  ompute the integ
15f80 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68 61  er value for tha
15f90 74 20 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63  t action.** whic
15fa0 68 20 69 73 20 74 6f 20 62 65 20 70 75 74 20 69  h is to be put i
15fb0 6e 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  n the action tab
15fc0 6c 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61  le of the genera
15fd0 74 65 64 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20  ted machine..** 
15fe0 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20  Return negative 
15ff0 69 66 20 6e 6f 20 61 63 74 69 6f 6e 20 73 68 6f  if no action sho
16000 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74 65 64  uld be generated
16010 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74  ..*/.PRIVATE int
16020 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28   compute_action(
16030 6c 65 6d 70 2c 61 70 29 0a 73 74 72 75 63 74 20  lemp,ap).struct 
16040 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73 74 72  lemon *lemp;.str
16050 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
16060 7b 0a 20 20 69 6e 74 20 61 63 74 3b 0a 20 20 73  {.  int act;.  s
16070 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65 20  witch( ap->type 
16080 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49 46  ){.    case SHIF
16090 54 3a 20 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e  T:  act = ap->x.
160a0 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 3b 20 20  stp->statenum;  
160b0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
160c0 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43 45  .    case REDUCE
160d0 3a 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 72 70  : act = ap->x.rp
160e0 2d 3e 69 6e 64 65 78 20 2b 20 6c 65 6d 70 2d 3e  ->index + lemp->
160f0 6e 73 74 61 74 65 3b 20 62 72 65 61 6b 3b 0a 20  nstate; break;. 
16100 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a 20 20     case ERROR:  
16110 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  act = lemp->nsta
16120 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  te + lemp->nrule
16130 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
16140 20 63 61 73 65 20 41 43 43 45 50 54 3a 20 61 63   case ACCEPT: ac
16150 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  t = lemp->nstate
16160 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b   + lemp->nrule +
16170 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64   1; break;.    d
16180 65 66 61 75 6c 74 3a 20 20 20 20 20 61 63 74 20  efault:     act 
16190 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20 20 7d  = -1; break;.  }
161a0 0a 20 20 72 65 74 75 72 6e 20 61 63 74 3b 0a 7d  .  return act;.}
161b0 0a 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 53 49  ..#define LINESI
161c0 5a 45 20 31 30 30 30 0a 2f 2a 20 54 68 65 20 6e  ZE 1000./* The n
161d0 65 78 74 20 63 6c 75 73 74 65 72 20 6f 66 20 72  ext cluster of r
161e0 6f 75 74 69 6e 65 73 20 61 72 65 20 66 6f 72 20  outines are for 
161f0 72 65 61 64 69 6e 67 20 74 68 65 20 74 65 6d 70  reading the temp
16200 6c 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  late file.** and
16210 20 77 72 69 74 69 6e 67 20 74 68 65 20 72 65 73   writing the res
16220 75 6c 74 73 20 74 6f 20 74 68 65 20 67 65 6e 65  ults to the gene
16230 72 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a  rated parser */.
16240 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 75 6e  /* The first fun
16250 63 74 69 6f 6e 20 74 72 61 6e 73 66 65 72 73 20  ction transfers 
16260 64 61 74 61 20 66 72 6f 6d 20 22 69 6e 22 20 74  data from "in" t
16270 6f 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a 2a 2a  o "out" until.**
16280 20 61 20 6c 69 6e 65 20 69 73 20 73 65 65 6e 20   a line is seen 
16290 77 68 69 63 68 20 62 65 67 69 6e 73 20 77 69 74  which begins wit
162a0 68 20 22 25 25 22 2e 20 20 54 68 65 20 6c 69 6e  h "%%".  The lin
162b0 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 74  e number is.** t
162c0 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 66  racked..**.** if
162d0 20 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e 20 61   name!=0, then a
162e0 6e 79 20 77 6f 72 64 20 74 68 61 74 20 62 65 67  ny word that beg
162f0 69 6e 20 77 69 74 68 20 22 50 61 72 73 65 22 20  in with "Parse" 
16300 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 2a 2a  is changed to.**
16310 20 62 65 67 69 6e 20 77 69 74 68 20 2a 6e 61 6d   begin with *nam
16320 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50 52  e instead..*/.PR
16330 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f  IVATE void tplt_
16340 78 66 65 72 28 6e 61 6d 65 2c 69 6e 2c 6f 75 74  xfer(name,in,out
16350 2c 6c 69 6e 65 6e 6f 29 0a 63 68 61 72 20 2a 6e  ,lineno).char *n
16360 61 6d 65 3b 0a 46 49 4c 45 20 2a 69 6e 3b 0a 46  ame;.FILE *in;.F
16370 49 4c 45 20 2a 6f 75 74 3b 0a 69 6e 74 20 2a 6c  ILE *out;.int *l
16380 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 6e 74 20 69  ineno;.{.  int i
16390 2c 20 69 53 74 61 72 74 3b 0a 20 20 63 68 61 72  , iStart;.  char
163a0 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b   line[LINESIZE];
163b0 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28  .  while( fgets(
163c0 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e  line,LINESIZE,in
163d0 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d 21 3d 27  ) && (line[0]!='
163e0 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21 3d 27  %' || line[1]!='
163f0 25 27 29 20 29 7b 0a 20 20 20 20 28 2a 6c 69 6e  %') ){.    (*lin
16400 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69 53 74 61  eno)++;.    iSta
16410 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  rt = 0;.    if( 
16420 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 66 6f  name ){.      fo
16430 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d 3b 20  r(i=0; line[i]; 
16440 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
16450 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27 20 26  ( line[i]=='P' &
16460 26 20 73 74 72 6e 63 6d 70 28 26 6c 69 6e 65 5b  & strncmp(&line[
16470 69 5d 2c 22 50 61 72 73 65 22 2c 35 29 3d 3d 30  i],"Parse",5)==0
16480 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69  .          && (i
16490 3d 3d 30 20 7c 7c 20 21 69 73 61 6c 70 68 61 28  ==0 || !isalpha(
164a0 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20 20 20 20  line[i-1])).    
164b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
164c0 20 69 66 28 20 69 3e 69 53 74 61 72 74 20 29 20   if( i>iStart ) 
164d0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a  fprintf(out,"%.*
164e0 73 22 2c 69 2d 69 53 74 61 72 74 2c 26 6c 69 6e  s",i-iStart,&lin
164f0 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 20 20  e[iStart]);.    
16500 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
16510 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b 0a 20 20  t,"%s",name);.  
16520 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a          i += 4;.
16530 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74            iStart
16540 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20 20   = i+1;.        
16550 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
16560 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
16570 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53 74 61 72  "%s",&line[iStar
16580 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 54  t]);.  }.}../* T
16590 68 65 20 6e 65 78 74 20 66 75 6e 63 74 69 6f 6e  he next function
165a0 20 66 69 6e 64 73 20 74 68 65 20 74 65 6d 70 6c   finds the templ
165b0 61 74 65 20 66 69 6c 65 20 61 6e 64 20 6f 70 65  ate file and ope
165c0 6e 73 20 69 74 2c 20 72 65 74 75 72 6e 69 6e 67  ns it, returning
165d0 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
165e0 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65   the opened file
165f0 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49 4c  . */.PRIVATE FIL
16600 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d  E *tplt_open(lem
16610 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
16620 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 61 74 69  *lemp;.{.  stati
16630 63 20 63 68 61 72 20 74 65 6d 70 6c 61 74 65 6e  c char templaten
16640 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70 61 72 2e  ame[] = "lempar.
16650 63 22 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 31  c";.  char buf[1
16660 30 30 30 5d 3b 0a 20 20 46 49 4c 45 20 2a 69 6e  000];.  FILE *in
16670 3b 0a 20 20 63 68 61 72 20 2a 74 70 6c 74 6e 61  ;.  char *tpltna
16680 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a  me;.  char *cp;.
16690 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72 28  .  cp = strrchr(
166a0 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 27  lemp->filename,'
166b0 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29 7b  .');.  if( cp ){
166c0 0a 20 20 20 20 73 70 72 69 6e 74 66 28 62 75 66  .    sprintf(buf
166d0 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e 74 29  ,"%.*s.lt",(int)
166e0 28 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  (cp-lemp->filena
166f0 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  me),lemp->filena
16700 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
16710 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c 22 25    sprintf(buf,"%
16720 73 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65  s.lt",lemp->file
16730 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  name);.  }.  if(
16740 20 61 63 63 65 73 73 28 62 75 66 2c 30 30 34 29   access(buf,004)
16750 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e  ==0 ){.    tpltn
16760 61 6d 65 20 3d 20 62 75 66 3b 0a 20 20 7d 65 6c  ame = buf;.  }el
16770 73 65 20 69 66 28 20 61 63 63 65 73 73 28 74 65  se if( access(te
16780 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29 3d  mplatename,004)=
16790 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e 61  =0 ){.    tpltna
167a0 6d 65 20 3d 20 74 65 6d 70 6c 61 74 65 6e 61 6d  me = templatenam
167b0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
167c0 74 70 6c 74 6e 61 6d 65 20 3d 20 70 61 74 68 73  tpltname = paths
167d0 65 61 72 63 68 28 6c 65 6d 70 2d 3e 61 72 67 76  earch(lemp->argv
167e0 30 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30  0,templatename,0
167f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 70 6c  );.  }.  if( tpl
16800 74 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  tname==0 ){.    
16810 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
16820 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65 20 70  Can't find the p
16830 61 72 73 65 72 20 64 72 69 76 65 72 20 74 65 6d  arser driver tem
16840 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c  plate file \"%s\
16850 22 2e 5c 6e 22 2c 0a 20 20 20 20 74 65 6d 70 6c  ".\n",.    templ
16860 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65  atename);.    le
16870 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
16880 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16890 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 74  }.  in = fopen(t
168a0 70 6c 74 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20  pltname,"rb");. 
168b0 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
168c0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
168d0 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 65  ,"Can't open the
168e0 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c   template file \
168f0 22 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70 6c 61  "%s\".\n",templa
16900 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d  tename);.    lem
16910 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
16920 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
16930 0a 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a 7d 0a  .  return in;.}.
16940 0a 2f 2a 20 50 72 69 6e 74 20 61 20 23 6c 69 6e  ./* Print a #lin
16950 65 20 64 69 72 65 63 74 69 76 65 20 6c 69 6e 65  e directive line
16960 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 66   to the output f
16970 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20  ile. */.PRIVATE 
16980 76 6f 69 64 20 74 70 6c 74 5f 6c 69 6e 65 64 69  void tplt_linedi
16990 72 28 6f 75 74 2c 6c 69 6e 65 6e 6f 2c 66 69 6c  r(out,lineno,fil
169a0 65 6e 61 6d 65 29 0a 46 49 4c 45 20 2a 6f 75 74  ename).FILE *out
169b0 3b 0a 69 6e 74 20 6c 69 6e 65 6e 6f 3b 0a 63 68  ;.int lineno;.ch
169c0 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 0a 7b 0a  ar *filename;.{.
169d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
169e0 6c 69 6e 65 20 25 64 20 5c 22 22 2c 6c 69 6e 65  line %d \"",line
169f0 6e 6f 29 3b 0a 20 20 77 68 69 6c 65 28 20 2a 66  no);.  while( *f
16a00 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69  ilename ){.    i
16a10 66 28 20 2a 66 69 6c 65 6e 61 6d 65 20 3d 3d 20  f( *filename == 
16a20 27 5c 5c 27 20 29 20 70 75 74 63 28 27 5c 5c 27  '\\' ) putc('\\'
16a30 2c 6f 75 74 29 3b 0a 20 20 20 20 70 75 74 63 28  ,out);.    putc(
16a40 2a 66 69 6c 65 6e 61 6d 65 2c 6f 75 74 29 3b 0a  *filename,out);.
16a50 20 20 20 20 66 69 6c 65 6e 61 6d 65 2b 2b 3b 0a      filename++;.
16a60 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
16a70 74 2c 22 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a  t,"\"\n");.}../*
16a80 20 50 72 69 6e 74 20 61 20 73 74 72 69 6e 67 20   Print a string 
16a90 74 6f 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  to the file and 
16aa0 6b 65 65 70 20 74 68 65 20 6c 69 6e 65 6e 75 6d  keep the linenum
16ab0 62 65 72 20 75 70 20 74 6f 20 64 61 74 65 20 2a  ber up to date *
16ac0 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 74  /.PRIVATE void t
16ad0 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
16ae0 6d 70 2c 73 74 72 2c 6c 69 6e 65 6e 6f 29 0a 46  mp,str,lineno).F
16af0 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74  ILE *out;.struct
16b00 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 63 68   lemon *lemp;.ch
16b10 61 72 20 2a 73 74 72 3b 0a 69 6e 74 20 2a 6c 69  ar *str;.int *li
16b20 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 66 28 20 73 74  neno;.{.  if( st
16b30 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
16b40 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
16b50 77 68 69 6c 65 28 20 2a 73 74 72 20 29 7b 0a 20  while( *str ){. 
16b60 20 20 20 69 66 28 20 2a 73 74 72 3d 3d 27 5c 6e     if( *str=='\n
16b70 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ' ) (*lineno)++;
16b80 0a 20 20 20 20 70 75 74 63 28 2a 73 74 72 2c 6f  .    putc(*str,o
16b90 75 74 29 3b 0a 20 20 20 20 73 74 72 2b 2b 3b 0a  ut);.    str++;.
16ba0 20 20 7d 0a 20 20 69 66 28 20 73 74 72 5b 2d 31    }.  if( str[-1
16bb0 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 70  ]!='\n' ){.    p
16bc0 75 74 63 28 27 5c 6e 27 2c 6f 75 74 29 3b 0a 20  utc('\n',out);. 
16bd0 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a     (*lineno)++;.
16be0 20 20 7d 0a 20 20 74 70 6c 74 5f 6c 69 6e 65 64    }.  tplt_lined
16bf0 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2b 32  ir(out,*lineno+2
16c00 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b  ,lemp->outname);
16c10 20 0a 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 3d 32   .  (*lineno)+=2
16c20 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
16c30 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
16c40 6e 67 20 72 6f 75 74 69 6e 65 20 65 6d 69 74 73  ng routine emits
16c50 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65   code for the de
16c60 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
16c70 0a 2a 2a 20 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f  .** symbol sp.*/
16c80 0a 76 6f 69 64 20 65 6d 69 74 5f 64 65 73 74 72  .void emit_destr
16c90 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 73  uctor_code(out,s
16ca0 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f 29 0a 46  p,lemp,lineno).F
16cb0 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74  ILE *out;.struct
16cc0 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 73 74 72   symbol *sp;.str
16cd0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
16ce0 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a  .int *lineno;.{.
16cf0 20 63 68 61 72 20 2a 63 70 20 3d 20 30 3b 0a 0a   char *cp = 0;..
16d00 20 69 6e 74 20 6c 69 6e 65 63 6e 74 20 3d 20 30   int linecnt = 0
16d10 3b 0a 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d  ;. if( sp->type=
16d20 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  =TERMINAL ){.   
16d30 63 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  cp = lemp->token
16d40 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70 3d  dest;.   if( cp=
16d50 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
16d60 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e  fprintf(out,"{\n
16d70 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
16d80 0a 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e  . }else if( sp->
16d90 64 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  destructor ){.  
16da0 20 63 70 20 3d 20 73 70 2d 3e 64 65 73 74 72 75   cp = sp->destru
16db0 63 74 6f 72 3b 0a 20 20 20 66 70 72 69 6e 74 66  ctor;.   fprintf
16dc0 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c  (out,"{\n"); (*l
16dd0 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65  ineno)++;. }else
16de0 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65   if( lemp->varde
16df0 73 74 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65  st ){.   cp = le
16e00 6d 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20  mp->vardest;.   
16e10 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75  if( cp==0 ) retu
16e20 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f  rn;.   fprintf(o
16e30 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e  ut,"{\n"); (*lin
16e40 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65 7b 0a  eno)++;. }else{.
16e50 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20     assert( 0 ); 
16e60 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65   /* Cannot happe
16e70 6e 20 2a 2f 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a  n */. }. for(; *
16e80 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66  cp; cp++){.   if
16e90 28 20 2a 63 70 3d 3d 27 24 27 20 26 26 20 63 70  ( *cp=='$' && cp
16ea0 5b 31 5d 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20  [1]=='$' ){.    
16eb0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 79   fprintf(out,"(y
16ec0 79 70 6d 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c  ypminor->yy%d)",
16ed0 73 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20  sp->dtnum);.    
16ee0 20 63 70 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74   cp++;.     cont
16ef0 69 6e 75 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66  inue;.   }.   if
16f00 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 6c 69  ( *cp=='\n' ) li
16f10 6e 65 63 6e 74 2b 2b 3b 0a 20 20 20 66 70 75 74  necnt++;.   fput
16f20 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20  c(*cp,out);. }. 
16f30 28 2a 6c 69 6e 65 6e 6f 29 20 2b 3d 20 33 20 2b  (*lineno) += 3 +
16f40 20 6c 69 6e 65 63 6e 74 3b 0a 20 66 70 72 69 6e   linecnt;. fprin
16f50 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 74  tf(out,"\n");. t
16f60 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c  plt_linedir(out,
16f70 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75  *lineno,lemp->ou
16f80 74 6e 61 6d 65 29 3b 0a 20 66 70 72 69 6e 74 66  tname);. fprintf
16f90 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 0a 20 72 65  (out,"}\n");. re
16fa0 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  turn;.}../*.** R
16fb0 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d  eturn TRUE (non-
16fc0 7a 65 72 6f 29 20 69 66 20 74 68 65 20 67 69 76  zero) if the giv
16fd0 65 6e 20 73 79 6d 62 6f 6c 20 68 61 73 20 61 20  en symbol has a 
16fe0 64 65 73 74 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69  destructor..*/.i
16ff0 6e 74 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f  nt has_destructo
17000 72 28 73 70 2c 20 6c 65 6d 70 29 0a 73 74 72 75  r(sp, lemp).stru
17010 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 73  ct symbol *sp;.s
17020 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
17030 70 3b 0a 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a  p;.{.  int ret;.
17040 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
17050 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
17060 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65  ret = lemp->toke
17070 6e 64 65 73 74 21 3d 30 3b 0a 20 20 7d 65 6c 73  ndest!=0;.  }els
17080 65 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c 65 6d  e{.    ret = lem
17090 70 2d 3e 76 61 72 64 65 73 74 21 3d 30 20 7c 7c  p->vardest!=0 ||
170a0 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21   sp->destructor!
170b0 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  =0;.  }.  return
170c0 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   ret;.}../*.** A
170d0 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61 20  ppend text to a 
170e0 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
170f0 63 61 74 65 64 20 73 74 72 69 6e 67 2e 20 20 49  cated string.  I
17100 66 20 7a 54 65 78 74 20 69 73 20 30 20 74 68 65  f zText is 0 the
17110 6e 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 73  n.** reset the s
17120 74 72 69 6e 67 20 74 6f 20 62 65 20 65 6d 70 74  tring to be empt
17130 79 20 61 67 61 69 6e 2e 20 20 41 6c 77 61 79 73  y again.  Always
17140 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6d 70   return the comp
17150 6c 65 74 65 20 74 65 78 74 0a 2a 2a 20 6f 66 20  lete text.** of 
17160 74 68 65 20 73 74 72 69 6e 67 20 28 77 68 69 63  the string (whic
17170 68 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  h is overwritten
17180 20 77 69 74 68 20 65 61 63 68 20 63 61 6c 6c 29   with each call)
17190 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62 79 74 65 73 20  ..**.** n bytes 
171a0 6f 66 20 7a 54 65 78 74 20 61 72 65 20 73 74 6f  of zText are sto
171b0 72 65 64 2e 20 20 49 66 20 6e 3d 3d 30 20 74 68  red.  If n==0 th
171c0 65 6e 20 61 6c 6c 20 6f 66 20 7a 54 65 78 74 20  en all of zText 
171d0 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a  up to the first.
171e0 2a 2a 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ** \000 terminat
171f0 6f 72 20 69 73 20 73 74 6f 72 65 64 2e 20 20 7a  or is stored.  z
17200 54 65 78 74 20 63 61 6e 20 63 6f 6e 74 61 69 6e  Text can contain
17210 20 75 70 20 74 6f 20 74 77 6f 20 69 6e 73 74 61   up to two insta
17220 6e 63 65 73 20 6f 66 0a 2a 2a 20 25 64 2e 20 20  nces of.** %d.  
17230 54 68 65 20 76 61 6c 75 65 73 20 6f 66 20 70 31  The values of p1
17240 20 61 6e 64 20 70 32 20 61 72 65 20 77 72 69 74   and p2 are writ
17250 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 66 69 72  ten into the fir
17260 73 74 20 61 6e 64 20 73 65 63 6f 6e 64 0a 2a 2a  st and second.**
17270 20 25 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d   %d..**.** If n=
17280 3d 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 70 72  =-1, then the pr
17290 65 76 69 6f 75 73 20 63 68 61 72 61 63 74 65 72  evious character
172a0 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2e   is overwritten.
172b0 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61 72  .*/.PRIVATE char
172c0 20 2a 61 70 70 65 6e 64 5f 73 74 72 28 63 68 61   *append_str(cha
172d0 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 6e 2c  r *zText, int n,
172e0 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
172f0 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
17300 2a 7a 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  *z = 0;.  static
17310 20 69 6e 74 20 61 6c 6c 6f 63 65 64 20 3d 20 30   int alloced = 0
17320 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 75  ;.  static int u
17330 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  sed = 0;.  int c
17340 3b 0a 20 20 63 68 61 72 20 7a 49 6e 74 5b 34 30  ;.  char zInt[40
17350 5d 3b 0a 0a 20 20 69 66 28 20 7a 54 65 78 74 3d  ];..  if( zText=
17360 3d 30 20 29 7b 0a 20 20 20 20 75 73 65 64 20 3d  =0 ){.    used =
17370 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 7a   0;.    return z
17380 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 3d 30  ;.  }.  if( n<=0
17390 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20   ){.    if( n<0 
173a0 29 7b 0a 20 20 20 20 20 20 75 73 65 64 20 2b 3d  ){.      used +=
173b0 20 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   n;.      assert
173c0 28 20 75 73 65 64 3e 3d 30 20 29 3b 0a 20 20 20  ( used>=0 );.   
173d0 20 7d 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65   }.    n = strle
173e0 6e 28 7a 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20  n(zText);.  }.  
173f0 69 66 28 20 6e 2b 73 69 7a 65 6f 66 28 7a 49 6e  if( n+sizeof(zIn
17400 74 29 2a 32 2b 75 73 65 64 20 3e 3d 20 61 6c 6c  t)*2+used >= all
17410 6f 63 65 64 20 29 7b 0a 20 20 20 20 61 6c 6c 6f  oced ){.    allo
17420 63 65 64 20 3d 20 6e 20 2b 20 73 69 7a 65 6f 66  ced = n + sizeof
17430 28 7a 49 6e 74 29 2a 32 20 2b 20 75 73 65 64 20  (zInt)*2 + used 
17440 2b 20 32 30 30 3b 0a 20 20 20 20 7a 20 3d 20 72  + 200;.    z = r
17450 65 61 6c 6c 6f 63 28 7a 2c 20 20 61 6c 6c 6f 63  ealloc(z,  alloc
17460 65 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ed);.  }.  if( z
17470 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 22 22 3b  ==0 ) return "";
17480 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
17490 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 28 7a  0 ){.    c = *(z
174a0 54 65 78 74 2b 2b 29 3b 0a 20 20 20 20 69 66 28  Text++);.    if(
174b0 20 63 3d 3d 27 25 27 20 26 26 20 6e 3e 30 20 26   c=='%' && n>0 &
174c0 26 20 7a 54 65 78 74 5b 30 5d 3d 3d 27 64 27 20  & zText[0]=='d' 
174d0 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ){.      sprintf
174e0 28 7a 49 6e 74 2c 20 22 25 64 22 2c 20 70 31 29  (zInt, "%d", p1)
174f0 3b 0a 20 20 20 20 20 20 70 31 20 3d 20 70 32 3b  ;.      p1 = p2;
17500 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a  .      strcpy(&z
17510 5b 75 73 65 64 5d 2c 20 7a 49 6e 74 29 3b 0a 20  [used], zInt);. 
17520 20 20 20 20 20 75 73 65 64 20 2b 3d 20 73 74 72       used += str
17530 6c 65 6e 28 26 7a 5b 75 73 65 64 5d 29 3b 0a 20  len(&z[used]);. 
17540 20 20 20 20 20 7a 54 65 78 74 2b 2b 3b 0a 20 20       zText++;.  
17550 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c      n--;.    }el
17560 73 65 7b 0a 20 20 20 20 20 20 7a 5b 75 73 65 64  se{.      z[used
17570 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20  ++] = c;.    }. 
17580 20 7d 0a 20 20 7a 5b 75 73 65 64 5d 20 3d 20 30   }.  z[used] = 0
17590 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
175a0 0a 2f 2a 0a 2a 2a 20 7a 43 6f 64 65 20 69 73 20  ./*.** zCode is 
175b0 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73  a string that is
175c0 20 74 68 65 20 61 63 74 69 6f 6e 20 61 73 73 6f   the action asso
175d0 63 69 61 74 65 64 20 77 69 74 68 20 61 20 72 75  ciated with a ru
175e0 6c 65 2e 20 20 45 78 70 61 6e 64 0a 2a 2a 20 74  le.  Expand.** t
175f0 68 65 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68  he symbols in th
17600 69 73 20 73 74 72 69 6e 67 20 73 6f 20 74 68 61  is string so tha
17610 74 20 74 68 65 20 72 65 66 65 72 20 74 6f 20 65  t the refer to e
17620 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 70  lements of the p
17630 61 72 73 65 72 0a 2a 2a 20 73 74 61 63 6b 2e 0a  arser.** stack..
17640 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
17650 74 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28 73  translate_code(s
17660 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
17670 70 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  p, struct rule *
17680 72 70 29 7b 0a 20 20 63 68 61 72 20 2a 63 70 2c  rp){.  char *cp,
17690 20 2a 78 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   *xp;.  int i;. 
176a0 20 63 68 61 72 20 6c 68 73 75 73 65 64 20 3d 20   char lhsused = 
176b0 30 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  0;    /* True if
176c0 20 74 68 65 20 4c 48 53 20 65 6c 65 6d 65 6e 74   the LHS element
176d0 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a   has been used *
176e0 2f 0a 20 20 63 68 61 72 20 75 73 65 64 5b 4d 41  /.  char used[MA
176f0 58 52 48 53 5d 3b 20 20 20 2f 2a 20 54 72 75 65  XRHS];   /* True
17700 20 66 6f 72 20 65 61 63 68 20 52 48 53 20 65 6c   for each RHS el
17710 65 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 75  ement which is u
17720 73 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d  sed */..  for(i=
17730 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
17740 2b 2b 29 20 75 73 65 64 5b 69 5d 20 3d 20 30 3b  ++) used[i] = 0;
17750 0a 20 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 0a  .  lhsused = 0;.
17760 0a 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d  .  if( rp->code=
17770 3d 30 20 29 7b 0a 20 20 20 20 72 70 2d 3e 63 6f  =0 ){.    rp->co
17780 64 65 20 3d 20 22 5c 6e 22 3b 0a 20 20 20 20 72  de = "\n";.    r
17790 70 2d 3e 6c 69 6e 65 20 3d 20 72 70 2d 3e 72 75  p->line = rp->ru
177a0 6c 65 6c 69 6e 65 3b 0a 20 20 7d 0a 0a 20 20 61  leline;.  }..  a
177b0 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c  ppend_str(0,0,0,
177c0 30 29 3b 0a 20 20 66 6f 72 28 63 70 3d 72 70 2d  0);.  for(cp=rp-
177d0 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b  >code; *cp; cp++
177e0 29 7b 0a 20 20 20 20 69 66 28 20 69 73 61 6c 70  ){.    if( isalp
177f0 68 61 28 2a 63 70 29 20 26 26 20 28 63 70 3d 3d  ha(*cp) && (cp==
17800 72 70 2d 3e 63 6f 64 65 20 7c 7c 20 28 21 69 73  rp->code || (!is
17810 61 6c 6e 75 6d 28 63 70 5b 2d 31 5d 29 20 26 26  alnum(cp[-1]) &&
17820 20 63 70 5b 2d 31 5d 21 3d 27 5f 27 29 29 20 29   cp[-1]!='_')) )
17830 7b 0a 20 20 20 20 20 20 63 68 61 72 20 73 61 76  {.      char sav
17840 65 64 3b 0a 20 20 20 20 20 20 66 6f 72 28 78 70  ed;.      for(xp
17850 3d 20 26 63 70 5b 31 5d 3b 20 69 73 61 6c 6e 75  = &cp[1]; isalnu
17860 6d 28 2a 78 70 29 20 7c 7c 20 2a 78 70 3d 3d 27  m(*xp) || *xp=='
17870 5f 27 3b 20 78 70 2b 2b 29 3b 0a 20 20 20 20 20  _'; xp++);.     
17880 20 73 61 76 65 64 20 3d 20 2a 78 70 3b 0a 20 20   saved = *xp;.  
17890 20 20 20 20 2a 78 70 20 3d 20 30 3b 0a 20 20 20      *xp = 0;.   
178a0 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c     if( rp->lhsal
178b0 69 61 73 20 26 26 20 73 74 72 63 6d 70 28 63 70  ias && strcmp(cp
178c0 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3d 3d  ,rp->lhsalias)==
178d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  0 ){.        app
178e0 65 6e 64 5f 73 74 72 28 22 79 79 67 6f 74 6f 6d  end_str("yygotom
178f0 69 6e 6f 72 2e 79 79 25 64 22 2c 30 2c 72 70 2d  inor.yy%d",0,rp-
17900 3e 6c 68 73 2d 3e 64 74 6e 75 6d 2c 30 29 3b 0a  >lhs->dtnum,0);.
17910 20 20 20 20 20 20 20 20 63 70 20 3d 20 78 70 3b          cp = xp;
17920 0a 20 20 20 20 20 20 20 20 6c 68 73 75 73 65 64  .        lhsused
17930 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
17940 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  e{.        for(i
17950 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
17960 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
17970 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
17980 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 63 70  [i] && strcmp(cp
17990 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d  ,rp->rhsalias[i]
179a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
179b0 20 20 20 20 69 66 28 20 63 70 21 3d 72 70 2d 3e      if( cp!=rp->
179c0 63 6f 64 65 20 26 26 20 63 70 5b 2d 31 5d 3d 3d  code && cp[-1]==
179d0 27 40 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '@' ){.         
179e0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61       /* If the a
179f0 72 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 68  rgument is of th
17a00 65 20 66 6f 72 6d 20 40 58 20 74 68 65 6e 20 73  e form @X then s
17a10 75 62 73 74 69 74 75 74 65 64 0a 20 20 20 20 20  ubstituted.     
17a20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
17a30 74 6f 6b 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20  token number of 
17a40 58 2c 20 6e 6f 74 20 74 68 65 20 76 61 6c 75 65  X, not the value
17a50 20 6f 66 20 58 20 2a 2f 0a 20 20 20 20 20 20 20   of X */.       
17a60 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74         append_st
17a70 72 28 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 61 6a  r("yymsp[%d].maj
17a80 6f 72 22 2c 2d 31 2c 69 2d 72 70 2d 3e 6e 72 68  or",-1,i-rp->nrh
17a90 73 2b 31 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  s+1,0);.        
17aa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17ab0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
17ac0 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d  symbol *sp = rp-
17ad0 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20  >rhs[i];.       
17ae0 20 20 20 20 20 20 20 69 6e 74 20 64 74 6e 75 6d         int dtnum
17af0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17b00 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55  if( sp->type==MU
17b10 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
17b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
17b30 74 6e 75 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79  tnum = sp->subsy
17b40 6d 5b 30 5d 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20  m[0]->dtnum;.   
17b50 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
17b60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
17b70 20 20 64 74 6e 75 6d 20 3d 20 73 70 2d 3e 64 74    dtnum = sp->dt
17b80 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  num;.           
17b90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
17ba0 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79     append_str("y
17bb0 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79  ymsp[%d].minor.y
17bc0 79 25 64 22 2c 30 2c 69 2d 72 70 2d 3e 6e 72 68  y%d",0,i-rp->nrh
17bd0 73 2b 31 2c 20 64 74 6e 75 6d 29 3b 0a 20 20 20  s+1, dtnum);.   
17be0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17bf0 20 20 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a         cp = xp;.
17c00 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65 64              used
17c10 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  [i] = 1;.       
17c20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17c40 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
17c50 2a 78 70 20 3d 20 73 61 76 65 64 3b 0a 20 20 20  *xp = saved;.   
17c60 20 7d 0a 20 20 20 20 61 70 70 65 6e 64 5f 73 74   }.    append_st
17c70 72 28 63 70 2c 20 31 2c 20 30 2c 20 30 29 3b 0a  r(cp, 1, 0, 0);.
17c80 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
17c90 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  */..  /* Check t
17ca0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
17cb0 4c 48 53 20 68 61 73 20 62 65 65 6e 20 75 73 65  LHS has been use
17cc0 64 20 2a 2f 0a 20 20 69 66 28 20 72 70 2d 3e 6c  d */.  if( rp->l
17cd0 68 73 61 6c 69 61 73 20 26 26 20 21 6c 68 73 75  hsalias && !lhsu
17ce0 73 65 64 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  sed ){.    Error
17cf0 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  Msg(lemp->filena
17d00 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c  me,rp->ruleline,
17d10 0a 20 20 20 20 20 20 22 4c 61 62 65 6c 20 5c 22  .      "Label \"
17d20 25 73 5c 22 20 66 6f 72 20 5c 22 25 73 28 25 73  %s\" for \"%s(%s
17d30 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73 65  )\" is never use
17d40 64 2e 22 2c 0a 20 20 20 20 20 20 20 20 72 70 2d  d.",.        rp-
17d50 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e 6c 68  >lhsalias,rp->lh
17d60 73 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73 61  s->name,rp->lhsa
17d70 6c 69 61 73 29 3b 0a 20 20 20 20 6c 65 6d 70 2d  lias);.    lemp-
17d80 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d  >errorcnt++;.  }
17d90 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
17da0 64 65 73 74 72 75 63 74 6f 72 20 63 6f 64 65 20  destructor code 
17db0 66 6f 72 20 52 48 53 20 73 79 6d 62 6f 6c 73 20  for RHS symbols 
17dc0 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73  which are not us
17dd0 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 72  ed in the.  ** r
17de0 65 64 75 63 65 20 63 6f 64 65 20 2a 2f 0a 20 20  educe code */.  
17df0 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
17e00 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  rhs; i++){.    i
17e10 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  f( rp->rhsalias[
17e20 69 5d 20 26 26 20 21 75 73 65 64 5b 69 5d 20 29  i] && !used[i] )
17e30 7b 0a 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67  {.      ErrorMsg
17e40 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
17e50 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20  rp->ruleline,.  
17e60 20 20 20 20 20 20 22 4c 61 62 65 6c 20 25 73 20        "Label %s 
17e70 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22 20 69  for \"%s(%s)\" i
17e80 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22 2c 0a  s never used.",.
17e90 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61          rp->rhsa
17ea0 6c 69 61 73 5b 69 5d 2c 72 70 2d 3e 72 68 73 5b  lias[i],rp->rhs[
17eb0 69 5d 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 72 68 73  i]->name,rp->rhs
17ec0 61 6c 69 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20  alias[i]);.     
17ed0 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
17ee0 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  +;.    }else if(
17ef0 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
17f00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
17f10 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28   has_destructor(
17f20 72 70 2d 3e 72 68 73 5b 69 5d 2c 6c 65 6d 70 29  rp->rhs[i],lemp)
17f30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
17f40 6e 64 5f 73 74 72 28 22 20 20 79 79 5f 64 65 73  nd_str("  yy_des
17f50 74 72 75 63 74 6f 72 28 25 64 2c 26 79 79 6d 73  tructor(%d,&yyms
17f60 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c 6e 22  p[%d].minor);\n"
17f70 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
17f80 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 69 6e 64 65  rp->rhs[i]->inde
17f90 78 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 29 3b  x,i-rp->nrhs+1);
17fa0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17fb0 20 20 20 20 20 20 2f 2a 20 4e 6f 20 64 65 73 74        /* No dest
17fc0 72 75 63 74 6f 72 20 64 65 66 69 6e 65 64 20 66  ructor defined f
17fd0 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a  or this term */.
17fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17ff0 7d 0a 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65  }.  if( rp->code
18000 20 29 7b 0a 20 20 20 20 63 70 20 3d 20 61 70 70   ){.    cp = app
18010 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29  end_str(0,0,0,0)
18020 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d  ;.    rp->code =
18030 20 53 74 72 73 61 66 65 28 63 70 3f 63 70 3a 22   Strsafe(cp?cp:"
18040 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a  ");.  }.}../* .*
18050 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
18060 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
18070 68 65 6e 20 74 68 65 20 72 75 6c 65 20 22 72 70  hen the rule "rp
18080 22 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 57  " is reduced.  W
18090 72 69 74 65 0a 2a 2a 20 74 68 65 20 63 6f 64 65  rite.** the code
180a0 20 74 6f 20 22 6f 75 74 22 2e 20 20 4d 61 6b 65   to "out".  Make
180b0 20 73 75 72 65 20 6c 69 6e 65 6e 6f 20 73 74 61   sure lineno sta
180c0 79 73 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a  ys up-to-date..*
180d0 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 65  /.PRIVATE void e
180e0 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72 70 2c  mit_code(out,rp,
180f0 6c 65 6d 70 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c  lemp,lineno).FIL
18100 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 72  E *out;.struct r
18110 75 6c 65 20 2a 72 70 3b 0a 73 74 72 75 63 74 20  ule *rp;.struct 
18120 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74  lemon *lemp;.int
18130 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 63 68 61   *lineno;.{. cha
18140 72 20 2a 63 70 3b 0a 20 69 6e 74 20 6c 69 6e 65  r *cp;. int line
18150 63 6e 74 20 3d 20 30 3b 0a 0a 20 2f 2a 20 47 65  cnt = 0;.. /* Ge
18160 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64  nerate code to d
18170 6f 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74  o the reduce act
18180 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e  ion */. if( rp->
18190 63 6f 64 65 20 29 7b 0a 20 20 20 74 70 6c 74 5f  code ){.   tplt_
181a0 6c 69 6e 65 64 69 72 28 6f 75 74 2c 72 70 2d 3e  linedir(out,rp->
181b0 6c 69 6e 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  line,lemp->filen
181c0 61 6d 65 29 3b 0a 20 20 20 66 70 72 69 6e 74 66  ame);.   fprintf
181d0 28 6f 75 74 2c 22 7b 25 73 22 2c 72 70 2d 3e 63  (out,"{%s",rp->c
181e0 6f 64 65 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d  ode);.   for(cp=
181f0 72 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63  rp->code; *cp; c
18200 70 2b 2b 29 7b 0a 20 20 20 20 20 69 66 28 20 2a  p++){.     if( *
18210 63 70 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 63  cp=='\n' ) linec
18220 6e 74 2b 2b 3b 0a 20 20 20 7d 20 2f 2a 20 45 6e  nt++;.   } /* En
18230 64 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 28 2a 6c  d loop */.   (*l
18240 69 6e 65 6e 6f 29 20 2b 3d 20 33 20 2b 20 6c 69  ineno) += 3 + li
18250 6e 65 63 6e 74 3b 0a 20 20 20 66 70 72 69 6e 74  necnt;.   fprint
18260 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 0a 20 20  f(out,"}\n");.  
18270 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75   tplt_linedir(ou
18280 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e  t,*lineno,lemp->
18290 6f 75 74 6e 61 6d 65 29 3b 0a 20 7d 20 2f 2a 20  outname);. } /* 
182a0 45 6e 64 20 69 66 28 20 72 70 2d 3e 63 6f 64 65  End if( rp->code
182b0 20 29 20 2a 2f 0a 0a 20 72 65 74 75 72 6e 3b 0a   ) */.. return;.
182c0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  }../*.** Print t
182d0 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  he definition of
182e0 20 74 68 65 20 75 6e 69 6f 6e 20 75 73 65 64 20   the union used 
182f0 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 27 73  for the parser's
18300 20 64 61 74 61 20 73 74 61 63 6b 2e 0a 2a 2a 20   data stack..** 
18310 54 68 69 73 20 75 6e 69 6f 6e 20 63 6f 6e 74 61  This union conta
18320 69 6e 73 20 66 69 65 6c 64 73 20 66 6f 72 20 65  ins fields for e
18330 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20 64 61  very possible da
18340 74 61 20 74 79 70 65 20 66 6f 72 20 74 6f 6b 65  ta type for toke
18350 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f 6e 74 65 72  ns.** and nonter
18360 6d 69 6e 61 6c 73 2e 20 20 49 6e 20 74 68 65 20  minals.  In the 
18370 70 72 6f 63 65 73 73 20 6f 66 20 63 6f 6d 70 75  process of compu
18380 74 69 6e 67 20 61 6e 64 20 70 72 69 6e 74 69 6e  ting and printin
18390 67 20 74 68 69 73 0a 2a 2a 20 75 6e 69 6f 6e 2c  g this.** union,
183a0 20 61 6c 73 6f 20 73 65 74 20 74 68 65 20 22 2e   also set the ".
183b0 64 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66 20  dtnum" field of 
183c0 65 76 65 72 79 20 74 65 72 6d 69 6e 61 6c 20 61  every terminal a
183d0 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 0a 2a  nd nonterminal.*
183e0 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f 0a 76 6f 69  * symbol..*/.voi
183f0 64 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e  d print_stack_un
18400 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 70 6c 69  ion(out,lemp,pli
18410 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 0a 46 49 4c  neno,mhflag).FIL
18420 45 20 2a 6f 75 74 3b 20 20 20 20 20 20 20 20 20  E *out;         
18430 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18440 6f 75 74 70 75 74 20 73 74 72 65 61 6d 20 2a 2f  output stream */
18450 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
18460 65 6d 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  emp;         /* 
18470 54 68 65 20 6d 61 69 6e 20 69 6e 66 6f 20 73 74  The main info st
18480 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 69 73  ructure for this
18490 20 70 61 72 73 65 72 20 2a 2f 0a 69 6e 74 20 2a   parser */.int *
184a0 70 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20  plineno;        
184b0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
184c0 72 20 74 6f 20 74 68 65 20 6c 69 6e 65 20 6e 75  r to the line nu
184d0 6d 62 65 72 20 2a 2f 0a 69 6e 74 20 6d 68 66 6c  mber */.int mhfl
184e0 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ag;             
184f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 67      /* True if g
18500 65 6e 65 72 61 74 69 6e 67 20 6d 61 6b 65 68 65  enerating makehe
18510 61 64 65 72 73 20 6f 75 74 70 75 74 20 2a 2f 0a  aders output */.
18520 7b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d  {.  int lineno =
18530 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20 20 2f 2a   *plineno;    /*
18540 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72   The line number
18550 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 2a   of the output *
18560 2f 0a 20 20 63 68 61 72 20 2a 2a 74 79 70 65 73  /.  char **types
18570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18580 20 41 20 68 61 73 68 20 74 61 62 6c 65 20 6f 66   A hash table of
18590 20 64 61 74 61 74 79 70 65 73 20 2a 2f 0a 20 20   datatypes */.  
185a0 69 6e 74 20 61 72 72 61 79 73 69 7a 65 3b 20 20  int arraysize;  
185b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
185c0 65 20 6f 66 20 74 68 65 20 22 74 79 70 65 73 22  e of the "types"
185d0 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
185e0 6d 61 78 64 74 6c 65 6e 67 74 68 3b 20 20 20 20  maxdtlength;    
185f0 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
18600 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e 79 20 22   length of any "
18610 2e 64 61 74 61 74 79 70 65 22 20 66 69 65 6c 64  .datatype" field
18620 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74 64  . */.  char *std
18630 64 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dt;             
18640 20 2f 2a 20 53 74 61 6e 64 61 72 64 69 7a 65 64   /* Standardized
18650 20 6e 61 6d 65 20 66 6f 72 20 61 20 64 61 74 61   name for a data
18660 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  type */.  int i,
18670 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
18680 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
18690 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 68 61  ters */.  int ha
186a0 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sh;             
186b0 20 20 20 20 2f 2a 20 46 6f 72 20 68 61 73 68 69      /* For hashi
186c0 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ng the name of a
186d0 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20   type */.  char 
186e0 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  *name;          
186f0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
18700 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 0a 20  the parser */.. 
18710 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
18720 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 79 70 65   initialize type
18730 73 5b 5d 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65  s[] and allocate
18740 20 73 74 64 64 74 5b 5d 20 2a 2f 0a 20 20 61 72   stddt[] */.  ar
18750 72 61 79 73 69 7a 65 20 3d 20 6c 65 6d 70 2d 3e  raysize = lemp->
18760 6e 73 79 6d 62 6f 6c 20 2a 20 32 3b 0a 20 20 74  nsymbol * 2;.  t
18770 79 70 65 73 20 3d 20 28 63 68 61 72 2a 2a 29 63  ypes = (char**)c
18780 61 6c 6c 6f 63 28 20 61 72 72 61 79 73 69 7a 65  alloc( arraysize
18790 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20  , sizeof(char*) 
187a0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
187b0 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29 20  arraysize; i++) 
187c0 74 79 70 65 73 5b 69 5d 20 3d 20 30 3b 0a 20 20  types[i] = 0;.  
187d0 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 30 3b  maxdtlength = 0;
187e0 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72  .  if( lemp->var
187f0 74 79 70 65 20 29 7b 0a 20 20 20 20 6d 61 78 64  type ){.    maxd
18800 74 6c 65 6e 67 74 68 20 3d 20 73 74 72 6c 65 6e  tlength = strlen
18810 28 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 29 3b  (lemp->vartype);
18820 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
18830 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
18840 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c   i++){.    int l
18850 65 6e 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  en;.    struct s
18860 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
18870 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
18880 20 20 69 66 28 20 73 70 2d 3e 64 61 74 61 74 79    if( sp->dataty
18890 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  pe==0 ) continue
188a0 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  ;.    len = strl
188b0 65 6e 28 73 70 2d 3e 64 61 74 61 74 79 70 65 29  en(sp->datatype)
188c0 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61  ;.    if( len>ma
188d0 78 64 74 6c 65 6e 67 74 68 20 29 20 6d 61 78 64  xdtlength ) maxd
188e0 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 3b 0a 20  tlength = len;. 
188f0 20 7d 0a 20 20 73 74 64 64 74 20 3d 20 28 63 68   }.  stddt = (ch
18900 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6d 61 78 64  ar*)malloc( maxd
18910 74 6c 65 6e 67 74 68 2a 32 20 2b 20 31 20 29 3b  tlength*2 + 1 );
18920 0a 20 20 69 66 28 20 74 79 70 65 73 3d 3d 30 20  .  if( types==0 
18930 7c 7c 20 73 74 64 64 74 3d 3d 30 20 29 7b 0a 20  || stddt==0 ){. 
18940 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
18950 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
18960 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  .\n");.    exit(
18970 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75  1);.  }..  /* Bu
18980 69 6c 64 20 61 20 68 61 73 68 20 74 61 62 6c 65  ild a hash table
18990 20 6f 66 20 64 61 74 61 74 79 70 65 73 2e 20 54   of datatypes. T
189a0 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c  he ".dtnum" fiel
189b0 64 20 6f 66 20 65 61 63 68 20 73 79 6d 62 6f 6c  d of each symbol
189c0 0a 20 20 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20  .  ** is filled 
189d0 69 6e 20 77 69 74 68 20 74 68 65 20 68 61 73 68  in with the hash
189e0 20 69 6e 64 65 78 20 70 6c 75 73 20 31 2e 20 20   index plus 1.  
189f0 41 20 22 2e 64 74 6e 75 6d 22 20 76 61 6c 75 65  A ".dtnum" value
18a00 20 6f 66 20 30 20 69 73 0a 20 20 2a 2a 20 75 73   of 0 is.  ** us
18a10 65 64 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 20  ed for terminal 
18a20 73 79 6d 62 6f 6c 73 2e 20 20 49 66 20 74 68 65  symbols.  If the
18a30 72 65 20 69 73 20 6e 6f 20 25 64 65 66 61 75 6c  re is no %defaul
18a40 74 5f 74 79 70 65 20 64 65 66 69 6e 65 64 20 74  t_type defined t
18a50 68 65 6e 0a 20 20 2a 2a 20 30 20 69 73 20 61 6c  hen.  ** 0 is al
18a60 73 6f 20 75 73 65 64 20 61 73 20 74 68 65 20 2e  so used as the .
18a70 64 74 6e 75 6d 20 76 61 6c 75 65 20 66 6f 72 20  dtnum value for 
18a80 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69  nonterminals whi
18a90 63 68 20 64 6f 20 6e 6f 74 20 73 70 65 63 69 66  ch do not specif
18aa0 79 0a 20 20 2a 2a 20 61 20 64 61 74 61 74 79 70  y.  ** a datatyp
18ab0 65 20 75 73 69 6e 67 20 74 68 65 20 25 74 79 70  e using the %typ
18ac0 65 20 64 69 72 65 63 74 69 76 65 2e 0a 20 20 2a  e directive..  *
18ad0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
18ae0 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
18af0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73  +){.    struct s
18b00 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
18b10 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
18b20 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 20 20    char *cp;.    
18b30 69 66 28 20 73 70 3d 3d 6c 65 6d 70 2d 3e 65 72  if( sp==lemp->er
18b40 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20 73 70  rsym ){.      sp
18b50 2d 3e 64 74 6e 75 6d 20 3d 20 61 72 72 61 79 73  ->dtnum = arrays
18b60 69 7a 65 2b 31 3b 0a 20 20 20 20 20 20 63 6f 6e  ize+1;.      con
18b70 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
18b80 20 69 66 28 20 73 70 2d 3e 74 79 70 65 21 3d 4e   if( sp->type!=N
18b90 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 28 73  ONTERMINAL || (s
18ba0 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 26  p->datatype==0 &
18bb0 26 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3d  & lemp->vartype=
18bc0 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 70 2d  =0) ){.      sp-
18bd0 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  >dtnum = 0;.    
18be0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
18bf0 7d 0a 20 20 20 20 63 70 20 3d 20 73 70 2d 3e 64  }.    cp = sp->d
18c00 61 74 61 74 79 70 65 3b 0a 20 20 20 20 69 66 28  atatype;.    if(
18c10 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20 6c 65   cp==0 ) cp = le
18c20 6d 70 2d 3e 76 61 72 74 79 70 65 3b 0a 20 20 20  mp->vartype;.   
18c30 20 6a 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c   j = 0;.    whil
18c40 65 28 20 69 73 73 70 61 63 65 28 2a 63 70 29 20  e( isspace(*cp) 
18c50 29 20 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c  ) cp++;.    whil
18c60 65 28 20 2a 63 70 20 29 20 73 74 64 64 74 5b 6a  e( *cp ) stddt[j
18c70 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a 20 20 20  ++] = *cp++;.   
18c80 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 69   while( j>0 && i
18c90 73 73 70 61 63 65 28 73 74 64 64 74 5b 6a 2d 31  sspace(stddt[j-1
18ca0 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 73 74  ]) ) j--;.    st
18cb0 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  ddt[j] = 0;.    
18cc0 69 66 28 20 73 74 72 63 6d 70 28 73 74 64 64 74  if( strcmp(stddt
18cd0 2c 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70  , lemp->tokentyp
18ce0 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  e)==0 ){.      s
18cf0 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20  p->dtnum = 0;.  
18d00 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
18d10 20 20 7d 0a 20 20 20 20 68 61 73 68 20 3d 20 30    }.    hash = 0
18d20 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 73  ;.    for(j=0; s
18d30 74 64 64 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  tddt[j]; j++){. 
18d40 20 20 20 20 20 68 61 73 68 20 3d 20 68 61 73 68       hash = hash
18d50 2a 35 33 20 2b 20 73 74 64 64 74 5b 6a 5d 3b 0a  *53 + stddt[j];.
18d60 20 20 20 20 7d 0a 20 20 20 20 68 61 73 68 20 3d      }.    hash =
18d70 20 28 68 61 73 68 20 26 20 30 78 37 66 66 66 66   (hash & 0x7ffff
18d80 66 66 66 29 25 61 72 72 61 79 73 69 7a 65 3b 0a  fff)%arraysize;.
18d90 20 20 20 20 77 68 69 6c 65 28 20 74 79 70 65 73      while( types
18da0 5b 68 61 73 68 5d 20 29 7b 0a 20 20 20 20 20 20  [hash] ){.      
18db0 69 66 28 20 73 74 72 63 6d 70 28 74 79 70 65 73  if( strcmp(types
18dc0 5b 68 61 73 68 5d 2c 73 74 64 64 74 29 3d 3d 30  [hash],stddt)==0
18dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70 2d 3e   ){.        sp->
18de0 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31  dtnum = hash + 1
18df0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18e00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 68  .      }.      h
18e10 61 73 68 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ash++;.      if(
18e20 20 68 61 73 68 3e 3d 61 72 72 61 79 73 69 7a 65   hash>=arraysize
18e30 20 29 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 20   ) hash = 0;.   
18e40 20 7d 0a 20 20 20 20 69 66 28 20 74 79 70 65 73   }.    if( types
18e50 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20  [hash]==0 ){.   
18e60 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68     sp->dtnum = h
18e70 61 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 74  ash + 1;.      t
18e80 79 70 65 73 5b 68 61 73 68 5d 20 3d 20 28 63 68  ypes[hash] = (ch
18e90 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 73 74 72 6c  ar*)malloc( strl
18ea0 65 6e 28 73 74 64 64 74 29 2b 31 20 29 3b 0a 20  en(stddt)+1 );. 
18eb0 20 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 68       if( types[h
18ec0 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ash]==0 ){.     
18ed0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
18ee0 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
18ef0 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65  .\n");.        e
18f00 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a  xit(1);.      }.
18f10 20 20 20 20 20 20 73 74 72 63 70 79 28 74 79 70        strcpy(typ
18f20 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74 29 3b  es[hash],stddt);
18f30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
18f40 20 50 72 69 6e 74 20 6f 75 74 20 74 68 65 20 64   Print out the d
18f50 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 59 59 54  efinition of YYT
18f60 4f 4b 45 4e 54 59 50 45 20 61 6e 64 20 59 59 4d  OKENTYPE and YYM
18f70 49 4e 4f 52 54 59 50 45 20 2a 2f 0a 20 20 6e 61  INORTYPE */.  na
18f80 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20  me = lemp->name 
18f90 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22  ? lemp->name : "
18fa0 50 61 72 73 65 22 3b 0a 20 20 6c 69 6e 65 6e 6f  Parse";.  lineno
18fb0 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 0a 20 20 69   = *plineno;.  i
18fc0 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72  f( mhflag ){ fpr
18fd0 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e  intf(out,"#if IN
18fe0 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e  TERFACE\n"); lin
18ff0 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e  eno++; }.  fprin
19000 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
19010 25 73 54 4f 4b 45 4e 54 59 50 45 20 25 73 5c 6e  %sTOKENTYPE %s\n
19020 22 2c 6e 61 6d 65 2c 0a 20 20 20 20 6c 65 6d 70  ",name,.    lemp
19030 2d 3e 74 6f 6b 65 6e 74 79 70 65 3f 6c 65 6d 70  ->tokentype?lemp
19040 2d 3e 74 6f 6b 65 6e 74 79 70 65 3a 22 76 6f 69  ->tokentype:"voi
19050 64 2a 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  d*");  lineno++;
19060 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
19070 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65   fprintf(out,"#e
19080 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ndif\n"); lineno
19090 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ++; }.  fprintf(
190a0 6f 75 74 2c 22 74 79 70 65 64 65 66 20 75 6e 69  out,"typedef uni
190b0 6f 6e 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  on {\n"); lineno
190c0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
190d0 74 2c 22 20 20 25 73 54 4f 4b 45 4e 54 59 50 45  t,"  %sTOKENTYPE
190e0 20 79 79 30 3b 5c 6e 22 2c 6e 61 6d 65 29 3b 20   yy0;\n",name); 
190f0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28  lineno++;.  for(
19100 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65  i=0; i<arraysize
19110 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
19120 74 79 70 65 73 5b 69 5d 3d 3d 30 20 29 20 63 6f  types[i]==0 ) co
19130 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69  ntinue;.    fpri
19140 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 20 79 79  ntf(out,"  %s yy
19150 25 64 3b 5c 6e 22 2c 74 79 70 65 73 5b 69 5d 2c  %d;\n",types[i],
19160 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i+1); lineno++;.
19170 20 20 20 20 66 72 65 65 28 74 79 70 65 73 5b 69      free(types[i
19180 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65  ]);.  }.  if( le
19190 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43  mp->errsym->useC
191a0 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  nt ){.    fprint
191b0 66 28 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 25  f(out,"  int yy%
191c0 64 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73  d;\n",lemp->errs
191d0 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65  ym->dtnum); line
191e0 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 72 65 65  no++;.  }.  free
191f0 28 73 74 64 64 74 29 3b 0a 20 20 66 72 65 65 28  (stddt);.  free(
19200 74 79 70 65 73 29 3b 0a 20 20 66 70 72 69 6e 74  types);.  fprint
19210 66 28 6f 75 74 2c 22 7d 20 59 59 4d 49 4e 4f 52  f(out,"} YYMINOR
19220 54 59 50 45 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  TYPE;\n"); linen
19230 6f 2b 2b 3b 0a 20 20 2a 70 6c 69 6e 65 6e 6f 20  o++;.  *plineno 
19240 3d 20 6c 69 6e 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  = lineno;.}../*.
19250 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
19260 6d 65 20 6f 66 20 61 20 43 20 64 61 74 61 74 79  me of a C dataty
19270 70 65 20 61 62 6c 65 20 74 6f 20 72 65 70 72 65  pe able to repre
19280 73 65 6e 74 20 76 61 6c 75 65 73 20 62 65 74 77  sent values betw
19290 65 65 6e 0a 2a 2a 20 6c 77 72 20 61 6e 64 20 75  een.** lwr and u
192a0 70 72 2c 20 69 6e 63 6c 75 73 69 76 65 2e 0a 2a  pr, inclusive..*
192b0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
192c0 68 61 72 20 2a 6d 69 6e 69 6d 75 6d 5f 73 69 7a  har *minimum_siz
192d0 65 5f 74 79 70 65 28 69 6e 74 20 6c 77 72 2c 20  e_type(int lwr, 
192e0 69 6e 74 20 75 70 72 29 7b 0a 20 20 69 66 28 20  int upr){.  if( 
192f0 6c 77 72 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  lwr>=0 ){.    if
19300 28 20 75 70 72 3c 3d 32 35 35 20 29 7b 0a 20 20  ( upr<=255 ){.  
19310 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69      return "unsi
19320 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20 20 20  gned char";.    
19330 7d 65 6c 73 65 20 69 66 28 20 75 70 72 3c 36 35  }else if( upr<65
19340 35 33 35 20 29 7b 0a 20 20 20 20 20 20 72 65 74  535 ){.      ret
19350 75 72 6e 20 22 75 6e 73 69 67 6e 65 64 20 73 68  urn "unsigned sh
19360 6f 72 74 20 69 6e 74 22 3b 0a 20 20 20 20 7d 65  ort int";.    }e
19370 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
19380 6e 20 22 75 6e 73 69 67 6e 65 64 20 69 6e 74 22  n "unsigned int"
19390 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
193a0 69 66 28 20 6c 77 72 3e 3d 2d 31 32 37 20 26 26  if( lwr>=-127 &&
193b0 20 75 70 72 3c 3d 31 32 37 20 29 7b 0a 20 20 20   upr<=127 ){.   
193c0 20 72 65 74 75 72 6e 20 22 73 69 67 6e 65 64 20   return "signed 
193d0 63 68 61 72 22 3b 0a 20 20 7d 65 6c 73 65 20 69  char";.  }else i
193e0 66 28 20 6c 77 72 3e 3d 2d 33 32 37 36 37 20 26  f( lwr>=-32767 &
193f0 26 20 75 70 72 3c 33 32 37 36 37 20 29 7b 0a 20  & upr<32767 ){. 
19400 20 20 20 72 65 74 75 72 6e 20 22 73 68 6f 72 74     return "short
19410 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
19420 72 65 74 75 72 6e 20 22 69 6e 74 22 3b 0a 20 20  return "int";.  
19430 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  }.}../*.** Each 
19440 73 74 61 74 65 20 63 6f 6e 74 61 69 6e 73 20 61  state contains a
19450 20 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 74 72   set of token tr
19460 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
19470 73 65 74 20 6f 66 0a 2a 2a 20 6e 6f 6e 74 65 72  set of.** nonter
19480 6d 69 6e 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  minal transactio
19490 6e 73 2e 20 20 45 61 63 68 20 6f 66 20 74 68 65  ns.  Each of the
194a0 73 65 20 73 65 74 73 20 6d 61 6b 65 73 20 61 6e  se sets makes an
194b0 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20   instance.** of 
194c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
194d0 72 75 63 74 75 72 65 2e 20 20 41 6e 20 61 72 72  ructure.  An arr
194e0 61 79 20 6f 66 20 74 68 65 73 65 20 73 74 72 75  ay of these stru
194f0 63 74 75 72 65 73 20 69 73 20 75 73 65 64 0a 2a  ctures is used.*
19500 2a 20 74 6f 20 6f 72 64 65 72 20 74 68 65 20 63  * to order the c
19510 72 65 61 74 69 6f 6e 20 6f 66 20 65 6e 74 72 69  reation of entri
19520 65 73 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74  es in the yy_act
19530 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a  ion[] table..*/.
19540 73 74 72 75 63 74 20 61 78 73 65 74 20 7b 0a 20  struct axset {. 
19550 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
19560 74 70 3b 20 20 20 2f 2a 20 41 20 70 6f 69 6e 74  tp;   /* A point
19570 65 72 20 74 6f 20 61 20 73 74 61 74 65 20 2a 2f  er to a state */
19580 0a 20 20 69 6e 74 20 69 73 54 6b 6e 3b 20 20 20  .  int isTkn;   
19590 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
195a0 74 6f 20 75 73 65 20 74 6f 6b 65 6e 73 2e 20 20  to use tokens.  
195b0 46 61 6c 73 65 20 66 6f 72 20 6e 6f 6e 2d 74 65  False for non-te
195c0 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e 74  rminals */.  int
195d0 20 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20   nAction;       
195e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
195f0 63 74 69 6f 6e 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ctions */.};../*
19600 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 6f 20 61  .** Compare to a
19610 78 73 65 74 20 73 74 72 75 63 74 75 72 65 73 20  xset structures 
19620 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70  for sorting purp
19630 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oses.*/.static i
19640 6e 74 20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65  nt axset_compare
19650 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20  (const void *a, 
19660 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a  const void *b){.
19670 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a    struct axset *
19680 70 31 20 3d 20 28 73 74 72 75 63 74 20 61 78 73  p1 = (struct axs
19690 65 74 2a 29 61 3b 0a 20 20 73 74 72 75 63 74 20  et*)a;.  struct 
196a0 61 78 73 65 74 20 2a 70 32 20 3d 20 28 73 74 72  axset *p2 = (str
196b0 75 63 74 20 61 78 73 65 74 2a 29 62 3b 0a 20 20  uct axset*)b;.  
196c0 72 65 74 75 72 6e 20 70 32 2d 3e 6e 41 63 74 69  return p2->nActi
196d0 6f 6e 20 2d 20 70 31 2d 3e 6e 41 63 74 69 6f 6e  on - p1->nAction
196e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
196f0 20 74 65 78 74 20 6f 6e 20 22 6f 75 74 22 20 74   text on "out" t
19700 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
19710 65 20 72 75 6c 65 20 22 72 70 22 2e 0a 2a 2f 0a  e rule "rp"..*/.
19720 73 74 61 74 69 63 20 76 6f 69 64 20 77 72 69 74  static void writ
19730 65 52 75 6c 65 54 65 78 74 28 46 49 4c 45 20 2a  eRuleText(FILE *
19740 6f 75 74 2c 20 73 74 72 75 63 74 20 72 75 6c 65  out, struct rule
19750 20 2a 72 70 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a   *rp){.  int j;.
19760 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
19770 73 20 3a 3a 3d 22 2c 20 72 70 2d 3e 6c 68 73 2d  s ::=", rp->lhs-
19780 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 6a 3d  >name);.  for(j=
19790 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b 20 6a  0; j<rp->nrhs; j
197a0 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
197b0 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d  symbol *sp = rp-
197c0 3e 72 68 73 5b 6a 5d 3b 0a 20 20 20 20 66 70 72  >rhs[j];.    fpr
197d0 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 20  intf(out," %s", 
197e0 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69  sp->name);.    i
197f0 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c  f( sp->type==MUL
19800 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  TITERMINAL ){.  
19810 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
19820 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 73 70 2d 3e   for(k=1; k<sp->
19830 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20  nsubsym; k++){. 
19840 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
19850 75 74 2c 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62  ut,"|%s",sp->sub
19860 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  sym[k]->name);. 
19870 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19880 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  .}.../* Generate
19890 20 43 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66   C source code f
198a0 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  or the parser */
198b0 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c  .void ReportTabl
198c0 65 28 6c 65 6d 70 2c 20 6d 68 66 6c 61 67 29 0a  e(lemp, mhflag).
198d0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
198e0 6d 70 3b 0a 69 6e 74 20 6d 68 66 6c 61 67 3b 20  mp;.int mhflag; 
198f0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 69 6e      /* Output in
19900 20 6d 61 6b 65 68 65 61 64 65 72 73 20 66 6f 72   makeheaders for
19910 6d 61 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 7b  mat if true */.{
19920 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69  .  FILE *out, *i
19930 6e 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c  n;.  char line[L
19940 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20  INESIZE];.  int 
19950 20 6c 69 6e 65 6e 6f 3b 0a 20 20 73 74 72 75 63   lineno;.  struc
19960 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20  t state *stp;.  
19970 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
19980 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  p;.  struct rule
19990 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20 61   *rp;.  struct a
199a0 63 74 74 61 62 20 2a 70 41 63 74 74 61 62 3b 0a  cttab *pActtab;.
199b0 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20    int i, j, n;. 
199c0 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 69   char *name;.  i
199d0 6e 74 20 6d 6e 54 6b 6e 4f 66 73 74 2c 20 6d 78  nt mnTknOfst, mx
199e0 54 6b 6e 4f 66 73 74 3b 0a 20 20 69 6e 74 20 6d  TknOfst;.  int m
199f0 6e 4e 74 4f 66 73 74 2c 20 6d 78 4e 74 4f 66 73  nNtOfst, mxNtOfs
19a00 74 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65  t;.  struct axse
19a10 74 20 2a 61 78 3b 0a 0a 20 20 69 6e 20 3d 20 74  t *ax;..  in = t
19a20 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d 70 29 3b 0a  plt_open(lemp);.
19a30 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65    if( in==0 ) re
19a40 74 75 72 6e 3b 0a 20 20 6f 75 74 20 3d 20 66 69  turn;.  out = fi
19a50 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 63  le_open(lemp,".c
19a60 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 6f  ","wb");.  if( o
19a70 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 63 6c  ut==0 ){.    fcl
19a80 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 72 65 74  ose(in);.    ret
19a90 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c 69 6e 65 6e  urn;.  }.  linen
19aa0 6f 20 3d 20 31 3b 0a 20 20 74 70 6c 74 5f 78 66  o = 1;.  tplt_xf
19ab0 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
19ac0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
19ad0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
19ae0 65 20 69 6e 63 6c 75 64 65 20 63 6f 64 65 2c 20  e include code, 
19af0 69 66 20 61 6e 79 20 2a 2f 0a 20 20 74 70 6c 74  if any */.  tplt
19b00 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
19b10 6c 65 6d 70 2d 3e 69 6e 63 6c 75 64 65 2c 26 6c  lemp->include,&l
19b20 69 6e 65 6e 6f 29 3b 0a 20 20 69 66 28 20 6d 68  ineno);.  if( mh
19b30 66 6c 61 67 20 29 7b 0a 20 20 20 20 63 68 61 72  flag ){.    char
19b40 20 2a 6e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61   *name = file_ma
19b50 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 22 2e 68  kename(lemp, ".h
19b60 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ");.    fprintf(
19b70 6f 75 74 2c 22 23 69 6e 63 6c 75 64 65 20 5c 22  out,"#include \"
19b80 25 73 5c 22 5c 6e 22 2c 20 6e 61 6d 65 29 3b 20  %s\"\n", name); 
19b90 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72  lineno++;.    fr
19ba0 65 65 28 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ee(name);.  }.  
19bb0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
19bc0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
19bd0 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
19be0 72 61 74 65 20 23 64 65 66 69 6e 65 73 20 66 6f  rate #defines fo
19bf0 72 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 2a 2f 0a  r all tokens */.
19c00 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a    if( mhflag ){.
19c10 20 20 20 20 63 68 61 72 20 2a 70 72 65 66 69 78      char *prefix
19c20 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
19c30 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43 45  t,"#if INTERFACE
19c40 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
19c50 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f      if( lemp->to
19c60 6b 65 6e 70 72 65 66 69 78 20 29 20 70 72 65 66  kenprefix ) pref
19c70 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  ix = lemp->token
19c80 70 72 65 66 69 78 3b 0a 20 20 20 20 65 6c 73 65  prefix;.    else
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ca0 20 20 20 20 70 72 65 66 69 78 20 3d 20 22 22 3b      prefix = "";
19cb0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
19cc0 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b  lemp->nterminal;
19cd0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70 72   i++){.      fpr
19ce0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
19cf0 65 20 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22  e %s%-30s %2d\n"
19d00 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79  ,prefix,lemp->sy
19d10 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69  mbols[i]->name,i
19d20 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b  );.      lineno+
19d30 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  +;.    }.    fpr
19d40 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66  intf(out,"#endif
19d50 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
19d60 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
19d70 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
19d80 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
19d90 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 64  * Generate the d
19da0 65 66 69 6e 65 73 20 2a 2f 0a 20 20 66 70 72 69  efines */.  fpri
19db0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
19dc0 20 59 59 43 4f 44 45 54 59 50 45 20 25 73 5c 6e   YYCODETYPE %s\n
19dd0 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73  ",.    minimum_s
19de0 69 7a 65 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70  ize_type(0, lemp
19df0 2d 3e 6e 73 79 6d 62 6f 6c 2b 35 29 29 3b 20 6c  ->nsymbol+5)); l
19e00 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
19e10 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
19e20 59 59 4e 4f 43 4f 44 45 20 25 64 5c 6e 22 2c 6c  YYNOCODE %d\n",l
19e30 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 31 29 3b  emp->nsymbol+1);
19e40 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70    lineno++;.  fp
19e50 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
19e60 6e 65 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20  ne YYACTIONTYPE 
19e70 25 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d  %s\n",.    minim
19e80 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 30 2c 20  um_size_type(0, 
19e90 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 6c 65 6d  lemp->nstate+lem
19ea0 70 2d 3e 6e 72 75 6c 65 2b 35 29 29 3b 20 20 6c  p->nrule+5));  l
19eb0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c  ineno++;.  if( l
19ec0 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 20 29 7b  emp->wildcard ){
19ed0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
19ee0 2c 22 23 64 65 66 69 6e 65 20 59 59 57 49 4c 44  ,"#define YYWILD
19ef0 43 41 52 44 20 25 64 5c 6e 22 2c 0a 20 20 20 20  CARD %d\n",.    
19f00 20 20 20 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72     lemp->wildcar
19f10 64 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e  d->index); linen
19f20 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74  o++;.  }.  print
19f30 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74  _stack_union(out
19f40 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 2c 6d 68  ,lemp,&lineno,mh
19f50 66 6c 61 67 29 3b 0a 20 20 66 70 72 69 6e 74 66  flag);.  fprintf
19f60 28 6f 75 74 2c 20 22 23 69 66 6e 64 65 66 20 59  (out, "#ifndef Y
19f70 59 53 54 41 43 4b 44 45 50 54 48 5c 6e 22 29 3b  YSTACKDEPTH\n");
19f80 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28   lineno++;.  if(
19f90 20 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65   lemp->stacksize
19fa0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
19fb0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 53  out,"#define YYS
19fc0 54 41 43 4b 44 45 50 54 48 20 25 73 5c 6e 22 2c  TACKDEPTH %s\n",
19fd0 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29  lemp->stacksize)
19fe0 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ;  lineno++;.  }
19ff0 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74  else{.    fprint
1a000 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1a010 59 53 54 41 43 4b 44 45 50 54 48 20 31 30 30 5c  YSTACKDEPTH 100\
1a020 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  n");  lineno++;.
1a030 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
1a040 74 2c 20 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20  t, "#endif\n"); 
1a050 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20  lineno++;.  if( 
1a060 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 66 70  mhflag ){.    fp
1a070 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49  rintf(out,"#if I
1a080 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69  NTERFACE\n"); li
1a090 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 61  neno++;.  }.  na
1a0a0 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20  me = lemp->name 
1a0b0 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22  ? lemp->name : "
1a0c0 50 61 72 73 65 22 3b 0a 20 20 69 66 28 20 6c 65  Parse";.  if( le
1a0d0 6d 70 2d 3e 61 72 67 20 26 26 20 6c 65 6d 70 2d  mp->arg && lemp-
1a0e0 3e 61 72 67 5b 30 5d 20 29 7b 0a 20 20 20 20 69  >arg[0] ){.    i
1a0f0 6e 74 20 69 3b 0a 20 20 20 20 69 20 3d 20 73 74  nt i;.    i = st
1a100 72 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29 3b  rlen(lemp->arg);
1a110 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31  .    while( i>=1
1a120 20 26 26 20 69 73 73 70 61 63 65 28 6c 65 6d 70   && isspace(lemp
1a130 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 29 20 69 2d  ->arg[i-1]) ) i-
1a140 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e  -;.    while( i>
1a150 3d 31 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 6c  =1 && (isalnum(l
1a160 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 7c  emp->arg[i-1]) |
1a170 7c 20 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d  | lemp->arg[i-1]
1a180 3d 3d 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20 20  =='_') ) i--;.  
1a190 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1a1a0 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45  define %sARG_SDE
1a1b0 43 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c  CL %s;\n",name,l
1a1c0 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65  emp->arg);  line
1a1d0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1a1e0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1a1f0 73 41 52 47 5f 50 44 45 43 4c 20 2c 25 73 5c 6e  sARG_PDECL ,%s\n
1a200 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67  ",name,lemp->arg
1a210 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1a220 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1a230 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54  define %sARG_FET
1a240 43 48 20 25 73 20 3d 20 79 79 70 50 61 72 73 65  CH %s = yypParse
1a250 72 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  r->%s\n",.      
1a260 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c             name,
1a270 6c 65 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d  lemp->arg,&lemp-
1a280 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e  >arg[i]);  linen
1a290 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1a2a0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1a2b0 41 52 47 5f 53 54 4f 52 45 20 79 79 70 50 61 72  ARG_STORE yypPar
1a2c0 73 65 72 2d 3e 25 73 20 3d 20 25 73 5c 6e 22 2c  ser->%s = %s\n",
1a2d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a2e0 20 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72    name,&lemp->ar
1a2f0 67 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b  g[i],&lemp->arg[
1a300 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i]);  lineno++;.
1a310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
1a320 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1a330 65 20 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e 22  e %sARG_SDECL\n"
1a340 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ,name);  lineno+
1a350 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
1a360 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
1a370 47 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29  G_PDECL\n",name)
1a380 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1a390 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1a3a0 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43  efine %sARG_FETC
1a3b0 48 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65  H\n",name); line
1a3c0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1a3d0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1a3e0 73 41 52 47 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61  sARG_STORE\n",na
1a3f0 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
1a400 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20   }.  if( mhflag 
1a410 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1a420 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20  ut,"#endif\n"); 
1a430 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1a440 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1a450 66 69 6e 65 20 59 59 4e 53 54 41 54 45 20 25 64  fine YYNSTATE %d
1a460 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  \n",lemp->nstate
1a470 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1a480 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1a490 66 69 6e 65 20 59 59 4e 52 55 4c 45 20 25 64 5c  fine YYNRULE %d\
1a4a0 6e 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b  n",lemp->nrule);
1a4b0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66    lineno++;.  if
1a4c0 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e  ( lemp->errsym->
1a4d0 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20 66 70  useCnt ){.    fp
1a4e0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1a4f0 6e 65 20 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c  ne YYERRORSYMBOL
1a500 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72   %d\n",lemp->err
1a510 73 79 6d 2d 3e 69 6e 64 65 78 29 3b 20 20 6c 69  sym->index);  li
1a520 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1a530 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1a540 20 59 59 45 52 52 53 59 4d 44 54 20 79 79 25 64   YYERRSYMDT yy%d
1a550 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  \n",lemp->errsym
1a560 2d 3e 64 74 6e 75 6d 29 3b 20 20 6c 69 6e 65 6e  ->dtnum);  linen
1a570 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  o++;.  }.  if( l
1a580 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63  emp->has_fallbac
1a590 6b 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  k ){.    fprintf
1a5a0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1a5b0 46 41 4c 4c 42 41 43 4b 20 31 5c 6e 22 29 3b 20  FALLBACK 1\n"); 
1a5c0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1a5d0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1a5e0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1a5f0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1a600 65 72 61 74 65 20 74 68 65 20 61 63 74 69 6f 6e  erate the action
1a610 20 74 61 62 6c 65 20 61 6e 64 20 69 74 73 20 61   table and its a
1a620 73 73 6f 63 69 61 74 65 73 3a 0a 20 20 2a 2a 0a  ssociates:.  **.
1a630 20 20 2a 2a 20 20 79 79 5f 61 63 74 69 6f 6e 5b    **  yy_action[
1a640 5d 20 20 20 20 20 20 20 20 41 20 73 69 6e 67 6c  ]        A singl
1a650 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  e table containi
1a660 6e 67 20 61 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a  ng all actions..
1a670 20 20 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61 68 65    **  yy_lookahe
1a680 61 64 5b 5d 20 20 20 20 20 41 20 74 61 62 6c 65  ad[]     A table
1a690 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1a6a0 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 65 61  lookahead for ea
1a6b0 63 68 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a  ch entry in.  **
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6d0 20 20 20 20 20 79 79 5f 61 63 74 69 6f 6e 2e 20       yy_action. 
1a6e0 20 55 73 65 64 20 74 6f 20 64 65 74 65 63 74 20   Used to detect 
1a6f0 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e  hash collisions.
1a700 0a 20 20 2a 2a 20 20 79 79 5f 73 68 69 66 74 5f  .  **  yy_shift_
1a710 6f 66 73 74 5b 5d 20 20 20 20 46 6f 72 20 65 61  ofst[]    For ea
1a720 63 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66  ch state, the of
1a730 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74  fset into yy_act
1a740 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20  ion for.  **    
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a760 20 73 68 69 66 74 69 6e 67 20 74 65 72 6d 69 6e   shifting termin
1a770 61 6c 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 72 65  als..  **  yy_re
1a780 64 75 63 65 5f 6f 66 73 74 5b 5d 20 20 20 46 6f  duce_ofst[]   Fo
1a790 72 20 65 61 63 68 20 73 74 61 74 65 2c 20 74 68  r each state, th
1a7a0 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79  e offset into yy
1a7b0 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a  _action for.  **
1a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7d0 20 20 20 20 20 73 68 69 66 74 69 6e 67 20 6e 6f       shifting no
1a7e0 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 61 66 74 65  n-terminals afte
1a7f0 72 20 61 20 72 65 64 75 63 65 2e 0a 20 20 2a 2a  r a reduce..  **
1a800 20 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 20    yy_default[]  
1a810 20 20 20 20 20 44 65 66 61 75 6c 74 20 61 63 74       Default act
1a820 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 73 74 61  ion for each sta
1a830 74 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 43  te..  */..  /* C
1a840 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74 69 6f  ompute the actio
1a850 6e 73 20 6f 6e 20 61 6c 6c 20 73 74 61 74 65 73  ns on all states
1a860 20 61 6e 64 20 63 6f 75 6e 74 20 74 68 65 6d 20   and count them 
1a870 75 70 20 2a 2f 0a 20 20 61 78 20 3d 20 63 61 6c  up */.  ax = cal
1a880 6c 6f 63 28 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  loc(lemp->nstate
1a890 2a 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d  *2, sizeof(ax[0]
1a8a0 29 29 3b 0a 20 20 69 66 28 20 61 78 3d 3d 30 20  ));.  if( ax==0 
1a8b0 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
1a8c0 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61  tderr,"malloc fa
1a8d0 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 65 78  iled\n");.    ex
1a8e0 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  it(1);.  }.  for
1a8f0 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1a900 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
1a910 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
1a920 65 64 5b 69 5d 3b 0a 20 20 20 20 61 78 5b 69 2a  ed[i];.    ax[i*
1a930 32 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20  2].stp = stp;.  
1a940 20 20 61 78 5b 69 2a 32 5d 2e 69 73 54 6b 6e 20    ax[i*2].isTkn 
1a950 3d 20 31 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d  = 1;.    ax[i*2]
1a960 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e  .nAction = stp->
1a970 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20 61 78 5b  nTknAct;.    ax[
1a980 69 2a 32 2b 31 5d 2e 73 74 70 20 3d 20 73 74 70  i*2+1].stp = stp
1a990 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e  ;.    ax[i*2+1].
1a9a0 69 73 54 6b 6e 20 3d 20 30 3b 0a 20 20 20 20 61  isTkn = 0;.    a
1a9b0 78 5b 69 2a 32 2b 31 5d 2e 6e 41 63 74 69 6f 6e  x[i*2+1].nAction
1a9c0 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 3b 0a   = stp->nNtAct;.
1a9d0 20 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66 73 74 20    }.  mxTknOfst 
1a9e0 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 30 3b  = mnTknOfst = 0;
1a9f0 0a 20 20 6d 78 4e 74 4f 66 73 74 20 3d 20 6d 6e  .  mxNtOfst = mn
1aa00 4e 74 4f 66 73 74 20 3d 20 30 3b 0a 0a 20 20 2f  NtOfst = 0;..  /
1aa10 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63  * Compute the ac
1aa20 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20 49 6e 20  tion table.  In 
1aa30 6f 72 64 65 72 20 74 6f 20 74 72 79 20 74 6f 20  order to try to 
1aa40 6b 65 65 70 20 74 68 65 20 73 69 7a 65 20 6f 66  keep the size of
1aa50 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 69 6f 6e   the.  ** action
1aa60 20 74 61 62 6c 65 20 74 6f 20 61 20 6d 69 6e 69   table to a mini
1aa70 6d 75 6d 2c 20 74 68 65 20 68 65 75 72 69 73 74  mum, the heurist
1aa80 69 63 20 6f 66 20 70 6c 61 63 69 6e 67 20 74 68  ic of placing th
1aa90 65 20 6c 61 72 67 65 73 74 20 61 63 74 69 6f 6e  e largest action
1aaa0 0a 20 20 2a 2a 20 73 65 74 73 20 66 69 72 73 74  .  ** sets first
1aab0 20 69 73 20 75 73 65 64 2e 0a 20 20 2a 2f 0a 20   is used..  */. 
1aac0 20 71 73 6f 72 74 28 61 78 2c 20 6c 65 6d 70 2d   qsort(ax, lemp-
1aad0 3e 6e 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f  >nstate*2, sizeo
1aae0 66 28 61 78 5b 30 5d 29 2c 20 61 78 73 65 74 5f  f(ax[0]), axset_
1aaf0 63 6f 6d 70 61 72 65 29 3b 0a 20 20 70 41 63 74  compare);.  pAct
1ab00 74 61 62 20 3d 20 61 63 74 74 61 62 5f 61 6c 6c  tab = acttab_all
1ab10 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  oc();.  for(i=0;
1ab20 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a   i<lemp->nstate*
1ab30 32 20 26 26 20 61 78 5b 69 5d 2e 6e 41 63 74 69  2 && ax[i].nActi
1ab40 6f 6e 3e 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  on>0; i++){.    
1ab50 73 74 70 20 3d 20 61 78 5b 69 5d 2e 73 74 70 3b  stp = ax[i].stp;
1ab60 0a 20 20 20 20 69 66 28 20 61 78 5b 69 5d 2e 69  .    if( ax[i].i
1ab70 73 54 6b 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f  sTkn ){.      fo
1ab80 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
1ab90 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1aba0 20 20 20 20 20 20 20 20 69 6e 74 20 61 63 74 69          int acti
1abb0 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  on;.        if( 
1abc0 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c  ap->sp->index>=l
1abd0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29  emp->nterminal )
1abe0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1abf0 20 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70     action = comp
1ac00 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c  ute_action(lemp,
1ac10 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66   ap);.        if
1ac20 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e  ( action<0 ) con
1ac30 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
1ac40 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63  cttab_action(pAc
1ac50 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e  ttab, ap->sp->in
1ac60 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20  dex, action);.  
1ac70 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d      }.      stp-
1ac80 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 61 63 74 74  >iTknOfst = actt
1ac90 61 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61  ab_insert(pActta
1aca0 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  b);.      if( st
1acb0 70 2d 3e 69 54 6b 6e 4f 66 73 74 3c 6d 6e 54 6b  p->iTknOfst<mnTk
1acc0 6e 4f 66 73 74 20 29 20 6d 6e 54 6b 6e 4f 66 73  nOfst ) mnTknOfs
1acd0 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73  t = stp->iTknOfs
1ace0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70  t;.      if( stp
1acf0 2d 3e 69 54 6b 6e 4f 66 73 74 3e 6d 78 54 6b 6e  ->iTknOfst>mxTkn
1ad00 4f 66 73 74 20 29 20 6d 78 54 6b 6e 4f 66 73 74  Ofst ) mxTknOfst
1ad10 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74   = stp->iTknOfst
1ad20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ad30 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
1ad40 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
1ad50 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  xt){.        int
1ad60 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20   action;.       
1ad70 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64   if( ap->sp->ind
1ad80 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e  ex<lemp->ntermin
1ad90 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  al ) continue;. 
1ada0 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73         if( ap->s
1adb0 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e  p->index==lemp->
1adc0 6e 73 79 6d 62 6f 6c 20 29 20 63 6f 6e 74 69 6e  nsymbol ) contin
1add0 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69  ue;.        acti
1ade0 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74  on = compute_act
1adf0 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20  ion(lemp, ap);. 
1ae00 20 20 20 20 20 20 20 69 66 28 20 61 63 74 69 6f         if( actio
1ae10 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  n<0 ) continue;.
1ae20 20 20 20 20 20 20 20 20 61 63 74 74 61 62 5f 61          acttab_a
1ae30 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61  ction(pActtab, a
1ae40 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63  p->sp->index, ac
1ae50 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tion);.      }. 
1ae60 20 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73       stp->iNtOfs
1ae70 74 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72  t = acttab_inser
1ae80 74 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20  t(pActtab);.    
1ae90 20 20 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66    if( stp->iNtOf
1aea0 73 74 3c 6d 6e 4e 74 4f 66 73 74 20 29 20 6d 6e  st<mnNtOfst ) mn
1aeb0 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e  NtOfst = stp->iN
1aec0 74 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28  tOfst;.      if(
1aed0 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3e 6d 78   stp->iNtOfst>mx
1aee0 4e 74 4f 66 73 74 20 29 20 6d 78 4e 74 4f 66 73  NtOfst ) mxNtOfs
1aef0 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  t = stp->iNtOfst
1af00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 72  ;.    }.  }.  fr
1af10 65 65 28 61 78 29 3b 0a 0a 20 20 2f 2a 20 4f 75  ee(ax);..  /* Ou
1af20 74 70 75 74 20 74 68 65 20 79 79 5f 61 63 74 69  tput the yy_acti
1af30 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70  on table */.  fp
1af40 72 69 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69  rintf(out,"stati
1af50 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e  c const YYACTION
1af60 54 59 50 45 20 79 79 5f 61 63 74 69 6f 6e 5b 5d  TYPE yy_action[]
1af70 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   = {\n"); lineno
1af80 2b 2b 3b 0a 20 20 6e 20 3d 20 61 63 74 74 61 62  ++;.  n = acttab
1af90 5f 73 69 7a 65 28 70 41 63 74 74 61 62 29 3b 0a  _size(pActtab);.
1afa0 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
1afb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1afc0 61 63 74 69 6f 6e 20 3d 20 61 63 74 74 61 62 5f  action = acttab_
1afd0 79 79 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62  yyaction(pActtab
1afe0 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 61 63  , i);.    if( ac
1aff0 74 69 6f 6e 3c 30 20 29 20 61 63 74 69 6f 6e 20  tion<0 ) action 
1b000 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b  = lemp->nstate +
1b010 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 32   lemp->nrule + 2
1b020 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29  ;.    if( j==0 )
1b030 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f   fprintf(out," /
1b040 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a  * %5d */ ", i);.
1b050 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b060 20 22 20 25 34 64 2c 22 2c 20 61 63 74 69 6f 6e   " %4d,", action
1b070 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20  );.    if( j==9 
1b080 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20  || i==n-1 ){.   
1b090 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1b0a0 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1b0b0 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
1b0c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
1b0d0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1b0e0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b  fprintf(out, "};
1b0f0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1b100 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
1b110 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 74 61   yy_lookahead ta
1b120 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  ble */.  fprintf
1b130 28 6f 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e  (out,"static con
1b140 73 74 20 59 59 43 4f 44 45 54 59 50 45 20 79 79  st YYCODETYPE yy
1b150 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 3d 20 7b  _lookahead[] = {
1b160 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1b170 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
1b180 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1b190 6c 61 20 3d 20 61 63 74 74 61 62 5f 79 79 6c 6f  la = acttab_yylo
1b1a0 6f 6b 61 68 65 61 64 28 70 41 63 74 74 61 62 2c  okahead(pActtab,
1b1b0 20 69 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 3c   i);.    if( la<
1b1c0 30 20 29 20 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e  0 ) la = lemp->n
1b1d0 73 79 6d 62 6f 6c 3b 0a 20 20 20 20 69 66 28 20  symbol;.    if( 
1b1e0 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f  j==0 ) fprintf(o
1b1f0 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22  ut," /* %5d */ "
1b200 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , i);.    fprint
1b210 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20  f(out, " %4d,", 
1b220 6c 61 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  la);.    if( j==
1b230 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20  9 || i==n-1 ){. 
1b240 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1b250 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  , "\n"); lineno+
1b260 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  +;.      j = 0;.
1b270 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b280 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
1b290 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1b2a0 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  };\n"); lineno++
1b2b0 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
1b2c0 68 65 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74  he yy_shift_ofst
1b2d0 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70  [] table */.  fp
1b2e0 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
1b2f0 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 55 53 45  ine YY_SHIFT_USE
1b300 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d  _DFLT (%d)\n", m
1b310 6e 54 6b 6e 4f 66 73 74 2d 31 29 3b 20 6c 69 6e  nTknOfst-1); lin
1b320 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d  eno++;.  n = lem
1b330 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68 69  p->nstate;.  whi
1b340 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d  le( n>0 && lemp-
1b350 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 54  >sorted[n-1]->iT
1b360 6b 6e 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45  knOfst==NO_OFFSE
1b370 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e  T ) n--;.  fprin
1b380 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65  tf(out, "#define
1b390 20 59 59 5f 53 48 49 46 54 5f 4d 41 58 20 25 64   YY_SHIFT_MAX %d
1b3a0 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e  \n", n-1); linen
1b3b0 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1b3c0 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73  ut, "static cons
1b3d0 74 20 25 73 20 79 79 5f 73 68 69 66 74 5f 6f 66  t %s yy_shift_of
1b3e0 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20  st[] = {\n", .  
1b3f0 20 20 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f          minimum_
1b400 73 69 7a 65 5f 74 79 70 65 28 6d 6e 54 6b 6e 4f  size_type(mnTknO
1b410 66 73 74 2d 31 2c 20 6d 78 54 6b 6e 4f 66 73 74  fst-1, mxTknOfst
1b420 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  )); lineno++;.  
1b430 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
1b440 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66  i++){.    int of
1b450 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  st;.    stp = le
1b460 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
1b470 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69     ofst = stp->i
1b480 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 69 66 28  TknOfst;.    if(
1b490 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54   ofst==NO_OFFSET
1b4a0 20 29 20 6f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f   ) ofst = mnTknO
1b4b0 66 73 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28  fst - 1;.    if(
1b4c0 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28   j==0 ) fprintf(
1b4d0 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20  out," /* %5d */ 
1b4e0 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e  ", i);.    fprin
1b4f0 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c  tf(out, " %4d,",
1b500 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20   ofst);.    if( 
1b510 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29  j==9 || i==n-1 )
1b520 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1b530 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65  out, "\n"); line
1b540 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20  no++;.      j = 
1b550 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1b560 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      j++;.    }. 
1b570 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
1b580 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  , "};\n"); linen
1b590 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  o++;..  /* Outpu
1b5a0 74 20 74 68 65 20 79 79 5f 72 65 64 75 63 65 5f  t the yy_reduce_
1b5b0 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a  ofst[] table */.
1b5c0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1b5d0 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43  #define YY_REDUC
1b5e0 45 5f 55 53 45 5f 44 46 4c 54 20 28 25 64 29 5c  E_USE_DFLT (%d)\
1b5f0 6e 22 2c 20 6d 6e 4e 74 4f 66 73 74 2d 31 29 3b  n", mnNtOfst-1);
1b600 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d   lineno++;.  n =
1b610 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20   lemp->nstate;. 
1b620 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c   while( n>0 && l
1b630 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d  emp->sorted[n-1]
1b640 2d 3e 69 4e 74 4f 66 73 74 3d 3d 4e 4f 5f 4f 46  ->iNtOfst==NO_OF
1b650 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70  FSET ) n--;.  fp
1b660 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
1b670 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 4d 41  ine YY_REDUCE_MA
1b680 58 20 25 64 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c  X %d\n", n-1); l
1b690 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
1b6a0 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20  tf(out, "static 
1b6b0 63 6f 6e 73 74 20 25 73 20 79 79 5f 72 65 64 75  const %s yy_redu
1b6c0 63 65 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22  ce_ofst[] = {\n"
1b6d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6d 69 6e  , .          min
1b6e0 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d  imum_size_type(m
1b6f0 6e 4e 74 4f 66 73 74 2d 31 2c 20 6d 78 4e 74 4f  nNtOfst-1, mxNtO
1b700 66 73 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  fst)); lineno++;
1b710 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
1b720 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; i++){.    int
1b730 20 6f 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d   ofst;.    stp =
1b740 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
1b750 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70  ;.    ofst = stp
1b760 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 69  ->iNtOfst;.    i
1b770 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53  f( ofst==NO_OFFS
1b780 45 54 20 29 20 6f 66 73 74 20 3d 20 6d 6e 4e 74  ET ) ofst = mnNt
1b790 4f 66 73 74 20 2d 20 31 3b 0a 20 20 20 20 69 66  Ofst - 1;.    if
1b7a0 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66  ( j==0 ) fprintf
1b7b0 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f  (out," /* %5d */
1b7c0 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69   ", i);.    fpri
1b7d0 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22  ntf(out, " %4d,"
1b7e0 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28  , ofst);.    if(
1b7f0 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20   j==9 || i==n-1 
1b800 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
1b810 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e  (out, "\n"); lin
1b820 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d  eno++;.      j =
1b830 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1b840 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a       j++;.    }.
1b850 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
1b860 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65  t, "};\n"); line
1b870 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  no++;..  /* Outp
1b880 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 61  ut the default a
1b890 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20  ction table */. 
1b8a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73   fprintf(out, "s
1b8b0 74 61 74 69 63 20 63 6f 6e 73 74 20 59 59 41 43  tatic const YYAC
1b8c0 54 49 4f 4e 54 59 50 45 20 79 79 5f 64 65 66 61  TIONTYPE yy_defa
1b8d0 75 6c 74 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c  ult[] = {\n"); l
1b8e0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c  ineno++;.  n = l
1b8f0 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 66  emp->nstate;.  f
1b900 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
1b910 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
1b920 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
1b930 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
1b940 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
1b950 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
1b960 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1b970 20 25 34 64 2c 22 2c 20 73 74 70 2d 3e 69 44 66   %4d,", stp->iDf
1b980 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  lt);.    if( j==
1b990 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20  9 || i==n-1 ){. 
1b9a0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1b9b0 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  , "\n"); lineno+
1b9c0 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  +;.      j = 0;.
1b9d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b9e0 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
1b9f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1ba00 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  };\n"); lineno++
1ba10 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
1ba20 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1ba30 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1ba40 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 61 62  Generate the tab
1ba50 6c 65 20 6f 66 20 66 61 6c 6c 62 61 63 6b 20 74  le of fallback t
1ba60 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  okens..  */.  if
1ba70 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c  ( lemp->has_fall
1ba80 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28  back ){.    for(
1ba90 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65  i=0; i<lemp->nte
1baa0 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  rminal; i++){.  
1bab0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
1bac0 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d  l *p = lemp->sym
1bad0 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69  bols[i];.      i
1bae0 66 28 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d  f( p->fallback==
1baf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  0 ){.        fpr
1bb00 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20 30  intf(out, "    0
1bb10 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e 6f  ,  /* %10s => no
1bb20 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d 3e  thing */\n", p->
1bb30 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
1bb40 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  se{.        fpri
1bb50 6e 74 66 28 6f 75 74 2c 20 22 20 20 25 33 64 2c  ntf(out, "  %3d,
1bb60 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73 20    /* %10s => %s 
1bb70 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62 61  */\n", p->fallba
1bb80 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20 20  ck->index,.     
1bb90 20 20 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70 2d       p->name, p-
1bba0 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65 29  >fallback->name)
1bbb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bbc0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
1bbd0 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
1bbe0 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c 20  lemp->name, in, 
1bbf0 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  out, &lineno);..
1bc00 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1bc10 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1bc20 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61   the symbolic na
1bc30 6d 65 20 6f 66 20 65 76 65 72 79 20 73 79 6d 62  me of every symb
1bc40 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ol.  */.  for(i=
1bc50 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
1bc60 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70  ol; i++){.    sp
1bc70 72 69 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25 73  rintf(line,"\"%s
1bc80 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  \",",lemp->symbo
1bc90 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ls[i]->name);.  
1bca0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1bcb0 20 25 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a 20   %-15s",line);. 
1bcc0 20 20 20 69 66 28 20 28 69 26 33 29 3d 3d 33 20     if( (i&3)==3 
1bcd0 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ){ fprintf(out,"
1bce0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n"); lineno++; 
1bcf0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 26 33  }.  }.  if( (i&3
1bd00 29 21 3d 30 20 29 7b 20 66 70 72 69 6e 74 66 28  )!=0 ){ fprintf(
1bd10 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  out,"\n"); linen
1bd20 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78 66  o++; }.  tplt_xf
1bd30 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1bd40 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1bd50 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1bd60 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1bd70 20 61 20 74 65 78 74 20 73 74 72 69 6e 67 20 74   a text string t
1bd80 68 61 74 20 64 65 73 63 72 69 62 65 73 20 65 76  hat describes ev
1bd90 65 72 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69 6e  ery.  ** rule in
1bda0 20 74 68 65 20 72 75 6c 65 20 73 65 74 20 6f 66   the rule set of
1bdb0 20 74 68 65 20 67 72 61 6d 6d 65 72 2e 20 20 54   the grammer.  T
1bdc0 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
1bdd0 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 77 68 65  is used.  ** whe
1bde0 6e 20 74 72 61 63 69 6e 67 20 52 45 44 55 43 45  n tracing REDUCE
1bdf0 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20   actions..  */. 
1be00 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d   for(i=0, rp=lem
1be10 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
1be20 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a  rp->next, i++){.
1be30 20 20 20 20 61 73 73 65 72 74 28 20 72 70 2d 3e      assert( rp->
1be40 69 6e 64 65 78 3d 3d 69 20 29 3b 0a 20 20 20 20  index==i );.    
1be50 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
1be60 20 25 33 64 20 2a 2f 20 5c 22 22 2c 20 69 29 3b   %3d */ \"", i);
1be70 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54 65  .    writeRuleTe
1be80 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20  xt(out, rp);.   
1be90 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22   fprintf(out,"\"
1bea0 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ,\n"); lineno++;
1beb0 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
1bec0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1bed0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1bee0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1bef0 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20   which executes 
1bf00 65 76 65 72 79 20 74 69 6d 65 20 61 20 73 79 6d  every time a sym
1bf10 62 6f 6c 20 69 73 20 70 6f 70 70 65 64 20 66 72  bol is popped fr
1bf20 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63  om.  ** the stac
1bf30 6b 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  k while processi
1bf40 6e 67 20 65 72 72 6f 72 73 20 6f 72 20 77 68 69  ng errors or whi
1bf50 6c 65 20 64 65 73 74 72 6f 79 69 6e 67 20 74 68  le destroying th
1bf60 65 20 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a 20  e parser. .  ** 
1bf70 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
1bf80 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 25 64   generate the %d
1bf90 65 73 74 72 75 63 74 6f 72 20 61 63 74 69 6f 6e  estructor action
1bfa0 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65  s).  */.  if( le
1bfb0 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29 7b  mp->tokendest ){
1bfc0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1bfd0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
1bfe0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
1bff0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
1c000 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
1c010 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30  .      if( sp==0
1c020 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21 3d 54 45   || sp->type!=TE
1c030 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75  RMINAL ) continu
1c040 65 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  e;.      fprintf
1c050 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25  (out,"    case %
1c060 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a  d: /* %s */\n",.
1c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 70                sp
1c080 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d  ->index, sp->nam
1c090 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
1c0a0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
1c0b0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1c0c0 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c   && lemp->symbol
1c0d0 73 5b 69 5d 2d 3e 74 79 70 65 21 3d 54 45 52 4d  s[i]->type!=TERM
1c0e0 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20 20 20 20  INAL; i++);.    
1c0f0 69 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  if( i<lemp->nsym
1c100 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 65 6d 69  bol ){.      emi
1c110 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64  t_destructor_cod
1c120 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62  e(out,lemp->symb
1c130 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e  ols[i],lemp,&lin
1c140 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70 72 69  eno);.      fpri
1c150 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62  ntf(out,"      b
1c160 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
1c170 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  o++;.    }.  }. 
1c180 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65   if( lemp->varde
1c190 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  st ){.    struct
1c1a0 20 73 79 6d 62 6f 6c 20 2a 64 66 6c 74 5f 73 70   symbol *dflt_sp
1c1b0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
1c1c0 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
1c1d0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
1c1e0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
1c1f0 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
1c200 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  s[i];.      if( 
1c210 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70  sp==0 || sp->typ
1c220 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 0a 20  e==TERMINAL ||. 
1c230 20 20 20 20 20 20 20 20 20 73 70 2d 3e 69 6e 64           sp->ind
1c240 65 78 3c 3d 30 20 7c 7c 20 73 70 2d 3e 64 65 73  ex<=0 || sp->des
1c250 74 72 75 63 74 6f 72 21 3d 30 20 29 20 63 6f 6e  tructor!=0 ) con
1c260 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 70 72  tinue;.      fpr
1c270 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61  intf(out,"    ca
1c280 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c  se %d: /* %s */\
1c290 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1c2a0 20 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d    sp->index, sp-
1c2b0 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  >name); lineno++
1c2c0 3b 0a 20 20 20 20 20 20 64 66 6c 74 5f 73 70 20  ;.      dflt_sp 
1c2d0 3d 20 73 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = sp;.    }.    
1c2e0 69 66 28 20 64 66 6c 74 5f 73 70 21 3d 30 20 29  if( dflt_sp!=0 )
1c2f0 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65 73  {.      emit_des
1c300 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74  tructor_code(out
1c310 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d 70 2c 26 6c  ,dflt_sp,lemp,&l
1c320 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70  ineno);.      fp
1c330 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
1c340 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
1c350 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  eno++;.    }.  }
1c360 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
1c370 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
1c380 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79  ){.    struct sy
1c390 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d  mbol *sp = lemp-
1c3a0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
1c3b0 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70   if( sp==0 || sp
1c3c0 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
1c3d0 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74   || sp->destruct
1c3e0 6f 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  or==0 ) continue
1c3f0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1c400 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 20  t,"    case %d: 
1c410 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20  /* %s */\n",.   
1c420 20 20 20 20 20 20 20 20 20 73 70 2d 3e 69 6e 64           sp->ind
1c430 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c  ex, sp->name); l
1c440 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  ineno++;..    /*
1c450 20 43 6f 6d 62 69 6e 65 20 64 75 70 6c 69 63 61   Combine duplica
1c460 74 65 20 64 65 73 74 72 75 63 74 6f 72 73 20 69  te destructors i
1c470 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 63 61 73  nto a single cas
1c480 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 69  e */.    for(j=i
1c490 2b 31 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  +1; j<lemp->nsym
1c4a0 62 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  bol; j++){.     
1c4b0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1c4c0 73 70 32 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62  sp2 = lemp->symb
1c4d0 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  ols[j];.      if
1c4e0 28 20 73 70 32 20 26 26 20 73 70 32 2d 3e 74 79  ( sp2 && sp2->ty
1c4f0 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 26 26 20  pe!=TERMINAL && 
1c500 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 0a  sp2->destructor.
1c510 20 20 20 20 20 20 20 20 20 20 26 26 20 73 70 32            && sp2
1c520 2d 3e 64 74 6e 75 6d 3d 3d 73 70 2d 3e 64 74 6e  ->dtnum==sp->dtn
1c530 75 6d 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  um.          && 
1c540 73 74 72 63 6d 70 28 73 70 2d 3e 64 65 73 74 72  strcmp(sp->destr
1c550 75 63 74 6f 72 2c 73 70 32 2d 3e 64 65 73 74 72  uctor,sp2->destr
1c560 75 63 74 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20  uctor)==0 ){.   
1c570 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1c580 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 20  t,"    case %d: 
1c590 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20  /* %s */\n",.   
1c5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 70                sp
1c5b0 32 2d 3e 69 6e 64 65 78 2c 20 73 70 32 2d 3e 6e  2->index, sp2->n
1c5c0 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
1c5d0 20 20 20 20 20 20 20 20 20 73 70 32 2d 3e 64 65           sp2->de
1c5e0 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20  structor = 0;.  
1c5f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1c600 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72   emit_destructor
1c610 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e  _code(out,lemp->
1c620 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c  symbols[i],lemp,
1c630 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70  &lineno);.    fp
1c640 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
1c650 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
1c660 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
1c670 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1c680 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1c690 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1c6a0 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
1c6b0 63 75 74 65 73 20 77 68 65 6e 65 76 65 72 20 74  cutes whenever t
1c6c0 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20  he parser stack 
1c6d0 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 74  overflows */.  t
1c6e0 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
1c6f0 6d 70 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f  mp,lemp->overflo
1c700 77 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70  w,&lineno);.  tp
1c710 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1c720 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
1c730 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
1c740 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20  te the table of 
1c750 72 75 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  rule information
1c760 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65   .  **.  ** Note
1c770 3a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  : This code depe
1c780 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
1c790 74 68 61 74 20 72 75 6c 65 73 20 61 72 65 20 6e  that rules are n
1c7a0 75 6d 62 65 72 0a 20 20 2a 2a 20 73 65 71 75 65  umber.  ** seque
1c7b0 6e 74 75 61 6c 6c 79 20 62 65 67 69 6e 6e 69 6e  ntually beginnin
1c7c0 67 20 77 69 74 68 20 30 2e 0a 20 20 2a 2f 0a 20  g with 0..  */. 
1c7d0 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
1c7e0 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
1c7f0 65 78 74 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  ext){.    fprint
1c800 66 28 6f 75 74 2c 22 20 20 7b 20 25 64 2c 20 25  f(out,"  { %d, %
1c810 64 20 7d 2c 5c 6e 22 2c 72 70 2d 3e 6c 68 73 2d  d },\n",rp->lhs-
1c820 3e 69 6e 64 65 78 2c 72 70 2d 3e 6e 72 68 73 29  >index,rp->nrhs)
1c830 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
1c840 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1c850 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1c860 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1c870 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63  nerate code whic
1c880 68 20 65 78 65 63 75 74 69 6f 6e 20 64 75 72 69  h execution duri
1c890 6e 67 20 65 61 63 68 20 52 45 44 55 43 45 20 61  ng each REDUCE a
1c8a0 63 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 72  ction */.  for(r
1c8b0 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
1c8c0 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
1c8d0 20 20 20 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f      translate_co
1c8e0 64 65 28 6c 65 6d 70 2c 20 72 70 29 3b 0a 20 20  de(lemp, rp);.  
1c8f0 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  }.  for(rp=lemp-
1c900 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
1c910 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 73 74 72  ->next){.    str
1c920 75 63 74 20 72 75 6c 65 20 2a 72 70 32 3b 0a 20  uct rule *rp2;. 
1c930 20 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d     if( rp->code=
1c940 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1c950 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1c960 20 20 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f        case %d: /
1c970 2a 20 22 2c 20 72 70 2d 3e 69 6e 64 65 78 29 3b  * ", rp->index);
1c980 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54 65  .    writeRuleTe
1c990 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20  xt(out, rp);.   
1c9a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
1c9b0 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  */\n"); lineno++
1c9c0 3b 0a 20 20 20 20 66 6f 72 28 72 70 32 3d 72 70  ;.    for(rp2=rp
1c9d0 2d 3e 6e 65 78 74 3b 20 72 70 32 3b 20 72 70 32  ->next; rp2; rp2
1c9e0 3d 72 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =rp2->next){.   
1c9f0 20 20 20 69 66 28 20 72 70 32 2d 3e 63 6f 64 65     if( rp2->code
1ca00 3d 3d 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20  ==rp->code ){.  
1ca10 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1ca20 74 2c 22 20 20 20 20 20 20 63 61 73 65 20 25 64  t,"      case %d
1ca30 3a 20 2f 2a 20 22 2c 20 72 70 32 2d 3e 69 6e 64  : /* ", rp2->ind
1ca40 65 78 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69  ex);.        wri
1ca50 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20  teRuleText(out, 
1ca60 72 70 32 29 3b 0a 20 20 20 20 20 20 20 20 66 70  rp2);.        fp
1ca70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2a 2f 5c 6e  rintf(out," */\n
1ca80 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1ca90 20 20 20 20 20 20 72 70 32 2d 3e 63 6f 64 65 20        rp2->code 
1caa0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1cab0 20 7d 0a 20 20 20 20 65 6d 69 74 5f 63 6f 64 65   }.    emit_code
1cac0 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c 69  (out,rp,lemp,&li
1cad0 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e  neno);.    fprin
1cae0 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20  tf(out,"        
1caf0 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65  break;\n"); line
1cb00 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  no++;.  }.  tplt
1cb10 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1cb20 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1cb30 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1cb40 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   code which exec
1cb50 75 74 65 73 20 69 66 20 61 20 70 61 72 73 65 20  utes if a parse 
1cb60 66 61 69 6c 73 20 2a 2f 0a 20 20 74 70 6c 74 5f  fails */.  tplt_
1cb70 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
1cb80 65 6d 70 2d 3e 66 61 69 6c 75 72 65 2c 26 6c 69  emp->failure,&li
1cb90 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66  neno);.  tplt_xf
1cba0 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1cbb0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1cbc0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1cbd0 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
1cbe0 73 20 77 68 65 6e 20 61 20 73 79 6e 74 61 78 20  s when a syntax 
1cbf0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a  error occurs */.
1cc00 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
1cc10 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 72 72 6f  ,lemp,lemp->erro
1cc20 72 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70  r,&lineno);.  tp
1cc30 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1cc40 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
1cc50 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
1cc60 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78  te code which ex
1cc70 65 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20  ecutes when the 
1cc80 70 61 72 73 65 72 20 61 63 63 65 70 74 73 20 69  parser accepts i
1cc90 74 73 20 69 6e 70 75 74 20 2a 2f 0a 20 20 74 70  ts input */.  tp
1cca0 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d  lt_print(out,lem
1ccb0 70 2c 6c 65 6d 70 2d 3e 61 63 63 65 70 74 2c 26  p,lemp->accept,&
1ccc0 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f  lineno);.  tplt_
1ccd0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1cce0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1ccf0 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 61 6e  ..  /* Append an
1cd00 79 20 61 64 64 69 74 69 6f 6e 20 63 6f 64 65 20  y addition code 
1cd10 74 68 65 20 75 73 65 72 20 64 65 73 69 72 65 73  the user desires
1cd20 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
1cd30 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
1cd40 65 78 74 72 61 63 6f 64 65 2c 26 6c 69 6e 65 6e  extracode,&linen
1cd50 6f 29 3b 0a 0a 20 20 66 63 6c 6f 73 65 28 69 6e  o);..  fclose(in
1cd60 29 3b 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74 29  );.  fclose(out)
1cd70 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
1cd80 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 65 61  * Generate a hea
1cd90 64 65 72 20 66 69 6c 65 20 66 6f 72 20 74 68 65  der file for the
1cda0 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20   parser */.void 
1cdb0 52 65 70 6f 72 74 48 65 61 64 65 72 28 6c 65 6d  ReportHeader(lem
1cdc0 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
1cdd0 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 46 49 4c 45 20  *lemp;.{.  FILE 
1cde0 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61  *out, *in;.  cha
1cdf0 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 63 68 61  r *prefix;.  cha
1ce00 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d  r line[LINESIZE]
1ce10 3b 0a 20 20 63 68 61 72 20 70 61 74 74 65 72 6e  ;.  char pattern
1ce20 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e  [LINESIZE];.  in
1ce30 74 20 69 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70  t i;..  if( lemp
1ce40 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29 20  ->tokenprefix ) 
1ce50 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74  prefix = lemp->t
1ce60 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 65 6c  okenprefix;.  el
1ce70 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
1ce80 20 20 20 20 20 20 70 72 65 66 69 78 20 3d 20 22        prefix = "
1ce90 22 3b 0a 20 20 69 6e 20 3d 20 66 69 6c 65 5f 6f  ";.  in = file_o
1cea0 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 72  pen(lemp,".h","r
1ceb0 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 20 29 7b  b");.  if( in ){
1cec0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
1ced0 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  lemp->nterminal 
1cee0 26 26 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49  && fgets(line,LI
1cef0 4e 45 53 49 5a 45 2c 69 6e 29 3b 20 69 2b 2b 29  NESIZE,in); i++)
1cf00 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  {.      sprintf(
1cf10 70 61 74 74 65 72 6e 2c 22 23 64 65 66 69 6e 65  pattern,"#define
1cf20 20 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c   %s%-30s %2d\n",
1cf30 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d  prefix,lemp->sym
1cf40 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29  bols[i]->name,i)
1cf50 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  ;.      if( strc
1cf60 6d 70 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e 29  mp(line,pattern)
1cf70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
1cf80 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
1cf90 20 20 20 20 69 66 28 20 69 3d 3d 6c 65 6d 70 2d      if( i==lemp-
1cfa0 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20  >nterminal ){.  
1cfb0 20 20 20 20 2f 2a 20 4e 6f 20 63 68 61 6e 67 65      /* No change
1cfc0 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 44   in the file.  D
1cfd0 6f 6e 27 74 20 72 65 77 72 69 74 65 20 69 74 2e  on't rewrite it.
1cfe0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1cff0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6f 75  ;.    }.  }.  ou
1d000 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65  t = file_open(le
1d010 6d 70 2c 22 2e 68 22 2c 22 77 62 22 29 3b 0a 20  mp,".h","wb");. 
1d020 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
1d030 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d  for(i=1; i<lemp-
1d040 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29  >nterminal; i++)
1d050 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1d060 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25  out,"#define %s%
1d070 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66  -30s %2d\n",pref
1d080 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ix,lemp->symbols
1d090 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20  [i]->name,i);.  
1d0a0 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 6f    }.    fclose(o
1d0b0 75 74 29 3b 20 20 0a 20 20 7d 0a 20 20 72 65 74  ut);  .  }.  ret
1d0c0 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 64 75 63  urn;.}../* Reduc
1d0d0 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1d0e0 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 2c  e action tables,
1d0f0 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 62 79   if possible, by
1d100 20 6d 61 6b 69 6e 67 20 75 73 65 0a 2a 2a 20 6f   making use.** o
1d110 66 20 64 65 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a  f defaults..**.*
1d120 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
1d130 6e 2c 20 77 65 20 74 61 6b 65 20 74 68 65 20 6d  n, we take the m
1d140 6f 73 74 20 66 72 65 71 75 65 6e 74 20 52 45 44  ost frequent RED
1d150 55 43 45 20 61 63 74 69 6f 6e 20 61 6e 64 20 6d  UCE action and m
1d160 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20 64 65  ake.** it the de
1d170 66 61 75 6c 74 2e 20 20 45 78 63 65 70 74 2c 20  fault.  Except, 
1d180 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66 61  there is no defa
1d190 75 6c 74 20 69 66 20 74 68 65 20 77 69 6c 64 63  ult if the wildc
1d1a0 61 72 64 20 74 6f 6b 65 6e 0a 2a 2a 20 69 73 20  ard token.** is 
1d1b0 61 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b 2d  a possible look-
1d1c0 61 68 65 61 64 2e 0a 2a 2f 0a 76 6f 69 64 20 43  ahead..*/.void C
1d1d0 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28 6c 65  ompressTables(le
1d1e0 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
1d1f0 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75   *lemp;.{.  stru
1d200 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
1d210 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
1d220 61 70 2c 20 2a 61 70 32 3b 0a 20 20 73 74 72 75  ap, *ap2;.  stru
1d230 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 72 70  ct rule *rp, *rp
1d240 32 2c 20 2a 72 62 65 73 74 3b 0a 20 20 69 6e 74  2, *rbest;.  int
1d250 20 6e 62 65 73 74 2c 20 6e 3b 0a 20 20 69 6e 74   nbest, n;.  int
1d260 20 69 3b 0a 20 20 69 6e 74 20 75 73 65 73 57 69   i;.  int usesWi
1d270 6c 64 63 61 72 64 3b 0a 0a 20 20 66 6f 72 28 69  ldcard;..  for(i
1d280 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
1d290 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
1d2a0 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
1d2b0 5b 69 5d 3b 0a 20 20 20 20 6e 62 65 73 74 20 3d  [i];.    nbest =
1d2c0 20 30 3b 0a 20 20 20 20 72 62 65 73 74 20 3d 20   0;.    rbest = 
1d2d0 30 3b 0a 20 20 20 20 75 73 65 73 57 69 6c 64 63  0;.    usesWildc
1d2e0 61 72 64 20 3d 20 30 3b 0a 0a 20 20 20 20 66 6f  ard = 0;..    fo
1d2f0 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
1d300 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1d310 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
1d320 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70 2d  pe==SHIFT && ap-
1d330 3e 73 70 3d 3d 6c 65 6d 70 2d 3e 77 69 6c 64 63  >sp==lemp->wildc
1d340 61 72 64 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ard ){.        u
1d350 73 65 73 57 69 6c 64 63 61 72 64 20 3d 20 31 3b  sesWildcard = 1;
1d360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1d370 66 28 20 61 70 2d 3e 74 79 70 65 21 3d 52 45 44  f( ap->type!=RED
1d380 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UCE ) continue;.
1d390 20 20 20 20 20 20 72 70 20 3d 20 61 70 2d 3e 78        rp = ap->x
1d3a0 2e 72 70 3b 0a 20 20 20 20 20 20 69 66 28 20 72  .rp;.      if( r
1d3b0 70 2d 3e 6c 68 73 53 74 61 72 74 20 29 20 63 6f  p->lhsStart ) co
1d3c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
1d3d0 28 20 72 70 3d 3d 72 62 65 73 74 20 29 20 63 6f  ( rp==rbest ) co
1d3e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20  ntinue;.      n 
1d3f0 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 61  = 1;.      for(a
1d400 70 32 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70 32  p2=ap->next; ap2
1d410 3b 20 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29  ; ap2=ap2->next)
1d420 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  {.        if( ap
1d430 32 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45 20  2->type!=REDUCE 
1d440 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1d450 20 20 20 20 72 70 32 20 3d 20 61 70 32 2d 3e 78      rp2 = ap2->x
1d460 2e 72 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  .rp;.        if(
1d470 20 72 70 32 3d 3d 72 62 65 73 74 20 29 20 63 6f   rp2==rbest ) co
1d480 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1d490 69 66 28 20 72 70 32 3d 3d 72 70 20 29 20 6e 2b  if( rp2==rp ) n+
1d4a0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
1d4b0 20 69 66 28 20 6e 3e 6e 62 65 73 74 20 29 7b 0a   if( n>nbest ){.
1d4c0 20 20 20 20 20 20 20 20 6e 62 65 73 74 20 3d 20          nbest = 
1d4d0 6e 3b 0a 20 20 20 20 20 20 20 20 72 62 65 73 74  n;.        rbest
1d4e0 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 7d 0a 20   = rp;.      }. 
1d4f0 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 44 6f     }. .    /* Do
1d500 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 65 66 61   not make a defa
1d510 75 6c 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65  ult if the numbe
1d520 72 20 6f 66 20 72 75 6c 65 73 20 74 6f 20 64 65  r of rules to de
1d530 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 69 73 20  fault.    ** is 
1d540 6e 6f 74 20 61 74 20 6c 65 61 73 74 20 31 20 6f  not at least 1 o
1d550 72 20 69 66 20 74 68 65 20 77 69 6c 64 63 61 72  r if the wildcar
1d560 64 20 74 6f 6b 65 6e 20 69 73 20 61 20 70 6f 73  d token is a pos
1d570 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f  sible.    ** loo
1d580 6b 61 68 65 61 64 2e 0a 20 20 20 20 2a 2f 0a 20  kahead..    */. 
1d590 20 20 20 69 66 28 20 6e 62 65 73 74 3c 31 20 7c     if( nbest<1 |
1d5a0 7c 20 75 73 65 73 57 69 6c 64 63 61 72 64 20 29  | usesWildcard )
1d5b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20 20   continue;...   
1d5c0 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 6d 61 74 63   /* Combine matc
1d5d0 68 69 6e 67 20 52 45 44 55 43 45 20 61 63 74 69  hing REDUCE acti
1d5e0 6f 6e 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  ons into a singl
1d5f0 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20 20  e default */.   
1d600 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
1d610 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
1d620 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d  ){.      if( ap-
1d630 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26  >type==REDUCE &&
1d640 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74   ap->x.rp==rbest
1d650 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
1d660 20 20 20 20 61 73 73 65 72 74 28 20 61 70 20 29      assert( ap )
1d670 3b 0a 20 20 20 20 61 70 2d 3e 73 70 20 3d 20 53  ;.    ap->sp = S
1d680 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61  ymbol_new("{defa
1d690 75 6c 74 7d 22 29 3b 0a 20 20 20 20 66 6f 72 28  ult}");.    for(
1d6a0 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3b  ap=ap->next; 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 61  >x.rp==rbest ) a
1d6f0 70 2d 3e 74 79 70 65 20 3d 20 4e 4f 54 5f 55 53  p->type = NOT_US
1d700 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  ED;.    }.    st
1d710 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73  p->ap = Action_s
1d720 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20  ort(stp->ap);.  
1d730 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  }.}.../*.** Comp
1d740 61 72 65 20 74 77 6f 20 73 74 61 74 65 73 20 66  are two states f
1d750 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f  or sorting purpo
1d760 73 65 73 2e 20 20 54 68 65 20 73 6d 61 6c 6c 65  ses.  The smalle
1d770 72 20 73 74 61 74 65 20 69 73 20 74 68 65 0a 2a  r state is the.*
1d780 2a 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d  * one with the m
1d790 6f 73 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  ost non-terminal
1d7a0 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68   actions.  If th
1d7b0 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
1d7c0 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e 6f   number.** of no
1d7d0 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f  n-terminal actio
1d7e0 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 73 6d 61  ns, then the sma
1d7f0 6c 6c 65 72 20 69 73 20 74 68 65 20 6f 6e 65 20  ller is the one 
1d800 77 69 74 68 20 74 68 65 20 6d 6f 73 74 0a 2a 2a  with the most.**
1d810 20 74 6f 6b 65 6e 20 61 63 74 69 6f 6e 73 2e 0a   token actions..
1d820 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74  */.static int st
1d830 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65  ateResortCompare
1d840 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20  (const void *a, 
1d850 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a  const void *b){.
1d860 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
1d870 74 61 74 65 20 2a 70 41 20 3d 20 2a 28 63 6f 6e  tate *pA = *(con
1d880 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65 2a  st struct state*
1d890 2a 29 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72  *)a;.  const str
1d8a0 75 63 74 20 73 74 61 74 65 20 2a 70 42 20 3d 20  uct state *pB = 
1d8b0 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73  *(const struct s
1d8c0 74 61 74 65 2a 2a 29 62 3b 0a 20 20 69 6e 74 20  tate**)b;.  int 
1d8d0 6e 3b 0a 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e 4e  n;..  n = pB->nN
1d8e0 74 41 63 74 20 2d 20 70 41 2d 3e 6e 4e 74 41 63  tAct - pA->nNtAc
1d8f0 74 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  t;.  if( n==0 ){
1d900 0a 20 20 20 20 6e 20 3d 20 70 42 2d 3e 6e 54 6b  .    n = pB->nTk
1d910 6e 41 63 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e 41  nAct - pA->nTknA
1d920 63 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ct;.  }.  return
1d930 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65   n;.}.../*.** Re
1d940 6e 75 6d 62 65 72 20 61 6e 64 20 72 65 73 6f 72  number and resor
1d950 74 20 73 74 61 74 65 73 20 73 6f 20 74 68 61 74  t states so that
1d960 20 73 74 61 74 65 73 20 77 69 74 68 20 66 65 77   states with few
1d970 65 72 20 63 68 6f 69 63 65 73 0a 2a 2a 20 6f 63  er choices.** oc
1d980 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20  cur at the end. 
1d990 20 45 78 63 65 70 74 2c 20 6b 65 65 70 20 73 74   Except, keep st
1d9a0 61 74 65 20 30 20 61 73 20 74 68 65 20 66 69 72  ate 0 as the fir
1d9b0 73 74 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69  st state..*/.voi
1d9c0 64 20 52 65 73 6f 72 74 53 74 61 74 65 73 28 6c  d ResortStates(l
1d9d0 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
1d9e0 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74  n *lemp;.{.  int
1d9f0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
1da00 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63  te *stp;.  struc
1da10 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 0a 20  t action *ap;.. 
1da20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1da30 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
1da40 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
1da50 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 73  sorted[i];.    s
1da60 74 70 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20 73 74  tp->nTknAct = st
1da70 70 2d 3e 6e 4e 74 41 63 74 20 3d 20 30 3b 0a 20  p->nNtAct = 0;. 
1da80 20 20 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20     stp->iDflt = 
1da90 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c  lemp->nstate + l
1daa0 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20 20  emp->nrule;.    
1dab0 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20  stp->iTknOfst = 
1dac0 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 73  NO_OFFSET;.    s
1dad0 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 4e 4f  tp->iNtOfst = NO
1dae0 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 66 6f 72  _OFFSET;.    for
1daf0 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
1db00 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
1db10 20 20 20 20 20 69 66 28 20 63 6f 6d 70 75 74 65       if( compute
1db20 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29  _action(lemp,ap)
1db30 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
1db40 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  f( ap->sp->index
1db50 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
1db60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
1db70 70 2d 3e 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20 20  p->nTknAct++;.  
1db80 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1db90 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65  ap->sp->index<le
1dba0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20  mp->nsymbol ){. 
1dbb0 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 4e           stp->nN
1dbc0 74 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  tAct++;.        
1dbd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1dbe0 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 63 6f   stp->iDflt = co
1dbf0 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d  mpute_action(lem
1dc00 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20  p, ap);.        
1dc10 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1dc20 20 20 7d 0a 20 20 71 73 6f 72 74 28 26 6c 65 6d    }.  qsort(&lem
1dc30 70 2d 3e 73 6f 72 74 65 64 5b 31 5d 2c 20 6c 65  p->sorted[1], le
1dc40 6d 70 2d 3e 6e 73 74 61 74 65 2d 31 2c 20 73 69  mp->nstate-1, si
1dc50 7a 65 6f 66 28 6c 65 6d 70 2d 3e 73 6f 72 74 65  zeof(lemp->sorte
1dc60 64 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 20 73  d[0]),.        s
1dc70 74 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72  tateResortCompar
1dc80 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
1dc90 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
1dca0 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73  ++){.    lemp->s
1dcb0 6f 72 74 65 64 5b 69 5d 2d 3e 73 74 61 74 65 6e  orted[i]->staten
1dcc0 75 6d 20 3d 20 69 3b 0a 20 20 7d 0a 7d 0a 0a 0a  um = i;.  }.}...
1dcd0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
1dce0 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
1dcf0 20 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a   "set.c" *******
1dd00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dd10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
1dd20 2a 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70 75 6c  *.** Set manipul
1dd30 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 66  ation routines f
1dd40 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  or the LEMON par
1dd50 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
1dd60 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69  /..static int si
1dd70 7a 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74 20  ze = 0;../* Set 
1dd80 74 68 65 20 73 65 74 20 73 69 7a 65 20 2a 2f 0a  the set size */.
1dd90 76 6f 69 64 20 53 65 74 53 69 7a 65 28 6e 29 0a  void SetSize(n).
1dda0 69 6e 74 20 6e 3b 0a 7b 0a 20 20 73 69 7a 65 20  int n;.{.  size 
1ddb0 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c  = n+1;.}../* All
1ddc0 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 74 20  ocate a new set 
1ddd0 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28  */.char *SetNew(
1dde0 29 7b 0a 20 20 63 68 61 72 20 2a 73 3b 0a 20 20  ){.  char *s;.  
1ddf0 73 20 3d 20 28 63 68 61 72 2a 29 63 61 6c 6c 6f  s = (char*)callo
1de00 63 28 20 73 69 7a 65 2c 20 31 29 3b 0a 20 20 69  c( size, 1);.  i
1de10 66 28 20 73 3d 3d 30 20 29 7b 0a 20 20 20 20 65  f( s==0 ){.    e
1de20 78 74 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72  xtern void memor
1de30 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 6d  y_error();.    m
1de40 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20  emory_error();. 
1de50 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d   }.  return s;.}
1de60 0a 0a 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  ../* Deallocate 
1de70 61 20 73 65 74 20 2a 2f 0a 76 6f 69 64 20 53 65  a set */.void Se
1de80 74 46 72 65 65 28 73 29 0a 63 68 61 72 20 2a 73  tFree(s).char *s
1de90 3b 0a 7b 0a 20 20 66 72 65 65 28 73 29 3b 0a 7d  ;.{.  free(s);.}
1dea0 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 65  ../* Add a new e
1deb0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 73 65  lement to the se
1dec0 74 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  t.  Return TRUE 
1ded0 69 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 77  if the element w
1dee0 61 73 20 61 64 64 65 64 0a 2a 2a 20 61 6e 64 20  as added.** and 
1def0 46 41 4c 53 45 20 69 66 20 69 74 20 77 61 73 20  FALSE if it was 
1df00 61 6c 72 65 61 64 79 20 74 68 65 72 65 2e 20 2a  already there. *
1df10 2f 0a 69 6e 74 20 53 65 74 41 64 64 28 73 2c 65  /.int SetAdd(s,e
1df20 29 0a 63 68 61 72 20 2a 73 3b 0a 69 6e 74 20 65  ).char *s;.int e
1df30 3b 0a 7b 0a 20 20 69 6e 74 20 72 76 3b 0a 20 20  ;.{.  int rv;.  
1df40 61 73 73 65 72 74 28 20 65 3e 3d 30 20 26 26 20  assert( e>=0 && 
1df50 65 3c 73 69 7a 65 20 29 3b 0a 20 20 72 76 20 3d  e<size );.  rv =
1df60 20 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20   s[e];.  s[e] = 
1df70 31 3b 0a 20 20 72 65 74 75 72 6e 20 21 72 76 3b  1;.  return !rv;
1df80 0a 7d 0a 0a 2f 2a 20 41 64 64 20 65 76 65 72 79  .}../* Add every
1df90 20 65 6c 65 6d 65 6e 74 20 6f 66 20 73 32 20 74   element of s2 t
1dfa0 6f 20 73 31 2e 20 20 52 65 74 75 72 6e 20 54 52  o s1.  Return TR
1dfb0 55 45 20 69 66 20 73 31 20 63 68 61 6e 67 65 73  UE if s1 changes
1dfc0 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f  . */.int SetUnio
1dfd0 6e 28 73 31 2c 73 32 29 0a 63 68 61 72 20 2a 73  n(s1,s2).char *s
1dfe0 31 3b 0a 63 68 61 72 20 2a 73 32 3b 0a 7b 0a 20  1;.char *s2;.{. 
1dff0 20 69 6e 74 20 69 2c 20 70 72 6f 67 72 65 73 73   int i, progress
1e000 3b 0a 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30  ;.  progress = 0
1e010 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
1e020 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ize; i++){.    i
1e030 66 28 20 73 32 5b 69 5d 3d 3d 30 20 29 20 63 6f  f( s2[i]==0 ) co
1e040 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
1e050 73 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  s1[i]==0 ){.    
1e060 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a    progress = 1;.
1e070 20 20 20 20 20 20 73 31 5b 69 5d 20 3d 20 31 3b        s1[i] = 1;
1e080 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1e090 75 72 6e 20 70 72 6f 67 72 65 73 73 3b 0a 7d 0a  urn progress;.}.
1e0a0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
1e0b0 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
1e0c0 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 63 22 20   file "table.c" 
1e0d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e0e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
1e0f0 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20  .** All code in 
1e100 74 68 69 73 20 66 69 6c 65 20 68 61 73 20 62 65  this file has be
1e110 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  en automatically
1e120 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72   generated.** fr
1e130 6f 6d 20 61 20 73 70 65 63 69 66 69 63 61 74 69  om a specificati
1e140 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a  on in the file.*
1e150 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  *              "
1e160 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74  table.q".** by t
1e170 68 65 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  he associative a
1e180 72 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64 69  rray code buildi
1e190 6e 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67 65  ng program "aage
1e1a0 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64  n"..** Do not ed
1e1b0 69 74 20 74 68 69 73 20 66 69 6c 65 21 20 20 49  it this file!  I
1e1c0 6e 73 74 65 61 64 2c 20 65 64 69 74 20 74 68 65  nstead, edit the
1e1d0 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a   specification.*
1e1e0 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 72  * file, then rer
1e1f0 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a  un aagen..*/./*.
1e200 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f 63  ** Code for proc
1e210 65 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69 6e  essing tables in
1e220 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
1e230 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
1e240 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 72  .PRIVATE int str
1e250 68 61 73 68 28 78 29 0a 63 68 61 72 20 2a 78 3b  hash(x).char *x;
1e260 0a 7b 0a 20 20 69 6e 74 20 68 20 3d 20 30 3b 0a  .{.  int h = 0;.
1e270 20 20 77 68 69 6c 65 28 20 2a 78 29 20 68 20 3d    while( *x) h =
1e280 20 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b 0a   h*13 + *(x++);.
1e290 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f    return h;.}../
1e2a0 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74 72  * Works like str
1e2b0 64 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20 53  dup, sort of.  S
1e2c0 61 76 65 20 61 20 73 74 72 69 6e 67 20 69 6e 20  ave a string in 
1e2d0 6d 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79 2c  malloced memory,
1e2e0 20 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74 72   but.** keep str
1e2f0 69 6e 67 73 20 69 6e 20 61 20 74 61 62 6c 65 20  ings in a table 
1e300 73 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  so that the same
1e310 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 69   string is not i
1e320 6e 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f  n more.** than o
1e330 6e 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 68 61  ne place..*/.cha
1e340 72 20 2a 53 74 72 73 61 66 65 28 79 29 0a 63 68  r *Strsafe(y).ch
1e350 61 72 20 2a 79 3b 0a 7b 0a 20 20 63 68 61 72 20  ar *y;.{.  char 
1e360 2a 7a 3b 0a 0a 20 20 69 66 28 20 79 3d 3d 30 20  *z;..  if( y==0 
1e370 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 20  ) return 0;.  z 
1e380 3d 20 53 74 72 73 61 66 65 5f 66 69 6e 64 28 79  = Strsafe_find(y
1e390 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 26 26  );.  if( z==0 &&
1e3a0 20 28 7a 3d 6d 61 6c 6c 6f 63 28 20 73 74 72 6c   (z=malloc( strl
1e3b0 65 6e 28 79 29 2b 31 20 29 29 21 3d 30 20 29 7b  en(y)+1 ))!=0 ){
1e3c0 0a 20 20 20 20 73 74 72 63 70 79 28 7a 2c 79 29  .    strcpy(z,y)
1e3d0 3b 0a 20 20 20 20 53 74 72 73 61 66 65 5f 69 6e  ;.    Strsafe_in
1e3e0 73 65 72 74 28 7a 29 3b 0a 20 20 7d 0a 20 20 4d  sert(z);.  }.  M
1e3f0 65 6d 6f 72 79 43 68 65 63 6b 28 7a 29 3b 0a 20  emoryCheck(z);. 
1e400 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
1e410 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
1e420 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1e430 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1e440 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73  e for each.** as
1e450 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
1e460 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f  of type "x1"..*/
1e470 0a 73 74 72 75 63 74 20 73 5f 78 31 20 7b 0a 20  .struct s_x1 {. 
1e480 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
1e490 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e4a0 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
1e4b0 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20  ble slots. */.  
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4d0 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73          /*   Mus
1e4e0 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
1e4f0 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  2 greater than o
1e500 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  r */.           
1e510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e520 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a  *   equal to 1 *
1e530 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20  /.  int count;  
1e540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e550 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74  umber of current
1e560 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20  ly slots filled 
1e570 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31  */.  struct s_x1
1e580 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54  node *tbl;  /* T
1e590 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68  he data stored h
1e5a0 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ere */.  struct 
1e5b0 73 5f 78 31 6e 6f 64 65 20 2a 2a 68 74 3b 20 20  s_x1node **ht;  
1e5c0 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f  /* Hash table fo
1e5d0 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a  r lookups */.};.
1e5e0 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  ./* There is one
1e5f0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
1e600 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  s structure for 
1e610 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65  every data eleme
1e620 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f  nt.** in an asso
1e630 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
1e640 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 74   type "x1"..*/.t
1e650 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f  ypedef struct s_
1e660 78 31 6e 6f 64 65 20 7b 0a 20 20 63 68 61 72 20  x1node {.  char 
1e670 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
1e680 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1e690 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ata */.  struct 
1e6a0 73 5f 78 31 6e 6f 64 65 20 2a 6e 65 78 74 3b 20  s_x1node *next; 
1e6b0 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
1e6c0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
1e6d0 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  sh */.  struct s
1e6e0 5f 78 31 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20  _x1node **from; 
1e6f0 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e   /* Previous lin
1e700 6b 20 2a 2f 0a 7d 20 78 31 6e 6f 64 65 3b 0a 0a  k */.} x1node;..
1e710 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  /* There is only
1e720 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
1e730 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63   the array, whic
1e740 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h is the followi
1e750 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ng */.static str
1e760 75 63 74 20 73 5f 78 31 20 2a 78 31 61 3b 0a 0a  uct s_x1 *x1a;..
1e770 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
1e780 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  w associative ar
1e790 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74 72 73  ray */.void Strs
1e7a0 61 66 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66  afe_init(){.  if
1e7b0 28 20 78 31 61 20 29 20 72 65 74 75 72 6e 3b 0a  ( x1a ) return;.
1e7c0 20 20 78 31 61 20 3d 20 28 73 74 72 75 63 74 20    x1a = (struct 
1e7d0 73 5f 78 31 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  s_x1*)malloc( si
1e7e0 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 31  zeof(struct s_x1
1e7f0 29 20 29 3b 0a 20 20 69 66 28 20 78 31 61 20 29  ) );.  if( x1a )
1e800 7b 0a 20 20 20 20 78 31 61 2d 3e 73 69 7a 65 20  {.    x1a->size 
1e810 3d 20 31 30 32 34 3b 0a 20 20 20 20 78 31 61 2d  = 1024;.    x1a-
1e820 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  >count = 0;.    
1e830 78 31 61 2d 3e 74 62 6c 20 3d 20 28 78 31 6e 6f  x1a->tbl = (x1no
1e840 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20  de*)malloc( .   
1e850 20 20 20 28 73 69 7a 65 6f 66 28 78 31 6e 6f 64     (sizeof(x1nod
1e860 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f  e) + sizeof(x1no
1e870 64 65 2a 29 29 2a 31 30 32 34 20 29 3b 0a 20 20  de*))*1024 );.  
1e880 20 20 69 66 28 20 78 31 61 2d 3e 74 62 6c 3d 3d    if( x1a->tbl==
1e890 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
1e8a0 78 31 61 29 3b 0a 20 20 20 20 20 20 78 31 61 20  x1a);.      x1a 
1e8b0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1e8c0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1e8d0 20 20 20 78 31 61 2d 3e 68 74 20 3d 20 28 78 31     x1a->ht = (x1
1e8e0 6e 6f 64 65 2a 2a 29 26 28 78 31 61 2d 3e 74 62  node**)&(x1a->tb
1e8f0 6c 5b 31 30 32 34 5d 29 3b 0a 20 20 20 20 20 20  l[1024]);.      
1e900 66 6f 72 28 69 3d 30 3b 20 69 3c 31 30 32 34 3b  for(i=0; i<1024;
1e910 20 69 2b 2b 29 20 78 31 61 2d 3e 68 74 5b 69 5d   i++) x1a->ht[i]
1e920 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1e930 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  }./* Insert a ne
1e940 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
1e950 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  e array.  Return
1e960 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73   TRUE if success
1e970 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61  ful..** Prior da
1e980 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ta with the same
1e990 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72   key is NOT over
1e9a0 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53  written */.int S
1e9b0 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28 64 61  trsafe_insert(da
1e9c0 74 61 29 0a 63 68 61 72 20 2a 64 61 74 61 3b 0a  ta).char *data;.
1e9d0 7b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a  {.  x1node *np;.
1e9e0 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70    int h;.  int p
1e9f0 68 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30  h;..  if( x1a==0
1ea00 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
1ea10 68 20 3d 20 73 74 72 68 61 73 68 28 64 61 74 61  h = strhash(data
1ea20 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
1ea30 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  1a->size-1);.  n
1ea40 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x1a->ht[h];.
1ea50 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
1ea60 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70     if( strcmp(np
1ea70 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d 30 20  ->data,data)==0 
1ea80 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  ){.      /* An e
1ea90 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69  xisting entry wi
1eaa0 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
1eab0 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20  is found. */.   
1eac0 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75     /* Fail becau
1ead0 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20  se overwrite is 
1eae0 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20  not allows. */. 
1eaf0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1eb00 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70     }.    np = np
1eb10 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  ->next;.  }.  if
1eb20 28 20 78 31 61 2d 3e 63 6f 75 6e 74 3e 3d 78 31  ( x1a->count>=x1
1eb30 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f  a->size ){.    /
1eb40 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74  * Need to make t
1eb50 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69  he hash table bi
1eb60 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  gger */.    int 
1eb70 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75  i,size;.    stru
1eb80 63 74 20 73 5f 78 31 20 61 72 72 61 79 3b 0a 20  ct s_x1 array;. 
1eb90 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20     array.size = 
1eba0 73 69 7a 65 20 3d 20 78 31 61 2d 3e 73 69 7a 65  size = x1a->size
1ebb0 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f  *2;.    array.co
1ebc0 75 6e 74 20 3d 20 78 31 61 2d 3e 63 6f 75 6e 74  unt = x1a->count
1ebd0 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20  ;.    array.tbl 
1ebe0 3d 20 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f  = (x1node*)mallo
1ebf0 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66  c(.      (sizeof
1ec00 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x1node) + sizeo
1ec10 66 28 78 31 6e 6f 64 65 2a 29 29 2a 73 69 7a 65  f(x1node*))*size
1ec20 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61   );.    if( arra
1ec30 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72  y.tbl==0 ) retur
1ec40 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75  n 0;  /* Fail du
1ec50 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e to malloc fail
1ec60 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79  ure */.    array
1ec70 2e 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29  .ht = (x1node**)
1ec80 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65  &(array.tbl[size
1ec90 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
1eca0 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72   i<size; i++) ar
1ecb0 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  ray.ht[i] = 0;. 
1ecc0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 31     for(i=0; i<x1
1ecd0 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a  a->count; i++){.
1ece0 20 20 20 20 20 20 78 31 6e 6f 64 65 20 2a 6f 6c        x1node *ol
1ecf0 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20  dnp, *newnp;.   
1ed00 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 31 61     oldnp = &(x1a
1ed10 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  ->tbl[i]);.     
1ed20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64   h = strhash(old
1ed30 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 73 69 7a  np->data) & (siz
1ed40 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
1ed50 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
1ed60 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
1ed70 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
1ed80 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
1ed90 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
1eda0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
1edb0 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
1edc0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64  ;.      newnp->d
1edd0 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74  ata = oldnp->dat
1ede0 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  a;.      newnp->
1edf0 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68  from = &(array.h
1ee00 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72  t[h]);.      arr
1ee10 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70  ay.ht[h] = newnp
1ee20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
1ee30 28 78 31 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20  (x1a->tbl);.    
1ee40 2a 78 31 61 20 3d 20 61 72 72 61 79 3b 0a 20 20  *x1a = array;.  
1ee50 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  }.  /* Insert th
1ee60 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20  e new data */.  
1ee70 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73  h = ph & (x1a->s
1ee80 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26  ize-1);.  np = &
1ee90 28 78 31 61 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63  (x1a->tbl[x1a->c
1eea0 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e  ount++]);.  np->
1eeb0 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
1eec0 66 28 20 78 31 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x1a->ht[h] ) 
1eed0 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x1a->ht[h]->from
1eee0 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
1eef0 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 31 61    np->next = x1a
1ef00 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e  ->ht[h];.  x1a->
1ef10 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
1ef20 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 31 61 2d 3e  ->from = &(x1a->
1ef30 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
1ef40 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
1ef50 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
1ef60 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
1ef70 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
1ef80 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
1ef90 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
1efa0 0a 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f 66  .char *Strsafe_f
1efb0 69 6e 64 28 6b 65 79 29 0a 63 68 61 72 20 2a 6b  ind(key).char *k
1efc0 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20  ey;.{.  int h;. 
1efd0 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20   x1node *np;..  
1efe0 69 66 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74  if( x1a==0 ) ret
1eff0 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72  urn 0;.  h = str
1f000 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 31 61  hash(key) & (x1a
1f010 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
1f020 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x1a->ht[h];.  
1f030 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
1f040 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e   if( strcmp(np->
1f050 64 61 74 61 2c 6b 65 79 29 3d 3d 30 20 29 20 62  data,key)==0 ) b
1f060 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e  reak;.    np = n
1f070 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  p->next;.  }.  r
1f080 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64  eturn np ? np->d
1f090 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52  ata : 0;.}../* R
1f0a0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1f0b0 74 6f 20 74 68 65 20 28 74 65 72 6d 69 6e 61 6c  to the (terminal
1f0c0 20 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29   or nonterminal)
1f0d0 20 73 79 6d 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20   symbol "x"..** 
1f0e0 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d  Create a new sym
1f0f0 62 6f 6c 20 69 66 20 74 68 69 73 20 69 73 20 74  bol if this is t
1f100 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 22 78  he first time "x
1f110 22 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 2e  " has been seen.
1f120 0a 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  .*/.struct symbo
1f130 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29  l *Symbol_new(x)
1f140 0a 63 68 61 72 20 2a 78 3b 0a 7b 0a 20 20 73 74  .char *x;.{.  st
1f150 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
1f160 0a 0a 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f  ..  sp = Symbol_
1f170 66 69 6e 64 28 78 29 3b 0a 20 20 69 66 28 20 73  find(x);.  if( s
1f180 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 70 20 3d  p==0 ){.    sp =
1f190 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20   (struct symbol 
1f1a0 2a 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65  *)calloc(1, size
1f1b0 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
1f1c0 29 20 29 3b 0a 20 20 20 20 4d 65 6d 6f 72 79 43  ) );.    MemoryC
1f1d0 68 65 63 6b 28 73 70 29 3b 0a 20 20 20 20 73 70  heck(sp);.    sp
1f1e0 2d 3e 6e 61 6d 65 20 3d 20 53 74 72 73 61 66 65  ->name = Strsafe
1f1f0 28 78 29 3b 0a 20 20 20 20 73 70 2d 3e 74 79 70  (x);.    sp->typ
1f200 65 20 3d 20 69 73 75 70 70 65 72 28 2a 78 29 20  e = isupper(*x) 
1f210 3f 20 54 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e  ? TERMINAL : NON
1f220 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 73 70  TERMINAL;.    sp
1f230 2d 3e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20  ->rule = 0;.    
1f240 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30  sp->fallback = 0
1f250 3b 0a 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d  ;.    sp->prec =
1f260 20 2d 31 3b 0a 20 20 20 20 73 70 2d 3e 61 73 73   -1;.    sp->ass
1f270 6f 63 20 3d 20 55 4e 4b 3b 0a 20 20 20 20 73 70  oc = UNK;.    sp
1f280 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 30 3b 0a  ->firstset = 0;.
1f290 20 20 20 20 73 70 2d 3e 6c 61 6d 62 64 61 20 3d      sp->lambda =
1f2a0 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20   LEMON_FALSE;.  
1f2b0 20 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72    sp->destructor
1f2c0 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 61   = 0;.    sp->da
1f2d0 74 61 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  tatype = 0;.    
1f2e0 73 70 2d 3e 75 73 65 43 6e 74 20 3d 20 30 3b 0a  sp->useCnt = 0;.
1f2f0 20 20 20 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72      Symbol_inser
1f300 74 28 73 70 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a  t(sp,sp->name);.
1f310 20 20 7d 0a 20 20 73 70 2d 3e 75 73 65 43 6e 74    }.  sp->useCnt
1f320 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73 70 3b  ++;.  return sp;
1f330 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74  .}../* Compare t
1f340 77 6f 20 73 79 6d 62 6f 6c 73 20 66 6f 72 20 77  wo symbols for w
1f350 6f 72 6b 69 6e 67 20 70 75 72 70 6f 73 65 73 0a  orking purposes.
1f360 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c 73 20 74 68  **.** Symbols th
1f370 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 75 70  at begin with up
1f380 70 65 72 20 63 61 73 65 20 6c 65 74 74 65 72 73  per case letters
1f390 20 28 74 65 72 6d 69 6e 61 6c 73 20 6f 72 20 74   (terminals or t
1f3a0 6f 6b 65 6e 73 29 0a 2a 2a 20 6d 75 73 74 20 73  okens).** must s
1f3b0 6f 72 74 20 62 65 66 6f 72 65 20 73 79 6d 62 6f  ort before symbo
1f3c0 6c 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  ls that begin wi
1f3d0 74 68 20 6c 6f 77 65 72 20 63 61 73 65 20 6c 65  th lower case le
1f3e0 74 74 65 72 73 0a 2a 2a 20 28 6e 6f 6e 2d 74 65  tters.** (non-te
1f3f0 72 6d 69 6e 61 6c 73 29 2e 20 20 4f 74 68 65 72  rminals).  Other
1f400 20 74 68 61 6e 20 74 68 61 74 2c 20 74 68 65 20   than that, the 
1f410 6f 72 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 6d  order does not m
1f420 61 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  atter..**.** We 
1f430 66 69 6e 64 20 65 78 70 65 72 69 6d 65 6e 74 61  find experimenta
1f440 6c 6c 79 20 74 68 61 74 20 6c 65 61 76 69 6e 67  lly that leaving
1f450 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 69 6e 20   the symbols in 
1f460 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 0a 2a  their original.*
1f470 2a 20 6f 72 64 65 72 20 28 74 68 65 20 6f 72 64  * order (the ord
1f480 65 72 20 74 68 65 79 20 61 70 70 65 61 72 65 64  er they appeared
1f490 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
1f4a0 66 69 6c 65 29 20 67 69 76 65 73 20 74 68 65 0a  file) gives the.
1f4b0 2a 2a 20 73 6d 61 6c 6c 65 73 74 20 70 61 72 73  ** smallest pars
1f4c0 65 72 20 74 61 62 6c 65 73 20 69 6e 20 53 51 4c  er tables in SQL
1f4d0 69 74 65 2e 0a 2a 2f 0a 69 6e 74 20 53 79 6d 62  ite..*/.int Symb
1f4e0 6f 6c 63 6d 70 70 28 73 74 72 75 63 74 20 73 79  olcmpp(struct sy
1f4f0 6d 62 6f 6c 20 2a 2a 61 2c 20 73 74 72 75 63 74  mbol **a, struct
1f500 20 73 79 6d 62 6f 6c 20 2a 2a 62 29 7b 0a 20 20   symbol **b){.  
1f510 69 6e 74 20 69 31 20 3d 20 28 2a 2a 61 29 2e 69  int i1 = (**a).i
1f520 6e 64 65 78 20 2b 20 31 30 30 30 30 30 30 30 2a  ndex + 10000000*
1f530 28 28 2a 2a 61 29 2e 6e 61 6d 65 5b 30 5d 3e 27  ((**a).name[0]>'
1f540 5a 27 29 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20  Z');.  int i2 = 
1f550 28 2a 2a 62 29 2e 69 6e 64 65 78 20 2b 20 31 30  (**b).index + 10
1f560 30 30 30 30 30 30 2a 28 28 2a 2a 62 29 2e 6e 61  000000*((**b).na
1f570 6d 65 5b 30 5d 3e 27 5a 27 29 3b 0a 20 20 72 65  me[0]>'Z');.  re
1f580 74 75 72 6e 20 69 31 2d 69 32 3b 0a 7d 0a 0a 2f  turn i1-i2;.}../
1f590 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
1f5a0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
1f5b0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1f5c0 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61  re for each.** a
1f5d0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
1f5e0 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e 0a 2a   of type "x2"..*
1f5f0 2f 0a 73 74 72 75 63 74 20 73 5f 78 32 20 7b 0a  /.struct s_x2 {.
1f600 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
1f610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f620 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
1f630 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20  able slots. */. 
1f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f650 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75           /*   Mu
1f660 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
1f670 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
1f680 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
1f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6a0 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20  /*   equal to 1 
1f6b0 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20  */.  int count; 
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f6d0 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  Number of curren
1f6e0 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64  tly slots filled
1f6f0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1f700 32 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20  2node *tbl;  /* 
1f710 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  The data stored 
1f720 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  here */.  struct
1f730 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 68 74 3b 20   s_x2node **ht; 
1f740 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66   /* Hash table f
1f750 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b  or lookups */.};
1f760 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
1f770 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
1f780 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
1f790 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d   every data elem
1f7a0 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73  ent.** in an ass
1f7b0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
1f7c0 66 20 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a  f type "x2"..*/.
1f7d0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
1f7e0 5f 78 32 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75  _x2node {.  stru
1f7f0 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b  ct symbol *data;
1f800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f810 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
1f820 0a 20 20 63 68 61 72 20 2a 6b 65 79 3b 20 20 20  .  char *key;   
1f830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f840 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
1f850 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20  struct s_x2node 
1f860 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74  *next;   /* Next
1f870 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
1f880 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73  same hash */.  s
1f890 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a  truct s_x2node *
1f8a0 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69  *from;  /* Previ
1f8b0 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 32  ous link */.} x2
1f8c0 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  node;../* There 
1f8d0 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74  is only one inst
1f8e0 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61  ance of the arra
1f8f0 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  y, which is the 
1f900 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61  following */.sta
1f910 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 32 20  tic struct s_x2 
1f920 2a 78 32 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61  *x2a;../* Alloca
1f930 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61  te a new associa
1f940 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f  tive array */.vo
1f950 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29  id Symbol_init()
1f960 7b 0a 20 20 69 66 28 20 78 32 61 20 29 20 72 65  {.  if( x2a ) re
1f970 74 75 72 6e 3b 0a 20 20 78 32 61 20 3d 20 28 73  turn;.  x2a = (s
1f980 74 72 75 63 74 20 73 5f 78 32 2a 29 6d 61 6c 6c  truct s_x2*)mall
1f990 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
1f9a0 74 20 73 5f 78 32 29 20 29 3b 0a 20 20 69 66 28  t s_x2) );.  if(
1f9b0 20 78 32 61 20 29 7b 0a 20 20 20 20 78 32 61 2d   x2a ){.    x2a-
1f9c0 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20  >size = 128;.   
1f9d0 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b   x2a->count = 0;
1f9e0 0a 20 20 20 20 78 32 61 2d 3e 74 62 6c 20 3d 20  .    x2a->tbl = 
1f9f0 28 78 32 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x2node*)malloc(
1fa00 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28   .      (sizeof(
1fa10 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x2node) + sizeof
1fa20 28 78 32 6e 6f 64 65 2a 29 29 2a 31 32 38 20 29  (x2node*))*128 )
1fa30 3b 0a 20 20 20 20 69 66 28 20 78 32 61 2d 3e 74  ;.    if( x2a->t
1fa40 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  bl==0 ){.      f
1fa50 72 65 65 28 78 32 61 29 3b 0a 20 20 20 20 20 20  ree(x2a);.      
1fa60 78 32 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  x2a = 0;.    }el
1fa70 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
1fa80 0a 20 20 20 20 20 20 78 32 61 2d 3e 68 74 20 3d  .      x2a->ht =
1fa90 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28 78 32 61   (x2node**)&(x2a
1faa0 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20  ->tbl[128]);.   
1fab0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32     for(i=0; i<12
1fac0 38 3b 20 69 2b 2b 29 20 78 32 61 2d 3e 68 74 5b  8; i++) x2a->ht[
1fad0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
1fae0 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20  }.}./* Insert a 
1faf0 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
1fb00 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75  the array.  Retu
1fb10 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65  rn TRUE if succe
1fb20 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20  ssful..** Prior 
1fb30 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61  data with the sa
1fb40 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76  me key is NOT ov
1fb50 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74  erwritten */.int
1fb60 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 64   Symbol_insert(d
1fb70 61 74 61 2c 6b 65 79 29 0a 73 74 72 75 63 74 20  ata,key).struct 
1fb80 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 63 68  symbol *data;.ch
1fb90 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20 78 32 6e  ar *key;.{.  x2n
1fba0 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68  ode *np;.  int h
1fbb0 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69  ;.  int ph;..  i
1fbc0 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75  f( x2a==0 ) retu
1fbd0 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72  rn 0;.  ph = str
1fbe0 68 61 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d  hash(key);.  h =
1fbf0 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65   ph & (x2a->size
1fc00 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d  -1);.  np = x2a-
1fc10 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
1fc20 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73   np ){.    if( s
1fc30 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65  trcmp(np->key,ke
1fc40 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  y)==0 ){.      /
1fc50 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  * An existing en
1fc60 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
1fc70 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20  e key is found. 
1fc80 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  */.      /* Fail
1fc90 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69   because overwri
1fca0 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73  te is not allows
1fcb0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
1fcc0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 0;.    }.    n
1fcd0 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
1fce0 7d 0a 20 20 69 66 28 20 78 32 61 2d 3e 63 6f 75  }.  if( x2a->cou
1fcf0 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a 65 20 29 7b  nt>=x2a->size ){
1fd00 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
1fd10 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
1fd20 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20  ble bigger */.  
1fd30 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20    int i,size;.  
1fd40 20 20 73 74 72 75 63 74 20 73 5f 78 32 20 61 72    struct s_x2 ar
1fd50 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73  ray;.    array.s
1fd60 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 32 61  ize = size = x2a
1fd70 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72  ->size*2;.    ar
1fd80 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 32 61 2d  ray.count = x2a-
1fd90 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61  >count;.    arra
1fda0 79 2e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a  y.tbl = (x2node*
1fdb0 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28  )malloc(.      (
1fdc0 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b  sizeof(x2node) +
1fdd0 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29   sizeof(x2node*)
1fde0 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66  )*size );.    if
1fdf0 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29  ( array.tbl==0 )
1fe00 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46   return 0;  /* F
1fe10 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f  ail due to mallo
1fe20 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20  c failure */.   
1fe30 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 32 6e   array.ht = (x2n
1fe40 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62  ode**)&(array.tb
1fe50 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f  l[size]);.    fo
1fe60 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69  r(i=0; i<size; i
1fe70 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20  ++) array.ht[i] 
1fe80 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
1fe90 3b 20 69 3c 78 32 61 2d 3e 63 6f 75 6e 74 3b 20  ; i<x2a->count; 
1fea0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 32 6e 6f  i++){.      x2no
1feb0 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e  de *oldnp, *newn
1fec0 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d  p;.      oldnp =
1fed0 20 26 28 78 32 61 2d 3e 74 62 6c 5b 69 5d 29 3b   &(x2a->tbl[i]);
1fee0 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72 68 61  .      h = strha
1fef0 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26  sh(oldnp->key) &
1ff00 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20   (size-1);.     
1ff10 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
1ff20 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
1ff30 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
1ff40 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
1ff50 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
1ff60 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
1ff70 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
1ff80 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
1ff90 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d  np->key = oldnp-
1ffa0 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e  >key;.      newn
1ffb0 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
1ffc0 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
1ffd0 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
1ffe0 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
1fff0 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
20000 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
20010 66 72 65 65 28 78 32 61 2d 3e 74 62 6c 29 3b 0a  free(x2a->tbl);.
20020 20 20 20 20 2a 78 32 61 20 3d 20 61 72 72 61 79      *x2a = array
20030 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
20040 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
20050 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 32  /.  h = ph & (x2
20060 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
20070 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b 78 32   = &(x2a->tbl[x2
20080 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
20090 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20  np->key = key;. 
200a0 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
200b0 3b 0a 20 20 69 66 28 20 78 32 61 2d 3e 68 74 5b  ;.  if( x2a->ht[
200c0 68 5d 20 29 20 78 32 61 2d 3e 68 74 5b 68 5d 2d  h] ) x2a->ht[h]-
200d0 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
200e0 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
200f0 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x2a->ht[h];.  
20100 78 32 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x2a->ht[h] = np;
20110 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
20120 78 32 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x2a->ht[h]);.  r
20130 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
20140 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
20150 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
20160 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
20170 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
20180 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
20190 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d  y. */.struct sym
201a0 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64  bol *Symbol_find
201b0 28 6b 65 79 29 0a 63 68 61 72 20 2a 6b 65 79 3b  (key).char *key;
201c0 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 32  .{.  int h;.  x2
201d0 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28  node *np;..  if(
201e0 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x2a==0 ) return
201f0 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73   0;.  h = strhas
20200 68 28 6b 65 79 29 20 26 20 28 78 32 61 2d 3e 73  h(key) & (x2a->s
20210 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
20220 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  2a->ht[h];.  whi
20230 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
20240 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79  ( strcmp(np->key
20250 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,key)==0 ) break
20260 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  ;.    np = np->n
20270 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
20280 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20  n np ? np->data 
20290 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  : 0;.}../* Retur
202a0 6e 20 74 68 65 20 6e 2d 74 68 20 64 61 74 61 2e  n the n-th data.
202b0 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
202c0 20 6e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   n is out of ran
202d0 67 65 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79  ge. */.struct sy
202e0 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68  mbol *Symbol_Nth
202f0 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 73  (n).int n;.{.  s
20300 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61  truct symbol *da
20310 74 61 3b 0a 20 20 69 66 28 20 78 32 61 20 26 26  ta;.  if( x2a &&
20320 20 6e 3e 30 20 26 26 20 6e 3c 3d 78 32 61 2d 3e   n>0 && n<=x2a->
20330 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20 64 61 74  count ){.    dat
20340 61 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31  a = x2a->tbl[n-1
20350 5d 2e 64 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b  ].data;.  }else{
20360 0a 20 20 20 20 64 61 74 61 20 3d 20 30 3b 0a 20  .    data = 0;. 
20370 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61   }.  return data
20380 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
20390 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
203a0 72 72 61 79 20 2a 2f 0a 69 6e 74 20 53 79 6d 62  rray */.int Symb
203b0 6f 6c 5f 63 6f 75 6e 74 28 29 0a 7b 0a 20 20 72  ol_count().{.  r
203c0 65 74 75 72 6e 20 78 32 61 20 3f 20 78 32 61 2d  eturn x2a ? x2a-
203d0 3e 63 6f 75 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f  >count : 0;.}../
203e0 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61  * Return an arra
203f0 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  y of pointers to
20400 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65   all data in the
20410 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61   table..** The a
20420 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64  rray is obtained
20430 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52   from malloc.  R
20440 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65  eturn NULL if me
20450 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
20460 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20  ** problems, or 
20470 69 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  if the array is 
20480 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74  empty. */.struct
20490 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c   symbol **Symbol
204a0 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73  _arrayof().{.  s
204b0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61  truct symbol **a
204c0 72 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69  rray;.  int i,si
204d0 7a 65 3b 0a 20 20 69 66 28 20 78 32 61 3d 3d 30  ze;.  if( x2a==0
204e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
204f0 69 7a 65 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74  ize = x2a->count
20500 3b 0a 20 20 61 72 72 61 79 20 3d 20 28 73 74 72  ;.  array = (str
20510 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 63 61  uct symbol **)ca
20520 6c 6c 6f 63 28 73 69 7a 65 2c 20 73 69 7a 65 6f  lloc(size, sizeo
20530 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  f(struct symbol 
20540 2a 29 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79  *));.  if( array
20550 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
20560 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72   i<size; i++) ar
20570 72 61 79 5b 69 5d 20 3d 20 78 32 61 2d 3e 74 62  ray[i] = x2a->tb
20580 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20  l[i].data;.  }. 
20590 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d   return array;.}
205a0 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  ../* Compare two
205b0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
205c0 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70  */.int Configcmp
205d0 28 61 2c 62 29 0a 73 74 72 75 63 74 20 63 6f 6e  (a,b).struct con
205e0 66 69 67 20 2a 61 3b 0a 73 74 72 75 63 74 20 63  fig *a;.struct c
205f0 6f 6e 66 69 67 20 2a 62 3b 0a 7b 0a 20 20 69 6e  onfig *b;.{.  in
20600 74 20 78 3b 0a 20 20 78 20 3d 20 61 2d 3e 72 70  t x;.  x = a->rp
20610 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d  ->index - b->rp-
20620 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 78 3d  >index;.  if( x=
20630 3d 30 20 29 20 78 20 3d 20 61 2d 3e 64 6f 74 20  =0 ) x = a->dot 
20640 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75  - b->dot;.  retu
20650 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70  rn x;.}../* Comp
20660 61 72 65 20 74 77 6f 20 73 74 61 74 65 73 20 2a  are two states *
20670 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73 74  /.PRIVATE int st
20680 61 74 65 63 6d 70 28 61 2c 62 29 0a 73 74 72 75  atecmp(a,b).stru
20690 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 73 74  ct config *a;.st
206a0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 3b 0a  ruct config *b;.
206b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 66 6f  {.  int rc;.  fo
206c0 72 28 72 63 3d 30 3b 20 72 63 3d 3d 30 20 26 26  r(rc=0; rc==0 &&
206d0 20 61 20 26 26 20 62 3b 20 20 61 3d 61 2d 3e 62   a && b;  a=a->b
206e0 70 2c 20 62 3d 62 2d 3e 62 70 29 7b 0a 20 20 20  p, b=b->bp){.   
206f0 20 72 63 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64   rc = a->rp->ind
20700 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65  ex - b->rp->inde
20710 78 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30  x;.    if( rc==0
20720 20 29 20 72 63 20 3d 20 61 2d 3e 64 6f 74 20 2d   ) rc = a->dot -
20730 20 62 2d 3e 64 6f 74 3b 0a 20 20 7d 0a 20 20 69   b->dot;.  }.  i
20740 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
20750 69 66 28 20 61 20 29 20 72 63 20 3d 20 31 3b 0a  if( a ) rc = 1;.
20760 20 20 20 20 69 66 28 20 62 20 29 20 72 63 20 3d      if( b ) rc =
20770 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   -1;.  }.  retur
20780 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68  n rc;.}../* Hash
20790 20 61 20 73 74 61 74 65 20 2a 2f 0a 50 52 49 56   a state */.PRIV
207a0 41 54 45 20 69 6e 74 20 73 74 61 74 65 68 61 73  ATE int statehas
207b0 68 28 61 29 0a 73 74 72 75 63 74 20 63 6f 6e 66  h(a).struct conf
207c0 69 67 20 2a 61 3b 0a 7b 0a 20 20 69 6e 74 20 68  ig *a;.{.  int h
207d0 3d 30 3b 0a 20 20 77 68 69 6c 65 28 20 61 20 29  =0;.  while( a )
207e0 7b 0a 20 20 20 20 68 20 3d 20 68 2a 35 37 31 20  {.    h = h*571 
207f0 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33  + a->rp->index*3
20800 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 20 20  7 + a->dot;.    
20810 61 20 3d 20 61 2d 3e 62 70 3b 0a 20 20 7d 0a 20  a = a->bp;.  }. 
20820 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a   return h;.}../*
20830 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
20840 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65 20  state structure 
20850 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  */.struct state 
20860 2a 53 74 61 74 65 5f 6e 65 77 28 29 0a 7b 0a 20  *State_new().{. 
20870 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e   struct state *n
20880 65 77 3b 0a 20 20 6e 65 77 20 3d 20 28 73 74 72  ew;.  new = (str
20890 75 63 74 20 73 74 61 74 65 20 2a 29 63 61 6c 6c  uct state *)call
208a0 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72  oc(1, sizeof(str
208b0 75 63 74 20 73 74 61 74 65 29 20 29 3b 0a 20 20  uct state) );.  
208c0 4d 65 6d 6f 72 79 43 68 65 63 6b 28 6e 65 77 29  MemoryCheck(new)
208d0 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a  ;.  return new;.
208e0 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  }../* There is o
208f0 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
20900 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
20910 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a  ucture for each.
20920 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ** associative a
20930 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 33  rray of type "x3
20940 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78  "..*/.struct s_x
20950 33 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20  3 {.  int size; 
20960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20970 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   The number of a
20980 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20  vailable slots. 
20990 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
209a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
209b0 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65    Must be a powe
209c0 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74  r of 2 greater t
209d0 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20  han or */.      
209e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209f0 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74      /*   equal t
20a00 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  o 1 */.  int cou
20a10 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
20a20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
20a30 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69  rrently slots fi
20a40 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  lled */.  struct
20a50 20 73 5f 78 33 6e 6f 64 65 20 2a 74 62 6c 3b 20   s_x3node *tbl; 
20a60 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f   /* The data sto
20a70 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  red here */.  st
20a80 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a  ruct s_x3node **
20a90 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ht;  /* Hash tab
20aa0 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a  le for lookups *
20ab0 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  /.};../* There i
20ac0 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
20ad0 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
20ae0 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20   for every data 
20af0 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e  element.** in an
20b00 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
20b10 61 79 20 6f 66 20 74 79 70 65 20 22 78 33 22 2e  ay of type "x3".
20b20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
20b30 63 74 20 73 5f 78 33 6e 6f 64 65 20 7b 0a 20 20  ct s_x3node {.  
20b40 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 64 61  struct state *da
20b50 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
20b60 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
20b70 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   */.  struct con
20b80 66 69 67 20 2a 6b 65 79 3b 20 20 20 20 20 20 20  fig *key;       
20b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20ba0 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75  he key */.  stru
20bb0 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 6e 65 78  ct s_x3node *nex
20bc0 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  t;   /* Next ent
20bd0 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
20be0 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63   hash */.  struc
20bf0 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 66 72 6f  t s_x3node **fro
20c00 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  m;  /* Previous 
20c10 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 33 6e 6f 64 65  link */.} x3node
20c20 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
20c30 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  nly one instance
20c40 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77   of the array, w
20c50 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c  hich is the foll
20c60 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  owing */.static 
20c70 73 74 72 75 63 74 20 73 5f 78 33 20 2a 78 33 61  struct s_x3 *x3a
20c80 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  ;../* Allocate a
20c90 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65   new associative
20ca0 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53   array */.void S
20cb0 74 61 74 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69  tate_init(){.  i
20cc0 66 28 20 78 33 61 20 29 20 72 65 74 75 72 6e 3b  f( x3a ) return;
20cd0 0a 20 20 78 33 61 20 3d 20 28 73 74 72 75 63 74  .  x3a = (struct
20ce0 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f 63 28 20 73   s_x3*)malloc( s
20cf0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78  izeof(struct s_x
20d00 33 29 20 29 3b 0a 20 20 69 66 28 20 78 33 61 20  3) );.  if( x3a 
20d10 29 7b 0a 20 20 20 20 78 33 61 2d 3e 73 69 7a 65  ){.    x3a->size
20d20 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 33 61 2d   = 128;.    x3a-
20d30 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  >count = 0;.    
20d40 78 33 61 2d 3e 74 62 6c 20 3d 20 28 78 33 6e 6f  x3a->tbl = (x3no
20d50 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20  de*)malloc( .   
20d60 20 20 20 28 73 69 7a 65 6f 66 28 78 33 6e 6f 64     (sizeof(x3nod
20d70 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f  e) + sizeof(x3no
20d80 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a 20 20 20  de*))*128 );.   
20d90 20 69 66 28 20 78 33 61 2d 3e 74 62 6c 3d 3d 30   if( x3a->tbl==0
20da0 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78   ){.      free(x
20db0 33 61 29 3b 0a 20 20 20 20 20 20 78 33 61 20 3d  3a);.      x3a =
20dc0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
20dd0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
20de0 20 20 78 33 61 2d 3e 68 74 20 3d 20 28 78 33 6e    x3a->ht = (x3n
20df0 6f 64 65 2a 2a 29 26 28 78 33 61 2d 3e 74 62 6c  ode**)&(x3a->tbl
20e00 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f  [128]);.      fo
20e10 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b  r(i=0; i<128; i+
20e20 2b 29 20 78 33 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x3a->ht[i] = 
20e30 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f  0;.    }.  }.}./
20e40 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
20e50 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61  ecord into the a
20e60 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52  rray.  Return TR
20e70 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  UE if successful
20e80 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20  ..** Prior data 
20e90 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
20ea0 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69  y is NOT overwri
20eb0 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 61 74  tten */.int Stat
20ec0 65 5f 69 6e 73 65 72 74 28 64 61 74 61 2c 6b 65  e_insert(data,ke
20ed0 79 29 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  y).struct state 
20ee0 2a 64 61 74 61 3b 0a 73 74 72 75 63 74 20 63 6f  *data;.struct co
20ef0 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 78  nfig *key;.{.  x
20f00 33 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74  3node *np;.  int
20f10 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20   h;.  int ph;.. 
20f20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65   if( x3a==0 ) re
20f30 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73  turn 0;.  ph = s
20f40 74 61 74 65 68 61 73 68 28 6b 65 79 29 3b 0a 20  tatehash(key);. 
20f50 20 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e   h = ph & (x3a->
20f60 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
20f70 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x3a->ht[h];.  wh
20f80 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
20f90 66 28 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e  f( statecmp(np->
20fa0 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20  key,key)==0 ){. 
20fb0 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
20fc0 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74  ing entry with t
20fd0 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66  he same key is f
20fe0 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  ound. */.      /
20ff0 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f  * Fail because o
21000 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20  verwrite is not 
21010 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  allows. */.     
21020 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
21030 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
21040 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 33  xt;.  }.  if( x3
21050 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61 2d 3e 73  a->count>=x3a->s
21060 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ize ){.    /* Ne
21070 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68  ed to make the h
21080 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72  ash table bigger
21090 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69   */.    int i,si
210a0 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  ze;.    struct s
210b0 5f 78 33 20 61 72 72 61 79 3b 0a 20 20 20 20 61  _x3 array;.    a
210c0 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65  rray.size = size
210d0 20 3d 20 78 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a   = x3a->size*2;.
210e0 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20      array.count 
210f0 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x3a->count;.  
21100 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78    array.tbl = (x
21110 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20  3node*)malloc(. 
21120 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 33 6e       (sizeof(x3n
21130 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 33  ode) + sizeof(x3
21140 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a  node*))*size );.
21150 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62      if( array.tb
21160 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
21170 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f    /* Fail due to
21180 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
21190 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20  */.    array.ht 
211a0 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 61 72  = (x3node**)&(ar
211b0 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a  ray.tbl[size]);.
211c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
211d0 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e  ize; i++) array.
211e0 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66  ht[i] = 0;.    f
211f0 6f 72 28 69 3d 30 3b 20 69 3c 78 33 61 2d 3e 63  or(i=0; i<x3a->c
21200 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ount; i++){.    
21210 20 20 78 33 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c    x3node *oldnp,
21220 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f   *newnp;.      o
21230 6c 64 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62  ldnp = &(x3a->tb
21240 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d  l[i]);.      h =
21250 20 73 74 61 74 65 68 61 73 68 28 6f 6c 64 6e 70   statehash(oldnp
21260 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a 65 2d 31  ->key) & (size-1
21270 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
21280 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
21290 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
212a0 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
212b0 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
212c0 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
212d0 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
212e0 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
212f0 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20       newnp->key 
21300 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20  = oldnp->key;.  
21310 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
21320 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
21330 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
21340 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
21350 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
21360 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
21370 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 33 61    }.    free(x3a
21380 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 33 61  ->tbl);.    *x3a
21390 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
213a0 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
213b0 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
213c0 70 68 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d  ph & (x3a->size-
213d0 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 33 61  1);.  np = &(x3a
213e0 2d 3e 74 62 6c 5b 78 33 61 2d 3e 63 6f 75 6e 74  ->tbl[x3a->count
213f0 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20  ++]);.  np->key 
21400 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74  = key;.  np->dat
21410 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
21420 78 33 61 2d 3e 68 74 5b 68 5d 20 29 20 78 33 61  x3a->ht[h] ) x3a
21430 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
21440 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
21450 70 2d 3e 6e 65 78 74 20 3d 20 78 33 61 2d 3e 68  p->next = x3a->h
21460 74 5b 68 5d 3b 0a 20 20 78 33 61 2d 3e 68 74 5b  t[h];.  x3a->ht[
21470 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
21480 72 6f 6d 20 3d 20 26 28 78 33 61 2d 3e 68 74 5b  rom = &(x3a->ht[
21490 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
214a0 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
214b0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
214c0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
214d0 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
214e0 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
214f0 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74   such key. */.st
21500 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74  ruct state *Stat
21510 65 5f 66 69 6e 64 28 6b 65 79 29 0a 73 74 72 75  e_find(key).stru
21520 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a  ct config *key;.
21530 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 33 6e  {.  int h;.  x3n
21540 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20  ode *np;..  if( 
21550 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x3a==0 ) return 
21560 30 3b 0a 20 20 68 20 3d 20 73 74 61 74 65 68 61  0;.  h = stateha
21570 73 68 28 6b 65 79 29 20 26 20 28 78 33 61 2d 3e  sh(key) & (x3a->
21580 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
21590 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x3a->ht[h];.  wh
215a0 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
215b0 66 28 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e  f( statecmp(np->
215c0 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72  key,key)==0 ) br
215d0 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70  eak;.    np = np
215e0 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  ->next;.  }.  re
215f0 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61  turn np ? np->da
21600 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  ta : 0;.}../* Re
21610 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  turn an array of
21620 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
21630 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 61 62   data in the tab
21640 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79  le..** The array
21650 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
21660 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72  m malloc.  Retur
21670 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79  n NULL if memory
21680 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70   allocation.** p
21690 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74  roblems, or if t
216a0 68 65 20 61 72 72 61 79 20 69 73 20 65 6d 70 74  he array is empt
216b0 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61  y. */.struct sta
216c0 74 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79  te **State_array
216d0 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  of().{.  struct 
216e0 73 74 61 74 65 20 2a 2a 61 72 72 61 79 3b 0a 20  state **array;. 
216f0 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 69   int i,size;.  i
21700 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75  f( x3a==0 ) retu
21710 72 6e 20 30 3b 0a 20 20 73 69 7a 65 20 3d 20 78  rn 0;.  size = x
21720 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72  3a->count;.  arr
21730 61 79 20 3d 20 28 73 74 72 75 63 74 20 73 74 61  ay = (struct sta
21740 74 65 20 2a 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  te **)malloc( si
21750 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74 61 74  zeof(struct stat
21760 65 20 2a 29 2a 73 69 7a 65 20 29 3b 0a 20 20 69  e *)*size );.  i
21770 66 28 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20  f( array ){.    
21780 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
21790 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d   i++) array[i] =
217a0 20 78 33 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74   x3a->tbl[i].dat
217b0 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  a;.  }.  return 
217c0 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 48 61 73  array;.}../* Has
217d0 68 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  h a configuratio
217e0 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74  n */.PRIVATE int
217f0 20 63 6f 6e 66 69 67 68 61 73 68 28 61 29 0a 73   confighash(a).s
21800 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b  truct config *a;
21810 0a 7b 0a 20 20 69 6e 74 20 68 3d 30 3b 0a 20 20  .{.  int h=0;.  
21820 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72  h = h*571 + a->r
21830 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d  p->index*37 + a-
21840 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 68  >dot;.  return h
21850 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  ;.}../* There is
21860 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
21870 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
21880 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63  tructure for eac
21890 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65  h.** associative
218a0 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
218b0 78 34 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73  x4"..*/.struct s
218c0 5f 78 34 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65  _x4 {.  int size
218d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
218e0 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
218f0 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73   available slots
21900 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21920 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f  *   Must be a po
21930 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72  wer of 2 greater
21940 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20   than or */.    
21950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21960 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c        /*   equal
21970 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63   to 1 */.  int c
21980 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  ount;           
21990 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
219a0 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20  currently slots 
219b0 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75  filled */.  stru
219c0 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 74 62 6c  ct s_x4node *tbl
219d0 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73  ;  /* The data s
219e0 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20  tored here */.  
219f0 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20  struct s_x4node 
21a00 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74  **ht;  /* Hash t
21a10 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73  able for lookups
21a20 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65   */.};../* There
21a30 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
21a40 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
21a50 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  re for every dat
21a60 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20  a element.** in 
21a70 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  an associative a
21a80 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 34  rray of type "x4
21a90 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  "..*/.typedef st
21aa0 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 7b 0a  ruct s_x4node {.
21ab0 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
21ac0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
21ad0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
21ae0 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ata */.  struct 
21af0 73 5f 78 34 6e 6f 64 65 20 2a 6e 65 78 74 3b 20  s_x4node *next; 
21b00 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
21b10 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
21b20 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  sh */.  struct s
21b30 5f 78 34 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20  _x4node **from; 
21b40 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e   /* Previous lin
21b50 6b 20 2a 2f 0a 7d 20 78 34 6e 6f 64 65 3b 0a 0a  k */.} x4node;..
21b60 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  /* There is only
21b70 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
21b80 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63   the array, whic
21b90 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h is the followi
21ba0 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ng */.static str
21bb0 75 63 74 20 73 5f 78 34 20 2a 78 34 61 3b 0a 0a  uct s_x4 *x4a;..
21bc0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
21bd0 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  w associative ar
21be0 72 61 79 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  ray */.void Conf
21bf0 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 29 7b 0a  igtable_init(){.
21c00 20 20 69 66 28 20 78 34 61 20 29 20 72 65 74 75    if( x4a ) retu
21c10 72 6e 3b 0a 20 20 78 34 61 20 3d 20 28 73 74 72  rn;.  x4a = (str
21c20 75 63 74 20 73 5f 78 34 2a 29 6d 61 6c 6c 6f 63  uct s_x4*)malloc
21c30 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
21c40 73 5f 78 34 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x4) );.  if( x
21c50 34 61 20 29 7b 0a 20 20 20 20 78 34 61 2d 3e 73  4a ){.    x4a->s
21c60 69 7a 65 20 3d 20 36 34 3b 0a 20 20 20 20 78 34  ize = 64;.    x4
21c70 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  a->count = 0;.  
21c80 20 20 78 34 61 2d 3e 74 62 6c 20 3d 20 28 78 34    x4a->tbl = (x4
21c90 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20  node*)malloc( . 
21ca0 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 34 6e       (sizeof(x4n
21cb0 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34  ode) + sizeof(x4
21cc0 6e 6f 64 65 2a 29 29 2a 36 34 20 29 3b 0a 20 20  node*))*64 );.  
21cd0 20 20 69 66 28 20 78 34 61 2d 3e 74 62 6c 3d 3d    if( x4a->tbl==
21ce0 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
21cf0 78 34 61 29 3b 0a 20 20 20 20 20 20 78 34 61 20  x4a);.      x4a 
21d00 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
21d10 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
21d20 20 20 20 78 34 61 2d 3e 68 74 20 3d 20 28 78 34     x4a->ht = (x4
21d30 6e 6f 64 65 2a 2a 29 26 28 78 34 61 2d 3e 74 62  node**)&(x4a->tb
21d40 6c 5b 36 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f  l[64]);.      fo
21d50 72 28 69 3d 30 3b 20 69 3c 36 34 3b 20 69 2b 2b  r(i=0; i<64; i++
21d60 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x4a->ht[i] = 0
21d70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
21d80 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
21d90 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72  cord into the ar
21da0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ray.  Return TRU
21db0 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  E if successful.
21dc0 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77  .** Prior data w
21dd0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
21de0 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74   is NOT overwrit
21df0 74 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69  ten */.int Confi
21e00 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 64 61  gtable_insert(da
21e10 74 61 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  ta).struct confi
21e20 67 20 2a 64 61 74 61 3b 0a 7b 0a 20 20 78 34 6e  g *data;.{.  x4n
21e30 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68  ode *np;.  int h
21e40 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69  ;.  int ph;..  i
21e50 66 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75  f( x4a==0 ) retu
21e60 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 63 6f 6e  rn 0;.  ph = con
21e70 66 69 67 68 61 73 68 28 64 61 74 61 29 3b 0a 20  fighash(data);. 
21e80 20 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e   h = ph & (x4a->
21e90 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
21ea0 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x4a->ht[h];.  wh
21eb0 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
21ec0 66 28 20 43 6f 6e 66 69 67 63 6d 70 28 6e 70 2d  f( Configcmp(np-
21ed0 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d 30 20 29  >data,data)==0 )
21ee0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  {.      /* An ex
21ef0 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74  isting entry wit
21f00 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
21f10 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20  s found. */.    
21f20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73    /* Fail becaus
21f30 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e  e overwrite is n
21f40 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20  ot allows. */.  
21f50 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
21f60 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d    }.    np = np-
21f70 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  >next;.  }.  if(
21f80 20 78 34 61 2d 3e 63 6f 75 6e 74 3e 3d 78 34 61   x4a->count>=x4a
21f90 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a  ->size ){.    /*
21fa0 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68   Need to make th
21fb0 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67  e hash table big
21fc0 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ger */.    int i
21fd0 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63  ,size;.    struc
21fe0 74 20 73 5f 78 34 20 61 72 72 61 79 3b 0a 20 20  t s_x4 array;.  
21ff0 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73    array.size = s
22000 69 7a 65 20 3d 20 78 34 61 2d 3e 73 69 7a 65 2a  ize = x4a->size*
22010 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75  2;.    array.cou
22020 6e 74 20 3d 20 78 34 61 2d 3e 63 6f 75 6e 74 3b  nt = x4a->count;
22030 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d  .    array.tbl =
22040 20 28 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63   (x4node*)malloc
22050 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28  (.      (sizeof(
22060 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x4node) + sizeof
22070 28 78 34 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20  (x4node*))*size 
22080 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79  );.    if( array
22090 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  .tbl==0 ) return
220a0 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65   0;  /* Fail due
220b0 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   to malloc failu
220c0 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e  re */.    array.
220d0 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26  ht = (x4node**)&
220e0 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d  (array.tbl[size]
220f0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
22100 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  i<size; i++) arr
22110 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  ay.ht[i] = 0;.  
22120 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61    for(i=0; i<x4a
22130 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20  ->count; i++){. 
22140 20 20 20 20 20 78 34 6e 6f 64 65 20 2a 6f 6c 64       x4node *old
22150 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20  np, *newnp;.    
22160 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 34 61 2d    oldnp = &(x4a-
22170 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >tbl[i]);.      
22180 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 6f  h = confighash(o
22190 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 73  ldnp->data) & (s
221a0 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65  ize-1);.      ne
221b0 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62  wnp = &(array.tb
221c0 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  l[i]);.      if(
221d0 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61   array.ht[h] ) a
221e0 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  rray.ht[h]->from
221f0 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74   = &(newnp->next
22200 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  );.      newnp->
22210 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b  next = array.ht[
22220 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  h];.      newnp-
22230 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64  >data = oldnp->d
22240 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  ata;.      newnp
22250 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79  ->from = &(array
22260 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61  .ht[h]);.      a
22270 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77  rray.ht[h] = new
22280 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  np;.    }.    fr
22290 65 65 28 78 34 61 2d 3e 74 62 6c 29 3b 0a 20 20  ee(x4a->tbl);.  
222a0 20 20 2a 78 34 61 20 3d 20 61 72 72 61 79 3b 0a    *x4a = array;.
222b0 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20    }.  /* Insert 
222c0 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a  the new data */.
222d0 20 20 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d    h = ph & (x4a-
222e0 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
222f0 20 26 28 78 34 61 2d 3e 74 62 6c 5b 78 34 61 2d   &(x4a->tbl[x4a-
22300 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70  >count++]);.  np
22310 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20  ->data = data;. 
22320 20 69 66 28 20 78 34 61 2d 3e 68 74 5b 68 5d 20   if( x4a->ht[h] 
22330 29 20 78 34 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72  ) x4a->ht[h]->fr
22340 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29  om = &(np->next)
22350 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78  ;.  np->next = x
22360 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 34 61  4a->ht[h];.  x4a
22370 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20  ->ht[h] = np;.  
22380 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 34 61  np->from = &(x4a
22390 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75  ->ht[h]);.  retu
223a0 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  rn 1;.}../* Retu
223b0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
223c0 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f  data assigned to
223d0 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20   the given key. 
223e0 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20   Return NULL.** 
223f0 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20  if no such key. 
22400 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
22410 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69   *Configtable_fi
22420 6e 64 28 6b 65 79 29 0a 73 74 72 75 63 74 20 63  nd(key).struct c
22430 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20  onfig *key;.{.  
22440 69 6e 74 20 68 3b 0a 20 20 78 34 6e 6f 64 65 20  int h;.  x4node 
22450 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d  *np;..  if( x4a=
22460 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
22470 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28   h = confighash(
22480 6b 65 79 29 20 26 20 28 78 34 61 2d 3e 73 69 7a  key) & (x4a->siz
22490 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61  e-1);.  np = x4a
224a0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
224b0 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
224c0 43 6f 6e 66 69 67 63 6d 70 28 6e 70 2d 3e 64 61  Configcmp(np->da
224d0 74 61 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65  ta,key)==0 ) bre
224e0 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d  ak;.    np = np-
224f0 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  >next;.  }.  ret
22500 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74  urn np ? np->dat
22510 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 6d  a : 0;.}../* Rem
22520 6f 76 65 20 61 6c 6c 20 64 61 74 61 20 66 72 6f  ove all data fro
22530 6d 20 74 68 65 20 74 61 62 6c 65 2e 20 20 50 61  m the table.  Pa
22540 73 73 20 65 61 63 68 20 64 61 74 61 20 74 6f 20  ss each data to 
22550 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 22 66 22  the function "f"
22560 0a 2a 2a 20 61 73 20 69 74 20 69 73 20 72 65 6d  .** as it is rem
22570 6f 76 65 64 2e 20 20 28 22 66 22 20 6d 61 79 20  oved.  ("f" may 
22580 62 65 20 6e 75 6c 6c 20 74 6f 20 61 76 6f 69 64  be null to avoid
22590 20 74 68 69 73 20 73 74 65 70 2e 29 20 2a 2f 0a   this step.) */.
225a0 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65  void Configtable
225b0 5f 63 6c 65 61 72 28 66 29 0a 69 6e 74 28 2a 66  _clear(f).int(*f
225c0 29 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e 66  )(/* struct conf
225d0 69 67 20 2a 20 2a 2f 29 3b 0a 7b 0a 20 20 69 6e  ig * */);.{.  in
225e0 74 20 69 3b 0a 20 20 69 66 28 20 78 34 61 3d 3d  t i;.  if( x4a==
225f0 30 20 7c 7c 20 78 34 61 2d 3e 63 6f 75 6e 74 3d  0 || x4a->count=
22600 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
22610 66 28 20 66 20 29 20 66 6f 72 28 69 3d 30 3b 20  f( f ) for(i=0; 
22620 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b  i<x4a->count; i+
22630 2b 29 20 28 2a 66 29 28 78 34 61 2d 3e 74 62 6c  +) (*f)(x4a->tbl
22640 5b 69 5d 2e 64 61 74 61 29 3b 0a 20 20 66 6f 72  [i].data);.  for
22650 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 73 69 7a  (i=0; i<x4a->siz
22660 65 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b  e; i++) x4a->ht[
22670 69 5d 20 3d 20 30 3b 0a 20 20 78 34 61 2d 3e 63  i] = 0;.  x4a->c
22680 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  ount = 0;.  retu
22690 72 6e 3b 0a 7d 0a                                rn;.}.