/ Hex Artifact Content
Login

Artifact ef864b9566d4e62cc9d0ee4ac937dd1264490d27:


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 2f 2a 0a 2a 2a 20 43 6f  ar*));../*.** Co
0330: 6d 70 69 6c 65 72 73 20 61 72 65 20 67 65 74 74  mpilers are gett
0340: 69 6e 67 20 69 6e 63 72 65 61 73 69 6e 67 6c 79  ing increasingly
0350: 20 70 65 64 61 6e 74 69 63 20 61 62 6f 75 74 20   pedantic about 
0360: 74 79 70 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73  type conversions
0370: 0a 2a 2a 20 61 73 20 43 20 65 76 6f 6c 76 65 73  .** as C evolves
0380: 20 65 76 65 72 20 63 6c 6f 73 65 72 20 74 6f 20   ever closer to 
0390: 41 64 61 2e 2e 2e 2e 20 20 54 6f 20 77 6f 72 6b  Ada....  To work
03a0: 20 61 72 6f 75 6e 64 20 74 68 65 20 6c 61 74 65   around the late
03b0: 73 74 20 70 72 6f 62 6c 65 6d 73 0a 2a 2a 20 77  st problems.** w
03c0: 65 20 68 61 76 65 20 74 6f 20 64 65 66 69 6e 65  e have to define
03d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   the following v
03e0: 61 72 69 61 6e 74 20 6f 66 20 73 74 72 6c 65 6e  ariant of strlen
03f0: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 6c  ()..*/.#define l
0400: 65 6d 6f 6e 53 74 72 6c 65 6e 28 58 29 20 20 20  emonStrlen(X)   
0410: 28 28 69 6e 74 29 73 74 72 6c 65 6e 28 58 29 29  ((int)strlen(X))
0420: 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
0430: 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e  action *Action_n
0440: 65 77 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63  ew(void);.static
0450: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
0460: 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 72 75  Action_sort(stru
0470: 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f  ct action *);../
0480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
0490: 74 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e  the file "build.
04a0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
04b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
04c0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46 69  *******/.void Fi
04d0: 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65  ndRulePrecedence
04e0: 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 69  s();.void FindFi
04f0: 72 73 74 53 65 74 73 28 29 3b 0a 76 6f 69 64 20  rstSets();.void 
0500: 46 69 6e 64 53 74 61 74 65 73 28 29 3b 0a 76 6f  FindStates();.vo
0510: 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28 29 3b 0a  id FindLinks();.
0520: 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53  void FindFollowS
0530: 65 74 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64  ets();.void Find
0540: 41 63 74 69 6f 6e 73 28 29 3b 0a 0a 2f 2a 2a 2a  Actions();../***
0550: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
0560: 66 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73 74  file "configlist
0570: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
0580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0590: 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  *****/.void Conf
05a0: 69 67 6c 69 73 74 5f 69 6e 69 74 28 2f 2a 20 76  iglist_init(/* v
05b0: 6f 69 64 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20  oid */);.struct 
05c0: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
05d0: 73 74 5f 61 64 64 28 2f 2a 20 73 74 72 75 63 74  st_add(/* struct
05e0: 20 72 75 6c 65 20 2a 2c 20 69 6e 74 20 2a 2f 29   rule *, int */)
05f0: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
0600: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62  *Configlist_addb
0610: 61 73 69 73 28 2f 2a 20 73 74 72 75 63 74 20 72  asis(/* struct r
0620: 75 6c 65 20 2a 2c 20 69 6e 74 20 2a 2f 29 3b 0a  ule *, int */);.
0630: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
0640: 63 6c 6f 73 75 72 65 28 2f 2a 20 76 6f 69 64 20  closure(/* void 
0650: 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67  */);.void Config
0660: 6c 69 73 74 5f 73 6f 72 74 28 2f 2a 20 76 6f 69  list_sort(/* voi
0670: 64 20 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66  d */);.void Conf
0680: 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73  iglist_sortbasis
0690: 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 73 74  (/* void */);.st
06a0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
06b0: 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 2f  figlist_return(/
06c0: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 73 74 72 75  * void */);.stru
06d0: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
06e0: 67 6c 69 73 74 5f 62 61 73 69 73 28 2f 2a 20 76  glist_basis(/* v
06f0: 6f 69 64 20 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f  oid */);.void Co
0700: 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 2f 2a 20  nfiglist_eat(/* 
0710: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
0720: 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67  */);.void Config
0730: 6c 69 73 74 5f 72 65 73 65 74 28 2f 2a 20 76 6f  list_reset(/* vo
0740: 69 64 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  id */);../******
0750: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0760: 65 20 22 65 72 72 6f 72 2e 68 22 20 2a 2a 2a 2a  e "error.h" ****
0770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0790: 2a 2a 2a 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d  ***/.void ErrorM
07a0: 73 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c  sg(const char *,
07b0: 20 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 20   int,const char 
07c0: 2a 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  *, ...);../*****
07d0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
07e0: 22 6f 70 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a  "option.h" *****
07f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0810: 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74 20 73 5f  *****/.struct s_
0820: 6f 70 74 69 6f 6e 73 20 7b 0a 20 20 65 6e 75 6d  options {.  enum
0830: 20 7b 20 4f 50 54 5f 46 4c 41 47 3d 31 2c 20 20   { OPT_FLAG=1,  
0840: 4f 50 54 5f 49 4e 54 2c 20 20 4f 50 54 5f 44 42  OPT_INT,  OPT_DB
0850: 4c 2c 20 20 4f 50 54 5f 53 54 52 2c 0a 20 20 20  L,  OPT_STR,.   
0860: 20 20 20 20 20 20 4f 50 54 5f 46 46 4c 41 47 2c        OPT_FFLAG,
0870: 20 4f 50 54 5f 46 49 4e 54 2c 20 4f 50 54 5f 46   OPT_FINT, OPT_F
0880: 44 42 4c 2c 20 4f 50 54 5f 46 53 54 52 7d 20 74  DBL, OPT_FSTR} t
0890: 79 70 65 3b 0a 20 20 63 68 61 72 20 2a 6c 61 62  ype;.  char *lab
08a0: 65 6c 3b 0a 20 20 63 68 61 72 20 2a 61 72 67 3b  el;.  char *arg;
08b0: 0a 20 20 63 68 61 72 20 2a 6d 65 73 73 61 67 65  .  char *message
08c0: 3b 0a 7d 3b 0a 69 6e 74 20 20 20 20 4f 70 74 49  ;.};.int    OptI
08d0: 6e 69 74 28 2f 2a 20 63 68 61 72 2a 2a 2c 73 74  nit(/* char**,st
08e0: 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 2a 2c  ruct s_options*,
08f0: 46 49 4c 45 2a 20 2a 2f 29 3b 0a 69 6e 74 20 20  FILE* */);.int  
0900: 20 20 4f 70 74 4e 41 72 67 73 28 2f 2a 20 76 6f    OptNArgs(/* vo
0910: 69 64 20 2a 2f 29 3b 0a 63 68 61 72 20 20 2a 4f  id */);.char  *O
0920: 70 74 41 72 67 28 2f 2a 20 69 6e 74 20 2a 2f 29  ptArg(/* int */)
0930: 3b 0a 76 6f 69 64 20 20 20 4f 70 74 45 72 72 28  ;.void   OptErr(
0940: 2f 2a 20 69 6e 74 20 2a 2f 29 3b 0a 76 6f 69 64  /* int */);.void
0950: 20 20 20 4f 70 74 50 72 69 6e 74 28 2f 2a 20 76     OptPrint(/* v
0960: 6f 69 64 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  oid */);../*****
0970: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0980: 65 20 22 70 61 72 73 65 2e 68 22 20 2a 2a 2a 2a  e "parse.h" ****
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09b0: 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 50 61 72 73  *****/.void Pars
09c0: 65 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f  e(/* struct lemo
09d0: 6e 20 2a 6c 65 6d 70 20 2a 2f 29 3b 0a 0a 2f 2a  n *lemp */);../*
09e0: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
09f0: 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 68 22  e file "plink.h"
0a00: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
0a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a20: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74  ********/.struct
0a30: 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65   plink *Plink_ne
0a40: 77 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 76  w(/* void */);.v
0a50: 6f 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 2f 2a  oid Plink_add(/*
0a60: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a   struct plink **
0a70: 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
0a80: 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 50 6c 69 6e  * */);.void Plin
0a90: 6b 5f 63 6f 70 79 28 2f 2a 20 73 74 72 75 63 74  k_copy(/* struct
0aa0: 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63   plink **, struc
0ab0: 74 20 70 6c 69 6e 6b 20 2a 20 2a 2f 29 3b 0a 76  t plink * */);.v
0ac0: 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65  oid Plink_delete
0ad0: 28 2f 2a 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  (/* struct plink
0ae0: 20 2a 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a   * */);../******
0af0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
0b00: 6c 65 20 22 72 65 70 6f 72 74 2e 68 22 20 2a 2a  le "report.h" **
0b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b30: 2a 2a 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e  ***/.void Reprin
0b40: 74 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f  t(/* struct lemo
0b50: 6e 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 52 65  n * */);.void Re
0b60: 70 6f 72 74 4f 75 74 70 75 74 28 2f 2a 20 73 74  portOutput(/* st
0b70: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29  ruct lemon * */)
0b80: 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61 62  ;.void ReportTab
0b90: 6c 65 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d  le(/* struct lem
0ba0: 6f 6e 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 52  on * */);.void R
0bb0: 65 70 6f 72 74 48 65 61 64 65 72 28 2f 2a 20 73  eportHeader(/* s
0bc0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f  truct lemon * */
0bd0: 29 3b 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73 73  );.void Compress
0be0: 54 61 62 6c 65 73 28 2f 2a 20 73 74 72 75 63 74  Tables(/* struct
0bf0: 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a 76 6f   lemon * */);.vo
0c00: 69 64 20 52 65 73 6f 72 74 53 74 61 74 65 73 28  id ResortStates(
0c10: 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  /* struct lemon 
0c20: 2a 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  * */);../*******
0c30: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0c40: 65 20 22 73 65 74 2e 68 22 20 2a 2a 2a 2a 2a 2a  e "set.h" ******
0c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c70: 2a 2a 2f 0a 76 6f 69 64 20 20 53 65 74 53 69 7a  **/.void  SetSiz
0c80: 65 28 2f 2a 20 69 6e 74 20 4e 20 2a 2f 29 3b 20  e(/* int N */); 
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
0ca0: 6c 6c 20 73 65 74 73 20 77 69 6c 6c 20 62 65 20  ll sets will be 
0cb0: 6f 66 20 73 69 7a 65 20 4e 20 2a 2f 0a 63 68 61  of size N */.cha
0cc0: 72 20 2a 53 65 74 4e 65 77 28 2f 2a 20 76 6f 69  r *SetNew(/* voi
0cd0: 64 20 2a 2f 29 3b 20 20 20 20 20 20 20 20 20 20  d */);          
0ce0: 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 65       /* A new se
0cf0: 74 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20 30 2e  t for element 0.
0d00: 2e 4e 20 2a 2f 0a 76 6f 69 64 20 20 53 65 74 46  .N */.void  SetF
0d10: 72 65 65 28 2f 2a 20 63 68 61 72 2a 20 2a 2f 29  ree(/* char* */)
0d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0d30: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65   Deallocate a se
0d40: 74 20 2a 2f 0a 0a 69 6e 74 20 53 65 74 41 64 64  t */..int SetAdd
0d50: 28 2f 2a 20 63 68 61 72 2a 2c 69 6e 74 20 2a 2f  (/* char*,int */
0d60: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
0d70: 20 41 64 64 20 65 6c 65 6d 65 6e 74 20 74 6f 20   Add element to 
0d80: 61 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65 74  a set */.int Set
0d90: 55 6e 69 6f 6e 28 2f 2a 20 63 68 61 72 20 2a 41  Union(/* char *A
0da0: 2c 63 68 61 72 20 2a 42 20 2a 2f 29 3b 20 20 20  ,char *B */);   
0db0: 20 2f 2a 20 41 20 3c 2d 20 41 20 55 20 42 2c 20   /* A <- A U B, 
0dc0: 74 68 72 75 20 65 6c 65 6d 65 6e 74 20 4e 20 2a  thru element N *
0dd0: 2f 0a 0a 23 64 65 66 69 6e 65 20 53 65 74 46 69  /..#define SetFi
0de0: 6e 64 28 58 2c 59 29 20 28 58 5b 59 5d 29 20 20  nd(X,Y) (X[Y])  
0df0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
0e00: 59 20 69 73 20 69 6e 20 73 65 74 20 58 20 2a 2f  Y is in set X */
0e10: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
0e20: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73 74 72  om the file "str
0e30: 75 63 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  uct.h" *********
0e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
0e60: 0a 2a 2a 20 50 72 69 6e 63 69 70 61 6c 20 64 61  .** Principal da
0e70: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  ta structures fo
0e80: 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
0e90: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
0ea0: 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b  ..typedef enum {
0eb0: 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3d 30 2c 20 4c  LEMON_FALSE=0, L
0ec0: 45 4d 4f 4e 5f 54 52 55 45 7d 20 42 6f 6f 6c 65  EMON_TRUE} Boole
0ed0: 61 6e 3b 0a 0a 2f 2a 20 53 79 6d 62 6f 6c 73 20  an;../* Symbols 
0ee0: 28 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e  (terminals and n
0ef0: 6f 6e 74 65 72 6d 69 6e 61 6c 73 29 20 6f 66 20  onterminals) of 
0f00: 74 68 65 20 67 72 61 6d 6d 61 72 20 61 72 65 20  the grammar are 
0f10: 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
0f20: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 73   following: */.s
0f30: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 7b 0a 20  truct symbol {. 
0f40: 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20   char *name;    
0f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
0f60: 65 20 6f 66 20 74 68 65 20 73 79 6d 62 6f 6c 20  e of the symbol 
0f70: 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20  */.  int index; 
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0f90: 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 66 6f   Index number fo
0fa0: 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f  r this symbol */
0fb0: 0a 20 20 65 6e 75 6d 20 7b 0a 20 20 20 20 54 45  .  enum {.    TE
0fc0: 52 4d 49 4e 41 4c 2c 0a 20 20 20 20 4e 4f 4e 54  RMINAL,.    NONT
0fd0: 45 52 4d 49 4e 41 4c 2c 0a 20 20 20 20 4d 55 4c  ERMINAL,.    MUL
0fe0: 54 49 54 45 52 4d 49 4e 41 4c 0a 20 20 7d 20 74  TITERMINAL.  } t
0ff0: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
1000: 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 73        /* Symbols
1010: 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20   are all either 
1020: 54 45 52 4d 49 4e 41 4c 53 20 6f 72 20 4e 54 73  TERMINALS or NTs
1030: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
1040: 65 20 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f  e *rule;       /
1050: 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * Linked list of
1060: 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73 20 28   rules of this (
1070: 69 66 20 61 6e 20 4e 54 29 20 2a 2f 0a 20 20 73  if an NT) */.  s
1080: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61  truct symbol *fa
1090: 6c 6c 62 61 63 6b 3b 20 2f 2a 20 66 61 6c 6c 62  llback; /* fallb
10a0: 61 63 6b 20 74 6f 6b 65 6e 20 69 6e 20 63 61 73  ack token in cas
10b0: 65 20 74 68 69 73 20 74 6f 6b 65 6e 20 64 6f 65  e this token doe
10c0: 73 6e 27 74 20 70 61 72 73 65 20 2a 2f 0a 20 20  sn't parse */.  
10d0: 69 6e 74 20 70 72 65 63 3b 20 20 20 20 20 20 20  int prec;       
10e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63           /* Prec
10f0: 65 64 65 6e 63 65 20 69 66 20 64 65 66 69 6e 65  edence if define
1100: 64 20 28 2d 31 20 6f 74 68 65 72 77 69 73 65 29  d (-1 otherwise)
1110: 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73   */.  enum e_ass
1120: 6f 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c 0a 20  oc {.    LEFT,. 
1130: 20 20 20 52 49 47 48 54 2c 0a 20 20 20 20 4e 4f     RIGHT,.    NO
1140: 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a 20 20 7d 20  NE,.    UNK.  } 
1150: 61 73 73 6f 63 3b 20 20 20 20 20 20 20 20 20 20  assoc;          
1160: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
1170: 61 74 69 76 69 74 79 20 69 66 20 70 72 65 63 65  ativity if prece
1180: 64 65 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64  dence is defined
1190: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73   */.  char *firs
11a0: 74 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  tset;          /
11b0: 2a 20 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20  * First-set for 
11c0: 61 6c 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69  all rules of thi
11d0: 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f  s symbol */.  Bo
11e0: 6f 6c 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20  olean lambda;   
11f0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1200: 66 20 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e  f NT and can gen
1210: 65 72 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73  erate an empty s
1220: 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 75  tring */.  int u
1230: 73 65 43 6e 74 3b 20 20 20 20 20 20 20 20 20 20  seCnt;          
1240: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1250: 20 74 69 6d 65 73 20 75 73 65 64 20 2a 2f 0a 20   times used */. 
1260: 20 63 68 61 72 20 2a 64 65 73 74 72 75 63 74 6f   char *destructo
1270: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64  r;        /* Cod
1280: 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
1290: 20 77 68 65 6e 65 76 65 72 20 74 68 69 73 20 73   whenever this s
12a0: 79 6d 62 6f 6c 20 69 73 0a 20 20 20 20 20 20 20  ymbol is.       
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 20 20 2a 2a 20 70 6f 70 70 65 64 20 66 72      ** popped fr
12d0: 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 64 75 72  om the stack dur
12e0: 69 6e 67 20 65 72 72 6f 72 20 70 72 6f 63 65 73  ing error proces
12f0: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sing */.  int de
1300: 73 74 4c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20  stLineno;       
1310: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
1320: 72 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 64  r for start of d
1330: 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63  estructor */.  c
1340: 68 61 72 20 2a 64 61 74 61 74 79 70 65 3b 20 20  har *datatype;  
1350: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1360: 61 74 61 20 74 79 70 65 20 6f 66 20 69 6e 66 6f  ata type of info
1370: 72 6d 61 74 69 6f 6e 20 68 65 6c 64 20 62 79 20  rmation held by 
1380: 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  this.           
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e 6c 79 20  ** object. Only 
13b0: 75 73 65 64 20 69 66 20 74 79 70 65 3d 3d 4e 4f  used if type==NO
13c0: 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a 20 20 69  NTERMINAL */.  i
13d0: 6e 74 20 64 74 6e 75 6d 3b 20 20 20 20 20 20 20  nt dtnum;       
13e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
13f0: 61 74 61 20 74 79 70 65 20 6e 75 6d 62 65 72 2e  ata type number.
1400: 20 20 49 6e 20 74 68 65 20 70 61 72 73 65 72 2c    In the parser,
1410: 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   the value.     
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 20 20 2a 2a 20 73 74 61 63 6b 20 69        ** stack i
1440: 73 20 61 20 75 6e 69 6f 6e 2e 20 20 54 68 65 20  s a union.  The 
1450: 2e 79 79 25 64 20 65 6c 65 6d 65 6e 74 20 6f 66  .yy%d element of
1460: 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 2a 2a 20 75 6e 69 6f 6e 20 69 73 20 74 68 65   ** union is the
1490: 20 63 6f 72 72 65 63 74 20 64 61 74 61 20 74 79   correct data ty
14a0: 70 65 20 66 6f 72 20 74 68 69 73 20 6f 62 6a 65  pe for this obje
14b0: 63 74 20 2a 2f 0a 20 20 2f 2a 20 54 68 65 20 66  ct */.  /* The f
14c0: 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
14d0: 61 72 65 20 75 73 65 64 20 62 79 20 4d 55 4c 54  are used by MULT
14e0: 49 54 45 52 4d 49 4e 41 4c 73 20 6f 6e 6c 79 20  ITERMINALs only 
14f0: 2a 2f 0a 20 20 69 6e 74 20 6e 73 75 62 73 79 6d  */.  int nsubsym
1500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1510: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
1520: 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 69  ituent symbols i
1530: 6e 20 74 68 65 20 4d 55 4c 54 49 20 2a 2f 0a 20  n the MULTI */. 
1540: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1550: 2a 73 75 62 73 79 6d 3b 20 20 2f 2a 20 41 72 72  *subsym;  /* Arr
1560: 61 79 20 6f 66 20 63 6f 6e 73 74 69 74 75 65 6e  ay of constituen
1570: 74 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 7d 3b 0a  t symbols */.};.
1580: 0a 2f 2a 20 45 61 63 68 20 70 72 6f 64 75 63 74  ./* Each product
1590: 69 6f 6e 20 72 75 6c 65 20 69 6e 20 74 68 65 20  ion rule in the 
15a0: 67 72 61 6d 6d 61 72 20 69 73 20 73 74 6f 72 65  grammar is store
15b0: 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d in the followi
15c0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
15d0: 20 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c 65    */.struct rule
15e0: 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62   {.  struct symb
15f0: 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 2f 2a  ol *lhs;      /*
1600: 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   Left-hand side 
1610: 6f 66 20 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20  of the rule */. 
1620: 20 63 68 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b   char *lhsalias;
1630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 69            /* Ali
1640: 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20 28  as for the LHS (
1650: 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f  NULL if none) */
1660: 0a 20 20 69 6e 74 20 6c 68 73 53 74 61 72 74 3b  .  int lhsStart;
1670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1680: 72 75 65 20 69 66 20 6c 65 66 74 2d 68 61 6e 64  rue if left-hand
1690: 20 73 69 64 65 20 69 73 20 74 68 65 20 73 74 61   side is the sta
16a0: 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69  rt symbol */.  i
16b0: 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20 20 20 20  nt ruleline;    
16c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
16d0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72  number for the r
16e0: 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68  ule */.  int nrh
16f0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1700: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
1710: 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  HS symbols */.  
1720: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
1730: 72 68 73 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rhs;     /* The 
1740: 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  RHS symbols */. 
1750: 20 63 68 61 72 20 2a 2a 72 68 73 61 6c 69 61 73   char **rhsalias
1760: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ;         /* An 
1770: 61 6c 69 61 73 20 66 6f 72 20 65 61 63 68 20 52  alias for each R
1780: 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55 4c 4c 20  HS symbol (NULL 
1790: 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69 6e  if none) */.  in
17a0: 74 20 6c 69 6e 65 3b 20 20 20 20 20 20 20 20 20  t line;         
17b0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
17c0: 75 6d 62 65 72 20 61 74 20 77 68 69 63 68 20 63  umber at which c
17d0: 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f 0a 20 20  ode begins */.  
17e0: 63 68 61 72 20 2a 63 6f 64 65 3b 20 20 20 20 20  char *code;     
17f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1800: 63 6f 64 65 20 65 78 65 63 75 74 65 64 20 77 68  code executed wh
1810: 65 6e 20 74 68 69 73 20 72 75 6c 65 20 69 73 20  en this rule is 
1820: 72 65 64 75 63 65 64 20 2a 2f 0a 20 20 73 74 72  reduced */.  str
1830: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 70 72 65 63  uct symbol *prec
1840: 73 79 6d 3b 20 20 2f 2a 20 50 72 65 63 65 64 65  sym;  /* Precede
1850: 6e 63 65 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74  nce symbol for t
1860: 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e  his rule */.  in
1870: 74 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20 20  t index;        
1880: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
1890: 65 78 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ex number for th
18a0: 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 42 6f 6f  is rule */.  Boo
18b0: 6c 65 61 6e 20 63 61 6e 52 65 64 75 63 65 3b 20  lean canReduce; 
18c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
18d0: 20 74 68 69 73 20 72 75 6c 65 20 69 73 20 65 76   this rule is ev
18e0: 65 72 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20  er reduced */.  
18f0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78  struct rule *nex
1900: 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e 65 78 74  tlhs;    /* Next
1910: 20 72 75 6c 65 20 77 69 74 68 20 74 68 65 20 73   rule with the s
1920: 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20 73 74 72  ame LHS */.  str
1930: 75 63 74 20 72 75 6c 65 20 2a 6e 65 78 74 3b 20  uct rule *next; 
1940: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 72 75        /* Next ru
1950: 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c  le in the global
1960: 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20   list */.};../* 
1970: 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  A configuration 
1980: 69 73 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  is a production 
1990: 72 75 6c 65 20 6f 66 20 74 68 65 20 67 72 61 6d  rule of the gram
19a0: 6d 61 72 20 74 6f 67 65 74 68 65 72 20 77 69 74  mar together wit
19b0: 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28 64 6f 74  h.** a mark (dot
19c0: 29 20 73 68 6f 77 69 6e 67 20 68 6f 77 20 6d 75  ) showing how mu
19d0: 63 68 20 6f 66 20 74 68 61 74 20 72 75 6c 65 20  ch of that rule 
19e0: 68 61 73 20 62 65 65 6e 20 70 72 6f 63 65 73 73  has been process
19f0: 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a 20 43 6f  ed so far..** Co
1a00: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61 6c 73  nfigurations als
1a10: 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66 6f 6c 6c  o contain a foll
1a20: 6f 77 2d 73 65 74 20 77 68 69 63 68 20 69 73 20  ow-set which is 
1a30: 61 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 69 6e  a list of termin
1a40: 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73 20 77 68  al.** symbols wh
1a50: 69 63 68 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  ich are allowed 
1a60: 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  to immediately f
1a70: 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64 20 6f 66  ollow the end of
1a80: 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a 20 45 76   the rule..** Ev
1a90: 65 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ery configuratio
1aa0: 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61 73  n is recorded as
1ab0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
1ac0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a  the following: *
1ad0: 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  /.struct config 
1ae0: 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  {.  struct rule 
1af0: 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  *rp;         /* 
1b00: 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77 68  The rule upon wh
1b10: 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ich the configur
1b20: 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20 2a  ation is based *
1b30: 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20 20  /.  int dot;    
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b50: 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74 20  The parse point 
1b60: 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b 20  */.  char *fws; 
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b80: 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 20   Follow-set for 
1b90: 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  this configurati
1ba0: 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  on only */.  str
1bb0: 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70 3b  uct plink *fplp;
1bc0: 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d        /* Follow-
1bd0: 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f 70  set forward prop
1be0: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f  agation links */
1bf0: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
1c00: 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46  *bplp;      /* F
1c10: 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77 61  ollow-set backwa
1c20: 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  rds propagation 
1c30: 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63  links */.  struc
1c40: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20  t state *stp;   
1c50: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1c60: 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63 6f  o state which co
1c70: 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a 20  ntains this */. 
1c80: 20 65 6e 75 6d 20 7b 0a 20 20 20 20 43 4f 4d 50   enum {.    COMP
1c90: 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20 20 20  LETE,           
1ca0: 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 75 73     /* The status
1cb0: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
1cc0: 66 6f 6c 6c 6f 77 73 65 74 20 61 6e 64 20 2a 2f  followset and */
1cd0: 0a 20 20 20 20 49 4e 43 4f 4d 50 4c 45 54 45 20  .    INCOMPLETE 
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
1cf0: 20 20 73 68 69 66 74 20 63 6f 6d 70 75 74 61 74    shift computat
1d00: 69 6f 6e 73 20 2a 2f 0a 20 20 7d 20 73 74 61 74  ions */.  } stat
1d10: 75 73 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  us;.  struct con
1d20: 66 69 67 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f  fig *next;     /
1d30: 2a 20 4e 65 78 74 20 63 6f 6e 66 69 67 75 72 61  * Next configura
1d40: 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74 61 74  tion in the stat
1d50: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f  e */.  struct co
1d60: 6e 66 69 67 20 2a 62 70 3b 20 20 20 20 20 20 20  nfig *bp;       
1d70: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 61 73 69  /* The next basi
1d80: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
1d90: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79 20  */.};../* Every 
1da0: 73 68 69 66 74 20 6f 72 20 72 65 64 75 63 65 20  shift or reduce 
1db0: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73 74 6f  operation is sto
1dc0: 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20 74 68  red as one of th
1dd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
1de0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b 0a 20  truct action {. 
1df0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1e00: 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  sp;       /* The
1e10: 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79 6d 62   look-ahead symb
1e20: 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61  ol */.  enum e_a
1e30: 63 74 69 6f 6e 20 7b 0a 20 20 20 20 53 48 49 46  ction {.    SHIF
1e40: 54 2c 0a 20 20 20 20 41 43 43 45 50 54 2c 0a 20  T,.    ACCEPT,. 
1e50: 20 20 20 52 45 44 55 43 45 2c 0a 20 20 20 20 45     REDUCE,.    E
1e60: 52 52 4f 52 2c 0a 20 20 20 20 53 53 43 4f 4e 46  RROR,.    SSCONF
1e70: 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20  LICT,           
1e80: 20 20 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68     /* A shift/sh
1e90: 69 66 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ift conflict */.
1ea0: 20 20 20 20 53 52 43 4f 4e 46 4c 49 43 54 2c 20      SRCONFLICT, 
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec0: 57 61 73 20 61 20 72 65 64 75 63 65 2c 20 62 75  Was a reduce, bu
1ed0: 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6e 66  t part of a conf
1ee0: 6c 69 63 74 20 2a 2f 0a 20 20 20 20 52 52 43 4f  lict */.    RRCO
1ef0: 4e 46 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20  NFLICT,         
1f00: 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 72 65       /* Was a re
1f10: 64 75 63 65 2c 20 62 75 74 20 70 61 72 74 20 6f  duce, but part o
1f20: 66 20 61 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  f a conflict */.
1f30: 20 20 20 20 53 48 5f 52 45 53 4f 4c 56 45 44 2c      SH_RESOLVED,
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f50: 57 61 73 20 61 20 73 68 69 66 74 2e 20 20 50 72  Was a shift.  Pr
1f60: 65 63 65 64 65 6e 63 65 20 72 65 73 6f 6c 76 65  ecedence resolve
1f70: 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  d conflict */.  
1f80: 20 20 52 44 5f 52 45 53 4f 4c 56 45 44 2c 20 20    RD_RESOLVED,  
1f90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
1fa0: 73 20 72 65 64 75 63 65 2e 20 20 50 72 65 63 65  s reduce.  Prece
1fb0: 64 65 6e 63 65 20 72 65 73 6f 6c 76 65 64 20 63  dence resolved c
1fc0: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 4e  onflict */.    N
1fd0: 4f 54 5f 55 53 45 44 20 20 20 20 20 20 20 20 20  OT_USED         
1fe0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
1ff0: 65 64 20 62 79 20 63 6f 6d 70 72 65 73 73 69 6f  ed by compressio
2000: 6e 20 2a 2f 0a 20 20 7d 20 74 79 70 65 3b 0a 20  n */.  } type;. 
2010: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72   union {.    str
2020: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20  uct state *stp; 
2030: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 73      /* The new s
2040: 74 61 74 65 2c 20 69 66 20 61 20 73 68 69 66 74  tate, if a shift
2050: 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 72   */.    struct r
2060: 75 6c 65 20 2a 72 70 3b 20 20 20 20 20 20 20 2f  ule *rp;       /
2070: 2a 20 54 68 65 20 72 75 6c 65 2c 20 69 66 20 61  * The rule, if a
2080: 20 72 65 64 75 63 65 20 2a 2f 0a 20 20 7d 20 78   reduce */.  } x
2090: 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
20a0: 6e 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20  n *next;     /* 
20b0: 4e 65 78 74 20 61 63 74 69 6f 6e 20 66 6f 72 20  Next action for 
20c0: 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20  this state */.  
20d0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 63  struct action *c
20e0: 6f 6c 6c 69 64 65 3b 20 20 2f 2a 20 4e 65 78 74  ollide;  /* Next
20f0: 20 61 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65   action with the
2100: 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 7d 3b   same hash */.};
2110: 0a 0a 2f 2a 20 45 61 63 68 20 73 74 61 74 65 20  ../* Each state 
2120: 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
2130: 20 70 61 72 73 65 72 27 73 20 66 69 6e 69 74 65   parser's finite
2140: 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 0a 2a   state machine.*
2150: 2a 20 69 73 20 65 6e 63 6f 64 65 64 20 61 73 20  * is encoded as 
2160: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
2170: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
2180: 75 63 74 75 72 65 2e 20 2a 2f 0a 73 74 72 75 63  ucture. */.struc
2190: 74 20 73 74 61 74 65 20 7b 0a 20 20 73 74 72 75  t state {.  stru
21a0: 63 74 20 63 6f 6e 66 69 67 20 2a 62 70 3b 20 20  ct config *bp;  
21b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 61 73 69       /* The basi
21c0: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  s configurations
21d0: 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20   for this state 
21e0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  */.  struct conf
21f0: 69 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a  ig *cfp;      /*
2200: 20 41 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69   All configurati
2210: 6f 6e 73 20 69 6e 20 74 68 69 73 20 73 65 74 20  ons in this set 
2220: 2a 2f 0a 20 20 69 6e 74 20 73 74 61 74 65 6e 75  */.  int statenu
2230: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  m;            /*
2240: 20 53 65 71 75 65 6e 74 69 61 6c 20 6e 75 6d 62   Sequential numb
2250: 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74  er for this stat
2260: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63  e */.  struct ac
2270: 74 69 6f 6e 20 2a 61 70 3b 20 20 20 20 20 20 20  tion *ap;       
2280: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
2290: 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74 61  ons for this sta
22a0: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6b 6e  te */.  int nTkn
22b0: 41 63 74 2c 20 6e 4e 74 41 63 74 3b 20 20 20 20  Act, nNtAct;    
22c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63   /* Number of ac
22d0: 74 69 6f 6e 73 20 6f 6e 20 74 65 72 6d 69 6e 61  tions on termina
22e0: 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e  ls and nontermin
22f0: 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6b  als */.  int iTk
2300: 6e 4f 66 73 74 2c 20 69 4e 74 4f 66 73 74 3b 20  nOfst, iNtOfst; 
2310: 20 20 2f 2a 20 79 79 5f 61 63 74 69 6f 6e 5b 5d    /* yy_action[]
2320: 20 6f 66 66 73 65 74 20 66 6f 72 20 74 65 72 6d   offset for term
2330: 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72  inals and nonter
2340: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 69 44 66 6c  ms */.  int iDfl
2350: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2360: 20 2f 2a 20 44 65 66 61 75 6c 74 20 61 63 74 69   /* Default acti
2370: 6f 6e 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  on */.};.#define
2380: 20 4e 4f 5f 4f 46 46 53 45 54 20 28 2d 32 31 34   NO_OFFSET (-214
2390: 37 34 38 33 36 34 37 29 0a 0a 2f 2a 20 41 20 66  7483647)../* A f
23a0: 6f 6c 6c 6f 77 73 65 74 20 70 72 6f 70 61 67 61  ollowset propaga
23b0: 74 69 6f 6e 20 6c 69 6e 6b 20 69 6e 64 69 63 61  tion link indica
23c0: 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
23d0: 74 65 6e 74 73 20 6f 66 20 6f 6e 65 0a 2a 2a 20  tents of one.** 
23e0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f  configuration fo
23f0: 6c 6c 6f 77 73 65 74 20 73 68 6f 75 6c 64 20 62  llowset should b
2400: 65 20 70 72 6f 70 61 67 61 74 65 64 20 74 6f 20  e propagated to 
2410: 61 6e 6f 74 68 65 72 20 77 68 65 6e 65 76 65 72  another whenever
2420: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 68  .** the first ch
2430: 61 6e 67 65 73 2e 20 2a 2f 0a 73 74 72 75 63 74  anges. */.struct
2440: 20 70 6c 69 6e 6b 20 7b 0a 20 20 73 74 72 75 63   plink {.  struc
2450: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20  t config *cfp;  
2460: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 69      /* The confi
2470: 67 75 72 61 74 69 6f 6e 20 74 6f 20 77 68 69 63  guration to whic
2480: 68 20 6c 69 6e 6b 65 64 20 2a 2f 0a 20 20 73 74  h linked */.  st
2490: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74  ruct plink *next
24a0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ;      /* The ne
24b0: 78 74 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e  xt propagate lin
24c0: 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 20  k */.};../* The 
24d0: 73 74 61 74 65 20 76 65 63 74 6f 72 20 66 6f 72  state vector for
24e0: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 72 73   the entire pars
24f0: 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 73 20  er generator is 
2500: 72 65 63 6f 72 64 65 64 20 61 73 0a 2a 2a 20 66  recorded as.** f
2510: 6f 6c 6c 6f 77 73 2e 20 20 28 4c 45 4d 4f 4e 20  ollows.  (LEMON 
2520: 75 73 65 73 20 6e 6f 20 67 6c 6f 62 61 6c 20 76  uses no global v
2530: 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6d 61 6b  ariables and mak
2540: 65 73 20 6c 69 74 74 6c 65 20 75 73 65 20 6f 66  es little use of
2550: 0a 2a 2a 20 73 74 61 74 69 63 20 76 61 72 69 61  .** static varia
2560: 62 6c 65 73 2e 20 20 46 69 65 6c 64 73 20 69 6e  bles.  Fields in
2570: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2580: 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20  tructure can be 
2590: 74 68 6f 75 67 68 74 0a 2a 2a 20 6f 66 20 61 73  thought.** of as
25a0: 20 62 65 67 69 6e 20 67 6c 6f 62 61 6c 20 76 61   begin global va
25b0: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70  riables in the p
25c0: 72 6f 67 72 61 6d 2e 29 20 2a 2f 0a 73 74 72 75  rogram.) */.stru
25d0: 63 74 20 6c 65 6d 6f 6e 20 7b 0a 20 20 73 74 72  ct lemon {.  str
25e0: 75 63 74 20 73 74 61 74 65 20 2a 2a 73 6f 72 74  uct state **sort
25f0: 65 64 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f  ed;   /* Table o
2600: 66 20 73 74 61 74 65 73 20 73 6f 72 74 65 64 20  f states sorted 
2610: 62 79 20 73 74 61 74 65 20 6e 75 6d 62 65 72 20  by state number 
2620: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
2630: 20 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a   *rule;       /*
2640: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 72 75 6c   List of all rul
2650: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 74 61  es */.  int nsta
2660: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
2670: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 74   /* Number of st
2680: 61 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 72  ates */.  int nr
2690: 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ule;            
26a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26b0: 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  rules */.  int n
26c0: 73 79 6d 62 6f 6c 3b 20 20 20 20 20 20 20 20 20  symbol;         
26d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
26e0: 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f   terminal and no
26f0: 6e 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c  nterminal symbol
2700: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 74 65 72 6d  s */.  int nterm
2710: 69 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  inal;           
2720: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
2730: 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f  minal symbols */
2740: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
2750: 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20 2f 2a 20 53   **symbols; /* S
2760: 6f 72 74 65 64 20 61 72 72 61 79 20 6f 66 20 70  orted array of p
2770: 6f 69 6e 74 65 72 73 20 74 6f 20 73 79 6d 62 6f  ointers to symbo
2780: 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f  ls */.  int erro
2790: 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rcnt;           
27a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
27b0: 72 6f 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  rors */.  struct
27c0: 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b   symbol *errsym;
27d0: 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20     /* The error 
27e0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75  symbol */.  stru
27f0: 63 74 20 73 79 6d 62 6f 6c 20 2a 77 69 6c 64 63  ct symbol *wildc
2800: 61 72 64 3b 20 2f 2a 20 54 6f 6b 65 6e 20 74 68  ard; /* Token th
2810: 61 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68  at matches anyth
2820: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e  ing */.  char *n
2830: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
2840: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2850: 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
2860: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67  r */.  char *arg
2870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2880: 2f 2a 20 44 65 63 6c 61 72 61 74 69 6f 6e 20 6f  /* Declaration o
2890: 66 20 74 68 65 20 33 74 68 20 61 72 67 75 6d 65  f the 3th argume
28a0: 6e 74 20 74 6f 20 70 61 72 73 65 72 20 2a 2f 0a  nt to parser */.
28b0: 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 74 79 70    char *tokentyp
28c0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79  e;         /* Ty
28d0: 70 65 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73  pe of terminal s
28e0: 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 70 61  ymbols in the pa
28f0: 72 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20  rser stack */.  
2900: 63 68 61 72 20 2a 76 61 72 74 79 70 65 3b 20 20  char *vartype;  
2910: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2920: 64 65 66 61 75 6c 74 20 74 79 70 65 20 6f 66 20  default type of 
2930: 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 73 79 6d  non-terminal sym
2940: 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  bols */.  char *
2950: 73 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20  start;          
2960: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2970: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 66  e start symbol f
2980: 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  or the grammar *
2990: 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 63 6b 73  /.  char *stacks
29a0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ize;         /* 
29b0: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73  Size of the pars
29c0: 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68  er stack */.  ch
29d0: 61 72 20 2a 69 6e 63 6c 75 64 65 3b 20 20 20 20  ar *include;    
29e0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
29f0: 6f 20 70 75 74 20 61 74 20 74 68 65 20 73 74 61  o put at the sta
2a00: 72 74 20 6f 66 20 74 68 65 20 43 20 66 69 6c 65  rt of the C file
2a10: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 72 72 6f   */.  char *erro
2a20: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
2a30: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
2a40: 65 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20  e when an error 
2a50: 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 63 68 61  is seen */.  cha
2a60: 72 20 2a 6f 76 65 72 66 6c 6f 77 3b 20 20 20 20  r *overflow;    
2a70: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
2a80: 20 65 78 65 63 75 74 65 20 6f 6e 20 61 20 73 74   execute on a st
2a90: 61 63 6b 20 6f 76 65 72 66 6c 6f 77 20 2a 2f 0a  ack overflow */.
2aa0: 20 20 63 68 61 72 20 2a 66 61 69 6c 75 72 65 3b    char *failure;
2ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2ac0: 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e  de to execute on
2ad0: 20 70 61 72 73 65 72 20 66 61 69 6c 75 72 65 20   parser failure 
2ae0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 63 63 65 70  */.  char *accep
2af0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
2b00: 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65   Code to execute
2b10: 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   when the parser
2b20: 20 65 78 63 65 70 74 73 20 2a 2f 0a 20 20 63 68   excepts */.  ch
2b30: 61 72 20 2a 65 78 74 72 61 63 6f 64 65 3b 20 20  ar *extracode;  
2b40: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 61         /* Code a
2b50: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 67  ppended to the g
2b60: 65 6e 65 72 61 74 65 64 20 66 69 6c 65 20 2a 2f  enerated file */
2b70: 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 64 65  .  char *tokende
2b80: 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  st;         /* C
2b90: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 74  ode to execute t
2ba0: 6f 20 64 65 73 74 72 6f 79 20 74 6f 6b 65 6e 20  o destroy token 
2bb0: 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a  data */.  char *
2bc0: 76 61 72 64 65 73 74 3b 20 20 20 20 20 20 20 20  vardest;        
2bd0: 20 20 20 2f 2a 20 43 6f 64 65 20 66 6f 72 20 74     /* Code for t
2be0: 68 65 20 64 65 66 61 75 6c 74 20 6e 6f 6e 2d 74  he default non-t
2bf0: 65 72 6d 69 6e 61 6c 20 64 65 73 74 72 75 63 74  erminal destruct
2c00: 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69  or */.  char *fi
2c10: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
2c20: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2c30: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
2c40: 63 68 61 72 20 2a 6f 75 74 6e 61 6d 65 3b 20 20  char *outname;  
2c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2c60: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2c70: 6f 75 74 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20  output file */. 
2c80: 20 63 68 61 72 20 2a 74 6f 6b 65 6e 70 72 65 66   char *tokenpref
2c90: 69 78 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 70  ix;       /* A p
2ca0: 72 65 66 69 78 20 61 64 64 65 64 20 74 6f 20 74  refix added to t
2cb0: 6f 6b 65 6e 20 6e 61 6d 65 73 20 69 6e 20 74 68  oken names in th
2cc0: 65 20 2e 68 20 66 69 6c 65 20 2a 2f 0a 20 20 69  e .h file */.  i
2cd0: 6e 74 20 6e 63 6f 6e 66 6c 69 63 74 3b 20 20 20  nt nconflict;   
2ce0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2cf0: 72 20 6f 66 20 70 61 72 73 69 6e 67 20 63 6f 6e  r of parsing con
2d00: 66 6c 69 63 74 73 20 2a 2f 0a 20 20 69 6e 74 20  flicts */.  int 
2d10: 74 61 62 6c 65 73 69 7a 65 3b 20 20 20 20 20 20  tablesize;      
2d20: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2d30: 74 68 65 20 70 61 72 73 65 20 74 61 62 6c 65 73  the parse tables
2d40: 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 69 73 66   */.  int basisf
2d50: 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f  lag;           /
2d60: 2a 20 50 72 69 6e 74 20 6f 6e 6c 79 20 62 61 73  * Print only bas
2d70: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
2d80: 73 20 2a 2f 0a 20 20 69 6e 74 20 68 61 73 5f 66  s */.  int has_f
2d90: 61 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  allback;        
2da0: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 25  /* True if any %
2db0: 66 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 65 6e  fallback is seen
2dc0: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
2dd0: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e  */.  int nolinen
2de0: 6f 73 66 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  osflag;       /*
2df0: 20 54 72 75 65 20 69 66 20 23 6c 69 6e 65 20 73   True if #line s
2e00: 74 61 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64  tatements should
2e10: 20 6e 6f 74 20 62 65 20 70 72 69 6e 74 65 64 20   not be printed 
2e20: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 76 30  */.  char *argv0
2e30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2e40: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f   Name of the pro
2e50: 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  gram */.};..#def
2e60: 69 6e 65 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28  ine MemoryCheck(
2e70: 58 29 20 69 66 28 28 58 29 3d 3d 30 29 7b 20 5c  X) if((X)==0){ \
2e80: 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d  .  extern void m
2e90: 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c  emory_error(); \
2ea0: 0a 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  .  memory_error(
2eb0: 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ); \.}../*******
2ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
2ed0: 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 68  he file "table.h
2ee0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
2ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f00: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63  ***/./*.** All c
2f10: 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ode in this file
2f20: 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61   has been automa
2f30: 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
2f40: 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63  d.** from a spec
2f50: 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65  ification in the
2f60: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20   file.**        
2f70: 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a        "table.q".
2f80: 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63 69  ** by the associ
2f90: 61 74 69 76 65 20 61 72 72 61 79 20 63 6f 64 65  ative array code
2fa0: 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61   building progra
2fb0: 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f  m "aagen"..** Do
2fc0: 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20 66   not edit this f
2fd0: 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65  ile!  Instead, e
2fe0: 64 69 74 20 74 68 65 20 73 70 65 63 69 66 69 63  dit the specific
2ff0: 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74  ation.** file, t
3000: 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e  hen rerun aagen.
3010: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66  .*/./*.** Code f
3020: 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61  or processing ta
3030: 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  bles in the LEMO
3040: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
3050: 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52 6f 75 74 69  or..*/../* Routi
3060: 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67  nes for handling
3070: 20 61 20 73 74 72 69 6e 67 73 20 2a 2f 0a 0a 63   a strings */..c
3080: 68 61 72 20 2a 53 74 72 73 61 66 65 28 29 3b 0a  har *Strsafe();.
3090: 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e  .void Strsafe_in
30a0: 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a  it(/* void */);.
30b0: 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65  int Strsafe_inse
30c0: 72 74 28 2f 2a 20 63 68 61 72 20 2a 20 2a 2f 29  rt(/* char * */)
30d0: 3b 0a 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f  ;.char *Strsafe_
30e0: 66 69 6e 64 28 2f 2a 20 63 68 61 72 20 2a 20 2a  find(/* char * *
30f0: 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73  /);../* Routines
3100: 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 73 79   for handling sy
3110: 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72 61  mbols of the gra
3120: 6d 6d 61 72 20 2a 2f 0a 0a 73 74 72 75 63 74 20  mmar */..struct 
3130: 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e  symbol *Symbol_n
3140: 65 77 28 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c  ew();.int Symbol
3150: 63 6d 70 70 28 2f 2a 20 73 74 72 75 63 74 20 73  cmpp(/* struct s
3160: 79 6d 62 6f 6c 20 2a 2a 2c 20 73 74 72 75 63 74  ymbol **, struct
3170: 20 73 79 6d 62 6f 6c 20 2a 2a 20 2a 2f 29 3b 0a   symbol ** */);.
3180: 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74  void Symbol_init
3190: 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e  (/* void */);.in
31a0: 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28  t Symbol_insert(
31b0: 2f 2a 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  /* struct symbol
31c0: 20 2a 2c 20 63 68 61 72 20 2a 20 2a 2f 29 3b 0a   *, char * */);.
31d0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
31e0: 79 6d 62 6f 6c 5f 66 69 6e 64 28 2f 2a 20 63 68  ymbol_find(/* ch
31f0: 61 72 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74  ar * */);.struct
3200: 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
3210: 4e 74 68 28 2f 2a 20 69 6e 74 20 2a 2f 29 3b 0a  Nth(/* int */);.
3220: 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74  int Symbol_count
3230: 28 2f 2a 20 20 2a 2f 29 3b 0a 73 74 72 75 63 74  (/*  */);.struct
3240: 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c   symbol **Symbol
3250: 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20 2a 2f 29  _arrayof(/*  */)
3260: 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 74  ;../* Routines t
3270: 6f 20 6d 61 6e 61 67 65 20 74 68 65 20 73 74 61  o manage the sta
3280: 74 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 69 6e 74  te table */..int
3290: 20 43 6f 6e 66 69 67 63 6d 70 28 2f 2a 20 73 74   Configcmp(/* st
32a0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2c 20 73  ruct config *, s
32b0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a  truct config * *
32c0: 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65  /);.struct state
32d0: 20 2a 53 74 61 74 65 5f 6e 65 77 28 29 3b 0a 76   *State_new();.v
32e0: 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28 2f  oid State_init(/
32f0: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74 20  * void */);.int 
3300: 53 74 61 74 65 5f 69 6e 73 65 72 74 28 2f 2a 20  State_insert(/* 
3310: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2c 20  struct state *, 
3320: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
3330: 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74  */);.struct stat
3340: 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 2f 2a  e *State_find(/*
3350: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
3360: 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61   */);.struct sta
3370: 74 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79  te **State_array
3380: 6f 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20  of(/*  */);../* 
3390: 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 66 6f  Routines used fo
33a0: 72 20 65 66 66 69 63 69 65 6e 63 79 20 69 6e 20  r efficiency in 
33b0: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 20 2a  Configlist_add *
33c0: 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  /..void Configta
33d0: 62 6c 65 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64  ble_init(/* void
33e0: 20 2a 2f 29 3b 0a 69 6e 74 20 43 6f 6e 66 69 67   */);.int Config
33f0: 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 2f 2a 20  table_insert(/* 
3400: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
3410: 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  */);.struct conf
3420: 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f  ig *Configtable_
3430: 66 69 6e 64 28 2f 2a 20 73 74 72 75 63 74 20 63  find(/* struct c
3440: 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 76 6f 69  onfig * */);.voi
3450: 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c  d Configtable_cl
3460: 65 61 72 28 2f 2a 20 69 6e 74 28 2a 29 28 73 74  ear(/* int(*)(st
3470: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 2a  ruct config *) *
3480: 2f 29 3b 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /);./***********
3490: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
34a0: 20 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e 63 22   file "action.c"
34b0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
34c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34d0: 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  /./*.** Routines
34e0: 20 70 72 6f 63 65 73 73 69 6e 67 20 70 61 72 73   processing pars
34f0: 65 72 20 61 63 74 69 6f 6e 73 20 69 6e 20 74 68  er actions in th
3500: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
3510: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
3520: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
3530: 70 61 72 73 65 72 20 61 63 74 69 6f 6e 20 2a 2f  parser action */
3540: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
3550: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65  ction *Action_ne
3560: 77 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  w(void){.  stati
3570: 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  c struct action 
3580: 2a 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 20  *freelist = 0;. 
3590: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
35a0: 6e 65 77 3b 0a 0a 20 20 69 66 28 20 66 72 65 65  new;..  if( free
35b0: 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  list==0 ){.    i
35c0: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d  nt i;.    int am
35d0: 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 66 72 65  t = 100;.    fre
35e0: 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20  elist = (struct 
35f0: 61 63 74 69 6f 6e 20 2a 29 63 61 6c 6c 6f 63 28  action *)calloc(
3600: 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  amt, sizeof(stru
3610: 63 74 20 61 63 74 69 6f 6e 29 29 3b 0a 20 20 20  ct action));.   
3620: 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30   if( freelist==0
3630: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
3640: 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65  f(stderr,"Unable
3650: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
3660: 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 70 61  ory for a new pa
3670: 72 73 65 72 20 61 63 74 69 6f 6e 2e 22 29 3b 0a  rser action.");.
3680: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
3690: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
36a0: 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20  ; i<amt-1; i++) 
36b0: 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74  freelist[i].next
36c0: 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31   = &freelist[i+1
36d0: 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b  ];.    freelist[
36e0: 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b  amt-1].next = 0;
36f0: 0a 20 20 7d 0a 20 20 6e 65 77 20 3d 20 66 72 65  .  }.  new = fre
3700: 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73  elist;.  freelis
3710: 74 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65  t = freelist->ne
3720: 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77  xt;.  return new
3730: 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20  ;.}../* Compare 
3740: 74 77 6f 20 61 63 74 69 6f 6e 73 20 66 6f 72 20  two actions for 
3750: 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
3760: 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
3770: 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20  ve, zero, or.** 
3780: 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
3790: 66 69 72 73 74 20 61 63 74 69 6f 6e 20 69 73 20  first action is 
37a0: 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
37b0: 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
37c0: 74 68 61 6e 0a 2a 2a 20 74 68 65 20 66 69 72 73  than.** the firs
37d0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t.*/.static int 
37e0: 61 63 74 69 6f 6e 63 6d 70 28 0a 20 20 73 74 72  actioncmp(.  str
37f0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 31 2c  uct action *ap1,
3800: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
3810: 20 2a 61 70 32 0a 29 7b 0a 20 20 69 6e 74 20 72   *ap2.){.  int r
3820: 63 3b 0a 20 20 72 63 20 3d 20 61 70 31 2d 3e 73  c;.  rc = ap1->s
3830: 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e  p->index - ap2->
3840: 73 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28  sp->index;.  if(
3850: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   rc==0 ){.    rc
3860: 20 3d 20 28 69 6e 74 29 61 70 31 2d 3e 74 79 70   = (int)ap1->typ
3870: 65 20 2d 20 28 69 6e 74 29 61 70 32 2d 3e 74 79  e - (int)ap2->ty
3880: 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  pe;.  }.  if( rc
3890: 3d 3d 30 20 26 26 20 61 70 31 2d 3e 74 79 70 65  ==0 && ap1->type
38a0: 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  ==REDUCE ){.    
38b0: 72 63 20 3d 20 61 70 31 2d 3e 78 2e 72 70 2d 3e  rc = ap1->x.rp->
38c0: 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e 78 2e 72  index - ap2->x.r
38d0: 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  p->index;.  }.  
38e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
38f0: 20 53 6f 72 74 20 70 61 72 73 65 72 20 61 63 74   Sort parser act
3900: 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73  ions */.static s
3910: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41 63  truct action *Ac
3920: 74 69 6f 6e 5f 73 6f 72 74 28 0a 20 20 73 74 72  tion_sort(.  str
3930: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 0a 29  uct action *ap.)
3940: 7b 0a 20 20 61 70 20 3d 20 28 73 74 72 75 63 74  {.  ap = (struct
3950: 20 61 63 74 69 6f 6e 20 2a 29 6d 73 6f 72 74 28   action *)msort(
3960: 28 63 68 61 72 20 2a 29 61 70 2c 28 63 68 61 72  (char *)ap,(char
3970: 20 2a 2a 29 26 61 70 2d 3e 6e 65 78 74 2c 0a 20   **)&ap->next,. 
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
39a0: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
39b0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 63  ,const char*))ac
39c0: 74 69 6f 6e 63 6d 70 29 3b 0a 20 20 72 65 74 75  tioncmp);.  retu
39d0: 72 6e 20 61 70 3b 0a 7d 0a 0a 76 6f 69 64 20 41  rn ap;.}..void A
39e0: 63 74 69 6f 6e 5f 61 64 64 28 61 70 70 2c 74 79  ction_add(app,ty
39f0: 70 65 2c 73 70 2c 61 72 67 29 0a 73 74 72 75 63  pe,sp,arg).struc
3a00: 74 20 61 63 74 69 6f 6e 20 2a 2a 61 70 70 3b 0a  t action **app;.
3a10: 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79  enum e_action ty
3a20: 70 65 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  pe;.struct symbo
3a30: 6c 20 2a 73 70 3b 0a 63 68 61 72 20 2a 61 72 67  l *sp;.char *arg
3a40: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 61 63 74  ;.{.  struct act
3a50: 69 6f 6e 20 2a 6e 65 77 3b 0a 20 20 6e 65 77 20  ion *new;.  new 
3a60: 3d 20 41 63 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a  = Action_new();.
3a70: 20 20 6e 65 77 2d 3e 6e 65 78 74 20 3d 20 2a 61    new->next = *a
3a80: 70 70 3b 0a 20 20 2a 61 70 70 20 3d 20 6e 65 77  pp;.  *app = new
3a90: 3b 0a 20 20 6e 65 77 2d 3e 74 79 70 65 20 3d 20  ;.  new->type = 
3aa0: 74 79 70 65 3b 0a 20 20 6e 65 77 2d 3e 73 70 20  type;.  new->sp 
3ab0: 3d 20 73 70 3b 0a 20 20 69 66 28 20 74 79 70 65  = sp;.  if( type
3ac0: 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 6e  ==SHIFT ){.    n
3ad0: 65 77 2d 3e 78 2e 73 74 70 20 3d 20 28 73 74 72  ew->x.stp = (str
3ae0: 75 63 74 20 73 74 61 74 65 20 2a 29 61 72 67 3b  uct state *)arg;
3af0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 65  .  }else{.    ne
3b00: 77 2d 3e 78 2e 72 70 20 3d 20 28 73 74 72 75 63  w->x.rp = (struc
3b10: 74 20 72 75 6c 65 20 2a 29 61 72 67 3b 0a 20 20  t rule *)arg;.  
3b20: 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}./***********
3b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 65 77 20  *********** New 
3b40: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
3b50: 74 20 74 68 65 20 22 61 63 74 74 61 62 22 20 6d  t the "acttab" m
3b60: 6f 64 75 6c 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  odule **********
3b70: 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f  */./*.** This mo
3b80: 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  dule implements 
3b90: 72 6f 75 74 69 6e 65 73 20 75 73 65 20 74 6f 20  routines use to 
3ba0: 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 79 79  construct the yy
3bb0: 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e  _action[] table.
3bc0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .*/../*.** The s
3bd0: 74 61 74 65 20 6f 66 20 74 68 65 20 79 79 5f 61  tate of the yy_a
3be0: 63 74 69 6f 6e 20 74 61 62 6c 65 20 75 6e 64 65  ction table unde
3bf0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
3c00: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
3c10: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
3c20: 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 74  g structure.*/.t
3c30: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61 63  ypedef struct ac
3c40: 74 74 61 62 20 61 63 74 74 61 62 3b 0a 73 74 72  ttab acttab;.str
3c50: 75 63 74 20 61 63 74 74 61 62 20 7b 0a 20 20 69  uct acttab {.  i
3c60: 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20  nt nAction;     
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3c80: 75 6d 62 65 72 20 6f 66 20 75 73 65 64 20 73 6c  umber of used sl
3c90: 6f 74 73 20 69 6e 20 61 41 63 74 69 6f 6e 5b 5d  ots in aAction[]
3ca0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f   */.  int nActio
3cb0: 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  nAlloc;         
3cc0: 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f     /* Slots allo
3cd0: 63 61 74 65 64 20 66 6f 72 20 61 41 63 74 69 6f  cated for aActio
3ce0: 6e 5b 5d 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  n[] */.  struct 
3cf0: 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 6f 6b 61 68  {.    int lookah
3d00: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
3d10: 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65   /* Value of the
3d20: 20 6c 6f 6f 6b 61 68 65 61 64 20 74 6f 6b 65 6e   lookahead token
3d30: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 63 74 69   */.    int acti
3d40: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
3d50: 20 20 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20     /* Action to 
3d60: 74 61 6b 65 20 6f 6e 20 74 68 65 20 67 69 76 65  take on the give
3d70: 6e 20 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20  n lookahead */. 
3d80: 20 7d 20 2a 61 41 63 74 69 6f 6e 2c 20 20 20 20   } *aAction,    
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3da0: 20 54 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   The yy_action[]
3db0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
3dc0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  struction */.   
3dd0: 20 2a 61 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20   *aLookahead;   
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
3df0: 20 73 69 6e 67 6c 65 20 6e 65 77 20 74 72 61 6e   single new tran
3e00: 73 61 63 74 69 6f 6e 20 73 65 74 20 2a 2f 0a 20  saction set */. 
3e10: 20 69 6e 74 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64   int mnLookahead
3e20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3e30: 20 4d 69 6e 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68   Minimum aLookah
3e40: 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20  ead[].lookahead 
3e50: 2a 2f 0a 20 20 69 6e 74 20 6d 6e 41 63 74 69 6f  */.  int mnActio
3e60: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3e70: 20 20 2f 2a 20 41 63 74 69 6f 6e 20 61 73 73 6f    /* Action asso
3e80: 63 69 61 74 65 64 20 77 69 74 68 20 6d 6e 4c 6f  ciated with mnLo
3e90: 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74  okahead */.  int
3ea0: 20 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20   mxLookahead;   
3eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
3ec0: 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b  imum aLookahead[
3ed0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20  ].lookahead */. 
3ee0: 20 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 3b   int nLookahead;
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3f00: 20 55 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61   Used slots in a
3f10: 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 20  Lookahead[] */. 
3f20: 20 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 41   int nLookaheadA
3f30: 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  lloc;         /*
3f40: 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64   Slots allocated
3f50: 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d   in aLookahead[]
3f60: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65 74 75 72   */.};../* Retur
3f70: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
3f80: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 79  entries in the y
3f90: 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a  y_action table *
3fa0: 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61 62  /.#define acttab
3fb0: 5f 73 69 7a 65 28 58 29 20 28 28 58 29 2d 3e 6e  _size(X) ((X)->n
3fc0: 41 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20  Action)../* The 
3fd0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d  value for the N-
3fe0: 74 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 61  th entry in yy_a
3ff0: 63 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  ction */.#define
4000: 20 61 63 74 74 61 62 5f 79 79 61 63 74 69 6f 6e   acttab_yyaction
4010: 28 58 2c 4e 29 20 20 28 28 58 29 2d 3e 61 41 63  (X,N)  ((X)->aAc
4020: 74 69 6f 6e 5b 4e 5d 2e 61 63 74 69 6f 6e 29 0a  tion[N].action).
4030: 0a 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f  ./* The value fo
4040: 72 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79  r the N-th entry
4050: 20 69 6e 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64   in yy_lookahead
4060: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74   */.#define actt
4070: 61 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28 58  ab_yylookahead(X
4080: 2c 4e 29 20 20 28 28 58 29 2d 3e 61 41 63 74 69  ,N)  ((X)->aActi
4090: 6f 6e 5b 4e 5d 2e 6c 6f 6f 6b 61 68 65 61 64 29  on[N].lookahead)
40a0: 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65  ../* Free all me
40b0: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
40c0: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61  with the given a
40d0: 63 74 74 61 62 20 2a 2f 0a 76 6f 69 64 20 61 63  cttab */.void ac
40e0: 74 74 61 62 5f 66 72 65 65 28 61 63 74 74 61 62  ttab_free(acttab
40f0: 20 2a 70 29 7b 0a 20 20 66 72 65 65 28 20 70 2d   *p){.  free( p-
4100: 3e 61 41 63 74 69 6f 6e 20 29 3b 0a 20 20 66 72  >aAction );.  fr
4110: 65 65 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  ee( p->aLookahea
4120: 64 20 29 3b 0a 20 20 66 72 65 65 28 20 70 20 29  d );.  free( p )
4130: 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;.}../* Allocate
4140: 20 61 20 6e 65 77 20 61 63 74 74 61 62 20 73 74   a new acttab st
4150: 72 75 63 74 75 72 65 20 2a 2f 0a 61 63 74 74 61  ructure */.actta
4160: 62 20 2a 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28  b *acttab_alloc(
4170: 76 6f 69 64 29 7b 0a 20 20 61 63 74 74 61 62 20  void){.  acttab 
4180: 2a 70 20 3d 20 63 61 6c 6c 6f 63 28 20 31 2c 20  *p = calloc( 1, 
4190: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
41a0: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
41b0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
41c0: 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  Unable to alloca
41d0: 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20  te memory for a 
41e0: 6e 65 77 20 61 63 74 74 61 62 2e 22 29 3b 0a 20  new acttab.");. 
41f0: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
4200: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
4210: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 72 65  izeof(*p));.  re
4220: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 20 41 64  turn p;.}../* Ad
4230: 64 20 61 20 6e 65 77 20 61 63 74 69 6f 6e 20 74  d a new action t
4240: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  o the current tr
4250: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 0a 2a 2f  ansaction set.*/
4260: 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 61 63 74  .void acttab_act
4270: 69 6f 6e 28 61 63 74 74 61 62 20 2a 70 2c 20 69  ion(acttab *p, i
4280: 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 2c 20 69 6e  nt lookahead, in
4290: 74 20 61 63 74 69 6f 6e 29 7b 0a 20 20 69 66 28  t action){.  if(
42a0: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 3d   p->nLookahead>=
42b0: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c  p->nLookaheadAll
42c0: 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 6f  oc ){.    p->nLo
42d0: 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 2b 3d 20  okaheadAlloc += 
42e0: 32 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 6f 6f 6b  25;.    p->aLook
42f0: 61 68 65 61 64 20 3d 20 72 65 61 6c 6c 6f 63 28  ahead = realloc(
4300: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 2c 0a   p->aLookahead,.
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
4330: 65 6f 66 28 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  eof(p->aLookahea
4340: 64 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f 6b 61 68  d[0])*p->nLookah
4350: 65 61 64 41 6c 6c 6f 63 20 29 3b 0a 20 20 20 20  eadAlloc );.    
4360: 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  if( p->aLookahea
4370: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  d==0 ){.      fp
4380: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61  rintf(stderr,"ma
4390: 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b  lloc failed\n");
43a0: 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
43b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
43c0: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30  p->nLookahead==0
43d0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6d 78 4c 6f 6f   ){.    p->mxLoo
43e0: 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65  kahead = lookahe
43f0: 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f  ad;.    p->mnLoo
4400: 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65  kahead = lookahe
4410: 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 41 63 74  ad;.    p->mnAct
4420: 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20  ion = action;.  
4430: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
4440: 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 3c 6c 6f  ->mxLookahead<lo
4450: 6f 6b 61 68 65 61 64 20 29 20 70 2d 3e 6d 78 4c  okahead ) p->mxL
4460: 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61  ookahead = looka
4470: 68 65 61 64 3b 0a 20 20 20 20 69 66 28 20 70 2d  head;.    if( p-
4480: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3e 6c 6f 6f  >mnLookahead>loo
4490: 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20  kahead ){.      
44a0: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d  p->mnLookahead =
44b0: 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20   lookahead;.    
44c0: 20 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20    p->mnAction = 
44d0: 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20  action;.    }.  
44e0: 7d 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  }.  p->aLookahea
44f0: 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d  d[p->nLookahead]
4500: 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f  .lookahead = loo
4510: 6b 61 68 65 61 64 3b 0a 20 20 70 2d 3e 61 4c 6f  kahead;.  p->aLo
4520: 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b  okahead[p->nLook
4530: 61 68 65 61 64 5d 2e 61 63 74 69 6f 6e 20 3d 20  ahead].action = 
4540: 61 63 74 69 6f 6e 3b 0a 20 20 70 2d 3e 6e 4c 6f  action;.  p->nLo
4550: 6f 6b 61 68 65 61 64 2b 2b 3b 0a 7d 0a 0a 2f 2a  okahead++;.}../*
4560: 0a 2a 2a 20 41 64 64 20 74 68 65 20 74 72 61 6e  .** Add the tran
4570: 73 61 63 74 69 6f 6e 20 73 65 74 20 62 75 69 6c  saction set buil
4580: 74 20 75 70 20 77 69 74 68 20 70 72 69 6f 72 20  t up with prior 
4590: 63 61 6c 6c 73 20 74 6f 20 61 63 74 74 61 62 5f  calls to acttab_
45a0: 61 63 74 69 6f 6e 28 29 0a 2a 2a 20 69 6e 74 6f  action().** into
45b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 63 74   the current act
45c0: 69 6f 6e 20 74 61 62 6c 65 2e 20 20 54 68 65 6e  ion table.  Then
45d0: 20 72 65 73 65 74 20 74 68 65 20 74 72 61 6e 73   reset the trans
45e0: 61 63 74 69 6f 6e 20 73 65 74 20 62 61 63 6b 0a  action set back.
45f0: 2a 2a 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 73  ** to an empty s
4600: 65 74 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  et in preparatio
4610: 6e 20 66 6f 72 20 61 20 6e 65 77 20 72 6f 75 6e  n for a new roun
4620: 64 20 6f 66 20 61 63 74 74 61 62 5f 61 63 74 69  d of acttab_acti
4630: 6f 6e 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  on() calls..**.*
4640: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
4650: 73 65 74 20 69 6e 74 6f 20 74 68 65 20 61 63 74  set into the act
4660: 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65  ion table of the
4670: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
4680: 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74 74 61 62 5f  ..*/.int acttab_
4690: 69 6e 73 65 72 74 28 61 63 74 74 61 62 20 2a 70  insert(acttab *p
46a0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  ){.  int i, j, k
46b0: 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  , n;.  assert( p
46c0: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 30 20 29  ->nLookahead>0 )
46d0: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
46e0: 65 20 77 65 20 68 61 76 65 20 65 6e 6f 75 67 68  e we have enough
46f0: 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   space to hold t
4700: 68 65 20 65 78 70 61 6e 64 65 64 20 61 63 74 69  he expanded acti
4710: 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  on table.  ** in
4720: 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e   the worst case.
4730: 20 20 54 68 65 20 77 6f 72 73 74 20 63 61 73 65    The worst case
4740: 20 6f 63 63 75 72 73 20 69 66 20 74 68 65 20 74   occurs if the t
4750: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 0a 20  ransaction set. 
4760: 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 70 70 65   ** must be appe
4770: 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72  nded to the curr
4780: 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ent action table
4790: 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 70 2d 3e 6d  .  */.  n = p->m
47a0: 78 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 31 3b 0a  xLookahead + 1;.
47b0: 20 20 69 66 28 20 70 2d 3e 6e 41 63 74 69 6f 6e    if( p->nAction
47c0: 20 2b 20 6e 20 3e 3d 20 70 2d 3e 6e 41 63 74 69   + n >= p->nActi
47d0: 6f 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69  onAlloc ){.    i
47e0: 6e 74 20 6f 6c 64 41 6c 6c 6f 63 20 3d 20 70 2d  nt oldAlloc = p-
47f0: 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 0a 20  >nActionAlloc;. 
4800: 20 20 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c     p->nActionAll
4810: 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 20  oc = p->nAction 
4820: 2b 20 6e 20 2b 20 70 2d 3e 6e 41 63 74 69 6f 6e  + n + p->nAction
4830: 41 6c 6c 6f 63 20 2b 20 32 30 3b 0a 20 20 20 20  Alloc + 20;.    
4840: 70 2d 3e 61 41 63 74 69 6f 6e 20 3d 20 72 65 61  p->aAction = rea
4850: 6c 6c 6f 63 28 20 70 2d 3e 61 41 63 74 69 6f 6e  lloc( p->aAction
4860: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4870: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
4880: 6f 66 28 70 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d  of(p->aAction[0]
4890: 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  )*p->nActionAllo
48a0: 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  c);.    if( p->a
48b0: 41 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20  Action==0 ){.   
48c0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
48d0: 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  r,"malloc failed
48e0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74  \n");.      exit
48f0: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  (1);.    }.    f
4900: 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63 3b 20 69  or(i=oldAlloc; i
4910: 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63  <p->nActionAlloc
4920: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; i++){.      p-
4930: 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b  >aAction[i].look
4940: 61 68 65 61 64 20 3d 20 2d 31 3b 0a 20 20 20 20  ahead = -1;.    
4950: 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e    p->aAction[i].
4960: 61 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a 20 20 20  action = -1;.   
4970: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61   }.  }..  /* Sca
4980: 6e 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 61  n the existing a
4990: 63 74 69 6f 6e 20 74 61 62 6c 65 20 6c 6f 6f 6b  ction table look
49a0: 69 6e 67 20 66 6f 72 20 61 6e 20 6f 66 66 73 65  ing for an offse
49b0: 74 20 77 68 65 72 65 20 77 65 20 63 61 6e 0a 20  t where we can. 
49c0: 20 2a 2a 20 69 6e 73 65 72 74 20 74 68 65 20 63   ** insert the c
49d0: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
49e0: 6f 6e 20 73 65 74 2e 20 20 46 61 6c 6c 20 6f 75  on set.  Fall ou
49f0: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 68  t of the loop wh
4a00: 65 6e 20 74 68 61 74 0a 20 20 2a 2a 20 6f 66 66  en that.  ** off
4a10: 73 65 74 20 69 73 20 66 6f 75 6e 64 2e 20 20 49  set is found.  I
4a20: 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65  n the worst case
4a30: 2c 20 77 65 20 66 61 6c 6c 20 6f 75 74 20 6f 66  , we fall out of
4a40: 20 74 68 65 20 6c 6f 6f 70 20 77 68 65 6e 0a 20   the loop when. 
4a50: 20 2a 2a 20 69 20 72 65 61 63 68 65 73 20 70 2d   ** i reaches p-
4a60: 3e 6e 41 63 74 69 6f 6e 2c 20 77 68 69 63 68 20  >nAction, which 
4a70: 6d 65 61 6e 73 20 77 65 20 61 70 70 65 6e 64 20  means we append 
4a80: 74 68 65 20 6e 65 77 20 74 72 61 6e 73 61 63 74  the new transact
4a90: 69 6f 6e 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20  ion set..  **.  
4aa0: 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65  ** i is the inde
4ab0: 78 20 69 6e 20 70 2d 3e 61 41 63 74 69 6f 6e 5b  x in p->aAction[
4ac0: 5d 20 77 68 65 72 65 20 70 2d 3e 6d 6e 4c 6f 6f  ] where p->mnLoo
4ad0: 6b 61 68 65 61 64 20 69 73 20 69 6e 73 65 72 74  kahead is insert
4ae0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ed..  */.  for(i
4af0: 3d 30 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e  =0; i<p->nAction
4b00: 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b  +p->mnLookahead;
4b10: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
4b20: 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f  ->aAction[i].loo
4b30: 6b 61 68 65 61 64 3c 30 20 29 7b 0a 20 20 20 20  kahead<0 ){.    
4b40: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
4b50: 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29  nLookahead; j++)
4b60: 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 70 2d  {.        k = p-
4b70: 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c  >aLookahead[j].l
4b80: 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e  ookahead - p->mn
4b90: 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20  Lookahead + i;. 
4ba0: 20 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20 29         if( k<0 )
4bb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4bc0: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b  if( p->aAction[k
4bd0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e 3d 30 20 29  ].lookahead>=0 )
4be0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4bf0: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e        if( j<p->n
4c00: 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74  Lookahead ) cont
4c10: 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
4c20: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f  j=0; j<p->nActio
4c30: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
4c40: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
4c50: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b  j].lookahead==j+
4c60: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69  p->mnLookahead-i
4c70: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
4c80: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70  }.      if( j==p
4c90: 2d 3e 6e 41 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ->nAction ){.   
4ca0: 20 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20       break;  /* 
4cb0: 46 69 74 73 20 69 6e 20 65 6d 70 74 79 20 73 6c  Fits in empty sl
4cc0: 6f 74 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ots */.      }. 
4cd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
4ce0: 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61  aAction[i].looka
4cf0: 68 65 61 64 3d 3d 70 2d 3e 6d 6e 4c 6f 6f 6b 61  head==p->mnLooka
4d00: 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 69 66  head ){.      if
4d10: 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e  ( p->aAction[i].
4d20: 61 63 74 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63 74  action!=p->mnAct
4d30: 69 6f 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ion ) continue;.
4d40: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
4d50: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  <p->nLookahead; 
4d60: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20  j++){.        k 
4d70: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
4d80: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70  j].lookahead - p
4d90: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mnLookahead + 
4da0: 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b  i;.        if( k
4db0: 3c 30 20 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63 74  <0 || k>=p->nAct
4dc0: 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ion ) break;.   
4dd0: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f       if( p->aLoo
4de0: 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68  kahead[j].lookah
4df0: 65 61 64 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b  ead!=p->aAction[
4e00: 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 29 20 62  k].lookahead ) b
4e10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
4e20: 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  ( p->aLookahead[
4e30: 6a 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 61 41  j].action!=p->aA
4e40: 63 74 69 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e 20  ction[k].action 
4e50: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
4e60: 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e  .      if( j<p->
4e70: 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e  nLookahead ) con
4e80: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20 3d  tinue;.      n =
4e90: 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   0;.      for(j=
4ea0: 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f 6e 3b  0; j<p->nAction;
4eb0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
4ec0: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d  f( p->aAction[j]
4ed0: 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 20 63  .lookahead<0 ) c
4ee0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
4ef0: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
4f00: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b  j].lookahead==j+
4f10: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69  p->mnLookahead-i
4f20: 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a   ) n++;.      }.
4f30: 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 70 2d 3e        if( n==p->
4f40: 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20  nLookahead ){.  
4f50: 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a        break;  /*
4f60: 20 53 61 6d 65 20 61 73 20 61 20 70 72 69 6f 72   Same as a prior
4f70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
4f80: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
4f90: 7d 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  }.  }.  /* Inser
4fa0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  t transaction se
4fb0: 74 20 61 74 20 69 6e 64 65 78 20 69 2e 20 2a 2f  t at index i. */
4fc0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d  .  for(j=0; j<p-
4fd0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b  >nLookahead; j++
4fe0: 29 7b 0a 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c  ){.    k = p->aL
4ff0: 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b  ookahead[j].look
5000: 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f  ahead - p->mnLoo
5010: 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20 20  kahead + i;.    
5020: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 20 3d 20  p->aAction[k] = 
5030: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
5040: 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 2d 3e  ;.    if( k>=p->
5050: 6e 41 63 74 69 6f 6e 20 29 20 70 2d 3e 6e 41 63  nAction ) p->nAc
5060: 74 69 6f 6e 20 3d 20 6b 2b 31 3b 0a 20 20 7d 0a  tion = k+1;.  }.
5070: 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20    p->nLookahead 
5080: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  = 0;..  /* Retur
5090: 6e 20 74 68 65 20 6f 66 66 73 65 74 20 74 68 61  n the offset tha
50a0: 74 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  t is added to th
50b0: 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e 20 6f  e lookahead in o
50c0: 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 0a  rder to get the.
50d0: 20 20 2a 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20    ** index into 
50e0: 79 79 5f 61 63 74 69 6f 6e 20 6f 66 20 74 68 65  yy_action of the
50f0: 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 65 74   action */.  ret
5100: 75 72 6e 20 69 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f  urn i - p->mnLoo
5110: 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  kahead;.}../****
5120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5130: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
5140: 20 22 62 75 69 6c 64 2e 63 22 20 2a 2a 2a 2a 2a   "build.c" *****
5150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5160: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
5170: 52 6f 75 74 69 6e 65 73 20 74 6f 20 63 6f 6e 73  Routines to cons
5180: 74 72 75 63 74 69 6f 6e 20 74 68 65 20 66 69 6e  truction the fin
5190: 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e  ite state machin
51a0: 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 0a  e for the LEMON.
51b0: 2a 2a 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ** parser genera
51c0: 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e 64  tor..*/../* Find
51d0: 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73 79   a precedence sy
51e0: 6d 62 6f 6c 20 6f 66 20 65 76 65 72 79 20 72 75  mbol of every ru
51f0: 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  le in the gramma
5200: 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 6f 73 65 20  r..** .** Those 
5210: 72 75 6c 65 73 20 77 68 69 63 68 20 68 61 76 65  rules which have
5220: 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73 79   a precedence sy
5230: 6d 62 6f 6c 20 63 6f 64 65 64 20 69 6e 20 74 68  mbol coded in th
5240: 65 20 69 6e 70 75 74 0a 2a 2a 20 67 72 61 6d 6d  e input.** gramm
5250: 61 72 20 75 73 69 6e 67 20 74 68 65 20 22 5b 73  ar using the "[s
5260: 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74 72 75 63  ymbol]" construc
5270: 74 20 77 69 6c 6c 20 61 6c 72 65 61 64 79 20 68  t will already h
5280: 61 76 65 20 74 68 65 0a 2a 2a 20 72 70 2d 3e 70  ave the.** rp->p
5290: 72 65 63 73 79 6d 20 66 69 65 6c 64 20 66 69 6c  recsym field fil
52a0: 6c 65 64 2e 20 20 4f 74 68 65 72 20 72 75 6c 65  led.  Other rule
52b0: 73 20 74 61 6b 65 20 61 73 20 74 68 65 69 72 20  s take as their 
52c0: 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79  precedence.** sy
52d0: 6d 62 6f 6c 20 74 68 65 20 66 69 72 73 74 20 52  mbol the first R
52e0: 48 53 20 73 79 6d 62 6f 6c 20 77 69 74 68 20 61  HS symbol with a
52f0: 20 64 65 66 69 6e 65 64 20 70 72 65 63 65 64 65   defined precede
5300: 6e 63 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  nce.  If there.*
5310: 2a 20 61 72 65 20 6e 6f 74 20 52 48 53 20 73 79  * are not RHS sy
5320: 6d 62 6f 6c 73 20 77 69 74 68 20 61 20 64 65 66  mbols with a def
5330: 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65 2c  ined precedence,
5340: 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65 0a   the precedence.
5350: 2a 2a 20 73 79 6d 62 6f 6c 20 66 69 65 6c 64 20  ** symbol field 
5360: 69 73 20 6c 65 66 74 20 62 6c 61 6e 6b 2e 0a 2a  is left blank..*
5370: 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c 65 50  /.void FindRuleP
5380: 72 65 63 65 64 65 6e 63 65 73 28 78 70 29 0a 73  recedences(xp).s
5390: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 78 70 3b  truct lemon *xp;
53a0: 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  .{.  struct rule
53b0: 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72 70 3d 78   *rp;.  for(rp=x
53c0: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
53d0: 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69  rp->next){.    i
53e0: 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d  f( rp->precsym==
53f0: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
5400: 2c 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  , j;.      for(i
5410: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 20 26  =0; i<rp->nrhs &
5420: 26 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30  & rp->precsym==0
5430: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5440: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
5450: 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  p = rp->rhs[i];.
5460: 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e          if( sp->
5470: 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
5480: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
5490: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 70 2d 3e   for(j=0; j<sp->
54a0: 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20  nsubsym; j++){. 
54b0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
54c0: 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 70 72  p->subsym[j]->pr
54d0: 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ec>=0 ){.       
54e0: 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73         rp->precs
54f0: 79 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b  ym = sp->subsym[
5500: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  j];.            
5510: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5520: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5530: 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
5540: 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30   if( sp->prec>=0
5550: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 70   ){.          rp
5560: 2d 3e 70 72 65 63 73 79 6d 20 3d 20 72 70 2d 3e  ->precsym = rp->
5570: 72 68 73 5b 69 5d 3b 0a 09 7d 0a 20 20 20 20 20  rhs[i];..}.     
5580: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
5590: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e  eturn;.}../* Fin
55a0: 64 20 61 6c 6c 20 6e 6f 6e 74 65 72 6d 69 6e 61  d all nontermina
55b0: 6c 73 20 77 68 69 63 68 20 77 69 6c 6c 20 67 65  ls which will ge
55c0: 6e 65 72 61 74 65 20 74 68 65 20 65 6d 70 74 79  nerate the empty
55d0: 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 54 68 65 6e   string..** Then
55e0: 20 67 6f 20 62 61 63 6b 20 61 6e 64 20 63 6f 6d   go back and com
55f0: 70 75 74 65 20 74 68 65 20 66 69 72 73 74 20 73  pute the first s
5600: 65 74 73 20 6f 66 20 65 76 65 72 79 20 6e 6f 6e  ets of every non
5610: 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2a 20 54 68 65  terminal..** The
5620: 20 66 69 72 73 74 20 73 65 74 20 69 73 20 74 68   first set is th
5630: 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 74 65 72  e set of all ter
5640: 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 77 68  minal symbols wh
5650: 69 63 68 20 63 61 6e 20 62 65 67 69 6e 0a 2a 2a  ich can begin.**
5660: 20 61 20 73 74 72 69 6e 67 20 67 65 6e 65 72 61   a string genera
5670: 74 65 64 20 62 79 20 74 68 61 74 20 6e 6f 6e 74  ted by that nont
5680: 65 72 6d 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64  erminal..*/.void
5690: 20 46 69 6e 64 46 69 72 73 74 53 65 74 73 28 6c   FindFirstSets(l
56a0: 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
56b0: 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74  n *lemp;.{.  int
56c0: 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74 20   i, j;.  struct 
56d0: 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74 20  rule *rp;.  int 
56e0: 70 72 6f 67 72 65 73 73 3b 0a 0a 20 20 66 6f 72  progress;..  for
56f0: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
5700: 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
5710: 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
5720: 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f  ]->lambda = LEMO
5730: 4e 5f 46 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 66  N_FALSE;.  }.  f
5740: 6f 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d  or(i=lemp->nterm
5750: 69 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  inal; i<lemp->ns
5760: 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
5770: 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
5780: 5d 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 53 65  ]->firstset = Se
5790: 74 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tNew();.  }..  /
57a0: 2a 20 46 69 72 73 74 20 63 6f 6d 70 75 74 65 20  * First compute 
57b0: 61 6c 6c 20 6c 61 6d 62 64 61 73 20 2a 2f 0a 20  all lambdas */. 
57c0: 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73   do{.    progres
57d0: 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 72  s = 0;.    for(r
57e0: 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
57f0: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
5800: 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68        if( rp->lh
5810: 73 2d 3e 6c 61 6d 62 64 61 20 29 20 63 6f 6e 74  s->lambda ) cont
5820: 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
5830: 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
5840: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
5850: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
5860: 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  p = rp->rhs[i];.
5870: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d           if( sp-
5880: 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20  >type!=TERMINAL 
5890: 7c 7c 20 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c  || sp->lambda==L
58a0: 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65  EMON_FALSE ) bre
58b0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
58c0: 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68    if( i==rp->nrh
58d0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 70 2d  s ){.        rp-
58e0: 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c  >lhs->lambda = L
58f0: 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20 20  EMON_TRUE;.     
5900: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
5910: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5920: 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73   }while( progres
5930: 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63  s );..  /* Now c
5940: 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69 72 73 74  ompute all first
5950: 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20   sets */.  do{. 
5960: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
5970: 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70   *s1, *s2;.    p
5980: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
5990: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
59a0: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
59b0: 65 78 74 29 7b 0a 20 20 20 20 20 20 73 31 20 3d  ext){.      s1 =
59c0: 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20   rp->lhs;.      
59d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
59e0: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
59f0: 20 20 20 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b     s2 = rp->rhs[
5a00: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
5a10: 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  s2->type==TERMIN
5a20: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
5a30: 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41  progress += SetA
5a40: 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c  dd(s1->firstset,
5a50: 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  s2->index);.    
5a60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5a70: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
5a80: 32 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  2->type==MULTITE
5a90: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
5aa0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
5ab0: 32 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29  2->nsubsym; j++)
5ac0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  {.            pr
5ad0: 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41 64 64  ogress += SetAdd
5ae0: 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32  (s1->firstset,s2
5af0: 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 69 6e 64  ->subsym[j]->ind
5b00: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ex);.          }
5b10: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
5b20: 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 31 3d  ;..}else if( s1=
5b30: 3d 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =s2 ){.         
5b40: 20 69 66 28 20 73 31 2d 3e 6c 61 6d 62 64 61 3d   if( s1->lambda=
5b50: 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62  =LEMON_FALSE ) b
5b60: 72 65 61 6b 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20  reak;..}else{.  
5b70: 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73          progress
5b80: 20 2b 3d 20 53 65 74 55 6e 69 6f 6e 28 73 31 2d   += SetUnion(s1-
5b90: 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 66 69  >firstset,s2->fi
5ba0: 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20 20 20  rstset);.       
5bb0: 20 20 20 69 66 28 20 73 32 2d 3e 6c 61 6d 62 64     if( s2->lambd
5bc0: 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29  a==LEMON_FALSE )
5bd0: 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 20   break;..}.     
5be0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
5bf0: 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 20  e( progress );. 
5c00: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43   return;.}../* C
5c10: 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29  ompute all LR(0)
5c20: 20 73 74 61 74 65 73 20 66 6f 72 20 74 68 65 20   states for the 
5c30: 67 72 61 6d 6d 61 72 2e 20 20 4c 69 6e 6b 73 0a  grammar.  Links.
5c40: 2a 2a 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ** are added to 
5c50: 62 65 74 77 65 65 6e 20 73 6f 6d 65 20 73 74 61  between some sta
5c60: 74 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  tes so that the 
5c70: 4c 52 28 31 29 20 66 6f 6c 6c 6f 77 20 73 65 74  LR(1) follow set
5c80: 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 6f 6d 70  s.** can be comp
5c90: 75 74 65 64 20 6c 61 74 65 72 2e 0a 2a 2f 0a 50  uted later..*/.P
5ca0: 52 49 56 41 54 45 20 73 74 72 75 63 74 20 73 74  RIVATE struct st
5cb0: 61 74 65 20 2a 67 65 74 73 74 61 74 65 28 2f 2a  ate *getstate(/*
5cc0: 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20   struct lemon * 
5cd0: 2a 2f 29 3b 20 20 2f 2a 20 66 6f 72 77 61 72 64  */);  /* forward
5ce0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 76 6f   reference */.vo
5cf0: 69 64 20 46 69 6e 64 53 74 61 74 65 73 28 6c 65  id FindStates(le
5d00: 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
5d10: 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75   *lemp;.{.  stru
5d20: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20  ct symbol *sp;. 
5d30: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
5d40: 3b 0a 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  ;..  Configlist_
5d50: 69 6e 69 74 28 29 3b 0a 0a 20 20 2f 2a 20 46 69  init();..  /* Fi
5d60: 6e 64 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  nd the start sym
5d70: 62 6f 6c 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d  bol */.  if( lem
5d80: 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20 20  p->start ){.    
5d90: 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64  sp = Symbol_find
5da0: 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20  (lemp->start);. 
5db0: 20 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a     if( sp==0 ){.
5dc0: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c        ErrorMsg(l
5dd0: 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c  emp->filename,0,
5de0: 0a 22 54 68 65 20 73 70 65 63 69 66 69 65 64 20  ."The specified 
5df0: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25  start symbol \"%
5e00: 73 5c 22 20 69 73 20 6e 6f 74 20 5c 0a 69 6e 20  s\" is not \.in 
5e10: 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f 66  a nonterminal of
5e20: 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 5c   the grammar.  \
5e30: 22 25 73 5c 22 20 77 69 6c 6c 20 62 65 20 75 73  "%s\" will be us
5e40: 65 64 20 61 73 20 74 68 65 20 73 74 61 72 74 20  ed as the start 
5e50: 5c 0a 73 79 6d 62 6f 6c 20 69 6e 73 74 65 61 64  \.symbol instead
5e60: 2e 22 2c 6c 65 6d 70 2d 3e 73 74 61 72 74 2c 6c  .",lemp->start,l
5e70: 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 2d 3e  emp->rule->lhs->
5e80: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d  name);.      lem
5e90: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
5ea0: 20 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e       sp = lemp->
5eb0: 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 20 20 7d  rule->lhs;.    }
5ec0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70  .  }else{.    sp
5ed0: 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c   = lemp->rule->l
5ee0: 68 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  hs;.  }..  /* Ma
5ef0: 6b 65 20 73 75 72 65 20 74 68 65 20 73 74 61 72  ke sure the star
5f00: 74 20 73 79 6d 62 6f 6c 20 64 6f 65 73 6e 27 74  t symbol doesn't
5f10: 20 6f 63 63 75 72 20 6f 6e 20 74 68 65 20 72 69   occur on the ri
5f20: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
5f30: 0a 20 20 2a 2a 20 61 6e 79 20 72 75 6c 65 2e 20  .  ** any rule. 
5f40: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
5f50: 20 69 66 20 69 74 20 64 6f 65 73 2e 20 20 28 59   if it does.  (Y
5f60: 41 43 43 20 77 6f 75 6c 64 20 67 65 6e 65 72 61  ACC would genera
5f70: 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 73 74  te a new.  ** st
5f80: 61 72 74 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68  art symbol in th
5f90: 69 73 20 63 61 73 65 2e 29 20 2a 2f 0a 20 20 66  is case.) */.  f
5fa0: 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
5fb0: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
5fc0: 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  t){.    int i;. 
5fd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
5fe0: 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
5ff0: 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b      if( rp->rhs[
6000: 69 5d 3d 3d 73 70 20 29 7b 20 20 20 2f 2a 20 46  i]==sp ){   /* F
6010: 49 58 20 4d 45 3a 20 20 44 65 61 6c 20 77 69 74  IX ME:  Deal wit
6020: 68 20 6d 75 6c 74 69 74 65 72 6d 69 6e 61 6c 73  h multiterminals
6030: 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 72 72 6f   */.        Erro
6040: 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
6050: 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 74 61 72  ame,0,."The star
6060: 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20  t symbol \"%s\" 
6070: 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 5c 0a  occurs on the \.
6080: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
6090: 6f 66 20 61 20 72 75 6c 65 2e 20 54 68 69 73 20  of a rule. This 
60a0: 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
60b0: 20 70 61 72 73 65 72 20 77 68 69 63 68 20 5c 0a   parser which \.
60c0: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 70 72  does not work pr
60d0: 6f 70 65 72 6c 79 2e 22 2c 73 70 2d 3e 6e 61 6d  operly.",sp->nam
60e0: 65 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70  e);.        lemp
60f0: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
6100: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6110: 0a 20 20 2f 2a 20 54 68 65 20 62 61 73 69 73 20  .  /* The basis 
6120: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  configuration se
6130: 74 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  t for the first 
6140: 73 74 61 74 65 0a 20 20 2a 2a 20 69 73 20 61 6c  state.  ** is al
6150: 6c 20 72 75 6c 65 73 20 77 68 69 63 68 20 68 61  l rules which ha
6160: 76 65 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  ve the start sym
6170: 62 6f 6c 20 61 73 20 74 68 65 69 72 0a 20 20 2a  bol as their.  *
6180: 2a 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  * left-hand side
6190: 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 73 70 2d   */.  for(rp=sp-
61a0: 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
61b0: 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20 20  ->nextlhs){.    
61c0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
61d0: 65 77 63 66 70 3b 0a 20 20 20 20 72 70 2d 3e 6c  ewcfp;.    rp->l
61e0: 68 73 53 74 61 72 74 20 3d 20 31 3b 0a 20 20 20  hsStart = 1;.   
61f0: 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67   newcfp = Config
6200: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 72 70  list_addbasis(rp
6210: 2c 30 29 3b 0a 20 20 20 20 53 65 74 41 64 64 28  ,0);.    SetAdd(
6220: 6e 65 77 63 66 70 2d 3e 66 77 73 2c 30 29 3b 0a  newcfp->fws,0);.
6230: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
6240: 65 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74  e the first stat
6250: 65 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 73 74  e.  All other st
6260: 61 74 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 2a  ates will be.  *
6270: 2a 20 63 6f 6d 70 75 74 65 64 20 61 75 74 6f 6d  * computed autom
6280: 61 74 69 63 61 6c 6c 79 20 64 75 72 69 6e 67 20  atically during 
6290: 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
62a0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  of the first one
62b0: 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72  ..  ** The retur
62c0: 6e 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ned pointer to t
62d0: 68 65 20 66 69 72 73 74 20 73 74 61 74 65 20 69  he first state i
62e0: 73 20 6e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20  s not used. */. 
62f0: 20 28 76 6f 69 64 29 67 65 74 73 74 61 74 65 28   (void)getstate(
6300: 6c 65 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b  lemp);.  return;
6310: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
6320: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61  pointer to a sta
6330: 74 65 20 77 68 69 63 68 20 69 73 20 64 65 73 63  te which is desc
6340: 72 69 62 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ribed by the con
6350: 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 6c 69  figuration.** li
6360: 73 74 20 77 68 69 63 68 20 68 61 73 20 62 65 65  st which has bee
6370: 6e 20 62 75 69 6c 74 20 66 72 6f 6d 20 63 61 6c  n built from cal
6380: 6c 73 20 74 6f 20 43 6f 6e 66 69 67 6c 69 73 74  ls to Configlist
6390: 5f 61 64 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  _add..*/.PRIVATE
63a0: 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74   void buildshift
63b0: 73 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f  s(/* struct lemo
63c0: 6e 20 2a 2c 20 73 74 72 75 63 74 20 73 74 61 74  n *, struct stat
63d0: 65 20 2a 20 2a 2f 29 3b 20 2f 2a 20 46 6f 72 77  e * */); /* Forw
63e0: 64 20 72 65 66 20 2a 2f 0a 50 52 49 56 41 54 45  d ref */.PRIVATE
63f0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 67   struct state *g
6400: 65 74 73 74 61 74 65 28 6c 65 6d 70 29 0a 73 74  etstate(lemp).st
6410: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
6420: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ;.{.  struct con
6430: 66 69 67 20 2a 63 66 70 2c 20 2a 62 70 3b 0a 20  fig *cfp, *bp;. 
6440: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
6450: 74 70 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63  tp;..  /* Extrac
6460: 74 20 74 68 65 20 73 6f 72 74 65 64 20 62 61 73  t the sorted bas
6470: 69 73 20 6f 66 20 74 68 65 20 6e 65 77 20 73 74  is of the new st
6480: 61 74 65 2e 20 20 54 68 65 20 62 61 73 69 73 20  ate.  The basis 
6490: 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  was constructed.
64a0: 20 20 2a 2a 20 62 79 20 70 72 69 6f 72 20 63 61    ** by prior ca
64b0: 6c 6c 73 20 74 6f 20 22 43 6f 6e 66 69 67 6c 69  lls to "Configli
64c0: 73 74 5f 61 64 64 62 61 73 69 73 28 29 22 2e 20  st_addbasis()". 
64d0: 2a 2f 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  */.  Configlist_
64e0: 73 6f 72 74 62 61 73 69 73 28 29 3b 0a 20 20 62  sortbasis();.  b
64f0: 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 62  p = Configlist_b
6500: 61 73 69 73 28 29 3b 0a 0a 20 20 2f 2a 20 47 65  asis();..  /* Ge
6510: 74 20 61 20 73 74 61 74 65 20 77 69 74 68 20 74  t a state with t
6520: 68 65 20 73 61 6d 65 20 62 61 73 69 73 20 2a 2f  he same basis */
6530: 0a 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f 66  .  stp = State_f
6540: 69 6e 64 28 62 70 29 3b 0a 20 20 69 66 28 20 73  ind(bp);.  if( s
6550: 74 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 73  tp ){.    /* A s
6560: 74 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61  tate with the sa
6570: 6d 65 20 62 61 73 69 73 20 61 6c 72 65 61 64 79  me basis already
6580: 20 65 78 69 73 74 73 21 20 20 43 6f 70 79 20 61   exists!  Copy a
6590: 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65  ll the follow-se
65a0: 74 0a 20 20 20 20 2a 2a 20 70 72 6f 70 61 67 61  t.    ** propaga
65b0: 74 69 6f 6e 20 6c 69 6e 6b 73 20 66 72 6f 6d 20  tion links from 
65c0: 74 68 65 20 73 74 61 74 65 20 75 6e 64 65 72 20  the state under 
65d0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 74  construction int
65e0: 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 65  o the.    ** pre
65f0: 65 78 69 73 74 69 6e 67 20 73 74 61 74 65 2c 20  existing state, 
6600: 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f  then return a po
6610: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65  inter to the pre
6620: 65 78 69 73 74 69 6e 67 20 73 74 61 74 65 20 2a  existing state *
6630: 2f 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e  /.    struct con
6640: 66 69 67 20 2a 78 2c 20 2a 79 3b 0a 20 20 20 20  fig *x, *y;.    
6650: 66 6f 72 28 78 3d 62 70 2c 20 79 3d 73 74 70 2d  for(x=bp, y=stp-
6660: 3e 62 70 3b 20 78 20 26 26 20 79 3b 20 78 3d 78  >bp; x && y; x=x
6670: 2d 3e 62 70 2c 20 79 3d 79 2d 3e 62 70 29 7b 0a  ->bp, y=y->bp){.
6680: 20 20 20 20 20 20 50 6c 69 6e 6b 5f 63 6f 70 79        Plink_copy
6690: 28 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e 62 70 6c  (&y->bplp,x->bpl
66a0: 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f  p);.      Plink_
66b0: 64 65 6c 65 74 65 28 78 2d 3e 66 70 6c 70 29 3b  delete(x->fplp);
66c0: 0a 20 20 20 20 20 20 78 2d 3e 66 70 6c 70 20 3d  .      x->fplp =
66d0: 20 78 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20   x->bplp = 0;.  
66e0: 20 20 7d 0a 20 20 20 20 63 66 70 20 3d 20 43 6f    }.    cfp = Co
66f0: 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28  nfiglist_return(
6700: 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73  );.    Configlis
6710: 74 5f 65 61 74 28 63 66 70 29 3b 0a 20 20 7d 65  t_eat(cfp);.  }e
6720: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
6730: 20 72 65 61 6c 6c 79 20 69 73 20 61 20 6e 65 77   really is a new
6740: 20 73 74 61 74 65 2e 20 20 43 6f 6e 73 74 72 75   state.  Constru
6750: 63 74 20 61 6c 6c 20 74 68 65 20 64 65 74 61 69  ct all the detai
6760: 6c 73 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67  ls */.    Config
6770: 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c 65 6d  list_closure(lem
6780: 70 29 3b 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  p);    /* Comput
6790: 65 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  e the configurat
67a0: 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20  ion closure */. 
67b0: 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f     Configlist_so
67c0: 72 74 28 29 3b 20 20 20 20 20 20 20 20 20 20 20  rt();           
67d0: 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f 6e 66  /* Sort the conf
67e0: 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72  iguration closur
67f0: 65 20 2a 2f 0a 20 20 20 20 63 66 70 20 3d 20 43  e */.    cfp = C
6800: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e  onfiglist_return
6810: 28 29 3b 20 20 20 2f 2a 20 47 65 74 20 61 20 70  ();   /* Get a p
6820: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f  ointer to the co
6830: 6e 66 69 67 20 6c 69 73 74 20 2a 2f 0a 20 20 20  nfig list */.   
6840: 20 73 74 70 20 3d 20 53 74 61 74 65 5f 6e 65 77   stp = State_new
6850: 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ();           /*
6860: 20 41 20 6e 65 77 20 73 74 61 74 65 20 73 74 72   A new state str
6870: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 4d 65  ucture */.    Me
6880: 6d 6f 72 79 43 68 65 63 6b 28 73 74 70 29 3b 0a  moryCheck(stp);.
6890: 20 20 20 20 73 74 70 2d 3e 62 70 20 3d 20 62 70      stp->bp = bp
68a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
68b0: 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65   /* Remember the
68c0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62   configuration b
68d0: 61 73 69 73 20 2a 2f 0a 20 20 20 20 73 74 70 2d  asis */.    stp-
68e0: 3e 63 66 70 20 3d 20 63 66 70 3b 20 20 20 20 20  >cfp = cfp;     
68f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65           /* Reme
6900: 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75  mber the configu
6910: 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a  ration closure *
6920: 2f 0a 20 20 20 20 73 74 70 2d 3e 73 74 61 74 65  /.    stp->state
6930: 6e 75 6d 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  num = lemp->nsta
6940: 74 65 2b 2b 3b 20 2f 2a 20 45 76 65 72 79 20 73  te++; /* Every s
6950: 74 61 74 65 20 67 65 74 73 20 61 20 73 65 71 75  tate gets a sequ
6960: 65 6e 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ence number */. 
6970: 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 30 3b 20     stp->ap = 0; 
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6990: 2f 2a 20 4e 6f 20 61 63 74 69 6f 6e 73 2c 20 79  /* No actions, y
69a0: 65 74 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65  et. */.    State
69b0: 5f 69 6e 73 65 72 74 28 73 74 70 2c 73 74 70 2d  _insert(stp,stp-
69c0: 3e 62 70 29 3b 20 20 20 2f 2a 20 41 64 64 20 74  >bp);   /* Add t
69d0: 6f 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c  o the state tabl
69e0: 65 20 2a 2f 0a 20 20 20 20 62 75 69 6c 64 73 68  e */.    buildsh
69f0: 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29 3b 20  ifts(lemp,stp); 
6a00: 20 20 20 20 20 20 2f 2a 20 52 65 63 75 72 73 69        /* Recursi
6a10: 76 65 6c 79 20 63 6f 6d 70 75 74 65 20 73 75 63  vely compute suc
6a20: 63 65 73 73 6f 72 20 73 74 61 74 65 73 20 2a 2f  cessor states */
6a30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 74  .  }.  return st
6a40: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
6a50: 72 6e 20 74 72 75 65 20 69 66 20 74 77 6f 20 73  rn true if two s
6a60: 79 6d 62 6f 6c 73 20 61 72 65 20 74 68 65 20 73  ymbols are the s
6a70: 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 61 6d 65  ame..*/.int same
6a80: 5f 73 79 6d 62 6f 6c 28 61 2c 62 29 0a 73 74 72  _symbol(a,b).str
6a90: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 61 3b 0a 73  uct symbol *a;.s
6aa0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62 3b  truct symbol *b;
6ab0: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  .{.  int i;.  if
6ac0: 28 20 61 3d 3d 62 20 29 20 72 65 74 75 72 6e 20  ( a==b ) return 
6ad0: 31 3b 0a 20 20 69 66 28 20 61 2d 3e 74 79 70 65  1;.  if( a->type
6ae0: 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  !=MULTITERMINAL 
6af0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
6b00: 28 20 62 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49  ( b->type!=MULTI
6b10: 54 45 52 4d 49 4e 41 4c 20 29 20 72 65 74 75 72  TERMINAL ) retur
6b20: 6e 20 30 3b 0a 20 20 69 66 28 20 61 2d 3e 6e 73  n 0;.  if( a->ns
6b30: 75 62 73 79 6d 21 3d 62 2d 3e 6e 73 75 62 73 79  ubsym!=b->nsubsy
6b40: 6d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  m ) return 0;.  
6b50: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 2d 3e 6e 73  for(i=0; i<a->ns
6b60: 75 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubsym; i++){.   
6b70: 20 69 66 28 20 61 2d 3e 73 75 62 73 79 6d 5b 69   if( a->subsym[i
6b80: 5d 21 3d 62 2d 3e 73 75 62 73 79 6d 5b 69 5d 20  ]!=b->subsym[i] 
6b90: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
6ba0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
6bb0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20  * Construct all 
6bc0: 73 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 73  successor states
6bd0: 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 73 74   to the given st
6be0: 61 74 65 2e 20 20 41 20 22 73 75 63 63 65 73 73  ate.  A "success
6bf0: 6f 72 22 0a 2a 2a 20 73 74 61 74 65 20 69 73 20  or".** state is 
6c00: 61 6e 79 20 73 74 61 74 65 20 77 68 69 63 68 20  any state which 
6c10: 63 61 6e 20 62 65 20 72 65 61 63 68 65 64 20 62  can be reached b
6c20: 79 20 61 20 73 68 69 66 74 20 61 63 74 69 6f 6e  y a shift action
6c30: 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  ..*/.PRIVATE voi
6c40: 64 20 62 75 69 6c 64 73 68 69 66 74 73 28 6c 65  d buildshifts(le
6c50: 6d 70 2c 73 74 70 29 0a 73 74 72 75 63 74 20 6c  mp,stp).struct l
6c60: 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73 74 72 75  emon *lemp;.stru
6c70: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
6c80: 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20     /* The state 
6c90: 66 72 6f 6d 20 77 68 69 63 68 20 73 75 63 63 65  from which succe
6ca0: 73 73 6f 72 73 20 61 72 65 20 63 6f 6d 70 75 74  ssors are comput
6cb0: 65 64 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63 74  ed */.{.  struct
6cc0: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 2f   config *cfp;  /
6cd0: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
6ce0: 72 75 20 74 68 65 20 63 6f 6e 66 69 67 20 63 6c  ru the config cl
6cf0: 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a  osure of "stp" *
6d00: 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  /.  struct confi
6d10: 67 20 2a 62 63 66 70 3b 20 2f 2a 20 46 6f 72 20  g *bcfp; /* For 
6d20: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 6f  the inner loop o
6d30: 6e 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65  n config closure
6d40: 20 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20 20 73   of "stp" */.  s
6d50: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
6d60: 77 3b 20 20 2f 2a 20 2a 2f 0a 20 20 73 74 72 75  w;  /* */.  stru
6d70: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20  ct symbol *sp;  
6d80: 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f   /* Symbol follo
6d90: 77 69 6e 67 20 74 68 65 20 64 6f 74 20 69 6e 20  wing the dot in 
6da0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 63  configuration "c
6db0: 66 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  fp" */.  struct 
6dc0: 73 79 6d 62 6f 6c 20 2a 62 73 70 3b 20 20 2f 2a  symbol *bsp;  /*
6dd0: 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e   Symbol followin
6de0: 67 20 74 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e  g the dot in con
6df0: 66 69 67 75 72 61 74 69 6f 6e 20 22 62 63 66 70  figuration "bcfp
6e00: 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  " */.  struct st
6e10: 61 74 65 20 2a 6e 65 77 73 74 70 3b 20 2f 2a 20  ate *newstp; /* 
6e20: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  A pointer to a s
6e30: 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 20 2a  uccessor state *
6e40: 2f 0a 0a 20 20 2f 2a 20 45 61 63 68 20 63 6f 6e  /..  /* Each con
6e50: 66 69 67 75 72 61 74 69 6f 6e 20 62 65 63 6f 6d  figuration becom
6e60: 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 66 74 65  es complete afte
6e70: 72 20 69 74 20 63 6f 6e 74 69 62 75 74 65 73 20  r it contibutes 
6e80: 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72 0a 20  to a successor. 
6e90: 20 2a 2a 20 73 74 61 74 65 2e 20 20 49 6e 69 74   ** state.  Init
6ea0: 69 61 6c 6c 79 2c 20 61 6c 6c 20 63 6f 6e 66 69  ially, all confi
6eb0: 67 75 72 61 74 69 6f 6e 73 20 61 72 65 20 69 6e  gurations are in
6ec0: 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 66 6f  complete */.  fo
6ed0: 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20  r(cfp=stp->cfp; 
6ee0: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
6ef0: 78 74 29 20 63 66 70 2d 3e 73 74 61 74 75 73 20  xt) cfp->status 
6f00: 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 0a 20  = INCOMPLETE;.. 
6f10: 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
6f20: 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69   all configurati
6f30: 6f 6e 73 20 6f 66 20 74 68 65 20 73 74 61 74 65  ons of the state
6f40: 20 22 73 74 70 22 20 2a 2f 0a 20 20 66 6f 72 28   "stp" */.  for(
6f50: 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66  cfp=stp->cfp; cf
6f60: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
6f70: 29 7b 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e  ){.    if( cfp->
6f80: 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45  status==COMPLETE
6f90: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20   ) continue;    
6fa0: 2f 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64 20  /* Already used 
6fb0: 62 79 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  by inner loop */
6fc0: 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f  .    if( cfp->do
6fd0: 74 3e 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73  t>=cfp->rp->nrhs
6fe0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a   ) continue;  /*
6ff0: 20 43 61 6e 27 74 20 73 68 69 66 74 20 74 68 69   Can't shift thi
7000: 73 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20  s config */.    
7010: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74  Configlist_reset
7020: 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ();             
7030: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 65           /* Rese
7040: 74 20 74 68 65 20 6e 65 77 20 63 6f 6e 66 69 67  t the new config
7050: 20 73 65 74 20 2a 2f 0a 20 20 20 20 73 70 20 3d   set */.    sp =
7060: 20 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 63 66   cfp->rp->rhs[cf
7070: 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20  p->dot];        
7080: 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 61       /* Symbol a
7090: 66 74 65 72 20 74 68 65 20 64 6f 74 20 2a 2f 0a  fter the dot */.
70a0: 0a 20 20 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  .    /* For ever
70b0: 79 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  y configuration 
70c0: 69 6e 20 74 68 65 20 73 74 61 74 65 20 22 73 74  in the state "st
70d0: 70 22 20 77 68 69 63 68 20 68 61 73 20 74 68 65  p" which has the
70e0: 20 73 79 6d 62 6f 6c 20 22 73 70 22 0a 20 20 20   symbol "sp".   
70f0: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74   ** following it
7100: 73 20 64 6f 74 2c 20 61 64 64 20 74 68 65 20 73  s dot, add the s
7110: 61 6d 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ame configuratio
7120: 6e 20 74 6f 20 74 68 65 20 62 61 73 69 73 20 73  n to the basis s
7130: 65 74 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20  et under.    ** 
7140: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 62 75 74  construction but
7150: 20 77 69 74 68 20 74 68 65 20 64 6f 74 20 73 68   with the dot sh
7160: 69 66 74 65 64 20 6f 6e 65 20 73 79 6d 62 6f 6c  ifted one symbol
7170: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20 2a   to the right. *
7180: 2f 0a 20 20 20 20 66 6f 72 28 62 63 66 70 3d 63  /.    for(bcfp=c
7190: 66 70 3b 20 62 63 66 70 3b 20 62 63 66 70 3d 62  fp; bcfp; bcfp=b
71a0: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
71b0: 20 20 69 66 28 20 62 63 66 70 2d 3e 73 74 61 74    if( bcfp->stat
71c0: 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63  us==COMPLETE ) c
71d0: 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41  ontinue;    /* A
71e0: 6c 72 65 61 64 79 20 75 73 65 64 20 2a 2f 0a 20  lready used */. 
71f0: 20 20 20 20 20 69 66 28 20 62 63 66 70 2d 3e 64       if( bcfp->d
7200: 6f 74 3e 3d 62 63 66 70 2d 3e 72 70 2d 3e 6e 72  ot>=bcfp->rp->nr
7210: 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f  hs ) continue; /
7220: 2a 20 43 61 6e 27 74 20 73 68 69 66 74 20 74 68  * Can't shift th
7230: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  is one */.      
7240: 62 73 70 20 3d 20 62 63 66 70 2d 3e 72 70 2d 3e  bsp = bcfp->rp->
7250: 72 68 73 5b 62 63 66 70 2d 3e 64 6f 74 5d 3b 20  rhs[bcfp->dot]; 
7260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74            /* Get
7270: 20 73 79 6d 62 6f 6c 20 61 66 74 65 72 20 64 6f   symbol after do
7280: 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21  t */.      if( !
7290: 73 61 6d 65 5f 73 79 6d 62 6f 6c 28 62 73 70 2c  same_symbol(bsp,
72a0: 73 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  sp) ) continue; 
72b0: 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
72c0: 73 61 6d 65 20 61 73 20 66 6f 72 20 22 63 66 70  same as for "cfp
72d0: 22 20 2a 2f 0a 20 20 20 20 20 20 62 63 66 70 2d  " */.      bcfp-
72e0: 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45  >status = COMPLE
72f0: 54 45 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  TE;             
7300: 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 69       /* Mark thi
7310: 73 20 63 6f 6e 66 69 67 20 61 73 20 75 73 65 64  s config as used
7320: 20 2a 2f 0a 20 20 20 20 20 20 6e 65 77 20 3d 20   */.      new = 
7330: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61  Configlist_addba
7340: 73 69 73 28 62 63 66 70 2d 3e 72 70 2c 62 63 66  sis(bcfp->rp,bcf
7350: 70 2d 3e 64 6f 74 2b 31 29 3b 0a 20 20 20 20 20  p->dot+1);.     
7360: 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6e 65 77 2d   Plink_add(&new-
7370: 3e 62 70 6c 70 2c 62 63 66 70 29 3b 0a 20 20 20  >bplp,bcfp);.   
7380: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 61   }..    /* Get a
7390: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
73a0: 73 74 61 74 65 20 64 65 73 63 72 69 62 65 64 20  state described 
73b0: 62 79 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e  by the basis con
73c0: 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 0a 20  figuration set. 
73d0: 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65     ** constructe
73e0: 64 20 69 6e 20 74 68 65 20 70 72 65 63 65 64 69  d in the precedi
73f0: 6e 67 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 6e  ng loop */.    n
7400: 65 77 73 74 70 20 3d 20 67 65 74 73 74 61 74 65  ewstp = getstate
7410: 28 6c 65 6d 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  (lemp);..    /* 
7420: 54 68 65 20 73 74 61 74 65 20 22 6e 65 77 73 74  The state "newst
7430: 70 22 20 69 73 20 72 65 61 63 68 65 64 20 66 72  p" is reached fr
7440: 6f 6d 20 74 68 65 20 73 74 61 74 65 20 22 73 74  om the state "st
7450: 70 22 20 62 79 20 61 20 73 68 69 66 74 20 61 63  p" by a shift ac
7460: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  tion.    ** on t
7470: 68 65 20 73 79 6d 62 6f 6c 20 22 73 70 22 20 2a  he symbol "sp" *
7480: 2f 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  /.    if( sp->ty
7490: 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
74a0: 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  L ){.      int i
74b0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
74c0: 20 69 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20   i<sp->nsubsym; 
74d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 41 63  i++){.        Ac
74e0: 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61  tion_add(&stp->a
74f0: 70 2c 53 48 49 46 54 2c 73 70 2d 3e 73 75 62 73  p,SHIFT,sp->subs
7500: 79 6d 5b 69 5d 2c 28 63 68 61 72 2a 29 6e 65 77  ym[i],(char*)new
7510: 73 74 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  stp);.      }.  
7520: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 41    }else{.      A
7530: 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e  ction_add(&stp->
7540: 61 70 2c 53 48 49 46 54 2c 73 70 2c 28 63 68 61  ap,SHIFT,sp,(cha
7550: 72 20 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20  r *)newstp);.   
7560: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
7570: 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 70 72  Construct the pr
7580: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a  opagation links.
7590: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b  */.void FindLink
75a0: 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  s(lemp).struct l
75b0: 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
75c0: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
75d0: 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6f 74  config *cfp, *ot
75e0: 68 65 72 3b 0a 20 20 73 74 72 75 63 74 20 73 74  her;.  struct st
75f0: 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
7600: 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 0a  ct plink *plp;..
7610: 20 20 2f 2a 20 48 6f 75 73 65 6b 65 65 70 69 6e    /* Housekeepin
7620: 67 20 64 65 74 61 69 6c 3a 0a 20 20 2a 2a 20 41  g detail:.  ** A
7630: 64 64 20 74 6f 20 65 76 65 72 79 20 70 72 6f 70  dd to every prop
7640: 61 67 61 74 65 20 6c 69 6e 6b 20 61 20 70 6f 69  agate link a poi
7650: 6e 74 65 72 20 62 61 63 6b 20 74 6f 20 74 68 65  nter back to the
7660: 20 73 74 61 74 65 20 74 6f 0a 20 20 2a 2a 20 77   state to.  ** w
7670: 68 69 63 68 20 74 68 65 20 6c 69 6e 6b 20 69 73  hich the link is
7680: 20 61 74 74 61 63 68 65 64 2e 20 2a 2f 0a 20 20   attached. */.  
7690: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
76a0: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
76b0: 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
76c0: 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f  orted[i];.    fo
76d0: 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20  r(cfp=stp->cfp; 
76e0: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
76f0: 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e  xt){.      cfp->
7700: 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 7d  stp = stp;.    }
7710: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  .  }..  /* Conve
7720: 72 74 20 61 6c 6c 20 62 61 63 6b 6c 69 6e 6b 73  rt all backlinks
7730: 20 69 6e 74 6f 20 66 6f 72 77 61 72 64 20 6c 69   into forward li
7740: 6e 6b 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66  nks.  Only the f
7750: 6f 72 77 61 72 64 0a 20 20 2a 2a 20 6c 69 6e 6b  orward.  ** link
7760: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
7770: 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 6f 6d  e follow-set com
7780: 70 75 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66  putation. */.  f
7790: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
77a0: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
77b0: 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
77c0: 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  rted[i];.    for
77d0: 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63  (cfp=stp->cfp; c
77e0: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
77f0: 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 6c  t){.      for(pl
7800: 70 3d 63 66 70 2d 3e 62 70 6c 70 3b 20 70 6c 70  p=cfp->bplp; plp
7810: 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29  ; plp=plp->next)
7820: 7b 0a 20 20 20 20 20 20 20 20 6f 74 68 65 72 20  {.        other 
7830: 3d 20 70 6c 70 2d 3e 63 66 70 3b 0a 20 20 20 20  = plp->cfp;.    
7840: 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6f      Plink_add(&o
7850: 74 68 65 72 2d 3e 66 70 6c 70 2c 63 66 70 29 3b  ther->fplp,cfp);
7860: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7870: 20 7d 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65   }.}../* Compute
7880: 20 61 6c 6c 20 66 6f 6c 6c 6f 77 73 65 74 73 2e   all followsets.
7890: 0a 2a 2a 0a 2a 2a 20 41 20 66 6f 6c 6c 6f 77 73  .**.** A follows
78a0: 65 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66  et is the set of
78b0: 20 61 6c 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69   all symbols whi
78c0: 63 68 20 63 61 6e 20 63 6f 6d 65 20 69 6d 6d 65  ch can come imme
78d0: 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72  diately.** after
78e0: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
78f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 6f  ..*/.void FindFo
7900: 6c 6c 6f 77 53 65 74 73 28 6c 65 6d 70 29 0a 73  llowSets(lemp).s
7910: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
7920: 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p;.{.  int i;.  
7930: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
7940: 66 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  fp;.  struct pli
7950: 6e 6b 20 2a 70 6c 70 3b 0a 20 20 69 6e 74 20 70  nk *plp;.  int p
7960: 72 6f 67 72 65 73 73 3b 0a 20 20 69 6e 74 20 63  rogress;.  int c
7970: 68 61 6e 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d  hange;..  for(i=
7980: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
7990: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  e; i++){.    for
79a0: 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65  (cfp=lemp->sorte
79b0: 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b 20  d[i]->cfp; cfp; 
79c0: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
79d0: 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74 75        cfp->statu
79e0: 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a  s = INCOMPLETE;.
79f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 64      }.  }.  .  d
7a00: 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20  o{.    progress 
7a10: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
7a20: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
7a30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; i++){.      fo
7a40: 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74  r(cfp=lemp->sort
7a50: 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b  ed[i]->cfp; cfp;
7a60: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
7a70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 66 70  .        if( cfp
7a80: 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45  ->status==COMPLE
7a90: 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  TE ) continue;. 
7aa0: 20 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d 63         for(plp=c
7ab0: 66 70 2d 3e 66 70 6c 70 3b 20 70 6c 70 3b 20 70  fp->fplp; plp; p
7ac0: 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20  lp=plp->next){. 
7ad0: 20 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 20           change 
7ae0: 3d 20 53 65 74 55 6e 69 6f 6e 28 70 6c 70 2d 3e  = SetUnion(plp->
7af0: 63 66 70 2d 3e 66 77 73 2c 63 66 70 2d 3e 66 77  cfp->fws,cfp->fw
7b00: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
7b10: 28 20 63 68 61 6e 67 65 20 29 7b 0a 20 20 20 20  ( change ){.    
7b20: 20 20 20 20 20 20 20 20 70 6c 70 2d 3e 63 66 70          plp->cfp
7b30: 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d  ->status = INCOM
7b40: 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20 20  PLETE;.         
7b50: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
7b60: 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 20  ..  }..}.       
7b70: 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43   cfp->status = C
7b80: 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d  OMPLETE;.      }
7b90: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
7ba0: 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d 0a 0a   progress );.}..
7bb0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
7bc0: 76 65 5f 63 6f 6e 66 6c 69 63 74 28 29 3b 0a 0a  ve_conflict();..
7bd0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72  /* Compute the r
7be0: 65 64 75 63 65 20 61 63 74 69 6f 6e 73 2c 20 61  educe actions, a
7bf0: 6e 64 20 72 65 73 6f 6c 76 65 20 63 6f 6e 66 6c  nd resolve confl
7c00: 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69  icts..*/.void Fi
7c10: 6e 64 41 63 74 69 6f 6e 73 28 6c 65 6d 70 29 0a  ndActions(lemp).
7c20: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
7c30: 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 6a 3b  mp;.{.  int i,j;
7c40: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
7c50: 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20   *cfp;.  struct 
7c60: 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
7c70: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
7c80: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
7c90: 72 70 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c  rp;..  /* Add al
7ca0: 6c 20 6f 66 20 74 68 65 20 72 65 64 75 63 65 20  l of the reduce 
7cb0: 61 63 74 69 6f 6e 73 20 0a 20 20 2a 2a 20 41 20  actions .  ** A 
7cc0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 69 73  reduce action is
7cd0: 20 61 64 64 65 64 20 66 6f 72 20 65 61 63 68 20   added for each 
7ce0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 66  element of the f
7cf0: 6f 6c 6c 6f 77 73 65 74 20 6f 66 0a 20 20 2a 2a  ollowset of.  **
7d00: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
7d10: 20 77 68 69 63 68 20 68 61 73 20 69 74 73 20 64   which has its d
7d20: 6f 74 20 61 74 20 74 68 65 20 65 78 74 72 65 6d  ot at the extrem
7d30: 65 20 72 69 67 68 74 2e 0a 20 20 2a 2f 0a 20 20  e right..  */.  
7d40: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
7d50: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 20 20  >nstate; i++){  
7d60: 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
7d70: 6c 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 20 20  l states */.    
7d80: 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
7d90: 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63  ed[i];.    for(c
7da0: 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70  fp=stp->cfp; cfp
7db0: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
7dc0: 7b 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  {  /* Loop over 
7dd0: 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  all configuratio
7de0: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ns */.      if( 
7df0: 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 3d 3d 63  cfp->rp->nrhs==c
7e00: 66 70 2d 3e 64 6f 74 20 29 7b 20 20 20 20 20 20  fp->dot ){      
7e10: 20 20 2f 2a 20 49 73 20 64 6f 74 20 61 74 20 65    /* Is dot at e
7e20: 78 74 72 65 6d 65 20 72 69 67 68 74 3f 20 2a 2f  xtreme right? */
7e30: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
7e40: 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; j<lemp->ntermi
7e50: 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nal; j++){.     
7e60: 20 20 20 20 20 69 66 28 20 53 65 74 46 69 6e 64       if( SetFind
7e70: 28 63 66 70 2d 3e 66 77 73 2c 6a 29 20 29 7b 0a  (cfp->fws,j) ){.
7e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7e90: 64 64 20 61 20 72 65 64 75 63 65 20 61 63 74 69  dd a reduce acti
7ea0: 6f 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  on to the state 
7eb0: 22 73 74 70 22 20 77 68 69 63 68 20 77 69 6c 6c  "stp" which will
7ec0: 20 72 65 64 75 63 65 20 62 79 20 74 68 65 0a 20   reduce by the. 
7ed0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 75             ** ru
7ee0: 6c 65 20 22 63 66 70 2d 3e 72 70 22 20 69 66 20  le "cfp->rp" if 
7ef0: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 73 79  the lookahead sy
7f00: 6d 62 6f 6c 20 69 73 20 22 6c 65 6d 70 2d 3e 73  mbol is "lemp->s
7f10: 79 6d 62 6f 6c 73 5b 6a 5d 22 20 2a 2f 0a 20 20  ymbols[j]" */.  
7f20: 20 20 20 20 20 20 20 20 20 20 41 63 74 69 6f 6e            Action
7f30: 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 52 45  _add(&stp->ap,RE
7f40: 44 55 43 45 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  DUCE,lemp->symbo
7f50: 6c 73 5b 6a 5d 2c 28 63 68 61 72 20 2a 29 63 66  ls[j],(char *)cf
7f60: 70 2d 3e 72 70 29 3b 0a 20 20 20 20 20 20 20 20  p->rp);.        
7f70: 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20    }..}.      }. 
7f80: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
7f90: 64 64 20 74 68 65 20 61 63 63 65 70 74 69 6e 67  dd the accepting
7fa0: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 66 28 20   token */.  if( 
7fb0: 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20  lemp->start ){. 
7fc0: 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66     sp = Symbol_f
7fd0: 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29  ind(lemp->start)
7fe0: 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20  ;.    if( sp==0 
7ff0: 29 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c  ) sp = lemp->rul
8000: 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65 6c 73 65 7b  e->lhs;.  }else{
8010: 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
8020: 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 20  rule->lhs;.  }. 
8030: 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20 66   /* Add to the f
8040: 69 72 73 74 20 73 74 61 74 65 20 28 77 68 69 63  irst state (whic
8050: 68 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  h is always the 
8060: 73 74 61 72 74 69 6e 67 20 73 74 61 74 65 20 6f  starting state o
8070: 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 69 74  f the.  ** finit
8080: 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 29  e state machine)
8090: 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20 41 43   an action to AC
80a0: 43 45 50 54 20 69 66 20 74 68 65 20 6c 6f 6f 6b  CEPT if the look
80b0: 61 68 65 61 64 20 69 73 20 74 68 65 0a 20 20 2a  ahead is the.  *
80c0: 2a 20 73 74 61 72 74 20 6e 6f 6e 74 65 72 6d 69  * start nontermi
80d0: 6e 61 6c 2e 20 20 2a 2f 0a 20 20 41 63 74 69 6f  nal.  */.  Actio
80e0: 6e 5f 61 64 64 28 26 6c 65 6d 70 2d 3e 73 6f 72  n_add(&lemp->sor
80f0: 74 65 64 5b 30 5d 2d 3e 61 70 2c 41 43 43 45 50  ted[0]->ap,ACCEP
8100: 54 2c 73 70 2c 30 29 3b 0a 0a 20 20 2f 2a 20 52  T,sp,0);..  /* R
8110: 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73  esolve conflicts
8120: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
8130: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
8140: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
8150: 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 6e 61 70  action *ap, *nap
8160: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  ;.    struct sta
8170: 74 65 20 2a 73 74 70 3b 0a 20 20 20 20 73 74 70  te *stp;.    stp
8180: 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
8190: 69 5d 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72  i];.    /* asser
81a0: 74 28 20 73 74 70 2d 3e 61 70 20 29 3b 20 2a 2f  t( stp->ap ); */
81b0: 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41  .    stp->ap = A
81c0: 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e  ction_sort(stp->
81d0: 61 70 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  ap);.    for(ap=
81e0: 73 74 70 2d 3e 61 70 3b 20 61 70 20 26 26 20 61  stp->ap; ap && a
81f0: 70 2d 3e 6e 65 78 74 3b 20 61 70 3d 61 70 2d 3e  p->next; ap=ap->
8200: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66 6f 72  next){.      for
8210: 28 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 6e  (nap=ap->next; n
8220: 61 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d 3d 61  ap && nap->sp==a
8230: 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70 2d 3e  p->sp; nap=nap->
8240: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  next){.         
8250: 2f 2a 20 54 68 65 20 74 77 6f 20 61 63 74 69 6f  /* The two actio
8260: 6e 73 20 22 61 70 22 20 61 6e 64 20 22 6e 61 70  ns "ap" and "nap
8270: 22 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  " have the same 
8280: 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20 20  lookahead..     
8290: 20 20 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75      ** Figure ou
82a0: 74 20 77 68 69 63 68 20 6f 6e 65 20 73 68 6f 75  t which one shou
82b0: 6c 64 20 62 65 20 75 73 65 64 20 2a 2f 0a 20 20  ld be used */.  
82c0: 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e 63 6f         lemp->nco
82d0: 6e 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f 6c 76  nflict += resolv
82e0: 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c 6e 61  e_conflict(ap,na
82f0: 70 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 29 3b  p,lemp->errsym);
8300: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8310: 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20   }..  /* Report 
8320: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 65 61 63  an error for eac
8330: 68 20 72 75 6c 65 20 74 68 61 74 20 63 61 6e 20  h rule that can 
8340: 6e 65 76 65 72 20 62 65 20 72 65 64 75 63 65 64  never be reduced
8350: 2e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65  . */.  for(rp=le
8360: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
8370: 3d 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 63  =rp->next) rp->c
8380: 61 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e  anReduce = LEMON
8390: 5f 46 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d  _FALSE;.  for(i=
83a0: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
83b0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  e; i++){.    str
83c0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
83d0: 20 20 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d      for(ap=lemp-
83e0: 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20  >sorted[i]->ap; 
83f0: 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
8400: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  {.      if( ap->
8410: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 20 61  type==REDUCE ) a
8420: 70 2d 3e 78 2e 72 70 2d 3e 63 61 6e 52 65 64 75  p->x.rp->canRedu
8430: 63 65 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b  ce = LEMON_TRUE;
8440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
8450: 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
8460: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
8470: 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 61  {.    if( rp->ca
8480: 6e 52 65 64 75 63 65 20 29 20 63 6f 6e 74 69 6e  nReduce ) contin
8490: 75 65 3b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67  ue;.    ErrorMsg
84a0: 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
84b0: 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 22 54 68  rp->ruleline,"Th
84c0: 69 73 20 72 75 6c 65 20 63 61 6e 20 6e 6f 74 20  is rule can not 
84d0: 62 65 20 72 65 64 75 63 65 64 2e 5c 6e 22 29 3b  be reduced.\n");
84e0: 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
84f0: 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  cnt++;.  }.}../*
8500: 20 52 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c   Resolve a confl
8510: 69 63 74 20 62 65 74 77 65 65 6e 20 74 68 65 20  ict between the 
8520: 74 77 6f 20 67 69 76 65 6e 20 61 63 74 69 6f 6e  two given action
8530: 73 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 6f  s.  If the.** co
8540: 6e 66 6c 69 63 74 20 63 61 6e 27 74 20 62 65 20  nflict can't be 
8550: 72 65 73 6f 6c 76 65 64 2c 20 72 65 74 75 72 6e  resolved, return
8560: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
8570: 20 4e 4f 20 4c 4f 4e 47 45 52 20 54 52 55 45 3a   NO LONGER TRUE:
8580: 0a 2a 2a 20 20 20 54 6f 20 72 65 73 6f 6c 76 65  .**   To resolve
8590: 20 61 20 63 6f 6e 66 6c 69 63 74 2c 20 66 69 72   a conflict, fir
85a0: 73 74 20 6c 6f 6f 6b 20 74 6f 20 73 65 65 20 69  st look to see i
85b0: 66 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 0a  f either action.
85c0: 2a 2a 20 20 20 69 73 20 6f 6e 20 61 6e 20 65 72  **   is on an er
85d0: 72 6f 72 20 72 75 6c 65 2e 20 20 49 6e 20 74 68  ror rule.  In th
85e0: 61 74 20 63 61 73 65 2c 20 74 61 6b 65 20 74 68  at case, take th
85f0: 65 20 61 63 74 69 6f 6e 20 77 68 69 63 68 0a 2a  e action which.*
8600: 2a 20 20 20 69 73 20 6e 6f 74 20 61 73 73 6f 63  *   is not assoc
8610: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 65  iated with the e
8620: 72 72 6f 72 20 72 75 6c 65 2e 20 20 49 66 20 6e  rror rule.  If n
8630: 65 69 74 68 65 72 20 6f 72 20 62 6f 74 68 0a 2a  either or both.*
8640: 2a 20 20 20 61 63 74 69 6f 6e 73 20 61 72 65 20  *   actions are 
8650: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8660: 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2c 20 74  an error rule, t
8670: 68 65 6e 20 74 72 79 20 74 6f 0a 2a 2a 20 20 20  hen try to.**   
8680: 75 73 65 20 70 72 65 63 65 64 65 6e 63 65 20 74  use precedence t
8690: 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 63 6f  o resolve the co
86a0: 6e 66 6c 69 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  nflict..**.** If
86b0: 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 20 69   either action i
86c0: 73 20 61 20 53 48 49 46 54 2c 20 74 68 65 6e 20  s a SHIFT, then 
86d0: 69 74 20 6d 75 73 74 20 62 65 20 61 70 78 2e 20  it must be apx. 
86e0: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
86f0: 6e 20 77 6f 6e 27 74 20 77 6f 72 6b 20 69 66 20  n won't work if 
8700: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43  apx->type==REDUC
8710: 45 20 61 6e 64 20 61 70 79 2d 3e 74 79 70 65 3d  E and apy->type=
8720: 3d 53 48 49 46 54 2e 0a 2a 2f 0a 73 74 61 74 69  =SHIFT..*/.stati
8730: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f  c int resolve_co
8740: 6e 66 6c 69 63 74 28 61 70 78 2c 61 70 79 2c 65  nflict(apx,apy,e
8750: 72 72 73 79 6d 29 0a 73 74 72 75 63 74 20 61 63  rrsym).struct ac
8760: 74 69 6f 6e 20 2a 61 70 78 3b 0a 73 74 72 75 63  tion *apx;.struc
8770: 74 20 61 63 74 69 6f 6e 20 2a 61 70 79 3b 0a 73  t action *apy;.s
8780: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65 72  truct symbol *er
8790: 72 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65 20 65  rsym;   /* The e
87a0: 72 72 6f 72 20 73 79 6d 62 6f 6c 20 28 69 66 20  rror symbol (if 
87b0: 64 65 66 69 6e 65 64 2e 20 20 4e 55 4c 4c 20 6f  defined.  NULL o
87c0: 74 68 65 72 77 69 73 65 29 20 2a 2f 0a 7b 0a 20  therwise) */.{. 
87d0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
87e0: 73 70 78 2c 20 2a 73 70 79 3b 0a 20 20 69 6e 74  spx, *spy;.  int
87f0: 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61   errcnt = 0;.  a
8800: 73 73 65 72 74 28 20 61 70 78 2d 3e 73 70 3d 3d  ssert( apx->sp==
8810: 61 70 79 2d 3e 73 70 20 29 3b 20 20 2f 2a 20 4f  apy->sp );  /* O
8820: 74 68 65 72 77 69 73 65 20 74 68 65 72 65 20 77  therwise there w
8830: 6f 75 6c 64 20 62 65 20 6e 6f 20 63 6f 6e 66 6c  ould be no confl
8840: 69 63 74 20 2a 2f 0a 20 20 69 66 28 20 61 70 78  ict */.  if( apx
8850: 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26 26  ->type==SHIFT &&
8860: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46   apy->type==SHIF
8870: 54 20 29 7b 0a 20 20 20 20 61 70 79 2d 3e 74 79  T ){.    apy->ty
8880: 70 65 20 3d 20 53 53 43 4f 4e 46 4c 49 43 54 3b  pe = SSCONFLICT;
8890: 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20  .    errcnt++;. 
88a0: 20 7d 0a 20 20 69 66 28 20 61 70 78 2d 3e 74 79   }.  if( apx->ty
88b0: 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70 79  pe==SHIFT && apy
88c0: 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29  ->type==REDUCE )
88d0: 7b 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d  {.    spx = apx-
88e0: 3e 73 70 3b 0a 20 20 20 20 73 70 79 20 3d 20 61  >sp;.    spy = a
88f0: 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79  py->x.rp->precsy
8900: 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 79 3d 3d  m;.    if( spy==
8910: 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30  0 || spx->prec<0
8920: 20 7c 7c 20 73 70 79 2d 3e 70 72 65 63 3c 30 20   || spy->prec<0 
8930: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ){.      /* Not 
8940: 65 6e 6f 75 67 68 20 70 72 65 63 65 64 65 6e 63  enough precedenc
8950: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a  e information. *
8960: 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  /.      apy->typ
8970: 65 20 3d 20 53 52 43 4f 4e 46 4c 49 43 54 3b 0a  e = SRCONFLICT;.
8980: 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a        errcnt++;.
8990: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
89a0: 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72 65  x->prec>spy->pre
89b0: 63 20 29 7b 20 20 20 20 2f 2a 20 4c 6f 77 65 72  c ){    /* Lower
89c0: 20 70 72 65 63 65 64 65 6e 63 65 20 77 69 6e 73   precedence wins
89d0: 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   */.      apy->t
89e0: 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45  ype = RD_RESOLVE
89f0: 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  D;.    }else if(
8a00: 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e   spx->prec<spy->
8a10: 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70  prec ){.      ap
8a20: 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52 45 53  x->type = SH_RES
8a30: 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65  OLVED;.    }else
8a40: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d   if( spx->prec==
8a50: 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78  spy->prec && spx
8a60: 2d 3e 61 73 73 6f 63 3d 3d 52 49 47 48 54 20 29  ->assoc==RIGHT )
8a70: 7b 20 2f 2a 20 55 73 65 20 6f 70 65 72 61 74 6f  { /* Use operato
8a80: 72 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e  r */.      apy->
8a90: 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56  type = RD_RESOLV
8aa0: 45 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ED;             
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ac0: 2f 2a 20 61 73 73 6f 63 69 61 74 69 76 69 74 79  /* associativity
8ad0: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   */.    }else if
8ae0: 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  ( spx->prec==spy
8af0: 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61  ->prec && spx->a
8b00: 73 73 6f 63 3d 3d 4c 45 46 54 20 29 7b 20 20 2f  ssoc==LEFT ){  /
8b10: 2a 20 74 6f 20 62 72 65 61 6b 20 74 69 65 20 2a  * to break tie *
8b20: 2f 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  /.      apx->typ
8b30: 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b  e = SH_RESOLVED;
8b40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8b50: 20 20 61 73 73 65 72 74 28 20 73 70 78 2d 3e 70    assert( spx->p
8b60: 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26  rec==spy->prec &
8b70: 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4e 4f  & spx->assoc==NO
8b80: 4e 45 20 29 3b 0a 20 20 20 20 20 20 61 70 79 2d  NE );.      apy-
8b90: 3e 74 79 70 65 20 3d 20 53 52 43 4f 4e 46 4c 49  >type = SRCONFLI
8ba0: 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e 74  CT;.      errcnt
8bb0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
8bc0: 65 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d  e if( apx->type=
8bd0: 3d 52 45 44 55 43 45 20 26 26 20 61 70 79 2d 3e  =REDUCE && apy->
8be0: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a  type==REDUCE ){.
8bf0: 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e 78      spx = apx->x
8c00: 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20  .rp->precsym;.  
8c10: 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72    spy = apy->x.r
8c20: 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20  p->precsym;.    
8c30: 69 66 28 20 73 70 78 3d 3d 30 20 7c 7c 20 73 70  if( spx==0 || sp
8c40: 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65  y==0 || spx->pre
8c50: 63 3c 30 20 7c 7c 0a 20 20 20 20 73 70 79 2d 3e  c<0 ||.    spy->
8c60: 70 72 65 63 3c 30 20 7c 7c 20 73 70 78 2d 3e 70  prec<0 || spx->p
8c70: 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 29  rec==spy->prec )
8c80: 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  {.      apy->typ
8c90: 65 20 3d 20 52 52 43 4f 4e 46 4c 49 43 54 3b 0a  e = RRCONFLICT;.
8ca0: 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a        errcnt++;.
8cb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
8cc0: 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72 65  x->prec>spy->pre
8cd0: 63 20 29 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e  c ){.      apy->
8ce0: 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56  type = RD_RESOLV
8cf0: 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ED;.    }else if
8d00: 28 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d  ( spx->prec<spy-
8d10: 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61  >prec ){.      a
8d20: 70 78 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45  px->type = RD_RE
8d30: 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SOLVED;.    }.  
8d40: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
8d50: 74 28 20 0a 20 20 20 20 20 20 61 70 78 2d 3e 74  t( .      apx->t
8d60: 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44  ype==SH_RESOLVED
8d70: 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   ||.      apx->t
8d80: 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44  ype==RD_RESOLVED
8d90: 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   ||.      apx->t
8da0: 79 70 65 3d 3d 53 53 43 4f 4e 46 4c 49 43 54 20  ype==SSCONFLICT 
8db0: 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79  ||.      apx->ty
8dc0: 70 65 3d 3d 53 52 43 4f 4e 46 4c 49 43 54 20 7c  pe==SRCONFLICT |
8dd0: 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  |.      apx->typ
8de0: 65 3d 3d 52 52 43 4f 4e 46 4c 49 43 54 20 7c 7c  e==RRCONFLICT ||
8df0: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
8e00: 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c  ==SH_RESOLVED ||
8e10: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
8e20: 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c  ==RD_RESOLVED ||
8e30: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
8e40: 3d 3d 53 53 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a  ==SSCONFLICT ||.
8e50: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d        apy->type=
8e60: 3d 53 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20  =SRCONFLICT ||. 
8e70: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d       apy->type==
8e80: 52 52 43 4f 4e 46 4c 49 43 54 0a 20 20 20 20 29  RRCONFLICT.    )
8e90: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 52 45 44  ;.    /* The RED
8ea0: 55 43 45 2f 53 48 49 46 54 20 63 61 73 65 20 63  UCE/SHIFT case c
8eb0: 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20 62 65 63  annot happen bec
8ec0: 61 75 73 65 20 53 48 49 46 54 73 20 63 6f 6d 65  ause SHIFTs come
8ed0: 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 52   before.    ** R
8ee0: 45 44 55 43 45 73 20 6f 6e 20 74 68 65 20 6c 69  EDUCEs on the li
8ef0: 73 74 2e 20 20 49 66 20 77 65 20 72 65 61 63 68  st.  If we reach
8f00: 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d   this point it m
8f10: 75 73 74 20 62 65 20 62 65 63 61 75 73 65 0a 20  ust be because. 
8f20: 20 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65 72     ** the parser
8f30: 20 63 6f 6e 66 6c 69 63 74 20 68 61 64 20 61 6c   conflict had al
8f40: 72 65 61 64 79 20 62 65 65 6e 20 72 65 73 6f 6c  ready been resol
8f50: 76 65 64 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  ved. */.  }.  re
8f60: 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 2f  turn errcnt;.}./
8f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f80: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
8f90: 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e  ile "configlist.
8fa0: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
8fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
8fc0: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
8fd0: 70 72 6f 63 65 73 73 69 6e 67 20 61 20 63 6f 6e  processing a con
8fe0: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
8ff0: 61 6e 64 20 62 75 69 6c 64 69 6e 67 20 61 20 73  and building a s
9000: 74 61 74 65 0a 2a 2a 20 69 6e 20 74 68 65 20 4c  tate.** in the L
9010: 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
9020: 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69  rator..*/..stati
9030: 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  c struct config 
9040: 2a 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 20 20  *freelist = 0;  
9050: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
9060: 72 65 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ree configuratio
9070: 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ns */.static str
9080: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 75 72 72  uct config *curr
9090: 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ent = 0;       /
90a0: 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66  * Top of list of
90b0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
90c0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
90d0: 20 63 6f 6e 66 69 67 20 2a 2a 63 75 72 72 65 6e   config **curren
90e0: 74 65 6e 64 20 3d 20 30 3b 20 20 20 2f 2a 20 4c  tend = 0;   /* L
90f0: 61 73 74 20 6f 6e 20 6c 69 73 74 20 6f 66 20 63  ast on list of c
9100: 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74 69 63  onfigs */.static
9110: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
9120: 62 61 73 69 73 20 3d 20 30 3b 20 20 20 20 20 20  basis = 0;      
9130: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69 73     /* Top of lis
9140: 74 20 6f 66 20 62 61 73 69 73 20 63 6f 6e 66 69  t of basis confi
9150: 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  gs */.static str
9160: 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a 62 61 73  uct config **bas
9170: 69 73 65 6e 64 20 3d 20 30 3b 20 20 20 20 20 2f  isend = 0;     /
9180: 2a 20 45 6e 64 20 6f 66 20 6c 69 73 74 20 6f 66  * End of list of
9190: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 73 20 2a   basis configs *
91a0: 2f 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  /../* Return a p
91b0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
91c0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f  configuration */
91d0: 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74 20  .PRIVATE struct 
91e0: 63 6f 6e 66 69 67 20 2a 6e 65 77 63 6f 6e 66 69  config *newconfi
91f0: 67 28 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  g(){.  struct co
9200: 6e 66 69 67 20 2a 6e 65 77 3b 0a 20 20 69 66 28  nfig *new;.  if(
9210: 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a   freelist==0 ){.
9220: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
9230: 6e 74 20 61 6d 74 20 3d 20 33 3b 0a 20 20 20 20  nt amt = 3;.    
9240: 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75  freelist = (stru
9250: 63 74 20 63 6f 6e 66 69 67 20 2a 29 63 61 6c 6c  ct config *)call
9260: 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28  oc( amt, sizeof(
9270: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 29 20 29  struct config) )
9280: 3b 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c 69  ;.    if( freeli
9290: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  st==0 ){.      f
92a0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55  printf(stderr,"U
92b0: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
92c0: 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e  e memory for a n
92d0: 65 77 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ew configuration
92e0: 2e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  .");.      exit(
92f0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  1);.    }.    fo
9300: 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20  r(i=0; i<amt-1; 
9310: 69 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69 5d  i++) freelist[i]
9320: 2e 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69 73  .next = &freelis
9330: 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65  t[i+1];.    free
9340: 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74  list[amt-1].next
9350: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 20   = 0;.  }.  new 
9360: 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72  = freelist;.  fr
9370: 65 65 6c 69 73 74 20 3d 20 66 72 65 65 6c 69 73  eelist = freelis
9380: 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72  t->next;.  retur
9390: 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  n new;.}../* The
93a0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22   configuration "
93b0: 6f 6c 64 22 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  old" is no longe
93c0: 72 20 75 73 65 64 20 2a 2f 0a 50 52 49 56 41 54  r used */.PRIVAT
93d0: 45 20 76 6f 69 64 20 64 65 6c 65 74 65 63 6f 6e  E void deletecon
93e0: 66 69 67 28 6f 6c 64 29 0a 73 74 72 75 63 74 20  fig(old).struct 
93f0: 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 7b 0a 20  config *old;.{. 
9400: 20 6f 6c 64 2d 3e 6e 65 78 74 20 3d 20 66 72 65   old->next = fre
9410: 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73  elist;.  freelis
9420: 74 20 3d 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 49  t = old;.}../* I
9430: 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63  nitialized the c
9440: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
9450: 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69  t builder */.voi
9460: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69  d Configlist_ini
9470: 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d  t(){.  current =
9480: 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64   0;.  currentend
9490: 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20 62   = &current;.  b
94a0: 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69  asis = 0;.  basi
94b0: 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a 20  send = &basis;. 
94c0: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69   Configtable_ini
94d0: 74 28 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  t();.  return;.}
94e0: 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64  ../* Initialized
94f0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
9500: 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20  on list builder 
9510: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
9520: 73 74 5f 72 65 73 65 74 28 29 7b 0a 20 20 63 75  st_reset(){.  cu
9530: 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72  rrent = 0;.  cur
9540: 72 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65  rentend = &curre
9550: 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b  nt;.  basis = 0;
9560: 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62  .  basisend = &b
9570: 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61  asis;.  Configta
9580: 62 6c 65 5f 63 6c 65 61 72 28 30 29 3b 0a 20 20  ble_clear(0);.  
9590: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64  return;.}../* Ad
95a0: 64 20 61 6e 6f 74 68 65 72 20 63 6f 6e 66 69 67  d another config
95b0: 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63  uration to the c
95c0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
95d0: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
95e0: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61  ig *Configlist_a
95f0: 64 64 28 72 70 2c 64 6f 74 29 0a 73 74 72 75 63  dd(rp,dot).struc
9600: 74 20 72 75 6c 65 20 2a 72 70 3b 20 20 20 20 2f  t rule *rp;    /
9610: 2a 20 54 68 65 20 72 75 6c 65 20 2a 2f 0a 69 6e  * The rule */.in
9620: 74 20 64 6f 74 3b 20 20 20 20 20 20 20 20 20 20  t dot;          
9630: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20    /* Index into 
9640: 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 72  the RHS of the r
9650: 75 6c 65 20 77 68 65 72 65 20 74 68 65 20 64 6f  ule where the do
9660: 74 20 67 6f 65 73 20 2a 2f 0a 7b 0a 20 20 73 74  t goes */.{.  st
9670: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
9680: 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65  , model;..  asse
9690: 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d  rt( currentend!=
96a0: 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20  0 );.  model.rp 
96b0: 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f  = rp;.  model.do
96c0: 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d  t = dot;.  cfp =
96d0: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e   Configtable_fin
96e0: 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28  d(&model);.  if(
96f0: 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63   cfp==0 ){.    c
9700: 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29  fp = newconfig()
9710: 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70 20 3d 20  ;.    cfp->rp = 
9720: 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74  rp;.    cfp->dot
9730: 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d   = dot;.    cfp-
9740: 3e 66 77 73 20 3d 20 53 65 74 4e 65 77 28 29 3b  >fws = SetNew();
9750: 0a 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20  .    cfp->stp = 
9760: 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c 70  0;.    cfp->fplp
9770: 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30   = cfp->bplp = 0
9780: 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78 74 20  ;.    cfp->next 
9790: 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70  = 0;.    cfp->bp
97a0: 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72 72 65   = 0;.    *curre
97b0: 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20  ntend = cfp;.   
97c0: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63   currentend = &c
97d0: 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 43 6f  fp->next;.    Co
97e0: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74  nfigtable_insert
97f0: 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (cfp);.  }.  ret
9800: 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 41  urn cfp;.}../* A
9810: 64 64 20 61 20 62 61 73 69 73 20 63 6f 6e 66 69  dd a basis confi
9820: 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  guration to the 
9830: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
9840: 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e  st */.struct con
9850: 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f  fig *Configlist_
9860: 61 64 64 62 61 73 69 73 28 72 70 2c 64 6f 74 29  addbasis(rp,dot)
9870: 0a 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70  .struct rule *rp
9880: 3b 0a 69 6e 74 20 64 6f 74 3b 0a 7b 0a 20 20 73  ;.int dot;.{.  s
9890: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
98a0: 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73  p, model;..  ass
98b0: 65 72 74 28 20 62 61 73 69 73 65 6e 64 21 3d 30  ert( basisend!=0
98c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
98d0: 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20  rrentend!=0 );. 
98e0: 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a   model.rp = rp;.
98f0: 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f    model.dot = do
9900: 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  t;.  cfp = Confi
9910: 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64  gtable_find(&mod
9920: 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d  el);.  if( cfp==
9930: 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e  0 ){.    cfp = n
9940: 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20  ewconfig();.    
9950: 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20  cfp->rp = rp;.  
9960: 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74    cfp->dot = dot
9970: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d  ;.    cfp->fws =
9980: 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63   SetNew();.    c
9990: 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20  fp->stp = 0;.   
99a0: 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70   cfp->fplp = cfp
99b0: 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20  ->bplp = 0;.    
99c0: 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20  cfp->next = 0;. 
99d0: 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a     cfp->bp = 0;.
99e0: 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20      *currentend 
99f0: 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65  = cfp;.    curre
9a00: 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65  ntend = &cfp->ne
9a10: 78 74 3b 0a 20 20 20 20 2a 62 61 73 69 73 65 6e  xt;.    *basisen
9a20: 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 62 61 73  d = cfp;.    bas
9a30: 69 73 65 6e 64 20 3d 20 26 63 66 70 2d 3e 62 70  isend = &cfp->bp
9a40: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c  ;.    Configtabl
9a50: 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20  e_insert(cfp);. 
9a60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b   }.  return cfp;
9a70: 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74  .}../* Compute t
9a80: 68 65 20 63 6c 6f 73 75 72 65 20 6f 66 20 74 68  he closure of th
9a90: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
9aa0: 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  list */.void Con
9ab0: 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28  figlist_closure(
9ac0: 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
9ad0: 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74  on *lemp;.{.  st
9ae0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
9af0: 2c 20 2a 6e 65 77 63 66 70 3b 0a 20 20 73 74 72  , *newcfp;.  str
9b00: 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 6e  uct rule *rp, *n
9b10: 65 77 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73  ewrp;.  struct s
9b20: 79 6d 62 6f 6c 20 2a 73 70 2c 20 2a 78 73 70 3b  ymbol *sp, *xsp;
9b30: 0a 20 20 69 6e 74 20 69 2c 20 64 6f 74 3b 0a 0a  .  int i, dot;..
9b40: 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65 6e    assert( curren
9b50: 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 66 6f 72  tend!=0 );.  for
9b60: 28 63 66 70 3d 63 75 72 72 65 6e 74 3b 20 63 66  (cfp=current; cf
9b70: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
9b80: 29 7b 0a 20 20 20 20 72 70 20 3d 20 63 66 70 2d  ){.    rp = cfp-
9b90: 3e 72 70 3b 0a 20 20 20 20 64 6f 74 20 3d 20 63  >rp;.    dot = c
9ba0: 66 70 2d 3e 64 6f 74 3b 0a 20 20 20 20 69 66 28  fp->dot;.    if(
9bb0: 20 64 6f 74 3e 3d 72 70 2d 3e 6e 72 68 73 20 29   dot>=rp->nrhs )
9bc0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73   continue;.    s
9bd0: 70 20 3d 20 72 70 2d 3e 72 68 73 5b 64 6f 74 5d  p = rp->rhs[dot]
9be0: 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  ;.    if( sp->ty
9bf0: 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe==NONTERMINAL 
9c00: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d  ){.      if( sp-
9c10: 3e 72 75 6c 65 3d 3d 30 20 26 26 20 73 70 21 3d  >rule==0 && sp!=
9c20: 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a  lemp->errsym ){.
9c30: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
9c40: 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
9c50: 72 70 2d 3e 6c 69 6e 65 2c 22 4e 6f 6e 74 65 72  rp->line,"Nonter
9c60: 6d 69 6e 61 6c 20 5c 22 25 73 5c 22 20 68 61 73  minal \"%s\" has
9c70: 20 6e 6f 20 72 75 6c 65 73 2e 22 2c 0a 20 20 20   no rules.",.   
9c80: 20 20 20 20 20 20 20 73 70 2d 3e 6e 61 6d 65 29         sp->name)
9c90: 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e  ;.        lemp->
9ca0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
9cb0: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e 65    }.      for(ne
9cc0: 77 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 6e 65  wrp=sp->rule; ne
9cd0: 77 72 70 3b 20 6e 65 77 72 70 3d 6e 65 77 72 70  wrp; newrp=newrp
9ce0: 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20 20  ->nextlhs){.    
9cf0: 20 20 20 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e      newcfp = Con
9d00: 66 69 67 6c 69 73 74 5f 61 64 64 28 6e 65 77 72  figlist_add(newr
9d10: 70 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  p,0);.        fo
9d20: 72 28 69 3d 64 6f 74 2b 31 3b 20 69 3c 72 70 2d  r(i=dot+1; i<rp-
9d30: 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
9d40: 20 20 20 20 20 20 20 78 73 70 20 3d 20 72 70 2d         xsp = rp-
9d50: 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20  >rhs[i];.       
9d60: 20 20 20 69 66 28 20 78 73 70 2d 3e 74 79 70 65     if( xsp->type
9d70: 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  ==TERMINAL ){.  
9d80: 20 20 20 20 20 20 20 20 20 20 53 65 74 41 64 64            SetAdd
9d90: 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73 70  (newcfp->fws,xsp
9da0: 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
9db0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9dc0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
9dd0: 20 78 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54   xsp->type==MULT
9de0: 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
9df0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
9e10: 6b 3d 30 3b 20 6b 3c 78 73 70 2d 3e 6e 73 75 62  k=0; k<xsp->nsub
9e20: 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  sym; k++){.     
9e30: 20 20 20 20 20 20 20 20 20 53 65 74 41 64 64 28           SetAdd(
9e40: 6e 65 77 63 66 70 2d 3e 66 77 73 2c 20 78 73 70  newcfp->fws, xsp
9e50: 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e 69 6e 64  ->subsym[k]->ind
9e60: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ex);.           
9e70: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62   }.            b
9e80: 72 65 61 6b 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a  reak;..  }else{.
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74 55              SetU
9ea0: 6e 69 6f 6e 28 6e 65 77 63 66 70 2d 3e 66 77 73  nion(newcfp->fws
9eb0: 2c 78 73 70 2d 3e 66 69 72 73 74 73 65 74 29 3b  ,xsp->firstset);
9ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
9ed0: 20 78 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45   xsp->lambda==LE
9ee0: 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61  MON_FALSE ) brea
9ef0: 6b 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20  k;..  }..}.     
9f00: 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72     if( i==rp->nr
9f10: 68 73 20 29 20 50 6c 69 6e 6b 5f 61 64 64 28 26  hs ) Plink_add(&
9f20: 63 66 70 2d 3e 66 70 6c 70 2c 6e 65 77 63 66 70  cfp->fplp,newcfp
9f30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9f40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
9f50: 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f  ../* Sort the co
9f60: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
9f70: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
9f80: 69 73 74 5f 73 6f 72 74 28 29 7b 0a 20 20 63 75  ist_sort(){.  cu
9f90: 72 72 65 6e 74 20 3d 20 28 73 74 72 75 63 74 20  rrent = (struct 
9fa0: 63 6f 6e 66 69 67 20 2a 29 6d 73 6f 72 74 28 28  config *)msort((
9fb0: 63 68 61 72 20 2a 29 63 75 72 72 65 6e 74 2c 28  char *)current,(
9fc0: 63 68 61 72 20 2a 2a 29 26 28 63 75 72 72 65 6e  char **)&(curren
9fd0: 74 2d 3e 6e 65 78 74 29 2c 43 6f 6e 66 69 67 63  t->next),Configc
9fe0: 6d 70 29 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e  mp);.  currenten
9ff0: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  d = 0;.  return;
a000: 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20  .}../* Sort the 
a010: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
a020: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  ion list */.void
a030: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74   Configlist_sort
a040: 62 61 73 69 73 28 29 7b 0a 20 20 62 61 73 69 73  basis(){.  basis
a050: 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69   = (struct confi
a060: 67 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20  g *)msort((char 
a070: 2a 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72 20  *)current,(char 
a080: 2a 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 62 70  **)&(current->bp
a090: 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20  ),Configcmp);.  
a0a0: 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20  basisend = 0;.  
a0b0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65  return;.}../* Re
a0c0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
a0d0: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
a0e0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
a0f0: 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65  list and.** rese
a100: 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74  t the list */.st
a110: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
a120: 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29  figlist_return()
a130: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
a140: 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20  g *old;.  old = 
a150: 63 75 72 72 65 6e 74 3b 0a 20 20 63 75 72 72 65  current;.  curre
a160: 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e  nt = 0;.  curren
a170: 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  tend = 0;.  retu
a180: 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 52 65  rn old;.}../* Re
a190: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
a1a0: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
a1b0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
a1c0: 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65  list and.** rese
a1d0: 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74  t the list */.st
a1e0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
a1f0: 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29 7b  figlist_basis(){
a200: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
a210: 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 62   *old;.  old = b
a220: 61 73 69 73 3b 0a 20 20 62 61 73 69 73 20 3d 20  asis;.  basis = 
a230: 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20  0;.  basisend = 
a240: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b  0;.  return old;
a250: 0a 7d 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20  .}../* Free all 
a260: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
a270: 67 69 76 65 6e 20 63 6f 6e 66 69 67 75 72 61 74  given configurat
a280: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  ion list */.void
a290: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28   Configlist_eat(
a2a0: 63 66 70 29 0a 73 74 72 75 63 74 20 63 6f 6e 66  cfp).struct conf
a2b0: 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72  ig *cfp;.{.  str
a2c0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 78 74  uct config *next
a2d0: 63 66 70 3b 0a 20 20 66 6f 72 28 3b 20 63 66 70  cfp;.  for(; cfp
a2e0: 3b 20 63 66 70 3d 6e 65 78 74 63 66 70 29 7b 0a  ; cfp=nextcfp){.
a2f0: 20 20 20 20 6e 65 78 74 63 66 70 20 3d 20 63 66      nextcfp = cf
a300: 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 61 73 73  p->next;.    ass
a310: 65 72 74 28 20 63 66 70 2d 3e 66 70 6c 70 3d 3d  ert( cfp->fplp==
a320: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
a330: 20 63 66 70 2d 3e 62 70 6c 70 3d 3d 30 20 29 3b   cfp->bplp==0 );
a340: 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 66 77  .    if( cfp->fw
a350: 73 20 29 20 53 65 74 46 72 65 65 28 63 66 70 2d  s ) SetFree(cfp-
a360: 3e 66 77 73 29 3b 0a 20 20 20 20 64 65 6c 65 74  >fws);.    delet
a370: 65 63 6f 6e 66 69 67 28 63 66 70 29 3b 0a 20 20  econfig(cfp);.  
a380: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 2f 2a  }.  return;.}./*
a390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3a0: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
a3b0: 65 72 72 6f 72 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  error.c" *******
a3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
a3e0: 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 69 6e 74  * Code for print
a3f0: 69 6e 67 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ing error messag
a400: 65 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e 64 20 61  e..*/../* Find a
a410: 20 67 6f 6f 64 20 70 6c 61 63 65 20 74 6f 20 62   good place to b
a420: 72 65 61 6b 20 22 6d 73 67 22 20 73 6f 20 74 68  reak "msg" so th
a430: 61 74 20 69 74 73 20 6c 65 6e 67 74 68 20 69 73  at its length is
a440: 20 61 74 20 6c 65 61 73 74 20 22 6d 69 6e 22 0a   at least "min".
a450: 2a 2a 20 62 75 74 20 6e 6f 20 6d 6f 72 65 20 74  ** but no more t
a460: 68 61 6e 20 22 6d 61 78 22 2e 20 20 4d 61 6b 65  han "max".  Make
a470: 20 74 68 65 20 70 6f 69 6e 74 20 61 73 20 63 6c   the point as cl
a480: 6f 73 65 20 74 6f 20 6d 61 78 20 61 73 20 70 6f  ose to max as po
a490: 73 73 69 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  ssible..*/.stati
a4a0: 63 20 69 6e 74 20 66 69 6e 64 62 72 65 61 6b 28  c int findbreak(
a4b0: 6d 73 67 2c 6d 69 6e 2c 6d 61 78 29 0a 63 68 61  msg,min,max).cha
a4c0: 72 20 2a 6d 73 67 3b 0a 69 6e 74 20 6d 69 6e 3b  r *msg;.int min;
a4d0: 0a 69 6e 74 20 6d 61 78 3b 0a 7b 0a 20 20 69 6e  .int max;.{.  in
a4e0: 74 20 69 2c 73 70 6f 74 3b 0a 20 20 63 68 61 72  t i,spot;.  char
a4f0: 20 63 3b 0a 20 20 66 6f 72 28 69 3d 73 70 6f 74   c;.  for(i=spot
a500: 3d 6d 69 6e 3b 20 69 3c 3d 6d 61 78 3b 20 69 2b  =min; i<=max; i+
a510: 2b 29 7b 0a 20 20 20 20 63 20 3d 20 6d 73 67 5b  +){.    c = msg[
a520: 69 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  i];.    if( c=='
a530: 5c 74 27 20 29 20 6d 73 67 5b 69 5d 20 3d 20 27  \t' ) msg[i] = '
a540: 20 27 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   ';.    if( c=='
a550: 5c 6e 27 20 29 7b 20 6d 73 67 5b 69 5d 20 3d 20  \n' ){ msg[i] = 
a560: 27 20 27 3b 20 73 70 6f 74 20 3d 20 69 3b 20 62  ' '; spot = i; b
a570: 72 65 61 6b 3b 20 7d 0a 20 20 20 20 69 66 28 20  reak; }.    if( 
a580: 63 3d 3d 30 20 29 7b 20 73 70 6f 74 20 3d 20 69  c==0 ){ spot = i
a590: 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 69  ; break; }.    i
a5a0: 66 28 20 63 3d 3d 27 2d 27 20 26 26 20 69 3c 6d  f( c=='-' && i<m
a5b0: 61 78 2d 31 20 29 20 73 70 6f 74 20 3d 20 69 2b  ax-1 ) spot = i+
a5c0: 31 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 20  1;.    if( c==' 
a5d0: 27 20 29 20 73 70 6f 74 20 3d 20 69 3b 0a 20 20  ' ) spot = i;.  
a5e0: 7d 0a 20 20 72 65 74 75 72 6e 20 73 70 6f 74 3b  }.  return spot;
a5f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 72  .}../*.** The er
a600: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
a610: 70 6c 69 74 20 61 63 72 6f 73 73 20 6d 75 6c 74  plit across mult
a620: 69 70 6c 65 20 6c 69 6e 65 73 20 69 66 20 6e 65  iple lines if ne
a630: 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a  cessary.  The.**
a640: 20 73 70 6c 69 74 73 20 6f 63 63 75 72 20 61 74   splits occur at
a650: 20 61 20 73 70 61 63 65 2c 20 69 66 20 74 68 65   a space, if the
a660: 72 65 20 69 73 20 61 20 73 70 61 63 65 20 61 76  re is a space av
a670: 61 69 6c 61 62 6c 65 20 6e 65 61 72 20 74 68 65  ailable near the
a680: 20 65 6e 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6c   end.** of the l
a690: 69 6e 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ine..*/.#define 
a6a0: 45 52 52 4d 53 47 53 49 5a 45 20 20 31 30 30 30  ERRMSGSIZE  1000
a6b0: 30 20 2f 2a 20 48 6f 70 65 20 74 68 69 73 20 69  0 /* Hope this i
a6c0: 73 20 62 69 67 20 65 6e 6f 75 67 68 2e 20 20 4e  s big enough.  N
a6d0: 6f 20 77 61 79 20 74 6f 20 65 72 72 6f 72 20 63  o way to error c
a6e0: 68 65 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  heck */.#define 
a6f0: 4c 49 4e 45 57 49 44 54 48 20 20 20 20 20 20 37  LINEWIDTH      7
a700: 39 20 2f 2a 20 4d 61 78 20 77 69 64 74 68 20 6f  9 /* Max width o
a710: 66 20 61 6e 79 20 6f 75 74 70 75 74 20 6c 69 6e  f any output lin
a720: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 45  e */.#define PRE
a730: 46 49 58 4c 49 4d 49 54 20 20 20 20 33 30 20 2f  FIXLIMIT    30 /
a740: 2a 20 4d 61 78 20 77 69 64 74 68 20 6f 66 20 74  * Max width of t
a750: 68 65 20 70 72 65 66 69 78 20 6f 6e 20 65 61 63  he prefix on eac
a760: 68 20 6c 69 6e 65 20 2a 2f 0a 76 6f 69 64 20 45  h line */.void E
a770: 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63 68  rrorMsg(const ch
a780: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 69 6e  ar *filename, in
a790: 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20  t lineno, const 
a7a0: 63 68 61 72 20 2a 66 6f 72 6d 61 74 2c 20 2e 2e  char *format, ..
a7b0: 2e 29 7b 0a 20 20 63 68 61 72 20 65 72 72 6d 73  .){.  char errms
a7c0: 67 5b 45 52 52 4d 53 47 53 49 5a 45 5d 3b 0a 20  g[ERRMSGSIZE];. 
a7d0: 20 63 68 61 72 20 70 72 65 66 69 78 5b 50 52 45   char prefix[PRE
a7e0: 46 49 58 4c 49 4d 49 54 2b 31 30 5d 3b 0a 20 20  FIXLIMIT+10];.  
a7f0: 69 6e 74 20 65 72 72 6d 73 67 73 69 7a 65 3b 0a  int errmsgsize;.
a800: 20 20 69 6e 74 20 70 72 65 66 69 78 73 69 7a 65    int prefixsize
a810: 3b 0a 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c  ;.  int availabl
a820: 65 77 69 64 74 68 3b 0a 20 20 76 61 5f 6c 69 73  ewidth;.  va_lis
a830: 74 20 61 70 3b 0a 20 20 69 6e 74 20 65 6e 64 2c  t ap;.  int end,
a840: 20 72 65 73 74 61 72 74 2c 20 62 61 73 65 3b 0a   restart, base;.
a850: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
a860: 66 6f 72 6d 61 74 29 3b 0a 20 20 2f 2a 20 50 72  format);.  /* Pr
a870: 65 70 61 72 65 20 61 20 70 72 65 66 69 78 20 74  epare a prefix t
a880: 6f 20 62 65 20 70 72 65 70 65 6e 64 65 64 20 74  o be prepended t
a890: 6f 20 65 76 65 72 79 20 6f 75 74 70 75 74 20 6c  o every output l
a8a0: 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 6c 69 6e  ine */.  if( lin
a8b0: 65 6e 6f 3e 30 20 29 7b 0a 20 20 20 20 73 70 72  eno>0 ){.    spr
a8c0: 69 6e 74 66 28 70 72 65 66 69 78 2c 22 25 2e 2a  intf(prefix,"%.*
a8d0: 73 3a 25 64 3a 20 22 2c 50 52 45 46 49 58 4c 49  s:%d: ",PREFIXLI
a8e0: 4d 49 54 2d 31 30 2c 66 69 6c 65 6e 61 6d 65 2c  MIT-10,filename,
a8f0: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65  lineno);.  }else
a900: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 70 72  {.    sprintf(pr
a910: 65 66 69 78 2c 22 25 2e 2a 73 3a 20 22 2c 50 52  efix,"%.*s: ",PR
a920: 45 46 49 58 4c 49 4d 49 54 2d 31 30 2c 66 69 6c  EFIXLIMIT-10,fil
a930: 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 72  ename);.  }.  pr
a940: 65 66 69 78 73 69 7a 65 20 3d 20 6c 65 6d 6f 6e  efixsize = lemon
a950: 53 74 72 6c 65 6e 28 70 72 65 66 69 78 29 3b 0a  Strlen(prefix);.
a960: 20 20 61 76 61 69 6c 61 62 6c 65 77 69 64 74 68    availablewidth
a970: 20 3d 20 4c 49 4e 45 57 49 44 54 48 20 2d 20 70   = LINEWIDTH - p
a980: 72 65 66 69 78 73 69 7a 65 3b 0a 0a 20 20 2f 2a  refixsize;..  /*
a990: 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 72   Generate the er
a9a0: 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20  ror message */. 
a9b0: 20 76 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67   vsprintf(errmsg
a9c0: 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76  ,format,ap);.  v
a9d0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 65 72 72  a_end(ap);.  err
a9e0: 6d 73 67 73 69 7a 65 20 3d 20 6c 65 6d 6f 6e 53  msgsize = lemonS
a9f0: 74 72 6c 65 6e 28 65 72 72 6d 73 67 29 3b 0a 20  trlen(errmsg);. 
aa00: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 72 61 69 6c   /* Remove trail
aa10: 69 6e 67 20 27 5c 6e 27 73 20 66 72 6f 6d 20 74  ing '\n's from t
aa20: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
aa30: 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 65 72  . */.  while( er
aa40: 72 6d 73 67 73 69 7a 65 3e 30 20 26 26 20 65 72  rmsgsize>0 && er
aa50: 72 6d 73 67 5b 65 72 72 6d 73 67 73 69 7a 65 2d  rmsg[errmsgsize-
aa60: 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  1]=='\n' ){.    
aa70: 20 65 72 72 6d 73 67 5b 2d 2d 65 72 72 6d 73 67   errmsg[--errmsg
aa80: 73 69 7a 65 5d 20 3d 20 30 3b 0a 20 20 7d 0a 0a  size] = 0;.  }..
aa90: 20 20 2f 2a 20 50 72 69 6e 74 20 74 68 65 20 65    /* Print the e
aaa0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a  rror message */.
aab0: 20 20 62 61 73 65 20 3d 20 30 3b 0a 20 20 77 68    base = 0;.  wh
aac0: 69 6c 65 28 20 65 72 72 6d 73 67 5b 62 61 73 65  ile( errmsg[base
aad0: 5d 21 3d 30 20 29 7b 0a 20 20 20 20 65 6e 64 20  ]!=0 ){.    end 
aae0: 3d 20 72 65 73 74 61 72 74 20 3d 20 66 69 6e 64  = restart = find
aaf0: 62 72 65 61 6b 28 26 65 72 72 6d 73 67 5b 62 61  break(&errmsg[ba
ab00: 73 65 5d 2c 30 2c 61 76 61 69 6c 61 62 6c 65 77  se],0,availablew
ab10: 69 64 74 68 29 3b 0a 20 20 20 20 72 65 73 74 61  idth);.    resta
ab20: 72 74 20 2b 3d 20 62 61 73 65 3b 0a 20 20 20 20  rt += base;.    
ab30: 77 68 69 6c 65 28 20 65 72 72 6d 73 67 5b 72 65  while( errmsg[re
ab40: 73 74 61 72 74 5d 3d 3d 27 20 27 20 29 20 72 65  start]==' ' ) re
ab50: 73 74 61 72 74 2b 2b 3b 0a 20 20 20 20 66 70 72  start++;.    fpr
ab60: 69 6e 74 66 28 73 74 64 6f 75 74 2c 22 25 73 25  intf(stdout,"%s%
ab70: 2e 2a 73 5c 6e 22 2c 70 72 65 66 69 78 2c 65 6e  .*s\n",prefix,en
ab80: 64 2c 26 65 72 72 6d 73 67 5b 62 61 73 65 5d 29  d,&errmsg[base])
ab90: 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 72 65 73  ;.    base = res
aba0: 74 61 72 74 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a  tart;.  }.}./***
abb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
abc0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6d 61 69  om the file "mai
abd0: 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n.c" ***********
abe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
abf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
ac00: 20 4d 61 69 6e 20 70 72 6f 67 72 61 6d 20 66 69   Main program fi
ac10: 6c 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e  le for the LEMON
ac20: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
ac30: 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74  r..*/../* Report
ac40: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
ac50: 79 20 63 6f 6e 64 69 74 69 6f 6e 20 61 6e 64 20  y condition and 
ac60: 61 62 6f 72 74 2e 20 20 54 68 69 73 20 66 75 6e  abort.  This fun
ac70: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ction.** is used
ac80: 20 6d 6f 73 74 6c 79 20 62 79 20 74 68 65 20 22   mostly by the "
ac90: 4d 65 6d 6f 72 79 43 68 65 63 6b 22 20 6d 61 63  MemoryCheck" mac
aca0: 72 6f 20 69 6e 20 73 74 72 75 63 74 2e 68 0a 2a  ro in struct.h.*
acb0: 2f 0a 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72  /.void memory_er
acc0: 72 6f 72 28 29 7b 0a 20 20 66 70 72 69 6e 74 66  ror(){.  fprintf
acd0: 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20  (stderr,"Out of 
ace0: 6d 65 6d 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e  memory.  Abortin
acf0: 67 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74  g...\n");.  exit
ad00: 28 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  (1);.}..static i
ad10: 6e 74 20 6e 44 65 66 69 6e 65 20 3d 20 30 3b 20  nt nDefine = 0; 
ad20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ad30: 66 20 2d 44 20 6f 70 74 69 6f 6e 73 20 6f 6e 20  f -D options on 
ad40: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
ad50: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
ad60: 2a 2a 61 7a 44 65 66 69 6e 65 20 3d 20 30 3b 20  **azDefine = 0; 
ad70: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
ad80: 2d 44 20 6d 61 63 72 6f 73 20 2a 2f 0a 0a 2f 2a  -D macros */../*
ad90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
ada0: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
adb0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 65 61 63   argument to eac
adc0: 68 20 2d 44 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  h -D command-lin
add0: 65 20 6f 70 74 69 6f 6e 2e 0a 2a 2a 20 41 64 64  e option..** Add
ade0: 20 74 68 65 20 6d 61 63 72 6f 20 64 65 66 69 6e   the macro defin
adf0: 65 64 20 74 6f 20 74 68 65 20 61 7a 44 65 66 69  ed to the azDefi
ae00: 6e 65 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  ne array..*/.sta
ae10: 74 69 63 20 76 6f 69 64 20 68 61 6e 64 6c 65 5f  tic void handle_
ae20: 44 5f 6f 70 74 69 6f 6e 28 63 68 61 72 20 2a 7a  D_option(char *z
ae30: 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 61 7a 3b  ){.  char **paz;
ae40: 0a 20 20 6e 44 65 66 69 6e 65 2b 2b 3b 0a 20 20  .  nDefine++;.  
ae50: 61 7a 44 65 66 69 6e 65 20 3d 20 72 65 61 6c 6c  azDefine = reall
ae60: 6f 63 28 61 7a 44 65 66 69 6e 65 2c 20 73 69 7a  oc(azDefine, siz
ae70: 65 6f 66 28 61 7a 44 65 66 69 6e 65 5b 30 5d 29  eof(azDefine[0])
ae80: 2a 6e 44 65 66 69 6e 65 29 3b 0a 20 20 69 66 28  *nDefine);.  if(
ae90: 20 61 7a 44 65 66 69 6e 65 3d 3d 30 20 29 7b 0a   azDefine==0 ){.
aea0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
aeb0: 72 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  rr,"out of memor
aec0: 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  y\n");.    exit(
aed0: 31 29 3b 0a 20 20 7d 0a 20 20 70 61 7a 20 3d 20  1);.  }.  paz = 
aee0: 26 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69 6e  &azDefine[nDefin
aef0: 65 2d 31 5d 3b 0a 20 20 2a 70 61 7a 20 3d 20 6d  e-1];.  *paz = m
af00: 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c  alloc( lemonStrl
af10: 65 6e 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28  en(z)+1 );.  if(
af20: 20 2a 70 61 7a 3d 3d 30 20 29 7b 0a 20 20 20 20   *paz==0 ){.    
af30: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
af40: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
af50: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
af60: 20 20 7d 0a 20 20 73 74 72 63 70 79 28 2a 70 61    }.  strcpy(*pa
af70: 7a 2c 20 7a 29 3b 0a 20 20 66 6f 72 28 7a 3d 2a  z, z);.  for(z=*
af80: 70 61 7a 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d 27  paz; *z && *z!='
af90: 3d 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20 2a 7a 20  ='; z++){}.  *z 
afa0: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 20 54 68 65 20  = 0;.}.../* The 
afb0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 20 50  main program.  P
afc0: 61 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64  arse the command
afd0: 20 6c 69 6e 65 20 61 6e 64 20 64 6f 20 69 74 2e   line and do it.
afe0: 2e 2e 20 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28 61  .. */.int main(a
aff0: 72 67 63 2c 61 72 67 76 29 0a 69 6e 74 20 61 72  rgc,argv).int ar
b000: 67 63 3b 0a 63 68 61 72 20 2a 2a 61 72 67 76 3b  gc;.char **argv;
b010: 0a 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  .{.  static int 
b020: 76 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73  version = 0;.  s
b030: 74 61 74 69 63 20 69 6e 74 20 72 70 66 6c 61 67  tatic int rpflag
b040: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
b050: 6e 74 20 62 61 73 69 73 66 6c 61 67 20 3d 20 30  nt basisflag = 0
b060: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  ;.  static int c
b070: 6f 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20 20 73  ompress = 0;.  s
b080: 74 61 74 69 63 20 69 6e 74 20 71 75 69 65 74 20  tatic int quiet 
b090: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
b0a0: 74 20 73 74 61 74 69 73 74 69 63 73 20 3d 20 30  t statistics = 0
b0b0: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6d  ;.  static int m
b0c0: 68 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61  hflag = 0;.  sta
b0d0: 74 69 63 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f  tic int nolineno
b0e0: 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61  sflag = 0;.  sta
b0f0: 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74  tic struct s_opt
b100: 69 6f 6e 73 20 6f 70 74 69 6f 6e 73 5b 5d 20 3d  ions options[] =
b110: 20 7b 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47   {.    {OPT_FLAG
b120: 2c 20 22 62 22 2c 20 28 63 68 61 72 2a 29 26 62  , "b", (char*)&b
b130: 61 73 69 73 66 6c 61 67 2c 20 22 50 72 69 6e 74  asisflag, "Print
b140: 20 6f 6e 6c 79 20 74 68 65 20 62 61 73 69 73 20   only the basis 
b150: 69 6e 20 72 65 70 6f 72 74 2e 22 7d 2c 0a 20 20  in report."},.  
b160: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 63 22    {OPT_FLAG, "c"
b170: 2c 20 28 63 68 61 72 2a 29 26 63 6f 6d 70 72 65  , (char*)&compre
b180: 73 73 2c 20 22 44 6f 6e 27 74 20 63 6f 6d 70 72  ss, "Don't compr
b190: 65 73 73 20 74 68 65 20 61 63 74 69 6f 6e 20 74  ess the action t
b1a0: 61 62 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  able."},.    {OP
b1b0: 54 5f 46 53 54 52 2c 20 22 44 22 2c 20 28 63 68  T_FSTR, "D", (ch
b1c0: 61 72 2a 29 68 61 6e 64 6c 65 5f 44 5f 6f 70 74  ar*)handle_D_opt
b1d0: 69 6f 6e 2c 20 22 44 65 66 69 6e 65 20 61 6e 20  ion, "Define an 
b1e0: 25 69 66 64 65 66 20 6d 61 63 72 6f 2e 22 7d 2c  %ifdef macro."},
b1f0: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
b200: 22 67 22 2c 20 28 63 68 61 72 2a 29 26 72 70 66  "g", (char*)&rpf
b210: 6c 61 67 2c 20 22 50 72 69 6e 74 20 67 72 61 6d  lag, "Print gram
b220: 6d 61 72 20 77 69 74 68 6f 75 74 20 61 63 74 69  mar without acti
b230: 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ons."},.    {OPT
b240: 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28 63 68 61  _FLAG, "m", (cha
b250: 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22 4f 75 74  r*)&mhflag, "Out
b260: 70 75 74 20 61 20 6d 61 6b 65 68 65 61 64 65 72  put a makeheader
b270: 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c  s compatible fil
b280: 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  e."},.    {OPT_F
b290: 4c 41 47 2c 20 22 6c 22 2c 20 28 63 68 61 72 2a  LAG, "l", (char*
b2a0: 29 26 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 2c  )&nolinenosflag,
b2b0: 20 22 44 6f 20 6e 6f 74 20 70 72 69 6e 74 20 23   "Do not print #
b2c0: 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e 74 73 2e  line statements.
b2d0: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
b2e0: 47 2c 20 22 71 22 2c 20 28 63 68 61 72 2a 29 26  G, "q", (char*)&
b2f0: 71 75 69 65 74 2c 20 22 28 51 75 69 65 74 29 20  quiet, "(Quiet) 
b300: 44 6f 6e 27 74 20 70 72 69 6e 74 20 74 68 65 20  Don't print the 
b310: 72 65 70 6f 72 74 20 66 69 6c 65 2e 22 7d 2c 0a  report file."},.
b320: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
b330: 73 22 2c 20 28 63 68 61 72 2a 29 26 73 74 61 74  s", (char*)&stat
b340: 69 73 74 69 63 73 2c 0a 20 20 20 20 20 20 20 20  istics,.        
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b360: 20 20 20 20 20 20 20 20 20 20 20 22 50 72 69 6e             "Prin
b370: 74 20 70 61 72 73 65 72 20 73 74 61 74 73 20 74  t parser stats t
b380: 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75  o standard outpu
b390: 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  t."},.    {OPT_F
b3a0: 4c 41 47 2c 20 22 78 22 2c 20 28 63 68 61 72 2a  LAG, "x", (char*
b3b0: 29 26 76 65 72 73 69 6f 6e 2c 20 22 50 72 69 6e  )&version, "Prin
b3c0: 74 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75  t the version nu
b3d0: 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  mber."},.    {OP
b3e0: 54 5f 46 4c 41 47 2c 30 2c 30 2c 30 7d 0a 20 20  T_FLAG,0,0,0}.  
b3f0: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  };.  int i;.  st
b400: 72 75 63 74 20 6c 65 6d 6f 6e 20 6c 65 6d 3b 0a  ruct lemon lem;.
b410: 0a 20 20 4f 70 74 49 6e 69 74 28 61 72 67 76 2c  .  OptInit(argv,
b420: 6f 70 74 69 6f 6e 73 2c 73 74 64 65 72 72 29 3b  options,stderr);
b430: 0a 20 20 69 66 28 20 76 65 72 73 69 6f 6e 20 29  .  if( version )
b440: 7b 0a 20 20 20 20 20 70 72 69 6e 74 66 28 22 4c  {.     printf("L
b450: 65 6d 6f 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30  emon version 1.0
b460: 5c 6e 22 29 3b 0a 20 20 20 20 20 65 78 69 74 28  \n");.     exit(
b470: 30 29 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 4f  0); .  }.  if( O
b480: 70 74 4e 41 72 67 73 28 29 21 3d 31 20 29 7b 0a  ptNArgs()!=1 ){.
b490: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
b4a0: 72 72 2c 22 45 78 61 63 74 6c 79 20 6f 6e 65 20  rr,"Exactly one 
b4b0: 66 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  filename argumen
b4c0: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 5c 6e  t is required.\n
b4d0: 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
b4e0: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6c  .  }.  memset(&l
b4f0: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c 65  em, 0, sizeof(le
b500: 6d 29 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 6f 72  m));.  lem.error
b510: 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  cnt = 0;..  /* I
b520: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61  nitialize the ma
b530: 63 68 69 6e 65 20 2a 2f 0a 20 20 53 74 72 73 61  chine */.  Strsa
b540: 66 65 5f 69 6e 69 74 28 29 3b 0a 20 20 53 79 6d  fe_init();.  Sym
b550: 62 6f 6c 5f 69 6e 69 74 28 29 3b 0a 20 20 53 74  bol_init();.  St
b560: 61 74 65 5f 69 6e 69 74 28 29 3b 0a 20 20 6c 65  ate_init();.  le
b570: 6d 2e 61 72 67 76 30 20 3d 20 61 72 67 76 5b 30  m.argv0 = argv[0
b580: 5d 3b 0a 20 20 6c 65 6d 2e 66 69 6c 65 6e 61 6d  ];.  lem.filenam
b590: 65 20 3d 20 4f 70 74 41 72 67 28 30 29 3b 0a 20  e = OptArg(0);. 
b5a0: 20 6c 65 6d 2e 62 61 73 69 73 66 6c 61 67 20 3d   lem.basisflag =
b5b0: 20 62 61 73 69 73 66 6c 61 67 3b 0a 20 20 6c 65   basisflag;.  le
b5c0: 6d 2e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20  m.nolinenosflag 
b5d0: 3d 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 3b  = nolinenosflag;
b5e0: 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 24  .  Symbol_new("$
b5f0: 22 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d  ");.  lem.errsym
b600: 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 65   = Symbol_new("e
b610: 72 72 6f 72 22 29 3b 0a 20 20 6c 65 6d 2e 65 72  rror");.  lem.er
b620: 72 73 79 6d 2d 3e 75 73 65 43 6e 74 20 3d 20 30  rsym->useCnt = 0
b630: 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  ;..  /* Parse th
b640: 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
b650: 20 20 50 61 72 73 65 28 26 6c 65 6d 29 3b 0a 20    Parse(&lem);. 
b660: 20 69 66 28 20 6c 65 6d 2e 65 72 72 6f 72 63 6e   if( lem.errorcn
b670: 74 20 29 20 65 78 69 74 28 6c 65 6d 2e 65 72 72  t ) exit(lem.err
b680: 6f 72 63 6e 74 29 3b 0a 20 20 69 66 28 20 6c 65  orcnt);.  if( le
b690: 6d 2e 6e 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20  m.nrule==0 ){.  
b6a0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
b6b0: 2c 22 45 6d 70 74 79 20 67 72 61 6d 6d 61 72 2e  ,"Empty grammar.
b6c0: 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
b6d0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 75  );.  }..  /* Cou
b6e0: 6e 74 20 61 6e 64 20 69 6e 64 65 78 20 74 68 65  nt and index the
b6f0: 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20   symbols of the 
b700: 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 6c 65 6d  grammar */.  lem
b710: 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53 79 6d 62 6f  .nsymbol = Symbo
b720: 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20 20 53 79 6d  l_count();.  Sym
b730: 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c  bol_new("{defaul
b740: 74 7d 22 29 3b 0a 20 20 6c 65 6d 2e 73 79 6d 62  t}");.  lem.symb
b750: 6f 6c 73 20 3d 20 53 79 6d 62 6f 6c 5f 61 72 72  ols = Symbol_arr
b760: 61 79 6f 66 28 29 3b 0a 20 20 66 6f 72 28 69 3d  ayof();.  for(i=
b770: 30 3b 20 69 3c 3d 6c 65 6d 2e 6e 73 79 6d 62 6f  0; i<=lem.nsymbo
b780: 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62  l; i++) lem.symb
b790: 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d 20  ols[i]->index = 
b7a0: 69 3b 0a 20 20 71 73 6f 72 74 28 6c 65 6d 2e 73  i;.  qsort(lem.s
b7b0: 79 6d 62 6f 6c 73 2c 6c 65 6d 2e 6e 73 79 6d 62  ymbols,lem.nsymb
b7c0: 6f 6c 2b 31 2c 73 69 7a 65 6f 66 28 73 74 72 75  ol+1,sizeof(stru
b7d0: 63 74 20 73 79 6d 62 6f 6c 2a 29 2c 0a 20 20 20  ct symbol*),.   
b7e0: 20 20 20 20 20 28 69 6e 74 28 2a 29 28 29 29 53       (int(*)())S
b7f0: 79 6d 62 6f 6c 63 6d 70 70 29 3b 0a 20 20 66 6f  ymbolcmpp);.  fo
b800: 72 28 69 3d 30 3b 20 69 3c 3d 6c 65 6d 2e 6e 73  r(i=0; i<=lem.ns
b810: 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e  ymbol; i++) lem.
b820: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65  symbols[i]->inde
b830: 78 20 3d 20 69 3b 0a 20 20 66 6f 72 28 69 3d 31  x = i;.  for(i=1
b840: 3b 20 69 73 75 70 70 65 72 28 6c 65 6d 2e 73 79  ; isupper(lem.sy
b850: 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 5b 30  mbols[i]->name[0
b860: 5d 29 3b 20 69 2b 2b 29 3b 0a 20 20 6c 65 6d 2e  ]); i++);.  lem.
b870: 6e 74 65 72 6d 69 6e 61 6c 20 3d 20 69 3b 0a 0a  nterminal = i;..
b880: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
b890: 72 65 70 72 69 6e 74 20 6f 66 20 74 68 65 20 67  reprint of the g
b8a0: 72 61 6d 6d 61 72 2c 20 69 66 20 72 65 71 75 65  rammar, if reque
b8b0: 73 74 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  sted on the comm
b8c0: 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 66  and line */.  if
b8d0: 28 20 72 70 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( rpflag ){.    
b8e0: 52 65 70 72 69 6e 74 28 26 6c 65 6d 29 3b 0a 20  Reprint(&lem);. 
b8f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
b900: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 69  nitialize the si
b910: 7a 65 20 66 6f 72 20 61 6c 6c 20 66 6f 6c 6c 6f  ze for all follo
b920: 77 20 61 6e 64 20 66 69 72 73 74 20 73 65 74 73  w and first sets
b930: 20 2a 2f 0a 20 20 20 20 53 65 74 53 69 7a 65 28   */.    SetSize(
b940: 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2b 31 29  lem.nterminal+1)
b950: 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74  ;..    /* Find t
b960: 68 65 20 70 72 65 63 65 64 65 6e 63 65 20 66 6f  he precedence fo
b970: 72 20 65 76 65 72 79 20 70 72 6f 64 75 63 74 69  r every producti
b980: 6f 6e 20 72 75 6c 65 20 28 74 68 61 74 20 68 61  on rule (that ha
b990: 73 20 6f 6e 65 29 20 2a 2f 0a 20 20 20 20 46 69  s one) */.    Fi
b9a0: 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65  ndRulePrecedence
b9b0: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
b9c0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 61 6d   Compute the lam
b9d0: 62 64 61 2d 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73  bda-nonterminals
b9e0: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 2d 73   and the first-s
b9f0: 65 74 73 20 66 6f 72 20 65 76 65 72 79 0a 20 20  ets for every.  
ba00: 20 20 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c    ** nonterminal
ba10: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 69 72 73   */.    FindFirs
ba20: 74 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  tSets(&lem);..  
ba30: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c    /* Compute all
ba40: 20 4c 52 28 30 29 20 73 74 61 74 65 73 2e 20 20   LR(0) states.  
ba50: 41 6c 73 6f 20 72 65 63 6f 72 64 20 66 6f 6c 6c  Also record foll
ba60: 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69  ow-set propagati
ba70: 6f 6e 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b 73 20  on.    ** links 
ba80: 73 6f 20 74 68 61 74 20 74 68 65 20 66 6f 6c 6c  so that the foll
ba90: 6f 77 2d 73 65 74 20 63 61 6e 20 62 65 20 63 6f  ow-set can be co
baa0: 6d 70 75 74 65 64 20 6c 61 74 65 72 20 2a 2f 0a  mputed later */.
bab0: 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74 65 20 3d      lem.nstate =
bac0: 20 30 3b 0a 20 20 20 20 46 69 6e 64 53 74 61 74   0;.    FindStat
bad0: 65 73 28 26 6c 65 6d 29 3b 0a 20 20 20 20 6c 65  es(&lem);.    le
bae0: 6d 2e 73 6f 72 74 65 64 20 3d 20 53 74 61 74 65  m.sorted = State
baf0: 5f 61 72 72 61 79 6f 66 28 29 3b 0a 0a 20 20 20  _arrayof();..   
bb00: 20 2f 2a 20 54 69 65 20 75 70 20 6c 6f 6f 73 65   /* Tie up loose
bb10: 20 65 6e 64 73 20 6f 6e 20 74 68 65 20 70 72 6f   ends on the pro
bb20: 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a  pagation links *
bb30: 2f 0a 20 20 20 20 46 69 6e 64 4c 69 6e 6b 73 28  /.    FindLinks(
bb40: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  &lem);..    /* C
bb50: 6f 6d 70 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f  ompute the follo
bb60: 77 20 73 65 74 20 6f 66 20 65 76 65 72 79 20 72  w set of every r
bb70: 65 64 75 63 69 62 6c 65 20 63 6f 6e 66 69 67 75  educible configu
bb80: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 46 69  ration */.    Fi
bb90: 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 26 6c 65  ndFollowSets(&le
bba0: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
bbb0: 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74  ute the action t
bbc0: 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 46 69 6e  ables */.    Fin
bbd0: 64 41 63 74 69 6f 6e 73 28 26 6c 65 6d 29 3b 0a  dActions(&lem);.
bbe0: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73  .    /* Compress
bbf0: 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
bc00: 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f  es */.    if( co
bc10: 6d 70 72 65 73 73 3d 3d 30 20 29 20 43 6f 6d 70  mpress==0 ) Comp
bc20: 72 65 73 73 54 61 62 6c 65 73 28 26 6c 65 6d 29  ressTables(&lem)
bc30: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6f 72 64 65  ;..    /* Reorde
bc40: 72 20 61 6e 64 20 72 65 6e 75 6d 62 65 72 20 74  r and renumber t
bc50: 68 65 20 73 74 61 74 65 73 20 73 6f 20 74 68 61  he states so tha
bc60: 74 20 73 74 61 74 65 73 20 77 69 74 68 20 66 65  t states with fe
bc70: 77 65 72 20 63 68 6f 69 63 65 73 0a 20 20 20 20  wer choices.    
bc80: 2a 2a 20 6f 63 63 75 72 20 61 74 20 74 68 65 20  ** occur at the 
bc90: 65 6e 64 2e 20 2a 2f 0a 20 20 20 20 52 65 73 6f  end. */.    Reso
bca0: 72 74 53 74 61 74 65 73 28 26 6c 65 6d 29 3b 0a  rtStates(&lem);.
bcb0: 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
bcc0: 20 61 20 72 65 70 6f 72 74 20 6f 66 20 74 68 65   a report of the
bcd0: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 65   parser generate
bce0: 64 2e 20 20 28 74 68 65 20 22 79 2e 6f 75 74 70  d.  (the "y.outp
bcf0: 75 74 22 20 66 69 6c 65 29 20 2a 2f 0a 20 20 20  ut" file) */.   
bd00: 20 69 66 28 20 21 71 75 69 65 74 20 29 20 52 65   if( !quiet ) Re
bd10: 70 6f 72 74 4f 75 74 70 75 74 28 26 6c 65 6d 29  portOutput(&lem)
bd20: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
bd30: 74 65 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f  te the source co
bd40: 64 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  de for the parse
bd50: 72 20 2a 2f 0a 20 20 20 20 52 65 70 6f 72 74 54  r */.    ReportT
bd60: 61 62 6c 65 28 26 6c 65 6d 2c 20 6d 68 66 6c 61  able(&lem, mhfla
bd70: 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 64  g);..    /* Prod
bd80: 75 63 65 20 61 20 68 65 61 64 65 72 20 66 69 6c  uce a header fil
bd90: 65 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  e for use by the
bda0: 20 73 63 61 6e 6e 65 72 2e 20 20 28 54 68 69 73   scanner.  (This
bdb0: 20 73 74 65 70 20 69 73 0a 20 20 20 20 2a 2a 20   step is.    ** 
bdc0: 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 22  omitted if the "
bdd0: 2d 6d 22 20 6f 70 74 69 6f 6e 20 69 73 20 75 73  -m" option is us
bde0: 65 64 20 62 65 63 61 75 73 65 20 6d 61 6b 65 68  ed because makeh
bdf0: 65 61 64 65 72 73 20 77 69 6c 6c 0a 20 20 20 20  eaders will.    
be00: 2a 2a 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  ** generate the 
be10: 66 69 6c 65 20 66 6f 72 20 75 73 2e 29 20 2a 2f  file for us.) */
be20: 0a 20 20 20 20 69 66 28 20 21 6d 68 66 6c 61 67  .    if( !mhflag
be30: 20 29 20 52 65 70 6f 72 74 48 65 61 64 65 72 28   ) ReportHeader(
be40: 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  &lem);.  }.  if(
be50: 20 73 74 61 74 69 73 74 69 63 73 20 29 7b 0a 20   statistics ){. 
be60: 20 20 20 70 72 69 6e 74 66 28 22 50 61 72 73 65     printf("Parse
be70: 72 20 73 74 61 74 69 73 74 69 63 73 3a 20 25 64  r statistics: %d
be80: 20 74 65 72 6d 69 6e 61 6c 73 2c 20 25 64 20 6e   terminals, %d n
be90: 6f 6e 74 65 72 6d 69 6e 61 6c 73 2c 20 25 64 20  onterminals, %d 
bea0: 72 75 6c 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rules\n",.      
beb0: 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2c 20 6c  lem.nterminal, l
bec0: 65 6d 2e 6e 73 79 6d 62 6f 6c 20 2d 20 6c 65 6d  em.nsymbol - lem
bed0: 2e 6e 74 65 72 6d 69 6e 61 6c 2c 20 6c 65 6d 2e  .nterminal, lem.
bee0: 6e 72 75 6c 65 29 3b 0a 20 20 20 20 70 72 69 6e  nrule);.    prin
bef0: 74 66 28 22 20 20 20 20 20 20 20 20 20 20 20 20  tf("            
bf00: 20 20 20 20 20 20 20 25 64 20 73 74 61 74 65 73         %d states
bf10: 2c 20 25 64 20 70 61 72 73 65 72 20 74 61 62 6c  , %d parser tabl
bf20: 65 20 65 6e 74 72 69 65 73 2c 20 25 64 20 63 6f  e entries, %d co
bf30: 6e 66 6c 69 63 74 73 5c 6e 22 2c 0a 20 20 20 20  nflicts\n",.    
bf40: 20 20 6c 65 6d 2e 6e 73 74 61 74 65 2c 20 6c 65    lem.nstate, le
bf50: 6d 2e 74 61 62 6c 65 73 69 7a 65 2c 20 6c 65 6d  m.tablesize, lem
bf60: 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 7d  .nconflict);.  }
bf70: 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 63 6f 6e 66  .  if( lem.nconf
bf80: 6c 69 63 74 20 29 7b 0a 20 20 20 20 66 70 72 69  lict ){.    fpri
bf90: 6e 74 66 28 73 74 64 65 72 72 2c 22 25 64 20 70  ntf(stderr,"%d p
bfa0: 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73  arsing conflicts
bfb0: 2e 5c 6e 22 2c 6c 65 6d 2e 6e 63 6f 6e 66 6c 69  .\n",lem.nconfli
bfc0: 63 74 29 3b 0a 20 20 7d 0a 20 20 65 78 69 74 28  ct);.  }.  exit(
bfd0: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 2b 20 6c  lem.errorcnt + l
bfe0: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20  em.nconflict);. 
bff0: 20 72 65 74 75 72 6e 20 28 6c 65 6d 2e 65 72 72   return (lem.err
c000: 6f 72 63 6e 74 20 2b 20 6c 65 6d 2e 6e 63 6f 6e  orcnt + lem.ncon
c010: 66 6c 69 63 74 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  flict);.}./*****
c020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
c030: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6d  From the file "m
c040: 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  sort.c" ********
c050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c060: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41  *******/./*.** A
c070: 20 67 65 6e 65 72 69 63 20 6d 65 72 67 65 2d 73   generic merge-s
c080: 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  ort program..**.
c090: 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c 65 74  ** USAGE:.** Let
c0a0: 20 22 70 74 72 22 20 62 65 20 61 20 70 6f 69 6e   "ptr" be a poin
c0b0: 74 65 72 20 74 6f 20 73 6f 6d 65 20 73 74 72 75  ter to some stru
c0c0: 63 74 75 72 65 20 77 68 69 63 68 20 69 73 20 61  cture which is a
c0d0: 74 20 74 68 65 20 68 65 61 64 20 6f 66 0a 2a 2a  t the head of.**
c0e0: 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74   a null-terminat
c0f0: 65 64 20 6c 69 73 74 2e 20 20 54 68 65 6e 20 74  ed list.  Then t
c100: 6f 20 73 6f 72 74 20 74 68 65 20 6c 69 73 74 20  o sort the list 
c110: 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  call:.**.**     
c120: 70 74 72 20 3d 20 6d 73 6f 72 74 28 70 74 72 2c  ptr = msort(ptr,
c130: 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63 6d 70  &(ptr->next),cmp
c140: 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  fnc);.**.** In t
c150: 68 65 20 61 62 6f 76 65 2c 20 22 63 6d 70 66 6e  he above, "cmpfn
c160: 63 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  c" is a pointer 
c170: 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 68  to a function wh
c180: 69 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a 2a 20  ich compares.** 
c190: 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  two instances of
c1a0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 61   the structure a
c1b0: 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e  nd returns an in
c1c0: 74 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a 2a 20  teger, as in.** 
c1d0: 73 74 72 63 6d 70 2e 20 20 54 68 65 20 73 65 63  strcmp.  The sec
c1e0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
c1f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
c200: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
c210: 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  ** second elemen
c220: 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20  t of the linked 
c230: 6c 69 73 74 2e 20 20 54 68 69 73 20 61 64 64 72  list.  This addr
c240: 65 73 73 20 69 73 20 75 73 65 64 20 74 6f 20 63  ess is used to c
c250: 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 6f 66  ompute.** the of
c260: 66 73 65 74 20 74 6f 20 74 68 65 20 22 6e 65 78  fset to the "nex
c270: 74 22 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20  t" field within 
c280: 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  the structure.  
c290: 54 68 65 20 6f 66 66 73 65 74 20 74 6f 0a 2a 2a  The offset to.**
c2a0: 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c   the "next" fiel
c2b0: 64 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61  d must be consta
c2c0: 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74 72 75 63  nt for all struc
c2d0: 74 75 72 65 73 20 69 6e 20 74 68 65 20 6c 69 73  tures in the lis
c2e0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e  t..**.** The fun
c2f0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
c300: 6e 65 77 20 70 6f 69 6e 74 65 72 20 77 68 69 63  new pointer whic
c310: 68 20 69 73 20 74 68 65 20 68 65 61 64 20 6f 66  h is the head of
c320: 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61 66 74   the list.** aft
c330: 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a 0a 2a  er sorting..**.*
c340: 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a 20  * ALGORITHM:.** 
c350: 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a  Merge-sort..*/..
c360: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
c370: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
c380: 78 74 20 73 74 72 75 63 74 75 72 65 20 69 6e 20  xt structure in 
c390: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  the linked list.
c3a0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45 58 54  .*/.#define NEXT
c3b0: 28 41 29 20 28 2a 28 63 68 61 72 2a 2a 29 28 28  (A) (*(char**)((
c3c0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 41  (unsigned long)A
c3d0: 29 2b 6f 66 66 73 65 74 29 29 0a 0a 2f 2a 0a 2a  )+offset))../*.*
c3e0: 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 61  * Inputs:.**   a
c3f0: 3a 20 20 20 20 20 20 20 41 20 73 6f 72 74 65 64  :       A sorted
c400: 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65  , null-terminate
c410: 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20  d linked list.  
c420: 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a  (May be null)..*
c430: 2a 20 20 20 62 3a 20 20 20 20 20 20 20 41 20 73  *   b:       A s
c440: 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d  orted, null-term
c450: 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69  inated linked li
c460: 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75 6c  st.  (May be nul
c470: 6c 29 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20 20 20  l)..**   cmp:   
c480: 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74    A pointer to t
c490: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  he comparison fu
c4a0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20 6f 66 66  nction..**   off
c4b0: 73 65 74 3a 20 20 4f 66 66 73 65 74 20 69 6e 20  set:  Offset in 
c4c0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  the structure to
c4d0: 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c   the "next" fiel
c4e0: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
c4f0: 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f  Value:.**   A po
c500: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
c510: 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20 6c 69  d of a sorted li
c520: 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  st containing th
c530: 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  e elements.**   
c540: 6f 66 20 62 6f 74 68 20 61 20 61 6e 64 20 62 2e  of both a and b.
c550: 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66 66 65  .**.** Side effe
c560: 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20 22 6e  cts:.**   The "n
c570: 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20 66 6f  ext" pointers fo
c580: 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  r elements in th
c590: 65 20 6c 69 73 74 73 20 61 20 61 6e 64 20 62 20  e lists a and b 
c5a0: 61 72 65 0a 2a 2a 20 20 20 63 68 61 6e 67 65 64  are.**   changed
c5b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
c5c0: 20 2a 6d 65 72 67 65 28 0a 20 20 63 68 61 72 20   *merge(.  char 
c5d0: 2a 61 2c 0a 20 20 63 68 61 72 20 2a 62 2c 0a 20  *a,.  char *b,. 
c5e0: 20 69 6e 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73   int (*cmp)(cons
c5f0: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
c600: 61 72 2a 29 2c 0a 20 20 69 6e 74 20 6f 66 66 73  ar*),.  int offs
c610: 65 74 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 74  et.){.  char *pt
c620: 72 2c 20 2a 68 65 61 64 3b 0a 0a 20 20 69 66 28  r, *head;..  if(
c630: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 68 65 61   a==0 ){.    hea
c640: 64 20 3d 20 62 3b 0a 20 20 7d 65 6c 73 65 20 69  d = b;.  }else i
c650: 66 28 20 62 3d 3d 30 20 29 7b 0a 20 20 20 20 68  f( b==0 ){.    h
c660: 65 61 64 20 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  ead = a;.  }else
c670: 7b 0a 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29  {.    if( (*cmp)
c680: 28 61 2c 62 29 3c 30 20 29 7b 0a 20 20 20 20 20  (a,b)<0 ){.     
c690: 20 70 74 72 20 3d 20 61 3b 0a 20 20 20 20 20 20   ptr = a;.      
c6a0: 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20 20 20  a = NEXT(a);.   
c6b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 74   }else{.      pt
c6c0: 72 20 3d 20 62 3b 0a 20 20 20 20 20 20 62 20 3d  r = b;.      b =
c6d0: 20 4e 45 58 54 28 62 29 3b 0a 20 20 20 20 7d 0a   NEXT(b);.    }.
c6e0: 20 20 20 20 68 65 61 64 20 3d 20 70 74 72 3b 0a      head = ptr;.
c6f0: 20 20 20 20 77 68 69 6c 65 28 20 61 20 26 26 20      while( a && 
c700: 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  b ){.      if( (
c710: 2a 63 6d 70 29 28 61 2c 62 29 3c 30 20 29 7b 0a  *cmp)(a,b)<0 ){.
c720: 20 20 20 20 20 20 20 20 4e 45 58 54 28 70 74 72          NEXT(ptr
c730: 29 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70  ) = a;.        p
c740: 74 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  tr = a;.        
c750: 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20 20 20  a = NEXT(a);.   
c760: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c770: 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 62 3b    NEXT(ptr) = b;
c780: 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d 20 62  .        ptr = b
c790: 3b 0a 20 20 20 20 20 20 20 20 62 20 3d 20 4e 45  ;.        b = NE
c7a0: 58 54 28 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  XT(b);.      }. 
c7b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 20 29     }.    if( a )
c7c0: 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61 3b 0a   NEXT(ptr) = a;.
c7d0: 20 20 20 20 65 6c 73 65 20 20 20 20 4e 45 58 54      else    NEXT
c7e0: 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 7d 0a 20  (ptr) = b;.  }. 
c7f0: 20 72 65 74 75 72 6e 20 68 65 61 64 3b 0a 7d 0a   return head;.}.
c800: 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a  ./*.** Inputs:.*
c810: 2a 20 20 20 6c 69 73 74 3a 20 20 20 20 20 20 50  *   list:      P
c820: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
c830: 6c 79 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ly-linked list o
c840: 66 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a  f structures..**
c850: 20 20 20 6e 65 78 74 3a 20 20 20 20 20 20 50 6f     next:      Po
c860: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 65 72  inter to pointer
c870: 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 65   to the second e
c880: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69  lement of the li
c890: 73 74 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20 20 20  st..**   cmp:   
c8a0: 20 20 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e      A comparison
c8b0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
c8c0: 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a   Return Value:.*
c8d0: 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  *   A pointer to
c8e0: 20 74 68 65 20 68 65 61 64 20 6f 66 20 61 20 73   the head of a s
c8f0: 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e 74 61  orted list conta
c900: 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e  ining the elemen
c910: 74 73 0a 2a 2a 20 20 20 6f 72 67 69 6e 61 6c 6c  ts.**   orginall
c920: 79 20 69 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  y in list..**.**
c930: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a   Side effects:.*
c940: 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22 20 70  *   The "next" p
c950: 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d  ointers for elem
c960: 65 6e 74 73 20 69 6e 20 6c 69 73 74 20 61 72 65  ents in list are
c970: 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 64 65   changed..*/.#de
c980: 66 69 6e 65 20 4c 49 53 54 53 49 5a 45 20 33 30  fine LISTSIZE 30
c990: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6d 73  .static char *ms
c9a0: 6f 72 74 28 0a 20 20 63 68 61 72 20 2a 6c 69 73  ort(.  char *lis
c9b0: 74 2c 0a 20 20 63 68 61 72 20 2a 2a 6e 65 78 74  t,.  char **next
c9c0: 2c 0a 20 20 69 6e 74 20 28 2a 63 6d 70 29 28 63  ,.  int (*cmp)(c
c9d0: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
c9e0: 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 75 6e 73   char*).){.  uns
c9f0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 66 66 73 65  igned long offse
ca00: 74 3b 0a 20 20 63 68 61 72 20 2a 65 70 3b 0a 20  t;.  char *ep;. 
ca10: 20 63 68 61 72 20 2a 73 65 74 5b 4c 49 53 54 53   char *set[LISTS
ca20: 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  IZE];.  int i;. 
ca30: 20 6f 66 66 73 65 74 20 3d 20 28 75 6e 73 69 67   offset = (unsig
ca40: 6e 65 64 20 6c 6f 6e 67 29 6e 65 78 74 20 2d 20  ned long)next - 
ca50: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 6c  (unsigned long)l
ca60: 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ist;.  for(i=0; 
ca70: 69 3c 4c 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29  i<LISTSIZE; i++)
ca80: 20 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 77   set[i] = 0;.  w
ca90: 68 69 6c 65 28 20 6c 69 73 74 20 29 7b 0a 20 20  hile( list ){.  
caa0: 20 20 65 70 20 3d 20 6c 69 73 74 3b 0a 20 20 20    ep = list;.   
cab0: 20 6c 69 73 74 20 3d 20 4e 45 58 54 28 6c 69 73   list = NEXT(lis
cac0: 74 29 3b 0a 20 20 20 20 4e 45 58 54 28 65 70 29  t);.    NEXT(ep)
cad0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
cae0: 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 2d 31 20  0; i<LISTSIZE-1 
caf0: 26 26 20 73 65 74 5b 69 5d 21 3d 30 3b 20 69 2b  && set[i]!=0; i+
cb00: 2b 29 7b 0a 20 20 20 20 20 20 65 70 20 3d 20 6d  +){.      ep = m
cb10: 65 72 67 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63  erge(ep,set[i],c
cb20: 6d 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  mp,offset);.    
cb30: 20 20 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20    set[i] = 0;.  
cb40: 20 20 7d 0a 20 20 20 20 73 65 74 5b 69 5d 20 3d    }.    set[i] =
cb50: 20 65 70 3b 0a 20 20 7d 0a 20 20 65 70 20 3d 20   ep;.  }.  ep = 
cb60: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
cb70: 4c 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 69  LISTSIZE; i++) i
cb80: 66 28 20 73 65 74 5b 69 5d 20 29 20 65 70 20 3d  f( set[i] ) ep =
cb90: 20 6d 65 72 67 65 28 65 70 2c 73 65 74 5b 69 5d   merge(ep,set[i]
cba0: 2c 63 6d 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20  ,cmp,offset);.  
cbb0: 72 65 74 75 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a  return ep;.}./**
cbc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cbd0: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
cbe0: 66 69 6c 65 20 22 6f 70 74 69 6f 6e 2e 63 22 20  file "option.c" 
cbf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cc00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74  **********/.stat
cc10: 69 63 20 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a  ic char **argv;.
cc20: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f  static struct s_
cc30: 6f 70 74 69 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61  options *op;.sta
cc40: 74 69 63 20 46 49 4c 45 20 2a 65 72 72 73 74 72  tic FILE *errstr
cc50: 65 61 6d 3b 0a 0a 23 64 65 66 69 6e 65 20 49 53  eam;..#define IS
cc60: 4f 50 54 28 58 29 20 28 28 58 29 5b 30 5d 3d 3d  OPT(X) ((X)[0]==
cc70: 27 2d 27 7c 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27  '-'||(X)[0]=='+'
cc80: 7c 7c 73 74 72 63 68 72 28 28 58 29 2c 27 3d 27  ||strchr((X),'='
cc90: 29 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  )!=0)../*.** Pri
cca0: 6e 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  nt the command l
ccb0: 69 6e 65 20 77 69 74 68 20 61 20 63 61 72 72 6f  ine with a carro
ccc0: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
ccd0: 65 20 6b 2d 74 68 20 63 68 61 72 61 63 74 65 72  e k-th character
cce0: 0a 2a 2a 20 6f 66 20 74 68 65 20 6e 2d 74 68 20  .** of the n-th 
ccf0: 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  field..*/.static
cd00: 20 76 6f 69 64 20 65 72 72 6c 69 6e 65 28 6e 2c   void errline(n,
cd10: 6b 2c 65 72 72 29 0a 69 6e 74 20 6e 3b 0a 69 6e  k,err).int n;.in
cd20: 74 20 6b 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a  t k;.FILE *err;.
cd30: 7b 0a 20 20 69 6e 74 20 73 70 63 6e 74 2c 20 69  {.  int spcnt, i
cd40: 3b 0a 20 20 69 66 28 20 61 72 67 76 5b 30 5d 20  ;.  if( argv[0] 
cd50: 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25  ) fprintf(err,"%
cd60: 73 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73  s",argv[0]);.  s
cd70: 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c  pcnt = lemonStrl
cd80: 65 6e 28 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b  en(argv[0]) + 1;
cd90: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20  .  for(i=1; i<n 
cda0: 26 26 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29  && argv[i]; i++)
cdb0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72  {.    fprintf(er
cdc0: 72 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d 29  r," %s",argv[i])
cdd0: 3b 0a 20 20 20 20 73 70 63 6e 74 20 2b 3d 20 6c  ;.    spcnt += l
cde0: 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76 5b  emonStrlen(argv[
cdf0: 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20 20 73 70 63  i])+1;.  }.  spc
ce00: 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b  nt += k;.  for(;
ce10: 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 20 66   argv[i]; i++) f
ce20: 70 72 69 6e 74 66 28 65 72 72 2c 22 20 25 73 22  printf(err," %s"
ce30: 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 69 66 28  ,argv[i]);.  if(
ce40: 20 73 70 63 6e 74 3c 32 30 20 29 7b 0a 20 20 20   spcnt<20 ){.   
ce50: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e   fprintf(err,"\n
ce60: 25 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c 73  %*s^-- here\n",s
ce70: 70 63 6e 74 2c 22 22 29 3b 0a 20 20 7d 65 6c 73  pcnt,"");.  }els
ce80: 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65  e{.    fprintf(e
ce90: 72 72 2c 22 5c 6e 25 2a 73 68 65 72 65 20 2d 2d  rr,"\n%*shere --
cea0: 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c 22 22 29  ^\n",spcnt-7,"")
ceb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
cec0: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
ced0: 6f 66 20 74 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d  of the N-th non-
cee0: 73 77 69 74 63 68 20 61 72 67 75 6d 65 6e 74 2e  switch argument.
cef0: 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69    Return -1.** i
cf00: 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f N is out of ra
cf10: 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nge..*/.static i
cf20: 6e 74 20 61 72 67 69 6e 64 65 78 28 6e 29 0a 69  nt argindex(n).i
cf30: 6e 74 20 6e 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b  nt n;.{.  int i;
cf40: 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68 20  .  int dashdash 
cf50: 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76 21  = 0;.  if( argv!
cf60: 3d 30 20 26 26 20 2a 61 72 67 76 21 3d 30 20 29  =0 && *argv!=0 )
cf70: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  {.    for(i=1; a
cf80: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgv[i]; i++){.  
cf90: 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73 68      if( dashdash
cfa0: 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b   || !ISOPT(argv[
cfb0: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
cfc0: 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( n==0 ) return
cfd0: 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b   i;.        n--;
cfe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
cff0: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69  f( strcmp(argv[i
d000: 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73  ],"--")==0 ) das
d010: 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d  hdash = 1;.    }
d020: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
d030: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72  ;.}..static char
d040: 20 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61   emsg[] = "Comma
d050: 6e 64 20 6c 69 6e 65 20 73 79 6e 74 61 78 20 65  nd line syntax e
d060: 72 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20  rror: ";../*.** 
d070: 50 72 6f 63 65 73 73 20 61 20 66 6c 61 67 20 63  Process a flag c
d080: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67 75  ommand line argu
d090: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
d0a0: 69 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67 73 28  int handleflags(
d0b0: 69 2c 65 72 72 29 0a 69 6e 74 20 69 3b 0a 46 49  i,err).int i;.FI
d0c0: 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74  LE *err;.{.  int
d0d0: 20 76 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74   v;.  int errcnt
d0e0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
d0f0: 20 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e   for(j=0; op[j].
d100: 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  label; j++){.   
d110: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 26 61 72   if( strncmp(&ar
d120: 67 76 5b 69 5d 5b 31 5d 2c 6f 70 5b 6a 5d 2e 6c  gv[i][1],op[j].l
d130: 61 62 65 6c 2c 6c 65 6d 6f 6e 53 74 72 6c 65 6e  abel,lemonStrlen
d140: 28 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 29 3d 3d  (op[j].label))==
d150: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  0 ) break;.  }. 
d160: 20 76 20 3d 20 61 72 67 76 5b 69 5d 5b 30 5d 3d   v = argv[i][0]=
d170: 3d 27 2d 27 20 3f 20 31 20 3a 20 30 3b 0a 20 20  ='-' ? 1 : 0;.  
d180: 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d  if( op[j].label=
d190: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72  =0 ){.    if( er
d1a0: 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  r ){.      fprin
d1b0: 74 66 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69  tf(err,"%sundefi
d1c0: 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65  ned option.\n",e
d1d0: 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c  msg);.      errl
d1e0: 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20  ine(i,1,err);.  
d1f0: 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b    }.    errcnt++
d200: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
d210: 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 4c  [j].type==OPT_FL
d220: 41 47 20 29 7b 0a 20 20 20 20 2a 28 28 69 6e 74  AG ){.    *((int
d230: 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 76  *)op[j].arg) = v
d240: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
d250: 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 46  [j].type==OPT_FF
d260: 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f  LAG ){.    (*(vo
d270: 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61  id(*)())(op[j].a
d280: 72 67 29 29 28 76 29 3b 0a 20 20 7d 65 6c 73 65  rg))(v);.  }else
d290: 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d   if( op[j].type=
d2a0: 3d 4f 50 54 5f 46 53 54 52 20 29 7b 0a 20 20 20  =OPT_FSTR ){.   
d2b0: 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29 28 6f   (*(void(*)())(o
d2c0: 70 5b 6a 5d 2e 61 72 67 29 29 28 26 61 72 67 76  p[j].arg))(&argv
d2d0: 5b 69 5d 5b 32 5d 29 3b 0a 20 20 7d 65 6c 73 65  [i][2]);.  }else
d2e0: 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20 29 7b  {.    if( err ){
d2f0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65  .      fprintf(e
d300: 72 72 2c 22 25 73 6d 69 73 73 69 6e 67 20 61 72  rr,"%smissing ar
d310: 67 75 6d 65 6e 74 20 6f 6e 20 73 77 69 74 63 68  gument on switch
d320: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
d330: 20 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72    errline(i,1,er
d340: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72  r);.    }.    er
d350: 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  rcnt++;.  }.  re
d360: 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a  turn errcnt;.}..
d370: 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20  /*.** Process a 
d380: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 77 69  command line swi
d390: 74 63 68 20 77 68 69 63 68 20 68 61 73 20 61 6e  tch which has an
d3a0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
d3b0: 61 74 69 63 20 69 6e 74 20 68 61 6e 64 6c 65 73  atic int handles
d3c0: 77 69 74 63 68 28 69 2c 65 72 72 29 0a 69 6e 74  witch(i,err).int
d3d0: 20 69 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b   i;.FILE *err;.{
d3e0: 0a 20 20 69 6e 74 20 6c 76 20 3d 20 30 3b 0a 20  .  int lv = 0;. 
d3f0: 20 64 6f 75 62 6c 65 20 64 76 20 3d 20 30 2e 30   double dv = 0.0
d400: 3b 0a 20 20 63 68 61 72 20 2a 73 76 20 3d 20 30  ;.  char *sv = 0
d410: 2c 20 2a 65 6e 64 3b 0a 20 20 63 68 61 72 20 2a  , *end;.  char *
d420: 63 70 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69  cp;.  int j;.  i
d430: 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20  nt errcnt = 0;. 
d440: 20 63 70 20 3d 20 73 74 72 63 68 72 28 61 72 67   cp = strchr(arg
d450: 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20 20 61 73 73  v[i],'=');.  ass
d460: 65 72 74 28 20 63 70 21 3d 30 20 29 3b 0a 20 20  ert( cp!=0 );.  
d470: 2a 63 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a  *cp = 0;.  for(j
d480: 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b  =0; op[j].label;
d490: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   j++){.    if( s
d4a0: 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 6f 70  trcmp(argv[i],op
d4b0: 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20 29 20  [j].label)==0 ) 
d4c0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70  break;.  }.  *cp
d4d0: 20 3d 20 27 3d 27 3b 0a 20 20 69 66 28 20 6f 70   = '=';.  if( op
d4e0: 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a  [j].label==0 ){.
d4f0: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
d500: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
d510: 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70  ,"%sundefined op
d520: 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  tion.\n",emsg);.
d530: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
d540: 30 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  0,err);.    }.  
d550: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65    errcnt++;.  }e
d560: 6c 73 65 7b 0a 20 20 20 20 63 70 2b 2b 3b 0a 20  lse{.    cp++;. 
d570: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d     switch( op[j]
d580: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
d590: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
d5a0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
d5b0: 41 47 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20  AG:.        if( 
d5c0: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  err ){.         
d5d0: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
d5e0: 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
d5f0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c  an argument.\n",
d600: 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  emsg);.         
d610: 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72   errline(i,0,err
d620: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d630: 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20       errcnt++;. 
d640: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d650: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c      case OPT_DBL
d660: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
d670: 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 64  _FDBL:.        d
d680: 76 20 3d 20 73 74 72 74 6f 64 28 63 70 2c 26 65  v = strtod(cp,&e
d690: 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nd);.        if(
d6a0: 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20   *end ){.       
d6b0: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
d6c0: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
d6d0: 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c  f(err,"%sillegal
d6e0: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 66 6c   character in fl
d6f0: 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 61 72 67  oating-point arg
d700: 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b  ument.\n",emsg);
d710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72  .            err
d720: 6c 69 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e 65  line(i,((unsigne
d730: 64 20 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73  d long)end)-(uns
d740: 69 67 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b  igned long)argv[
d750: 69 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20  i],err);.       
d760: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65     }.          e
d770: 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  rrcnt++;.       
d780: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
d790: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
d7a0: 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65  _INT:.      case
d7b0: 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20   OPT_FINT:.     
d7c0: 20 20 20 6c 76 20 3d 20 73 74 72 74 6f 6c 28 63     lv = strtol(c
d7d0: 70 2c 26 65 6e 64 2c 30 29 3b 0a 20 20 20 20 20  p,&end,0);.     
d7e0: 20 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20     if( *end ){. 
d7f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72           if( err
d800: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d810: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 69  fprintf(err,"%si
d820: 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72  llegal character
d830: 20 69 6e 20 69 6e 74 65 67 65 72 20 61 72 67 75   in integer argu
d840: 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  ment.\n",emsg);.
d850: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6c              errl
d860: 69 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e 65 64  ine(i,((unsigned
d870: 20 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69   long)end)-(unsi
d880: 67 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69  gned long)argv[i
d890: 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  ],err);.        
d8a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72    }.          er
d8b0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
d8c0: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
d8d0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
d8e0: 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20  STR:.      case 
d8f0: 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20  OPT_FSTR:.      
d900: 20 20 73 76 20 3d 20 63 70 3b 0a 20 20 20 20 20    sv = cp;.     
d910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d920: 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a      switch( op[j
d930: 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  ].type ){.      
d940: 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20  case OPT_FLAG:. 
d950: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46       case OPT_FF
d960: 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65  LAG:.        bre
d970: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
d980: 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20 20  PT_DBL:.        
d990: 2a 28 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d  *(double*)(op[j]
d9a0: 2e 61 72 67 29 20 3d 20 64 76 3b 0a 20 20 20 20  .arg) = dv;.    
d9b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d9c0: 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a   case OPT_FDBL:.
d9d0: 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28          (*(void(
d9e0: 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  *)())(op[j].arg)
d9f0: 29 28 64 76 29 3b 0a 20 20 20 20 20 20 20 20 62  )(dv);.        b
da00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
da10: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
da20: 20 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e    *(int*)(op[j].
da30: 61 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20 20 20  arg) = lv;.     
da40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
da50: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
da60: 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a         (*(void(*
da70: 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29  )())(op[j].arg))
da80: 28 28 69 6e 74 29 6c 76 29 3b 0a 20 20 20 20 20  ((int)lv);.     
da90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
daa0: 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20  case OPT_STR:.  
dab0: 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 28        *(char**)(
dac0: 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 73 76 3b  op[j].arg) = sv;
dad0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
dae0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
daf0: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 28 2a 28  STR:.        (*(
db00: 76 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d  void(*)())(op[j]
db10: 2e 61 72 67 29 29 28 73 76 29 3b 0a 20 20 20 20  .arg))(sv);.    
db20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
db30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72  .  }.  return er
db40: 72 63 6e 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74  rcnt;.}..int Opt
db50: 49 6e 69 74 28 61 2c 6f 2c 65 72 72 29 0a 63 68  Init(a,o,err).ch
db60: 61 72 20 2a 2a 61 3b 0a 73 74 72 75 63 74 20 73  ar **a;.struct s
db70: 5f 6f 70 74 69 6f 6e 73 20 2a 6f 3b 0a 46 49 4c  _options *o;.FIL
db80: 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20  E *err;.{.  int 
db90: 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61 72  errcnt = 0;.  ar
dba0: 67 76 20 3d 20 61 3b 0a 20 20 6f 70 20 3d 20 6f  gv = a;.  op = o
dbb0: 3b 0a 20 20 65 72 72 73 74 72 65 61 6d 20 3d 20  ;.  errstream = 
dbc0: 65 72 72 3b 0a 20 20 69 66 28 20 61 72 67 76 20  err;.  if( argv 
dbd0: 26 26 20 2a 61 72 67 76 20 26 26 20 6f 70 20 29  && *argv && op )
dbe0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
dbf0: 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69   for(i=1; argv[i
dc00: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
dc10: 66 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27  f( argv[i][0]=='
dc20: 2b 27 20 7c 7c 20 61 72 67 76 5b 69 5d 5b 30 5d  +' || argv[i][0]
dc30: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
dc40: 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c   errcnt += handl
dc50: 65 66 6c 61 67 73 28 69 2c 65 72 72 29 3b 0a 20  eflags(i,err);. 
dc60: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
dc70: 74 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d  trchr(argv[i],'=
dc80: 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72  ') ){.        er
dc90: 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77  rcnt += handlesw
dca0: 69 74 63 68 28 69 2c 65 72 72 29 3b 0a 20 20 20  itch(i,err);.   
dcb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
dcc0: 20 69 66 28 20 65 72 72 63 6e 74 3e 30 20 29 7b   if( errcnt>0 ){
dcd0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
dce0: 2c 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20  ,"Valid command 
dcf0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72  line options for
dd00: 20 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c   \"%s\" are:\n",
dd10: 2a 61 29 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e  *a);.    OptPrin
dd20: 74 28 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  t();.    exit(1)
dd30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
dd40: 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67  ;.}..int OptNArg
dd50: 73 28 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  s(){.  int cnt =
dd60: 20 30 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61   0;.  int dashda
dd70: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
dd80: 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20 26  .  if( argv!=0 &
dd90: 26 20 61 72 67 76 5b 30 5d 21 3d 30 20 29 7b 0a  & argv[0]!=0 ){.
dda0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67      for(i=1; arg
ddb0: 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  v[i]; i++){.    
ddc0: 20 20 69 66 28 20 64 61 73 68 64 61 73 68 20 7c    if( dashdash |
ddd0: 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d  | !ISOPT(argv[i]
dde0: 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  ) ) cnt++;.     
ddf0: 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
de00: 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64  [i],"--")==0 ) d
de10: 61 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20  ashdash = 1;.   
de20: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
de30: 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f 70  cnt;.}..char *Op
de40: 74 41 72 67 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b  tArg(n).int n;.{
de50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20  .  int i;.  i = 
de60: 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72  argindex(n);.  r
de70: 65 74 75 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67  eturn i>=0 ? arg
de80: 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69  v[i] : 0;.}..voi
de90: 64 20 4f 70 74 45 72 72 28 6e 29 0a 69 6e 74 20  d OptErr(n).int 
dea0: 6e 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  n;.{.  int i;.  
deb0: 69 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b  i = argindex(n);
dec0: 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 65 72  .  if( i>=0 ) er
ded0: 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 73 74 72  rline(i,0,errstr
dee0: 65 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70  eam);.}..void Op
def0: 74 50 72 69 6e 74 28 29 7b 0a 20 20 69 6e 74 20  tPrint(){.  int 
df00: 69 3b 0a 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65  i;.  int max, le
df10: 6e 3b 0a 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20  n;.  max = 0;.  
df20: 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c  for(i=0; op[i].l
df30: 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  abel; i++){.    
df40: 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  len = lemonStrle
df50: 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b  n(op[i].label) +
df60: 20 31 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20   1;.    switch( 
df70: 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[i].type ){.  
df80: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
df90: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
dfa0: 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
dfb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
dfc0: 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20  se OPT_INT:.    
dfd0: 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a    case OPT_FINT:
dfe0: 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20  .        len += 
dff0: 39 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67  9;       /* leng
e000: 74 68 20 6f 66 20 22 3c 69 6e 74 65 67 65 72 3e  th of "<integer>
e010: 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  " */.        bre
e020: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
e030: 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61  PT_DBL:.      ca
e040: 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20  se OPT_FDBL:.   
e050: 20 20 20 20 20 6c 65 6e 20 2b 3d 20 36 3b 20 20       len += 6;  
e060: 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f       /* length o
e070: 66 20 22 3c 72 65 61 6c 3e 22 20 2a 2f 0a 20 20  f "<real>" */.  
e080: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e090: 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a     case OPT_STR:
e0a0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
e0b0: 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 6c 65  FSTR:.        le
e0c0: 6e 20 2b 3d 20 38 3b 20 20 20 20 20 20 20 2f 2a  n += 8;       /*
e0d0: 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 73 74 72   length of "<str
e0e0: 69 6e 67 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20  ing>" */.       
e0f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e100: 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 20 29 20    if( len>max ) 
e110: 6d 61 78 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20  max = len;.  }. 
e120: 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e   for(i=0; op[i].
e130: 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  label; i++){.   
e140: 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74   switch( op[i].t
e150: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
e160: 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20  e OPT_FLAG:.    
e170: 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47    case OPT_FFLAG
e180: 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  :.        fprint
e190: 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d  f(errstream,"  -
e1a0: 25 2d 2a 73 20 20 25 73 5c 6e 22 2c 6d 61 78 2c  %-*s  %s\n",max,
e1b0: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69  op[i].label,op[i
e1c0: 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20  ].message);.    
e1d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e1e0: 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20   case OPT_INT:. 
e1f0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49       case OPT_FI
e200: 4e 54 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69  NT:.        fpri
e210: 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20  ntf(errstream," 
e220: 20 25 73 3d 3c 69 6e 74 65 67 65 72 3e 25 2a 73   %s=<integer>%*s
e230: 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61    %s\n",op[i].la
e240: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  bel,.          (
e250: 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74  int)(max-lemonSt
e260: 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c  rlen(op[i].label
e270: 29 2d 39 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65  )-9),"",op[i].me
e280: 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
e290: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
e2a0: 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20  e OPT_DBL:.     
e2b0: 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a   case OPT_FDBL:.
e2c0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
e2d0: 65 72 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d  errstream,"  %s=
e2e0: 3c 72 65 61 6c 3e 25 2a 73 20 20 25 73 5c 6e 22  <real>%*s  %s\n"
e2f0: 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20  ,op[i].label,.  
e300: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61          (int)(ma
e310: 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70  x-lemonStrlen(op
e320: 5b 69 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c 22 22  [i].label)-6),""
e330: 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b  ,op[i].message);
e340: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e350: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53        case OPT_S
e360: 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  TR:.      case O
e370: 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20  PT_FSTR:.       
e380: 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65   fprintf(errstre
e390: 61 6d 2c 22 20 20 25 73 3d 3c 73 74 72 69 6e 67  am,"  %s=<string
e3a0: 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69  >%*s  %s\n",op[i
e3b0: 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  ].label,.       
e3c0: 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d     (int)(max-lem
e3d0: 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c  onStrlen(op[i].l
e3e0: 61 62 65 6c 29 2d 38 29 2c 22 22 2c 6f 70 5b 69  abel)-8),"",op[i
e3f0: 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20  ].message);.    
e400: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e410: 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  .  }.}./********
e420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
e430: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70  From the file "p
e440: 61 72 73 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  arse.c" ********
e450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e460: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70 75  ****/./*.** Inpu
e470: 74 20 66 69 6c 65 20 70 61 72 73 65 72 20 66 6f  t file parser fo
e480: 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
e490: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
e4a0: 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20 6f  ../* The state o
e4b0: 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a  f the parser */.
e4c0: 73 74 72 75 63 74 20 70 73 74 61 74 65 20 7b 0a  struct pstate {.
e4d0: 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65    char *filename
e4e0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
e4f0: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
e500: 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b 65 6e  e */.  int token
e510: 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 2f 2a 20  lineno;      /* 
e520: 4c 69 6e 65 6e 75 6d 62 65 72 20 61 74 20 77 68  Linenumber at wh
e530: 69 63 68 20 63 75 72 72 65 6e 74 20 74 6f 6b 65  ich current toke
e540: 6e 20 73 74 61 72 74 73 20 2a 2f 0a 20 20 69 6e  n starts */.  in
e550: 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20 20  t errorcnt;     
e560: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e570: 20 65 72 72 6f 72 73 20 73 6f 20 66 61 72 20 2a   errors so far *
e580: 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 73  /.  char *tokens
e590: 74 61 72 74 3b 20 20 20 20 20 2f 2a 20 54 65 78  tart;     /* Tex
e5a0: 74 20 6f 66 20 63 75 72 72 65 6e 74 20 74 6f 6b  t of current tok
e5b0: 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c  en */.  struct l
e5c0: 65 6d 6f 6e 20 2a 67 70 3b 20 20 20 20 20 2f 2a  emon *gp;     /*
e5d0: 20 47 6c 6f 62 61 6c 20 73 74 61 74 65 20 76 65   Global state ve
e5e0: 63 74 6f 72 20 2a 2f 0a 20 20 65 6e 75 6d 20 65  ctor */.  enum e
e5f0: 5f 73 74 61 74 65 20 7b 0a 20 20 20 20 49 4e 49  _state {.    INI
e600: 54 49 41 4c 49 5a 45 2c 0a 20 20 20 20 57 41 49  TIALIZE,.    WAI
e610: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
e620: 5f 52 55 4c 45 2c 0a 20 20 20 20 57 41 49 54 49  _RULE,.    WAITI
e630: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57  NG_FOR_DECL_KEYW
e640: 4f 52 44 2c 0a 20 20 20 20 57 41 49 54 49 4e 47  ORD,.    WAITING
e650: 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 2c 0a 20  _FOR_DECL_ARG,. 
e660: 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50     WAITING_FOR_P
e670: 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c  RECEDENCE_SYMBOL
e680: 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f  ,.    WAITING_FO
e690: 52 5f 41 52 52 4f 57 2c 0a 20 20 20 20 49 4e 5f  R_ARROW,.    IN_
e6a0: 52 48 53 2c 0a 20 20 20 20 4c 48 53 5f 41 4c 49  RHS,.    LHS_ALI
e6b0: 41 53 5f 31 2c 0a 20 20 20 20 4c 48 53 5f 41 4c  AS_1,.    LHS_AL
e6c0: 49 41 53 5f 32 2c 0a 20 20 20 20 4c 48 53 5f 41  IAS_2,.    LHS_A
e6d0: 4c 49 41 53 5f 33 2c 0a 20 20 20 20 52 48 53 5f  LIAS_3,.    RHS_
e6e0: 41 4c 49 41 53 5f 31 2c 0a 20 20 20 20 52 48 53  ALIAS_1,.    RHS
e6f0: 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 20 20 50 52  _ALIAS_2,.    PR
e700: 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 2c  ECEDENCE_MARK_1,
e710: 0a 20 20 20 20 50 52 45 43 45 44 45 4e 43 45 5f  .    PRECEDENCE_
e720: 4d 41 52 4b 5f 32 2c 0a 20 20 20 20 52 45 53 59  MARK_2,.    RESY
e730: 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
e740: 52 4f 52 2c 0a 20 20 20 20 52 45 53 59 4e 43 5f  ROR,.    RESYNC_
e750: 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
e760: 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f  ,.    WAITING_FO
e770: 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d  R_DESTRUCTOR_SYM
e780: 42 4f 4c 2c 0a 20 20 20 20 57 41 49 54 49 4e 47  BOL,.    WAITING
e790: 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59  _FOR_DATATYPE_SY
e7a0: 4d 42 4f 4c 2c 0a 20 20 20 20 57 41 49 54 49 4e  MBOL,.    WAITIN
e7b0: 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49  G_FOR_FALLBACK_I
e7c0: 44 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46  D,.    WAITING_F
e7d0: 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 0a 20  OR_WILDCARD_ID. 
e7e0: 20 7d 20 73 74 61 74 65 3b 20 20 20 20 20 20 20   } state;       
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e800: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
e810: 70 61 72 73 65 72 20 2a 2f 0a 20 20 73 74 72 75  parser */.  stru
e820: 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62  ct symbol *fallb
e830: 61 63 6b 3b 20 20 20 2f 2a 20 54 68 65 20 66 61  ack;   /* The fa
e840: 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0a  llback token */.
e850: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
e860: 2a 6c 68 73 3b 20 20 20 20 20 20 20 20 2f 2a 20  *lhs;        /* 
e870: 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  Left-hand side o
e880: 66 20 63 75 72 72 65 6e 74 20 72 75 6c 65 20 2a  f current rule *
e890: 2f 0a 20 20 63 68 61 72 20 2a 6c 68 73 61 6c 69  /.  char *lhsali
e8a0: 61 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  as;            /
e8b0: 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20  * Alias for the 
e8c0: 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68  LHS */.  int nrh
e8d0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
e8e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e8f0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
e900: 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e 20 2a 2f   symbols seen */
e910: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
e920: 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d 3b 20 20   *rhs[MAXRHS];  
e930: 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a  /* RHS symbols *
e940: 2f 0a 20 20 63 68 61 72 20 2a 61 6c 69 61 73 5b  /.  char *alias[
e950: 4d 41 58 52 48 53 5d 3b 20 20 20 20 20 20 20 2f  MAXRHS];       /
e960: 2a 20 41 6c 69 61 73 65 73 20 66 6f 72 20 65 61  * Aliases for ea
e970: 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 6f  ch RHS symbol (o
e980: 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 74 72  r NULL) */.  str
e990: 75 63 74 20 72 75 6c 65 20 2a 70 72 65 76 72 75  uct rule *prevru
e9a0: 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72 65 76 69  le;     /* Previ
e9b0: 6f 75 73 20 72 75 6c 65 20 70 61 72 73 65 64 20  ous rule parsed 
e9c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65 63 6c 6b  */.  char *declk
e9d0: 65 79 77 6f 72 64 3b 20 20 20 20 20 20 20 20 20  eyword;         
e9e0: 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66 20 61 20  /* Keyword of a 
e9f0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 20  declaration */. 
ea00: 20 63 68 61 72 20 2a 2a 64 65 63 6c 61 72 67 73   char **declargs
ea10: 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  lot;        /* W
ea20: 68 65 72 65 20 74 68 65 20 64 65 63 6c 61 72 61  here the declara
ea30: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 73 68  tion argument sh
ea40: 6f 75 6c 64 20 62 65 20 70 75 74 20 2a 2f 0a 20  ould be put */. 
ea50: 20 69 6e 74 20 69 6e 73 65 72 74 4c 69 6e 65 4d   int insertLineM
ea60: 61 63 72 6f 3b 20 20 20 20 20 20 20 2f 2a 20 41  acro;       /* A
ea70: 64 64 20 23 6c 69 6e 65 20 62 65 66 6f 72 65 20  dd #line before 
ea80: 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 73 65  declaration inse
ea90: 72 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 64 65 63  rt */.  int *dec
eaa0: 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3b 20 20 20 20  llinenoslot;    
eab0: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
eac0: 72 69 74 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  rite declaration
ead0: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
eae0: 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 64    enum e_assoc d
eaf0: 65 63 6c 61 73 73 6f 63 3b 20 20 20 20 2f 2a 20  eclassoc;    /* 
eb00: 41 73 73 69 67 6e 20 74 68 69 73 20 61 73 73 6f  Assign this asso
eb10: 63 69 61 74 69 6f 6e 20 74 6f 20 64 65 63 6c 20  ciation to decl 
eb20: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69  arguments */.  i
eb30: 6e 74 20 70 72 65 63 63 6f 75 6e 74 65 72 3b 20  nt preccounter; 
eb40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
eb50: 69 67 6e 20 74 68 69 73 20 70 72 65 63 65 64 65  ign this precede
eb60: 6e 63 65 20 74 6f 20 64 65 63 6c 20 61 72 67 75  nce to decl argu
eb70: 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75 63  ments */.  struc
eb80: 74 20 72 75 6c 65 20 2a 66 69 72 73 74 72 75 6c  t rule *firstrul
eb90: 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  e;    /* Pointer
eba0: 20 74 6f 20 66 69 72 73 74 20 72 75 6c 65 20 69   to first rule i
ebb0: 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f  n the grammar */
ebc0: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
ebd0: 6c 61 73 74 72 75 6c 65 3b 20 20 20 20 20 2f 2a  lastrule;     /*
ebe0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
ebf0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
ec00: 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a  rsed rule */.};.
ec10: 0a 2f 2a 20 50 61 72 73 65 20 61 20 73 69 6e 67  ./* Parse a sing
ec20: 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74  le token */.stat
ec30: 69 63 20 76 6f 69 64 20 70 61 72 73 65 6f 6e 65  ic void parseone
ec40: 74 6f 6b 65 6e 28 70 73 70 29 0a 73 74 72 75 63  token(psp).struc
ec50: 74 20 70 73 74 61 74 65 20 2a 70 73 70 3b 0a 7b  t pstate *psp;.{
ec60: 0a 20 20 63 68 61 72 20 2a 78 3b 0a 20 20 78 20  .  char *x;.  x 
ec70: 3d 20 53 74 72 73 61 66 65 28 70 73 70 2d 3e 74  = Strsafe(psp->t
ec80: 6f 6b 65 6e 73 74 61 72 74 29 3b 20 20 20 20 20  okenstart);     
ec90: 2f 2a 20 53 61 76 65 20 74 68 65 20 74 6f 6b 65  /* Save the toke
eca0: 6e 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20 2a 2f  n permanently */
ecb0: 0a 23 69 66 20 30 0a 20 20 70 72 69 6e 74 66 28  .#if 0.  printf(
ecc0: 22 25 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b 25  "%s:%d: Token=[%
ecd0: 73 5d 20 73 74 61 74 65 3d 25 64 5c 6e 22 2c 70  s] state=%d\n",p
ece0: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
ecf0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
ed00: 20 20 20 78 2c 70 73 70 2d 3e 73 74 61 74 65 29     x,psp->state)
ed10: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63  ;.#endif.  switc
ed20: 68 28 20 70 73 70 2d 3e 73 74 61 74 65 20 29 7b  h( psp->state ){
ed30: 0a 20 20 20 20 63 61 73 65 20 49 4e 49 54 49 41  .    case INITIA
ed40: 4c 49 5a 45 3a 0a 20 20 20 20 20 20 70 73 70 2d  LIZE:.      psp-
ed50: 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20  >prevrule = 0;. 
ed60: 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f       psp->precco
ed70: 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  unter = 0;.     
ed80: 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20   psp->firstrule 
ed90: 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20  = psp->lastrule 
eda0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e  = 0;.      psp->
edb0: 67 70 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a 20  gp->nrule = 0;. 
edc0: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
edd0: 75 20 74 6f 20 6e 65 78 74 20 63 61 73 65 20 2a  u to next case *
ede0: 2f 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  /.    case WAITI
edf0: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
ee00: 55 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 78  ULE:.      if( x
ee10: 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20  [0]=='%' ){.    
ee20: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
ee30: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
ee40: 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20  L_KEYWORD;.     
ee50: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 6c 6f 77   }else if( islow
ee60: 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  er(x[0]) ){.    
ee70: 20 20 20 20 70 73 70 2d 3e 6c 68 73 20 3d 20 53      psp->lhs = S
ee80: 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
ee90: 20 20 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 20        psp->nrhs 
eea0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 0;.        psp
eeb0: 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 30 3b 0a  ->lhsalias = 0;.
eec0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
eed0: 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
eee0: 5f 41 52 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65  _ARROW;.      }e
eef0: 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b  lse if( x[0]=='{
ef00: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
ef10: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d   psp->prevrule==
ef20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
ef30: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
ef40: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
ef50: 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65 72 65 20 69  lineno,."There i
ef60: 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20  s no prior rule 
ef70: 6f 70 6f 6e 20 77 68 69 63 68 20 74 6f 20 61 74  opon which to at
ef80: 74 61 63 68 20 74 68 65 20 63 6f 64 65 20 5c 0a  tach the code \.
ef90: 66 72 61 67 6d 65 6e 74 20 77 68 69 63 68 20 62  fragment which b
efa0: 65 67 69 6e 73 20 6f 6e 20 74 68 69 73 20 6c 69  egins on this li
efb0: 6e 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ne.");.         
efc0: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
efd0: 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 70 73 70  ;..}else if( psp
efe0: 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65  ->prevrule->code
eff0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
f000: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
f010: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
f020: 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 6f 64 65 20  enlineno,."Code 
f030: 66 72 61 67 6d 65 6e 74 20 62 65 67 69 6e 6e 69  fragment beginni
f040: 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20  ng on this line 
f050: 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  is not the first
f060: 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65   \.to follow the
f070: 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22   previous rule."
f080: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
f090: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
f0a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f0b0: 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76         psp->prev
f0c0: 72 75 6c 65 2d 3e 6c 69 6e 65 20 3d 20 70 73 70  rule->line = psp
f0d0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20  ->tokenlineno;. 
f0e0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
f0f0: 65 76 72 75 6c 65 2d 3e 63 6f 64 65 20 3d 20 26  evrule->code = &
f100: 78 5b 31 5d 3b 0a 09 7d 0a 20 20 20 20 20 20 7d  x[1];..}.      }
f110: 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27  else if( x[0]=='
f120: 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  [' ){.        ps
f130: 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45  p->state = PRECE
f140: 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20  DENCE_MARK_1;.  
f150: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f160: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
f170: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
f180: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
f190: 20 20 20 20 20 20 22 54 6f 6b 65 6e 20 5c 22 25        "Token \"%
f1a0: 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 65 69  s\" should be ei
f1b0: 74 68 65 72 20 5c 22 25 25 5c 22 20 6f 72 20 61  ther \"%%\" or a
f1c0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6e 61 6d   nonterminal nam
f1d0: 65 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78  e.",.          x
f1e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
f1f0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
f200: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
f210: 0a 20 20 20 20 63 61 73 65 20 50 52 45 43 45 44  .    case PRECED
f220: 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20  ENCE_MARK_1:.   
f230: 20 20 20 69 66 28 20 21 69 73 75 70 70 65 72 28     if( !isupper(
f240: 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
f250: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
f260: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
f270: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
f280: 20 20 20 20 22 54 68 65 20 70 72 65 63 65 64 65      "The precede
f290: 6e 63 65 20 73 79 6d 62 6f 6c 20 6d 75 73 74 20  nce symbol must 
f2a0: 62 65 20 61 20 74 65 72 6d 69 6e 61 6c 2e 22 29  be a terminal.")
f2b0: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
f2c0: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f2d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e   }else if( psp->
f2e0: 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20  prevrule==0 ){. 
f2f0: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f300: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f310: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f320: 20 20 20 20 20 20 20 20 20 20 22 54 68 65 72 65            "There
f330: 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c   is no prior rul
f340: 65 20 74 6f 20 61 73 73 69 67 6e 20 70 72 65 63  e to assign prec
f350: 65 64 65 6e 63 65 20 5c 22 5b 25 73 5d 5c 22 2e  edence \"[%s]\".
f360: 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ",x);.        ps
f370: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f380: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
f390: 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72  sp->prevrule->pr
f3a0: 65 63 73 79 6d 21 3d 30 20 29 7b 0a 20 20 20 20  ecsym!=0 ){.    
f3b0: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
f3c0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
f3d0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72  tokenlineno,."Pr
f3e0: 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 20 6f 6e  ecedence mark on
f3f0: 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f   this line is no
f400: 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f  t the first \.to
f410: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76   follow the prev
f420: 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20  ious rule.");.  
f430: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
f440: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
f450: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  se{.        psp-
f460: 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73  >prevrule->precs
f470: 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  ym = Symbol_new(
f480: 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
f490: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50    psp->state = P
f4a0: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32  RECEDENCE_MARK_2
f4b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f4c0: 20 20 20 63 61 73 65 20 50 52 45 43 45 44 45 4e     case PRECEDEN
f4d0: 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20 20 20 20 20  CE_MARK_2:.     
f4e0: 20 69 66 28 20 78 5b 30 5d 21 3d 27 5d 27 20 29   if( x[0]!=']' )
f4f0: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
f500: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
f510: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
f520: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69  o,.          "Mi
f530: 73 73 69 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20 70  ssing \"]\" on p
f540: 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 2e 22  recedence mark."
f550: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
f560: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
f570: 20 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73    }.      psp->s
f580: 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
f590: 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
f5a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f5b0: 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
f5c0: 4f 52 5f 41 52 52 4f 57 3a 0a 20 20 20 20 20 20  OR_ARROW:.      
f5d0: 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26  if( x[0]==':' &&
f5e0: 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b   x[1]==':' && x[
f5f0: 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20  2]=='=' ){.     
f600: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f610: 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65  IN_RHS;.      }e
f620: 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28  lse if( x[0]=='(
f630: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
f640: 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c  ->state = LHS_AL
f650: 49 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c  IAS_1;.      }el
f660: 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
f670: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
f680: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
f690: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
f6a0: 45 78 70 65 63 74 65 64 20 74 6f 20 73 65 65 20  Expected to see 
f6b0: 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e  a \":\" followin
f6c0: 67 20 74 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c  g the LHS symbol
f6d0: 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20   \"%s\".",.     
f6e0: 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e       psp->lhs->n
f6f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ame);.        ps
f700: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f710: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
f720: 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
f730: 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
f740: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
f750: 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41  ;.    case LHS_A
f760: 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66  LIAS_1:.      if
f770: 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20  ( isalpha(x[0]) 
f780: 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
f790: 6c 68 73 61 6c 69 61 73 20 3d 20 78 3b 0a 20 20  lhsalias = x;.  
f7a0: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
f7b0: 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3b 0a   = LHS_ALIAS_2;.
f7c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f7d0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
f7e0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
f7f0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
f800: 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20          "\"%s\" 
f810: 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61  is not a valid a
f820: 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53  lias for the LHS
f830: 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20   \"%s\"\n",.    
f840: 20 20 20 20 20 20 78 2c 70 73 70 2d 3e 6c 68 73        x,psp->lhs
f850: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
f860: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
f870: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
f880: 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
f890: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
f8a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
f8b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48  eak;.    case LH
f8c0: 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20  S_ALIAS_2:.     
f8d0: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29   if( x[0]==')' )
f8e0: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
f8f0: 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53  tate = LHS_ALIAS
f900: 5f 33 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _3;.      }else{
f910: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
f920: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
f930: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
f940: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
f950: 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f  sing \")\" follo
f960: 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e  wing LHS alias n
f970: 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70  ame \"%s\".",psp
f980: 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
f990: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
f9a0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
f9b0: 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
f9c0: 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
f9d0: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
f9e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
f9f0: 65 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3a 0a 20  e LHS_ALIAS_3:. 
fa00: 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
fa10: 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20  :' && x[1]==':' 
fa20: 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a  && x[2]=='=' ){.
fa30: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
fa40: 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20  te = IN_RHS;.   
fa50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fa60: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
fa70: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
fa80: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
fa90: 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22       "Missing \"
faa0: 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20  ->\" following: 
fab0: 5c 22 25 73 28 25 73 29 5c 22 2e 22 2c 0a 20 20  \"%s(%s)\".",.  
fac0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68           psp->lh
fad0: 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68 73  s->name,psp->lhs
fae0: 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20  alias);.        
faf0: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
fb00: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
fb10: 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
fb20: 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20  ER_RULE_ERROR;. 
fb30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
fb40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 49 4e 5f  ak;.    case IN_
fb50: 52 48 53 3a 0a 20 20 20 20 20 20 69 66 28 20 78  RHS:.      if( x
fb60: 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
fb70: 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20      struct rule 
fb80: 2a 72 70 3b 0a 20 20 20 20 20 20 20 20 72 70 20  *rp;.        rp 
fb90: 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a  = (struct rule *
fba0: 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )calloc( sizeof(
fbb0: 73 74 72 75 63 74 20 72 75 6c 65 29 20 2b 20 0a  struct rule) + .
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
fbd0: 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
fbe0: 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 2b 20  l*)*psp->nrhs + 
fbf0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 73  sizeof(char*)*ps
fc00: 70 2d 3e 6e 72 68 73 2c 20 31 29 3b 0a 20 20 20  p->nrhs, 1);.   
fc10: 20 20 20 20 20 69 66 28 20 72 70 3d 3d 30 20 29       if( rp==0 )
fc20: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
fc30: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
fc40: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
fc50: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
fc60: 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65   "Can't allocate
fc70: 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66   enough memory f
fc80: 6f 72 20 74 68 69 73 20 72 75 6c 65 2e 22 29 3b  or this rule.");
fc90: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
fca0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
fcb0: 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72        psp->prevr
fcc0: 75 6c 65 20 3d 20 30 3b 0a 09 7d 65 6c 73 65 7b  ule = 0;..}else{
fcd0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
fce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
fcf0: 72 75 6c 65 6c 69 6e 65 20 3d 20 70 73 70 2d 3e  ruleline = psp->
fd00: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20  tokenlineno;.   
fd10: 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 20 3d         rp->rhs =
fd20: 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a   (struct symbol*
fd30: 2a 29 26 72 70 5b 31 5d 3b 0a 20 20 20 20 20 20  *)&rp[1];.      
fd40: 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73      rp->rhsalias
fd50: 20 3d 20 28 63 68 61 72 2a 2a 29 26 28 72 70 2d   = (char**)&(rp-
fd60: 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 29  >rhs[psp->nrhs])
fd70: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
fd80: 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e 72 68 73  i=0; i<psp->nrhs
fd90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
fda0: 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 20 3d      rp->rhs[i] =
fdb0: 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20   psp->rhs[i];.  
fdc0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
fdd0: 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70 73 70 2d  salias[i] = psp-
fde0: 3e 61 6c 69 61 73 5b 69 5d 3b 0a 09 20 20 7d 0a  >alias[i];..  }.
fdf0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68            rp->lh
fe00: 73 20 3d 20 70 73 70 2d 3e 6c 68 73 3b 0a 20 20  s = psp->lhs;.  
fe10: 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61          rp->lhsa
fe20: 6c 69 61 73 20 3d 20 70 73 70 2d 3e 6c 68 73 61  lias = psp->lhsa
fe30: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
fe40: 72 70 2d 3e 6e 72 68 73 20 3d 20 70 73 70 2d 3e  rp->nrhs = psp->
fe50: 6e 72 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20  nrhs;.          
fe60: 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20  rp->code = 0;.  
fe70: 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63          rp->prec
fe80: 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  sym = 0;.       
fe90: 20 20 20 72 70 2d 3e 69 6e 64 65 78 20 3d 20 70     rp->index = p
fea0: 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 2b 2b 3b  sp->gp->nrule++;
feb0: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e  .          rp->n
fec0: 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e 6c 68 73  extlhs = rp->lhs
fed0: 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20 20 20 20  ->rule;.        
fee0: 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65 20    rp->lhs->rule 
fef0: 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20  = rp;.          
ff00: 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  rp->next = 0;.  
ff10: 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d          if( psp-
ff20: 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30 20 29 7b  >firstrule==0 ){
ff30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73 70  .            psp
ff40: 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70 73  ->firstrule = ps
ff50: 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72 70  p->lastrule = rp
ff60: 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ;..  }else{.    
ff70: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73          psp->las
ff80: 74 72 75 6c 65 2d 3e 6e 65 78 74 20 3d 20 72 70  trule->next = rp
ff90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73  ;.            ps
ffa0: 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72 70  p->lastrule = rp
ffb0: 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20 20 20 20  ;..  }.         
ffc0: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d   psp->prevrule =
ffd0: 20 72 70 3b 0a 09 7d 0a 20 20 20 20 20 20 20 20   rp;..}.        
ffe0: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
fff0: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
10000 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  _RULE;.      }el
10010 73 65 20 69 66 28 20 69 73 61 6c 70 68 61 28 78  se if( isalpha(x
10020 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
10030 69 66 28 20 70 73 70 2d 3e 6e 72 68 73 3e 3d 4d  if( psp->nrhs>=M
10040 41 58 52 48 53 20 29 7b 0a 20 20 20 20 20 20 20  AXRHS ){.       
10050 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
10060 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
10070 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
10080 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d 61 6e          "Too man
10090 79 20 73 79 6d 62 6f 6c 73 20 6f 6e 20 52 48 53  y symbols on RHS
100a0 20 6f 66 20 72 75 6c 65 20 62 65 67 69 6e 6e 69   of rule beginni
100b0 6e 67 20 61 74 20 5c 22 25 73 5c 22 2e 22 2c 0a  ng at \"%s\".",.
100c0 20 20 20 20 20 20 20 20 20 20 20 20 78 29 3b 0a              x);.
100d0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
100e0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
100f0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10100 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
10110 55 4c 45 5f 45 52 52 4f 52 3b 0a 09 7d 65 6c 73  ULE_ERROR;..}els
10120 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  e{.          psp
10130 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d  ->rhs[psp->nrhs]
10140 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
10150 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10160 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73  >alias[psp->nrhs
10170 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
10180 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 09 7d   psp->nrhs++;..}
10190 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
101a0 20 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78   (x[0]=='|' || x
101b0 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20 70 73 70  [0]=='/') && psp
101c0 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20 20  ->nrhs>0 ){.    
101d0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
101e0 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d 3e 72 68  l *msp = psp->rh
101f0 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 3b 0a  s[psp->nrhs-1];.
10200 20 20 20 20 20 20 20 20 69 66 28 20 6d 73 70 2d          if( msp-
10210 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d  >type!=MULTITERM
10220 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
10230 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
10240 2a 6f 72 69 67 73 70 20 3d 20 6d 73 70 3b 0a 20  *origsp = msp;. 
10250 20 20 20 20 20 20 20 20 20 6d 73 70 20 3d 20 63           msp = c
10260 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f 66 28 2a  alloc(1,sizeof(*
10270 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20  msp));.         
10280 20 6d 65 6d 73 65 74 28 6d 73 70 2c 20 30 2c 20   memset(msp, 0, 
10290 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20  sizeof(*msp));. 
102a0 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 74 79           msp->ty
102b0 70 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49 4e  pe = MULTITERMIN
102c0 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73  AL;.          ms
102d0 70 2d 3e 6e 73 75 62 73 79 6d 20 3d 20 31 3b 0a  p->nsubsym = 1;.
102e0 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73            msp->s
102f0 75 62 73 79 6d 20 3d 20 63 61 6c 6c 6f 63 28 31  ubsym = calloc(1
10300 2c 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73  ,sizeof(struct s
10310 79 6d 62 6f 6c 2a 29 29 3b 0a 20 20 20 20 20 20  ymbol*));.      
10320 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b      msp->subsym[
10330 30 5d 20 3d 20 6f 72 69 67 73 70 3b 0a 20 20 20  0] = origsp;.   
10340 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 61 6d 65         msp->name
10350 20 3d 20 6f 72 69 67 73 70 2d 3e 6e 61 6d 65 3b   = origsp->name;
10360 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10370 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d  rhs[psp->nrhs-1]
10380 20 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20   = msp;.        
10390 7d 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e  }.        msp->n
103a0 73 75 62 73 79 6d 2b 2b 3b 0a 20 20 20 20 20 20  subsym++;.      
103b0 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20    msp->subsym = 
103c0 72 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62  realloc(msp->sub
103d0 73 79 6d 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  sym, sizeof(stru
103e0 63 74 20 73 79 6d 62 6f 6c 2a 29 2a 6d 73 70 2d  ct symbol*)*msp-
103f0 3e 6e 73 75 62 73 79 6d 29 3b 0a 20 20 20 20 20  >nsubsym);.     
10400 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 6d     msp->subsym[m
10410 73 70 2d 3e 6e 73 75 62 73 79 6d 2d 31 5d 20 3d  sp->nsubsym-1] =
10420 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 26 78 5b 31   Symbol_new(&x[1
10430 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
10440 69 73 6c 6f 77 65 72 28 78 5b 31 5d 29 20 7c 7c  islower(x[1]) ||
10450 20 69 73 6c 6f 77 65 72 28 6d 73 70 2d 3e 73 75   islower(msp->su
10460 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 5b 30 5d  bsym[0]->name[0]
10470 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ) ){.          E
10480 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
10490 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
104a0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
104b0 20 20 20 20 22 43 61 6e 6e 6f 74 20 66 6f 72 6d      "Cannot form
104c0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 63 6f 6e 74   a compound cont
104d0 61 69 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 65 72  aining a non-ter
104e0 6d 69 6e 61 6c 22 29 3b 0a 20 20 20 20 20 20 20  minal");.       
104f0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
10500 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
10510 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b      }else if( x[
10520 30 5d 3d 3d 27 28 27 20 26 26 20 70 73 70 2d 3e  0]=='(' && psp->
10530 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20 20 20 20  nrhs>0 ){.      
10540 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
10550 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20  HS_ALIAS_1;.    
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 49 6c 6c 65 67 61 6c 20 63 68 61      "Illegal cha
105b0 72 61 63 74 65 72 20 6f 6e 20 52 48 53 20 6f 66  racter on RHS of
105c0 20 72 75 6c 65 3a 20 5c 22 25 73 5c 22 2e 22 2c   rule: \"%s\".",
105d0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
105e0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
105f0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10600 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
10610 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
10620 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
10630 20 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c 49      case RHS_ALI
10640 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20  AS_1:.      if( 
10650 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b  isalpha(x[0]) ){
10660 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c  .        psp->al
10670 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d  ias[psp->nrhs-1]
10680 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73   = x;.        ps
10690 70 2d 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41  p->state = RHS_A
106a0 4c 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65  LIAS_2;.      }e
106b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
106c0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
106d0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
106e0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
106f0 22 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61  "\"%s\" is not a
10700 20 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72   valid alias for
10710 20 74 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 20   the RHS symbol 
10720 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20  \"%s\"\n",.     
10730 20 20 20 20 20 78 2c 70 73 70 2d 3e 72 68 73 5b       x,psp->rhs[
10740 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 2d 3e 6e 61  psp->nrhs-1]->na
10750 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  me);.        psp
10760 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
10770 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10780 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
10790 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
107a0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
107b0 0a 20 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c  .    case RHS_AL
107c0 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66 28  IAS_2:.      if(
107d0 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20   x[0]==')' ){.  
107e0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
107f0 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20   = IN_RHS;.     
10800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10810 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
10820 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
10830 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
10840 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c     "Missing \")\
10850 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20  " following LHS 
10860 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c  alias name \"%s\
10870 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61  ".",psp->lhsalia
10880 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  s);.        psp-
10890 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
108a0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
108b0 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
108c0 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
108d0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
108e0 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
108f0 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52  _FOR_DECL_KEYWOR
10900 44 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73 61  D:.      if( isa
10910 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20  lpha(x[0]) ){.  
10920 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6b        psp->declk
10930 65 79 77 6f 72 64 20 3d 20 78 3b 0a 20 20 20 20  eyword = x;.    
10940 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
10950 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  slot = 0;.      
10960 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e    psp->decllinen
10970 6f 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20  oslot = 0;.     
10980 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
10990 6e 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20  neMacro = 1;.   
109a0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
109b0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
109c0 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20  CL_ARG;.        
109d0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 61  if( strcmp(x,"na
109e0 6d 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  me")==0 ){.     
109f0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10a00 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10a10 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
10a20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
10a30 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 09 7d  ineMacro = 0;..}
10a40 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10a50 78 2c 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20  x,"include")==0 
10a60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
10a70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
10a80 26 28 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75  &(psp->gp->inclu
10a90 64 65 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  de);..}else if( 
10aa0 73 74 72 63 6d 70 28 78 2c 22 63 6f 64 65 22 29  strcmp(x,"code")
10ab0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10ac0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10ad0 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65  t = &(psp->gp->e
10ae0 78 74 72 61 63 6f 64 65 29 3b 0a 09 7d 65 6c 73  xtracode);..}els
10af0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10b00 74 6f 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72  token_destructor
10b10 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10b20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
10b30 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
10b40 74 6f 6b 65 6e 64 65 73 74 3b 0a 09 7d 65 6c 73  tokendest;..}els
10b50 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10b60 64 65 66 61 75 6c 74 5f 64 65 73 74 72 75 63 74  default_destruct
10b70 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  or")==0 ){.     
10b80 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10b90 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70  gslot = &psp->gp
10ba0 2d 3e 76 61 72 64 65 73 74 3b 0a 09 7d 65 6c 73  ->vardest;..}els
10bb0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10bc0 74 6f 6b 65 6e 5f 70 72 65 66 69 78 22 29 3d 3d  token_prefix")==
10bd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10be0 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
10bf0 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65  = &psp->gp->toke
10c00 6e 70 72 65 66 69 78 3b 0a 20 20 20 20 20 20 20  nprefix;.       
10c10 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
10c20 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 09 7d 65  neMacro = 0;..}e
10c30 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
10c40 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f 72 22 29  ,"syntax_error")
10c50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10c60 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10c70 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65  t = &(psp->gp->e
10c80 72 72 6f 72 29 3b 0a 09 7d 65 6c 73 65 20 69 66  rror);..}else if
10c90 28 20 73 74 72 63 6d 70 28 78 2c 22 70 61 72 73  ( strcmp(x,"pars
10ca0 65 5f 61 63 63 65 70 74 22 29 3d 3d 30 20 29 7b  e_accept")==0 ){
10cb0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10cc0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
10cd0 70 73 70 2d 3e 67 70 2d 3e 61 63 63 65 70 74 29  psp->gp->accept)
10ce0 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
10cf0 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 66 61 69  cmp(x,"parse_fai
10d00 6c 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lure")==0 ){.   
10d10 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
10d20 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
10d30 3e 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 09  >gp->failure);..
10d40 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10d50 28 78 2c 22 73 74 61 63 6b 5f 6f 76 65 72 66 6c  (x,"stack_overfl
10d60 6f 77 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ow")==0 ){.     
10d70 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10d80 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10d90 70 2d 3e 6f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  p->overflow);.  
10da0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10db0 73 74 72 63 6d 70 28 78 2c 22 65 78 74 72 61 5f  strcmp(x,"extra_
10dc0 61 72 67 75 6d 65 6e 74 22 29 3d 3d 30 20 29 7b  argument")==0 ){
10dd0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10de0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
10df0 70 73 70 2d 3e 67 70 2d 3e 61 72 67 29 3b 0a 20  psp->gp->arg);. 
10e00 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
10e10 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
10e20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
10e30 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74   if( strcmp(x,"t
10e40 6f 6b 65 6e 5f 74 79 70 65 22 29 3d 3d 30 20 29  oken_type")==0 )
10e50 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
10e60 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
10e70 28 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 74  (psp->gp->tokent
10e80 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ype);.          
10e90 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
10ea0 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  acro = 0;.      
10eb0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
10ec0 6d 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 74 79  mp(x,"default_ty
10ed0 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pe")==0 ){.     
10ee0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10ef0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10f00 70 2d 3e 76 61 72 74 79 70 65 29 3b 0a 20 20 20  p->vartype);.   
10f10 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
10f20 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
10f30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
10f40 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61  f( strcmp(x,"sta
10f50 63 6b 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a  ck_size")==0 ){.
10f60 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
10f70 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
10f80 73 70 2d 3e 67 70 2d 3e 73 74 61 63 6b 73 69 7a  sp->gp->stacksiz
10f90 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  e);.          ps
10fa0 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
10fb0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
10fc0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10fd0 28 78 2c 22 73 74 61 72 74 5f 73 79 6d 62 6f 6c  (x,"start_symbol
10fe0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10ff0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
11000 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
11010 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  >start);.       
11020 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
11030 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20  neMacro = 0;.   
11040 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
11050 74 72 63 6d 70 28 78 2c 22 6c 65 66 74 22 29 3d  trcmp(x,"left")=
11060 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11070 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72  psp->preccounter
11080 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
11090 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4c  p->declassoc = L
110a0 45 46 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70  EFT;.          p
110b0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
110c0 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
110d0 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20  CE_SYMBOL;.     
110e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
110f0 63 6d 70 28 78 2c 22 72 69 67 68 74 22 29 3d 3d  cmp(x,"right")==
11100 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
11110 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b  sp->preccounter+
11120 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  +;.          psp
11130 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 52 49  ->declassoc = RI
11140 47 48 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70  GHT;.          p
11150 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
11160 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
11170 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20  CE_SYMBOL;.     
11180 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
11190 63 6d 70 28 78 2c 22 6e 6f 6e 61 73 73 6f 63 22  cmp(x,"nonassoc"
111a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
111b0 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74    psp->preccount
111c0 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  er++;.          
111d0 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d  psp->declassoc =
111e0 20 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20   NONE;.         
111f0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
11200 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44  ITING_FOR_PRECED
11210 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65  ENCE_SYMBOL;..}e
11220 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
11230 2c 22 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d  ,"destructor")==
11240 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
11250 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
11260 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54  ING_FOR_DESTRUCT
11270 4f 52 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73  OR_SYMBOL;..}els
11280 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
11290 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  type")==0 ){.   
112a0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
112b0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
112c0 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3b  DATATYPE_SYMBOL;
112d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
112e0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 66 61 6c  f( strcmp(x,"fal
112f0 6c 62 61 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20  lback")==0 ){.  
11300 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 61 6c          psp->fal
11310 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20  lback = 0;.     
11320 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11330 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41  = WAITING_FOR_FA
11340 4c 4c 42 41 43 4b 5f 49 44 3b 0a 20 20 20 20 20  LLBACK_ID;.     
11350 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
11360 63 6d 70 28 78 2c 22 77 69 6c 64 63 61 72 64 22  cmp(x,"wildcard"
11370 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11380 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
11390 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43  AITING_FOR_WILDC
113a0 41 52 44 5f 49 44 3b 0a 20 20 20 20 20 20 20 20  ARD_ID;.        
113b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
113c0 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
113d0 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
113e0 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
113f0 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 64        "Unknown d
11400 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f  eclaration keywo
11410 72 64 3a 20 5c 22 25 25 25 73 5c 22 2e 22 2c 78  rd: \"%%%s\".",x
11420 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
11430 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
11440 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11450 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
11460 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  R_DECL_ERROR;..}
11470 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11480 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11490 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
114a0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
114b0 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
114c0 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65  l declaration ke
114d0 79 77 6f 72 64 3a 20 5c 22 25 73 5c 22 2e 22 2c  yword: \"%s\".",
114e0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
114f0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11500 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11510 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
11520 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
11530 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
11540 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
11550 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f  _FOR_DESTRUCTOR_
11560 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66  SYMBOL:.      if
11570 28 20 21 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  ( !isalpha(x[0])
11580 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
11590 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
115a0 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
115b0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
115c0 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73  Symbol name miss
115d0 69 6e 67 20 61 66 74 65 72 20 25 64 65 73 74 72  ing after %destr
115e0 75 63 74 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b  uctor keyword");
115f0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
11600 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
11610 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
11620 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
11630 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
11640 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72  lse{.        str
11650 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
11660 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
11670 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
11680 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e  largslot = &sp->
11690 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 20 20  destructor;.    
116a0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e      psp->decllin
116b0 65 6e 6f 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64  enoslot = &sp->d
116c0 65 73 74 4c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20  estLineno;.     
116d0 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
116e0 6e 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20  neMacro = 1;.   
116f0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11700 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
11710 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a  CL_ARG;.      }.
11720 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11730 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
11740 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f  R_DATATYPE_SYMBO
11750 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  L:.      if( !is
11760 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
11770 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
11780 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
11790 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
117a0 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f            "Symbo
117b0 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61  l name missing a
117c0 66 74 65 72 20 25 64 65 73 74 72 75 63 74 6f 72  fter %destructor
117d0 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20   keyword");.    
117e0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
117f0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
11800 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
11810 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
11820 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
11830 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
11840 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62  ymbol *sp = Symb
11850 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
11860 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
11870 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61 74 61 74  lot = &sp->datat
11880 79 70 65 3b 0a 20 20 20 20 20 20 20 20 70 73 70  ype;.        psp
11890 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
118a0 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  o = 0;.        p
118b0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
118c0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47  ING_FOR_DECL_ARG
118d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
118e0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
118f0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43  WAITING_FOR_PREC
11900 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20  EDENCE_SYMBOL:. 
11910 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
11920 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  .' ){.        ps
11930 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
11940 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
11950 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
11960 20 69 66 28 20 69 73 75 70 70 65 72 28 78 5b 30   if( isupper(x[0
11970 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  ]) ){.        st
11980 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
11990 0a 20 20 20 20 20 20 20 20 73 70 20 3d 20 53 79  .        sp = Sy
119a0 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
119b0 20 20 20 20 20 69 66 28 20 73 70 2d 3e 70 72 65       if( sp->pre
119c0 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c>=0 ){.        
119d0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
119e0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
119f0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11a00 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 5c         "Symbol \
11a10 22 25 73 5c 22 20 68 61 73 20 61 6c 72 65 61 64  "%s\" has alread
11a20 79 20 62 65 20 67 69 76 65 6e 20 61 20 70 72 65  y be given a pre
11a30 63 65 64 65 6e 63 65 2e 22 2c 78 29 3b 0a 20 20  cedence.",x);.  
11a40 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11a50 6f 72 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 7b  orcnt++;..}else{
11a60 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 70  .          sp->p
11a70 72 65 63 20 3d 20 70 73 70 2d 3e 70 72 65 63 63  rec = psp->precc
11a80 6f 75 6e 74 65 72 3b 0a 20 20 20 20 20 20 20 20  ounter;.        
11a90 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 70 73    sp->assoc = ps
11aa0 70 2d 3e 64 65 63 6c 61 73 73 6f 63 3b 0a 09 7d  p->declassoc;..}
11ab0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11ac0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11ad0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11ae0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
11af0 20 20 20 20 20 20 20 20 20 22 43 61 6e 27 74 20           "Can't 
11b00 61 73 73 69 67 6e 20 61 20 70 72 65 63 65 64 65  assign a precede
11b10 6e 63 65 20 74 6f 20 5c 22 25 73 5c 22 2e 22 2c  nce to \"%s\".",
11b20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
11b30 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11b40 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
11b50 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
11b60 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3a  NG_FOR_DECL_ARG:
11b70 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
11b80 3d 27 7b 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c  ='{' || x[0]=='\
11b90 22 27 20 7c 7c 20 69 73 61 6c 6e 75 6d 28 78 5b  "' || isalnum(x[
11ba0 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  0]) ){.        c
11bb0 68 61 72 20 2a 7a 4f 6c 64 2c 20 2a 7a 4e 65 77  har *zOld, *zNew
11bc0 2c 20 2a 7a 42 75 66 2c 20 2a 7a 3b 0a 20 20 20  , *zBuf, *z;.   
11bd0 20 20 20 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 6e       int nOld, n
11be0 2c 20 6e 4c 69 6e 65 2c 20 6e 4e 65 77 2c 20 6e  , nLine, nNew, n
11bf0 42 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e  Back;.        in
11c00 74 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 3b 0a  t addLineMacro;.
11c10 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 4c 69          char zLi
11c20 6e 65 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20  ne[50];.        
11c30 7a 4e 65 77 20 3d 20 78 3b 0a 20 20 20 20 20 20  zNew = x;.      
11c40 20 20 69 66 28 20 7a 4e 65 77 5b 30 5d 3d 3d 27    if( zNew[0]=='
11c50 22 27 20 7c 7c 20 7a 4e 65 77 5b 30 5d 3d 3d 27  "' || zNew[0]=='
11c60 7b 27 20 29 20 7a 4e 65 77 2b 2b 3b 0a 20 20 20  {' ) zNew++;.   
11c70 20 20 20 20 20 6e 4e 65 77 20 3d 20 6c 65 6d 6f       nNew = lemo
11c80 6e 53 74 72 6c 65 6e 28 7a 4e 65 77 29 3b 0a 20  nStrlen(zNew);. 
11c90 20 20 20 20 20 20 20 69 66 28 20 2a 70 73 70 2d         if( *psp-
11ca0 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 29 7b 0a  >declargslot ){.
11cb0 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20 3d            zOld =
11cc0 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c   *psp->declargsl
11cd0 6f 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ot;.        }els
11ce0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c  e{.          zOl
11cf0 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  d = "";.        
11d00 7d 0a 20 20 20 20 20 20 20 20 6e 4f 6c 64 20 3d  }.        nOld =
11d10 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4f 6c   lemonStrlen(zOl
11d20 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20  d);.        n = 
11d30 6e 4f 6c 64 20 2b 20 6e 4e 65 77 20 2b 20 32 30  nOld + nNew + 20
11d40 3b 0a 20 20 20 20 20 20 20 20 61 64 64 4c 69 6e  ;.        addLin
11d50 65 4d 61 63 72 6f 20 3d 20 21 70 73 70 2d 3e 67  eMacro = !psp->g
11d60 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
11d70 20 26 26 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c   && psp->insertL
11d80 69 6e 65 4d 61 63 72 6f 20 26 26 0a 20 20 20 20  ineMacro &&.    
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11da0 20 20 20 20 28 70 73 70 2d 3e 64 65 63 6c 6c 69      (psp->declli
11db0 6e 65 6e 6f 73 6c 6f 74 3d 3d 30 20 7c 7c 20 70  nenoslot==0 || p
11dc0 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
11dd0 6f 74 5b 30 5d 21 3d 30 29 3b 0a 20 20 20 20 20  ot[0]!=0);.     
11de0 20 20 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61     if( addLineMa
11df0 63 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  cro ){.         
11e00 20 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65   for(z=psp->file
11e10 6e 61 6d 65 2c 20 6e 42 61 63 6b 3d 30 3b 20 2a  name, nBack=0; *
11e20 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; z++){.       
11e30 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c       if( *z=='\\
11e40 27 20 29 20 6e 42 61 63 6b 2b 2b 3b 0a 20 20 20  ' ) nBack++;.   
11e50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11e60 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65     sprintf(zLine
11e70 2c 20 22 23 6c 69 6e 65 20 25 64 20 22 2c 20 70  , "#line %d ", p
11e80 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 29  sp->tokenlineno)
11e90 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e  ;.          nLin
11ea0 65 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  e = lemonStrlen(
11eb0 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  zLine);.        
11ec0 20 20 6e 20 2b 3d 20 6e 4c 69 6e 65 20 2b 20 6c    n += nLine + l
11ed0 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 73 70 2d 3e  emonStrlen(psp->
11ee0 66 69 6c 65 6e 61 6d 65 29 20 2b 20 6e 42 61 63  filename) + nBac
11ef0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
11f00 20 20 20 20 20 2a 70 73 70 2d 3e 64 65 63 6c 61       *psp->decla
11f10 72 67 73 6c 6f 74 20 3d 20 7a 42 75 66 20 3d 20  rgslot = zBuf = 
11f20 72 65 61 6c 6c 6f 63 28 2a 70 73 70 2d 3e 64 65  realloc(*psp->de
11f30 63 6c 61 72 67 73 6c 6f 74 2c 20 6e 29 3b 0a 20  clargslot, n);. 
11f40 20 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e         zBuf += n
11f50 4f 6c 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Old;.        if(
11f60 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20 29 7b   addLineMacro ){
11f70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
11f80 4f 6c 64 20 26 26 20 7a 42 75 66 5b 2d 31 5d 21  Old && zBuf[-1]!
11f90 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\n' ){.       
11fa0 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
11fb0 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20   '\n';.         
11fc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
11fd0 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c  cpy(zBuf, zLine,
11fe0 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20   nLine);.       
11ff0 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4c 69 6e 65     zBuf += nLine
12000 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42  ;.          *(zB
12010 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20  uf++) = '"';.   
12020 20 20 20 20 20 20 20 66 6f 72 28 7a 3d 70 73 70         for(z=psp
12030 2d 3e 66 69 6c 65 6e 61 6d 65 3b 20 2a 7a 3b 20  ->filename; *z; 
12040 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  z++){.          
12050 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29    if( *z=='\\' )
12060 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
12070 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 5c 27  *(zBuf++) = '\\'
12080 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
12090 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42              *(zB
120a0 75 66 2b 2b 29 20 3d 20 2a 7a 3b 0a 20 20 20 20  uf++) = *z;.    
120b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
120c0 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22    *(zBuf++) = '"
120d0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a  ';.          *(z
120e0 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20  Buf++) = '\n';. 
120f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12100 20 69 66 28 20 70 73 70 2d 3e 64 65 63 6c 6c 69   if( psp->declli
12110 6e 65 6e 6f 73 6c 6f 74 20 26 26 20 70 73 70 2d  nenoslot && psp-
12120 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b  >decllinenoslot[
12130 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0]==0 ){.       
12140 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65     psp->declline
12150 6e 6f 73 6c 6f 74 5b 30 5d 20 3d 20 70 73 70 2d  noslot[0] = psp-
12160 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20  >tokenlineno;.  
12170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12180 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4e 65  memcpy(zBuf, zNe
12190 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20  w, nNew);.      
121a0 20 20 7a 42 75 66 20 2b 3d 20 6e 4e 65 77 3b 0a    zBuf += nNew;.
121b0 20 20 20 20 20 20 20 20 2a 7a 42 75 66 20 3d 20          *zBuf = 
121c0 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
121d0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
121e0 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
121f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12200 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
12210 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
12220 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
12230 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67            "Illeg
12240 61 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 25  al argument to %
12250 25 25 73 3a 20 25 73 22 2c 70 73 70 2d 3e 64 65  %%s: %s",psp->de
12260 63 6c 6b 65 79 77 6f 72 64 2c 78 29 3b 0a 20 20  clkeyword,x);.  
12270 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
12280 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
12290 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
122a0 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
122b0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
122c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
122d0 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46  se WAITING_FOR_F
122e0 41 4c 4c 42 41 43 4b 5f 49 44 3a 0a 20 20 20 20  ALLBACK_ID:.    
122f0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
12300 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
12310 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
12320 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
12330 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
12340 28 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d 29  ( !isupper(x[0])
12350 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
12360 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
12370 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
12380 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
12390 22 25 25 66 61 6c 6c 62 61 63 6b 20 61 72 67 75  "%%fallback argu
123a0 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75  ment \"%s\" shou
123b0 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20  ld be a token", 
123c0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
123d0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
123e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
123f0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
12400 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  *sp = Symbol_new
12410 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (x);.        if(
12420 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d   psp->fallback==
12430 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
12440 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 73  sp->fallback = s
12450 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
12460 20 69 66 28 20 73 70 2d 3e 66 61 6c 6c 62 61 63   if( sp->fallbac
12470 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  k ){.          E
12480 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
12490 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65  ename, psp->toke
124a0 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
124b0 20 20 20 20 20 22 4d 6f 72 65 20 74 68 61 6e 20       "More than 
124c0 6f 6e 65 20 66 61 6c 6c 62 61 63 6b 20 61 73 73  one fallback ass
124d0 69 67 6e 65 64 20 74 6f 20 74 6f 6b 65 6e 20 25  igned to token %
124e0 73 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  s", x);.        
124f0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
12500 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
12510 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e  {.          sp->
12520 66 61 6c 6c 62 61 63 6b 20 3d 20 70 73 70 2d 3e  fallback = psp->
12530 66 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20  fallback;.      
12540 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 68 61 73      psp->gp->has
12550 5f 66 61 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  _fallback = 1;. 
12560 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12570 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12580 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
12590 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 3a 0a  OR_WILDCARD_ID:.
125a0 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
125b0 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '.' ){.        p
125c0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
125d0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
125e0 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RULE;.      }els
125f0 65 20 69 66 28 20 21 69 73 75 70 70 65 72 28 78  e if( !isupper(x
12600 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
12610 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
12620 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b  lename, psp->tok
12630 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
12640 20 20 20 20 22 25 25 77 69 6c 64 63 61 72 64 20      "%%wildcard 
12650 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20  argument \"%s\" 
12660 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65  should be a toke
12670 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  n", x);.        
12680 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
12690 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
126a0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
126b0 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c  bol *sp = Symbol
126c0 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
126d0 20 69 66 28 20 70 73 70 2d 3e 67 70 2d 3e 77 69   if( psp->gp->wi
126e0 6c 64 63 61 72 64 3d 3d 30 20 29 7b 0a 20 20 20  ldcard==0 ){.   
126f0 20 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e         psp->gp->
12700 77 69 6c 64 63 61 72 64 20 3d 20 73 70 3b 0a 20  wildcard = sp;. 
12710 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
12720 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
12730 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
12740 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
12750 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 45  ,.            "E
12760 78 74 72 61 20 77 69 6c 64 63 61 72 64 20 74 6f  xtra wildcard to
12770 20 74 6f 6b 65 6e 3a 20 25 73 22 2c 20 78 29 3b   token: %s", x);
12780 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12790 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
127a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
127b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
127c0 61 73 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52  ase RESYNC_AFTER
127d0 5f 52 55 4c 45 5f 45 52 52 4f 52 3a 0a 2f 2a 20  _RULE_ERROR:./* 
127e0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
127f0 2e 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20  .' ) psp->state 
12800 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
12810 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 2a 2a 20 20  CL_OR_RULE;.**  
12820 20 20 20 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20      break; */.  
12830 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41 46    case RESYNC_AF
12840 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3a 0a  TER_DECL_ERROR:.
12850 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
12860 27 2e 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65  '.' ) psp->state
12870 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
12880 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20  ECL_OR_RULE;.   
12890 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27     if( x[0]=='%'
128a0 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20   ) psp->state = 
128b0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
128c0 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20  _KEYWORD;.      
128d0 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  break;.  }.}../*
128e0 20 52 75 6e 20 74 68 65 20 70 72 65 70 72 6f 63   Run the preproc
128f0 65 73 73 6f 72 20 6f 76 65 72 20 74 68 65 20 69  essor over the i
12900 6e 70 75 74 20 66 69 6c 65 20 74 65 78 74 2e 20  nput file text. 
12910 20 54 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   The global vari
12920 61 62 6c 65 73 0a 2a 2a 20 61 7a 44 65 66 69 6e  ables.** azDefin
12930 65 5b 30 5d 20 74 68 72 6f 75 67 68 20 61 7a 44  e[0] through azD
12940 65 66 69 6e 65 5b 6e 44 65 66 69 6e 65 2d 31 5d  efine[nDefine-1]
12950 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
12960 6d 65 73 20 6f 66 20 61 6c 6c 20 64 65 66 69 6e  mes of all defin
12970 65 64 0a 2a 2a 20 6d 61 63 72 6f 73 2e 20 20 54  ed.** macros.  T
12980 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
12990 73 20 66 6f 72 20 22 25 69 66 64 65 66 22 20 61  s for "%ifdef" a
129a0 6e 64 20 22 25 69 66 6e 64 65 66 22 20 61 6e 64  nd "%ifndef" and
129b0 20 22 25 65 6e 64 69 66 22 20 61 6e 64 0a 2a 2a   "%endif" and.**
129c0 20 63 6f 6d 6d 65 6e 74 73 20 74 68 65 6d 20 6f   comments them o
129d0 75 74 2e 20 20 54 65 78 74 20 69 6e 20 62 65 74  ut.  Text in bet
129e0 77 65 65 6e 20 69 73 20 61 6c 73 6f 20 63 6f 6d  ween is also com
129f0 6d 65 6e 74 65 64 20 6f 75 74 20 61 73 20 61 70  mented out as ap
12a00 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
12a10 61 74 69 63 20 76 6f 69 64 20 70 72 65 70 72 6f  atic void prepro
12a20 63 65 73 73 5f 69 6e 70 75 74 28 63 68 61 72 20  cess_input(char 
12a30 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  *z){.  int i, j,
12a40 20 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20 65 78 63   k, n;.  int exc
12a50 6c 75 64 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lude = 0;.  int 
12a60 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74  start = 0;.  int
12a70 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 69   lineno = 1;.  i
12a80 6e 74 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 20  nt start_lineno 
12a90 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 1;.  for(i=0; 
12aa0 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
12ab0 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29  if( z[i]=='\n' )
12ac0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69   lineno++;.    i
12ad0 66 28 20 7a 5b 69 5d 21 3d 27 25 27 20 7c 7c 20  f( z[i]!='%' || 
12ae0 28 69 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 21 3d  (i>0 && z[i-1]!=
12af0 27 5c 6e 27 29 20 29 20 63 6f 6e 74 69 6e 75 65  '\n') ) continue
12b00 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  ;.    if( strncm
12b10 70 28 26 7a 5b 69 5d 2c 22 25 65 6e 64 69 66 22  p(&z[i],"%endif"
12b20 2c 36 29 3d 3d 30 20 26 26 20 69 73 73 70 61 63  ,6)==0 && isspac
12b30 65 28 7a 5b 69 2b 36 5d 29 20 29 7b 0a 20 20 20  e(z[i+6]) ){.   
12b40 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29     if( exclude )
12b50 7b 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64  {.        exclud
12b60 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e--;.        if(
12b70 20 65 78 63 6c 75 64 65 3d 3d 30 20 29 7b 0a 20   exclude==0 ){. 
12b80 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 73           for(j=s
12b90 74 61 72 74 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 20  tart; j<i; j++) 
12ba0 69 66 28 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 20 29  if( z[j]!='\n' )
12bb0 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20   z[j] = ' ';.   
12bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12bd0 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b       for(j=i; z[
12be0 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27  j] && z[j]!='\n'
12bf0 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20  ; j++) z[j] = ' 
12c00 27 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ';.    }else if(
12c10 20 28 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c   (strncmp(&z[i],
12c20 22 25 69 66 64 65 66 22 2c 36 29 3d 3d 30 20 26  "%ifdef",6)==0 &
12c30 26 20 69 73 73 70 61 63 65 28 7a 5b 69 2b 36 5d  & isspace(z[i+6]
12c40 29 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  )).          || 
12c50 28 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22  (strncmp(&z[i],"
12c60 25 69 66 6e 64 65 66 22 2c 37 29 3d 3d 30 20 26  %ifndef",7)==0 &
12c70 26 20 69 73 73 70 61 63 65 28 7a 5b 69 2b 37 5d  & isspace(z[i+7]
12c80 29 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  )) ){.      if( 
12c90 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20  exclude ){.     
12ca0 20 20 20 65 78 63 6c 75 64 65 2b 2b 3b 0a 20 20     exclude++;.  
12cb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12cc0 20 20 20 66 6f 72 28 6a 3d 69 2b 37 3b 20 69 73     for(j=i+7; is
12cd0 73 70 61 63 65 28 7a 5b 6a 5d 29 3b 20 6a 2b 2b  space(z[j]); j++
12ce0 29 7b 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ){}.        for(
12cf0 6e 3d 30 3b 20 7a 5b 6a 2b 6e 5d 20 26 26 20 21  n=0; z[j+n] && !
12d00 69 73 73 70 61 63 65 28 7a 5b 6a 2b 6e 5d 29 3b  isspace(z[j+n]);
12d10 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   n++){}.        
12d20 65 78 63 6c 75 64 65 20 3d 20 31 3b 0a 20 20 20  exclude = 1;.   
12d30 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
12d40 6e 44 65 66 69 6e 65 3b 20 6b 2b 2b 29 7b 0a 20  nDefine; k++){. 
12d50 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
12d60 6e 63 6d 70 28 61 7a 44 65 66 69 6e 65 5b 6b 5d  ncmp(azDefine[k]
12d70 2c 26 7a 5b 6a 5d 2c 6e 29 3d 3d 30 20 26 26 20  ,&z[j],n)==0 && 
12d80 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 7a 44 65  lemonStrlen(azDe
12d90 66 69 6e 65 5b 6b 5d 29 3d 3d 6e 20 29 7b 0a 20  fine[k])==n ){. 
12da0 20 20 20 20 20 20 20 20 20 20 20 65 78 63 6c 75             exclu
12db0 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
12dc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12dd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
12de0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
12df0 2b 33 5d 3d 3d 27 6e 27 20 29 20 65 78 63 6c 75  +3]=='n' ) exclu
12e00 64 65 20 3d 20 21 65 78 63 6c 75 64 65 3b 0a 20  de = !exclude;. 
12e10 20 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75         if( exclu
12e20 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
12e30 73 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20  start = i;.     
12e40 20 20 20 20 20 73 74 61 72 74 5f 6c 69 6e 65 6e       start_linen
12e50 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20  o = lineno;.    
12e60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12e70 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a      for(j=i; z[j
12e80 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b  ] && z[j]!='\n';
12e90 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20 27   j++) z[j] = ' '
12ea0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
12eb0 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20  ( exclude ){.   
12ec0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
12ed0 22 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 25  "unterminated %%
12ee0 69 66 64 65 66 20 73 74 61 72 74 69 6e 67 20 6f  ifdef starting o
12ef0 6e 20 6c 69 6e 65 20 25 64 5c 6e 22 2c 20 73 74  n line %d\n", st
12f00 61 72 74 5f 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  art_lineno);.   
12f10 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a   exit(1);.  }.}.
12f20 0a 2f 2a 20 49 6e 20 73 70 69 74 65 20 6f 66 20  ./* In spite of 
12f30 69 74 73 20 6e 61 6d 65 2c 20 74 68 69 73 20 66  its name, this f
12f40 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 61 6c 6c  unction is reall
12f50 79 20 61 20 73 63 61 6e 6e 65 72 2e 20 20 49 74  y a scanner.  It
12f60 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
12f70 65 6e 74 69 72 65 20 69 6e 70 75 74 20 66 69 6c  entire input fil
12f80 65 20 28 61 6c 6c 20 61 74 20 6f 6e 63 65 29 20  e (all at once) 
12f90 74 68 65 6e 20 74 6f 6b 65 6e 69 7a 65 73 20 69  then tokenizes i
12fa0 74 2e 20 20 45 61 63 68 0a 2a 2a 20 74 6f 6b 65  t.  Each.** toke
12fb0 6e 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  n is passed to t
12fc0 68 65 20 66 75 6e 63 74 69 6f 6e 20 22 70 61 72  he function "par
12fd0 73 65 6f 6e 65 74 6f 6b 65 6e 22 20 77 68 69 63  seonetoken" whic
12fe0 68 20 62 75 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20  h builds all.** 
12ff0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
13000 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
13010 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20 73 74  in the global st
13020 61 74 65 20 76 65 63 74 6f 72 20 22 67 70 22 2e  ate vector "gp".
13030 0a 2a 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 67  .*/.void Parse(g
13040 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
13050 2a 67 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  *gp;.{.  struct 
13060 70 73 74 61 74 65 20 70 73 3b 0a 20 20 46 49 4c  pstate ps;.  FIL
13070 45 20 2a 66 70 3b 0a 20 20 63 68 61 72 20 2a 66  E *fp;.  char *f
13080 69 6c 65 62 75 66 3b 0a 20 20 69 6e 74 20 66 69  ilebuf;.  int fi
13090 6c 65 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69  lesize;.  int li
130a0 6e 65 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20  neno;.  int c;. 
130b0 20 63 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74   char *cp, *next
130c0 63 70 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c  cp;.  int startl
130d0 69 6e 65 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73  ine = 0;..  mems
130e0 65 74 28 26 70 73 2c 20 27 5c 30 27 2c 20 73 69  et(&ps, '\0', si
130f0 7a 65 6f 66 28 70 73 29 29 3b 0a 20 20 70 73 2e  zeof(ps));.  ps.
13100 67 70 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66 69  gp = gp;.  ps.fi
13110 6c 65 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69 6c  lename = gp->fil
13120 65 6e 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72 6f  ename;.  ps.erro
13130 72 63 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e 73  rcnt = 0;.  ps.s
13140 74 61 74 65 20 3d 20 49 4e 49 54 49 41 4c 49 5a  tate = INITIALIZ
13150 45 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62  E;..  /* Begin b
13160 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 69 6e  y reading the in
13170 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66 70  put file */.  fp
13180 20 3d 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c 65   = fopen(ps.file
13190 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66  name,"rb");.  if
131a0 28 20 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 45  ( fp==0 ){.    E
131b0 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e  rrorMsg(ps.filen
131c0 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70 65  ame,0,"Can't ope
131d0 6e 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20  n this file for 
131e0 72 65 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20 20  reading.");.    
131f0 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  gp->errorcnt++;.
13200 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
13210 20 20 66 73 65 65 6b 28 66 70 2c 30 2c 32 29 3b    fseek(fp,0,2);
13220 0a 20 20 66 69 6c 65 73 69 7a 65 20 3d 20 66 74  .  filesize = ft
13230 65 6c 6c 28 66 70 29 3b 0a 20 20 72 65 77 69 6e  ell(fp);.  rewin
13240 64 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66  d(fp);.  filebuf
13250 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f   = (char *)mallo
13260 63 28 20 66 69 6c 65 73 69 7a 65 2b 31 20 29 3b  c( filesize+1 );
13270 0a 20 20 69 66 28 20 66 69 6c 65 62 75 66 3d 3d  .  if( filebuf==
13280 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73  0 ){.    ErrorMs
13290 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c  g(ps.filename,0,
132a0 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20  "Can't allocate 
132b0 25 64 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  %d of memory to 
132c0 68 6f 6c 64 20 74 68 69 73 20 66 69 6c 65 2e 22  hold this file."
132d0 2c 0a 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65  ,.      filesize
132e0 2b 31 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72  +1);.    gp->err
132f0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  orcnt++;.    ret
13300 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  urn;.  }.  if( f
13310 72 65 61 64 28 66 69 6c 65 62 75 66 2c 31 2c 66  read(filebuf,1,f
13320 69 6c 65 73 69 7a 65 2c 66 70 29 21 3d 66 69 6c  ilesize,fp)!=fil
13330 65 73 69 7a 65 20 29 7b 0a 20 20 20 20 45 72 72  esize ){.    Err
13340 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d  orMsg(ps.filenam
13350 65 2c 30 2c 22 43 61 6e 27 74 20 72 65 61 64 20  e,0,"Can't read 
13360 69 6e 20 61 6c 6c 20 25 64 20 62 79 74 65 73 20  in all %d bytes 
13370 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a  of this file.",.
13380 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65 29 3b        filesize);
13390 0a 20 20 20 20 66 72 65 65 28 66 69 6c 65 62 75  .    free(filebu
133a0 66 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f  f);.    gp->erro
133b0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
133c0 72 6e 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  rn;.  }.  fclose
133d0 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 5b  (fp);.  filebuf[
133e0 66 69 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a  filesize] = 0;..
133f0 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 69 6e 69    /* Make an ini
13400 74 69 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67  tial pass throug
13410 68 20 74 68 65 20 66 69 6c 65 20 74 6f 20 68 61  h the file to ha
13420 6e 64 6c 65 20 25 69 66 64 65 66 20 61 6e 64 20  ndle %ifdef and 
13430 25 69 66 6e 64 65 66 20 2a 2f 0a 20 20 70 72 65  %ifndef */.  pre
13440 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 66 69  process_input(fi
13450 6c 65 62 75 66 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  lebuf);..  /* No
13460 77 20 73 63 61 6e 20 74 68 65 20 74 65 78 74 20  w scan the text 
13470 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
13480 65 20 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20  e */.  lineno = 
13490 31 3b 0a 20 20 66 6f 72 28 63 70 3d 66 69 6c 65  1;.  for(cp=file
134a0 62 75 66 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30  buf; (c= *cp)!=0
134b0 3b 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ; ){.    if( c==
134c0 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
134d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
134e0 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
134f0 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a  he line number *
13500 2f 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63  /.    if( isspac
13510 65 28 63 29 20 29 7b 20 63 70 2b 2b 3b 20 63 6f  e(c) ){ cp++; co
13520 6e 74 69 6e 75 65 3b 20 7d 20 20 2f 2a 20 53 6b  ntinue; }  /* Sk
13530 69 70 20 61 6c 6c 20 77 68 69 74 65 20 73 70 61  ip all white spa
13540 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d  ce */.    if( c=
13550 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='/' && cp[1]=='
13560 2f 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f  /' ){          /
13570 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65  * Skip C++ style
13580 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   comments */.   
13590 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20     cp+=2;.      
135a0 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
135b0 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20  =0 && c!='\n' ) 
135c0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74  cp++;.      cont
135d0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
135e0 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70  if( c=='/' && cp
135f0 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 20 20 20  [1]=='*' ){     
13600 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 20 73       /* Skip C s
13610 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f  tyle comments */
13620 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20  .      cp+=2;.  
13630 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a      while( (c= *
13640 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f  cp)!=0 && (c!='/
13650 27 20 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a 27  ' || cp[-1]!='*'
13660 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
13670 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e   c=='\n' ) linen
13680 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b  o++;.        cp+
13690 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
136a0 20 69 66 28 20 63 20 29 20 63 70 2b 2b 3b 0a 20   if( c ) cp++;. 
136b0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
136c0 20 20 20 7d 0a 20 20 20 20 70 73 2e 74 6f 6b 65     }.    ps.toke
136d0 6e 73 74 61 72 74 20 3d 20 63 70 3b 20 20 20 20  nstart = cp;    
136e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
136f0 61 72 6b 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ark the beginnin
13700 67 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 2a  g of the token *
13710 2f 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 6c 69  /.    ps.tokenli
13720 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20 20  neno = lineno;  
13730 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
13740 6e 75 6d 62 65 72 20 6f 6e 20 77 68 69 63 68 20  number on which 
13750 74 6f 6b 65 6e 20 62 65 67 69 6e 73 20 2a 2f 0a  token begins */.
13760 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 22 27 20      if( c=='\"' 
13770 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
13780 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
13790 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20   literals */.   
137a0 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 77     cp++;.      w
137b0 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
137c0 30 20 26 26 20 63 21 3d 27 5c 22 27 20 29 7b 0a  0 && c!='\"' ){.
137d0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
137e0 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n' ) lineno++;.
137f0 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20          cp++;.  
13800 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13810 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
13820 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65  ErrorMsg(ps.file
13830 6e 61 6d 65 2c 73 74 61 72 74 6c 69 6e 65 2c 0a  name,startline,.
13840 22 53 74 72 69 6e 67 20 73 74 61 72 74 69 6e 67  "String starting
13850 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73   on this line is
13860 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20   not terminated 
13870 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f  before the end o
13880 66 20 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20  f the file.");. 
13890 20 20 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63         ps.errorc
138a0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65  nt++;.        ne
138b0 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20  xtcp = cp;.     
138c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
138d0 6e 65 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20  nextcp = cp+1;. 
138e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
138f0 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 7b 20 20   if( c=='{' ){  
13900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13910 41 20 62 6c 6f 63 6b 20 6f 66 20 43 20 63 6f 64  A block of C cod
13920 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c  e */.      int l
13930 65 76 65 6c 3b 0a 20 20 20 20 20 20 63 70 2b 2b  evel;.      cp++
13940 3b 0a 20 20 20 20 20 20 66 6f 72 28 6c 65 76 65  ;.      for(leve
13950 6c 3d 31 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30  l=1; (c= *cp)!=0
13960 20 26 26 20 28 6c 65 76 65 6c 3e 31 20 7c 7c 20   && (level>1 || 
13970 63 21 3d 27 7d 27 29 3b 20 63 70 2b 2b 29 7b 0a  c!='}'); cp++){.
13980 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
13990 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n' ) lineno++;.
139a0 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
139b0 20 63 3d 3d 27 7b 27 20 29 20 6c 65 76 65 6c 2b   c=='{' ) level+
139c0 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20  +;.        else 
139d0 69 66 28 20 63 3d 3d 27 7d 27 20 29 20 6c 65 76  if( c=='}' ) lev
139e0 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 65 6c  el--;.        el
139f0 73 65 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26  se if( c=='/' &&
13a00 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20   cp[1]=='*' ){  
13a10 2f 2a 20 53 6b 69 70 20 63 6f 6d 6d 65 6e 74 73  /* Skip comments
13a20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
13a30 74 20 70 72 65 76 63 3b 0a 20 20 20 20 20 20 20  t prevc;.       
13a40 20 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a     cp = &cp[2];.
13a50 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20            prevc 
13a60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = 0;.          w
13a70 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
13a80 30 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20  0 && (c!='/' || 
13a90 70 72 65 76 63 21 3d 27 2a 27 29 20 29 7b 0a 20  prevc!='*') ){. 
13aa0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
13ab0 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
13ac0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  +;.            p
13ad0 72 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20  revc = c;.      
13ae0 20 20 20 20 20 20 63 70 2b 2b 3b 0a 09 20 20 7d        cp++;..  }
13af0 0a 09 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27  ..}else if( c=='
13b00 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27  /' && cp[1]=='/'
13b10 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b   ){  /* Skip C++
13b20 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20   style comments 
13b30 74 6f 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  too */.         
13b40 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20   cp = &cp[2];.  
13b50 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
13b60 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21  c= *cp)!=0 && c!
13b70 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20  ='\n' ) cp++;.  
13b80 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 20          if( c ) 
13b90 6c 69 6e 65 6e 6f 2b 2b 3b 0a 09 7d 65 6c 73 65  lineno++;..}else
13ba0 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20   if( c=='\'' || 
13bb0 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a  c=='\"' ){    /*
13bc0 20 53 74 72 69 6e 67 20 61 20 63 68 61 72 61 63   String a charac
13bd0 74 65 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a  ter literals */.
13be0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 73 74            int st
13bf0 61 72 74 63 68 61 72 2c 20 70 72 65 76 63 3b 0a  artchar, prevc;.
13c00 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 63            startc
13c10 68 61 72 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  har = c;.       
13c20 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20     prevc = 0;.  
13c30 20 20 20 20 20 20 20 20 66 6f 72 28 63 70 2b 2b          for(cp++
13c40 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ; (c= *cp)!=0 &&
13c50 20 28 63 21 3d 73 74 61 72 74 63 68 61 72 20 7c   (c!=startchar |
13c60 7c 20 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20  | prevc=='\\'); 
13c70 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  cp++){.         
13c80 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
13c90 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
13ca0 20 20 20 20 20 20 20 69 66 28 20 70 72 65 76 63         if( prevc
13cb0 3d 3d 27 5c 5c 27 20 29 20 70 72 65 76 63 20 3d  =='\\' ) prevc =
13cc0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
13cd0 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
13ce0 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 09 20 20    prevc = c;..  
13cf0 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20  }..}.      }.   
13d00 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
13d10 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
13d20 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 70 73 2e 74  ps.filename,ps.t
13d30 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63  okenlineno,."C c
13d40 6f 64 65 20 73 74 61 72 74 69 6e 67 20 6f 6e 20  ode starting on 
13d50 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74  this line is not
13d60 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f   terminated befo
13d70 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  re the end of th
13d80 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20  e file.");.     
13d90 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b     ps.errorcnt++
13da0 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70  ;.        nextcp
13db0 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c   = cp;.      }el
13dc0 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  se{.        next
13dd0 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20  cp = cp+1;.     
13de0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
13df0 20 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b 20 20   isalnum(c) ){  
13e00 20 20 20 20 20 20 20 20 2f 2a 20 49 64 65 6e 74          /* Ident
13e10 69 66 69 65 72 73 20 2a 2f 0a 20 20 20 20 20 20  ifiers */.      
13e20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
13e30 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 63  =0 && (isalnum(c
13e40 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63  ) || c=='_') ) c
13e50 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  p++;.      nextc
13e60 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73  p = cp;.    }els
13e70 65 20 69 66 28 20 63 3d 3d 27 3a 27 20 26 26 20  e if( c==':' && 
13e80 63 70 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 63 70  cp[1]==':' && cp
13e90 5b 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20 54  [2]=='=' ){ /* T
13ea0 68 65 20 6f 70 65 72 61 74 6f 72 20 22 3a 3a 3d  he operator "::=
13eb0 22 20 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d  " */.      cp +=
13ec0 20 33 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70   3;.      nextcp
13ed0 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65   = cp;.    }else
13ee0 20 69 66 28 20 28 63 3d 3d 27 2f 27 20 7c 7c 20   if( (c=='/' || 
13ef0 63 3d 3d 27 7c 27 29 20 26 26 20 69 73 61 6c 70  c=='|') && isalp
13f00 68 61 28 63 70 5b 31 5d 29 20 29 7b 0a 20 20 20  ha(cp[1]) ){.   
13f10 20 20 20 63 70 20 2b 3d 20 32 3b 0a 20 20 20 20     cp += 2;.    
13f20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 63    while( (c = *c
13f30 70 29 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75  p)!=0 && (isalnu
13f40 6d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20  m(c) || c=='_') 
13f50 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65  ) cp++;.      ne
13f60 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d  xtcp = cp;.    }
13f70 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13f90 2a 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65  * All other (one
13fa0 20 63 68 61 72 61 63 74 65 72 29 20 6f 70 65 72   character) oper
13fb0 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 63  ators */.      c
13fc0 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  p++;.      nextc
13fd0 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20  p = cp;.    }.  
13fe0 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a    c = *cp;.    *
13ff0 63 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  cp = 0;         
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14010 2a 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65  * Null terminate
14020 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20   the token */.  
14030 20 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28    parseonetoken(
14040 26 70 73 29 3b 20 20 20 20 20 20 20 20 20 20 20  &ps);           
14050 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 74    /* Parse the t
14060 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20  oken */.    *cp 
14070 3d 20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  = c;            
14080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14090 65 73 74 6f 72 65 20 74 68 65 20 62 75 66 66 65  estore the buffe
140a0 72 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65  r */.    cp = ne
140b0 78 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65  xtcp;.  }.  free
140c0 28 66 69 6c 65 62 75 66 29 3b 20 20 20 20 20 20  (filebuf);      
140d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
140e0 20 52 65 6c 65 61 73 65 20 74 68 65 20 62 75 66   Release the buf
140f0 66 65 72 20 61 66 74 65 72 20 70 61 72 73 69 6e  fer after parsin
14100 67 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20  g */.  gp->rule 
14110 3d 20 70 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a  = ps.firstrule;.
14120 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d    gp->errorcnt =
14130 20 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a   ps.errorcnt;.}.
14140 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
14150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
14160 6d 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e  m the file "plin
14170 6b 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  k.c" ***********
14180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
14190 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65  * Routines proce
141a0 73 73 69 6e 67 20 63 6f 6e 66 69 67 75 72 61 74  ssing configurat
141b0 69 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70  ion follow-set p
141c0 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
141d0 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e  .** in the LEMON
141e0 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
141f0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  r..*/.static str
14200 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b  uct plink *plink
14210 5f 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a  _freelist = 0;..
14220 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
14230 77 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63  w plink */.struc
14240 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e  t plink *Plink_n
14250 65 77 28 29 7b 0a 20 20 73 74 72 75 63 74 20 70  ew(){.  struct p
14260 6c 69 6e 6b 20 2a 6e 65 77 3b 0a 0a 20 20 69 66  link *new;..  if
14270 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  ( plink_freelist
14280 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
14290 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20  ;.    int amt = 
142a0 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66  100;.    plink_f
142b0 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63  reelist = (struc
142c0 74 20 70 6c 69 6e 6b 20 2a 29 63 61 6c 6c 6f 63  t plink *)calloc
142d0 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74  ( amt, sizeof(st
142e0 72 75 63 74 20 70 6c 69 6e 6b 29 20 29 3b 0a 20  ruct plink) );. 
142f0 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65     if( plink_fre
14300 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
14310 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
14320 2c 0a 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20  ,.      "Unable 
14330 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
14340 72 79 20 66 6f 72 20 61 20 6e 65 77 20 66 6f 6c  ry for a new fol
14350 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74  low-set propagat
14360 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20  ion link.\n");. 
14370 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
14380 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
14390 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 70   i<amt-1; i++) p
143a0 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 5d  link_freelist[i]
143b0 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e 6b 5f 66  .next = &plink_f
143c0 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20  reelist[i+1];.  
143d0 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74    plink_freelist
143e0 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30  [amt-1].next = 0
143f0 3b 0a 20 20 7d 0a 20 20 6e 65 77 20 3d 20 70 6c  ;.  }.  new = pl
14400 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20  ink_freelist;.  
14410 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d  plink_freelist =
14420 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 2d   plink_freelist-
14430 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20  >next;.  return 
14440 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61  new;.}../* Add a
14450 20 70 6c 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e   plink to a plin
14460 6b 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50  k list */.void P
14470 6c 69 6e 6b 5f 61 64 64 28 70 6c 70 70 2c 63 66  link_add(plpp,cf
14480 70 29 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  p).struct plink 
14490 2a 2a 70 6c 70 70 3b 0a 73 74 72 75 63 74 20 63  **plpp;.struct c
144a0 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20  onfig *cfp;.{.  
144b0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
144c0 77 3b 0a 20 20 6e 65 77 20 3d 20 50 6c 69 6e 6b  w;.  new = Plink
144d0 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e  _new();.  new->n
144e0 65 78 74 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a  ext = *plpp;.  *
144f0 70 6c 70 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65  plpp = new;.  ne
14500 77 2d 3e 63 66 70 20 3d 20 63 66 70 3b 0a 7d 0a  w->cfp = cfp;.}.
14510 0a 2f 2a 20 54 72 61 6e 73 66 65 72 20 65 76 65  ./* Transfer eve
14520 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20  ry plink on the 
14530 6c 69 73 74 20 22 66 72 6f 6d 22 20 74 6f 20 74  list "from" to t
14540 68 65 20 6c 69 73 74 20 22 74 6f 22 20 2a 2f 0a  he list "to" */.
14550 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28  void Plink_copy(
14560 74 6f 2c 66 72 6f 6d 29 0a 73 74 72 75 63 74 20  to,from).struct 
14570 70 6c 69 6e 6b 20 2a 2a 74 6f 3b 0a 73 74 72 75  plink **to;.stru
14580 63 74 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d 3b 0a  ct plink *from;.
14590 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  {.  struct plink
145a0 20 2a 6e 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c   *nextpl;.  whil
145b0 65 28 20 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e  e( from ){.    n
145c0 65 78 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65  extpl = from->ne
145d0 78 74 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65  xt;.    from->ne
145e0 78 74 20 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74  xt = *to;.    *t
145f0 6f 20 3d 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72  o = from;.    fr
14600 6f 6d 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d  om = nextpl;.  }
14610 0a 7d 0a 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76  .}../* Delete ev
14620 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65  ery plink on the
14630 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c   list */.void Pl
14640 69 6e 6b 5f 64 65 6c 65 74 65 28 70 6c 70 29 0a  ink_delete(plp).
14650 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c  struct plink *pl
14660 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c  p;.{.  struct pl
14670 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20  ink *nextpl;..  
14680 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20  while( plp ){.  
14690 20 20 6e 65 78 74 70 6c 20 3d 20 70 6c 70 2d 3e    nextpl = plp->
146a0 6e 65 78 74 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e  next;.    plp->n
146b0 65 78 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65  ext = plink_free
146c0 6c 69 73 74 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f  list;.    plink_
146d0 66 72 65 65 6c 69 73 74 20 3d 20 70 6c 70 3b 0a  freelist = plp;.
146e0 20 20 20 20 70 6c 70 20 3d 20 6e 65 78 74 70 6c      plp = nextpl
146f0 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ;.  }.}./*******
14700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14710 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
14720 72 65 70 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  report.c" ******
14730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14740 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  ****/./*.** Proc
14750 65 64 75 72 65 73 20 66 6f 72 20 67 65 6e 65 72  edures for gener
14760 61 74 69 6e 67 20 72 65 70 6f 72 74 73 20 61 6e  ating reports an
14770 64 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  d tables in the 
14780 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
14790 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47  erator..*/../* G
147a0 65 6e 65 72 61 74 65 20 61 20 66 69 6c 65 6e 61  enerate a filena
147b0 6d 65 20 77 69 74 68 20 74 68 65 20 67 69 76 65  me with the give
147c0 6e 20 73 75 66 66 69 78 2e 20 20 53 70 61 63 65  n suffix.  Space
147d0 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
147e0 6e 61 6d 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20  name comes from 
147f0 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  malloc() and mus
14800 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
14810 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
14820 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54  ction..*/.PRIVAT
14830 45 20 63 68 61 72 20 2a 66 69 6c 65 5f 6d 61 6b  E char *file_mak
14840 65 6e 61 6d 65 28 6c 65 6d 70 2c 73 75 66 66 69  ename(lemp,suffi
14850 78 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  x).struct lemon 
14860 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66  *lemp;.char *suf
14870 66 69 78 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 6e  fix;.{.  char *n
14880 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b  ame;.  char *cp;
14890 0a 0a 20 20 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f  ..  name = mallo
148a0 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c  c( lemonStrlen(l
148b0 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b  emp->filename) +
148c0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 75 66   lemonStrlen(suf
148d0 66 69 78 29 20 2b 20 35 20 29 3b 0a 20 20 69 66  fix) + 5 );.  if
148e0 28 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  ( name==0 ){.   
148f0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14900 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20  "Can't allocate 
14910 73 70 61 63 65 20 66 6f 72 20 61 20 66 69 6c 65  space for a file
14920 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20 20 20 65  name.\n");.    e
14930 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 73 74  xit(1);.  }.  st
14940 72 63 70 79 28 6e 61 6d 65 2c 6c 65 6d 70 2d 3e  rcpy(name,lemp->
14950 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 63 70 20  filename);.  cp 
14960 3d 20 73 74 72 72 63 68 72 28 6e 61 6d 65 2c 27  = strrchr(name,'
14970 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29 20  .');.  if( cp ) 
14980 2a 63 70 20 3d 20 30 3b 0a 20 20 73 74 72 63 61  *cp = 0;.  strca
14990 74 28 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b 0a  t(name,suffix);.
149a0 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d    return name;.}
149b0 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  ../* Open a file
149c0 20 77 69 74 68 20 61 20 6e 61 6d 65 20 62 61 73   with a name bas
149d0 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20 6f  ed on the name o
149e0 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
149f0 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68 20 61 20  ,.** but with a 
14a00 64 69 66 66 65 72 65 6e 74 20 28 73 70 65 63 69  different (speci
14a10 66 69 65 64 29 20 73 75 66 66 69 78 2c 20 61 6e  fied) suffix, an
14a20 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
14a30 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 72  er.** to the str
14a40 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20 46  eam */.PRIVATE F
14a50 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28 6c  ILE *file_open(l
14a60 65 6d 70 2c 73 75 66 66 69 78 2c 6d 6f 64 65 29  emp,suffix,mode)
14a70 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
14a80 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66 66 69  emp;.char *suffi
14a90 78 3b 0a 63 68 61 72 20 2a 6d 6f 64 65 3b 0a 7b  x;.char *mode;.{
14aa0 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20  .  FILE *fp;..  
14ab0 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  if( lemp->outnam
14ac0 65 20 29 20 66 72 65 65 28 6c 65 6d 70 2d 3e 6f  e ) free(lemp->o
14ad0 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d 70 2d  utname);.  lemp-
14ae0 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c 65 5f  >outname = file_
14af0 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 73  makename(lemp, s
14b00 75 66 66 69 78 29 3b 0a 20 20 66 70 20 3d 20 66  uffix);.  fp = f
14b10 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61  open(lemp->outna
14b20 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66 28 20  me,mode);.  if( 
14b30 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65 3d 3d  fp==0 && *mode==
14b40 27 77 27 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  'w' ){.    fprin
14b50 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74  tf(stderr,"Can't
14b60 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25 73 5c   open file \"%s\
14b70 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75 74 6e  ".\n",lemp->outn
14b80 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e  ame);.    lemp->
14b90 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
14ba0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
14bb0 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f 2a  return fp;.}../*
14bc0 20 44 75 70 6c 69 63 61 74 65 20 74 68 65 20 69   Duplicate the i
14bd0 6e 70 75 74 20 66 69 6c 65 20 77 69 74 68 6f 75  nput file withou
14be0 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64 20 77  t comments and w
14bf0 69 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 20 0a  ithout actions .
14c00 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f 0a 76  ** on rules */.v
14c10 6f 69 64 20 52 65 70 72 69 6e 74 28 6c 65 6d 70  oid Reprint(lemp
14c20 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
14c30 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74  lemp;.{.  struct
14c40 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72   rule *rp;.  str
14c50 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
14c60 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6d 61 78 6c    int i, j, maxl
14c70 65 6e 2c 20 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e  en, len, ncolumn
14c80 73 2c 20 73 6b 69 70 3b 0a 20 20 70 72 69 6e 74  s, skip;.  print
14c90 66 28 22 2f 2f 20 52 65 70 72 69 6e 74 20 6f 66  f("// Reprint of
14ca0 20 69 6e 70 75 74 20 66 69 6c 65 20 5c 22 25 73   input file \"%s
14cb0 5c 22 2e 5c 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a  \".\n// Symbols:
14cc0 5c 6e 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  \n",lemp->filena
14cd0 6d 65 29 3b 0a 20 20 6d 61 78 6c 65 6e 20 3d 20  me);.  maxlen = 
14ce0 31 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  10;.  for(i=0; i
14cf0 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
14d00 69 2b 2b 29 7b 0a 20 20 20 20 73 70 20 3d 20 6c  i++){.    sp = l
14d10 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
14d20 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e  .    len = lemon
14d30 53 74 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29  Strlen(sp->name)
14d40 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61  ;.    if( len>ma
14d50 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20  xlen ) maxlen = 
14d60 6c 65 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75  len;.  }.  ncolu
14d70 6d 6e 73 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e  mns = 76/(maxlen
14d80 2b 35 29 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75  +5);.  if( ncolu
14d90 6d 6e 73 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73  mns<1 ) ncolumns
14da0 20 3d 20 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28   = 1;.  skip = (
14db0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20  lemp->nsymbol + 
14dc0 6e 63 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63  ncolumns - 1)/nc
14dd0 6f 6c 75 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d  olumns;.  for(i=
14de0 30 3b 20 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b  0; i<skip; i++){
14df0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2f 2f 22  .    printf("//"
14e00 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20  );.    for(j=i; 
14e10 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  j<lemp->nsymbol;
14e20 20 6a 2b 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20   j+=skip){.     
14e30 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62   sp = lemp->symb
14e40 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73  ols[j];.      as
14e50 73 65 72 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d  sert( sp->index=
14e60 3d 6a 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6e  =j );.      prin
14e70 74 66 28 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22  tf(" %3d %-*.*s"
14e80 2c 6a 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e  ,j,maxlen,maxlen
14e90 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  ,sp->name);.    
14ea0 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e  }.    printf("\n
14eb0 22 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70  ");.  }.  for(rp
14ec0 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
14ed0 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
14ee0 20 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c 72     printf("%s",r
14ef0 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20  p->lhs->name);. 
14f00 20 20 20 2f 2a 20 20 20 20 69 66 28 20 72 70 2d     /*    if( rp-
14f10 3e 6c 68 73 61 6c 69 61 73 20 29 20 70 72 69 6e  >lhsalias ) prin
14f20 74 66 28 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68  tf("(%s)",rp->lh
14f30 73 61 6c 69 61 73 29 3b 20 2a 2f 0a 20 20 20 20  salias); */.    
14f40 70 72 69 6e 74 66 28 22 20 3a 3a 3d 22 29 3b 0a  printf(" ::=");.
14f50 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
14f60 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
14f70 20 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68       sp = rp->rh
14f80 73 5b 69 5d 3b 0a 20 20 20 20 20 20 70 72 69 6e  s[i];.      prin
14f90 74 66 28 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61  tf(" %s", sp->na
14fa0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  me);.      if( s
14fb0 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
14fc0 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
14fd0 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d    for(j=1; j<sp-
14fe0 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a  >nsubsym; j++){.
14ff0 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66            printf
15000 28 22 7c 25 73 22 2c 20 73 70 2d 3e 73 75 62 73  ("|%s", sp->subs
15010 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ym[j]->name);.  
15020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15030 20 20 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d        /* if( rp-
15040 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 29 20 70  >rhsalias[i] ) p
15050 72 69 6e 74 66 28 22 28 25 73 29 22 2c 72 70 2d  rintf("(%s)",rp-
15060 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 20 2a  >rhsalias[i]); *
15070 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e  /.    }.    prin
15080 74 66 28 22 2e 22 29 3b 0a 20 20 20 20 69 66 28  tf(".");.    if(
15090 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 29 20 70   rp->precsym ) p
150a0 72 69 6e 74 66 28 22 20 5b 25 73 5d 22 2c 72 70  rintf(" [%s]",rp
150b0 2d 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 29  ->precsym->name)
150c0 3b 0a 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d  ;.    /* if( rp-
150d0 3e 63 6f 64 65 20 29 20 70 72 69 6e 74 66 28 22  >code ) printf("
150e0 5c 6e 20 20 20 20 25 73 22 2c 72 70 2d 3e 63 6f  \n    %s",rp->co
150f0 64 65 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e  de); */.    prin
15100 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a  tf("\n");.  }.}.
15110 0a 76 6f 69 64 20 43 6f 6e 66 69 67 50 72 69 6e  .void ConfigPrin
15120 74 28 66 70 2c 63 66 70 29 0a 46 49 4c 45 20 2a  t(fp,cfp).FILE *
15130 66 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  fp;.struct confi
15140 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75  g *cfp;.{.  stru
15150 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73  ct rule *rp;.  s
15160 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
15170 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
15180 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20  rp = cfp->rp;.  
15190 66 70 72 69 6e 74 66 28 66 70 2c 22 25 73 20 3a  fprintf(fp,"%s :
151a0 3a 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d  :=",rp->lhs->nam
151b0 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
151c0 3c 3d 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  <=rp->nrhs; i++)
151d0 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 63 66 70  {.    if( i==cfp
151e0 2d 3e 64 6f 74 20 29 20 66 70 72 69 6e 74 66 28  ->dot ) fprintf(
151f0 66 70 2c 22 20 2a 22 29 3b 0a 20 20 20 20 69 66  fp," *");.    if
15200 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20  ( i==rp->nrhs ) 
15210 62 72 65 61 6b 3b 0a 20 20 20 20 73 70 20 3d 20  break;.    sp = 
15220 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20  rp->rhs[i];.    
15230 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73 22  fprintf(fp," %s"
15240 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  , sp->name);.   
15250 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d   if( sp->type==M
15260 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
15270 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a        for(j=1; j
15280 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b  <sp->nsubsym; j+
15290 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
152a0 6e 74 66 28 66 70 2c 22 7c 25 73 22 2c 73 70 2d  ntf(fp,"|%s",sp-
152b0 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65  >subsym[j]->name
152c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
152d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 23 64 65 66 69  .  }.}../* #defi
152e0 6e 65 20 54 45 53 54 20 2a 2f 0a 23 69 66 20 30  ne TEST */.#if 0
152f0 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 65 74 20  ./* Print a set 
15300 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
15310 53 65 74 50 72 69 6e 74 28 6f 75 74 2c 73 65 74  SetPrint(out,set
15320 2c 6c 65 6d 70 29 0a 46 49 4c 45 20 2a 6f 75 74  ,lemp).FILE *out
15330 3b 0a 63 68 61 72 20 2a 73 65 74 3b 0a 73 74 72  ;.char *set;.str
15340 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
15350 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  .{.  int i;.  ch
15360 61 72 20 2a 73 70 61 63 65 72 3b 0a 20 20 73 70  ar *spacer;.  sp
15370 61 63 65 72 20 3d 20 22 22 3b 0a 20 20 66 70 72  acer = "";.  fpr
15380 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 5b 22  intf(out,"%12s["
15390 2c 22 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ,"");.  for(i=0;
153a0 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e   i<lemp->ntermin
153b0 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  al; i++){.    if
153c0 28 20 53 65 74 46 69 6e 64 28 73 65 74 2c 69 29  ( SetFind(set,i)
153d0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
153e0 66 28 6f 75 74 2c 22 25 73 25 73 22 2c 73 70 61  f(out,"%s%s",spa
153f0 63 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  cer,lemp->symbol
15400 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  s[i]->name);.   
15410 20 20 20 73 70 61 63 65 72 20 3d 20 22 20 22 3b     spacer = " ";
15420 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
15430 69 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b  intf(out,"]\n");
15440 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 70  .}../* Print a p
15450 6c 69 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a 50 52  link chain */.PR
15460 49 56 41 54 45 20 76 6f 69 64 20 50 6c 69 6e 6b  IVATE void Plink
15470 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2c 74 61  Print(out,plp,ta
15480 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74  g).FILE *out;.st
15490 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b  ruct plink *plp;
154a0 0a 63 68 61 72 20 2a 74 61 67 3b 0a 7b 0a 20 20  .char *tag;.{.  
154b0 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20  while( plp ){.  
154c0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
154d0 31 32 73 25 73 20 28 73 74 61 74 65 20 25 32 64  12s%s (state %2d
154e0 29 20 22 2c 22 22 2c 74 61 67 2c 70 6c 70 2d 3e  ) ","",tag,plp->
154f0 63 66 70 2d 3e 73 74 70 2d 3e 73 74 61 74 65 6e  cfp->stp->staten
15500 75 6d 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 50  um);.    ConfigP
15510 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e 63 66  rint(out,plp->cf
15520 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  p);.    fprintf(
15530 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 70  out,"\n");.    p
15540 6c 70 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a  lp = plp->next;.
15550 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
15560 20 50 72 69 6e 74 20 61 6e 20 61 63 74 69 6f 6e   Print an action
15570 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69   to the given fi
15580 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
15590 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a  Return FALSE if.
155a0 2a 2a 20 6e 6f 74 68 69 6e 67 20 77 61 73 20 61  ** nothing was a
155b0 63 74 75 61 6c 6c 79 20 70 72 69 6e 74 65 64 2e  ctually printed.
155c0 0a 2a 2f 0a 69 6e 74 20 50 72 69 6e 74 41 63 74  .*/.int PrintAct
155d0 69 6f 6e 28 73 74 72 75 63 74 20 61 63 74 69 6f  ion(struct actio
155e0 6e 20 2a 61 70 2c 20 46 49 4c 45 20 2a 66 70 2c  n *ap, FILE *fp,
155f0 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20   int indent){.  
15600 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a  int result = 1;.
15610 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79    switch( ap->ty
15620 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  pe ){.    case S
15630 48 49 46 54 3a 0a 20 20 20 20 20 20 66 70 72 69  HIFT:.      fpri
15640 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66  ntf(fp,"%*s shif
15650 74 20 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70  t  %d",indent,ap
15660 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78  ->sp->name,ap->x
15670 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b  .stp->statenum);
15680 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15690 20 20 63 61 73 65 20 52 45 44 55 43 45 3a 0a 20    case REDUCE:. 
156a0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
156b0 22 25 2a 73 20 72 65 64 75 63 65 20 25 64 22 2c  "%*s reduce %d",
156c0 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e  indent,ap->sp->n
156d0 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e  ame,ap->x.rp->in
156e0 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  dex);.      brea
156f0 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 43 43 45  k;.    case ACCE
15700 50 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74  PT:.      fprint
15710 66 28 66 70 2c 22 25 2a 73 20 61 63 63 65 70 74  f(fp,"%*s accept
15720 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d  ",indent,ap->sp-
15730 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  >name);.      br
15740 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52  eak;.    case ER
15750 52 4f 52 3a 0a 20 20 20 20 20 20 66 70 72 69 6e  ROR:.      fprin
15760 74 66 28 66 70 2c 22 25 2a 73 20 65 72 72 6f 72  tf(fp,"%*s error
15770 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d  ",indent,ap->sp-
15780 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  >name);.      br
15790 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 52  eak;.    case SR
157a0 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 63 61  CONFLICT:.    ca
157b0 73 65 20 52 52 43 4f 4e 46 4c 49 43 54 3a 0a 20  se RRCONFLICT:. 
157c0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
157d0 22 25 2a 73 20 72 65 64 75 63 65 20 25 2d 33 64  "%*s reduce %-3d
157e0 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66   ** Parsing conf
157f0 6c 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20  lict **",.      
15800 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d    indent,ap->sp-
15810 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e  >name,ap->x.rp->
15820 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72  index);.      br
15830 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53  eak;.    case SS
15840 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20  CONFLICT:.      
15850 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20  fprintf(fp,"%*s 
15860 73 68 69 66 74 20 20 25 64 20 2a 2a 20 50 61 72  shift  %d ** Par
15870 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a  sing conflict **
15880 22 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 64 65  ", .        inde
15890 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  nt,ap->sp->name,
158a0 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65  ap->x.stp->state
158b0 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  num);.      brea
158c0 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52  k;.    case SH_R
158d0 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61 73  ESOLVED:.    cas
158e0 65 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20  e RD_RESOLVED:. 
158f0 20 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44     case NOT_USED
15900 3a 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d  :.      result =
15910 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
15920 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
15930 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  sult;.}../* Gene
15940 72 61 74 65 20 74 68 65 20 22 79 2e 6f 75 74 70  rate the "y.outp
15950 75 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a  ut" log file */.
15960 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75  void ReportOutpu
15970 74 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  t(lemp).struct l
15980 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
15990 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
159a0 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
159b0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
159c0 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
159d0 6e 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a 66  n *ap;.  FILE *f
159e0 70 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f  p;..  fp = file_
159f0 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22  open(lemp,".out"
15a00 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 66 70  ,"wb");.  if( fp
15a10 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
15a20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
15a30 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
15a40 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
15a50 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 70  orted[i];.    fp
15a60 72 69 6e 74 66 28 66 70 2c 22 53 74 61 74 65 20  rintf(fp,"State 
15a70 25 64 3a 5c 6e 22 2c 73 74 70 2d 3e 73 74 61 74  %d:\n",stp->stat
15a80 65 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 6c  enum);.    if( l
15a90 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29  emp->basisflag )
15aa0 20 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20   cfp=stp->bp;.  
15ab0 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
15ac0 20 20 20 20 20 20 20 20 63 66 70 3d 73 74 70 2d          cfp=stp-
15ad0 3e 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65 28  >cfp;.    while(
15ae0 20 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63 68   cfp ){.      ch
15af0 61 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20  ar buf[20];.    
15b00 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d    if( cfp->dot==
15b10 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b  cfp->rp->nrhs ){
15b20 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
15b30 28 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d  (buf,"(%d)",cfp-
15b40 3e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  >rp->index);.   
15b50 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
15b60 22 20 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b  "    %5s ",buf);
15b70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15b80 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
15b90 2c 22 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a  ,"          ");.
15ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f        }.      Co
15bb0 6e 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70  nfigPrint(fp,cfp
15bc0 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
15bd0 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 20 30  (fp,"\n");.#if 0
15be0 0a 20 20 20 20 20 20 53 65 74 50 72 69 6e 74 28  .      SetPrint(
15bf0 66 70 2c 63 66 70 2d 3e 66 77 73 2c 6c 65 6d 70  fp,cfp->fws,lemp
15c00 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72  );.      PlinkPr
15c10 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 70 6c 70  int(fp,cfp->fplp
15c20 2c 22 54 6f 20 20 22 29 3b 0a 20 20 20 20 20 20  ,"To  ");.      
15c30 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66  PlinkPrint(fp,cf
15c40 70 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d 22 29 3b  p->bplp,"From");
15c50 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
15c60 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61  ( lemp->basisfla
15c70 67 20 29 20 63 66 70 3d 63 66 70 2d 3e 62 70 3b  g ) cfp=cfp->bp;
15c80 0a 20 20 20 20 20 20 65 6c 73 65 20 20 20 20 20  .      else     
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 63 66 70               cfp
15ca0 3d 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20  =cfp->next;.    
15cb0 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70  }.    fprintf(fp
15cc0 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28  ,"\n");.    for(
15cd0 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
15ce0 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
15cf0 20 20 20 20 69 66 28 20 50 72 69 6e 74 41 63 74      if( PrintAct
15d00 69 6f 6e 28 61 70 2c 66 70 2c 33 30 29 20 29 20  ion(ap,fp,30) ) 
15d10 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29  fprintf(fp,"\n")
15d20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
15d30 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20  ntf(fp,"\n");.  
15d40 7d 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20  }.  fprintf(fp, 
15d50 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  "---------------
15d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d80 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 66 70 72  -----\n");.  fpr
15d90 69 6e 74 66 28 66 70 2c 20 22 53 79 6d 62 6f 6c  intf(fp, "Symbol
15da0 73 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69 3d  s:\n");.  for(i=
15db0 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
15dc0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ol; i++){.    in
15dd0 74 20 6a 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t j;.    struct 
15de0 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 20  symbol *sp;..   
15df0 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62   sp = lemp->symb
15e00 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69  ols[i];.    fpri
15e10 6e 74 66 28 66 70 2c 20 22 20 20 25 33 64 3a 20  ntf(fp, "  %3d: 
15e20 25 73 22 2c 20 69 2c 20 73 70 2d 3e 6e 61 6d 65  %s", i, sp->name
15e30 29 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74  );.    if( sp->t
15e40 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c  ype==NONTERMINAL
15e50 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
15e60 66 28 66 70 2c 20 22 3a 22 29 3b 0a 20 20 20 20  f(fp, ":");.    
15e70 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61    if( sp->lambda
15e80 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
15e90 6e 74 66 28 66 70 2c 20 22 20 3c 6c 61 6d 62 64  ntf(fp, " <lambd
15ea0 61 3e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  a>");.      }.  
15eb0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
15ec0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
15ed0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
15ee0 28 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20 26  ( sp->firstset &
15ef0 26 20 53 65 74 46 69 6e 64 28 73 70 2d 3e 66 69  & SetFind(sp->fi
15f00 72 73 74 73 65 74 2c 20 6a 29 20 29 7b 0a 20 20  rstset, j) ){.  
15f10 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
15f20 66 70 2c 20 22 20 25 73 22 2c 20 6c 65 6d 70 2d  fp, " %s", lemp-
15f30 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61 6d  >symbols[j]->nam
15f40 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
15f50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15f60 66 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 6e 22  fprintf(fp, "\n"
15f70 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28  );.  }.  fclose(
15f80 66 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fp);.  return;.}
15f90 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20  ../* Search for 
15fa0 74 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22 20  the file "name" 
15fb0 77 68 69 63 68 20 69 73 20 69 6e 20 74 68 65 20  which is in the 
15fc0 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
15fd0 73 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74 61  s.** the exacuta
15fe0 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 63  ble */.PRIVATE c
15ff0 68 61 72 20 2a 70 61 74 68 73 65 61 72 63 68 28  har *pathsearch(
16000 61 72 67 76 30 2c 6e 61 6d 65 2c 6d 6f 64 65 6d  argv0,name,modem
16010 61 73 6b 29 0a 63 68 61 72 20 2a 61 72 67 76 30  ask).char *argv0
16020 3b 0a 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 69 6e  ;.char *name;.in
16030 74 20 6d 6f 64 65 6d 61 73 6b 3b 0a 7b 0a 20 20  t modemask;.{.  
16040 63 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b 0a  char *pathlist;.
16050 20 20 63 68 61 72 20 2a 70 61 74 68 2c 2a 63 70    char *path,*cp
16060 3b 0a 20 20 63 68 61 72 20 63 3b 0a 0a 23 69 66  ;.  char c;..#if
16070 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20  def __WIN32__.  
16080 63 70 20 3d 20 73 74 72 72 63 68 72 28 61 72 67  cp = strrchr(arg
16090 76 30 2c 27 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a  v0,'\\');.#else.
160a0 20 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 61    cp = strrchr(a
160b0 72 67 76 30 2c 27 2f 27 29 3b 0a 23 65 6e 64 69  rgv0,'/');.#endi
160c0 66 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20  f.  if( cp ){.  
160d0 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a    c = *cp;.    *
160e0 63 70 20 3d 20 30 3b 0a 20 20 20 20 70 61 74 68  cp = 0;.    path
160f0 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f   = (char *)mallo
16100 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61  c( lemonStrlen(a
16110 72 67 76 30 29 20 2b 20 6c 65 6d 6f 6e 53 74 72  rgv0) + lemonStr
16120 6c 65 6e 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b  len(name) + 2 );
16130 0a 20 20 20 20 69 66 28 20 70 61 74 68 20 29 20  .    if( path ) 
16140 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73  sprintf(path,"%s
16150 2f 25 73 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29  /%s",argv0,name)
16160 3b 0a 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20  ;.    *cp = c;. 
16170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 78 74 65   }else{.    exte
16180 72 6e 20 63 68 61 72 20 2a 67 65 74 65 6e 76 28  rn char *getenv(
16190 29 3b 0a 20 20 20 20 70 61 74 68 6c 69 73 74 20  );.    pathlist 
161a0 3d 20 67 65 74 65 6e 76 28 22 50 41 54 48 22 29  = getenv("PATH")
161b0 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68 6c 69  ;.    if( pathli
161c0 73 74 3d 3d 30 20 29 20 70 61 74 68 6c 69 73 74  st==0 ) pathlist
161d0 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f   = ".:/bin:/usr/
161e0 62 69 6e 22 3b 0a 20 20 20 20 70 61 74 68 20 3d  bin";.    path =
161f0 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28   (char *)malloc(
16200 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74   lemonStrlen(pat
16210 68 6c 69 73 74 29 2b 6c 65 6d 6f 6e 53 74 72 6c  hlist)+lemonStrl
16220 65 6e 28 6e 61 6d 65 29 2b 32 20 29 3b 0a 20 20  en(name)+2 );.  
16230 20 20 69 66 28 20 70 61 74 68 21 3d 30 20 29 7b    if( path!=0 ){
16240 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 70  .      while( *p
16250 61 74 68 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  athlist ){.     
16260 20 20 20 63 70 20 3d 20 73 74 72 63 68 72 28 70     cp = strchr(p
16270 61 74 68 6c 69 73 74 2c 27 3a 27 29 3b 0a 20 20  athlist,':');.  
16280 20 20 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20        if( cp==0 
16290 29 20 63 70 20 3d 20 26 70 61 74 68 6c 69 73 74  ) cp = &pathlist
162a0 5b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74  [lemonStrlen(pat
162b0 68 6c 69 73 74 29 5d 3b 0a 20 20 20 20 20 20 20  hlist)];.       
162c0 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20   c = *cp;.      
162d0 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 20    *cp = 0;.     
162e0 20 20 20 73 70 72 69 6e 74 66 28 70 61 74 68 2c     sprintf(path,
162f0 22 25 73 2f 25 73 22 2c 70 61 74 68 6c 69 73 74  "%s/%s",pathlist
16300 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ,name);.        
16310 2a 63 70 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  *cp = c;.       
16320 20 69 66 28 20 63 3d 3d 30 20 29 20 70 61 74 68   if( c==0 ) path
16330 6c 69 73 74 20 3d 20 22 22 3b 0a 20 20 20 20 20  list = "";.     
16340 20 20 20 65 6c 73 65 20 70 61 74 68 6c 69 73 74     else pathlist
16350 20 3d 20 26 63 70 5b 31 5d 3b 0a 20 20 20 20 20   = &cp[1];.     
16360 20 20 20 69 66 28 20 61 63 63 65 73 73 28 70 61     if( access(pa
16370 74 68 2c 6d 6f 64 65 6d 61 73 6b 29 3d 3d 30 20  th,modemask)==0 
16380 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
16390 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
163a0 75 72 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20  urn path;.}../* 
163b0 47 69 76 65 6e 20 61 6e 20 61 63 74 69 6f 6e 2c  Given an action,
163c0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 69 6e 74   compute the int
163d0 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74  eger value for t
163e0 68 61 74 20 61 63 74 69 6f 6e 0a 2a 2a 20 77 68  hat action.** wh
163f0 69 63 68 20 69 73 20 74 6f 20 62 65 20 70 75 74  ich is to be put
16400 20 69 6e 20 74 68 65 20 61 63 74 69 6f 6e 20 74   in the action t
16410 61 62 6c 65 20 6f 66 20 74 68 65 20 67 65 6e 65  able of the gene
16420 72 61 74 65 64 20 6d 61 63 68 69 6e 65 2e 0a 2a  rated machine..*
16430 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76  * Return negativ
16440 65 20 69 66 20 6e 6f 20 61 63 74 69 6f 6e 20 73  e if no action s
16450 68 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74  hould be generat
16460 65 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69  ed..*/.PRIVATE i
16470 6e 74 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f  nt compute_actio
16480 6e 28 6c 65 6d 70 2c 61 70 29 0a 73 74 72 75 63  n(lemp,ap).struc
16490 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73  t lemon *lemp;.s
164a0 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
164b0 3b 0a 7b 0a 20 20 69 6e 74 20 61 63 74 3b 0a 20  ;.{.  int act;. 
164c0 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70   switch( ap->typ
164d0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48  e ){.    case SH
164e0 49 46 54 3a 20 20 61 63 74 20 3d 20 61 70 2d 3e  IFT:  act = ap->
164f0 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 3b  x.stp->statenum;
16500 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
16510 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45 44 55  k;.    case REDU
16520 43 45 3a 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e  CE: act = ap->x.
16530 72 70 2d 3e 69 6e 64 65 78 20 2b 20 6c 65 6d 70  rp->index + lemp
16540 2d 3e 6e 73 74 61 74 65 3b 20 62 72 65 61 6b 3b  ->nstate; break;
16550 0a 20 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a  .    case ERROR:
16560 20 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73    act = lemp->ns
16570 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75  tate + lemp->nru
16580 6c 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  le;     break;. 
16590 20 20 20 63 61 73 65 20 41 43 43 45 50 54 3a 20     case ACCEPT: 
165a0 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  act = lemp->nsta
165b0 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  te + lemp->nrule
165c0 20 2b 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20 20   + 1; break;.   
165d0 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 61 63   default:     ac
165e0 74 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20  t = -1; break;. 
165f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 63 74 3b   }.  return act;
16600 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45  .}..#define LINE
16610 53 49 5a 45 20 31 30 30 30 0a 2f 2a 20 54 68 65  SIZE 1000./* The
16620 20 6e 65 78 74 20 63 6c 75 73 74 65 72 20 6f 66   next cluster of
16630 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 66 6f   routines are fo
16640 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 65  r reading the te
16650 6d 70 6c 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61  mplate file.** a
16660 6e 64 20 77 72 69 74 69 6e 67 20 74 68 65 20 72  nd writing the r
16670 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 67 65  esults to the ge
16680 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 20 2a  nerated parser *
16690 2f 0a 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66  /./* The first f
166a0 75 6e 63 74 69 6f 6e 20 74 72 61 6e 73 66 65 72  unction transfer
166b0 73 20 64 61 74 61 20 66 72 6f 6d 20 22 69 6e 22  s data from "in"
166c0 20 74 6f 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a   to "out" until.
166d0 2a 2a 20 61 20 6c 69 6e 65 20 69 73 20 73 65 65  ** a line is see
166e0 6e 20 77 68 69 63 68 20 62 65 67 69 6e 73 20 77  n which begins w
166f0 69 74 68 20 22 25 25 22 2e 20 20 54 68 65 20 6c  ith "%%".  The l
16700 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ine number is.**
16710 20 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20   tracked..**.** 
16720 69 66 20 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e  if name!=0, then
16730 20 61 6e 79 20 77 6f 72 64 20 74 68 61 74 20 62   any word that b
16740 65 67 69 6e 20 77 69 74 68 20 22 50 61 72 73 65  egin with "Parse
16750 22 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a  " is changed to.
16760 2a 2a 20 62 65 67 69 6e 20 77 69 74 68 20 2a 6e  ** begin with *n
16770 61 6d 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a  ame instead..*/.
16780 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c  PRIVATE void tpl
16790 74 5f 78 66 65 72 28 6e 61 6d 65 2c 69 6e 2c 6f  t_xfer(name,in,o
167a0 75 74 2c 6c 69 6e 65 6e 6f 29 0a 63 68 61 72 20  ut,lineno).char 
167b0 2a 6e 61 6d 65 3b 0a 46 49 4c 45 20 2a 69 6e 3b  *name;.FILE *in;
167c0 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 69 6e 74 20  .FILE *out;.int 
167d0 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 6e 74  *lineno;.{.  int
167e0 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 63 68   i, iStart;.  ch
167f0 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45  ar line[LINESIZE
16800 5d 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74  ];.  while( fget
16810 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c  s(line,LINESIZE,
16820 69 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d 21  in) && (line[0]!
16830 3d 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21  ='%' || line[1]!
16840 3d 27 25 27 29 20 29 7b 0a 20 20 20 20 28 2a 6c  ='%') ){.    (*l
16850 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69 53  ineno)++;.    iS
16860 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  tart = 0;.    if
16870 28 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  ( name ){.      
16880 66 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d  for(i=0; line[i]
16890 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
168a0 69 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27  if( line[i]=='P'
168b0 20 26 26 20 73 74 72 6e 63 6d 70 28 26 6c 69 6e   && strncmp(&lin
168c0 65 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35 29 3d  e[i],"Parse",5)=
168d0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
168e0 28 69 3d 3d 30 20 7c 7c 20 21 69 73 61 6c 70 68  (i==0 || !isalph
168f0 61 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20 20  a(line[i-1])).  
16900 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
16910 20 20 20 69 66 28 20 69 3e 69 53 74 61 72 74 20     if( i>iStart 
16920 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25  ) fprintf(out,"%
16930 2e 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c 26 6c  .*s",i-iStart,&l
16940 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20  ine[iStart]);.  
16950 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
16960 6f 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b 0a  out,"%s",name);.
16970 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34            i += 4
16980 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53 74 61  ;.          iSta
16990 72 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20  rt = i+1;.      
169a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
169b0 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  }.    fprintf(ou
169c0 74 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53 74  t,"%s",&line[iSt
169d0 61 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  art]);.  }.}../*
169e0 20 54 68 65 20 6e 65 78 74 20 66 75 6e 63 74 69   The next functi
169f0 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 74 65 6d  on finds the tem
16a00 70 6c 61 74 65 20 66 69 6c 65 20 61 6e 64 20 6f  plate file and o
16a10 70 65 6e 73 20 69 74 2c 20 72 65 74 75 72 6e 69  pens it, returni
16a20 6e 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ng.** a pointer 
16a30 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69  to the opened fi
16a40 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 46  le. */.PRIVATE F
16a50 49 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28 6c  ILE *tplt_open(l
16a60 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
16a70 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 61  n *lemp;.{.  sta
16a80 74 69 63 20 63 68 61 72 20 74 65 6d 70 6c 61 74  tic char templat
16a90 65 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70 61  ename[] = "lempa
16aa0 72 2e 63 22 3b 0a 20 20 63 68 61 72 20 62 75 66  r.c";.  char buf
16ab0 5b 31 30 30 30 5d 3b 0a 20 20 46 49 4c 45 20 2a  [1000];.  FILE *
16ac0 69 6e 3b 0a 20 20 63 68 61 72 20 2a 74 70 6c 74  in;.  char *tplt
16ad0 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70  name;.  char *cp
16ae0 3b 0a 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68  ;..  cp = strrch
16af0 72 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  r(lemp->filename
16b00 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20  ,'.');.  if( cp 
16b10 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 62  ){.    sprintf(b
16b20 75 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e  uf,"%.*s.lt",(in
16b30 74 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65  t)(cp-lemp->file
16b40 6e 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65  name),lemp->file
16b50 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  name);.  }else{.
16b60 20 20 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c      sprintf(buf,
16b70 22 25 73 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69  "%s.lt",lemp->fi
16b80 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69  lename);.  }.  i
16b90 66 28 20 61 63 63 65 73 73 28 62 75 66 2c 30 30  f( access(buf,00
16ba0 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c  4)==0 ){.    tpl
16bb0 74 6e 61 6d 65 20 3d 20 62 75 66 3b 0a 20 20 7d  tname = buf;.  }
16bc0 65 6c 73 65 20 69 66 28 20 61 63 63 65 73 73 28  else if( access(
16bd0 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34  templatename,004
16be0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74  )==0 ){.    tplt
16bf0 6e 61 6d 65 20 3d 20 74 65 6d 70 6c 61 74 65 6e  name = templaten
16c00 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
16c10 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 70 61 74    tpltname = pat
16c20 68 73 65 61 72 63 68 28 6c 65 6d 70 2d 3e 61 72  hsearch(lemp->ar
16c30 67 76 30 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65  gv0,templatename
16c40 2c 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  ,0);.  }.  if( t
16c50 70 6c 74 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  pltname==0 ){.  
16c60 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
16c70 2c 22 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65  ,"Can't find the
16c80 20 70 61 72 73 65 72 20 64 72 69 76 65 72 20 74   parser driver t
16c90 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25  emplate file \"%
16ca0 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 74 65 6d  s\".\n",.    tem
16cb0 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20  platename);.    
16cc0 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
16cd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
16ce0 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e    }.  in = fopen
16cf0 28 74 70 6c 74 6e 61 6d 65 2c 22 72 62 22 29 3b  (tpltname,"rb");
16d00 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a  .  if( in==0 ){.
16d10 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
16d20 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74  rr,"Can't open t
16d30 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
16d40 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70   \"%s\".\n",temp
16d50 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c  latename);.    l
16d60 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
16d70 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
16d80 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a   }.  return in;.
16d90 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 23 6c  }../* Print a #l
16da0 69 6e 65 20 64 69 72 65 63 74 69 76 65 20 6c 69  ine directive li
16db0 6e 65 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ne to the output
16dc0 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54   file. */.PRIVAT
16dd0 45 20 76 6f 69 64 20 74 70 6c 74 5f 6c 69 6e 65  E void tplt_line
16de0 64 69 72 28 6f 75 74 2c 6c 69 6e 65 6e 6f 2c 66  dir(out,lineno,f
16df0 69 6c 65 6e 61 6d 65 29 0a 46 49 4c 45 20 2a 6f  ilename).FILE *o
16e00 75 74 3b 0a 69 6e 74 20 6c 69 6e 65 6e 6f 3b 0a  ut;.int lineno;.
16e10 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 0a  char *filename;.
16e20 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  {.  fprintf(out,
16e30 22 23 6c 69 6e 65 20 25 64 20 5c 22 22 2c 6c 69  "#line %d \"",li
16e40 6e 65 6e 6f 29 3b 0a 20 20 77 68 69 6c 65 28 20  neno);.  while( 
16e50 2a 66 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20  *filename ){.   
16e60 20 69 66 28 20 2a 66 69 6c 65 6e 61 6d 65 20 3d   if( *filename =
16e70 3d 20 27 5c 5c 27 20 29 20 70 75 74 63 28 27 5c  = '\\' ) putc('\
16e80 5c 27 2c 6f 75 74 29 3b 0a 20 20 20 20 70 75 74  \',out);.    put
16e90 63 28 2a 66 69 6c 65 6e 61 6d 65 2c 6f 75 74 29  c(*filename,out)
16ea0 3b 0a 20 20 20 20 66 69 6c 65 6e 61 6d 65 2b 2b  ;.    filename++
16eb0 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ;.  }.  fprintf(
16ec0 6f 75 74 2c 22 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a  out,"\"\n");.}..
16ed0 2f 2a 20 50 72 69 6e 74 20 61 20 73 74 72 69 6e  /* Print a strin
16ee0 67 20 74 6f 20 74 68 65 20 66 69 6c 65 20 61 6e  g to the file an
16ef0 64 20 6b 65 65 70 20 74 68 65 20 6c 69 6e 65 6e  d keep the linen
16f00 75 6d 62 65 72 20 75 70 20 74 6f 20 64 61 74 65  umber up to date
16f10 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64   */.PRIVATE void
16f20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
16f30 6c 65 6d 70 2c 73 74 72 2c 6c 69 6e 65 6e 6f 29  lemp,str,lineno)
16f40 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75  .FILE *out;.stru
16f50 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
16f60 63 68 61 72 20 2a 73 74 72 3b 0a 69 6e 74 20 2a  char *str;.int *
16f70 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 66 28 20  lineno;.{.  if( 
16f80 73 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  str==0 ) return;
16f90 0a 20 20 77 68 69 6c 65 28 20 2a 73 74 72 20 29  .  while( *str )
16fa0 7b 0a 20 20 20 20 70 75 74 63 28 2a 73 74 72 2c  {.    putc(*str,
16fb0 6f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 73  out);.    if( *s
16fc0 74 72 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e  tr=='\n' ) (*lin
16fd0 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 73 74 72 2b  eno)++;.    str+
16fe0 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72  +;.  }.  if( str
16ff0 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20  [-1]!='\n' ){.  
17000 20 20 70 75 74 63 28 27 5c 6e 27 2c 6f 75 74 29    putc('\n',out)
17010 3b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b  ;.    (*lineno)+
17020 2b 3b 0a 20 20 7d 0a 20 20 69 66 20 28 21 6c 65  +;.  }.  if (!le
17030 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  mp->nolinenosfla
17040 67 29 20 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e  g) {.    (*linen
17050 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64  o)++; tplt_lined
17060 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c  ir(out,*lineno,l
17070 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a  emp->outname); .
17080 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a    }.  return;.}.
17090 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
170a0 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 65 6d 69  wing routine emi
170b0 74 73 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ts code for the 
170c0 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  destructor for t
170d0 68 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 73 70 0a  he.** symbol sp.
170e0 2a 2f 0a 76 6f 69 64 20 65 6d 69 74 5f 64 65 73  */.void emit_des
170f0 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74  tructor_code(out
17100 2c 73 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f 29  ,sp,lemp,lineno)
17110 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75  .FILE *out;.stru
17120 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 73  ct symbol *sp;.s
17130 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
17140 70 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a  p;.int *lineno;.
17150 7b 0a 20 63 68 61 72 20 2a 63 70 20 3d 20 30 3b  {. char *cp = 0;
17160 0a 0a 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d  .. if( sp->type=
17170 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  =TERMINAL ){.   
17180 63 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  cp = lemp->token
17190 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70 3d  dest;.   if( cp=
171a0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
171b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e  fprintf(out,"{\n
171c0 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
171d0 0a 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e  . }else if( sp->
171e0 64 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  destructor ){.  
171f0 20 63 70 20 3d 20 73 70 2d 3e 64 65 73 74 72 75   cp = sp->destru
17200 63 74 6f 72 3b 0a 20 20 20 66 70 72 69 6e 74 66  ctor;.   fprintf
17210 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c  (out,"{\n"); (*l
17220 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 20  ineno)++;.   if 
17230 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f  (!lemp->nolineno
17240 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e  sflag) { (*linen
17250 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64  o)++; tplt_lined
17260 69 72 28 6f 75 74 2c 73 70 2d 3e 64 65 73 74 4c  ir(out,sp->destL
17270 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 66 69 6c 65  ineno,lemp->file
17280 6e 61 6d 65 29 3b 20 7d 0a 20 7d 65 6c 73 65 20  name); }. }else 
17290 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73  if( lemp->vardes
172a0 74 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d  t ){.   cp = lem
172b0 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20 69  p->vardest;.   i
172c0 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75 72  f( cp==0 ) retur
172d0 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75  n;.   fprintf(ou
172e0 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65  t,"{\n"); (*line
172f0 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65 7b 0a 20  no)++;. }else{. 
17300 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20    assert( 0 );  
17310 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e  /* Cannot happen
17320 20 2a 2f 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a 63   */. }. for(; *c
17330 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66 28  p; cp++){.   if(
17340 20 2a 63 70 3d 3d 27 24 27 20 26 26 20 63 70 5b   *cp=='$' && cp[
17350 31 5d 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20 20  1]=='$' ){.     
17360 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 79 79  fprintf(out,"(yy
17370 70 6d 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c 73  pminor->yy%d)",s
17380 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20  p->dtnum);.     
17390 63 70 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74 69  cp++;.     conti
173a0 6e 75 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66 28  nue;.   }.   if(
173b0 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c   *cp=='\n' ) (*l
173c0 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 66 70 75  ineno)++;.   fpu
173d0 74 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a  tc(*cp,out);. }.
173e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e   fprintf(out,"\n
173f0 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
17400 0a 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c  . if (!lemp->nol
17410 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 20 0a 20  inenosflag) { . 
17420 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74    (*lineno)++; t
17430 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c  plt_linedir(out,
17440 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75  *lineno,lemp->ou
17450 74 6e 61 6d 65 29 3b 20 0a 20 7d 0a 20 66 70 72  tname); . }. fpr
17460 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b  intf(out,"}\n");
17470 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 72   (*lineno)++;. r
17480 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
17490 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e  Return TRUE (non
174a0 2d 7a 65 72 6f 29 20 69 66 20 74 68 65 20 67 69  -zero) if the gi
174b0 76 65 6e 20 73 79 6d 62 6f 6c 20 68 61 73 20 61  ven symbol has a
174c0 20 64 65 73 74 72 75 63 74 6f 72 2e 0a 2a 2f 0a   destructor..*/.
174d0 69 6e 74 20 68 61 73 5f 64 65 73 74 72 75 63 74  int has_destruct
174e0 6f 72 28 73 70 2c 20 6c 65 6d 70 29 0a 73 74 72  or(sp, lemp).str
174f0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
17500 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
17510 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 72 65 74 3b  mp;.{.  int ret;
17520 0a 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d  .  if( sp->type=
17530 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  =TERMINAL ){.   
17540 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b   ret = lemp->tok
17550 65 6e 64 65 73 74 21 3d 30 3b 0a 20 20 7d 65 6c  endest!=0;.  }el
17560 73 65 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c 65  se{.    ret = le
17570 6d 70 2d 3e 76 61 72 64 65 73 74 21 3d 30 20 7c  mp->vardest!=0 |
17580 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72  | sp->destructor
17590 21 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  !=0;.  }.  retur
175a0 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
175b0 41 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61  Append text to a
175c0 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
175d0 6f 63 61 74 65 64 20 73 74 72 69 6e 67 2e 20 20  ocated string.  
175e0 49 66 20 7a 54 65 78 74 20 69 73 20 30 20 74 68  If zText is 0 th
175f0 65 6e 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  en.** reset the 
17600 73 74 72 69 6e 67 20 74 6f 20 62 65 20 65 6d 70  string to be emp
17610 74 79 20 61 67 61 69 6e 2e 20 20 41 6c 77 61 79  ty again.  Alway
17620 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6d  s return the com
17630 70 6c 65 74 65 20 74 65 78 74 0a 2a 2a 20 6f 66  plete text.** of
17640 20 74 68 65 20 73 74 72 69 6e 67 20 28 77 68 69   the string (whi
17650 63 68 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  ch is overwritte
17660 6e 20 77 69 74 68 20 65 61 63 68 20 63 61 6c 6c  n with each call
17670 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62 79 74 65 73  )..**.** n bytes
17680 20 6f 66 20 7a 54 65 78 74 20 61 72 65 20 73 74   of zText are st
17690 6f 72 65 64 2e 20 20 49 66 20 6e 3d 3d 30 20 74  ored.  If n==0 t
176a0 68 65 6e 20 61 6c 6c 20 6f 66 20 7a 54 65 78 74  hen all of zText
176b0 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
176c0 0a 2a 2a 20 5c 30 30 30 20 74 65 72 6d 69 6e 61  .** \000 termina
176d0 74 6f 72 20 69 73 20 73 74 6f 72 65 64 2e 20 20  tor is stored.  
176e0 7a 54 65 78 74 20 63 61 6e 20 63 6f 6e 74 61 69  zText can contai
176f0 6e 20 75 70 20 74 6f 20 74 77 6f 20 69 6e 73 74  n up to two inst
17700 61 6e 63 65 73 20 6f 66 0a 2a 2a 20 25 64 2e 20  ances of.** %d. 
17710 20 54 68 65 20 76 61 6c 75 65 73 20 6f 66 20 70   The values of p
17720 31 20 61 6e 64 20 70 32 20 61 72 65 20 77 72 69  1 and p2 are wri
17730 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 66 69  tten into the fi
17740 72 73 74 20 61 6e 64 20 73 65 63 6f 6e 64 0a 2a  rst and second.*
17750 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  * %d..**.** If n
17760 3d 3d 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 70  ==-1, then the p
17770 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74 65  revious characte
17780 72 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  r is overwritten
17790 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61  ..*/.PRIVATE cha
177a0 72 20 2a 61 70 70 65 6e 64 5f 73 74 72 28 63 68  r *append_str(ch
177b0 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 6e  ar *zText, int n
177c0 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
177d0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
177e0 20 2a 7a 20 3d 20 30 3b 0a 20 20 73 74 61 74 69   *z = 0;.  stati
177f0 63 20 69 6e 74 20 61 6c 6c 6f 63 65 64 20 3d 20  c int alloced = 
17800 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
17810 75 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  used = 0;.  int 
17820 63 3b 0a 20 20 63 68 61 72 20 7a 49 6e 74 5b 34  c;.  char zInt[4
17830 30 5d 3b 0a 0a 20 20 69 66 28 20 7a 54 65 78 74  0];..  if( zText
17840 3d 3d 30 20 29 7b 0a 20 20 20 20 75 73 65 64 20  ==0 ){.    used 
17850 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
17860 7a 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 3d  z;.  }.  if( n<=
17870 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 3c 30  0 ){.    if( n<0
17880 20 29 7b 0a 20 20 20 20 20 20 75 73 65 64 20 2b   ){.      used +
17890 3d 20 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = n;.      asser
178a0 74 28 20 75 73 65 64 3e 3d 30 20 29 3b 0a 20 20  t( used>=0 );.  
178b0 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6c 65 6d 6f    }.    n = lemo
178c0 6e 53 74 72 6c 65 6e 28 7a 54 65 78 74 29 3b 0a  nStrlen(zText);.
178d0 20 20 7d 0a 20 20 69 66 28 20 6e 2b 73 69 7a 65    }.  if( n+size
178e0 6f 66 28 7a 49 6e 74 29 2a 32 2b 75 73 65 64 20  of(zInt)*2+used 
178f0 3e 3d 20 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  >= alloced ){.  
17900 20 20 61 6c 6c 6f 63 65 64 20 3d 20 6e 20 2b 20    alloced = n + 
17910 73 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 20 2b  sizeof(zInt)*2 +
17920 20 75 73 65 64 20 2b 20 32 30 30 3b 0a 20 20 20   used + 200;.   
17930 20 7a 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 2c 20   z = realloc(z, 
17940 20 61 6c 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20   alloced);.  }. 
17950 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
17960 72 6e 20 22 22 3b 0a 20 20 77 68 69 6c 65 28 20  rn "";.  while( 
17970 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 63  n-- > 0 ){.    c
17980 20 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b 0a 20   = *(zText++);. 
17990 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 26 26     if( c=='%' &&
179a0 20 6e 3e 30 20 26 26 20 7a 54 65 78 74 5b 30 5d   n>0 && zText[0]
179b0 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20 20 73  =='d' ){.      s
179c0 70 72 69 6e 74 66 28 7a 49 6e 74 2c 20 22 25 64  printf(zInt, "%d
179d0 22 2c 20 70 31 29 3b 0a 20 20 20 20 20 20 70 31  ", p1);.      p1
179e0 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 73 74 72   = p2;.      str
179f0 63 70 79 28 26 7a 5b 75 73 65 64 5d 2c 20 7a 49  cpy(&z[used], zI
17a00 6e 74 29 3b 0a 20 20 20 20 20 20 75 73 65 64 20  nt);.      used 
17a10 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 26  += lemonStrlen(&
17a20 7a 5b 75 73 65 64 5d 29 3b 0a 20 20 20 20 20 20  z[used]);.      
17a30 7a 54 65 78 74 2b 2b 3b 0a 20 20 20 20 20 20 6e  zText++;.      n
17a40 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  --;.    }else{. 
17a50 20 20 20 20 20 7a 5b 75 73 65 64 2b 2b 5d 20 3d       z[used++] =
17a60 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   c;.    }.  }.  
17a70 7a 5b 75 73 65 64 5d 20 3d 20 30 3b 0a 20 20 72  z[used] = 0;.  r
17a80 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
17a90 2a 20 7a 43 6f 64 65 20 69 73 20 61 20 73 74 72  * zCode is a str
17aa0 69 6e 67 20 74 68 61 74 20 69 73 20 74 68 65 20  ing that is the 
17ab0 61 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65  action associate
17ac0 64 20 77 69 74 68 20 61 20 72 75 6c 65 2e 20 20  d with a rule.  
17ad0 45 78 70 61 6e 64 0a 2a 2a 20 74 68 65 20 73 79  Expand.** the sy
17ae0 6d 62 6f 6c 73 20 69 6e 20 74 68 69 73 20 73 74  mbols in this st
17af0 72 69 6e 67 20 73 6f 20 74 68 61 74 20 74 68 65  ring so that the
17b00 20 72 65 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e   refer to elemen
17b10 74 73 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  ts of the parser
17b20 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f 0a 50 52  .** stack..*/.PR
17b30 49 56 41 54 45 20 76 6f 69 64 20 74 72 61 6e 73  IVATE void trans
17b40 6c 61 74 65 5f 63 6f 64 65 28 73 74 72 75 63 74  late_code(struct
17b50 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74   lemon *lemp, st
17b60 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a  ruct rule *rp){.
17b70 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 78 70 3b    char *cp, *xp;
17b80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
17b90 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 20 20 20   lhsused = 0;   
17ba0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
17bb0 4c 48 53 20 65 6c 65 6d 65 6e 74 20 68 61 73 20  LHS element has 
17bc0 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20 63  been used */.  c
17bd0 68 61 72 20 75 73 65 64 5b 4d 41 58 52 48 53 5d  har used[MAXRHS]
17be0 3b 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20  ;   /* True for 
17bf0 65 61 63 68 20 52 48 53 20 65 6c 65 6d 65 6e 74  each RHS element
17c00 20 77 68 69 63 68 20 69 73 20 75 73 65 64 20 2a   which is used *
17c10 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  /..  for(i=0; i<
17c20 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 20 75  rp->nrhs; i++) u
17c30 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 6c 68  sed[i] = 0;.  lh
17c40 73 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66  sused = 0;..  if
17c50 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 7b  ( rp->code==0 ){
17c60 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20  .    rp->code = 
17c70 22 5c 6e 22 3b 0a 20 20 20 20 72 70 2d 3e 6c 69  "\n";.    rp->li
17c80 6e 65 20 3d 20 72 70 2d 3e 72 75 6c 65 6c 69 6e  ne = rp->rulelin
17c90 65 3b 0a 20 20 7d 0a 0a 20 20 61 70 70 65 6e 64  e;.  }..  append
17ca0 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 20  _str(0,0,0,0);. 
17cb0 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65   for(cp=rp->code
17cc0 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20  ; *cp; cp++){.  
17cd0 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 2a 63    if( isalpha(*c
17ce0 70 29 20 26 26 20 28 63 70 3d 3d 72 70 2d 3e 63  p) && (cp==rp->c
17cf0 6f 64 65 20 7c 7c 20 28 21 69 73 61 6c 6e 75 6d  ode || (!isalnum
17d00 28 63 70 5b 2d 31 5d 29 20 26 26 20 63 70 5b 2d  (cp[-1]) && cp[-
17d10 31 5d 21 3d 27 5f 27 29 29 20 29 7b 0a 20 20 20  1]!='_')) ){.   
17d20 20 20 20 63 68 61 72 20 73 61 76 65 64 3b 0a 20     char saved;. 
17d30 20 20 20 20 20 66 6f 72 28 78 70 3d 20 26 63 70       for(xp= &cp
17d40 5b 31 5d 3b 20 69 73 61 6c 6e 75 6d 28 2a 78 70  [1]; isalnum(*xp
17d50 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20 78  ) || *xp=='_'; x
17d60 70 2b 2b 29 3b 0a 20 20 20 20 20 20 73 61 76 65  p++);.      save
17d70 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20 20 2a  d = *xp;.      *
17d80 78 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  xp = 0;.      if
17d90 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26  ( rp->lhsalias &
17da0 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e  & strcmp(cp,rp->
17db0 6c 68 73 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a  lhsalias)==0 ){.
17dc0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73          append_s
17dd0 74 72 28 22 79 79 67 6f 74 6f 6d 69 6e 6f 72 2e  tr("yygotominor.
17de0 79 79 25 64 22 2c 30 2c 72 70 2d 3e 6c 68 73 2d  yy%d",0,rp->lhs-
17df0 3e 64 74 6e 75 6d 2c 30 29 3b 0a 20 20 20 20 20  >dtnum,0);.     
17e00 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20     cp = xp;.    
17e10 20 20 20 20 6c 68 73 75 73 65 64 20 3d 20 31 3b      lhsused = 1;
17e20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17e30 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
17e40 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
17e50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
17e60 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26  p->rhsalias[i] &
17e70 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e  & strcmp(cp,rp->
17e80 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20  rhsalias[i])==0 
17e90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
17ea0 66 28 20 63 70 21 3d 72 70 2d 3e 63 6f 64 65 20  f( cp!=rp->code 
17eb0 26 26 20 63 70 5b 2d 31 5d 3d 3d 27 40 27 20 29  && cp[-1]=='@' )
17ec0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
17ed0 2f 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d 65  /* If the argume
17ee0 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
17ef0 6d 20 40 58 20 74 68 65 6e 20 73 75 62 73 74 69  m @X then substi
17f00 74 75 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  tuted.          
17f10 20 20 20 20 2a 2a 20 74 68 65 20 74 6f 6b 65 6e      ** the token
17f20 20 6e 75 6d 62 65 72 20 6f 66 20 58 2c 20 6e 6f   number of X, no
17f30 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 58  t the value of X
17f40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
17f50 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79    append_str("yy
17f60 6d 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22 2c 2d  msp[%d].major",-
17f70 31 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 30  1,i-rp->nrhs+1,0
17f80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
17f90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
17fa0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
17fb0 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b  l *sp = rp->rhs[
17fc0 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
17fd0 20 20 69 6e 74 20 64 74 6e 75 6d 3b 0a 20 20 20    int dtnum;.   
17fe0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
17ff0 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
18000 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
18010 20 20 20 20 20 20 20 20 20 20 64 74 6e 75 6d 20            dtnum 
18020 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d  = sp->subsym[0]-
18030 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  >dtnum;.        
18040 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18050 20 20 20 20 20 20 20 20 20 20 20 20 20 64 74 6e               dtn
18060 75 6d 20 3d 20 73 70 2d 3e 64 74 6e 75 6d 3b 0a  um = sp->dtnum;.
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
18090 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73 70 5b  pend_str("yymsp[
180a0 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c  %d].minor.yy%d",
180b0 30 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 20  0,i-rp->nrhs+1, 
180c0 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  dtnum);.        
180d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
180e0 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20    cp = xp;.     
180f0 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d 20 3d         used[i] =
18100 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
18110 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
18120 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
18130 20 20 20 7d 0a 20 20 20 20 20 20 2a 78 70 20 3d     }.      *xp =
18140 20 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a 20 20   saved;.    }.  
18150 20 20 61 70 70 65 6e 64 5f 73 74 72 28 63 70 2c    append_str(cp,
18160 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 20 2f   1, 0, 0);.  } /
18170 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 0a 20  * End loop */.. 
18180 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   /* Check to mak
18190 65 20 73 75 72 65 20 74 68 65 20 4c 48 53 20 68  e sure the LHS h
181a0 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a  as been used */.
181b0 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69    if( rp->lhsali
181c0 61 73 20 26 26 20 21 6c 68 73 75 73 65 64 20 29  as && !lhsused )
181d0 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c  {.    ErrorMsg(l
181e0 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70  emp->filename,rp
181f0 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20  ->ruleline,.    
18200 20 20 22 4c 61 62 65 6c 20 5c 22 25 73 5c 22 20    "Label \"%s\" 
18210 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22 20 69  for \"%s(%s)\" i
18220 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22 2c 0a  s never used.",.
18230 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61          rp->lhsa
18240 6c 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61  lias,rp->lhs->na
18250 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29  me,rp->lhsalias)
18260 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  ;.    lemp->erro
18270 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  rcnt++;.  }..  /
18280 2a 20 47 65 6e 65 72 61 74 65 20 64 65 73 74 72  * Generate destr
18290 75 63 74 6f 72 20 63 6f 64 65 20 66 6f 72 20 52  uctor code for R
182a0 48 53 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68  HS symbols which
182b0 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e   are not used in
182c0 20 74 68 65 0a 20 20 2a 2a 20 72 65 64 75 63 65   the.  ** reduce
182d0 20 63 6f 64 65 20 2a 2f 0a 20 20 66 6f 72 28 69   code */.  for(i
182e0 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
182f0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 70  i++){.    if( rp
18300 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26 26  ->rhsalias[i] &&
18310 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20   !used[i] ){.   
18320 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
18330 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72  ->filename,rp->r
18340 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20  uleline,.       
18350 20 22 4c 61 62 65 6c 20 25 73 20 66 6f 72 20 5c   "Label %s for \
18360 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76  "%s(%s)\" is nev
18370 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20  er used.",.     
18380 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b     rp->rhsalias[
18390 69 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e  i],rp->rhs[i]->n
183a0 61 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  ame,rp->rhsalias
183b0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70  [i]);.      lemp
183c0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
183d0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70 2d 3e    }else if( rp->
183e0 72 68 73 61 6c 69 61 73 5b 69 5d 3d 3d 30 20 29  rhsalias[i]==0 )
183f0 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 5f  {.      if( has_
18400 64 65 73 74 72 75 63 74 6f 72 28 72 70 2d 3e 72  destructor(rp->r
18410 68 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20  hs[i],lemp) ){. 
18420 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74         append_st
18430 72 28 22 20 20 79 79 5f 64 65 73 74 72 75 63 74  r("  yy_destruct
18440 6f 72 28 79 79 70 50 61 72 73 65 72 2c 25 64 2c  or(yypParser,%d,
18450 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72  &yymsp[%d].minor
18460 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20  );\n", 0,.      
18470 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d       rp->rhs[i]-
18480 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e 72 68  >index,i-rp->nrh
18490 73 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  s+1);.      }els
184a0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  e{.        /* No
184b0 20 64 65 73 74 72 75 63 74 6f 72 20 64 65 66 69   destructor defi
184c0 6e 65 64 20 66 6f 72 20 74 68 69 73 20 74 65 72  ned for this ter
184d0 6d 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  m */.      }.   
184e0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 70 2d   }.  }.  if( rp-
184f0 3e 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 70 20  >code ){.    cp 
18500 3d 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30  = append_str(0,0
18510 2c 30 2c 30 29 3b 0a 20 20 20 20 72 70 2d 3e 63  ,0,0);.    rp->c
18520 6f 64 65 20 3d 20 53 74 72 73 61 66 65 28 63 70  ode = Strsafe(cp
18530 3f 63 70 3a 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  ?cp:"");.  }.}..
18540 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  /* .** Generate 
18550 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
18560 74 65 73 20 77 68 65 6e 20 74 68 65 20 72 75 6c  tes when the rul
18570 65 20 22 72 70 22 20 69 73 20 72 65 64 75 63 65  e "rp" is reduce
18580 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65  d.  Write.** the
18590 20 63 6f 64 65 20 74 6f 20 22 6f 75 74 22 2e 20   code to "out". 
185a0 20 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e 65 6e   Make sure linen
185b0 6f 20 73 74 61 79 73 20 75 70 2d 74 6f 2d 64 61  o stays up-to-da
185c0 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76  te..*/.PRIVATE v
185d0 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75  oid emit_code(ou
185e0 74 2c 72 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f  t,rp,lemp,lineno
185f0 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72  ).FILE *out;.str
18600 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 73 74  uct rule *rp;.st
18610 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
18620 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b  ;.int *lineno;.{
18630 0a 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 2f 2a  . char *cp;.. /*
18640 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
18650 6f 20 64 6f 20 74 68 65 20 72 65 64 75 63 65 20  o do the reduce 
18660 61 63 74 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72  action */. if( r
18670 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 69 66  p->code ){.   if
18680 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e   (!lemp->nolinen
18690 6f 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65  osflag) { (*line
186a0 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65  no)++; tplt_line
186b0 64 69 72 28 6f 75 74 2c 72 70 2d 3e 6c 69 6e 65  dir(out,rp->line
186c0 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
186d0 3b 20 7d 0a 20 20 20 66 70 72 69 6e 74 66 28 6f  ; }.   fprintf(o
186e0 75 74 2c 22 7b 25 73 22 2c 72 70 2d 3e 63 6f 64  ut,"{%s",rp->cod
186f0 65 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72 70  e);.   for(cp=rp
18700 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b  ->code; *cp; cp+
18710 2b 29 7b 0a 20 20 20 20 20 69 66 28 20 2a 63 70  +){.     if( *cp
18720 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e  =='\n' ) (*linen
18730 6f 29 2b 2b 3b 0a 20 20 20 7d 20 2f 2a 20 45 6e  o)++;.   } /* En
18740 64 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 66 70 72  d loop */.   fpr
18750 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b  intf(out,"}\n");
18760 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
18770 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69   if (!lemp->noli
18780 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 20 28 2a 6c  nenosflag) { (*l
18790 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c  ineno)++; tplt_l
187a0 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65  inedir(out,*line
187b0 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  no,lemp->outname
187c0 29 3b 20 7d 0a 20 7d 20 2f 2a 20 45 6e 64 20 69  ); }. } /* End i
187d0 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 20 2a 2f  f( rp->code ) */
187e0 0a 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .. return;.}../*
187f0 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 64 65  .** Print the de
18800 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  finition of the 
18810 75 6e 69 6f 6e 20 75 73 65 64 20 66 6f 72 20 74  union used for t
18820 68 65 20 70 61 72 73 65 72 27 73 20 64 61 74 61  he parser's data
18830 20 73 74 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20   stack..** This 
18840 75 6e 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 66  union contains f
18850 69 65 6c 64 73 20 66 6f 72 20 65 76 65 72 79 20  ields for every 
18860 70 6f 73 73 69 62 6c 65 20 64 61 74 61 20 74 79  possible data ty
18870 70 65 20 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a  pe for tokens.**
18880 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
18890 73 2e 20 20 49 6e 20 74 68 65 20 70 72 6f 63 65  s.  In the proce
188a0 73 73 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20  ss of computing 
188b0 61 6e 64 20 70 72 69 6e 74 69 6e 67 20 74 68 69  and printing thi
188c0 73 0a 2a 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f  s.** union, also
188d0 20 73 65 74 20 74 68 65 20 22 2e 64 74 6e 75 6d   set the ".dtnum
188e0 22 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79  " field of every
188f0 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f   terminal and no
18900 6e 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d  nterminal.** sym
18910 62 6f 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72 69  bol..*/.void pri
18920 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f  nt_stack_union(o
18930 75 74 2c 6c 65 6d 70 2c 70 6c 69 6e 65 6e 6f 2c  ut,lemp,plineno,
18940 6d 68 66 6c 61 67 29 0a 46 49 4c 45 20 2a 6f 75  mhflag).FILE *ou
18950 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
18960 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
18970 74 20 73 74 72 65 61 6d 20 2a 2f 0a 73 74 72 75  t stream */.stru
18980 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 20  ct lemon *lemp; 
18990 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
189a0 61 69 6e 20 69 6e 66 6f 20 73 74 72 75 63 74 75  ain info structu
189b0 72 65 20 66 6f 72 20 74 68 69 73 20 70 61 72 73  re for this pars
189c0 65 72 20 2a 2f 0a 69 6e 74 20 2a 70 6c 69 6e 65  er */.int *pline
189d0 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
189e0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
189f0 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  the line number 
18a00 2a 2f 0a 69 6e 74 20 6d 68 66 6c 61 67 3b 20 20  */.int mhflag;  
18a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18a20 2a 20 54 72 75 65 20 69 66 20 67 65 6e 65 72 61  * True if genera
18a30 74 69 6e 67 20 6d 61 6b 65 68 65 61 64 65 72 73  ting makeheaders
18a40 20 6f 75 74 70 75 74 20 2a 2f 0a 7b 0a 20 20 69   output */.{.  i
18a50 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69  nt lineno = *pli
18a60 6e 65 6e 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20  neno;    /* The 
18a70 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  line number of t
18a80 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63  he output */.  c
18a90 68 61 72 20 2a 2a 74 79 70 65 73 3b 20 20 20 20  har **types;    
18aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 68 61           /* A ha
18ab0 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61  sh table of data
18ac0 74 79 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61  types */.  int a
18ad0 72 72 61 79 73 69 7a 65 3b 20 20 20 20 20 20 20  rraysize;       
18ae0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
18af0 74 68 65 20 22 74 79 70 65 73 22 20 61 72 72 61  the "types" arra
18b00 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74  y */.  int maxdt
18b10 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 20  length;         
18b20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67   /* Maximum leng
18b30 74 68 20 6f 66 20 61 6e 79 20 22 2e 64 61 74 61  th of any ".data
18b40 74 79 70 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a  type" field. */.
18b50 20 20 63 68 61 72 20 2a 73 74 64 64 74 3b 20 20    char *stddt;  
18b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18b70 74 61 6e 64 61 72 64 69 7a 65 64 20 6e 61 6d 65  tandardized name
18b80 20 66 6f 72 20 61 20 64 61 74 61 74 79 70 65 20   for a datatype 
18b90 2a 2f 0a 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20  */.  int i,j;   
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18bb0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
18bc0 2a 2f 0a 20 20 69 6e 74 20 68 61 73 68 3b 20 20  */.  int hash;  
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18be0 2a 20 46 6f 72 20 68 61 73 68 69 6e 67 20 74 68  * For hashing th
18bf0 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 79 70 65  e name of a type
18c00 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65   */.  char *name
18c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18c20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70  /* Name of the p
18c30 61 72 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41  arser */..  /* A
18c40 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
18c50 69 61 6c 69 7a 65 20 74 79 70 65 73 5b 5d 20 61  ialize types[] a
18c60 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73 74 64 64  nd allocate stdd
18c70 74 5b 5d 20 2a 2f 0a 20 20 61 72 72 61 79 73 69  t[] */.  arraysi
18c80 7a 65 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  ze = lemp->nsymb
18c90 6f 6c 20 2a 20 32 3b 0a 20 20 74 79 70 65 73 20  ol * 2;.  types 
18ca0 3d 20 28 63 68 61 72 2a 2a 29 63 61 6c 6c 6f 63  = (char**)calloc
18cb0 28 20 61 72 72 61 79 73 69 7a 65 2c 20 73 69 7a  ( arraysize, siz
18cc0 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 20 20  eof(char*) );.  
18cd0 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79  for(i=0; i<array
18ce0 73 69 7a 65 3b 20 69 2b 2b 29 20 74 79 70 65 73  size; i++) types
18cf0 5b 69 5d 20 3d 20 30 3b 0a 20 20 6d 61 78 64 74  [i] = 0;.  maxdt
18d00 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 69 66  length = 0;.  if
18d10 28 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 20  ( lemp->vartype 
18d20 29 7b 0a 20 20 20 20 6d 61 78 64 74 6c 65 6e 67  ){.    maxdtleng
18d30 74 68 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  th = lemonStrlen
18d40 28 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 29 3b  (lemp->vartype);
18d50 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
18d60 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
18d70 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c   i++){.    int l
18d80 65 6e 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  en;.    struct s
18d90 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
18da0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
18db0 20 20 69 66 28 20 73 70 2d 3e 64 61 74 61 74 79    if( sp->dataty
18dc0 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  pe==0 ) continue
18dd0 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f  ;.    len = lemo
18de0 6e 53 74 72 6c 65 6e 28 73 70 2d 3e 64 61 74 61  nStrlen(sp->data
18df0 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20 6c  type);.    if( l
18e00 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74 68 20 29  en>maxdtlength )
18e10 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c   maxdtlength = l
18e20 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64 64 74 20  en;.  }.  stddt 
18e30 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28  = (char*)malloc(
18e40 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a 32 20 2b   maxdtlength*2 +
18e50 20 31 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65   1 );.  if( type
18e60 73 3d 3d 30 20 7c 7c 20 73 74 64 64 74 3d 3d 30  s==0 || stddt==0
18e70 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
18e80 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d  stderr,"Out of m
18e90 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20  emory.\n");.    
18ea0 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20  exit(1);.  }..  
18eb0 2f 2a 20 42 75 69 6c 64 20 61 20 68 61 73 68 20  /* Build a hash 
18ec0 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70  table of datatyp
18ed0 65 73 2e 20 54 68 65 20 22 2e 64 74 6e 75 6d 22  es. The ".dtnum"
18ee0 20 66 69 65 6c 64 20 6f 66 20 65 61 63 68 20 73   field of each s
18ef0 79 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69  ymbol.  ** is fi
18f00 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 74 68 65  lled in with the
18f10 20 68 61 73 68 20 69 6e 64 65 78 20 70 6c 75 73   hash index plus
18f20 20 31 2e 20 20 41 20 22 2e 64 74 6e 75 6d 22 20   1.  A ".dtnum" 
18f30 76 61 6c 75 65 20 6f 66 20 30 20 69 73 0a 20 20  value of 0 is.  
18f40 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 65 72 6d  ** used for term
18f50 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49  inal symbols.  I
18f60 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 25 64  f there is no %d
18f70 65 66 61 75 6c 74 5f 74 79 70 65 20 64 65 66 69  efault_type defi
18f80 6e 65 64 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20  ned then.  ** 0 
18f90 69 73 20 61 6c 73 6f 20 75 73 65 64 20 61 73 20  is also used as 
18fa0 74 68 65 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65  the .dtnum value
18fb0 20 66 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   for nonterminal
18fc0 73 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 73  s which do not s
18fd0 70 65 63 69 66 79 0a 20 20 2a 2a 20 61 20 64 61  pecify.  ** a da
18fe0 74 61 74 79 70 65 20 75 73 69 6e 67 20 74 68 65  tatype using the
18ff0 20 25 74 79 70 65 20 64 69 72 65 63 74 69 76 65   %type directive
19000 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
19010 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
19020 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  l; i++){.    str
19030 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
19040 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
19050 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 3b  ];.    char *cp;
19060 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d  .    if( sp==lem
19070 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20  p->errsym ){.   
19080 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61     sp->dtnum = a
19090 72 72 61 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20  rraysize+1;.    
190a0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
190b0 7d 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  }.    if( sp->ty
190c0 70 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe!=NONTERMINAL 
190d0 7c 7c 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65  || (sp->datatype
190e0 3d 3d 30 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72  ==0 && lemp->var
190f0 74 79 70 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  type==0) ){.    
19100 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b    sp->dtnum = 0;
19110 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
19120 0a 20 20 20 20 7d 0a 20 20 20 20 63 70 20 3d 20  .    }.    cp = 
19130 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20  sp->datatype;.  
19140 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70    if( cp==0 ) cp
19150 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65   = lemp->vartype
19160 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20  ;.    j = 0;.   
19170 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
19180 2a 63 70 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20  *cp) ) cp++;.   
19190 20 77 68 69 6c 65 28 20 2a 63 70 20 29 20 73 74   while( *cp ) st
191a0 64 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b  ddt[j++] = *cp++
191b0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30  ;.    while( j>0
191c0 20 26 26 20 69 73 73 70 61 63 65 28 73 74 64 64   && isspace(stdd
191d0 74 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20  t[j-1]) ) j--;. 
191e0 20 20 20 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b     stddt[j] = 0;
191f0 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74  .    if( lemp->t
19200 6f 6b 65 6e 74 79 70 65 20 26 26 20 73 74 72 63  okentype && strc
19210 6d 70 28 73 74 64 64 74 2c 20 6c 65 6d 70 2d 3e  mp(stddt, lemp->
19220 74 6f 6b 65 6e 74 79 70 65 29 3d 3d 30 20 29 7b  tokentype)==0 ){
19230 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d  .      sp->dtnum
19240 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 0;.      cont
19250 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
19260 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 66 6f  hash = 0;.    fo
19270 72 28 6a 3d 30 3b 20 73 74 64 64 74 5b 6a 5d 3b  r(j=0; stddt[j];
19280 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 68 61 73   j++){.      has
19290 68 20 3d 20 68 61 73 68 2a 35 33 20 2b 20 73 74  h = hash*53 + st
192a0 64 64 74 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20  ddt[j];.    }.  
192b0 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 20 26    hash = (hash &
192c0 20 30 78 37 66 66 66 66 66 66 66 29 25 61 72 72   0x7fffffff)%arr
192d0 61 79 73 69 7a 65 3b 0a 20 20 20 20 77 68 69 6c  aysize;.    whil
192e0 65 28 20 74 79 70 65 73 5b 68 61 73 68 5d 20 29  e( types[hash] )
192f0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
19300 6d 70 28 74 79 70 65 73 5b 68 61 73 68 5d 2c 73  mp(types[hash],s
19310 74 64 64 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tddt)==0 ){.    
19320 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
19330 68 61 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20  hash + 1;.      
19340 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
19350 0a 20 20 20 20 20 20 68 61 73 68 2b 2b 3b 0a 20  .      hash++;. 
19360 20 20 20 20 20 69 66 28 20 68 61 73 68 3e 3d 61       if( hash>=a
19370 72 72 61 79 73 69 7a 65 20 29 20 68 61 73 68 20  rraysize ) hash 
19380 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
19390 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d  f( types[hash]==
193a0 30 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64  0 ){.      sp->d
193b0 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b  tnum = hash + 1;
193c0 0a 20 20 20 20 20 20 74 79 70 65 73 5b 68 61 73  .      types[has
193d0 68 5d 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c  h] = (char*)mall
193e0 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
193f0 73 74 64 64 74 29 2b 31 20 29 3b 0a 20 20 20 20  stddt)+1 );.    
19400 20 20 69 66 28 20 74 79 70 65 73 5b 68 61 73 68    if( types[hash
19410 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
19420 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
19430 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e  Out of memory.\n
19440 22 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74  ");.        exit
19450 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (1);.      }.   
19460 20 20 20 73 74 72 63 70 79 28 74 79 70 65 73 5b     strcpy(types[
19470 68 61 73 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20  hash],stddt);.  
19480 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
19490 69 6e 74 20 6f 75 74 20 74 68 65 20 64 65 66 69  int out the defi
194a0 6e 69 74 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45  nition of YYTOKE
194b0 4e 54 59 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f  NTYPE and YYMINO
194c0 52 54 59 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20  RTYPE */.  name 
194d0 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c  = lemp->name ? l
194e0 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72  emp->name : "Par
194f0 73 65 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20  se";.  lineno = 
19500 2a 70 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20  *plineno;.  if( 
19510 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74  mhflag ){ fprint
19520 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52  f(out,"#if INTER
19530 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  FACE\n"); lineno
19540 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ++; }.  fprintf(
19550 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 54  out,"#define %sT
19560 4f 4b 45 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e  OKENTYPE %s\n",n
19570 61 6d 65 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74  ame,.    lemp->t
19580 6f 6b 65 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74  okentype?lemp->t
19590 6f 6b 65 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22  okentype:"void*"
195a0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
195b0 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70  if( mhflag ){ fp
195c0 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69  rintf(out,"#endi
195d0 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  f\n"); lineno++;
195e0 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
195f0 2c 22 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20  ,"typedef union 
19600 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  {\n"); lineno++;
19610 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
19620 20 20 69 6e 74 20 79 79 69 6e 69 74 3b 5c 6e 22    int yyinit;\n"
19630 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
19640 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 73  printf(out,"  %s
19650 54 4f 4b 45 4e 54 59 50 45 20 79 79 30 3b 5c 6e  TOKENTYPE yy0;\n
19660 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ",name); lineno+
19670 2b 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  +;.  for(i=0; i<
19680 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29 7b  arraysize; i++){
19690 0a 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 69  .    if( types[i
196a0 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
196b0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
196c0 2c 22 20 20 25 73 20 79 79 25 64 3b 5c 6e 22 2c  ,"  %s yy%d;\n",
196d0 74 79 70 65 73 5b 69 5d 2c 69 2b 31 29 3b 20 6c  types[i],i+1); l
196e0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65  ineno++;.    fre
196f0 65 28 74 79 70 65 73 5b 69 5d 29 3b 0a 20 20 7d  e(types[i]);.  }
19700 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72  .  if( lemp->err
19710 73 79 6d 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20  sym->useCnt ){. 
19720 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19730 20 20 69 6e 74 20 79 79 25 64 3b 5c 6e 22 2c 6c    int yy%d;\n",l
19740 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e  emp->errsym->dtn
19750 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  um); lineno++;. 
19760 20 7d 0a 20 20 66 72 65 65 28 73 74 64 64 74 29   }.  free(stddt)
19770 3b 0a 20 20 66 72 65 65 28 74 79 70 65 73 29 3b  ;.  free(types);
19780 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
19790 7d 20 59 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e  } YYMINORTYPE;\n
197a0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
197b0 2a 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e  *plineno = linen
197c0 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  o;.}../*.** Retu
197d0 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  rn the name of a
197e0 20 43 20 64 61 74 61 74 79 70 65 20 61 62 6c 65   C datatype able
197f0 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 76 61   to represent va
19800 6c 75 65 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20  lues between.** 
19810 6c 77 72 20 61 6e 64 20 75 70 72 2c 20 69 6e 63  lwr and upr, inc
19820 6c 75 73 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  lusive..*/.stati
19830 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69  c const char *mi
19840 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28  nimum_size_type(
19850 69 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72  int lwr, int upr
19860 29 7b 0a 20 20 69 66 28 20 6c 77 72 3e 3d 30 20  ){.  if( lwr>=0 
19870 29 7b 0a 20 20 20 20 69 66 28 20 75 70 72 3c 3d  ){.    if( upr<=
19880 32 35 35 20 29 7b 0a 20 20 20 20 20 20 72 65 74  255 ){.      ret
19890 75 72 6e 20 22 75 6e 73 69 67 6e 65 64 20 63 68  urn "unsigned ch
198a0 61 72 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ar";.    }else i
198b0 66 28 20 75 70 72 3c 36 35 35 33 35 20 29 7b 0a  f( upr<65535 ){.
198c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e        return "un
198d0 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74  signed short int
198e0 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ";.    }else{.  
198f0 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69      return "unsi
19900 67 6e 65 64 20 69 6e 74 22 3b 0a 20 20 20 20 7d  gned int";.    }
19910 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72  .  }else if( lwr
19920 3e 3d 2d 31 32 37 20 26 26 20 75 70 72 3c 3d 31  >=-127 && upr<=1
19930 32 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  27 ){.    return
19940 20 22 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a   "signed char";.
19950 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e    }else if( lwr>
19960 3d 2d 33 32 37 36 37 20 26 26 20 75 70 72 3c 33  =-32767 && upr<3
19970 32 37 36 37 20 29 7b 0a 20 20 20 20 72 65 74 75  2767 ){.    retu
19980 72 6e 20 22 73 68 6f 72 74 22 3b 0a 20 20 7d 65  rn "short";.  }e
19990 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
199a0 22 69 6e 74 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  "int";.  }.}../*
199b0 0a 2a 2a 20 45 61 63 68 20 73 74 61 74 65 20 63  .** Each state c
199c0 6f 6e 74 61 69 6e 73 20 61 20 73 65 74 20 6f 66  ontains a set of
199d0 20 74 6f 6b 65 6e 20 74 72 61 6e 73 61 63 74 69   token transacti
199e0 6f 6e 20 61 6e 64 20 61 20 73 65 74 20 6f 66 0a  on and a set of.
199f0 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 74  ** nonterminal t
19a00 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 20 45 61  ransactions.  Ea
19a10 63 68 20 6f 66 20 74 68 65 73 65 20 73 65 74 73  ch of these sets
19a20 20 6d 61 6b 65 73 20 61 6e 20 69 6e 73 74 61 6e   makes an instan
19a30 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ce.** of the fol
19a40 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
19a50 2e 20 20 41 6e 20 61 72 72 61 79 20 6f 66 20 74  .  An array of t
19a60 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20  hese structures 
19a70 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6f 72  is used.** to or
19a80 64 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e  der the creation
19a90 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
19aa0 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74  he yy_action[] t
19ab0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  able..*/.struct 
19ac0 61 78 73 65 74 20 7b 0a 20 20 73 74 72 75 63 74  axset {.  struct
19ad0 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20 2f   state *stp;   /
19ae0 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
19af0 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20   state */.  int 
19b00 69 73 54 6b 6e 3b 20 20 20 20 20 20 20 20 20 20  isTkn;          
19b10 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
19b20 74 6f 6b 65 6e 73 2e 20 20 46 61 6c 73 65 20 66  tokens.  False f
19b30 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73  or non-terminals
19b40 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f   */.  int nActio
19b50 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
19b60 6d 62 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20  mber of actions 
19b70 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  */.};../*.** Com
19b80 70 61 72 65 20 74 6f 20 61 78 73 65 74 20 73 74  pare to axset st
19b90 72 75 63 74 75 72 65 73 20 66 6f 72 20 73 6f 72  ructures for sor
19ba0 74 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f  ting purposes.*/
19bb0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 78 73 65  .static int axse
19bc0 74 5f 63 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  t_compare(const 
19bd0 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76  void *a, const v
19be0 6f 69 64 20 2a 62 29 7b 0a 20 20 73 74 72 75 63  oid *b){.  struc
19bf0 74 20 61 78 73 65 74 20 2a 70 31 20 3d 20 28 73  t axset *p1 = (s
19c00 74 72 75 63 74 20 61 78 73 65 74 2a 29 61 3b 0a  truct axset*)a;.
19c10 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a    struct axset *
19c20 70 32 20 3d 20 28 73 74 72 75 63 74 20 61 78 73  p2 = (struct axs
19c30 65 74 2a 29 62 3b 0a 20 20 72 65 74 75 72 6e 20  et*)b;.  return 
19c40 70 32 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20 70 31  p2->nAction - p1
19c50 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 7d 0a 0a 2f 2a  ->nAction;.}../*
19c60 0a 2a 2a 20 57 72 69 74 65 20 74 65 78 74 20 6f  .** Write text o
19c70 6e 20 22 6f 75 74 22 20 74 68 61 74 20 64 65 73  n "out" that des
19c80 63 72 69 62 65 73 20 74 68 65 20 72 75 6c 65 20  cribes the rule 
19c90 22 72 70 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  "rp"..*/.static 
19ca0 76 6f 69 64 20 77 72 69 74 65 52 75 6c 65 54 65  void writeRuleTe
19cb0 78 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73 74  xt(FILE *out, st
19cc0 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a  ruct rule *rp){.
19cd0 20 20 69 6e 74 20 6a 3b 0a 20 20 66 70 72 69 6e    int j;.  fprin
19ce0 74 66 28 6f 75 74 2c 22 25 73 20 3a 3a 3d 22 2c  tf(out,"%s ::=",
19cf0 20 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b   rp->lhs->name);
19d00 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 72 70  .  for(j=0; j<rp
19d10 2d 3e 6e 72 68 73 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nrhs; j++){.  
19d20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
19d30 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 6a 5d  *sp = rp->rhs[j]
19d40 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
19d50 74 2c 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d  t," %s", sp->nam
19d60 65 29 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e  e);.    if( sp->
19d70 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
19d80 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  NAL ){.      int
19d90 20 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d   k;.      for(k=
19da0 31 3b 20 6b 3c 73 70 2d 3e 6e 73 75 62 73 79 6d  1; k<sp->nsubsym
19db0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
19dc0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c 25 73  fprintf(out,"|%s
19dd0 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d  ",sp->subsym[k]-
19de0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  >name);.      }.
19df0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
19e00 20 47 65 6e 65 72 61 74 65 20 43 20 73 6f 75 72   Generate C sour
19e10 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ce code for the 
19e20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52  parser */.void R
19e30 65 70 6f 72 74 54 61 62 6c 65 28 6c 65 6d 70 2c  eportTable(lemp,
19e40 20 6d 68 66 6c 61 67 29 0a 73 74 72 75 63 74 20   mhflag).struct 
19e50 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74  lemon *lemp;.int
19e60 20 6d 68 66 6c 61 67 3b 20 20 20 20 20 2f 2a 20   mhflag;     /* 
19e70 4f 75 74 70 75 74 20 69 6e 20 6d 61 6b 65 68 65  Output in makehe
19e80 61 64 65 72 73 20 66 6f 72 6d 61 74 20 69 66 20  aders format if 
19e90 74 72 75 65 20 2a 2f 0a 7b 0a 20 20 46 49 4c 45  true */.{.  FILE
19ea0 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68   *out, *in;.  ch
19eb0 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45  ar line[LINESIZE
19ec0 5d 3b 0a 20 20 69 6e 74 20 20 6c 69 6e 65 6e 6f  ];.  int  lineno
19ed0 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
19ee0 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
19ef0 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 73 74  action *ap;.  st
19f00 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
19f10 20 73 74 72 75 63 74 20 61 63 74 74 61 62 20 2a   struct acttab *
19f20 70 41 63 74 74 61 62 3b 0a 20 20 69 6e 74 20 69  pActtab;.  int i
19f30 2c 20 6a 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , j, n;.  char *
19f40 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e 54 6b  name;.  int mnTk
19f50 6e 4f 66 73 74 2c 20 6d 78 54 6b 6e 4f 66 73 74  nOfst, mxTknOfst
19f60 3b 0a 20 20 69 6e 74 20 6d 6e 4e 74 4f 66 73 74  ;.  int mnNtOfst
19f70 2c 20 6d 78 4e 74 4f 66 73 74 3b 0a 20 20 73 74  , mxNtOfst;.  st
19f80 72 75 63 74 20 61 78 73 65 74 20 2a 61 78 3b 0a  ruct axset *ax;.
19f90 0a 20 20 69 6e 20 3d 20 74 70 6c 74 5f 6f 70 65  .  in = tplt_ope
19fa0 6e 28 6c 65 6d 70 29 3b 0a 20 20 69 66 28 20 69  n(lemp);.  if( i
19fb0 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
19fc0 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e   out = file_open
19fd0 28 6c 65 6d 70 2c 22 2e 63 22 2c 22 77 62 22 29  (lemp,".c","wb")
19fe0 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29  ;.  if( out==0 )
19ff0 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  {.    fclose(in)
1a000 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1a010 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a  }.  lineno = 1;.
1a020 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1a030 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1a040 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1a050 6e 65 72 61 74 65 20 74 68 65 20 69 6e 63 6c 75  nerate the inclu
1a060 64 65 20 63 6f 64 65 2c 20 69 66 20 61 6e 79 20  de code, if any 
1a070 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
1a080 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 69  out,lemp,lemp->i
1a090 6e 63 6c 75 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b  nclude,&lineno);
1a0a0 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
1a0b0 0a 20 20 20 20 63 68 61 72 20 2a 6e 61 6d 65 20  .    char *name 
1a0c0 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28  = file_makename(
1a0d0 6c 65 6d 70 2c 20 22 2e 68 22 29 3b 0a 20 20 20  lemp, ".h");.   
1a0e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69   fprintf(out,"#i
1a0f0 6e 63 6c 75 64 65 20 5c 22 25 73 5c 22 5c 6e 22  nclude \"%s\"\n"
1a100 2c 20 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  , name); lineno+
1a110 2b 3b 0a 20 20 20 20 66 72 65 65 28 6e 61 6d 65  +;.    free(name
1a120 29 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  );.  }.  tplt_xf
1a130 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1a140 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1a150 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 23 64    /* Generate #d
1a160 65 66 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20 74  efines for all t
1a170 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 66 28 20 6d  okens */.  if( m
1a180 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63 68 61  hflag ){.    cha
1a190 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 20 20 66  r *prefix;.    f
1a1a0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20  printf(out,"#if 
1a1b0 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c  INTERFACE\n"); l
1a1c0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28  ineno++;.    if(
1a1d0 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66   lemp->tokenpref
1a1e0 69 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65  ix ) prefix = le
1a1f0 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b  mp->tokenprefix;
1a200 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20  .    else       
1a210 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
1a220 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f  fix = "";.    fo
1a230 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=1; i<lemp->n
1a240 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a  terminal; i++){.
1a250 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1a260 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33  t,"#define %s%-3
1a270 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78  0s %2d\n",prefix
1a280 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
1a290 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20  ]->name,i);.    
1a2a0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
1a2b0 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  }.    fprintf(ou
1a2c0 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c  t,"#endif\n"); l
1a2d0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
1a2e0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1a2f0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1a300 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1a310 61 74 65 20 74 68 65 20 64 65 66 69 6e 65 73 20  ate the defines 
1a320 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
1a330 2c 22 23 64 65 66 69 6e 65 20 59 59 43 4f 44 45  ,"#define YYCODE
1a340 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20  TYPE %s\n",.    
1a350 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
1a360 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  e(0, lemp->nsymb
1a370 6f 6c 2b 35 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ol+5)); lineno++
1a380 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1a390 22 23 64 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44  "#define YYNOCOD
1a3a0 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73  E %d\n",lemp->ns
1a3b0 79 6d 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e  ymbol+1);  linen
1a3c0 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1a3d0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 41 43  ut,"#define YYAC
1a3e0 54 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a  TIONTYPE %s\n",.
1a3f0 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65      minimum_size
1a400 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e  _type(0, lemp->n
1a410 73 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c  state+lemp->nrul
1a420 65 2b 35 29 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  e+5));  lineno++
1a430 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 77 69  ;.  if( lemp->wi
1a440 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20 66 70  ldcard ){.    fp
1a450 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1a460 6e 65 20 59 59 57 49 4c 44 43 41 52 44 20 25 64  ne YYWILDCARD %d
1a470 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6c 65 6d 70  \n",.       lemp
1a480 2d 3e 77 69 6c 64 63 61 72 64 2d 3e 69 6e 64 65  ->wildcard->inde
1a490 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  x); lineno++;.  
1a4a0 7d 0a 20 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f  }.  print_stack_
1a4b0 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26  union(out,lemp,&
1a4c0 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a  lineno,mhflag);.
1a4d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1a4e0 23 69 66 6e 64 65 66 20 59 59 53 54 41 43 4b 44  #ifndef YYSTACKD
1a4f0 45 50 54 48 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  EPTH\n"); lineno
1a500 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  ++;.  if( lemp->
1a510 73 74 61 63 6b 73 69 7a 65 20 29 7b 0a 20 20 20  stacksize ){.   
1a520 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1a530 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50  efine YYSTACKDEP
1a540 54 48 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73  TH %s\n",lemp->s
1a550 74 61 63 6b 73 69 7a 65 29 3b 20 20 6c 69 6e 65  tacksize);  line
1a560 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  no++;.  }else{. 
1a570 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1a580 23 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44  #define YYSTACKD
1a590 45 50 54 48 20 31 30 30 5c 6e 22 29 3b 20 20 6c  EPTH 100\n");  l
1a5a0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66  ineno++;.  }.  f
1a5b0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 65 6e  printf(out, "#en
1a5c0 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  dif\n"); lineno+
1a5d0 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  +;.  if( mhflag 
1a5e0 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1a5f0 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43  ut,"#if INTERFAC
1a600 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  E\n"); lineno++;
1a610 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c 65  .  }.  name = le
1a620 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d  mp->name ? lemp-
1a630 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b  >name : "Parse";
1a640 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 61 72 67  .  if( lemp->arg
1a650 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d   && lemp->arg[0]
1a660 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1a670 20 20 20 69 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c     i = lemonStrl
1a680 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29 3b 0a 20  en(lemp->arg);. 
1a690 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26     while( i>=1 &
1a6a0 26 20 69 73 73 70 61 63 65 28 6c 65 6d 70 2d 3e  & isspace(lemp->
1a6b0 61 72 67 5b 69 2d 31 5d 29 20 29 20 69 2d 2d 3b  arg[i-1]) ) i--;
1a6c0 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31  .    while( i>=1
1a6d0 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 6c 65 6d   && (isalnum(lem
1a6e0 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 7c 7c 20  p->arg[i-1]) || 
1a6f0 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 3d 3d  lemp->arg[i-1]==
1a700 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20  '_') ) i--;.    
1a710 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1a720 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45 43 4c  fine %sARG_SDECL
1a730 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d   %s;\n",name,lem
1a740 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f  p->arg);  lineno
1a750 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1a760 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1a770 52 47 5f 50 44 45 43 4c 20 2c 25 73 5c 6e 22 2c  RG_PDECL ,%s\n",
1a780 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b  name,lemp->arg);
1a790 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
1a7a0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1a7b0 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43 48  fine %sARG_FETCH
1a7c0 20 25 73 20 3d 20 79 79 70 50 61 72 73 65 72 2d   %s = yypParser-
1a7d0 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  >%s\n",.        
1a7e0 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 6c 65           name,le
1a7f0 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d 3e 61  mp->arg,&lemp->a
1a800 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b  rg[i]);  lineno+
1a810 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
1a820 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
1a830 47 5f 53 54 4f 52 45 20 79 79 70 50 61 72 73 65  G_STORE yypParse
1a840 72 2d 3e 25 73 20 3d 20 25 73 5c 6e 22 2c 0a 20  r->%s = %s\n",. 
1a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a860 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b  name,&lemp->arg[
1a870 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d  i],&lemp->arg[i]
1a880 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1a890 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e  }else{.    fprin
1a8a0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1a8b0 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e 22 2c 6e  %sARG_SDECL\n",n
1a8c0 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  ame);  lineno++;
1a8d0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1a8e0 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1a8f0 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20  PDECL\n",name); 
1a900 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
1a910 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1a920 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43 48 5c  ine %sARG_FETCH\
1a930 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  n",name); lineno
1a940 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1a950 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1a960 52 47 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61 6d 65  RG_STORE\n",name
1a970 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1a980 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
1a990 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1a9a0 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69  ,"#endif\n"); li
1a9b0 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70  neno++;.  }.  fp
1a9c0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1a9d0 6e 65 20 59 59 4e 53 54 41 54 45 20 25 64 5c 6e  ne YYNSTATE %d\n
1a9e0 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 29 3b  ",lemp->nstate);
1a9f0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70    lineno++;.  fp
1aa00 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1aa10 6e 65 20 59 59 4e 52 55 4c 45 20 25 64 5c 6e 22  ne YYNRULE %d\n"
1aa20 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20 20  ,lemp->nrule);  
1aa30 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20  lineno++;.  if( 
1aa40 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73  lemp->errsym->us
1aa50 65 43 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69  eCnt ){.    fpri
1aa60 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1aa70 20 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c 20 25   YYERRORSYMBOL %
1aa80 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79  d\n",lemp->errsy
1aa90 6d 2d 3e 69 6e 64 65 78 29 3b 20 20 6c 69 6e 65  m->index);  line
1aaa0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1aab0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1aac0 59 45 52 52 53 59 4d 44 54 20 79 79 25 64 5c 6e  YERRSYMDT yy%d\n
1aad0 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e  ",lemp->errsym->
1aae0 64 74 6e 75 6d 29 3b 20 20 6c 69 6e 65 6e 6f 2b  dtnum);  lineno+
1aaf0 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d  +;.  }.  if( lem
1ab00 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20  p->has_fallback 
1ab10 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1ab20 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 46 41  ut,"#define YYFA
1ab30 4c 4c 42 41 43 4b 20 31 5c 6e 22 29 3b 20 20 6c  LLBACK 1\n");  l
1ab40 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
1ab50 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1ab60 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1ab70 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1ab80 61 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74  ate the action t
1ab90 61 62 6c 65 20 61 6e 64 20 69 74 73 20 61 73 73  able and its ass
1aba0 6f 63 69 61 74 65 73 3a 0a 20 20 2a 2a 0a 20 20  ociates:.  **.  
1abb0 2a 2a 20 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20  **  yy_action[] 
1abc0 20 20 20 20 20 20 20 41 20 73 69 6e 67 6c 65 20         A single 
1abd0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1abe0 20 61 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a 20 20   all actions..  
1abf0 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64  **  yy_lookahead
1ac00 5b 5d 20 20 20 20 20 41 20 74 61 62 6c 65 20 63  []     A table c
1ac10 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f  ontaining the lo
1ac20 6f 6b 61 68 65 61 64 20 66 6f 72 20 65 61 63 68  okahead for each
1ac30 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 20   entry in.  **  
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac50 20 20 20 79 79 5f 61 63 74 69 6f 6e 2e 20 20 55     yy_action.  U
1ac60 73 65 64 20 74 6f 20 64 65 74 65 63 74 20 68 61  sed to detect ha
1ac70 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20  sh collisions.. 
1ac80 20 2a 2a 20 20 79 79 5f 73 68 69 66 74 5f 6f 66   **  yy_shift_of
1ac90 73 74 5b 5d 20 20 20 20 46 6f 72 20 65 61 63 68  st[]    For each
1aca0 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73   state, the offs
1acb0 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f  et into yy_actio
1acc0 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20  n for.  **      
1acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ace0 68 69 66 74 69 6e 67 20 74 65 72 6d 69 6e 61 6c  hifting terminal
1acf0 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 72 65 64 75  s..  **  yy_redu
1ad00 63 65 5f 6f 66 73 74 5b 5d 20 20 20 46 6f 72 20  ce_ofst[]   For 
1ad10 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65 20  each state, the 
1ad20 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61  offset into yy_a
1ad30 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20  ction for.  **  
1ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad50 20 20 20 73 68 69 66 74 69 6e 67 20 6e 6f 6e 2d     shifting non-
1ad60 74 65 72 6d 69 6e 61 6c 73 20 61 66 74 65 72 20  terminals after 
1ad70 61 20 72 65 64 75 63 65 2e 0a 20 20 2a 2a 20 20  a reduce..  **  
1ad80 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 20 20 20  yy_default[]    
1ad90 20 20 20 44 65 66 61 75 6c 74 20 61 63 74 69 6f     Default actio
1ada0 6e 20 66 6f 72 20 65 61 63 68 20 73 74 61 74 65  n for each state
1adb0 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  ..  */..  /* Com
1adc0 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e 73  pute the actions
1add0 20 6f 6e 20 61 6c 6c 20 73 74 61 74 65 73 20 61   on all states a
1ade0 6e 64 20 63 6f 75 6e 74 20 74 68 65 6d 20 75 70  nd count them up
1adf0 20 2a 2f 0a 20 20 61 78 20 3d 20 63 61 6c 6c 6f   */.  ax = callo
1ae00 63 28 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32  c(lemp->nstate*2
1ae10 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 29  , sizeof(ax[0]))
1ae20 3b 0a 20 20 69 66 28 20 61 78 3d 3d 30 20 29 7b  ;.  if( ax==0 ){
1ae30 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
1ae40 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  err,"malloc fail
1ae50 65 64 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  ed\n");.    exit
1ae60 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  (1);.  }.  for(i
1ae70 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
1ae80 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
1ae90 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
1aea0 5b 69 5d 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d  [i];.    ax[i*2]
1aeb0 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20  .stp = stp;.    
1aec0 61 78 5b 69 2a 32 5d 2e 69 73 54 6b 6e 20 3d 20  ax[i*2].isTkn = 
1aed0 31 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 6e  1;.    ax[i*2].n
1aee0 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 54  Action = stp->nT
1aef0 6b 6e 41 63 74 3b 0a 20 20 20 20 61 78 5b 69 2a  knAct;.    ax[i*
1af00 32 2b 31 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a  2+1].stp = stp;.
1af10 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 69 73      ax[i*2+1].is
1af20 54 6b 6e 20 3d 20 30 3b 0a 20 20 20 20 61 78 5b  Tkn = 0;.    ax[
1af30 69 2a 32 2b 31 5d 2e 6e 41 63 74 69 6f 6e 20 3d  i*2+1].nAction =
1af40 20 73 74 70 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20   stp->nNtAct;.  
1af50 7d 0a 20 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20  }.  mxTknOfst = 
1af60 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 30 3b 0a 20  mnTknOfst = 0;. 
1af70 20 6d 78 4e 74 4f 66 73 74 20 3d 20 6d 6e 4e 74   mxNtOfst = mnNt
1af80 4f 66 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Ofst = 0;..  /* 
1af90 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74 69  Compute the acti
1afa0 6f 6e 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 72  on table.  In or
1afb0 64 65 72 20 74 6f 20 74 72 79 20 74 6f 20 6b 65  der to try to ke
1afc0 65 70 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ep the size of t
1afd0 68 65 0a 20 20 2a 2a 20 61 63 74 69 6f 6e 20 74  he.  ** action t
1afe0 61 62 6c 65 20 74 6f 20 61 20 6d 69 6e 69 6d 75  able to a minimu
1aff0 6d 2c 20 74 68 65 20 68 65 75 72 69 73 74 69 63  m, the heuristic
1b000 20 6f 66 20 70 6c 61 63 69 6e 67 20 74 68 65 20   of placing the 
1b010 6c 61 72 67 65 73 74 20 61 63 74 69 6f 6e 0a 20  largest action. 
1b020 20 2a 2a 20 73 65 74 73 20 66 69 72 73 74 20 69   ** sets first i
1b030 73 20 75 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 71  s used..  */.  q
1b040 73 6f 72 74 28 61 78 2c 20 6c 65 6d 70 2d 3e 6e  sort(ax, lemp->n
1b050 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66 28  state*2, sizeof(
1b060 61 78 5b 30 5d 29 2c 20 61 78 73 65 74 5f 63 6f  ax[0]), axset_co
1b070 6d 70 61 72 65 29 3b 0a 20 20 70 41 63 74 74 61  mpare);.  pActta
1b080 62 20 3d 20 61 63 74 74 61 62 5f 61 6c 6c 6f 63  b = acttab_alloc
1b090 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ();.  for(i=0; i
1b0a0 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 20  <lemp->nstate*2 
1b0b0 26 26 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e  && ax[i].nAction
1b0c0 3e 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  >0; i++){.    st
1b0d0 70 20 3d 20 61 78 5b 69 5d 2e 73 74 70 3b 0a 20  p = ax[i].stp;. 
1b0e0 20 20 20 69 66 28 20 61 78 5b 69 5d 2e 69 73 54     if( ax[i].isT
1b0f0 6b 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  kn ){.      for(
1b100 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
1b110 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
1b120 20 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e        int action
1b130 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  ;.        if( ap
1b140 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65 6d  ->sp->index>=lem
1b150 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63  p->nterminal ) c
1b160 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1b170 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74   action = comput
1b180 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61  e_action(lemp, a
1b190 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
1b1a0 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69  action<0 ) conti
1b1b0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74  nue;.        act
1b1c0 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74  tab_action(pActt
1b1d0 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  ab, ap->sp->inde
1b1e0 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20  x, action);.    
1b1f0 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69    }.      stp->i
1b200 54 6b 6e 4f 66 73 74 20 3d 20 61 63 74 74 61 62  TknOfst = acttab
1b210 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61 62 29  _insert(pActtab)
1b220 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d  ;.      if( stp-
1b230 3e 69 54 6b 6e 4f 66 73 74 3c 6d 6e 54 6b 6e 4f  >iTknOfst<mnTknO
1b240 66 73 74 20 29 20 6d 6e 54 6b 6e 4f 66 73 74 20  fst ) mnTknOfst 
1b250 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b  = stp->iTknOfst;
1b260 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e  .      if( stp->
1b270 69 54 6b 6e 4f 66 73 74 3e 6d 78 54 6b 6e 4f 66  iTknOfst>mxTknOf
1b280 73 74 20 29 20 6d 78 54 6b 6e 4f 66 73 74 20 3d  st ) mxTknOfst =
1b290 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a   stp->iTknOfst;.
1b2a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b2b0 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
1b2c0 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
1b2d0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
1b2e0 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  ction;.        i
1b2f0 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  f( ap->sp->index
1b300 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
1b310 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1b320 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d       if( ap->sp-
1b330 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e 6e 73  >index==lemp->ns
1b340 79 6d 62 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65  ymbol ) continue
1b350 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e  ;.        action
1b360 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f   = compute_actio
1b370 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20  n(lemp, ap);.   
1b380 20 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c       if( action<
1b390 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1b3a0 20 20 20 20 20 20 61 63 74 74 61 62 5f 61 63 74        acttab_act
1b3b0 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70 2d  ion(pActtab, ap-
1b3c0 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69  >sp->index, acti
1b3d0 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  on);.      }.   
1b3e0 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20     stp->iNtOfst 
1b3f0 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28  = acttab_insert(
1b400 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20 20  pActtab);.      
1b410 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  if( stp->iNtOfst
1b420 3c 6d 6e 4e 74 4f 66 73 74 20 29 20 6d 6e 4e 74  <mnNtOfst ) mnNt
1b430 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f  Ofst = stp->iNtO
1b440 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  fst;.      if( s
1b450 74 70 2d 3e 69 4e 74 4f 66 73 74 3e 6d 78 4e 74  tp->iNtOfst>mxNt
1b460 4f 66 73 74 20 29 20 6d 78 4e 74 4f 66 73 74 20  Ofst ) mxNtOfst 
1b470 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a  = stp->iNtOfst;.
1b480 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 72 65 65      }.  }.  free
1b490 28 61 78 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  (ax);..  /* Outp
1b4a0 75 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  ut the yy_action
1b4b0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69   table */.  fpri
1b4c0 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63 20  ntf(out,"static 
1b4d0 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e 54 59  const YYACTIONTY
1b4e0 50 45 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 3d  PE yy_action[] =
1b4f0 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   {\n"); lineno++
1b500 3b 0a 20 20 6e 20 3d 20 61 63 74 74 61 62 5f 73  ;.  n = acttab_s
1b510 69 7a 65 28 70 41 63 74 74 61 62 29 3b 0a 20 20  ize(pActtab);.  
1b520 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
1b530 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 63  i++){.    int ac
1b540 74 69 6f 6e 20 3d 20 61 63 74 74 61 62 5f 79 79  tion = acttab_yy
1b550 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20  action(pActtab, 
1b560 69 29 3b 0a 20 20 20 20 69 66 28 20 61 63 74 69  i);.    if( acti
1b570 6f 6e 3c 30 20 29 20 61 63 74 69 6f 6e 20 3d 20  on<0 ) action = 
1b580 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c  lemp->nstate + l
1b590 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 32 3b 0a  emp->nrule + 2;.
1b5a0 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
1b5b0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
1b5c0 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
1b5d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1b5e0 20 25 34 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b   %4d,", action);
1b5f0 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
1b600 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
1b610 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
1b620 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1b630 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
1b640 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
1b650 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
1b660 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
1b670 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
1b680 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79   /* Output the y
1b690 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c  y_lookahead tabl
1b6a0 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  e */.  fprintf(o
1b6b0 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74  ut,"static const
1b6c0 20 59 59 43 4f 44 45 54 59 50 45 20 79 79 5f 6c   YYCODETYPE yy_l
1b6d0 6f 6f 6b 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e  ookahead[] = {\n
1b6e0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1b6f0 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
1b700 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61  i++){.    int la
1b710 20 3d 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b   = acttab_yylook
1b720 61 68 65 61 64 28 70 41 63 74 74 61 62 2c 20 69  ahead(pActtab, i
1b730 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 3c 30 20  );.    if( la<0 
1b740 29 20 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79  ) la = lemp->nsy
1b750 6d 62 6f 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d  mbol;.    if( j=
1b760 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
1b770 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
1b780 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
1b790 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61  out, " %4d,", la
1b7a0 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20  );.    if( j==9 
1b7b0 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20  || i==n-1 ){.   
1b7c0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1b7d0 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1b7e0 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
1b7f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
1b800 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1b810 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b  fprintf(out, "};
1b820 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1b830 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
1b840 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d   yy_shift_ofst[]
1b850 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69   table */.  fpri
1b860 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1b870 65 20 59 59 5f 53 48 49 46 54 5f 55 53 45 5f 44  e YY_SHIFT_USE_D
1b880 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54  FLT (%d)\n", mnT
1b890 6b 6e 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e  knOfst-1); linen
1b8a0 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d  o++;.  n = lemp-
1b8b0 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65  >nstate;.  while
1b8c0 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73  ( n>0 && lemp->s
1b8d0 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b 6e  orted[n-1]->iTkn
1b8e0 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20  Ofst==NO_OFFSET 
1b8f0 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66  ) n--;.  fprintf
1b900 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
1b910 59 5f 53 48 49 46 54 5f 4d 41 58 20 25 64 5c 6e  Y_SHIFT_MAX %d\n
1b920 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b  ", n-1); lineno+
1b930 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
1b940 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20  , "static const 
1b950 25 73 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74  %s yy_shift_ofst
1b960 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20  [] = {\n", .    
1b970 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69        minimum_si
1b980 7a 65 5f 74 79 70 65 28 6d 6e 54 6b 6e 4f 66 73  ze_type(mnTknOfs
1b990 74 2d 31 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 29  t-1, mxTknOfst))
1b9a0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f  ; lineno++;.  fo
1b9b0 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
1b9c0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74  +){.    int ofst
1b9d0 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  ;.    stp = lemp
1b9e0 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
1b9f0 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b   ofst = stp->iTk
1ba00 6e 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f  nOfst;.    if( o
1ba10 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29  fst==NO_OFFSET )
1ba20 20 6f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73   ofst = mnTknOfs
1ba30 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a  t - 1;.    if( j
1ba40 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75  ==0 ) fprintf(ou
1ba50 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c  t," /* %5d */ ",
1ba60 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66   i);.    fprintf
1ba70 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f  (out, " %4d,", o
1ba80 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d  fst);.    if( j=
1ba90 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
1baa0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1bab0 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
1bac0 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
1bad0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bae0 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
1baf0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1bb00 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
1bb10 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  +;..  /* Output 
1bb20 74 68 65 20 79 79 5f 72 65 64 75 63 65 5f 6f 66  the yy_reduce_of
1bb30 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20  st[] table */.  
1bb40 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
1bb50 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f  efine YY_REDUCE_
1bb60 55 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22  USE_DFLT (%d)\n"
1bb70 2c 20 6d 6e 4e 74 4f 66 73 74 2d 31 29 3b 20 6c  , mnNtOfst-1); l
1bb80 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c  ineno++;.  n = l
1bb90 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77  emp->nstate;.  w
1bba0 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d  hile( n>0 && lem
1bbb0 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e  p->sorted[n-1]->
1bbc0 69 4e 74 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53  iNtOfst==NO_OFFS
1bbd0 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69  ET ) n--;.  fpri
1bbe0 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1bbf0 65 20 59 59 5f 52 45 44 55 43 45 5f 4d 41 58 20  e YY_REDUCE_MAX 
1bc00 25 64 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e  %d\n", n-1); lin
1bc10 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1bc20 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f  (out, "static co
1bc30 6e 73 74 20 25 73 20 79 79 5f 72 65 64 75 63 65  nst %s yy_reduce
1bc40 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20  _ofst[] = {\n", 
1bc50 0a 20 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d  .          minim
1bc60 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 4e  um_size_type(mnN
1bc70 74 4f 66 73 74 2d 31 2c 20 6d 78 4e 74 4f 66 73  tOfst-1, mxNtOfs
1bc80 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  t)); lineno++;. 
1bc90 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
1bca0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f   i++){.    int o
1bcb0 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c  fst;.    stp = l
1bcc0 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
1bcd0 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e      ofst = stp->
1bce0 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 69 66 28  iNtOfst;.    if(
1bcf0 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54   ofst==NO_OFFSET
1bd00 20 29 20 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66   ) ofst = mnNtOf
1bd10 73 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20  st - 1;.    if( 
1bd20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f  j==0 ) fprintf(o
1bd30 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22  ut," /* %5d */ "
1bd40 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , i);.    fprint
1bd50 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20  f(out, " %4d,", 
1bd60 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a  ofst);.    if( j
1bd70 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b  ==9 || i==n-1 ){
1bd80 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1bd90 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ut, "\n"); linen
1bda0 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  o++;.      j = 0
1bdb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1bdc0 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
1bdd0 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
1bde0 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   "};\n"); lineno
1bdf0 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  ++;..  /* Output
1be00 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 63 74   the default act
1be10 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ion table */.  f
1be20 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61  printf(out, "sta
1be30 74 69 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49  tic const YYACTI
1be40 4f 4e 54 59 50 45 20 79 79 5f 64 65 66 61 75 6c  ONTYPE yy_defaul
1be50 74 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e  t[] = {\n"); lin
1be60 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d  eno++;.  n = lem
1be70 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 66 6f 72  p->nstate;.  for
1be80 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
1be90 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
1bea0 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
1beb0 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72    if( j==0 ) fpr
1bec0 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35  intf(out," /* %5
1bed0 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20  d */ ", i);.    
1bee0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
1bef0 34 64 2c 22 2c 20 73 74 70 2d 3e 69 44 66 6c 74  4d,", stp->iDflt
1bf00 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20  );.    if( j==9 
1bf10 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20  || i==n-1 ){.   
1bf20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1bf30 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1bf40 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
1bf50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
1bf60 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1bf70 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b  fprintf(out, "};
1bf80 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1bf90 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1bfa0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1bfb0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1bfc0 6e 65 72 61 74 65 20 74 68 65 20 74 61 62 6c 65  nerate the table
1bfd0 20 6f 66 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b   of fallback tok
1bfe0 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ens..  */.  if( 
1bff0 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61  lemp->has_fallba
1c000 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 78  ck ){.    int mx
1c010 20 3d 20 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e   = lemp->ntermin
1c020 61 6c 20 2d 20 31 3b 0a 20 20 20 20 77 68 69 6c  al - 1;.    whil
1c030 65 28 20 6d 78 3e 30 20 26 26 20 6c 65 6d 70 2d  e( mx>0 && lemp-
1c040 3e 73 79 6d 62 6f 6c 73 5b 6d 78 5d 2d 3e 66 61  >symbols[mx]->fa
1c050 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 20 6d 78 2d  llback==0 ){ mx-
1c060 2d 3b 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30  -; }.    for(i=0
1c070 3b 20 69 3c 3d 6d 78 3b 20 69 2b 2b 29 7b 0a 20  ; i<=mx; i++){. 
1c080 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
1c090 6f 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  ol *p = lemp->sy
1c0a0 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20  mbols[i];.      
1c0b0 69 66 28 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d  if( p->fallback=
1c0c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  =0 ){.        fp
1c0d0 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20  rintf(out, "    
1c0e0 30 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e  0,  /* %10s => n
1c0f0 6f 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d  othing */\n", p-
1c100 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  >name);.      }e
1c110 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72  lse{.        fpr
1c120 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 25 33 64  intf(out, "  %3d
1c130 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73  ,  /* %10s => %s
1c140 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62   */\n", p->fallb
1c150 61 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20  ack->index,.    
1c160 20 20 20 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70        p->name, p
1c170 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65  ->fallback->name
1c180 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c190 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
1c1a0 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
1c1b0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c  (lemp->name, in,
1c1c0 20 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a   out, &lineno);.
1c1d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1c1e0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1c1f0 67 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e  g the symbolic n
1c200 61 6d 65 20 6f 66 20 65 76 65 72 79 20 73 79 6d  ame of every sym
1c210 62 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  bol.  */.  for(i
1c220 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
1c230 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bol; i++){.    s
1c240 70 72 69 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25  printf(line,"\"%
1c250 73 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62  s\",",lemp->symb
1c260 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  ols[i]->name);. 
1c270 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1c280 20 20 25 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a    %-15s",line);.
1c290 20 20 20 20 69 66 28 20 28 69 26 33 29 3d 3d 33      if( (i&3)==3
1c2a0 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c   ){ fprintf(out,
1c2b0 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1c2c0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 26   }.  }.  if( (i&
1c2d0 33 29 21 3d 30 20 29 7b 20 66 70 72 69 6e 74 66  3)!=0 ){ fprintf
1c2e0 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65  (out,"\n"); line
1c2f0 6e 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78  no++; }.  tplt_x
1c300 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1c310 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1c320 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1c330 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1c340 67 20 61 20 74 65 78 74 20 73 74 72 69 6e 67 20  g a text string 
1c350 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 65  that describes e
1c360 76 65 72 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69  very.  ** rule i
1c370 6e 20 74 68 65 20 72 75 6c 65 20 73 65 74 20 6f  n the rule set o
1c380 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20  f the grammar.  
1c390 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
1c3a0 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 77 68   is used.  ** wh
1c3b0 65 6e 20 74 72 61 63 69 6e 67 20 52 45 44 55 43  en tracing REDUC
1c3c0 45 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  E actions..  */.
1c3d0 20 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65    for(i=0, rp=le
1c3e0 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
1c3f0 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b  =rp->next, i++){
1c400 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 70 2d  .    assert( rp-
1c410 3e 69 6e 64 65 78 3d 3d 69 20 29 3b 0a 20 20 20  >index==i );.   
1c420 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f   fprintf(out," /
1c430 2a 20 25 33 64 20 2a 2f 20 5c 22 22 2c 20 69 29  * %3d */ \"", i)
1c440 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54  ;.    writeRuleT
1c450 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20  ext(out, rp);.  
1c460 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c    fprintf(out,"\
1c470 22 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ",\n"); lineno++
1c480 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
1c490 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1c4a0 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1c4b0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1c4c0 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
1c4d0 20 65 76 65 72 79 20 74 69 6d 65 20 61 20 73 79   every time a sy
1c4e0 6d 62 6f 6c 20 69 73 20 70 6f 70 70 65 64 20 66  mbol is popped f
1c4f0 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  rom.  ** the sta
1c500 63 6b 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73  ck while process
1c510 69 6e 67 20 65 72 72 6f 72 73 20 6f 72 20 77 68  ing errors or wh
1c520 69 6c 65 20 64 65 73 74 72 6f 79 69 6e 67 20 74  ile destroying t
1c530 68 65 20 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a  he parser. .  **
1c540 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
1c550 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 25  , generate the %
1c560 64 65 73 74 72 75 63 74 6f 72 20 61 63 74 69 6f  destructor actio
1c570 6e 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ns).  */.  if( l
1c580 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29  emp->tokendest )
1c590 7b 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d  {.    int once =
1c5a0 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   1;.    for(i=0;
1c5b0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1c5c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
1c5d0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
1c5e0 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
1c5f0 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70  i];.      if( sp
1c600 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21  ==0 || sp->type!
1c610 3d 54 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74  =TERMINAL ) cont
1c620 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
1c630 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  once ){.        
1c640 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20  fprintf(out, "  
1c650 20 20 20 20 2f 2a 20 54 45 52 4d 49 4e 41 4c 20      /* TERMINAL 
1c660 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22  Destructor */\n"
1c670 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1c680 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
1c690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
1c6a0 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61  intf(out,"    ca
1c6b0 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c  se %d: /* %s */\
1c6c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1c6d0 20 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d    sp->index, sp-
1c6e0 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  >name); lineno++
1c6f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1c700 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
1c710 6d 62 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e 73 79  mbol && lemp->sy
1c720 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65 21 3d  mbols[i]->type!=
1c730 54 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a  TERMINAL; i++);.
1c740 20 20 20 20 69 66 28 20 69 3c 6c 65 6d 70 2d 3e      if( i<lemp->
1c750 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20  nsymbol ){.     
1c760 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72   emit_destructor
1c770 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e  _code(out,lemp->
1c780 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c  symbols[i],lemp,
1c790 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20  &lineno);.      
1c7a0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1c7b0 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c     break;\n"); l
1c7c0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ineno++;.    }. 
1c7d0 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76   }.  if( lemp->v
1c7e0 61 72 64 65 73 74 20 29 7b 0a 20 20 20 20 73 74  ardest ){.    st
1c7f0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66 6c  ruct symbol *dfl
1c800 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e  t_sp = 0;.    in
1c810 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20  t once = 1;.    
1c820 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1c830 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
1c840 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
1c850 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e  bol *sp = lemp->
1c860 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
1c870 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73    if( sp==0 || s
1c880 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  p->type==TERMINA
1c890 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 73  L ||.          s
1c8a0 70 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20 73  p->index<=0 || s
1c8b0 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30  p->destructor!=0
1c8c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1c8d0 20 20 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20     if( once ){. 
1c8e0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1c8f0 75 74 2c 20 22 20 20 20 20 20 20 2f 2a 20 44 65  ut, "      /* De
1c900 66 61 75 6c 74 20 4e 4f 4e 2d 54 45 52 4d 49 4e  fault NON-TERMIN
1c910 41 4c 20 44 65 73 74 72 75 63 74 6f 72 20 2a 2f  AL Destructor */
1c920 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1c930 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30          once = 0
1c940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c950 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1c960 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20   case %d: /* %s 
1c970 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  */\n",.         
1c980 20 20 20 20 20 73 70 2d 3e 69 6e 64 65 78 2c 20       sp->index, 
1c990 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  sp->name); linen
1c9a0 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66 6c 74 5f  o++;.      dflt_
1c9b0 73 70 20 3d 20 73 70 3b 0a 20 20 20 20 7d 0a 20  sp = sp;.    }. 
1c9c0 20 20 20 69 66 28 20 64 66 6c 74 5f 73 70 21 3d     if( dflt_sp!=
1c9d0 30 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f  0 ){.      emit_
1c9e0 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28  destructor_code(
1c9f0 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d 70  out,dflt_sp,lemp
1ca00 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 7d  ,&lineno);.    }
1ca10 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1ca20 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e  ,"      break;\n
1ca30 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1ca40 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  }.  for(i=0; i<l
1ca50 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
1ca60 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73  +){.    struct s
1ca70 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
1ca80 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
1ca90 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73    if( sp==0 || s
1caa0 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  p->type==TERMINA
1cab0 4c 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63  L || sp->destruc
1cac0 74 6f 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  tor==0 ) continu
1cad0 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e;.    fprintf(o
1cae0 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a  ut,"    case %d:
1caf0 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20   /* %s */\n",.  
1cb00 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 69 6e            sp->in
1cb10 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20  dex, sp->name); 
1cb20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 20 20 2f  lineno++;..    /
1cb30 2a 20 43 6f 6d 62 69 6e 65 20 64 75 70 6c 69 63  * Combine duplic
1cb40 61 74 65 20 64 65 73 74 72 75 63 74 6f 72 73 20  ate destructors 
1cb50 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 63 61  into a single ca
1cb60 73 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d  se */.    for(j=
1cb70 69 2b 31 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79  i+1; j<lemp->nsy
1cb80 6d 62 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  mbol; j++){.    
1cb90 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1cba0 2a 73 70 32 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d  *sp2 = lemp->sym
1cbb0 62 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  bols[j];.      i
1cbc0 66 28 20 73 70 32 20 26 26 20 73 70 32 2d 3e 74  f( sp2 && sp2->t
1cbd0 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 26 26  ype!=TERMINAL &&
1cbe0 20 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72   sp2->destructor
1cbf0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 70  .          && sp
1cc00 32 2d 3e 64 74 6e 75 6d 3d 3d 73 70 2d 3e 64 74  2->dtnum==sp->dt
1cc10 6e 75 6d 0a 20 20 20 20 20 20 20 20 20 20 26 26  num.          &&
1cc20 20 73 74 72 63 6d 70 28 73 70 2d 3e 64 65 73 74   strcmp(sp->dest
1cc30 72 75 63 74 6f 72 2c 73 70 32 2d 3e 64 65 73 74  ructor,sp2->dest
1cc40 72 75 63 74 6f 72 29 3d 3d 30 20 29 7b 0a 20 20  ructor)==0 ){.  
1cc50 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1cc60 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a  ut,"    case %d:
1cc70 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20   /* %s */\n",.  
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1cc90 70 32 2d 3e 69 6e 64 65 78 2c 20 73 70 32 2d 3e  p2->index, sp2->
1cca0 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
1ccb0 0a 20 20 20 20 20 20 20 20 20 73 70 32 2d 3e 64  .         sp2->d
1ccc0 65 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20  estructor = 0;. 
1ccd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1cce0 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f    emit_destructo
1ccf0 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d  r_code(out,lemp-
1cd00 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70  >symbols[i],lemp
1cd10 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66  ,&lineno);.    f
1cd20 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1cd30 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69    break;\n"); li
1cd40 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70  neno++;.  }.  tp
1cd50 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1cd60 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
1cd70 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
1cd80 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78  te code which ex
1cd90 65 63 75 74 65 73 20 77 68 65 6e 65 76 65 72 20  ecutes whenever 
1cda0 74 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b  the parser stack
1cdb0 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20   overflows */.  
1cdc0 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
1cdd0 65 6d 70 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c  emp,lemp->overfl
1cde0 6f 77 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74  ow,&lineno);.  t
1cdf0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1ce00 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1ce10 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1ce20 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f 66  ate the table of
1ce30 20 72 75 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   rule informatio
1ce40 6e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  n .  **.  ** Not
1ce50 65 3a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  e: This code dep
1ce60 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
1ce70 20 74 68 61 74 20 72 75 6c 65 73 20 61 72 65 20   that rules are 
1ce80 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 65 71 75  number.  ** sequ
1ce90 65 6e 74 75 61 6c 6c 79 20 62 65 67 69 6e 6e 69  entually beginni
1cea0 6e 67 20 77 69 74 68 20 30 2e 0a 20 20 2a 2f 0a  ng with 0..  */.
1ceb0 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
1cec0 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
1ced0 6e 65 78 74 29 7b 0a 20 20 20 20 66 70 72 69 6e  next){.    fprin
1cee0 74 66 28 6f 75 74 2c 22 20 20 7b 20 25 64 2c 20  tf(out,"  { %d, 
1cef0 25 64 20 7d 2c 5c 6e 22 2c 72 70 2d 3e 6c 68 73  %d },\n",rp->lhs
1cf00 2d 3e 69 6e 64 65 78 2c 72 70 2d 3e 6e 72 68 73  ->index,rp->nrhs
1cf10 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1cf20 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1cf30 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1cf40 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1cf50 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
1cf60 63 68 20 65 78 65 63 75 74 69 6f 6e 20 64 75 72  ch execution dur
1cf70 69 6e 67 20 65 61 63 68 20 52 45 44 55 43 45 20  ing each REDUCE 
1cf80 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28  action */.  for(
1cf90 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
1cfa0 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
1cfb0 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65 5f 63  .    translate_c
1cfc0 6f 64 65 28 6c 65 6d 70 2c 20 72 70 29 3b 0a 20  ode(lemp, rp);. 
1cfd0 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70   }.  for(rp=lemp
1cfe0 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
1cff0 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 73 74  p->next){.    st
1d000 72 75 63 74 20 72 75 6c 65 20 2a 72 70 32 3b 0a  ruct rule *rp2;.
1d010 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65      if( rp->code
1d020 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1d030 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1d040 22 20 20 20 20 20 20 63 61 73 65 20 25 64 3a 20  "      case %d: 
1d050 2f 2a 20 22 2c 20 72 70 2d 3e 69 6e 64 65 78 29  /* ", rp->index)
1d060 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54  ;.    writeRuleT
1d070 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20  ext(out, rp);.  
1d080 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1d090 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b   */\n"); lineno+
1d0a0 2b 3b 0a 20 20 20 20 66 6f 72 28 72 70 32 3d 72  +;.    for(rp2=r
1d0b0 70 2d 3e 6e 65 78 74 3b 20 72 70 32 3b 20 72 70  p->next; rp2; rp
1d0c0 32 3d 72 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20  2=rp2->next){.  
1d0d0 20 20 20 20 69 66 28 20 72 70 32 2d 3e 63 6f 64      if( rp2->cod
1d0e0 65 3d 3d 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20  e==rp->code ){. 
1d0f0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1d100 75 74 2c 22 20 20 20 20 20 20 63 61 73 65 20 25  ut,"      case %
1d110 64 3a 20 2f 2a 20 22 2c 20 72 70 32 2d 3e 69 6e  d: /* ", rp2->in
1d120 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 77 72  dex);.        wr
1d130 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c  iteRuleText(out,
1d140 20 72 70 32 29 3b 0a 20 20 20 20 20 20 20 20 66   rp2);.        f
1d150 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2a 2f 5c  printf(out," */\
1d160 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1d170 20 20 20 20 20 20 20 72 70 32 2d 3e 63 6f 64 65         rp2->code
1d180 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1d190 20 20 7d 0a 20 20 20 20 65 6d 69 74 5f 63 6f 64    }.    emit_cod
1d1a0 65 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c  e(out,rp,lemp,&l
1d1b0 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69  ineno);.    fpri
1d1c0 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20  ntf(out,"       
1d1d0 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
1d1e0 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
1d1f0 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1d200 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1d210 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1d220 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
1d230 63 75 74 65 73 20 69 66 20 61 20 70 61 72 73 65  cutes if a parse
1d240 20 66 61 69 6c 73 20 2a 2f 0a 20 20 74 70 6c 74   fails */.  tplt
1d250 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
1d260 6c 65 6d 70 2d 3e 66 61 69 6c 75 72 65 2c 26 6c  lemp->failure,&l
1d270 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78  ineno);.  tplt_x
1d280 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1d290 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1d2a0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1d2b0 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
1d2c0 65 73 20 77 68 65 6e 20 61 20 73 79 6e 74 61 78  es when a syntax
1d2d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f   error occurs */
1d2e0 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
1d2f0 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 72 72  t,lemp,lemp->err
1d300 6f 72 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74  or,&lineno);.  t
1d310 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1d320 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1d330 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1d340 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
1d350 78 65 63 75 74 65 73 20 77 68 65 6e 20 74 68 65  xecutes when the
1d360 20 70 61 72 73 65 72 20 61 63 63 65 70 74 73 20   parser accepts 
1d370 69 74 73 20 69 6e 70 75 74 20 2a 2f 0a 20 20 74  its input */.  t
1d380 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
1d390 6d 70 2c 6c 65 6d 70 2d 3e 61 63 63 65 70 74 2c  mp,lemp->accept,
1d3a0 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74  &lineno);.  tplt
1d3b0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1d3c0 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1d3d0 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 61  ;..  /* Append a
1d3e0 6e 79 20 61 64 64 69 74 69 6f 6e 20 63 6f 64 65  ny addition code
1d3f0 20 74 68 65 20 75 73 65 72 20 64 65 73 69 72 65   the user desire
1d400 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  s */.  tplt_prin
1d410 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
1d420 3e 65 78 74 72 61 63 6f 64 65 2c 26 6c 69 6e 65  >extracode,&line
1d430 6e 6f 29 3b 0a 0a 20 20 66 63 6c 6f 73 65 28 69  no);..  fclose(i
1d440 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74  n);.  fclose(out
1d450 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
1d460 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 65  /* Generate a he
1d470 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20 74 68  ader file for th
1d480 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64  e parser */.void
1d490 20 52 65 70 6f 72 74 48 65 61 64 65 72 28 6c 65   ReportHeader(le
1d4a0 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
1d4b0 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 46 49 4c 45   *lemp;.{.  FILE
1d4c0 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68   *out, *in;.  ch
1d4d0 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 63 68  ar *prefix;.  ch
1d4e0 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45  ar line[LINESIZE
1d4f0 5d 3b 0a 20 20 63 68 61 72 20 70 61 74 74 65 72  ];.  char patter
1d500 6e 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69  n[LINESIZE];.  i
1d510 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6c 65 6d  nt i;..  if( lem
1d520 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29  p->tokenprefix )
1d530 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e   prefix = lemp->
1d540 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 65  tokenprefix;.  e
1d550 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
1d560 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d 20         prefix = 
1d570 22 22 3b 0a 20 20 69 6e 20 3d 20 66 69 6c 65 5f  "";.  in = file_
1d580 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22  open(lemp,".h","
1d590 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 20 29  rb");.  if( in )
1d5a0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  {.    for(i=1; i
1d5b0 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
1d5c0 20 26 26 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c   && fgets(line,L
1d5d0 49 4e 45 53 49 5a 45 2c 69 6e 29 3b 20 69 2b 2b  INESIZE,in); i++
1d5e0 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ){.      sprintf
1d5f0 28 70 61 74 74 65 72 6e 2c 22 23 64 65 66 69 6e  (pattern,"#defin
1d600 65 20 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22  e %s%-30s %2d\n"
1d610 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79  ,prefix,lemp->sy
1d620 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69  mbols[i]->name,i
1d630 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
1d640 63 6d 70 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e  cmp(line,pattern
1d650 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
1d660 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
1d670 0a 20 20 20 20 69 66 28 20 69 3d 3d 6c 65 6d 70  .    if( i==lemp
1d680 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20  ->nterminal ){. 
1d690 20 20 20 20 20 2f 2a 20 4e 6f 20 63 68 61 6e 67       /* No chang
1d6a0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  e in the file.  
1d6b0 44 6f 6e 27 74 20 72 65 77 72 69 74 65 20 69 74  Don't rewrite it
1d6c0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
1d6d0 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6f  n;.    }.  }.  o
1d6e0 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c  ut = file_open(l
1d6f0 65 6d 70 2c 22 2e 68 22 2c 22 77 62 22 29 3b 0a  emp,".h","wb");.
1d700 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
1d710 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70   for(i=1; i<lemp
1d720 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b  ->nterminal; i++
1d730 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
1d740 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1d750 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65  %-30s %2d\n",pre
1d760 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  fix,lemp->symbol
1d770 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20  s[i]->name,i);. 
1d780 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28     }.    fclose(
1d790 6f 75 74 29 3b 20 20 0a 20 20 7d 0a 20 20 72 65  out);  .  }.  re
1d7a0 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 64 75  turn;.}../* Redu
1d7b0 63 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ce the size of t
1d7c0 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73  he action tables
1d7d0 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 62  , if possible, b
1d7e0 79 20 6d 61 6b 69 6e 67 20 75 73 65 0a 2a 2a 20  y making use.** 
1d7f0 6f 66 20 64 65 66 61 75 6c 74 73 2e 0a 2a 2a 0a  of defaults..**.
1d800 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69  ** In this versi
1d810 6f 6e 2c 20 77 65 20 74 61 6b 65 20 74 68 65 20  on, we take the 
1d820 6d 6f 73 74 20 66 72 65 71 75 65 6e 74 20 52 45  most frequent RE
1d830 44 55 43 45 20 61 63 74 69 6f 6e 20 61 6e 64 20  DUCE action and 
1d840 6d 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20 64  make.** it the d
1d850 65 66 61 75 6c 74 2e 20 20 45 78 63 65 70 74 2c  efault.  Except,
1d860 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
1d870 61 75 6c 74 20 69 66 20 74 68 65 20 77 69 6c 64  ault if the wild
1d880 63 61 72 64 20 74 6f 6b 65 6e 0a 2a 2a 20 69 73  card token.** is
1d890 20 61 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b   a possible look
1d8a0 2d 61 68 65 61 64 2e 0a 2a 2f 0a 76 6f 69 64 20  -ahead..*/.void 
1d8b0 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28 6c  CompressTables(l
1d8c0 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
1d8d0 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72  n *lemp;.{.  str
1d8e0 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
1d8f0 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
1d900 2a 61 70 2c 20 2a 61 70 32 3b 0a 20 20 73 74 72  *ap, *ap2;.  str
1d910 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 72  uct rule *rp, *r
1d920 70 32 2c 20 2a 72 62 65 73 74 3b 0a 20 20 69 6e  p2, *rbest;.  in
1d930 74 20 6e 62 65 73 74 2c 20 6e 3b 0a 20 20 69 6e  t nbest, n;.  in
1d940 74 20 69 3b 0a 20 20 69 6e 74 20 75 73 65 73 57  t i;.  int usesW
1d950 69 6c 64 63 61 72 64 3b 0a 0a 20 20 66 6f 72 28  ildcard;..  for(
1d960 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
1d970 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
1d980 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
1d990 64 5b 69 5d 3b 0a 20 20 20 20 6e 62 65 73 74 20  d[i];.    nbest 
1d9a0 3d 20 30 3b 0a 20 20 20 20 72 62 65 73 74 20 3d  = 0;.    rbest =
1d9b0 20 30 3b 0a 20 20 20 20 75 73 65 73 57 69 6c 64   0;.    usesWild
1d9c0 63 61 72 64 20 3d 20 30 3b 0a 0a 20 20 20 20 66  card = 0;..    f
1d9d0 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61  or(ap=stp->ap; a
1d9e0 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
1d9f0 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
1da00 79 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70  ype==SHIFT && ap
1da10 2d 3e 73 70 3d 3d 6c 65 6d 70 2d 3e 77 69 6c 64  ->sp==lemp->wild
1da20 63 61 72 64 20 29 7b 0a 20 20 20 20 20 20 20 20  card ){.        
1da30 75 73 65 73 57 69 6c 64 63 61 72 64 20 3d 20 31  usesWildcard = 1
1da40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1da50 69 66 28 20 61 70 2d 3e 74 79 70 65 21 3d 52 45  if( ap->type!=RE
1da60 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DUCE ) continue;
1da70 0a 20 20 20 20 20 20 72 70 20 3d 20 61 70 2d 3e  .      rp = ap->
1da80 78 2e 72 70 3b 0a 20 20 20 20 20 20 69 66 28 20  x.rp;.      if( 
1da90 72 70 2d 3e 6c 68 73 53 74 61 72 74 20 29 20 63  rp->lhsStart ) c
1daa0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
1dab0 66 28 20 72 70 3d 3d 72 62 65 73 74 20 29 20 63  f( rp==rbest ) c
1dac0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e  ontinue;.      n
1dad0 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 1;.      for(
1dae0 61 70 32 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70  ap2=ap->next; ap
1daf0 32 3b 20 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74  2; ap2=ap2->next
1db00 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
1db10 70 32 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45  p2->type!=REDUCE
1db20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1db30 20 20 20 20 20 72 70 32 20 3d 20 61 70 32 2d 3e       rp2 = ap2->
1db40 78 2e 72 70 3b 0a 20 20 20 20 20 20 20 20 69 66  x.rp;.        if
1db50 28 20 72 70 32 3d 3d 72 62 65 73 74 20 29 20 63  ( rp2==rbest ) c
1db60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1db70 20 69 66 28 20 72 70 32 3d 3d 72 70 20 29 20 6e   if( rp2==rp ) n
1db80 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1db90 20 20 69 66 28 20 6e 3e 6e 62 65 73 74 20 29 7b    if( n>nbest ){
1dba0 0a 20 20 20 20 20 20 20 20 6e 62 65 73 74 20 3d  .        nbest =
1dbb0 20 6e 3b 0a 20 20 20 20 20 20 20 20 72 62 65 73   n;.        rbes
1dbc0 74 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 7d 0a  t = rp;.      }.
1dbd0 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 44      }. .    /* D
1dbe0 6f 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 65 66  o not make a def
1dbf0 61 75 6c 74 20 69 66 20 74 68 65 20 6e 75 6d 62  ault if the numb
1dc00 65 72 20 6f 66 20 72 75 6c 65 73 20 74 6f 20 64  er of rules to d
1dc10 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 69 73  efault.    ** is
1dc20 20 6e 6f 74 20 61 74 20 6c 65 61 73 74 20 31 20   not at least 1 
1dc30 6f 72 20 69 66 20 74 68 65 20 77 69 6c 64 63 61  or if the wildca
1dc40 72 64 20 74 6f 6b 65 6e 20 69 73 20 61 20 70 6f  rd token is a po
1dc50 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 6c 6f  ssible.    ** lo
1dc60 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20 2a 2f 0a  okahead..    */.
1dc70 20 20 20 20 69 66 28 20 6e 62 65 73 74 3c 31 20      if( nbest<1 
1dc80 7c 7c 20 75 73 65 73 57 69 6c 64 63 61 72 64 20  || usesWildcard 
1dc90 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20  ) continue;...  
1dca0 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 6d 61 74    /* Combine mat
1dcb0 63 68 69 6e 67 20 52 45 44 55 43 45 20 61 63 74  ching REDUCE act
1dcc0 69 6f 6e 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ions into a sing
1dcd0 6c 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20  le default */.  
1dce0 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
1dcf0 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
1dd00 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70  t){.      if( ap
1dd10 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26  ->type==REDUCE &
1dd20 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73  & ap->x.rp==rbes
1dd30 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t ) break;.    }
1dd40 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70 20  .    assert( ap 
1dd50 29 3b 0a 20 20 20 20 61 70 2d 3e 73 70 20 3d 20  );.    ap->sp = 
1dd60 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66  Symbol_new("{def
1dd70 61 75 6c 74 7d 22 29 3b 0a 20 20 20 20 66 6f 72  ault}");.    for
1dd80 28 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70  (ap=ap->next; ap
1dd90 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1dda0 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
1ddb0 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70  pe==REDUCE && ap
1ddc0 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20  ->x.rp==rbest ) 
1ddd0 61 70 2d 3e 74 79 70 65 20 3d 20 4e 4f 54 5f 55  ap->type = NOT_U
1dde0 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  SED;.    }.    s
1ddf0 74 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f  tp->ap = Action_
1de00 73 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20  sort(stp->ap);. 
1de10 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   }.}.../*.** Com
1de20 70 61 72 65 20 74 77 6f 20 73 74 61 74 65 73 20  pare two states 
1de30 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70  for sorting purp
1de40 6f 73 65 73 2e 20 20 54 68 65 20 73 6d 61 6c 6c  oses.  The small
1de50 65 72 20 73 74 61 74 65 20 69 73 20 74 68 65 0a  er state is the.
1de60 2a 2a 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  ** one with the 
1de70 6d 6f 73 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  most non-termina
1de80 6c 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74  l actions.  If t
1de90 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d  hey have the sam
1dea0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e  e number.** of n
1deb0 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74 69  on-terminal acti
1dec0 6f 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 73 6d  ons, then the sm
1ded0 61 6c 6c 65 72 20 69 73 20 74 68 65 20 6f 6e 65  aller is the one
1dee0 20 77 69 74 68 20 74 68 65 20 6d 6f 73 74 0a 2a   with the most.*
1def0 2a 20 74 6f 6b 65 6e 20 61 63 74 69 6f 6e 73 2e  * token actions.
1df00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1df10 74 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72  tateResortCompar
1df20 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c  e(const void *a,
1df30 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b   const void *b){
1df40 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
1df50 73 74 61 74 65 20 2a 70 41 20 3d 20 2a 28 63 6f  state *pA = *(co
1df60 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65  nst struct state
1df70 2a 2a 29 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74  **)a;.  const st
1df80 72 75 63 74 20 73 74 61 74 65 20 2a 70 42 20 3d  ruct state *pB =
1df90 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20   *(const struct 
1dfa0 73 74 61 74 65 2a 2a 29 62 3b 0a 20 20 69 6e 74  state**)b;.  int
1dfb0 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e   n;..  n = pB->n
1dfc0 4e 74 41 63 74 20 2d 20 70 41 2d 3e 6e 4e 74 41  NtAct - pA->nNtA
1dfd0 63 74 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29  ct;.  if( n==0 )
1dfe0 7b 0a 20 20 20 20 6e 20 3d 20 70 42 2d 3e 6e 54  {.    n = pB->nT
1dff0 6b 6e 41 63 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e  knAct - pA->nTkn
1e000 41 63 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Act;.  }.  retur
1e010 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  n n;.}.../*.** R
1e020 65 6e 75 6d 62 65 72 20 61 6e 64 20 72 65 73 6f  enumber and reso
1e030 72 74 20 73 74 61 74 65 73 20 73 6f 20 74 68 61  rt states so tha
1e040 74 20 73 74 61 74 65 73 20 77 69 74 68 20 66 65  t states with fe
1e050 77 65 72 20 63 68 6f 69 63 65 73 0a 2a 2a 20 6f  wer choices.** o
1e060 63 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e  ccur at the end.
1e070 20 20 45 78 63 65 70 74 2c 20 6b 65 65 70 20 73    Except, keep s
1e080 74 61 74 65 20 30 20 61 73 20 74 68 65 20 66 69  tate 0 as the fi
1e090 72 73 74 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f  rst state..*/.vo
1e0a0 69 64 20 52 65 73 6f 72 74 53 74 61 74 65 73 28  id ResortStates(
1e0b0 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
1e0c0 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e  on *lemp;.{.  in
1e0d0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
1e0e0 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
1e0f0 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 0a  ct action *ap;..
1e100 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1e110 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
1e120 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
1e130 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
1e140 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20 73  stp->nTknAct = s
1e150 74 70 2d 3e 6e 4e 74 41 63 74 20 3d 20 30 3b 0a  tp->nNtAct = 0;.
1e160 20 20 20 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d      stp->iDflt =
1e170 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20   lemp->nstate + 
1e180 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20  lemp->nrule;.   
1e190 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d   stp->iTknOfst =
1e1a0 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20   NO_OFFSET;.    
1e1b0 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 4e  stp->iNtOfst = N
1e1c0 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 66 6f  O_OFFSET;.    fo
1e1d0 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
1e1e0 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1e1f0 20 20 20 20 20 20 69 66 28 20 63 6f 6d 70 75 74        if( comput
1e200 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70  e_action(lemp,ap
1e210 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
1e220 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
1e230 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  x<lemp->ntermina
1e240 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  l ){.          s
1e250 74 70 2d 3e 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20  tp->nTknAct++;. 
1e260 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1e270 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c   ap->sp->index<l
1e280 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a  emp->nsymbol ){.
1e290 20 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e            stp->n
1e2a0 4e 74 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20  NtAct++;.       
1e2b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e2c0 20 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 63    stp->iDflt = c
1e2d0 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65  ompute_action(le
1e2e0 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20  mp, ap);.       
1e2f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1e300 0a 20 20 7d 0a 20 20 71 73 6f 72 74 28 26 6c 65  .  }.  qsort(&le
1e310 6d 70 2d 3e 73 6f 72 74 65 64 5b 31 5d 2c 20 6c  mp->sorted[1], l
1e320 65 6d 70 2d 3e 6e 73 74 61 74 65 2d 31 2c 20 73  emp->nstate-1, s
1e330 69 7a 65 6f 66 28 6c 65 6d 70 2d 3e 73 6f 72 74  izeof(lemp->sort
1e340 65 64 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 20  ed[0]),.        
1e350 73 74 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61  stateResortCompa
1e360 72 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  re);.  for(i=0; 
1e370 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
1e380 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e  i++){.    lemp->
1e390 73 6f 72 74 65 64 5b 69 5d 2d 3e 73 74 61 74 65  sorted[i]->state
1e3a0 6e 75 6d 20 3d 20 69 3b 0a 20 20 7d 0a 7d 0a 0a  num = i;.  }.}..
1e3b0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1e3c0 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
1e3d0 65 20 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  e "set.c" ******
1e3e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1e400 2f 2a 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70 75  /*.** Set manipu
1e410 6c 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  lation routines 
1e420 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61  for the LEMON pa
1e430 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
1e440 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  */..static int s
1e450 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74  ize = 0;../* Set
1e460 20 74 68 65 20 73 65 74 20 73 69 7a 65 20 2a 2f   the set size */
1e470 0a 76 6f 69 64 20 53 65 74 53 69 7a 65 28 6e 29  .void SetSize(n)
1e480 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 73 69 7a 65  .int n;.{.  size
1e490 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c   = n+1;.}../* Al
1e4a0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 74  locate a new set
1e4b0 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77   */.char *SetNew
1e4c0 28 29 7b 0a 20 20 63 68 61 72 20 2a 73 3b 0a 20  (){.  char *s;. 
1e4d0 20 73 20 3d 20 28 63 68 61 72 2a 29 63 61 6c 6c   s = (char*)call
1e4e0 6f 63 28 20 73 69 7a 65 2c 20 31 29 3b 0a 20 20  oc( size, 1);.  
1e4f0 69 66 28 20 73 3d 3d 30 20 29 7b 0a 20 20 20 20  if( s==0 ){.    
1e500 65 78 74 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f  extern void memo
1e510 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20  ry_error();.    
1e520 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a  memory_error();.
1e530 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a    }.  return s;.
1e540 7d 0a 0a 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65  }../* Deallocate
1e550 20 61 20 73 65 74 20 2a 2f 0a 76 6f 69 64 20 53   a set */.void S
1e560 65 74 46 72 65 65 28 73 29 0a 63 68 61 72 20 2a  etFree(s).char *
1e570 73 3b 0a 7b 0a 20 20 66 72 65 65 28 73 29 3b 0a  s;.{.  free(s);.
1e580 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20  }../* Add a new 
1e590 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 73  element to the s
1e5a0 65 74 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  et.  Return TRUE
1e5b0 20 69 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 20   if the element 
1e5c0 77 61 73 20 61 64 64 65 64 0a 2a 2a 20 61 6e 64  was added.** and
1e5d0 20 46 41 4c 53 45 20 69 66 20 69 74 20 77 61 73   FALSE if it was
1e5e0 20 61 6c 72 65 61 64 79 20 74 68 65 72 65 2e 20   already there. 
1e5f0 2a 2f 0a 69 6e 74 20 53 65 74 41 64 64 28 73 2c  */.int SetAdd(s,
1e600 65 29 0a 63 68 61 72 20 2a 73 3b 0a 69 6e 74 20  e).char *s;.int 
1e610 65 3b 0a 7b 0a 20 20 69 6e 74 20 72 76 3b 0a 20  e;.{.  int rv;. 
1e620 20 61 73 73 65 72 74 28 20 65 3e 3d 30 20 26 26   assert( e>=0 &&
1e630 20 65 3c 73 69 7a 65 20 29 3b 0a 20 20 72 76 20   e<size );.  rv 
1e640 3d 20 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20 3d  = s[e];.  s[e] =
1e650 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 21 72 76   1;.  return !rv
1e660 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 65 76 65 72  ;.}../* Add ever
1e670 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 73 32 20  y element of s2 
1e680 74 6f 20 73 31 2e 20 20 52 65 74 75 72 6e 20 54  to s1.  Return T
1e690 52 55 45 20 69 66 20 73 31 20 63 68 61 6e 67 65  RUE if s1 change
1e6a0 73 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69  s. */.int SetUni
1e6b0 6f 6e 28 73 31 2c 73 32 29 0a 63 68 61 72 20 2a  on(s1,s2).char *
1e6c0 73 31 3b 0a 63 68 61 72 20 2a 73 32 3b 0a 7b 0a  s1;.char *s2;.{.
1e6d0 20 20 69 6e 74 20 69 2c 20 70 72 6f 67 72 65 73    int i, progres
1e6e0 73 3b 0a 20 20 70 72 6f 67 72 65 73 73 20 3d 20  s;.  progress = 
1e6f0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
1e700 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  size; i++){.    
1e710 69 66 28 20 73 32 5b 69 5d 3d 3d 30 20 29 20 63  if( s2[i]==0 ) c
1e720 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
1e730 20 73 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20   s1[i]==0 ){.   
1e740 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
1e750 0a 20 20 20 20 20 20 73 31 5b 69 5d 20 3d 20 31  .      s1[i] = 1
1e760 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1e770 74 75 72 6e 20 70 72 6f 67 72 65 73 73 3b 0a 7d  turn progress;.}
1e780 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1e790 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
1e7a0 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 63 22  e file "table.c"
1e7b0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1e7c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
1e7d0 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e  *.** All code in
1e7e0 20 74 68 69 73 20 66 69 6c 65 20 68 61 73 20 62   this file has b
1e7f0 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  een automaticall
1e800 79 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66  y generated.** f
1e810 72 6f 6d 20 61 20 73 70 65 63 69 66 69 63 61 74  rom a specificat
1e820 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  ion in the file.
1e830 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1e840 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20  "table.q".** by 
1e850 74 68 65 20 61 73 73 6f 63 69 61 74 69 76 65 20  the associative 
1e860 61 72 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64  array code build
1e870 69 6e 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67  ing program "aag
1e880 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65  en"..** Do not e
1e890 64 69 74 20 74 68 69 73 20 66 69 6c 65 21 20 20  dit this file!  
1e8a0 49 6e 73 74 65 61 64 2c 20 65 64 69 74 20 74 68  Instead, edit th
1e8b0 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a  e specification.
1e8c0 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65  ** file, then re
1e8d0 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a  run aagen..*/./*
1e8e0 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f  .** Code for pro
1e8f0 63 65 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69  cessing tables i
1e900 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
1e910 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
1e920 0a 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73 74  ..PRIVATE int st
1e930 72 68 61 73 68 28 78 29 0a 63 68 61 72 20 2a 78  rhash(x).char *x
1e940 3b 0a 7b 0a 20 20 69 6e 74 20 68 20 3d 20 30 3b  ;.{.  int h = 0;
1e950 0a 20 20 77 68 69 6c 65 28 20 2a 78 29 20 68 20  .  while( *x) h 
1e960 3d 20 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b  = h*13 + *(x++);
1e970 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a  .  return h;.}..
1e980 2f 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74  /* Works like st
1e990 72 64 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20  rdup, sort of.  
1e9a0 53 61 76 65 20 61 20 73 74 72 69 6e 67 20 69 6e  Save a string in
1e9b0 20 6d 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79   malloced memory
1e9c0 2c 20 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74  , but.** keep st
1e9d0 72 69 6e 67 73 20 69 6e 20 61 20 74 61 62 6c 65  rings in a table
1e9e0 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d   so that the sam
1e9f0 65 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20  e string is not 
1ea00 69 6e 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20  in more.** than 
1ea10 6f 6e 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 68  one place..*/.ch
1ea20 61 72 20 2a 53 74 72 73 61 66 65 28 79 29 0a 63  ar *Strsafe(y).c
1ea30 68 61 72 20 2a 79 3b 0a 7b 0a 20 20 63 68 61 72  har *y;.{.  char
1ea40 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 79 3d 3d 30   *z;..  if( y==0
1ea50 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a   ) return 0;.  z
1ea60 20 3d 20 53 74 72 73 61 66 65 5f 66 69 6e 64 28   = Strsafe_find(
1ea70 79 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 26  y);.  if( z==0 &
1ea80 26 20 28 7a 3d 6d 61 6c 6c 6f 63 28 20 6c 65 6d  & (z=malloc( lem
1ea90 6f 6e 53 74 72 6c 65 6e 28 79 29 2b 31 20 29 29  onStrlen(y)+1 ))
1eaa0 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 63 70  !=0 ){.    strcp
1eab0 79 28 7a 2c 79 29 3b 0a 20 20 20 20 53 74 72 73  y(z,y);.    Strs
1eac0 61 66 65 5f 69 6e 73 65 72 74 28 7a 29 3b 0a 20  afe_insert(z);. 
1ead0 20 7d 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b   }.  MemoryCheck
1eae0 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  (z);.  return z;
1eaf0 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  .}../* There is 
1eb00 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
1eb10 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1eb20 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
1eb30 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20  .** associative 
1eb40 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
1eb50 31 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f  1"..*/.struct s_
1eb60 78 31 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  x1 {.  int size;
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eb80 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
1eb90 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e  available slots.
1eba0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ebc0 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77     Must be a pow
1ebd0 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20  er of 2 greater 
1ebe0 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20  than or */.     
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec00 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20       /*   equal 
1ec10 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  to 1 */.  int co
1ec20 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  unt;            
1ec30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1ec40 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66  urrently slots f
1ec50 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  illed */.  struc
1ec60 74 20 73 5f 78 31 6e 6f 64 65 20 2a 74 62 6c 3b  t s_x1node *tbl;
1ec70 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74    /* The data st
1ec80 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73  ored here */.  s
1ec90 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a  truct s_x1node *
1eca0 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61  *ht;  /* Hash ta
1ecb0 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20  ble for lookups 
1ecc0 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  */.};../* There 
1ecd0 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
1ece0 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
1ecf0 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  e for every data
1ed00 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61   element.** in a
1ed10 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  n associative ar
1ed20 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 31 22  ray of type "x1"
1ed30 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
1ed40 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 7b 0a 20  uct s_x1node {. 
1ed50 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ed70 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73   The data */.  s
1ed80 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a  truct s_x1node *
1ed90 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20  next;   /* Next 
1eda0 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
1edb0 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74  ame hash */.  st
1edc0 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a  ruct s_x1node **
1edd0 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f  from;  /* Previo
1ede0 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e  us link */.} x1n
1edf0 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  ode;../* There i
1ee00 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61  s only one insta
1ee10 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  nce of the array
1ee20 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66  , which is the f
1ee30 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74  ollowing */.stat
1ee40 69 63 20 73 74 72 75 63 74 20 73 5f 78 31 20 2a  ic struct s_x1 *
1ee50 78 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  x1a;../* Allocat
1ee60 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74  e a new associat
1ee70 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69  ive array */.voi
1ee80 64 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29  d Strsafe_init()
1ee90 7b 0a 20 20 69 66 28 20 78 31 61 20 29 20 72 65  {.  if( x1a ) re
1eea0 74 75 72 6e 3b 0a 20 20 78 31 61 20 3d 20 28 73  turn;.  x1a = (s
1eeb0 74 72 75 63 74 20 73 5f 78 31 2a 29 6d 61 6c 6c  truct s_x1*)mall
1eec0 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
1eed0 74 20 73 5f 78 31 29 20 29 3b 0a 20 20 69 66 28  t s_x1) );.  if(
1eee0 20 78 31 61 20 29 7b 0a 20 20 20 20 78 31 61 2d   x1a ){.    x1a-
1eef0 3e 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  >size = 1024;.  
1ef00 20 20 78 31 61 2d 3e 63 6f 75 6e 74 20 3d 20 30    x1a->count = 0
1ef10 3b 0a 20 20 20 20 78 31 61 2d 3e 74 62 6c 20 3d  ;.    x1a->tbl =
1ef20 20 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63   (x1node*)malloc
1ef30 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66  ( .      (sizeof
1ef40 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x1node) + sizeo
1ef50 66 28 78 31 6e 6f 64 65 2a 29 29 2a 31 30 32 34  f(x1node*))*1024
1ef60 20 29 3b 0a 20 20 20 20 69 66 28 20 78 31 61 2d   );.    if( x1a-
1ef70 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >tbl==0 ){.     
1ef80 20 66 72 65 65 28 78 31 61 29 3b 0a 20 20 20 20   free(x1a);.    
1ef90 20 20 78 31 61 20 3d 20 30 3b 0a 20 20 20 20 7d    x1a = 0;.    }
1efa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
1efb0 69 3b 0a 20 20 20 20 20 20 78 31 61 2d 3e 68 74  i;.      x1a->ht
1efc0 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 78   = (x1node**)&(x
1efd0 31 61 2d 3e 74 62 6c 5b 31 30 32 34 5d 29 3b 0a  1a->tbl[1024]);.
1efe0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1eff0 3c 31 30 32 34 3b 20 69 2b 2b 29 20 78 31 61 2d  <1024; i++) x1a-
1f000 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  >ht[i] = 0;.    
1f010 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72  }.  }.}./* Inser
1f020 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
1f030 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20  nto the array.  
1f040 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
1f050 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72  uccessful..** Pr
1f060 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68  ior data with th
1f070 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f  e same key is NO
1f080 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f  T overwritten */
1f090 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73  .int Strsafe_ins
1f0a0 65 72 74 28 64 61 74 61 29 0a 63 68 61 72 20 2a  ert(data).char *
1f0b0 64 61 74 61 3b 0a 7b 0a 20 20 78 31 6e 6f 64 65  data;.{.  x1node
1f0c0 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20   *np;.  int h;. 
1f0d0 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20   int ph;..  if( 
1f0e0 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x1a==0 ) return 
1f0f0 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73  0;.  ph = strhas
1f100 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70  h(data);.  h = p
1f110 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31  h & (x1a->size-1
1f120 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68  );.  np = x1a->h
1f130 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
1f140 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  p ){.    if( str
1f150 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74  cmp(np->data,dat
1f160 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  a)==0 ){.      /
1f170 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  * An existing en
1f180 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
1f190 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20  e key is found. 
1f1a0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  */.      /* Fail
1f1b0 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69   because overwri
1f1c0 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73  te is not allows
1f1d0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
1f1e0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 0;.    }.    n
1f1f0 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
1f200 7d 0a 20 20 69 66 28 20 78 31 61 2d 3e 63 6f 75  }.  if( x1a->cou
1f210 6e 74 3e 3d 78 31 61 2d 3e 73 69 7a 65 20 29 7b  nt>=x1a->size ){
1f220 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
1f230 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
1f240 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20  ble bigger */.  
1f250 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20    int i,size;.  
1f260 20 20 73 74 72 75 63 74 20 73 5f 78 31 20 61 72    struct s_x1 ar
1f270 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73  ray;.    array.s
1f280 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 31 61  ize = size = x1a
1f290 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72  ->size*2;.    ar
1f2a0 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31 61 2d  ray.count = x1a-
1f2b0 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61  >count;.    arra
1f2c0 79 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a  y.tbl = (x1node*
1f2d0 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28  )malloc(.      (
1f2e0 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b  sizeof(x1node) +
1f2f0 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29   sizeof(x1node*)
1f300 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66  )*size );.    if
1f310 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29  ( array.tbl==0 )
1f320 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46   return 0;  /* F
1f330 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f  ail due to mallo
1f340 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20  c failure */.   
1f350 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 31 6e   array.ht = (x1n
1f360 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62  ode**)&(array.tb
1f370 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f  l[size]);.    fo
1f380 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69  r(i=0; i<size; i
1f390 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20  ++) array.ht[i] 
1f3a0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
1f3b0 3b 20 69 3c 78 31 61 2d 3e 63 6f 75 6e 74 3b 20  ; i<x1a->count; 
1f3c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 31 6e 6f  i++){.      x1no
1f3d0 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e  de *oldnp, *newn
1f3e0 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d  p;.      oldnp =
1f3f0 20 26 28 78 31 61 2d 3e 74 62 6c 5b 69 5d 29 3b   &(x1a->tbl[i]);
1f400 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72 68 61  .      h = strha
1f410 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20  sh(oldnp->data) 
1f420 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20  & (size-1);.    
1f430 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61    newnp = &(arra
1f440 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  y.tbl[i]);.     
1f450 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d   if( array.ht[h]
1f460 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e   ) array.ht[h]->
1f470 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e  from = &(newnp->
1f480 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77  next);.      new
1f490 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79  np->next = array
1f4a0 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65  .ht[h];.      ne
1f4b0 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e  wnp->data = oldn
1f4c0 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e  p->data;.      n
1f4d0 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61  ewnp->from = &(a
1f4e0 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20  rray.ht[h]);.   
1f4f0 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d     array.ht[h] =
1f500 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20   newnp;.    }.  
1f510 20 20 66 72 65 65 28 78 31 61 2d 3e 74 62 6c 29    free(x1a->tbl)
1f520 3b 0a 20 20 20 20 2a 78 31 61 20 3d 20 61 72 72  ;.    *x1a = arr
1f530 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73  ay;.  }.  /* Ins
1f540 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61  ert the new data
1f550 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28   */.  h = ph & (
1f560 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x1a->size-1);.  
1f570 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b  np = &(x1a->tbl[
1f580 78 31 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a  x1a->count++]);.
1f590 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74    np->data = dat
1f5a0 61 3b 0a 20 20 69 66 28 20 78 31 61 2d 3e 68 74  a;.  if( x1a->ht
1f5b0 5b 68 5d 20 29 20 78 31 61 2d 3e 68 74 5b 68 5d  [h] ) x1a->ht[h]
1f5c0 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e  ->from = &(np->n
1f5d0 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74  ext);.  np->next
1f5e0 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x1a->ht[h];. 
1f5f0 20 78 31 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70   x1a->ht[h] = np
1f600 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26  ;.  np->from = &
1f610 28 78 31 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20  (x1a->ht[h]);.  
1f620 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20  return 1;.}../* 
1f630 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1f640 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65   to data assigne
1f650 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b  d to the given k
1f660 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ey.  Return NULL
1f670 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b  .** if no such k
1f680 65 79 2e 20 2a 2f 0a 63 68 61 72 20 2a 53 74 72  ey. */.char *Str
1f690 73 61 66 65 5f 66 69 6e 64 28 6b 65 79 29 0a 63  safe_find(key).c
1f6a0 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e  har *key;.{.  in
1f6b0 74 20 68 3b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e  t h;.  x1node *n
1f6c0 70 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30  p;..  if( x1a==0
1f6d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68   ) return 0;.  h
1f6e0 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 20   = strhash(key) 
1f6f0 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x1a->size-1);
1f700 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b  .  np = x1a->ht[
1f710 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
1f720 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
1f730 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d  p(np->data,key)=
1f740 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1f750 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
1f760 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f   }.  return np ?
1f770 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d   np->data : 0;.}
1f780 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
1f790 69 6e 74 65 72 20 74 6f 20 74 68 65 20 28 74 65  inter to the (te
1f7a0 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74 65 72  rminal or nonter
1f7b0 6d 69 6e 61 6c 29 20 73 79 6d 62 6f 6c 20 22 78  minal) symbol "x
1f7c0 22 2e 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  "..** Create a n
1f7d0 65 77 20 73 79 6d 62 6f 6c 20 69 66 20 74 68 69  ew symbol if thi
1f7e0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
1f7f0 69 6d 65 20 22 78 22 20 68 61 73 20 62 65 65 6e  ime "x" has been
1f800 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74   seen..*/.struct
1f810 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
1f820 6e 65 77 28 78 29 0a 63 68 61 72 20 2a 78 3b 0a  new(x).char *x;.
1f830 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
1f840 6c 20 2a 73 70 3b 0a 0a 20 20 73 70 20 3d 20 53  l *sp;..  sp = S
1f850 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b 0a 20  ymbol_find(x);. 
1f860 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20   if( sp==0 ){.  
1f870 20 20 73 70 20 3d 20 28 73 74 72 75 63 74 20 73    sp = (struct s
1f880 79 6d 62 6f 6c 20 2a 29 63 61 6c 6c 6f 63 28 31  ymbol *)calloc(1
1f890 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  , sizeof(struct 
1f8a0 73 79 6d 62 6f 6c 29 20 29 3b 0a 20 20 20 20 4d  symbol) );.    M
1f8b0 65 6d 6f 72 79 43 68 65 63 6b 28 73 70 29 3b 0a  emoryCheck(sp);.
1f8c0 20 20 20 20 73 70 2d 3e 6e 61 6d 65 20 3d 20 53      sp->name = S
1f8d0 74 72 73 61 66 65 28 78 29 3b 0a 20 20 20 20 73  trsafe(x);.    s
1f8e0 70 2d 3e 74 79 70 65 20 3d 20 69 73 75 70 70 65  p->type = isuppe
1f8f0 72 28 2a 78 29 20 3f 20 54 45 52 4d 49 4e 41 4c  r(*x) ? TERMINAL
1f900 20 3a 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c 3b 0a   : NONTERMINAL;.
1f910 20 20 20 20 73 70 2d 3e 72 75 6c 65 20 3d 20 30      sp->rule = 0
1f920 3b 0a 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61  ;.    sp->fallba
1f930 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  ck = 0;.    sp->
1f940 70 72 65 63 20 3d 20 2d 31 3b 0a 20 20 20 20 73  prec = -1;.    s
1f950 70 2d 3e 61 73 73 6f 63 20 3d 20 55 4e 4b 3b 0a  p->assoc = UNK;.
1f960 20 20 20 20 73 70 2d 3e 66 69 72 73 74 73 65 74      sp->firstset
1f970 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 6c 61   = 0;.    sp->la
1f980 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c  mbda = LEMON_FAL
1f990 53 45 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73 74  SE;.    sp->dest
1f9a0 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20  ructor = 0;.    
1f9b0 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 20 3d  sp->destLineno =
1f9c0 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 61 74 61   0;.    sp->data
1f9d0 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 73 70  type = 0;.    sp
1f9e0 2d 3e 75 73 65 43 6e 74 20 3d 20 30 3b 0a 20 20  ->useCnt = 0;.  
1f9f0 20 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28    Symbol_insert(
1fa00 73 70 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  sp,sp->name);.  
1fa10 7d 0a 20 20 73 70 2d 3e 75 73 65 43 6e 74 2b 2b  }.  sp->useCnt++
1fa20 3b 0a 20 20 72 65 74 75 72 6e 20 73 70 3b 0a 7d  ;.  return sp;.}
1fa30 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  ../* Compare two
1fa40 20 73 79 6d 62 6f 6c 73 20 66 6f 72 20 77 6f 72   symbols for wor
1fa50 6b 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2a  king purposes.**
1fa60 0a 2a 2a 20 53 79 6d 62 6f 6c 73 20 74 68 61 74  .** Symbols that
1fa70 20 62 65 67 69 6e 20 77 69 74 68 20 75 70 70 65   begin with uppe
1fa80 72 20 63 61 73 65 20 6c 65 74 74 65 72 73 20 28  r case letters (
1fa90 74 65 72 6d 69 6e 61 6c 73 20 6f 72 20 74 6f 6b  terminals or tok
1faa0 65 6e 73 29 0a 2a 2a 20 6d 75 73 74 20 73 6f 72  ens).** must sor
1fab0 74 20 62 65 66 6f 72 65 20 73 79 6d 62 6f 6c 73  t before symbols
1fac0 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
1fad0 20 6c 6f 77 65 72 20 63 61 73 65 20 6c 65 74 74   lower case lett
1fae0 65 72 73 0a 2a 2a 20 28 6e 6f 6e 2d 74 65 72 6d  ers.** (non-term
1faf0 69 6e 61 6c 73 29 2e 20 20 4f 74 68 65 72 20 74  inals).  Other t
1fb00 68 61 6e 20 74 68 61 74 2c 20 74 68 65 20 6f 72  han that, the or
1fb10 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  der does not mat
1fb20 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 66 69  ter..**.** We fi
1fb30 6e 64 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 6c  nd experimentall
1fb40 79 20 74 68 61 74 20 6c 65 61 76 69 6e 67 20 74  y that leaving t
1fb50 68 65 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68  he symbols in th
1fb60 65 69 72 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  eir original.** 
1fb70 6f 72 64 65 72 20 28 74 68 65 20 6f 72 64 65 72  order (the order
1fb80 20 74 68 65 79 20 61 70 70 65 61 72 65 64 20 69   they appeared i
1fb90 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 66 69  n the grammar fi
1fba0 6c 65 29 20 67 69 76 65 73 20 74 68 65 0a 2a 2a  le) gives the.**
1fbb0 20 73 6d 61 6c 6c 65 73 74 20 70 61 72 73 65 72   smallest parser
1fbc0 20 74 61 62 6c 65 73 20 69 6e 20 53 51 4c 69 74   tables in SQLit
1fbd0 65 2e 0a 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c  e..*/.int Symbol
1fbe0 63 6d 70 70 28 73 74 72 75 63 74 20 73 79 6d 62  cmpp(struct symb
1fbf0 6f 6c 20 2a 2a 61 2c 20 73 74 72 75 63 74 20 73  ol **a, struct s
1fc00 79 6d 62 6f 6c 20 2a 2a 62 29 7b 0a 20 20 69 6e  ymbol **b){.  in
1fc10 74 20 69 31 20 3d 20 28 2a 2a 61 29 2e 69 6e 64  t i1 = (**a).ind
1fc20 65 78 20 2b 20 31 30 30 30 30 30 30 30 2a 28 28  ex + 10000000*((
1fc30 2a 2a 61 29 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27  **a).name[0]>'Z'
1fc40 29 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 28 2a  );.  int i2 = (*
1fc50 2a 62 29 2e 69 6e 64 65 78 20 2b 20 31 30 30 30  *b).index + 1000
1fc60 30 30 30 30 2a 28 28 2a 2a 62 29 2e 6e 61 6d 65  0000*((**b).name
1fc70 5b 30 5d 3e 27 5a 27 29 3b 0a 20 20 72 65 74 75  [0]>'Z');.  retu
1fc80 72 6e 20 69 31 2d 69 32 3b 0a 7d 0a 0a 2f 2a 20  rn i1-i2;.}../* 
1fc90 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
1fca0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1fcb0 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1fcc0 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73   for each.** ass
1fcd0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
1fce0 66 20 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a  f type "x2"..*/.
1fcf0 73 74 72 75 63 74 20 73 5f 78 32 20 7b 0a 20 20  struct s_x2 {.  
1fd00 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
1fd10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1fd20 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
1fd30 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20  le slots. */.   
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd50 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74         /*   Must
1fd60 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
1fd70 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1fd80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1fd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fda0 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f     equal to 1 */
1fdb0 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20  .  int count;   
1fdc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1fdd0 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c  mber of currentl
1fde0 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a  y slots filled *
1fdf0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e  /.  struct s_x2n
1fe00 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68  ode *tbl;  /* Th
1fe10 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65  e data stored he
1fe20 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  re */.  struct s
1fe30 5f 78 32 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f  _x2node **ht;  /
1fe40 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
1fe50 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a   lookups */.};..
1fe60 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
1fe70 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
1fe80 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
1fe90 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e  very data elemen
1fea0 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63  t.** in an assoc
1feb0 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
1fec0 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 74 79  type "x2"..*/.ty
1fed0 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78  pedef struct s_x
1fee0 32 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74  2node {.  struct
1fef0 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 20 20   symbol *data;  
1ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff10 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
1ff20 20 63 68 61 72 20 2a 6b 65 79 3b 20 20 20 20 20   char *key;     
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ff40 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74   The key */.  st
1ff50 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 6e  ruct s_x2node *n
1ff60 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65  ext;   /* Next e
1ff70 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
1ff80 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72  me hash */.  str
1ff90 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 66  uct s_x2node **f
1ffa0 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75  rom;  /* Previou
1ffb0 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 32 6e 6f  s link */.} x2no
1ffc0 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  de;../* There is
1ffd0 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e   only one instan
1ffe0 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c  ce of the array,
1fff0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f   which is the fo
20000 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69  llowing */.stati
20010 63 20 73 74 72 75 63 74 20 73 5f 78 32 20 2a 78  c struct s_x2 *x
20020 32 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  2a;../* Allocate
20030 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69   a new associati
20040 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64  ve array */.void
20050 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 7b 0a   Symbol_init(){.
20060 20 20 69 66 28 20 78 32 61 20 29 20 72 65 74 75    if( x2a ) retu
20070 72 6e 3b 0a 20 20 78 32 61 20 3d 20 28 73 74 72  rn;.  x2a = (str
20080 75 63 74 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63  uct s_x2*)malloc
20090 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
200a0 73 5f 78 32 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x2) );.  if( x
200b0 32 61 20 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73  2a ){.    x2a->s
200c0 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78  ize = 128;.    x
200d0 32 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20  2a->count = 0;. 
200e0 20 20 20 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78     x2a->tbl = (x
200f0 32 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a  2node*)malloc( .
20100 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 32        (sizeof(x2
20110 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
20120 32 6e 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a  2node*))*128 );.
20130 20 20 20 20 69 66 28 20 78 32 61 2d 3e 74 62 6c      if( x2a->tbl
20140 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65  ==0 ){.      fre
20150 65 28 78 32 61 29 3b 0a 20 20 20 20 20 20 78 32  e(x2a);.      x2
20160 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
20170 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
20180 20 20 20 20 20 78 32 61 2d 3e 68 74 20 3d 20 28       x2a->ht = (
20190 78 32 6e 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e  x2node**)&(x2a->
201a0 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20  tbl[128]);.     
201b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b   for(i=0; i<128;
201c0 20 69 2b 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d   i++) x2a->ht[i]
201d0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
201e0 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  }./* Insert a ne
201f0 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
20200 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  e array.  Return
20210 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73   TRUE if success
20220 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61  ful..** Prior da
20230 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ta with the same
20240 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72   key is NOT over
20250 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53  written */.int S
20260 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 64 61 74  ymbol_insert(dat
20270 61 2c 6b 65 79 29 0a 73 74 72 75 63 74 20 73 79  a,key).struct sy
20280 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 63 68 61 72  mbol *data;.char
20290 20 2a 6b 65 79 3b 0a 7b 0a 20 20 78 32 6e 6f 64   *key;.{.  x2nod
202a0 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a  e *np;.  int h;.
202b0 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28    int ph;..  if(
202c0 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x2a==0 ) return
202d0 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61   0;.  ph = strha
202e0 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70  sh(key);.  h = p
202f0 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31  h & (x2a->size-1
20300 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68  );.  np = x2a->h
20310 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
20320 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  p ){.    if( str
20330 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29  cmp(np->key,key)
20340 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
20350 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  An existing entr
20360 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
20370 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f  key is found. */
20380 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62  .      /* Fail b
20390 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65  ecause overwrite
203a0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20   is not allows. 
203b0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
203c0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20  0;.    }.    np 
203d0 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
203e0 20 20 69 66 28 20 78 32 61 2d 3e 63 6f 75 6e 74    if( x2a->count
203f0 3e 3d 78 32 61 2d 3e 73 69 7a 65 20 29 7b 0a 20  >=x2a->size ){. 
20400 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61     /* Need to ma
20410 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  ke the hash tabl
20420 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20  e bigger */.    
20430 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20  int i,size;.    
20440 73 74 72 75 63 74 20 73 5f 78 32 20 61 72 72 61  struct s_x2 arra
20450 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a  y;.    array.siz
20460 65 20 3d 20 73 69 7a 65 20 3d 20 78 32 61 2d 3e  e = size = x2a->
20470 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61  size*2;.    arra
20480 79 2e 63 6f 75 6e 74 20 3d 20 78 32 61 2d 3e 63  y.count = x2a->c
20490 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e  ount;.    array.
204a0 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 6d  tbl = (x2node*)m
204b0 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69  alloc(.      (si
204c0 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73  zeof(x2node) + s
204d0 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 2a  izeof(x2node*))*
204e0 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  size );.    if( 
204f0 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72  array.tbl==0 ) r
20500 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69  eturn 0;  /* Fai
20510 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20  l due to malloc 
20520 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61  failure */.    a
20530 72 72 61 79 2e 68 74 20 3d 20 28 78 32 6e 6f 64  rray.ht = (x2nod
20540 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b  e**)&(array.tbl[
20550 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28  size]);.    for(
20560 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
20570 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20  ) array.ht[i] = 
20580 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
20590 69 3c 78 32 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b  i<x2a->count; i+
205a0 2b 29 7b 0a 20 20 20 20 20 20 78 32 6e 6f 64 65  +){.      x2node
205b0 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b   *oldnp, *newnp;
205c0 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26  .      oldnp = &
205d0 28 78 32 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20  (x2a->tbl[i]);. 
205e0 20 20 20 20 20 68 20 3d 20 73 74 72 68 61 73 68       h = strhash
205f0 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28  (oldnp->key) & (
20600 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e  size-1);.      n
20610 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74  ewnp = &(array.t
20620 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  bl[i]);.      if
20630 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20  ( array.ht[h] ) 
20640 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f  array.ht[h]->fro
20650 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78  m = &(newnp->nex
20660 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  t);.      newnp-
20670 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74  >next = array.ht
20680 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  [h];.      newnp
20690 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b  ->key = oldnp->k
206a0 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  ey;.      newnp-
206b0 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64  >data = oldnp->d
206c0 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  ata;.      newnp
206d0 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79  ->from = &(array
206e0 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61  .ht[h]);.      a
206f0 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77  rray.ht[h] = new
20700 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  np;.    }.    fr
20710 65 65 28 78 32 61 2d 3e 74 62 6c 29 3b 0a 20 20  ee(x2a->tbl);.  
20720 20 20 2a 78 32 61 20 3d 20 61 72 72 61 79 3b 0a    *x2a = array;.
20730 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20    }.  /* Insert 
20740 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a  the new data */.
20750 20 20 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d    h = ph & (x2a-
20760 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
20770 20 26 28 78 32 61 2d 3e 74 62 6c 5b 78 32 61 2d   &(x2a->tbl[x2a-
20780 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70  >count++]);.  np
20790 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e  ->key = key;.  n
207a0 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a  p->data = data;.
207b0 20 20 69 66 28 20 78 32 61 2d 3e 68 74 5b 68 5d    if( x2a->ht[h]
207c0 20 29 20 78 32 61 2d 3e 68 74 5b 68 5d 2d 3e 66   ) x2a->ht[h]->f
207d0 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74  rom = &(np->next
207e0 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20  );.  np->next = 
207f0 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 32  x2a->ht[h];.  x2
20800 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20  a->ht[h] = np;. 
20810 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 32   np->from = &(x2
20820 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74  a->ht[h]);.  ret
20830 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  urn 1;.}../* Ret
20840 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
20850 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74   data assigned t
20860 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e  o the given key.
20870 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a    Return NULL.**
20880 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e   if no such key.
20890 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f   */.struct symbo
208a0 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6b  l *Symbol_find(k
208b0 65 79 29 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b  ey).char *key;.{
208c0 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 32 6e 6f  .  int h;.  x2no
208d0 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78  de *np;..  if( x
208e0 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  2a==0 ) return 0
208f0 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68 28  ;.  h = strhash(
20900 6b 65 79 29 20 26 20 28 78 32 61 2d 3e 73 69 7a  key) & (x2a->siz
20910 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61  e-1);.  np = x2a
20920 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
20930 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
20940 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b  strcmp(np->key,k
20950 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ey)==0 ) break;.
20960 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
20970 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
20980 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20  np ? np->data : 
20990 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  0;.}../* Return 
209a0 74 68 65 20 6e 2d 74 68 20 64 61 74 61 2e 20 20  the n-th data.  
209b0 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
209c0 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
209d0 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62  . */.struct symb
209e0 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 6e  ol *Symbol_Nth(n
209f0 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 73 74 72  ).int n;.{.  str
20a00 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61  uct symbol *data
20a10 3b 0a 20 20 69 66 28 20 78 32 61 20 26 26 20 6e  ;.  if( x2a && n
20a20 3e 30 20 26 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f  >0 && n<=x2a->co
20a30 75 6e 74 20 29 7b 0a 20 20 20 20 64 61 74 61 20  unt ){.    data 
20a40 3d 20 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e  = x2a->tbl[n-1].
20a50 64 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  data;.  }else{. 
20a60 20 20 20 64 61 74 61 20 3d 20 30 3b 0a 20 20 7d     data = 0;.  }
20a70 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61 3b 0a  .  return data;.
20a80 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  }../* Return the
20a90 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
20aa0 61 79 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c  ay */.int Symbol
20ab0 5f 63 6f 75 6e 74 28 29 0a 7b 0a 20 20 72 65 74  _count().{.  ret
20ac0 75 72 6e 20 78 32 61 20 3f 20 78 32 61 2d 3e 63  urn x2a ? x2a->c
20ad0 6f 75 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  ount : 0;.}../* 
20ae0 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20  Return an array 
20af0 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  of pointers to a
20b00 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  ll data in the t
20b10 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72  able..** The arr
20b20 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ay is obtained f
20b30 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74  rom malloc.  Ret
20b40 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f  urn NULL if memo
20b50 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
20b60 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66   problems, or if
20b70 20 74 68 65 20 61 72 72 61 79 20 69 73 20 65 6d   the array is em
20b80 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  pty. */.struct s
20b90 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61  ymbol **Symbol_a
20ba0 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72  rrayof().{.  str
20bb0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 72 72  uct symbol **arr
20bc0 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65  ay;.  int i,size
20bd0 3b 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29  ;.  if( x2a==0 )
20be0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a   return 0;.  siz
20bf0 65 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a  e = x2a->count;.
20c00 20 20 61 72 72 61 79 20 3d 20 28 73 74 72 75 63    array = (struc
20c10 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 63 61 6c 6c  t symbol **)call
20c20 6f 63 28 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28  oc(size, sizeof(
20c30 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29  struct symbol *)
20c40 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20 29  );.  if( array )
20c50 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
20c60 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
20c70 79 5b 69 5d 20 3d 20 78 32 61 2d 3e 74 62 6c 5b  y[i] = x2a->tbl[
20c80 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72  i].data;.  }.  r
20c90 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a  eturn array;.}..
20ca0 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 63  /* Compare two c
20cb0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f  onfigurations */
20cc0 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 61  .int Configcmp(a
20cd0 2c 62 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  ,b).struct confi
20ce0 67 20 2a 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e  g *a;.struct con
20cf0 66 69 67 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20  fig *b;.{.  int 
20d00 78 3b 0a 20 20 78 20 3d 20 61 2d 3e 72 70 2d 3e  x;.  x = a->rp->
20d10 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69  index - b->rp->i
20d20 6e 64 65 78 3b 0a 20 20 69 66 28 20 78 3d 3d 30  ndex;.  if( x==0
20d30 20 29 20 78 20 3d 20 61 2d 3e 64 6f 74 20 2d 20   ) x = a->dot - 
20d40 62 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e  b->dot;.  return
20d50 20 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72   x;.}../* Compar
20d60 65 20 74 77 6f 20 73 74 61 74 65 73 20 2a 2f 0a  e two states */.
20d70 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 61 74  PRIVATE int stat
20d80 65 63 6d 70 28 61 2c 62 29 0a 73 74 72 75 63 74  ecmp(a,b).struct
20d90 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 73 74 72 75   config *a;.stru
20da0 63 74 20 63 6f 6e 66 69 67 20 2a 62 3b 0a 7b 0a  ct config *b;.{.
20db0 20 20 69 6e 74 20 72 63 3b 0a 20 20 66 6f 72 28    int rc;.  for(
20dc0 72 63 3d 30 3b 20 72 63 3d 3d 30 20 26 26 20 61  rc=0; rc==0 && a
20dd0 20 26 26 20 62 3b 20 20 61 3d 61 2d 3e 62 70 2c   && b;  a=a->bp,
20de0 20 62 3d 62 2d 3e 62 70 29 7b 0a 20 20 20 20 72   b=b->bp){.    r
20df0 63 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78  c = a->rp->index
20e00 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b   - b->rp->index;
20e10 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29  .    if( rc==0 )
20e20 20 72 63 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62   rc = a->dot - b
20e30 2d 3e 64 6f 74 3b 0a 20 20 7d 0a 20 20 69 66 28  ->dot;.  }.  if(
20e40 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
20e50 28 20 61 20 29 20 72 63 20 3d 20 31 3b 0a 20 20  ( a ) rc = 1;.  
20e60 20 20 69 66 28 20 62 20 29 20 72 63 20 3d 20 2d    if( b ) rc = -
20e70 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
20e80 72 63 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61  rc;.}../* Hash a
20e90 20 73 74 61 74 65 20 2a 2f 0a 50 52 49 56 41 54   state */.PRIVAT
20ea0 45 20 69 6e 74 20 73 74 61 74 65 68 61 73 68 28  E int statehash(
20eb0 61 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  a).struct config
20ec0 20 2a 61 3b 0a 7b 0a 20 20 69 6e 74 20 68 3d 30   *a;.{.  int h=0
20ed0 3b 0a 20 20 77 68 69 6c 65 28 20 61 20 29 7b 0a  ;.  while( a ){.
20ee0 20 20 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20      h = h*571 + 
20ef0 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20  a->rp->index*37 
20f00 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 20 20 61 20  + a->dot;.    a 
20f10 3d 20 61 2d 3e 62 70 3b 0a 20 20 7d 0a 20 20 72  = a->bp;.  }.  r
20f20 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 41  eturn h;.}../* A
20f30 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 74  llocate a new st
20f40 61 74 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ate structure */
20f50 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53  .struct state *S
20f60 74 61 74 65 5f 6e 65 77 28 29 0a 7b 0a 20 20 73  tate_new().{.  s
20f70 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77  truct state *new
20f80 3b 0a 20 20 6e 65 77 20 3d 20 28 73 74 72 75 63  ;.  new = (struc
20f90 74 20 73 74 61 74 65 20 2a 29 63 61 6c 6c 6f 63  t state *)calloc
20fa0 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63  (1, sizeof(struc
20fb0 74 20 73 74 61 74 65 29 20 29 3b 0a 20 20 4d 65  t state) );.  Me
20fc0 6d 6f 72 79 43 68 65 63 6b 28 6e 65 77 29 3b 0a  moryCheck(new);.
20fd0 20 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a    return new;.}.
20fe0 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  ./* There is one
20ff0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
21000 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
21010 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a  ture for each.**
21020 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
21030 61 79 20 6f 66 20 74 79 70 65 20 22 78 33 22 2e  ay of type "x3".
21040 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 33 20  .*/.struct s_x3 
21050 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  {.  int size;   
21060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21070 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
21080 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f  ilable slots. */
21090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
210a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
210b0 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  Must be a power 
210c0 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61  of 2 greater tha
210d0 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  n or */.        
210e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210f0 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20    /*   equal to 
21100 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74  1 */.  int count
21110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
21120 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72  * Number of curr
21130 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c  ently slots fill
21140 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ed */.  struct s
21150 5f 78 33 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f  _x3node *tbl;  /
21160 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65  * The data store
21170 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75  d here */.  stru
21180 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 68 74  ct s_x3node **ht
21190 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65  ;  /* Hash table
211a0 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a   for lookups */.
211b0 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  };../* There is 
211c0 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
211d0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66  this structure f
211e0 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c  or every data el
211f0 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61  ement.** in an a
21200 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
21210 20 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a   of type "x3"..*
21220 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
21230 20 73 5f 78 33 6e 6f 64 65 20 7b 0a 20 20 73 74   s_x3node {.  st
21240 72 75 63 74 20 73 74 61 74 65 20 2a 64 61 74 61  ruct state *data
21250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21260 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
21270 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  /.  struct confi
21280 67 20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20 20  g *key;         
21290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
212a0 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74   key */.  struct
212b0 20 73 5f 78 33 6e 6f 64 65 20 2a 6e 65 78 74 3b   s_x3node *next;
212c0 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79     /* Next entry
212d0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68   with the same h
212e0 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ash */.  struct 
212f0 73 5f 78 33 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b  s_x3node **from;
21300 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69    /* Previous li
21310 6e 6b 20 2a 2f 0a 7d 20 78 33 6e 6f 64 65 3b 0a  nk */.} x3node;.
21320 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c  ./* There is onl
21330 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  y one instance o
21340 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69  f the array, whi
21350 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ch is the follow
21360 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ing */.static st
21370 72 75 63 74 20 73 5f 78 33 20 2a 78 33 61 3b 0a  ruct s_x3 *x3a;.
21380 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
21390 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ew associative a
213a0 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74 61  rray */.void Sta
213b0 74 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28  te_init(){.  if(
213c0 20 78 33 61 20 29 20 72 65 74 75 72 6e 3b 0a 20   x3a ) return;. 
213d0 20 78 33 61 20 3d 20 28 73 74 72 75 63 74 20 73   x3a = (struct s
213e0 5f 78 33 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  _x3*)malloc( siz
213f0 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 33 29  eof(struct s_x3)
21400 20 29 3b 0a 20 20 69 66 28 20 78 33 61 20 29 7b   );.  if( x3a ){
21410 0a 20 20 20 20 78 33 61 2d 3e 73 69 7a 65 20 3d  .    x3a->size =
21420 20 31 32 38 3b 0a 20 20 20 20 78 33 61 2d 3e 63   128;.    x3a->c
21430 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 33  ount = 0;.    x3
21440 61 2d 3e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65  a->tbl = (x3node
21450 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20  *)malloc( .     
21460 20 28 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29   (sizeof(x3node)
21470 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65   + sizeof(x3node
21480 2a 29 29 2a 31 32 38 20 29 3b 0a 20 20 20 20 69  *))*128 );.    i
21490 66 28 20 78 33 61 2d 3e 74 62 6c 3d 3d 30 20 29  f( x3a->tbl==0 )
214a0 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 33 61  {.      free(x3a
214b0 29 3b 0a 20 20 20 20 20 20 78 33 61 20 3d 20 30  );.      x3a = 0
214c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
214d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
214e0 78 33 61 2d 3e 68 74 20 3d 20 28 78 33 6e 6f 64  x3a->ht = (x3nod
214f0 65 2a 2a 29 26 28 78 33 61 2d 3e 74 62 6c 5b 31  e**)&(x3a->tbl[1
21500 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  28]);.      for(
21510 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29  i=0; i<128; i++)
21520 20 78 33 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b   x3a->ht[i] = 0;
21530 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20  .    }.  }.}./* 
21540 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
21550 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72  ord into the arr
21560 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ay.  Return TRUE
21570 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
21580 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69  ** Prior data wi
21590 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
215a0 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74  is NOT overwritt
215b0 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 61 74 65 5f  en */.int State_
215c0 69 6e 73 65 72 74 28 64 61 74 61 2c 6b 65 79 29  insert(data,key)
215d0 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 64  .struct state *d
215e0 61 74 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  ata;.struct conf
215f0 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 78 33 6e  ig *key;.{.  x3n
21600 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68  ode *np;.  int h
21610 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69  ;.  int ph;..  i
21620 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75  f( x3a==0 ) retu
21630 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 61  rn 0;.  ph = sta
21640 74 65 68 61 73 68 28 6b 65 79 29 3b 0a 20 20 68  tehash(key);.  h
21650 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73 69   = ph & (x3a->si
21660 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33  ze-1);.  np = x3
21670 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
21680 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
21690 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65   statecmp(np->ke
216a0 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  y,key)==0 ){.   
216b0 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
216c0 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  g entry with the
216d0 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75   same key is fou
216e0 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  nd. */.      /* 
216f0 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65  Fail because ove
21700 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c  rwrite is not al
21710 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  lows. */.      r
21720 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
21730 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
21740 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 33 61 2d  ;.  }.  if( x3a-
21750 3e 63 6f 75 6e 74 3e 3d 78 33 61 2d 3e 73 69 7a  >count>=x3a->siz
21760 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64  e ){.    /* Need
21770 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
21780 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a  h table bigger *
21790 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65  /.    int i,size
217a0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78  ;.    struct s_x
217b0 33 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72  3 array;.    arr
217c0 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d  ay.size = size =
217d0 20 78 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20   x3a->size*2;.  
217e0 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20    array.count = 
217f0 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20  x3a->count;.    
21800 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 33 6e  array.tbl = (x3n
21810 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20  ode*)malloc(.   
21820 20 20 20 28 73 69 7a 65 6f 66 28 78 33 6e 6f 64     (sizeof(x3nod
21830 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f  e) + sizeof(x3no
21840 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20  de*))*size );.  
21850 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d    if( array.tbl=
21860 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
21870 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d  /* Fail due to m
21880 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f  alloc failure */
21890 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20  .    array.ht = 
218a0 28 78 33 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61  (x3node**)&(arra
218b0 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20  y.tbl[size]);.  
218c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
218d0 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74  e; i++) array.ht
218e0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  [i] = 0;.    for
218f0 28 69 3d 30 3b 20 69 3c 78 33 61 2d 3e 63 6f 75  (i=0; i<x3a->cou
21900 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
21910 78 33 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a  x3node *oldnp, *
21920 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64  newnp;.      old
21930 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b  np = &(x3a->tbl[
21940 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73  i]);.      h = s
21950 74 61 74 65 68 61 73 68 28 6f 6c 64 6e 70 2d 3e  tatehash(oldnp->
21960 6b 65 79 29 20 26 20 28 73 69 7a 65 2d 31 29 3b  key) & (size-1);
21970 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26  .      newnp = &
21980 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a  (array.tbl[i]);.
21990 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e        if( array.
219a0 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74  ht[h] ) array.ht
219b0 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65  [h]->from = &(ne
219c0 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20  wnp->next);.    
219d0 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20    newnp->next = 
219e0 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20  array.ht[h];.   
219f0 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20     newnp->key = 
21a00 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20  oldnp->key;.    
21a10 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20    newnp->data = 
21a20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20  oldnp->data;.   
21a30 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d     newnp->from =
21a40 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b   &(array.ht[h]);
21a50 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b  .      array.ht[
21a60 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20  h] = newnp;.    
21a70 7d 0a 20 20 20 20 66 72 65 65 28 78 33 61 2d 3e  }.    free(x3a->
21a80 74 62 6c 29 3b 0a 20 20 20 20 2a 78 33 61 20 3d  tbl);.    *x3a =
21a90 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a   array;.  }.  /*
21aa0 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
21ab0 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68  data */.  h = ph
21ac0 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29   & (x3a->size-1)
21ad0 3b 0a 20 20 6e 70 20 3d 20 26 28 78 33 61 2d 3e  ;.  np = &(x3a->
21ae0 74 62 6c 5b 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b  tbl[x3a->count++
21af0 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20  ]);.  np->key = 
21b00 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20  key;.  np->data 
21b10 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 33  = data;.  if( x3
21b20 61 2d 3e 68 74 5b 68 5d 20 29 20 78 33 61 2d 3e  a->ht[h] ) x3a->
21b30 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
21b40 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d  np->next);.  np-
21b50 3e 6e 65 78 74 20 3d 20 78 33 61 2d 3e 68 74 5b  >next = x3a->ht[
21b60 68 5d 3b 0a 20 20 78 33 61 2d 3e 68 74 5b 68 5d  h];.  x3a->ht[h]
21b70 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f   = np;.  np->fro
21b80 6d 20 3d 20 26 28 78 33 61 2d 3e 68 74 5b 68 5d  m = &(x3a->ht[h]
21b90 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
21ba0 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
21bb0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73  inter to data as
21bc0 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69  signed to the gi
21bd0 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e  ven key.  Return
21be0 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73   NULL.** if no s
21bf0 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75  uch key. */.stru
21c00 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f  ct state *State_
21c10 66 69 6e 64 28 6b 65 79 29 0a 73 74 72 75 63 74  find(key).struct
21c20 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a   config *key;.{.
21c30 20 20 69 6e 74 20 68 3b 0a 20 20 78 33 6e 6f 64    int h;.  x3nod
21c40 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 33  e *np;..  if( x3
21c50 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
21c60 0a 20 20 68 20 3d 20 73 74 61 74 65 68 61 73 68  .  h = statehash
21c70 28 6b 65 79 29 20 26 20 28 78 33 61 2d 3e 73 69  (key) & (x3a->si
21c80 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33  ze-1);.  np = x3
21c90 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
21ca0 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
21cb0 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65   statecmp(np->ke
21cc0 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61  y,key)==0 ) brea
21cd0 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e  k;.    np = np->
21ce0 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  next;.  }.  retu
21cf0 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61  rn np ? np->data
21d00 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75   : 0;.}../* Retu
21d10 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70  rn an array of p
21d20 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 64  ointers to all d
21d30 61 74 61 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ata in the table
21d40 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69  ..** The array i
21d50 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
21d60 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20  malloc.  Return 
21d70 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61  NULL if memory a
21d80 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f  llocation.** pro
21d90 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74 68 65  blems, or if the
21da0 20 61 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e   array is empty.
21db0 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65   */.struct state
21dc0 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79 6f 66   **State_arrayof
21dd0 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74  ().{.  struct st
21de0 61 74 65 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69  ate **array;.  i
21df0 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28  nt i,size;.  if(
21e00 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x3a==0 ) return
21e10 20 30 3b 0a 20 20 73 69 7a 65 20 3d 20 78 33 61   0;.  size = x3a
21e20 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79  ->count;.  array
21e30 20 3d 20 28 73 74 72 75 63 74 20 73 74 61 74 65   = (struct state
21e40 20 2a 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65   **)malloc( size
21e50 6f 66 28 73 74 72 75 63 74 20 73 74 61 74 65 20  of(struct state 
21e60 2a 29 2a 73 69 7a 65 20 29 3b 0a 20 20 69 66 28  *)*size );.  if(
21e70 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f   array ){.    fo
21e80 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69  r(i=0; i<size; i
21e90 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78  ++) array[i] = x
21ea0 33 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b  3a->tbl[i].data;
21eb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72  .  }.  return ar
21ec0 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20  ray;.}../* Hash 
21ed0 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  a configuration 
21ee0 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 63  */.PRIVATE int c
21ef0 6f 6e 66 69 67 68 61 73 68 28 61 29 0a 73 74 72  onfighash(a).str
21f00 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b  uct config *a;.{
21f10 0a 20 20 69 6e 74 20 68 3d 30 3b 0a 20 20 68 20  .  int h=0;.  h 
21f20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d  = h*571 + a->rp-
21f30 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64  >index*37 + a->d
21f40 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a  ot;.  return h;.
21f50 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  }../* There is o
21f60 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
21f70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
21f80 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a  ucture for each.
21f90 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ** associative a
21fa0 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 34  rray of type "x4
21fb0 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78  "..*/.struct s_x
21fc0 34 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20  4 {.  int size; 
21fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21fe0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   The number of a
21ff0 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20  vailable slots. 
22000 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22020 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65    Must be a powe
22030 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74  r of 2 greater t
22040 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20  han or */.      
22050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22060 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74      /*   equal t
22070 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  o 1 */.  int cou
22080 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
22090 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
220a0 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69  rrently slots fi
220b0 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  lled */.  struct
220c0 20 73 5f 78 34 6e 6f 64 65 20 2a 74 62 6c 3b 20   s_x4node *tbl; 
220d0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f   /* The data sto
220e0 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  red here */.  st
220f0 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a  ruct s_x4node **
22100 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ht;  /* Hash tab
22110 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a  le for lookups *
22120 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  /.};../* There i
22130 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
22140 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
22150 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20   for every data 
22160 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e  element.** in an
22170 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
22180 61 79 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e  ay of type "x4".
22190 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
221a0 63 74 20 73 5f 78 34 6e 6f 64 65 20 7b 0a 20 20  ct s_x4node {.  
221b0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64  struct config *d
221c0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
221d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
221e0 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  a */.  struct s_
221f0 78 34 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20  x4node *next;   
22200 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
22210 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
22220 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
22230 34 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f  4node **from;  /
22240 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20  * Previous link 
22250 2a 2f 0a 7d 20 78 34 6e 6f 64 65 3b 0a 0a 2f 2a  */.} x4node;../*
22260 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   There is only o
22270 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
22280 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  he array, which 
22290 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  is the following
222a0 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
222b0 74 20 73 5f 78 34 20 2a 78 34 61 3b 0a 0a 2f 2a  t s_x4 *x4a;../*
222c0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
222d0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
222e0 79 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  y */.void Config
222f0 74 61 62 6c 65 5f 69 6e 69 74 28 29 7b 0a 20 20  table_init(){.  
22300 69 66 28 20 78 34 61 20 29 20 72 65 74 75 72 6e  if( x4a ) return
22310 3b 0a 20 20 78 34 61 20 3d 20 28 73 74 72 75 63  ;.  x4a = (struc
22320 74 20 73 5f 78 34 2a 29 6d 61 6c 6c 6f 63 28 20  t s_x4*)malloc( 
22330 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f  sizeof(struct s_
22340 78 34 29 20 29 3b 0a 20 20 69 66 28 20 78 34 61  x4) );.  if( x4a
22350 20 29 7b 0a 20 20 20 20 78 34 61 2d 3e 73 69 7a   ){.    x4a->siz
22360 65 20 3d 20 36 34 3b 0a 20 20 20 20 78 34 61 2d  e = 64;.    x4a-
22370 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  >count = 0;.    
22380 78 34 61 2d 3e 74 62 6c 20 3d 20 28 78 34 6e 6f  x4a->tbl = (x4no
22390 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20  de*)malloc( .   
223a0 20 20 20 28 73 69 7a 65 6f 66 28 78 34 6e 6f 64     (sizeof(x4nod
223b0 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f  e) + sizeof(x4no
223c0 64 65 2a 29 29 2a 36 34 20 29 3b 0a 20 20 20 20  de*))*64 );.    
223d0 69 66 28 20 78 34 61 2d 3e 74 62 6c 3d 3d 30 20  if( x4a->tbl==0 
223e0 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 34  ){.      free(x4
223f0 61 29 3b 0a 20 20 20 20 20 20 78 34 61 20 3d 20  a);.      x4a = 
22400 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
22410 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
22420 20 78 34 61 2d 3e 68 74 20 3d 20 28 78 34 6e 6f   x4a->ht = (x4no
22430 64 65 2a 2a 29 26 28 78 34 61 2d 3e 74 62 6c 5b  de**)&(x4a->tbl[
22440 36 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  64]);.      for(
22450 69 3d 30 3b 20 69 3c 36 34 3b 20 69 2b 2b 29 20  i=0; i<64; i++) 
22460 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a  x4a->ht[i] = 0;.
22470 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49      }.  }.}./* I
22480 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
22490 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61  rd into the arra
224a0 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  y.  Return TRUE 
224b0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
224c0 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74  * Prior data wit
224d0 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
224e0 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65  s NOT overwritte
224f0 6e 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 74  n */.int Configt
22500 61 62 6c 65 5f 69 6e 73 65 72 74 28 64 61 74 61  able_insert(data
22510 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ).struct config 
22520 2a 64 61 74 61 3b 0a 7b 0a 20 20 78 34 6e 6f 64  *data;.{.  x4nod
22530 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a  e *np;.  int h;.
22540 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28    int ph;..  if(
22550 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x4a==0 ) return
22560 20 30 3b 0a 20 20 70 68 20 3d 20 63 6f 6e 66 69   0;.  ph = confi
22570 67 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68  ghash(data);.  h
22580 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69   = ph & (x4a->si
22590 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34  ze-1);.  np = x4
225a0 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
225b0 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
225c0 20 43 6f 6e 66 69 67 63 6d 70 28 6e 70 2d 3e 64   Configcmp(np->d
225d0 61 74 61 2c 64 61 74 61 29 3d 3d 30 20 29 7b 0a  ata,data)==0 ){.
225e0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
225f0 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20  ting entry with 
22600 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
22610 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20  found. */.      
22620 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20  /* Fail because 
22630 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74  overwrite is not
22640 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20   allows. */.    
22650 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
22660 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  }.    np = np->n
22670 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78  ext;.  }.  if( x
22680 34 61 2d 3e 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e  4a->count>=x4a->
22690 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  size ){.    /* N
226a0 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  eed to make the 
226b0 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65  hash table bigge
226c0 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73  r */.    int i,s
226d0 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ize;.    struct 
226e0 73 5f 78 34 20 61 72 72 61 79 3b 0a 20 20 20 20  s_x4 array;.    
226f0 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a  array.size = siz
22700 65 20 3d 20 78 34 61 2d 3e 73 69 7a 65 2a 32 3b  e = x4a->size*2;
22710 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74  .    array.count
22720 20 3d 20 78 34 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x4a->count;. 
22730 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28     array.tbl = (
22740 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a  x4node*)malloc(.
22750 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 34        (sizeof(x4
22760 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
22770 34 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b  4node*))*size );
22780 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74  .    if( array.t
22790 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  bl==0 ) return 0
227a0 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74  ;  /* Fail due t
227b0 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  o malloc failure
227c0 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74   */.    array.ht
227d0 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 61   = (x4node**)&(a
227e0 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b  rray.tbl[size]);
227f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
22800 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  size; i++) array
22810 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  .ht[i] = 0;.    
22820 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e  for(i=0; i<x4a->
22830 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  count; i++){.   
22840 20 20 20 78 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70     x4node *oldnp
22850 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20  , *newnp;.      
22860 6f 6c 64 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74  oldnp = &(x4a->t
22870 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20  bl[i]);.      h 
22880 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 6f 6c 64  = confighash(old
22890 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 73 69 7a  np->data) & (siz
228a0 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
228b0 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
228c0 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
228d0 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
228e0 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
228f0 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
22900 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
22910 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
22920 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64  ;.      newnp->d
22930 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74  ata = oldnp->dat
22940 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  a;.      newnp->
22950 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68  from = &(array.h
22960 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72  t[h]);.      arr
22970 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70  ay.ht[h] = newnp
22980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
22990 28 78 34 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20  (x4a->tbl);.    
229a0 2a 78 34 61 20 3d 20 61 72 72 61 79 3b 0a 20 20  *x4a = array;.  
229b0 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  }.  /* Insert th
229c0 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20  e new data */.  
229d0 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73  h = ph & (x4a->s
229e0 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26  ize-1);.  np = &
229f0 28 78 34 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63  (x4a->tbl[x4a->c
22a00 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e  ount++]);.  np->
22a10 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
22a20 66 28 20 78 34 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x4a->ht[h] ) 
22a30 78 34 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x4a->ht[h]->from
22a40 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
22a50 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 34 61    np->next = x4a
22a60 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e  ->ht[h];.  x4a->
22a70 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
22a80 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 34 61 2d 3e  ->from = &(x4a->
22a90 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
22aa0 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
22ab0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
22ac0 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
22ad0 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
22ae0 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
22af0 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
22b00 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
22b10 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64  Configtable_find
22b20 28 6b 65 79 29 0a 73 74 72 75 63 74 20 63 6f 6e  (key).struct con
22b30 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e  fig *key;.{.  in
22b40 74 20 68 3b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e  t h;.  x4node *n
22b50 70 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d 30  p;..  if( x4a==0
22b60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68   ) return 0;.  h
22b70 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 6b 65   = confighash(ke
22b80 79 29 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d  y) & (x4a->size-
22b90 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e  1);.  np = x4a->
22ba0 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
22bb0 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 43 6f  np ){.    if( Co
22bc0 6e 66 69 67 63 6d 70 28 6e 70 2d 3e 64 61 74 61  nfigcmp(np->data
22bd0 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,key)==0 ) break
22be0 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  ;.    np = np->n
22bf0 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
22c00 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20  n np ? np->data 
22c10 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f 76  : 0;.}../* Remov
22c20 65 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20  e all data from 
22c30 74 68 65 20 74 61 62 6c 65 2e 20 20 50 61 73 73  the table.  Pass
22c40 20 65 61 63 68 20 64 61 74 61 20 74 6f 20 74 68   each data to th
22c50 65 20 66 75 6e 63 74 69 6f 6e 20 22 66 22 0a 2a  e function "f".*
22c60 2a 20 61 73 20 69 74 20 69 73 20 72 65 6d 6f 76  * as it is remov
22c70 65 64 2e 20 20 28 22 66 22 20 6d 61 79 20 62 65  ed.  ("f" may be
22c80 20 6e 75 6c 6c 20 74 6f 20 61 76 6f 69 64 20 74   null to avoid t
22c90 68 69 73 20 73 74 65 70 2e 29 20 2a 2f 0a 76 6f  his step.) */.vo
22ca0 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63  id Configtable_c
22cb0 6c 65 61 72 28 66 29 0a 69 6e 74 28 2a 66 29 28  lear(f).int(*f)(
22cc0 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  /* struct config
22cd0 20 2a 20 2a 2f 29 3b 0a 7b 0a 20 20 69 6e 74 20   * */);.{.  int 
22ce0 69 3b 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20  i;.  if( x4a==0 
22cf0 7c 7c 20 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30  || x4a->count==0
22d00 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
22d10 20 66 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c   f ) for(i=0; i<
22d20 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x4a->count; i++)
22d30 20 28 2a 66 29 28 78 34 61 2d 3e 74 62 6c 5b 69   (*f)(x4a->tbl[i
22d40 5d 2e 64 61 74 61 29 3b 0a 20 20 66 6f 72 28 69  ].data);.  for(i
22d50 3d 30 3b 20 69 3c 78 34 61 2d 3e 73 69 7a 65 3b  =0; i<x4a->size;
22d60 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d   i++) x4a->ht[i]
22d70 20 3d 20 30 3b 0a 20 20 78 34 61 2d 3e 63 6f 75   = 0;.  x4a->cou
22d80 6e 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  nt = 0;.  return
22d90 3b 0a 7d 0a                                      ;.}.